/* ============================================================
   Press Earth Landing — temel stiller
   Renk kimliği: lacivert / mavi / altın
   ============================================================ */
:root{
  --pe-navy:#060b33;
  --pe-navy-2:#071048;
  --pe-blue:#0f55ff;
  --pe-blue-dark:#003cc7;
  --pe-gold:#ffcf24;
  --pe-cyan:#dff0ff;
  --pe-violet:#7b3cff;
  --pe-green:#14b86a;
  --pe-red:#ed2f38;
  --pe-text:#111833;
  --pe-muted:#66708a;
  --pe-border:#dfe7fb;
  /* Premium tasarım yenilemesi (2026-08-28 spec): birincil buton, öne çıkan
     plan kartı ve vurgu detayları için indigo. --pe-blue KASITLI OLARAK
     dokunulmadı — linkler/odak halkaları vb. eski değerinde kalıyor, blast
     radius sadece bu iki token'ı kullanan yeni bileşenlerle sınırlı. */
  --pe-indigo:#3346d4;
  /* Tek marka mavisi gradyanı: hero rozeti ve BİRİNCİL BUTONLAR birebir aynı
     yüzeyi kullanır (Creative Director yönü, 29 Ağu 2026). Önceden rozet
     #0f55ff->#082fbc ile lacivere düşüyor, buton ise düz #3346d4 (mor-indigo)
     duruyordu; iki farklı mavi dili aynı ekranda çarpışıyordu. */
  --pe-blue-grad:linear-gradient(135deg,#3b76ff 0%,#0f55ff 52%,#0b3fd6 100%);
  --pe-indigo-deep:#0d1030;
  --shadow:0 18px 50px rgba(9,16,51,.12);
  --pad:18px;
  --shell:430px;
  --measure:720px;
  /* Çapa inişlerinin sabit üst banttan (.top-progress) kaçınmak için bıraktığı
     pay — kullanımı ve ölçümü .top-progress'in hemen altında. */
  --anchor-offset:63px;
  /* YÖN İŞARETİ (RTL, T3): transform ve transform-origin MANTIKSAL ÖZELLİK
     DEĞİLDİR — fiziksel x eksenine bakarlar. Asimetrik kaydırmalar (marquee
     akışı, gezen nokta) ve kenar-kilitli ölçek kökenleri bu tek çarpanla
     yön duyarlı olur; ayrı bir [dir="rtl"] düzen bloğu YAZILMAZ (spec §5-T3).
     LTR'de +1, yani her kullanım LTR'de birebir eski değere sadeleşir. */
  --dir:1;
}
[dir="rtl"]{--dir:-1}
/* 2026-08-31: Inter'de Arapça glif yok, RTL sayfalar sistem fontuna (cihaza
   göre tutarsız) düşüyordu. IBM Plex Sans Arabic önce gelir (Arapça
   karakterler ondan render edilir), Inter ikinci sırada kalır (Arapça
   içindeki Latin alt dizeler — marka istisnası adları, rakamlar — hâlâ
   Inter'de kalsın diye). Font yükleme koşullu (bkz. template.html/
   checkout.html meta.rtlFontLink) — yalnızca dir="rtl" olan tek dilde (ar)
   gerçekten indirilir. Seçici body ÜZERİNDE ([dir="rtl"] body, [dir="rtl"]
   değil) — body{font-family:Inter,...} (aşağıda) kendi doğrudan bildirimini
   taşıyor, <html>'den kalıtım YAPMAZ; [dir="rtl"]{font-family:...} yazılsa
   body'nin kendi kuralı tarafından ezilirdi. */
[dir="rtl"] body{font-family:'IBM Plex Sans Arabic',Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif}
*{box-sizing:border-box}
html{scroll-behavior:smooth;background:#f2f6ff}
/* padding-bottom = mobil sabit çubuğun (.sticky-cta) footer'ı örtmemesi için
   ayrılan yastık. Task 14 düzeltme turu 1: sabit 96px, ÇENTİKLİ cihazda
   (env(safe-area-inset-bottom)>0) YETMİYORDU — BASE'te bile bant 99px'e
   çıkıp yastığı 3px aşıyordu (ölçüm: task-14-report.md §5b). Yastık artık
   güvenli alan payını da içeriyor; env yoksa/0 ise değer 96px'te KALIR,
   yani çentiksiz cihazda ve masaüstünde hiçbir şey değişmez (768+ katmanı
   zaten padding-bottom:0 yazıyor). */
body{margin:0;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Arial,sans-serif;color:var(--pe-text);background:linear-gradient(180deg,#eef4ff,#fff);padding-bottom:calc(96px + env(safe-area-inset-bottom,0px))}
button,input,textarea,select{font:inherit}
.page-shell{width:100%;max-width:var(--shell);margin:0 auto;background:#fff;box-shadow:0 24px 90px rgba(7,16,72,.12)}

/* İkon sistemi */
.ic{width:20px;height:20px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:0 0 auto}
.ic-circle{flex:0 0 34px;width:34px;height:34px;border-radius:50%;background:var(--pe-blue);color:#fff;display:inline-flex;align-items:center;justify-content:center;box-shadow:0 8px 18px rgba(15,85,255,.22)}
.ic-circle .ic{width:18px;height:18px}

/* Scroll giriş animasyonları */
.reveal{opacity:0;transform:translateY(22px);transition:opacity .8s cubic-bezier(.32,.72,0,1),transform .8s cubic-bezier(.32,.72,0,1)}
.reveal.is-revealed{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none;transition:none}}

/* Üst bar */
.topbar{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:14px var(--pad);background:#fff;border-bottom:1px solid #eef2fe}
.brand{display:flex;align-items:center}
.brand img{display:block;height:28px;width:auto}

/* WhatsApp yönlendirmesi (Task 10, desktop-polish-3): üç dokunuş noktası
   (topbar / SSS / mobil — Task 17'den beri yüzen düğme .wa-fab) aynı ikonu
   (#b-whatsapp, currentColor) ve aynı tr.json kaynağını (whatsapp.link)
   paylaşır. Marka yeşili (#25d366) yalnız ikon/vurgu rengi olarak, ölçülü
   kullanılır — sayfa paleti mavi/lacivert kalır. Taban boyut burada tek yerde
   tanımlanır, her yerleşim kendi seçicisiyle boyutu geçersiz kılabilir
   (topbar 18px, SSS 18px, yüzen düğme 32px). */
.ic-whatsapp{width:18px;height:18px;flex:0 0 auto}
/* 1) Masaüstü üst bar: eski topbar-cta'nın (yukarıda, hâlâ display:none)
   bıraktığı boşluğu devralan sessiz metin bağlantısı. Güven rozetinin
   (kalkan+iki satır) ikincili — daha küçük punto, ince ağırlık, dolgusuz.
   Taban katmanda gizli: mobil topbar'da HİÇ görünmez (brief kuralı). */
.topbar-whatsapp{display:none;align-items:center;gap:6px;padding:8px 2px;font-size:12.5px;font-weight:800;color:#3a4564;text-decoration:none;border-radius:8px;transition:color .16s ease}
.topbar-whatsapp .ic-whatsapp{color:#25d366}
.topbar-whatsapp:hover{color:var(--pe-blue-dark)}
/* Halka rengi TAM YOĞUNLUK: eski rgba(15,85,255,.45) beyaz topbar'a kompozit
   edilince #93b3ff'e denk geliyordu ve beyazla kontrastı 2.08:1 — WCAG 1.4.11
   eşiği 3:1'in altında. Biçim (3px solid marka mavisi + offset) DEĞİŞMEDİ,
   yalnız opaklık yükseldi: #0f55ff / #fff = 5.58:1. (Nihai inceleme I-1.) */
.topbar-whatsapp:focus-visible{outline:3px solid var(--pe-blue);outline-offset:2px}

/* Hero */
.hero{position:relative;overflow:hidden;padding:26px var(--pad) 30px;background:radial-gradient(circle at 88% 18%,rgba(15,85,255,.14),transparent 40%),radial-gradient(circle at 8% 92%,rgba(123,60,255,.10),transparent 45%),linear-gradient(180deg,#fbfdff,#eef4ff)}
/* 5. tur: hero kutusu artık teklif bölümündeki "Net Teklif" rozetiyle (aşağıda
   .front-badge) BİREBİR aynı kutu — kullanıcı isteğiyle birleştirildi, bkz.
   .front-badge tanımı. */
.hero-kicker .ic{width:15px;height:15px;color:var(--pe-gold)}
/* Genel toparlama (2026-08-28 spec, 4. tur): Cision incelemesinde (2. tur)
   ağırlık 950→700'e, harf aralığı -.055em→-.01em'e çekilmişti — kullanıcı
   geri bildirimiyle ("başlıklarımız ilk başta çok daha iyiydi") ORİJİNAL
   ağırlık/punto/aralık geri getirildi. Gövde metnindeki hafifletme (bkz.
   .hero-lead) ve buton/kart düzleştirmesi KORUNUYOR — yalnız başlık katmanı
   geri alındı. */
.hero-title{margin:18px 0 0;font-size:44px;line-height:1;letter-spacing:-.055em;font-weight:950;color:var(--pe-navy)}
.hero-title span{display:block}
.hero-title-accent{position:relative;width:max-content;max-width:100%;padding-bottom:14px}
.hero-swash{position:absolute;inset-inline-start:3px;bottom:0;width:min(48%,150px);height:12px;display:block}
.hero-lead{margin:14px 0 0;color:#2a3352;font-size:16px;line-height:1.5;font-weight:400}
/* Vurgu rengi indigo'ya taşındı (2026-08-28 spec) — bkz. :root notu. Kontrast
   yeniden ölçüldü: #3346d4 / #eef4ff zemin = 6.41:1 (eskiki #0f55ff'in
   5.06:1'inden daha güçlü), 4.5:1 eşiğinin rahatça üstünde. */
.hero-lead strong{color:var(--pe-indigo);font-weight:700}
.hero-collage{display:grid;gap:10px;margin:22px 0 0}
/* Çerçevesiz, kenarları sayfaya eriyen görsel */
.blend-photo{margin:0 auto;position:relative;z-index:0;
  -webkit-mask-image:linear-gradient(to right,transparent 0,#000 12%,#000 90%,transparent 100%),linear-gradient(to bottom,transparent 0,#000 9%,#000 93%,transparent 100%);
  -webkit-mask-composite:source-in;
  mask-image:linear-gradient(to right,transparent 0,#000 12%,#000 90%,transparent 100%),linear-gradient(to bottom,transparent 0,#000 9%,#000 93%,transparent 100%);
  mask-composite:intersect}
.blend-photo img{display:block;width:100%;height:auto}
.hero-photo{width:min(430px,100%);margin-inline-start:auto;margin-inline-end:0}
.hero-photo img{aspect-ratio:451/560;object-fit:cover;object-position:center top}
.hero-rotator{height:48px;overflow:hidden;margin:16px 0 0;background:rgba(255,255,255,.95);border:1px solid #dde7ff;border-radius:999px;box-shadow:0 10px 24px rgba(9,16,51,.07)}
.hero-rotator ul{list-style:none;margin:0;padding:0;animation:hero-rotate 10.5s cubic-bezier(.32,.72,0,1) infinite}
.hero-rotator li{height:48px;display:flex;align-items:center;gap:11px;padding:0;padding-inline:7px 16px;font-size:14px;font-weight:700;color:#17214a}
.hero-rotator li .ic-circle{flex:0 0 34px}
@keyframes hero-rotate{0%,28%{transform:translateY(0)}33.3%,61.3%{transform:translateY(-48px)}66.6%,94.6%{transform:translateY(-96px)}100%{transform:translateY(-144px)}}
@media (prefers-reduced-motion:reduce){
  .hero-rotator{height:auto;border-radius:20px}
  .hero-rotator ul{animation:none;display:grid;gap:6px;padding:6px 0}
  .hero-rotator li:last-child{display:none}
}
.hero-cta{margin-top:16px;gap:4px}
.link-how{display:flex;align-items:center;justify-content:center;min-height:44px;background:none;border:0;cursor:pointer;font-size:14px;font-weight:700;color:var(--pe-blue-dark);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}
/* Odak halkası (nihai inceleme I-2): bu bir <button> ama .btn sınıfı YOK, bu
   yüzden .btn:focus-visible kuralı onu hiç kapsamıyordu ve tarayıcının 1px
   varsayılanına düşüyordu. Aile idiomu: 3px solid marka mavisi + küçük offset.
   Zemin hero gradyanı (#fbfdff…#eef4ff + mavi/mor radyaller) — ölçülen en
   koyu piksel bile #0f55ff ile 3:1 eşiğinin üstünde: 1440'ta 3.45:1, 390'da
   3.30:1 (ölçüm: final-rereview.md I-1 tablosu). Not: burada eskiden "4:1'in
   üstünde" yazıyordu — yeniden inceleme bunu 390'da 3.30:1 olarak ölçtü,
   iddia gerçek değere çekildi.
   border-radius yok: düğmenin kendi köşesi kare, halka da öyle. */
.link-how:focus-visible{outline:3px solid var(--pe-blue);outline-offset:3px}
/* 8. tur (kullanıcı isteği: "sil baştan... sade ama premium modern"): eski
   3 ayrı kutu (gradyan + drop-shadow + kendi köşesi) demode buldu. Yerine
   .plan-stat'la AYNI aileden tek, düz, ince kenarlı bir şerit — üç bölüm
   birbirine yapışık, aralarında yalnız 1px ayraç (aşağıda ::before). Gradyan/
   gölge YOK; kartın kendisi .plan-card gibi düz beyaz + ince kenar. */
/* Hero fiyat şeridi (Creative Director önerisi, 28 Ağu 2026): şerit artık
   üç plan sütunu + altında AP notu taşıyan TEK bir kutu. Sıra numarası
   (01/02/03) fiyat kademesini kodlar — dekoratif numara değil.
   Sıra numarası ve "en çok tercih edilen" sekmesi YALNIZ 768+'ta görünür:
   390px'te sütun ~110px kalıyor, Almanca rozet ("Am häufigsten gewählt")
   oraya sığmaz. Dar ekranda orta planı hafif bir dolgu işaretler. */
.hero-plans{margin:14px 0 0;border:1px solid #e6ecf9;border-radius:16px;
  background:#f7f9fd;overflow:hidden;container-type:inline-size}
.hero-plans-row{display:flex}
.hero-miniplan{position:relative;flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;padding:12px 6px;cursor:pointer;background:none;border:0;transition:background-color .16s ease}
.hero-miniplan+.hero-miniplan:before{content:"";position:absolute;inset-inline-start:0;
  top:26%;bottom:26%;width:1px;background:#e3e9f7;z-index:1}
.hero-miniplan:hover{background-color:rgba(15,85,255,.045)}
.hero-miniplan:active{background-color:rgba(15,85,255,.08)}
/* Odak halkası TABAN katmanda (nihai inceleme I-2): Task 2'de yalnız 768+
   sahne bloğuna yazılmıştı, bu yüzden mobilde üç fiyat çipi de tarayıcının
   1px varsayılanına düşüyordu. Buraya taşındı; 768+ kopyası SİLİNDİ (aynı
   bildirim, ölü override olurdu). offset NEGATİF (8. tur): şerit artık
   bitişik segmentlerden oluşuyor, dışa taşan bir halka komşu segmente binerdi. */
.hero-miniplan:focus-visible{outline:3px solid var(--pe-blue);outline-offset:-3px}
/* Genel toparlama (4. tur): hero-title gibi bu da fiyat/plan adını taşıyan bir
   "başlık" — orijinal ağırlığına döndü. Alt açıklama (>span) bir etiket, o
   katmanda kalıyor. */
.hero-plan-tab{display:none}
.hero-plan-price{font-size:17px;font-weight:950;letter-spacing:-.035em;color:var(--pe-navy)}
/* Birim etiketi ("/yayın"): fiyata göre orantılı (em), böylece her katmanda
   fiyatla birlikte ölçeklenir. Her paket TEK bir bülten yayınıdır. */
.hero-plan-price small{font-size:.56em;font-weight:700;letter-spacing:0;color:#8a94ae;margin-inline-start:2px}
.hero-plan-name{font-size:12px;font-weight:600;color:#5a6685}
/* Orta plan: şeridin açık zemini üzerinde BEYAZ bir kart. Kart bir sözde-öğe
   ve içeriğin ARKASINDA durur (z-index:0), içerik 1'de kalır. Dar ekranda
   sekmeye yer yok; sinyali kartın kendisi + marka renkli plan adı taşır. */
.hero-miniplan>*{position:relative;z-index:1}
.hero-miniplan-pop:after{content:"";position:absolute;inset:4px;z-index:0;
  background:#fff;border:1px solid #dbe5fb;border-radius:12px}
.hero-miniplan-pop .hero-plan-name{color:var(--pe-indigo);font-weight:700}
/* AP notu: eskiden .hero-ap-trust adlı ayrı kutuydu; bilgi plana ait olduğu
   için şeridin alt satırına taşındı. Marka vurgusu (strong) aynı kalıyor. */
/* AP notu: dolgulu ayrı bir blok değil, ince bir ayraçla ayrılmış tek satır.
   Punto şeridin KENDİ genişliğine bağlı (cqw): dar ekranda küçülüp tek satırda
   kalır, geniş ekranda 12px'e sabitlenir. */
.hero-plans-note{display:flex;align-items:center;justify-content:center;gap:7px;margin:0;
  padding:9px 10px;border-top:1px solid #e6ecf9;background:transparent;
  font-size:clamp(8.8px,2.7cqw,12px);font-weight:400;line-height:1.35;color:#5a6685;text-align:center}
.hero-plans-note>span:last-child{max-width:52ch}
.hero-plans-dot{flex:0 0 auto;width:5px;height:5px;border-radius:50%;background:var(--pe-blue)}
.hero-plans-note strong{color:var(--pe-indigo);font-weight:700}

/* AP güven şeridi (Task 11, desktop-polish-3): güven satırının (.hero-rotator)
   hemen altında ayrı bir şerit, açık mavi dolgu + ince kenar. (NOT, 2026-08-28
   spec: .plan-reach bu yüzey ailesinden ayrıldı — artık kutu değil, üst
   ayraçlı çıplak istatistik; bu şerit kendi kutulu halini koruyor.)
   Metin tr.json'da (hero.apTrust) — AP adı orada <strong>
   ile vurgulanır, burada yalnız sunum. İkon dekoratif (aria-hidden), i-shield
   sembolü zaten sayfada var (bkz. #i-shield). Margin-top rotator'dan (16px)
   daha dar (10px) tutulur ki ikisi aynı grup gibi okunsun; CTA'nın üstündeki
   16px boşluk bu şeridi ayrı bir blok olarak ayırır. */

/* Marka vurgusu (kullanıcı 7. tur): "Associated Press" lacivert değil MARKA
   MAVİSİ. Yeni renk değil — .hero-lead strong ("400+ mecralık haber ağımızda")
   birebir aynı kuralı kullanıyor, hero içinde tek bir vurgu dili var.
   Kontrast ölçüldü: #0f55ff üzerine şeridin #eef4ff zemini = 5.06:1, küçük
   kalın metin eşiği 4.5:1'in üstünde. */

/* Task 6 (desktop-polish-3): mobilde foto CTA/çip bloğunun ÜSTÜNE geçer
   (ürün sahibi kararı). DOM sırası DEĞİŞMEZ — yalnız görsel konum `order`
   ile taşınır. Neden DOM değil: CTA butonu + "Nasıl çalışıyor?" bağlantısı +
   3 plan çipi klavyeyle odaklanabilir tek öğeler; aralarındaki DOM sırası
   (ve dolayısıyla Tab sırası) bu blokta HİÇ değişmiyor, yalnız hepsi birden
   fotoğrafın (`.hero-collage`, `aria-hidden="true"`, hiçbir odak durağı
   içermiyor) altına kayıyor. Foto zaten AT ağacında yok, `order` da yalnız
   çizim sırasını etkiliyor (768+'ta grid-template-areas açık yerleşim
   kullandığından `order` orada yerleşimi hiç etkilemez — yalnız üst üste
   binme durumunda çizim sırası değişirdi, burada öyle bir binme yok).
   Sonuç: görsel sıra hâlâ Tab sırasıyla birebir örtüşüyor (kicker→title→
   lead→rotator→[foto, odaklanamaz]→cta→link→çip1→çip2→çip3) — WCAG 1.3.2/
   2.4.3 ihlali yok. Reveal sırası da bozulmuyor: REVEAL_SELECTORS
   (app.js) foto'yu hiç izlemiyor, izlenen 6 öğenin (kicker/title/lead/
   rotator/cta/miniplan) birbirine göre DOM+görsel sırası aynen duruyor.
   28 Ağu 2026: AP güven şeridi (.hero-ap-trust) ayrı bir blok olmaktan
   çıkıp fiyat şeridinin alt satırı oldu (.hero-plans-note), yani bu sıralamaya
   ek bir öğe katmıyor; odak durağı da içermiyor. */
@media (max-width:767px){
  .hero{display:flex;flex-direction:column}
  .hero-collage{order:1}
  .hero-cta{order:2}
  .hero-plans{order:3}
  /* 6. tur düzeltmesi: dikey flex konteynerinin varsayılanı align-items:stretch
     — .hero-kicker inline-flex/hug-content bir hap olmasına rağmen bu yüzden
     yatayda .hero'nun tam genişliğine geriliyordu (metinden sonra boş alan).
     flex-start ile yalnız kendi içeriği kadar genişliyor, masaüstündeki
     justify-self:start (satır ~2004) ile aynı davranış. */
  .hero-kicker{align-self:flex-start}
}

/* Güven bandı (sticky üst şerit) */
.top-progress{position:sticky;top:0;z-index:40;min-height:42px;padding:9px 12px;display:flex;gap:7px;align-items:center;justify-content:center;flex-wrap:wrap;text-align:center;font-size:11px;font-weight:950;letter-spacing:.04em;text-transform:uppercase;color:#fff;background:linear-gradient(90deg,#050a30,#0f55ff)}
.top-progress span+span:before{content:"•";margin-inline-end:7px;opacity:.45}
/* Çapa inişleri bandın ALTINA iner (QA I-1). Bant position:sticky/top:0 olduğu
   ve CSS'te hiç scroll-margin/scroll-padding bulunmadığı için her çapa hedefi
   bandın arkasına kayıyordu: #how'un başlığı (0..18px) tamamen görünmez,
   #live-report/#faq/#plans'ın .section-label rozeti kısmen örtülü kalıyordu.
   Hem tarayıcının hash gezinmesi hem app.js'in scrollIntoView({block:'start'})
   çağrıları scroll-margin-top'a uyar; tek kural ikisini birden düzeltir.

   DEĞER ÖLÇÜLDÜ (canlı dist/, HTTP): bandın gerçek render yüksekliği
   viewport ≤401px'te 51px (içerik iki satıra sarar), ≥402px'te 42px.
   Sarma eşiği bir breakpoint değil, metin+font genişliğinin türevi — bu yüzden
   değer bir media query'ye SABİTLENMEDİ. Tek değer en yüksek bandı temizler:
   51px + 12px nefes payı = 63px. 42px'lik bantta pay 21px'e çıkar; hedef yine
   bandın altında ve görünür kalır (ölçüm: task-9-fix-report.md §I-1).

   PİKSEL KORUNUMU: scroll-margin-top yalnız kaydırma hizasını etkiler, kutu
   modelini değil — durgun render hiçbir genişlikte değişmez. */
#how,#live-report,#faq,#plans{scroll-margin-top:var(--anchor-offset)}

/* Ortak bölüm yapıları */
.section-html{padding:28px var(--pad);background:linear-gradient(180deg,#fff,#f7f9ff)}
.section-label{display:inline-flex;align-items:center;gap:8px;border-radius:999px;padding:9px 13px;background:#eaf1ff;color:var(--pe-blue-dark);font-size:12px;font-weight:950;text-transform:uppercase;letter-spacing:.04em}
.h2{font-size:34px;line-height:1.02;letter-spacing:-.045em;margin:16px 0 10px;font-weight:950;color:var(--pe-navy)}
.h2 strong{color:var(--pe-blue)}
.lead{font-size:17px;line-height:1.55;color:#29304d;margin:0 0 18px}

/* Butonlar */
.cta-row{display:grid;grid-template-columns:1fr;gap:10px}
/* Buton köşesi 4px→10px→16px (kullanıcı geri bildirimi, 3. ve 5. tur): Cision'ın
   4px'i "fazla keskin", 10px de hâlâ "biraz daha yuvarlayabiliriz" bulundu.
   16px'te yatay dolgu (padding-inline) da eklendi — köşe yuvarlandıkça metin
   kenara daha yakın düşüyordu, 24px boşluk nefes payı veriyor. Rozet/şerit
   gibi diğer bileşenler (4px) bu değişiklikten ETKİLENMEDİ, yalnız .btn. */
.btn{min-height:54px;border-radius:16px;padding-inline:24px;display:flex;align-items:center;justify-content:center;gap:8px;font-size:16px;line-height:1.2;font-weight:700;letter-spacing:normal;cursor:pointer;border:0;width:100%;transition:transform .16s ease, box-shadow .16s ease, filter .16s ease, background-color .16s ease, border-color .16s ease, color .16s ease}
/* [hidden] her zaman display:none olmalı — .btn'nin kendi display:flex tanımı bunu ezerdi (bkz. checkout.css'teki benzer düzeltme, Stripe entegrasyonu) */
.btn[hidden]{display:none}
.btn:active{transform:scale(.985)}
/* Cision incelemesi (2026-08-28 spec, 2. tur): ilk turda hap biçim + iç ikon
   dairesi + gradyan uygulanmıştı; kullanıcı geri bildirimiyle bu tur DÜZ RENK
   + KESKİN KÖŞE (4px, ölçülen cision.com değeri) yönüne çekildi — gradyan ve
   daire tamamen kaldırıldı. Renk indigo (--pe-indigo) olarak kalıyor. */
/* Gölge de mavi: nötr gri gölge butonu zeminden koparıyordu, mavi tonlu
   parıltı onu zemine bağlıyor. Yatay dolgu 24->28: Creative Director'ün
   daha ferah butonu. */
.btn-primary{background:var(--pe-blue-grad);color:#fff;padding-inline:28px;box-shadow:0 10px 24px rgba(15,85,255,.30)}
/* Base ve Core plan CTA'ları artık aynı "ikincil" dilde: dolu değil, ince
   çerçeveli düz kenarlı buton. Starter (.btn-gold, aşağıda) tek dolu/indigo
   CTA olarak basamak hiyerarşisini koruyor. */
.btn-secondary{background:#fff;color:var(--pe-navy);border:2px solid var(--pe-navy)}
.btn-gold{background:var(--pe-indigo);color:#fff;box-shadow:0 4px 10px rgba(13,16,48,.16)}
/* Core planının CTA'sı: artık Base ile aynı ince çerçeveli buton — CTA
   merdiveni Starter (dolu indigo) / Base+Core (ince çerçeve) olarak sadeleşti. */
.btn-navy{background:#fff;color:var(--pe-navy);border:2px solid var(--pe-navy)}
/* Birincil butonlarda opsiyonel ok ikonu — artık daire kapsayıcı YOK, sade
   satır-içi glif (Cision'ın "Get Started ⟶" idiomu). */
.btn-arrow{flex:none;display:flex;align-items:center;justify-content:center}
.btn-arrow svg{width:16px;height:16px}
/* Alt yapışkan çubuğun masaüstü devraldığı üst bar CTA'sı; mobilde gizli (.btn'in display:flex'inden
   SONRA gelmeli — eşit özgüllükte kaynak sırası kazanır, aksi halde mobilde de görünür kalır).
   text-decoration:none: kodda ilk kez bir <a>, .btn diğer yerlerde hep <button> olduğu için
   tarayıcı varsayılan link altçizgisini burada ayrıca sıfırlamak gerekiyor. */
.btn.topbar-cta{display:none;text-decoration:none}

/* --- .btn ailesinin :hover / :focus-visible durumları (QA I-2) ---------------
   Ekrana gerçekten çıkan 12 CTA — landing'de 9 (hero, teklif, garantili yayın,
   canlı rapor, final, Base/Starter/Core plan kartları, mobil sabit bant) ve
   sipariş sayfasında 3 (iki "Devam" + ödeme butonu) — tarayıcının 1px
   varsayılan odak halkasına düşüyor ve hiç hover geri bildirimi vermiyordu.
   (Şablondaki 13. .btn olan .btn.topbar-cta Task 10'dan beri her genişlikte
   display:none; kurallar onu da kapsar ama sayfada görünmediği için matriste
   yok.)

   DÜZELTME (nihai inceleme I-2): burada eskiden "bu aile, sayfada halkasız
   kalan TEK etkileşim ailesiydi" yazıyordu — ÖLÇÜMLE YANLIŞTI. O turda
   halkasız kalan üç aile daha vardı: .link-how (bir <button> ama .btn sınıfı
   yok), .faq-grid summary (×6) ve mobilde .hero-miniplan (×3) + .footer-support
   a (halkaları yalnız 768+ katmanına yazılmıştı). Üçü de artık kendi taban
   kuralını taşıyor; iddia bu yüzden silindi, sayım cümlesi de tek aileye değil
   yalnız .btn'in kendi 12 CTA'sına bağlandı.

   ODAK HALKASI — idiom: sayfadaki tüm aileler (.topbar-whatsapp, .link-how,
   .faq-grid summary, .faq-whatsapp-link, .plan-report-link, .footer-nav a,
   .footer-support a, .hero-miniplan) `outline:3px solid <marka rengi>` +
   küçük offset yazar. Aynı biçim burada da kullanılıyor, iki ölçülmüş
   sapmayla:
   1) Renk MARKA MAVİSİNİN TAM YOĞUNLUĞU (var(--pe-blue)), eskiden
      kardeşlerdeki rgba(15,85,255,.45) DEĞİL. Gerekçe ölçüm: .45 alfa beyaz
      zemine kompozit edildiğinde #93b3ff'e denk gelir ve beyazla kontrastı
      2.08:1 — WCAG 1.4.11'in 3:1 eşiğinin ALTINDA. Tam yoğunluk 5.58:1 verir.
      Halkanın biçimi (3px solid, marka mavisi) korunuyor, yalnız opaklığı
      yükseliyor. NOT (nihai inceleme I-1): o turda bu düzeltme yalnız .btn'e
      uygulanmıştı; altı kardeş kural ölçülmüş başarısız değerde kalmıştı —
      hepsi bu turda aynı tam yoğunluğa çekildi.
   2) KOYU zeminlerde halka altına döner. Bu da mevcut idiom:
      .plan-starter .plan-report-link:focus-visible koyu Starter kartında tam
      olarak bunu yapıyor. Renk orada eskiden rgba(255,207,36,.75) idi; artık
      burada da orada da (1) ile aynı gerekçeyle TAM YOĞUNLUK (var(--pe-gold)):
      .75 alfa, Starter kartının gradyanının PARLAK MAVİ ucunda (ölçülen
      en kötü piksel #285ad3) 2.85:1'e düşüyordu — 3:1'in altında. Tam
      yoğunlukta aynı piksel 4.01:1, gradyanın en parlak köşesinde (#0f55ff)
      3.72:1 veriyor.
   Sabit bandın CTA'sı üçüncü bir durum: BEYAZ buton, koyu/temaya bağlı zemin.
   Halka orada KOYU ve İÇERİ ofsetli (aşağıdaki .sticky-cta .btn:focus-visible),
   böylece üç sticky temasında da (mavi/lacivert/altın) butonun kendi beyazına
   karşı okunur kalır. Tüm oranlar tek tek ölçüldü: task-9-fix-report.md §I-2.
   (Task 17: bu bildirimi Task 14'ten beri paylaşan kardeş kural
   `.sticky-whatsapp:focus-visible` SİLİNDİ — WhatsApp banttan çıktı; yüzen
   düğme banttan bağımsız olduğu için idiomun DIŞARI ofsetli marka-mavisi
   biçimine döndü, bkz. .wa-fab:focus-visible.)

   HOVER — yalnız `@media (hover:hover)` içinde: dokunmatik cihazlarda hover
   durumu tıklamadan sonra butona "yapışır", bu koruma onu engeller.
   Efektler sadece renk/gölge/filter kaydırır; TRANSFORM KULLANILMIYOR, dolayısı
   ile ne düzen ne de komşu konumları değişir (kanıt: fix raporu §I-2 komşu
   ölçümü). :active'in mevcut scale(.985)'i olduğu gibi duruyor.
   prefers-reduced-motion:reduce altında satır 688'deki `*{transition:none
   !important}` bu geçişleri de kapatır — ayrı kural gerekmiyor (ölçüldü:
   reduce altında .btn'in transition-duration'ı 0s). */
.btn:focus-visible{outline:3px solid var(--pe-blue);outline-offset:3px}
/* Koyu zeminler: final çağrısı bloğu ve koyu Starter kartı. Mavi halka bu iki
   zeminde 3.2:1 civarına düşerken altın 4:1–7:1 veriyor (ölçüm: fix raporu). */
.final-punch .btn:focus-visible,.plan-starter .btn:focus-visible{outline-color:var(--pe-gold)}
/* Sabit bandın CTA'sı: beyaz buton, koyu halka İÇERİ ofsetli (buton bandın
   kenarına yakın, dışarıda halka için yer yok). */
.sticky-cta .btn:focus-visible{outline:3px solid rgba(6,11,51,.9);outline-offset:-3px}

@media (hover:hover){
  .btn-primary:hover{filter:brightness(1.08);box-shadow:0 14px 30px rgba(15,85,255,.38)}
  .btn-secondary:hover{background:var(--pe-navy);color:#fff;border-color:var(--pe-navy);box-shadow:0 6px 14px rgba(13,16,48,.18)}
  .btn-gold:hover{filter:brightness(1.12);box-shadow:0 6px 14px rgba(13,16,48,.22)}
  .btn-navy:hover{background:var(--pe-navy);color:#fff;border-color:var(--pe-navy);box-shadow:0 6px 14px rgba(13,16,48,.18)}
  /* Final bloğunun outline .btn-secondary'si koyu zeminde: yukarıdaki açık
     zemin hover'ı (açık mavi dolgu + koyu mavi metin) burada kontrastı
     TERSİNE çevirirdi; koyu zeminde beyaza doğru açılıyor. */
  .final-punch .btn-secondary:hover{background:rgba(255,255,255,.14);border-color:#fff;color:#fff;box-shadow:none}
  /* Sabit bandın beyaz CTA'sı: filter/gölge yerine hafif soğuk bir dolgu. */
  .sticky-cta-btn:hover{background:#e9f0ff}
}

/* Ana teklif bölümü */
.front-offer{padding:30px var(--pad) 28px;background:radial-gradient(circle at 85% 10%,rgba(15,85,255,.18),transparent 32%),linear-gradient(180deg,#ffffff 0%,#edf4ff 100%);border-bottom:1px solid #dce7ff}
/* .hero-kicker buraya birleştirildi (5. tur, kullanıcı isteği: "hero'daki kutu
   NET TEKLİF'teki ile aynı olsun"). gap:8px hero-kicker'daki ikon için, kicker
   metin-only kullanımda etkisiz. */
.front-badge,.hero-kicker{display:inline-flex;align-items:center;gap:8px;border-radius:999px;padding:9px 13px;background:var(--pe-blue-grad);color:#fff;font-size:12px;font-weight:950;letter-spacing:.045em;text-transform:uppercase;box-shadow:0 8px 20px rgba(15,85,255,.28)}
.offer-title{margin:17px 0 12px;font-size:42px;line-height:.98;letter-spacing:-.055em;color:var(--pe-navy);font-weight:950}
.offer-title strong{color:var(--pe-blue)}
/* Genel toparlama (4. tur): "genel metin bölümlerinde kalınlaştırılan fontlar
   kötü duruyor" geri bildirimi — akan cümle metinleri (gerçek gövde metni)
   sitenin tamamında 400'e çekildi; bu sadece hero+pricing'e özgü değil,
   aşağıdaki tüm ".front-lead/.faq-whatsapp p/.footer-desc/.chat-a/
   .audience-copy span/.step-copy span" için geçerli aynı kural. Rozet, etiket,
   rakam gibi UI metinlerine DOKUNULMADI — yalnız okunan cümleler. */
.front-lead{margin:0;color:#1c274a;font-size:18px;line-height:1.46;font-weight:400}
.front-lead b{color:#063fd2;font-weight:950}
.front-note{margin:13px 0 0;color:#43506f;font-size:13px;line-height:1.4;font-weight:800;text-align:center}

/* SSS: tek gövdeli, ince ayraçlı sakin liste */
.faq-section{background:#fff}
/* overflow: hidden → clip + 6px pay (nihai inceleme I-2). Kırpma KUTUSU ve
   yuvarlak köşe aynı; tek fark, kartın dikey dolgusu 0 olduğu için üst kenara
   yaslı İLK summary'nin ve (kapalıyken) alt kenara yaslı SON summary'nin odak
   halkasının artık kırpılmaması. `clip` BFC kurmaz — bu kartta kenar boşluğu
   çökmesine aday çocuk yok (details/summary/p'nin hepsi margin:0), durgun
   render 7 genişlikte 0px farkla doğrulandı. overflow-clip-margin'i
   desteklemeyen tarayıcıda geri düşüş İKİ KADEMELİDİR (düzeltme — yeniden
   inceleme M-3: burada eskiden tek kademeli ve "eski `hidden` ile birebir
   aynı" yazıyordu, ölçümle yanlıştı):
     (a) `overflow:clip` destekli ama `overflow-clip-margin` desteksiz →
         yalnız ikinci bildirim düşer, davranış 0 paylı clip = eski `hidden`;
     (b) `overflow:clip` de desteksiz → bu kuralda başka overflow bildirimi
         olmadığı için değer `visible`'a düşer. Etkisi bu kartta 0-5px
         (kırpılacak taşan içerik yok; yalnız ilk/son summary'nin odak
         halkası kart kenarından 3px dışarı taşabilir). */
.faq-grid{display:grid;gap:0;background:#fff;border:1px solid var(--pe-border);border-radius:20px;padding:0 16px;overflow:clip;overflow-clip-margin:6px;box-shadow:0 12px 30px rgba(9,16,51,.07)}
.faq-grid details{border:0;border-radius:0;padding:0;background:transparent}
.faq-grid details+details{border-top:1px solid #eef2fb}
/* Genel toparlama (5. tur): soru metni bir başlık değil, tek satırlık bir
   liste öğesi — 850 ağırlık yığın hâlinde ağır duruyordu, etiket katmanına
   (700) çekildi. */
.faq-grid summary{display:flex;align-items:center;gap:12px;min-height:56px;padding:15px 0;font-size:15.5px;font-weight:700;letter-spacing:-.01em;line-height:1.3;color:var(--pe-navy);cursor:pointer;list-style:none;-webkit-tap-highlight-color:transparent}
/* Odak halkası (nihai inceleme I-2): akordeon başlıkları odaklanabilir ve
   list-style:none ile tamamen özelleştirilmiş, ama hiç odak stili yoktu —
   art arda 6 durak boyunca marka halkası kayboluyordu. Biçim aile idiomu:
   3px solid marka mavisi + küçük POZİTİF offset. İçeri ofset (.sticky-*
   idiomu) burada kullanılamaz: summary'nin yatay dolgusu 0, yani metin
   x=0'dan başlar ve içeri çekilmiş halka harflerin üstünden geçerdi
   (ölçüldü). Zemin kartın beyazı: 5.58:1. Kırpma payı için bkz. .faq-grid. */
.faq-grid summary:focus-visible{outline:3px solid var(--pe-blue);outline-offset:2px}
.faq-grid summary::-webkit-details-marker{display:none}
.faq-grid summary::marker{content:""}
.faq-grid summary::after{content:"+";margin-inline-start:auto;flex:0 0 26px;width:26px;height:26px;border-radius:50%;background:#eaf1ff;color:var(--pe-blue-dark);font-size:18px;font-weight:700;line-height:1;display:inline-flex;align-items:center;justify-content:center;transition:transform .3s cubic-bezier(.32,.72,0,1),background .2s ease,color .2s ease}
.faq-grid details[open] summary::after{transform:rotate(45deg);background:var(--pe-blue);color:#fff}
.faq-grid details[open] summary{color:var(--pe-blue-dark)}
.faq-grid p{margin:0;padding:0 0 15px;padding-inline-end:38px;color:#33405c;line-height:1.55;font-size:14.5px}
.faq-grid details[open] p{animation:faq-in .35s cubic-bezier(.32,.72,0,1)}
@keyframes faq-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
@media (max-width:360px){.faq-grid summary{font-size:14.5px}}
@media (prefers-reduced-motion:reduce){.faq-grid details[open] p{animation:none}}

/* SSS sonu: "Cevabını bulamadınız mı?" kutusu + WhatsApp bağlantısı (Task 10,
   desktop-polish-3). Tüm genişliklerde görünür — .faq-grid'in DIŞINDA, ayrı
   bir kart; dürüstlük kanonu: yalnız kanalın var olduğu belirtilir (bkz.
   whatsapp.faqBody, tr.json), yanıt süresi/7-24 vaadi yok. */
.faq-whatsapp{margin:16px 0 0;padding:18px 16px;background:#f4f8ff;border:1px solid var(--pe-border);border-radius:16px;text-align:center}
.faq-whatsapp b{display:block;font-size:15px;font-weight:900;letter-spacing:-.01em;color:var(--pe-navy)}
.faq-whatsapp p{margin:6px 0 14px;font-size:13.5px;line-height:1.5;color:#4a5677;font-weight:400}
.faq-whatsapp-link{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:44px;padding:0 20px;border-radius:999px;background:#fff;border:1.5px solid #25d366;color:#128c4a;font-size:14px;font-weight:850;text-decoration:none;transition:background .16s ease}
.faq-whatsapp-link .ic-whatsapp{color:#25d366}
.faq-whatsapp-link:hover{background:#f0fdf5}
/* Tam yoğunluk (nihai inceleme I-1): .45 alfa, kutunun #f4f8ff zeminine
   kompozit edildiğinde 2.04:1 veriyordu; #0f55ff aynı zeminde 5.24:1. */
.faq-whatsapp-link:focus-visible{outline:3px solid var(--pe-blue);outline-offset:2px}

/* Final çağrı */
.final-punch{background:radial-gradient(circle at 80% 12%,rgba(255,207,36,.26),transparent 28%),linear-gradient(180deg,#071048,#030720);color:#fff}
.final-punch .h2,.final-punch .lead{color:#fff}
.final-punch .h2 strong{color:#ffcf24}
.final-punch .section-label{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.18);color:#ffcf24}
.final-punch .btn-secondary{background:transparent;color:#fff;border-color:rgba(255,255,255,.55)}

/* Plan kartları */
.plan-grid{display:grid;gap:14px;margin-top:18px;align-items:stretch}
/* Cision incelemesi (2. tur): kart köşesi 24px→16px (ölçülen cision.com
   değeri), gölge nötrleştirildi (mavi tonlu değil, düz siyah/az opaklık). */
.plan-card{position:relative;border:2px solid transparent;border-radius:16px;padding:18px;background:#fff;box-shadow:0 4px 16px rgba(9,16,51,.1);cursor:pointer;transition:transform .16s ease,border-color .16s ease,box-shadow .16s ease,background .16s ease,outline .16s ease}
.plan-card:hover{transform:translateY(-2px)}
/* Seçim vurgusu tek halka (Task 9): eski `:after` ikinci halkası (inset:-6px,
   border:3px solid currentColor) SİLİNDİ — seçili Starter kartında eşzamanlı
   yedi vurgu sinyali vardı ve halkanın rengi currentColor'a bağlı olduğu için
   kartın metin rengine dokunan her değişiklik onu sessizce bozuyordu.
   inset:-6px taşmasının komşu kartla çakışma riski de böylece bitti. */
.plan-card.is-selected{outline:4px solid rgba(15,85,255,.20);box-shadow:0 22px 58px rgba(15,85,255,.26);transform:translateY(-3px)!important}
.plan-card.is-selected .selected-mark{display:flex}
.selected-mark{display:none;position:absolute;inset-inline-end:14px;top:14px;z-index:2;align-items:center;gap:6px;border-radius:999px;background:#16b86a;color:#fff;font-size:12px;font-weight:700;padding:7px 11px;box-shadow:0 8px 20px rgba(20,184,106,.28)}
.selected-mark:before{content:"✓";display:inline-flex;width:17px;height:17px;border-radius:50%;background:#fff;color:#16b86a;align-items:center;justify-content:center;font-size:12px}
.badge{display:inline-flex;margin:0 0 10px;color:#091033;background:var(--pe-gold);border-radius:999px;font-size:12px;font-weight:700;padding:7px 11px;text-transform:uppercase}
.plan-badge:empty{display:none}
.plan-core .badge{background:#101841;color:#fff}
/* Starter rozeti artık kart genişliğinde bir şerit ("Önerilen Plan" — geçmişte
   açık kalan rozet sorusunun 2026-08-28 spec cevabı). Negatif margin kartın
   kenarına (border 2px + padding 18px = 20px) kadar taşıyor; üst köşe yarıçapı
   kartınkinden (24px) border payı düşülerek (22px) hesaplandı — overflow:hidden
   GEREKMİYOR, iki yay zaten çakışıyor. Aşağıdaki .selected-mark override'ı
   şeritle çakışmayı önlüyor. */
.plan-starter .badge{display:block;text-align:center;margin-block:-20px 16px;margin-inline:-20px;padding:11px 20px;border-radius:14px 14px 0 0;background:var(--pe-indigo);color:#fff}
/* 5. tur düzeltmesi: eski top:50px, fiyat 48px/950'ye büyüyünce "Seçildi"
   rozetini $129'un üstüne bindiriyordu. Şerit (.badge) kartın dış kenarına
   (-20px negatif margin ile) taşıyor, yani top:0 hizasından başlıyor — mark'ı
   ÖZEL bir offsetle DEĞİL, diğer iki kartla aynı taban top:14/inset-inline-end:14
   değeriyle bırakmak onu doğrudan şeridin üstüne, aynı konuma oturtuyor. */
/* Base rozeti: sessiz/nötr varyant — diğer iki kartın vurgulu rozetlerinden bilinçli olarak
   geri planda kalır (Task 5) — base katmanda, tüm cihazlarda görünür (kasıtlı içerik) */
.plan-base .badge{background:#e8f0ff;color:#1b2a63;border:1px solid #cbdcff}
.plan-top{display:flex;justify-content:space-between;gap:14px;align-items:flex-start}
/* Genel toparlama (4. tur): plan adı ve fiyatı da hero-title ile aynı gerekçeyle
   orijinal ağırlığına döndü — bunlar kartın "başlığı". plan-sub bir alt etiket,
   hafif kalıyor. */
.plan-name{font-size:30px;font-weight:950;letter-spacing:-.035em;margin:0}
.plan-sub{font-size:14px;color:var(--pe-blue-dark);font-weight:400;margin:4px 0 0}
/* 5. tur: fiyat büyüklüğü 48px'te maddelerin/plan adının üstüne fazla baskın
   geliyordu; ağırlık(950)/aralık(-.05em) korunuyor, yalnız punto küçüldü. */
.plan-price{font-size:36px;font-weight:950;letter-spacing:-.05em;color:var(--pe-navy);white-space:nowrap}
.plan-card ul{list-style:none;margin:15px 0 18px;padding:0;display:grid;gap:9px}
.plan-card li{position:relative;padding-inline-start:30px;font-size:14px;line-height:1.4;color:#2c3355;font-weight:400}
.plan-card li:before{content:"✓";position:absolute;inset-inline-start:0;top:-1px;width:21px;height:21px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:var(--pe-indigo);color:white;font-size:13px;font-weight:700}
.plan-base{background:linear-gradient(180deg,#ffffff,#eef5ff);border-color:#cbdcff}
.plan-base.is-selected{border-color:var(--pe-indigo)}
.plan-starter{background:var(--pe-indigo-deep);color:#fff;border-color:var(--pe-indigo-deep);z-index:1}
/* 5. tur: seçili Starter'ın altın/sarı kontürü yerine gümüş — koyu indigo
   zeminde okunurluğu aynı, ama "zamansız/kurumsal" dile daha uygun. */
.plan-starter.is-selected{border-color:#c9cfdd;outline-color:rgba(201,207,221,.45)}
.plan-starter .plan-sub,.plan-starter li{color:rgba(255,255,255,.9)}
.plan-starter .plan-price{color:#fff}
.plan-starter li:before{background:#fff;color:var(--pe-indigo)}
/* 5. tur: Core artık Base ile aynı zemini kullanıyor (kullanıcı isteği — iki
   kart aynı arka plan rengi); sarı kontür de gümüşe döndü, badge (navy) ve
   fiyat/liste vurguları zaten Core'u Base'den ayırt etmeye yetiyor. */
.plan-core{background:linear-gradient(180deg,#ffffff,#eef5ff);border-color:#c9cfdd;z-index:2}
.plan-core.is-selected{border-color:#101841;outline-color:rgba(16,24,65,.22)}

/* Erişim vurgu bandı: kartın ikinci fiyatı. 2026-08-28 spec: paylaşılan
   referans görseldeki "büyük istatistik rakamı" diline geçti — kutu/dolgu
   yerine üst ayraç + iri rakam. İkon kaldırıldı (referans görselde de yok);
   .ic kuralları hedefsiz kalmasın diye silinmedi, aşağıda artık kullanılmıyor. */
.plan-reach{display:flex;align-items:baseline;gap:8px;margin:16px 0 0;padding:16px 0 0;border-block-start:1px solid #dde7ff}
.plan-reach .ic{display:none}
.plan-reach b{font-size:32px;font-weight:700;letter-spacing:-.01em;color:var(--pe-navy)}
.plan-reach span{font-size:14px;font-weight:400;color:#66708a}
.plan-starter .plan-reach{border-block-start-color:rgba(255,255,255,.18)}
.plan-starter .plan-reach b{color:#fff;font-size:32px}
.plan-starter .plan-reach span{color:rgba(255,255,255,.65)}
.plan-core .plan-reach b{font-size:32px}

/* Kart içi örnek mecra bloğu — KAPSIZ, TEK KOLON DİKEY YIĞIN (Task 9).
   Kap yok: tek ayırıcı saç teli bir üst çizgi. flex-wrap tamamen bırakıldı —
   tırtıklı 2/1/1 kırılma altı mecrayı altı ayrı parça gibi gösteriyordu.
   grid-template-columns:minmax(0,1fr) ŞART (salt `1fr` DEĞİL): `1fr` =
   `minmax(auto,1fr)` olduğu için geniş wordmark'ların min-content genişliği
   kolonu şişirip kabuğu taşırır. */
.plan-logos{margin:20px 0 22px;padding:16px 0 0;border:0;border-top:1px solid rgba(9,16,51,.09);border-radius:0;background:none}
/* Etiket ("Ağdan örnek mecralar") KORUNUR — "örnek" kelimesi dürüstlük
   mimarisinin taşıyıcısı. Renk #8b94ab → #6b7280: eski kontrast 2.80:1 ile
   WCAG AA altındaydı, yenisi beyaz üzerinde 4.83:1. */
.plan-logos-label{display:block;margin:0 0 14px;font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:#6b7280}
.plan-logos-row{display:grid;grid-template-columns:minmax(0,1fr);row-gap:14px;justify-items:start;align-items:center;color:#1b2a63}
/* height:auto + max-width:100% kombinasyonu taşmayı YAPISAL olarak imkânsız
   kılar: yükseklik svg'nin viewBox'ından, maskenin aspect-ratio'sundan türer. */
.plan-logos-row svg,.plan-logos-row .logo-mask{display:block;height:auto;width:auto;max-width:100%}
.plan-logos-row svg{fill:currentColor;stroke:none}
.plan-logo-word{display:block;font-size:23px;font-weight:950;letter-spacing:-.02em;line-height:1.1;white-space:nowrap}
.plan-logos-more{display:block;margin-top:14px;font-size:12px;font-weight:700;font-style:normal;color:#6b7280}
/* Optik alan normalizasyonu: sabit görsel alan A≈4400px², h=√(A/oran),
   [22,32]px'e kırpılmış. Değerler YÜKSEKLİK değil GENİŞLİK olarak yazılır —
   tek tablo 320px'ten 1440px'e kadar geçerli, breakpoint'e özel ikinci bir
   tablo YOK. En geniş öğe 193px; en dar 3-kolon içeriği 242.7px (1000-1079),
   en dar mobil içerik 279px (355px viewport) — her ikisinde de taşma yok.

   TAVAN KURALI (Task 7): oran > ~8.8 olan wordmark'larda formül h'yi 22px
   tabanına kırpar ve genişlik 193px'i aşar (tek satır Business Insider 250px,
   Star Tribune 247px, Business Insurance 310px isterdi) — 242.7px'lik en dar
   kolonda bu ya taşar ya max-width:100% ile orantısız küçülürdü. Bu yüzden
   tabloya AÇIK BİR GENİŞLİK TAVANI eklendi: 193px, yani tablonun ZATEN mevcut
   en geniş değeri — yeni bir maksimum icat edilmedi. Bedeli, bu üç öğenin
   22px yükseklik tabanının altında kalması (17.0 / 17.2 / 13.7px); üçü de
   büyük harf/yüksek versal wordmark olduğu için gerçek optik ağırlıkları
   kutu yüksekliğine değil versal yüksekliğine bağlı ve satırda dengeli
   okunuyor (1280/1440'ta gözle doğrulandı). */
/* AP FORMÜLDEN SAPAR (formül 145px isterdi, oran 4.8) — Task 13, kullanıcı
   "Associated Press küçük görünüyor" dedi ve ölçüm bunu doğruladı. Sebep
   yapısal: AP tablodaki TEK monogram+wordmark kilidi. 240x50 viewBox'ının
   %10'u boşluk (ink 233.33x41.73) ve yüksekliğini büyük "AP" monogramı
   belirlerken "Associated Press" kelimesinin versal yüksekliği yalnız 16.36
   viewBox birimi. 144px'te bu 9.8px'e denk geliyordu; komşuları 17-19px
   (USA TODAY 18.9, Business Insider 17.0, MarketWatch 19.6). İzole
   rasterizasyonla ölçülen mürekkep kütlesi de 858px² ile satırın en
   düşüğüydü (komşu medyanı ~1750-2000).
   162px seçildi (kütle ~1086px²): AP'nin MÜREKKEP yüksekliği 28.2px'e
   çıkarak Starter yığınının o güne dek en yüksek mürekkebi olan
   barchart'ın 28.7px'ine oturur. Daha yukarısı denendi ve REDDEDİLDİ:
   170px'te monogram (23.9px) USA TODAY'in versalini açıkça aşıp satırı
   domine ediyor, kelime hâlâ küçük kalıyordu — yani ölçek büyüdükçe
   dengesizlik yön değiştiriyor. Tam eşitlik ulaşılamaz (kelimeyi 13.5px'e
   getirmek 198px isterdi, 193px tavanının üstü); hedef eşitlik değil,
   satırın en zayıf halkası olmaktan çıkmaktır. Sembole/viewBox'a
   DOKUNULMADI — #n-ap bantla paylaşılıyor. */
.plan-logos-row svg.logo-ap{width:162px}
.plan-logos-row svg.logo-yn{width:166px}
.plan-logos-row svg.logo-usat{width:174px}
.plan-logos-row svg.logo-mw{width:175px}
/* Core: USA Today -> Barchart görevi, ince ayar turu. İlk commit'te 149px
   kullanılmıştı — Barchart'ın Starter'dan (Task 1) kalan, o zaman ORADAKİ
   komşularına (CBS19/Fox Illinois/ABC12, koyu zemin) göre kalibre edilmiş
   eski değeri. Core'un komşuları FARKLI (AP/Business Insider/Yahoo News/
   MarketWatch, açık krem zemin) — canlıya çıkınca kullanıcı "hâlâ diğerlerine
   göre büyük" dedi, gözle doğrulandı: 149px'te Barchart'ın mürekkep
   yüksekliği 28.8px'e çıkıyordu, bu satırın tek gerçek istisnası olan AP
   monogramıyla (28.3px, kırmızı üstteki AP İSTİSNASI notuna bkz.) neredeyse
   birebir aynıydı — yani Barchart, kalın gövdeli düz bir wordmark olduğu
   için AP'nin İSTİSNAİ yüksekliğini PAYLAŞIYOR, komşularının (Business
   Insider 17.0px, Yahoo News 27.0px, MarketWatch 25.0px) ortasında değil
   tepesinde duruyordu.
   Bu dosyanın kendi yöntemiyle (izole rasterize, ölçü canlıdan alındı,
   #n-ap kalibrasyonu ~1086-1128px² aralığıyla örtüşerek doğrulandı)
   ölçülen mürekkep değerleri (149px'te): AP 1128px²/28.3px, Business
   Insider 2186px²/17.0px, Yahoo News 1778px²/27.0px, MarketWatch
   1790px²/25.0px, Barchart 1817px²/28.8px.
   119px seçildi: mürekkep yüksekliği 23.0px'e iner — Business Insider'ın
   17px'i ile Yahoo News/MarketWatch'ın 25-27px'i ARASINA, satırın ORTASINA
   oturur; AP'nin istisnai 28.3px'ini artık paylaşmıyor. Mürekkep alanı da
   1161px²'ye iner (AP'ninkine yakın, satırın en hafifleri) — kalın gövdeli
   bir wordmark için kabul edilebilir, çünkü asıl şikayet YÜKSEKLİK
   dominasyonuydu, alan değil. */
.plan-logos-row svg.logo-bc{width:119px}
/* openPR FORMÜLDEN SAPAR (formül 191px isterdi, oran 8.27): tek ağır display
   italik wordmark, versal yüksekliği kutunun büyük kısmını doldurur ve turuncu
   yüksek kroma. 191px'te komşularının (Star Tribune 193px, Business Insurance
   193px) versal yüksekliğini açıkça aşıp satırı domine ediyordu — kutu alanı
   eşit olmasına rağmen OPTİK ağırlık eşit değildi. 175px'te versal yüksekliği
   Star Tribune ile göz kararı eşitlenir (155/165/175/191 dörtlüsü 1440'ta yan
   yana basılıp karşılaştırıldı). Tablonun ölçüsü kutu alanı DEĞİL optik
   eşitliktir; alan formülü yalnız iyi bir ilk tahmindir. */
.plan-logos-row svg.logo-opr{width:175px}
/* Yeni mecralar (yeni-mecralar / Task 1) — Starter yığınının DÖRT eski üyesi
   (Barchart .logo-bc, Benzinga ve Digital Journal maskeleri, The Globe and Mail
   .logo-gm) karttan çıktığı için bu dört PLAN KARTI kuralı ve onları
   gerekçelendiren Task 13 yorumları SİLİNDİ — ölü kural bırakılmadı. Dördü de
   medya ağı bandında YAŞAMAYA DEVAM EDİYOR; bandın kendi kuralları
   (.network-logo--barchart / --gm, .network-logo .logo-mask--benzinga / --dj)
   ve sembol/maske TANIMLARI (#n-barchart, #n-gm, logo-masks.css) DOKUNULMADAN
   duruyor. Starter'ın GM'e özel color:transparent istisnası da bu yüzden
   kalktı: #n-gm artık hiçbir plan kartında yok.

   Yerlerine gelen üç yerel TV istasyonu. Tablonun ölçüsü kutu alanı DEĞİL
   OPTİK ağırlık (bu dosyanın kuralı: "eşit kutu genişliği ≠ eşit görsel
   ağırlık"). Üçü de bu satırın alışık olduğu YATAY wordmark değil: CBS19 ve
   Fox Illinois iki satırlı YIĞIN, ABC12 ise rozet+blok+şerit+NEWS kilidi
   (en/boy 3.35 / 1.89 / 5.34; komşuları AP 4.8, USA TODAY 6.7). Bu yüzden
   kaba kutu yüksekliği değil ANA SATIRIN versal yüksekliği hizalandı —
   ölçülen ana satır/toplam yükseklik oranları: CBS19 0.631 ("CBS19"; altında
   "NEWS"), Fox Illinois 0.815 ("FOX"; altında çizgi + "ILLINOIS"), ABC12
   1.000 (tek satır). Ölçüm ve seçilen değerler aşağıdaki kuralın üstünde. */
/* ÖLÇÜLEN DEĞERLER (1440, gerçek DOM; mürekkep izole rasterize edilip 4x
   örneklendi — styles.css'in Task 13'te kullandığı YÖNTEMİN AYNISI, kalibrasyon:
   bu yöntem AP'yi 1095px² ölçüyor, Task 13'ün kaydı 1086px²):
     logo               genişlik  kutu   ana satır  mürekkep alanı
     AP (referans)        162px   33.8     28.3*        1095px²   (*monogram)
     USA TODAY (ref.)     174px   26.0     18.8         2029px²
     CBS19 News           120px   35.8     22.0         1990px²
     Fox Illinois          70px   37.0     29.3         1502px²
     ABC12 News           160px   30.0     29.3         2850px²
   Brief'in başlangıç önerisi (145/84/62) ÖLÇÜMLE REDDEDİLDİ: CBS19 2917px²
   ve Fox Illinois'in "FOX" satırı 35.3px çıkıyordu — ikisi de yığının o güne
   dek en ağır üyesi olan barchart'ı (1778px², Task 13 kaydı) ve en yüksek
   versali olan AP monogramını (28.3px) açıkça aşıyordu, yani üç YENİ mecra
   kartın iki KURUCU mecrasını (AP, USA Today) eziyordu. Dört aday üçlü
   (145/84/62 · 130/76/70 · 120/70/76 · 112/64/68) 1440'ta gerçek Starter
   zemininde yan yana basılıp karşılaştırıldı; CBS19 için 120px, Fox Illinois
   için 70px seçildi.
   ABC12 AYRI HESAPLANDI ve tek OPTİK OLMAYAN istisnadır: ürün sahibi kararıyla
   varlık, düz 2022 markasından (en/boy 1.71) HABER KİLİDİNE geçti — "abc" +
   "12" + ince dikey şeritler + "NEWS", en/boy 5.34. Saf optik hizalama 125px
   isterdi (ana satır 22.8px, kütle 1748px² — tam bandın ortası) AMA o ölçüde
   kilidin "12" ile "NEWS" arasındaki ince dikey şeritleri KAPANIYOR ve tek bir
   gri bloğa dönüşüyor. Bu görsel bir kayıp değil, MARKA BÜTÜNLÜĞÜ kaybı.
   Ölçülen ayrışma eşiği: 13px yükseklik kapalı, 15px çoğunlukla kapalı, 16px
   sınırda, 18px ayrışıyor, 23px+ tamamen temiz. Kart merdiveninde 160px
   (30px yükseklik) seçildi — eşiğin güvenli üstü. Bedeli: kütlesi 2850px²
   ile yığının en ağırı (USA TODAY 2029). Kabul edilebilir, çünkü kütle UZUN
   ve SEYREK dağılmış (160px genişliğe yayılmış 30px yüksekliğinde bir şerit),
   yoğun bir blok değil; gözle 1440'ta komşularının yanında ağır DURMUYOR.
   Ana satırı 29.3px, Fox Illinois'inkiyle (29.3) birebir aynı.
   Üçünün ana satırı 22.0-29.3px; mevcut komşuların (18.8-28.3px) hemen
   üstünde ama bandın içinde. */
.plan-logos-row svg.logo-cbs19{width:120px}
.plan-logos-row svg.logo-foxil{width:70px}
.plan-logos-row svg.logo-abc12{width:160px}
.plan-logos-row svg.logo-bi{width:193px}
.plan-logos-row svg.logo-st{width:193px}
.plan-logos-row svg.logo-bins{width:193px}
/* Observer-Reporter (Base satırı, 2026-09-16). Genişlik bu dosyanın kendi
   yöntemiyle seçildi: izole rasterize edilip mürekkep ALANI komşularıyla
   karşılaştırıldı — Star Tribune 1700px², openPR 1745px², Business Insurance
   1703px². Observer-Reporter 175px'te 1677px² veriyor, yani satırın
   ortasına oturuyor. Mürekkep YÜKSEKLİĞİ (27px) komşularından fazla, çünkü
   blackletter bir wordmark; alan eşitliği bu dosyada yükseklik eşitliğine
   tercih edilir (bkz. #n-ap istisnası notu). */
.plan-logos-row svg.logo-or{width:175px}
/* Core (açık krem zemin): TAM RENK. Semboller zaten fill:currentColor
   kullandığı için bu, logo başına tek satır `color` bildirimi — sıfır yeni
   varlık. (Eski "Barchart/Benzinga/DJ/GM yalnız Starter'da" notu SİLİNDİ:
   Benzinga/DJ/GM hâlâ hiçbir plan kartında yok, yalnız bantta yaşıyorlar;
   Barchart ise USA Today -> Barchart görevinde Core'a geri döndü — bkz.
   template.html'deki ilgili yorum. Barchart'ın bu projede tanımlı bir marka
   rengi yok (bantta da currentColor), o yüzden aşağıdaki istisna listesine
   girmedi ve tabandan #1b2a63 devralıyor — istisna, kural değil.)
   AP İSTİSNASI (Task 7): kırmızı tonlama (#ff322e) KALKTI, yerine markanın
   GERÇEK iki tonu geldi. #n-ap aynı anda koyu Starter kartında da kullanıldığı
   için renkler sembole GÖMÜLEMEZ (gömülürse lacivert zeminde turuncu/siyah
   kalır, satırın beyaz siluetini bozar). Çözüm: sembol iki custom property
   okur — fill:var(--ap-mark,currentColor) / var(--ap-word,currentColor).
   Custom property'ler <use> gölge ağacına MİRAS YOLUYLA geçer, sınıf
   seçicileri geçmez; bu yüzden tek sembolle iki farklı sunum mümkün.
   Tanımsız bırakılan her yerde (Starter, medya şeridi) currentColor'a düşer,
   yani eski davranış birebir korunur.
   NOT: logo-usat'ın Core'a özel #101010 rengi bu görevle SİLİNDİ — USA Today
   artık Core'da yok, kural Starter'da hâlâ kullanılan .logo-usat'ı etkilemiyordu
   zaten (o kural .plan-core ile kapsanmıştı), ama ölü kural bırakılmadı. */
.plan-core .plan-logos-row svg.logo-ap{--ap-mark:#cc3401;--ap-word:#231f20}
.plan-core .plan-logos-row svg.logo-bi{color:#111111}
.plan-core .plan-logos-row svg.logo-yn{color:#6001d2}
.plan-core .plan-logos-row svg.logo-mw{color:#008b4a}
.plan-core .plan-logo-word{color:#101841}
/* Starter (koyu lacivert zemin): %100 opak BEYAZ SİLUET — sahibin reddettiği
   beyaz plaka/panel hiçbir varyantta geri gelmez. Yığındaki BEŞ logonun beşi
   de fill:currentColor tek-renk sembol olduğu için istisnasız beyazlar —
   yeni üçü dahil (renk istisnası EKLENMEDİ: üçü de zaten monokrom).
   Eski "KRİTİK İSTİSNA — The Globe and Mail" notu SİLİNDİ: #n-gm'in knockout
   kutulu yapısı bu karttan çıktı, o istisnaya gerek kalmadı. Kuralın kendisi
   yine de kayıtta kalsın, çünkü knockout sembol bantta hâlâ var: HİÇBİR YERDE
   `filter` kullanılmaz — brightness(0) invert(1) böyle bir sembolü tamamen
   görünmez yapar. */
.plan-starter .plan-logos{border-top-color:rgba(255,255,255,.20)}
.plan-starter .plan-logos-row{color:#fff;opacity:1}
.plan-starter .plan-logo-word{color:#fff}
/* #e6ecff: gradyanın en açık ucu #0f55ff üzerinde 4.73:1 (AA geçer);
   rgba(255,255,255,.65) 3.8:1 ile altında kalıyordu. */
.plan-starter .plan-logos-label,.plan-starter .plan-logos-more{color:#e6ecff}

/* ---- Base vitrini: üç logo + istatistik şeridi (Task 4 kabuğu, Task 7 içeriği) ----
   Task 4'te bu alan METİN ROZETLERİ taşıyordu ("ABC yerel" vb.), çünkü o turda
   Base'in mecraları teyitli sayılmıyordu. Task 7'de ürün sahibi üç mecrayı
   (Star Tribune, openPR, Business Insurance) dağıtım ağının kendi yayımlanmış
   listesinden doğruladı; rozet dili kalktı, yerini Starter/Core ile BİREBİR aynı
   .plan-logos-row idiomu aldı — tek dikey kolon, kap yok, aynı optik genişlik
   tablosu. Böylece üç kartın vitrini tek bir dile indi, Base'e özel ikinci bir
   kutu/pill sözlüğü kalmadı (.plan-channel-chips/.plan-channel-chip SİLİNDİ;
   .plan-channels sınıfı KORUNDU — 768+ katmanındaki dikey esneme kancası odur).
   Logo renkleri: openPR ve Business Insurance markanın gerçek renkleriyle
   sembole gömülü (ikisi de yalnız bu açık kartta görünüyor, koyu Starter'da yok,
   bu yüzden currentColor'a ihtiyaç yok). Star Tribune sembolü (#n-startribune)
   medya şeridiyle PAYLAŞILIYOR ve fill:currentColor kullanıyor — o yüzden rengi
   Core'un tam-renk idiomundaki gibi tek satır `color` ile veriliyor. */
.plan-base .plan-logos-row svg.logo-st{color:#101010}
/* İstatistik şeridi: kutucuk YOK — üç kolon, aralarında saç teli ayraç
   (.hero-rotator li ve .plan-logos ile aynı ayraç idiomu). Rakam .plan-reach b
   ile aynı aileden ama bir tık geride kalır ki kartın "ikinci fiyatı" olan erişim
   çipi birincilliğini korusun.
   padding 2px + letter-spacing .01em: en uzun etiket ("ABD bölgesel") en dar
   3-kolon bantta (1000-1079; kart içeriği 246.7px -> kolon 81px) tek satırda
   kalsın — 4px/.03em ile iki satıra kırılıp şeridi tırtıklaştırıyordu. */
.plan-stats{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));margin-top:16px;padding-top:14px;border-top:1px solid rgba(9,16,51,.09)}
.plan-stat{position:relative;padding:0 2px;text-align:center}
.plan-stat+.plan-stat:before{content:"";position:absolute;inset-inline-start:0;top:1px;bottom:1px;width:1px;background:rgba(9,16,51,.10)}
.plan-stat b{display:block;font-size:20px;font-weight:700;letter-spacing:-.01em;line-height:1;color:var(--pe-navy)}
.plan-stat i{display:block;margin-top:5px;font-style:normal;font-size:12px;font-weight:400;letter-spacing:.01em;line-height:1.2;color:#66708a}

/* 8. tur: "Her planda..." metni kaldırıldı (kullanıcı isteği), aynı bilgi
   zaten her kartın kendi madde listesinde var — tekrar sayılmıştı. Pricing
   bölümü ile footer arasına da nefes payı eklendi. */
#plans{padding-bottom:56px}

/* Footer */
.footer-note{padding:26px var(--pad) 34px;background:#f7f9ff;border-top:1px solid #e6edff;text-align:center}
.footer-logo{display:inline-flex;align-items:center}
.footer-logo img{display:block;height:26px;width:auto}
.footer-desc{margin:12px auto 8px;max-width:440px;font-size:13.5px;line-height:1.55;color:#3a4564;font-weight:400}
.footer-small{margin:4px 0 0;font-size:12px;line-height:1.55;color:#5b647d}
/* Çapa menüsü YALNIZ masaüstü katmanında (768+) açılır. Taban katmanda
   display:none olduğundan ≤430 footer'ı bit-eş kalır (Task 5). */
.footer-nav{display:none}

/* Sticky alt bar */
/* Task 10 (desktop-polish-3), fix turu 2 (kullanıcı geri bildirimi, ekran
   görüntüsü): önceki turun "CTA genişlet + kutulu WhatsApp buton" çözümü
   320-390 aralığında ÇAKIŞIYORDU (CTA metni plan-bilgi bloğunun üstüne
   biniyordu) — kompozisyon üç eksende yeniden kuruldu:
   1) CTA metni artık sabit KISA "Planı Seç" (data-mobile-cta, tr.json
      sticky.mobileCta) — fiyat zaten solda (stickyPlanPrice) gösteriliyor,
      CTA'da TEKRAR yazmak hem gereksizdi hem genişlik krizinin asıl
      kaynağıydı. Bu tek değişiklik CTA kolonunu ~200px'ten ~100-130px'e
      indirdi (bkz. aşağıdaki katmanlar), copy kolonuna nefes payı geri verdi.
   2) Renk altın DEĞİL: beyaz zemin + lacivert metin (.sticky-cta-btn,
      aşağıda) — üç sticky-cta temasında da (mavi/lacivert/altın) SABİT
      yüksek kontrast (ölçüm: task-10-report.md §10), tema-özel override
      GEREKMİYOR (eski .sticky-core .btn-gold override'ı SİLİNDİ — artık
      hedefi yok, .btn-gold plan kartlarında/final CTA'da aynen duruyor).
   3) WhatsApp artık kutulu bir "ikincil buton" değil (Task 14'te bu bir adım
      daha ileri gitti — aşağıya bakın).

   Task 14 (desktop-polish-3) bandı İKİ BÖLGEYE ayırmıştı:
     [ .sticky-plan (esner) ] [ .sticky-whatsapp (açık yeşil panel) ]
   Task 17 (Varyant B), kullanıcı: "Bu alttaki banttan hiç memnun değilim.
   WhatsApp'ta girince işin içine karmakarışık oldu." Teşhis: tek çubuğa ÜÇ
   ayrı yüzey sığdırılıyordu — lacivert gradyan + beyaz hap + açık yeşil blok,
   aralarında iki sert dikey kesik. Çözüm yapısal: WhatsApp bandın İÇİNDEN
   ÇIKTI (.sticky-whatsapp panel bölgesi ve onu ayıran border-right SİLİNDİ)
   ve bandın ÜSTÜNDE yüzen bir düğme oldu (.wa-fab, aşağıda).
   Bant artık TEK ZEMİNLİ ve İKİ PARÇALI: plan adı/fiyat + "Planı Seç".
   1) Bandın kendi dolgusu SIFIR kalıyor; dolgu tek bölgenin (.sticky-plan)
      kendisinde. GÜVENLİ ALAN payı da orada ve Task 10/14'teki gibi max()'lı
      — max(12px,env(safe-area-inset-bottom,0px)). Bant yüksekliğinin TAMAMINI
      artık bu tek bölge belirliyor: 1px üst kenarlık + 12px üst dolgu +
      buton min-height + max(12px,env(...)). Ölçüm: task-17-report.md §5.
   2) Boşalan yatay yer (yeşil panel 84-104px + 1px kesik) İKİYE bölündü:
      CTA kolonu genişledi (128→148 / 116→140 / 104→128px) ve geri kalanı
      kopya kolonuna nefes payı olarak gitti (320px × Starter'da kopya kolonu
      101px → 156px). Ölçüm: task-17-report.md §3. */
/* GEÇİŞLER burada DEĞİL: bant ve yüzen düğme aynı gizleme durumunu paylaştığı
   için ikisinin transition tanımı da .sticky-hidden kuralının yanında, tek
   yerde duruyor (bkz. "GİZLİ DURUM" bloğu). Task 17 düzeltme turu 1. */
/* RTL notu (T3): `left:50%` + `translateX(-50%)` YÖNDEN BAĞIMSIZ bir
   ortalama idiomudur — sol kenarı viewport ortasına koyup kendi genişliğinin
   yarısı kadar geri çeker. `inset-inline-start`e çevrilmesi RTL'de kutuyu
   merkezin sağına atardı (transform mantıksal değildir, işaret dönmez).
   Bu yüzden bilinçli olarak FİZİKSEL bırakıldı. */
.sticky-cta{position:fixed;left:50%;transform:translateX(-50%);bottom:0;z-index:50;width:100%;max-width:430px;padding:0;background:rgba(3,9,40,.95);backdrop-filter:blur(16px);border-top:1px solid rgba(255,255,255,.14);color:#fff;display:flex;align-items:stretch}
/* Bandın TEK bölgesi: plan bilgisi + "Planı Seç". Kolon genişlikleri Task
   10'un merdivenini sürdürür (aşağıdaki max-width katmanları), yalnız her
   basamak Task 17'de +20/+24px genişledi (yeşil panelin boşalttığı yer).
   Task 17: border-right SİLİNDİ — ayıracak ikinci bölge kalmadı; dolgu da
   simetrik 14px oldu (eski 12px sağ dolgu yeşil panelle arasındaki "ayrım"
   içindi). */
.sticky-plan{flex:1 1 auto;min-width:0;display:grid;grid-template-columns:minmax(0,1fr) 148px;gap:10px;align-items:center;padding:12px 14px max(12px,env(safe-area-inset-bottom,0px)) 14px}
.sticky-copy{display:grid;gap:4px;min-width:0}
/* Üçüncü satır (mecra/erişim/yayın özeti) mobil sabit çubukta gizli — metin
   hâlâ tr.json'dan geliyor ve JS tarafından yazılıyor (data-plan-sticky-sub),
   yalnız bu dar/yoğun çubukta GÖSTERİLMİYOR (kullanıcı: "her şey çok sıkışık,
   daha az öğe daha iyi"). Bar zaten 768+'ta tamamen gizli olduğundan bu kural
   yalnız mobili etkiler. */
.sticky-sub{display:none}
/* ---- Task 17: YÜZEN WhatsApp DÜĞMESİ (.wa-fab) ----
   Varyant B: WhatsApp bandın İÇİNDEN çıkıp bandın ÜSTÜNDE, sağda duran
   yuvarlak bir düğme oldu. Yalnız mobilde görünür (768+ katmanında
   display:none — .sticky-cta ile aynı satırda) ve mobilde de bandın GİZLİ
   DURUMUNU paylaşır: hero ya da plan bölümü ekrandayken ikisi birlikte
   çekilir (bkz. aşağıdaki "GİZLİ DURUM" bloğu, .sticky-hidden). Düzeltme
   turu 1'in gerekçesi ölçüm: düğme plan bölümünde kalınca kart fiyatının
   üstüne biniyordu ("$79" → "$7"). Ayrıntı: task-17-report.md §7.3.

   KONUM. Yatayda düğme bandın sağ kenarını izler, VİEWPORT'un sağ kenarını
   değil: bant .page-shell gibi max-width:var(--shell) ile ORTALANMIŞ, oysa
   position:fixed yüzdeleri viewport'a çözülür. `right:14px` tek başına
   yazılsaydı 431-767px arasında düğme kabuktan kopup boşlukta kalırdı.
   max(...) iki rejimi tek ifadede birleştiriyor: ≤430px'te ikinci terim
   ≤14px olduğundan 14px kazanır (viewport kenarı = kabuk kenarı); üstünde
   kabuğun kenarı devralır. 14px mockup değeri.

   Dikeyde düğme bandın ÜST kenarından 12px yukarıda durur. Bandın yüksekliği
   tek bir yerden, .sticky-plan'dan gelir:
     1px (.sticky-cta border-top) + 12px (üst dolgu) + buton min-height
     + max(12px, env(safe-area-inset-bottom,0px)) (alt dolgu)
   Taban katmanda buton 56px → 1+12+56 = 69px, +12px boşluk = 81px sabit terim.
   ≤520px katmanında buton 52px'e iner, sabit terim 77px olur (aşağıda).
   env() terimi AYNEN taşınıyor: çentikli cihazda bant büyüdükçe düğme de
   birlikte yukarı çıkar, bandın altına GİRMEZ. Ölçüm: task-17-report.md §5.

   RENK — mockup'tan BİLİNÇLİ SAPMA. Mockup klasik parlak #25d366 + beyaz glif
   kullanıyordu; bu proje WCAG 1.4.11'i (grafiksel öğe kontrastı ≥3:1)
   tutarlı biçimde uyguluyor ve o çift İKİ EKSENDE de eşiğin altında kalıyor:
     beyaz glif / #25d366            = 1.98:1   ✗
     #25d366 dairesi / beyaz sayfa   = 1.98:1   ✗
   (Task 14'te yeşil rozet tam bu iki sayı yüzünden kaldırılmıştı. DİKKAT,
   düzeltme turu 2 / inceleme: Task 14'ün 1.82:1'i #25d366'nın BEYAZLA değil,
   o turdaki AÇIK YEŞİL PANELLE (#e9f9f0) kontrastıdır. Bu düğmenin arkasında
   böyle bir panel yok; doğru referans beyaz sayfa zemini = 1.98:1. İki sayı
   da eşiğin altında, karar değişmiyor — ama sayıyı 1.82'ye "düzeltmeyin".)
   Ölçülen üç aday (sRGB relative luminance, WCAG 2.x formülü):
     (a) #128c7e daire + beyaz glif  → glif 4.14:1 ✓ · beyaz sayfa 4.14:1 ✓
     (b) #075e54 daire + beyaz glif  → glif 7.67:1 ✓ · beyaz sayfa 7.67:1 ✓
     (c) #25d366 daire + #075e54 glif→ glif 3.87:1 ✓ · beyaz sayfa 1.98:1 ✗
   (c) ELENDİ: glifi kurtarıyor ama dairenin KENDİSİ beyaz zeminde ayırt
   edilemiyor — düğme sayfanın büyük bölümünde beyaz üstünde duruyor.
   (a) SEÇİLDİ: her iki eşiği de rahat geçen ve WhatsApp'ın kendi paletindeki
   EN PARLAK (dolayısıyla en tanınır) değer o — #128c7e "teal green", marka
   paletinden, icat edilmiş bir renk değil. (b) daha yüksek kontrast verirdi
   ama gözle neredeyse siyaha yakın, WhatsApp'ı çağrıştırmıyor.

   Daire sayfanın DEĞİŞKEN zeminleri üzerinde geziyor; ölçülen en zor durumlar:
     #128c7e / beyaz bölüm  #ffffff = 4.14:1 ✓   #128c7e / #eef4ff = 3.75:1 ✓
     #128c7e / lacivert     #060b33 = 4.60:1 ✓   #128c7e / #071048 = 4.32:1 ✓
     #128c7e / marka mavisi #0f55ff = 1.35:1 ✗ → 2px BEYAZ kenarlık devralır:
     #ffffff / #0f55ff = 5.58:1 ✓ (ve #ffffff / #060b33 = 19.03:1)
   Yani iki katman birbirini tamamlıyor: açık zeminlerde dairenin KENDİSİ,
   koyu/doygun zeminlerde beyaz kenarlık sınırı taşıyor. Ölçüm ve tam tarama:
   task-17-report.md §4/§7.

   KENARLIK — mockup'tan İKİNCİ (küçük) sapma (düzeltme turu 2, inceleme M-5):
   mockup `2px solid rgba(255,255,255,.9)` yazıyordu, burada OPAK `#fff`.
   Gerekçe ölçüm: .9 alfa marka mavisi zemine kompozit edilince #e7eeff'e denk
   gelir ve o zeminle kontrastı 4.80:1'e düşer — hâlâ eşiğin üstünde ama
   ORAN ZEMİNE BAĞLI hale gelir; koyu değil de orta tonlu bir zeminde
   3:1'in altına inebilir. Opak beyazda oran zeminden BAĞIMSIZ ve daima
   daha yüksek (#0f55ff üzerinde 5.58:1). Kenarlık burada dekorasyon değil,
   1.4.11'in İKİNCİ katmanı; belirsizlik taşımamalı. Aynı nedenle kenarlığın
   daire ile kontrastı da opakta daha yüksek: 4.14:1 (alfa: 3.67:1). */
.wa-fab{
  position:fixed;z-index:51;
  /* RTL (T3): mantıksal karşılık — düğme bandın SATIR-SONU kenarını izler
     (LTR'de sağ, RTL'de sol); matematik ve LTR çıktısı birebir aynı. */
  inset-inline-end:max(14px,calc(50% - (var(--shell) / 2 - 14px)));
  bottom:calc(81px + max(12px,env(safe-area-inset-bottom,0px)));
  width:58px;height:58px;border-radius:999px;
  display:flex;align-items:center;justify-content:center;
  background:#128c7e;color:#fff;text-decoration:none;
  border:2px solid #fff;
  box-shadow:0 10px 26px rgba(4,8,36,.28),0 2px 6px rgba(4,8,36,.2)
  /* transition: bandınkiyle birlikte, .sticky-hidden kuralının yanında */
}
/* Glif 32px (mockup değeri): #b-whatsapp'ın dairesi viewBox'ın %83'ünü
   kapladığından görünür işaret ≈26.5px, 58px'lik düğmenin içinde her yandan
   ~11px nefes payı bırakıyor. Dokunma hedefi düğmenin GÖRÜNÜR tamamı:
   58x58 ≥ 44x44. SEMBOL değişmedi — yalnız bu düğmedeki ÖLÇEK; üst çubuk
   (.topbar-whatsapp) ve SSS (.faq-whatsapp-link) 18x18'de KALIYOR
   (ölçümle doğrulandı: task-17-report.md §6). */
.wa-fab .ic-whatsapp{width:32px;height:32px}
.wa-fab:hover{background:#0f7a6e}
/* Odak halkası — sayfanın idiomu: 3px solid marka rengi + POZİTİF offset.
   Düğme banttan bağımsız, çevresinde yer VAR, bu yüzden halka dışarıda
   (.sticky-whatsapp'ın -3px içeri ofseti bandın kenarına dayandığı içindi).
   Marka mavisi (#0f55ff) halka: beyaz kenarlığın dışında, sayfa zemininde
   duruyor — #0f55ff / #ffffff = 5.58:1, #0f55ff / #060b33 = 3.41:1. */
.wa-fab:focus-visible{outline:3px solid var(--pe-blue);outline-offset:3px}
/* "ÖNERİLEN/SEÇİLEN PLAN" rozeti (Task 14): artık TÜM mobil genişliklerde
   gizli — Task 10'da yalnız ≤340'ta gizleniyordu. Gerekçe: bant iki bölgeye
   ayrılınca sol bölgenin kolonu ~40px daraldı; brief'in sol bölge tanımı da
   "plan adı + fiyat + Planı Seç" (rozet YOK) ve onaylanan mockup'ta rozet
   bulunmuyor. Metin kaybolmadı: data-default/data-selected öznitelikleri ve
   JS ataması (app.js setPlan) AYNEN duruyor, yalnız bu bantta gösterilmiyor;
   seçim geri bildirimi plan kartının .is-selected durumunda ve bandın plan
   adı/fiyatında zaten görünür. Bar YÜKSEKLİĞİ değişmez: rozet+tek satır
   başlık (2 satır) yerine artık ad+fiyat (2 satır) var. */
.sticky-pill{display:none}
/* Plan adı ve fiyat ARTIK AYNI SATIRI PAYLAŞMAZ, alt alta iki satıra yayılır
   (Task 10'un yalnız ≤340'ta uyguladığı düzen artık taban) — her satır
   kolonun TAM genişliğini kullanır, "Starter Planı $129" gibi en uzun
   kombinasyon bile daralan kolona kırpılmadan sığar. Ölçüm: task-14-report §4. */
.sticky-title{display:flex;flex-direction:column;align-items:flex-start;gap:3px;min-width:0;font-weight:950;letter-spacing:-.025em;line-height:1.02;overflow:hidden}
.sticky-title #stickyPlanName,.sticky-title #stickyPlanPrice{display:block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sticky-title #stickyPlanName{font-size:14px;font-weight:850;line-height:1.15}
.sticky-title #stickyPlanPrice{color:#ffcf24;font-size:21px;letter-spacing:-.035em;line-height:1.08}
.sticky-cta .btn{min-height:56px;border-radius:16px;font-size:15px;line-height:1.1;padding:10px 12px;white-space:normal;text-align:center}
/* Mobil sabit çubuğun CTA rengi — YALNIZ bu buton. Plan kartlarındaki
   .btn-gold (Starter) / .btn-navy (Core) / .btn-secondary (Base) merdivenine
   ve hero/final CTA'larına DOKUNULMADI (ayrı sınıf, ayrı seçici). Beyaz
   zemin + lacivert metin: üç sticky-cta temasında da (mavi/lacivert/altın)
   sabit ~19:1 kontrast (WCAG AAA'nın çok üzerinde) — tema-bağımlı override
   gerektirmeyen tek çözüm buydu. */
.sticky-cta-btn{background:#fff;color:var(--pe-navy)}
.sticky-base{background:linear-gradient(90deg,rgba(6,16,70,.97),rgba(15,85,255,.97));border-top-color:rgba(144,183,255,.36)}
.sticky-starter{background:linear-gradient(90deg,rgba(4,8,36,.98),rgba(9,33,128,.98) 55%,rgba(15,85,255,.98));border-top-color:rgba(255,207,36,.38);box-shadow:0 -16px 44px rgba(15,85,255,.18)}
.sticky-core{background:linear-gradient(90deg,rgba(13,9,2,.98),rgba(35,28,5,.98) 50%,rgba(255,191,0,.94));border-top-color:rgba(255,207,36,.52)}
/* (Task 14: .sticky-core .sticky-pill override'ı SİLİNDİ — rozet artık tüm
   mobil genişliklerde display:none, kuralın hedefi kalmadı.) */
.sticky-core .sticky-title #stickyPlanPrice{color:#fff}

@media (max-width:520px){
  /* CTA 116 → 140px (Task 17): sabit "Planı Seç" metni bu katmanda ~85-90px
     gerektiriyor (bisection ölçümü, task-10-report.md §10); üstündeki pay
     artık yeşil panelin boşalttığı yerden geliyor ve butonu METİN GENİŞLİĞİ
     DEĞİL kompozisyon belirliyor — bant iki parçalı olunca CTA'nın ağırlığı
     kopya kolonuyla dengeleniyor.
     gap 8px (Task 10 fix turu 3): 7px, komşu öğeler arasında ≥8px nefes
     payı gereğini karşılamıyordu — kanıt task-10-report.md §11. */
  .sticky-plan{grid-template-columns:minmax(0,1fr) 140px;gap:8px}
  .sticky-title #stickyPlanPrice{font-size:20px}
  .sticky-cta .btn{min-height:52px;font-size:13.5px;border-radius:14px}
  /* Buton 56 → 52px inince bant 4px kısalır; yüzen düğme onunla birlikte
     iner ki bandın üst kenarıyla arasındaki boşluk 12px SABİT kalsın
     (1 + 12 + 52 + 12 = 77). Ölçüm: task-17-report.md §5. */
  .wa-fab{bottom:calc(77px + max(12px,env(safe-area-inset-bottom,0px)))}
}
@media (max-width:420px){
  .hero-title{font-size:37px}
  .hero-miniplan{padding:10px 4px;gap:2px}
  .hero-plan-price{font-size:15px}
  .hero-plan-name{font-size:11px}
  .offer-title{font-size:35px}
  .front-lead{font-size:16.5px}
  .final-punch .h2{font-size:32px}
}
@media (max-width:380px){
  .h2{font-size:30px}
  .plan-name{font-size:26px}
  .plan-price{font-size:30px}
  /* CTA 104 → 128px (Task 17): sabit "Planı Seç" metni bu katmanda ~78-82px
     gerektiriyor (bisection ölçümü); geri kalanı yeşil panelin boşalttığı
     yerden gelen kompozisyon payı.
     gap 8px (Task 10 fix turu 3, aynı gerekçe: ≥8px nefes payı). */
  .sticky-plan{grid-template-columns:minmax(0,1fr) 128px;gap:8px}
  .sticky-title #stickyPlanName{font-size:13px}
  .sticky-title #stickyPlanPrice{font-size:19px}
  .sticky-cta .btn{font-size:12.5px;padding:8px}
  .btn{font-size:16px}
}
/* Task 17: eski `@media (max-width:340px)` katmanı SİLİNDİ. İçindeki iki
   kuralın da hedefi kalmadı — biri yeşil panelin 92→84px daralması
   (.sticky-whatsapp artık yok), diğeri o panele yer açmak için sol bölgenin
   dolgusunu 14/12px'e kısan istisnaydı. Panel gidince en dar ekranda bile
   sıkışma kalmıyor: 320px'te kopya kolonu 101px yerine 156px (ölçüm:
   task-17-report.md §3), yani dar-ekran istisnası gereksiz. */
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important}}

/* ============================================================
   Blok bileşenleri (görsellerden HTML'e dönüştürülen bölümler)
   ============================================================ */
.h2-stack span{display:block}
.h2-stack strong{display:block}
.lead-tight{margin-bottom:10px}
.center-head{text-align:center}
.center-head .lead{margin-inline:auto;max-width:560px}

/* Ortak: punch satırı ve not */
.punch{margin:22px 0 16px;text-align:center;font-size:24px;line-height:1.15;letter-spacing:-.035em;font-weight:950;color:var(--pe-navy)}
.punch span{display:block}
.punch strong{display:block;color:var(--pe-blue)}
.block-note{display:flex;align-items:center;justify-content:center;gap:7px;margin:13px 0 0;font-size:13px;font-weight:800;color:#43506f;text-align:center}
.block-note .ic{width:16px;height:16px;color:var(--pe-blue)}

/* Sahne blokları: metin + orijinal poster geometrisinde görsel sahne */
.scene-grid{display:grid;gap:8px}

/* Sağ kenara yaslanan sahne: sağda erime yok, görsel sayfa kenarına oturur */
.blend-flush{
  -webkit-mask-image:linear-gradient(to right,transparent 0,#000 12%,#000 100%),linear-gradient(to bottom,transparent 0,#000 9%,#000 93%,transparent 100%);
  mask-image:linear-gradient(to right,transparent 0,#000 12%,#000 100%),linear-gradient(to bottom,transparent 0,#000 9%,#000 93%,transparent 100%)}
.scene-bleed{width:calc(100% + var(--pad));margin-inline-start:auto;margin-inline-end:calc(-1*var(--pad))}

/* ===== Garanti sahnesi (10. tur) — katmanlı kompozisyon =====
   Eğimli telefon + üstüne binen üç haber kartı + PDF rapor kartı; tamamı
   HTML/CSS (gömülü metinli JPG yok, her dilde doğru metin).
   ÖLÇEKLEME: .report-scene bir container'dır; içindeki her parça (.rs-phone,
   .rs-card, .rs-pdf) kendi içinde de container'dır. Böylece parçanın DIŞ
   ölçüleri (konum/yarıçap/gölge) sahneye, İÇ ölçüleri (yazı/ikon/dolgu) kendi
   genişliğine göre orantılanır — sahne büyüyünce her şey birlikte ölçeklenir.
   DİKKAT: .report-scene'den container-type düşerse tüm cqw değerleri viewport'a
   kaçar (yarıçaplar/gölgeler devleşir). Bu kural silinmemeli. */
.report-scene{position:relative;width:100%;aspect-ratio:716/700;margin:20px 0 4px;
  container:rs-scene / inline-size}

/* --- eğimli telefon ---
   RTL NOTU: 3B eğimler ve gölge kaymaları mantıksal özelliklerle ifade
   edilemez; --dir çarpanı (LTR 1 / RTL -1) işareti çevirerek kompozisyonu
   Arapça'da da aynalar. [dir=rtl] geçersiz kılma bloğu AÇILMAZ. */
.rs-phone{position:absolute;inset-inline-end:.5%;top:1%;width:52%;
  container-type:inline-size;
  background:linear-gradient(148deg,#39415f,#161d38 42%,#0a0e22);
  border-radius:5.6cqw;padding:1cqw;
  outline:1px solid rgba(255,255,255,.10);outline-offset:-1px;
  box-shadow:calc(-1.3cqw * var(--dir)) 4cqw 6.6cqw rgba(9,16,51,.34),
             0 .8cqw 1.6cqw rgba(9,16,51,.2),
             inset 0 .08cqw .08cqw rgba(255,255,255,.22);
  transform:perspective(1500px) rotateY(calc(-14deg * var(--dir))) rotateX(3deg)
            rotateZ(calc(-1.4deg * var(--dir)))}
.rs-side{position:absolute;inset-inline-end:-.32cqw;top:21%;width:.32cqw;height:8%;
  border-radius:0 .22cqw .22cqw 0;background:linear-gradient(180deg,#4a5474,#2a3150)}
.rs-side2{top:33%;height:12%}
/* min-height gerçek telefon ekran oranını (~1:2) verir; liste üstü doldurur,
   altı soluk "hayalet" satırlarla devam eder ve eriyerek biter. */
.rs-screen{position:relative;background:linear-gradient(180deg,#fdfeff,#f1f5ff);
  border-radius:8.8cqw;padding:3.4cqw 3.6cqw 4.4cqw;overflow:hidden;min-height:174cqw;
  display:flex;flex-direction:column}
.rs-screen:after{content:"";position:absolute;inset-inline:0;bottom:0;height:30%;
  background:linear-gradient(180deg,rgba(241,245,255,0),#eef3ff 78%);pointer-events:none}
.rs-statusbar{display:flex;align-items:center;justify-content:space-between;
  padding:.6cqw 1.4cqw 2.6cqw;font-size:3.3cqw;font-weight:800;color:var(--pe-navy)}
.rs-sig{display:flex;gap:.5cqw;align-items:flex-end;opacity:.68}
.rs-sig i{display:block;width:.85cqw;border-radius:.3cqw;background:var(--pe-navy)}
.rs-sig i:nth-child(1){height:1.2cqw}.rs-sig i:nth-child(2){height:1.9cqw}
.rs-sig i:nth-child(3){height:2.6cqw}.rs-sig i:nth-child(4){height:3.3cqw}
.rs-title{font-size:clamp(11px,6.2cqw,16px);font-weight:900;letter-spacing:-.025em;color:var(--pe-navy);
  padding:0 1.2cqw 3.4cqw;line-height:1.05}
.rs-row{background:#fff;border-radius:4.6cqw;padding:3.4cqw;margin-bottom:2.6cqw;
  box-shadow:0 2cqw 4.6cqw rgba(9,16,51,.10);display:flex;align-items:center;gap:3cqw}
.rs-row-hero{padding:4.4cqw 3.6cqw}
.rs-check{flex:0 0 auto;width:11cqw;height:11cqw;border-radius:50%;background:var(--pe-blue);
  color:#fff;display:flex;align-items:center;justify-content:center;
  box-shadow:0 1.8cqw 4cqw rgba(15,85,255,.36)}
.rs-check .ic{width:5.8cqw;height:5.8cqw;stroke-width:3}
.rs-body{min-width:0;flex:1}
.rs-body b{display:block;font-size:clamp(10px,4.8cqw,13px);font-weight:850;letter-spacing:-.012em;
  color:var(--pe-navy);line-height:1.15}
.rs-body b.rs-big{font-size:clamp(14px,6.4cqw,17px);font-weight:900;letter-spacing:-.025em;
  color:var(--pe-blue);line-height:1.05}
.rs-body span{display:block;font-size:clamp(9px,4.4cqw,12px);line-height:1.32;color:var(--pe-muted);
  font-weight:600;margin-top:.6cqw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Kahraman satırın açıklaması tek satıra sığmıyor (TR'de 6px, DE'de çok daha
   fazla taşıyordu) — burada üç nokta yerine iki satıra izin veriyoruz. */
.rs-row-hero .rs-body span{white-space:normal;display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical}
.rs-ic{flex:0 0 auto;color:var(--pe-blue);display:flex}
.rs-ic .ic{width:6.4cqw;height:6.4cqw;stroke-width:1.9}
.rs-ok{flex:0 0 auto;width:7cqw;height:7cqw;border-radius:50%;background:var(--pe-green);
  color:#fff;display:flex;align-items:center;justify-content:center;margin-inline-start:auto}
.rs-ok .ic{width:3.8cqw;height:3.8cqw;stroke-width:3.4}
.rs-ghosts{margin-top:2.6cqw;display:grid;gap:2.6cqw;opacity:.55}
.rs-ghost{background:#fff;border-radius:4.6cqw;padding:3.2cqw;
  box-shadow:0 1.2cqw 2.6cqw rgba(9,16,51,.05);display:grid;gap:1.8cqw}
.rs-ghost i{display:block;height:2.4cqw;border-radius:1.2cqw;
  background:linear-gradient(90deg,#dbe4fa,#eef3ff)}
.rs-ghost i:first-child{width:62%}
.rs-ghost i:last-child{width:38%;height:1.9cqw}

/* --- yüzen haber kartları (tek yönlü diyagonal, bitişik küme) --- */
.rs-card{position:absolute;width:60%;container-type:inline-size;background:#fff;
  border-radius:2.3cqw;padding:2.6cqw;display:flex;align-items:center;gap:2.2cqw;
  box-shadow:calc(-.33cqw * var(--dir)) 1.3cqw 3cqw rgba(9,16,51,.17),
             0 .3cqw .6cqw rgba(9,16,51,.07);
  transform:perspective(1500px) rotateY(calc(7deg * var(--dir)))
            rotateZ(calc(-1.5deg * var(--dir)))}
/* Dar sahnede küme AŞAĞI kayar: telefonun "Yayınlandı" kahraman satırı
   kartların altında kalıyordu. 34/53/72 ile en alttaki kartın alt kenarı
   telefonun alt kenarıyla hizalanır, üst blok açıkta kalır. */
.rs-c1{inset-inline-start:1.6%;top:34%;z-index:3}
.rs-c2{inset-inline-start:.8%;top:53%;z-index:2}
.rs-c3{inset-inline-start:0;top:72%;z-index:1}
/* Haber küçük görselleri GERÇEK FOTOĞRAFTIR (200x138 WebP, ~3-5 KB).
   Kaynak ve lisans: docs/gorsel-lisanslari.md. Dosyalarda metin YOK — dile
   bağlı değiller, yedi dilde de aynı dosya kullanılır. */
.rs-thumb{flex:0 0 auto;width:21cqw;height:14.5cqw;border-radius:2.8cqw;position:relative;
  overflow:hidden;display:flex;align-items:flex-end;padding:1.4cqw;color:#fff;
  background-color:#26304d;background-size:cover;background-position:center}
/* Alttan yukarı koyulaşan perde: künye etiketi fotoğrafın üstünde okunur kalsın */
.rs-thumb:before{content:"";position:absolute;inset:0;
  background:linear-gradient(180deg,rgba(6,10,28,0) 52%,rgba(6,10,28,.62) 100%)}
.rs-thumb i{display:none;position:relative;min-width:0;max-width:100%;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;
  font-style:normal;font-size:clamp(6px,2.2cqw,9px);font-weight:950;color:#fff;
  letter-spacing:.02em;text-transform:uppercase;line-height:1.05;
  text-shadow:0 .3cqw .7cqw rgba(0,0,0,.4)}
.rs-t1{background-image:url(../images/news-realestate.webp)}
.rs-t2{background-image:url(../images/news-interview.webp)}
.rs-t3{background-image:url(../images/news-energy.webp)}
.rs-copy{min-width:0;flex:1}
.rs-copy b{display:block;font-size:clamp(10px,4cqw,14px);font-weight:850;line-height:1.24;
  letter-spacing:-.018em;color:var(--pe-navy)}
.rs-copy span{display:block;margin-top:1.5cqw;font-size:clamp(9px,3.5cqw,12px);font-weight:650;
  color:var(--pe-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rs-cardok{flex:0 0 auto;width:7.2cqw;height:7.2cqw;border-radius:50%;background:var(--pe-green);
  color:#fff;display:flex;align-items:center;justify-content:center;
  box-shadow:0 1.6cqw 3.2cqw rgba(20,184,106,.34)}
.rs-cardok .ic{width:4cqw;height:4cqw;stroke-width:3.4}

/* --- PDF rapor kartı: taban katmanda GİZLİ (dar sahnede kartlarla yan yana
       sığmıyor, metni okunmaz küçülürdü); 768+'ta açılır. --- */
.rs-pdf{display:none;position:absolute;inset-inline-end:1%;bottom:1.5%;width:37%;
  container-type:inline-size;background:#fff;border-radius:2.6cqw;
  padding:2.1cqw 2cqw 2cqw;z-index:4;
  box-shadow:calc(-.66cqw * var(--dir)) 3.3cqw 5.6cqw rgba(9,16,51,.21),
             0 .3cqw .7cqw rgba(9,16,51,.1);
  transform:perspective(1500px) rotateY(calc(-7deg * var(--dir)))
            rotateZ(calc(1deg * var(--dir)))}
.rs-pdf-head{display:flex;align-items:flex-start;justify-content:space-between;gap:3cqw;
  margin-bottom:4cqw}
.rs-pdf-head b{min-width:0;overflow-wrap:anywhere;
  font-size:clamp(10px,7.4cqw,15px);font-weight:950;letter-spacing:.02em;text-transform:uppercase;
  color:var(--pe-navy);line-height:1.08}
.rs-tag{flex:0 0 auto;font-size:clamp(8px,5.8cqw,12px);font-weight:950;letter-spacing:.05em;color:#fff;
  background:var(--pe-blue);border-radius:2.6cqw;padding:1.4cqw 3.2cqw;line-height:1}
.rs-chart{display:block;width:100%;height:auto;margin-bottom:4cqw}
.rs-list{display:grid;gap:3cqw}
.rs-item{display:flex;align-items:center;gap:2.6cqw;font-size:clamp(9px,6.1cqw,13px);font-weight:750;
  color:var(--pe-navy);line-height:1.15}
.rs-item>span{flex:0 0 auto;width:8.4cqw;height:8.4cqw;border-radius:50%;background:var(--pe-green);
  color:#fff;display:flex;align-items:center;justify-content:center}
.rs-item .ic{width:4.6cqw;height:4.6cqw;stroke-width:3.4}

/* GENİŞ SAHNE (>=460px): kompozisyon VIEWPORT'a değil SAHNENİN KENDİ
   genişliğine bağlıdır — 768px tablette de sahne yalnızca ~317px olduğu için
   viewport tabanlı bir eşik, PDF kartını 6px yazıyla açıyordu. Ölçüt artık
   sahnenin kendisi: yalnız gerçekten yer olduğunda dördüncü katman açılır,
   parçalar orantısal olarak küçülür (sahne büyüdüğü için mutlak boyut artar).
   63+36=99 → PDF kartlarla yan yana sığar, 3. kartın yeşil rozeti solda kalır. */
@container rs-scene (min-width:460px){
  .report-scene:before{inset-inline-start:auto;inset-inline-end:-14%}
  .rs-phone{width:45%;top:1.5%}
  .rs-screen{min-height:196cqw}
  .rs-card{width:63%}
  /* Küme, telefonun kahraman satırının (%24,6'da biter) ALTINDAN başlar;
     en alttaki kart PDF kartının soluna, onunla aynı bantta oturur.
     Adım %17,5: kart yüksekliği %15,6-16,3 olduğu için aralarda ~%1-2 boşluk
     kalır (sıkı ama bitişik değil). Dar sahnede adım %19'da bırakıldı —
     orada kartlar zaten %1,1 aralıkla duruyor, daha fazla kısmak metni
     örterdi (FR'de 3 satırlık başlıkla hâlihazırda hafif bindirme var). */
  .rs-c1{inset-inline-start:2.5%;top:26%}
  .rs-c2{inset-inline-start:1.5%;top:43.5%}
  .rs-c3{inset-inline-start:.5%;top:61%}
  .rs-thumb i{display:block}
  .rs-pdf{display:block;width:36%}
}


/* Google SERP sahnesi: açık gümüş telefon + merdiven sonuç kartları */
.phone-light{background:linear-gradient(180deg,#f6f8fe,#d8e0f2);border:1px solid #cdd8ee;box-shadow:0 26px 56px rgba(9,16,51,.18)}
.phone-light .phone-notch{background:#16204b}
.serp-screen{background:linear-gradient(180deg,#fff,#f2f6ff);overflow:visible;grid-template-columns:minmax(0,1fr)}
.g-search{display:flex;align-items:center;gap:9px;background:#fff;border:1px solid #dfe7fb;border-radius:999px;padding:11px 15px;font-size:14px;font-weight:800;color:var(--pe-navy);box-shadow:0 8px 20px rgba(9,16,51,.08)}
.g-search .ic{width:16px;height:16px;color:var(--pe-blue)}
.g-tabs{display:flex;gap:clamp(9px,3.5vw,16px);min-width:0;padding:2px 4px 0;font-size:11.5px;font-weight:800;color:#66708a;white-space:nowrap}
.g-tabs span{padding-bottom:5px}
@media (max-width:355px){.g-tabs span:nth-child(4){display:none}}
.g-tabs span:nth-child(2){color:var(--pe-blue);font-weight:950;border-bottom:2px solid var(--pe-blue)}
.g-label{padding:4px 4px 0;font-size:10.5px;font-weight:950;text-transform:uppercase;letter-spacing:.06em;color:#66708a}
.g-result{display:flex;align-items:center;gap:10px;background:#fff;border:1px solid #e2eaff;border-radius:14px;padding:11px 12px;box-shadow:0 10px 26px rgba(9,16,51,.08)}
.g-label+.g-result{width:calc(100% + 14px);margin-inline-start:-14px}
.g-result+.g-result{width:calc(100% + 28px);margin-inline-start:-28px}
.g-result+.g-result+.g-result{width:calc(100% + 42px);margin-inline-start:-42px}
.g-result-copy{display:grid;gap:2px;min-width:0}
.g-result-copy b{font-size:12.5px;line-height:1.3;color:var(--pe-navy);letter-spacing:-.01em}
.g-result-copy span{font-size:11px;color:#66708a;font-weight:700}
/* Arama sonucundaki görsel alanı, yayın kuruluşunun LOGO PLAKASI'dır.
   Logolar ağ şeridiyle aynı sprite'tan gelir; yeni dosya yoktur. */
.g-thumb{flex:0 0 76px;height:32px;margin-inline-start:auto;border-radius:8px;
  background:#fff;border:1px solid #e2eaff;color:#1b2a63;padding:0 6px;
  display:inline-flex;align-items:center;justify-content:center}
.g-thumb svg{width:auto;max-width:100%;display:block;fill:currentColor;stroke:none}
.g-thumb--ap svg{height:12px}
.g-thumb--usatoday svg{height:9px}
.g-thumb--word{font-size:11px;font-weight:850;letter-spacing:-.02em;white-space:nowrap}
.g-thumb--word small{font-weight:700;font-size:.72em;opacity:.7}
.serp-stage .phone-badge{inset-inline-start:auto;inset-inline-end:0;background:rgba(255,255,255,.94);border-color:#dbe6ff;box-shadow:0 14px 34px rgba(9,16,51,.14);animation:none}
.serp-stage .phone-badge .ic{color:var(--pe-blue)}
.serp-stage .phone-badge b{color:var(--pe-navy)}
.serp-stage .phone+.phone-badge{top:-10px}
.serp-stage .phone-badge+.phone-badge{top:auto;bottom:-8px}
.serp-stage .phone{width:min(300px,84%);margin-bottom:8px}

/* Medya ağı: iki sıralı zıt yönlü logo akışı */
/* 8. tur: kullanıcı isteğiyle modüle daha fazla nefes payı — üst/alt boşluk
   .section-html'in taban değerinden (28px) 44px'e çıktı, yalnız bu bölüm. */
.block-network{background:linear-gradient(180deg,#fff,#f5f8ff);border-top:1px solid #eef2fe;border-bottom:1px solid #eef2fe;padding-block:44px}
.network-rows{display:grid;gap:18px;margin:18px calc(-1*var(--pad)) 0}
.network-marquee{overflow:hidden;-webkit-mask-image:linear-gradient(to right,transparent,#000 10%,#000 90%,transparent);mask-image:linear-gradient(to right,transparent,#000 10%,#000 90%,transparent)}
/* NOT: aşağısı bandın kronolojik değişiklik günlüğüdür; güncel mecra listesi
   için EN SON girdiye bak (bu günlükte adı geçen bazı mecralar sonradan
   çıkarıldı — ör. InvestorPlace, CNN Business, Postmedia ve Task 15'te
   Financial Times, Star Tribune, Edmonton Examiner, Nanton News, Peace River
   Record-Gazette, WRAL).
   1. dalga Task 11: satır başına 4 yeni mecra eklenince ("Star Tribune, InvestorPlace,
   CNN Business, Postmedia" ve "Buffalo News, FOX 54, The Chronicle Journal,
   WRAL") her track'in bir "set" genişliği büyüdü. translateX(-50%) yüzdesel
   olduğu için kayan davranış otomatik adapte olur; yalnız süre, px/sn hızını
   sabit tutmak için içerik artışıyla orantılı uzatıldı. Tahmini set genişliği
   (öğe genişlikleri viewBox oranından + gerçek DOM'da ölçülen .network-word
   metin genişliklerinden, gap'ler dahil, temel/mobil ölçekte):
   Track 1 (ileri): eskiden ~789px (5 öğe) → yeniden ~1503px (9 öğe) ⇒ ×1.90
     30s × 1.90 ≈ 57.0s
   Track 2 (ters): eskiden ~973px (6 öğe) → yeniden ~1617px (10 öğe) ⇒ ×1.66
     38s × 1.66 ≈ 63.2s
   768+ karşılıkları, Task 7'nin kurduğu ilişkiyle aynı oranda (×1.25, aşağıdaki
   "Medya logo marquee" yorumuna bkz.) hesaplanır: 57.0×1.25≈71.3s,
   63.2×1.25≈79.0s.
   Network bandı revizyonu: InvestorPlace + CNN Business çıkarıldı, 11 yeni
   mecra eklendi (Toronto Sun, The Province, Edmonton Examiner, Nanton News,
   Peace River Record-Gazette, News Channel Nebraska, openPR → track 1;
   Calgary Herald, KTTC, Windsor Star, Santa Maria Times → track 2). Süreler
   tahminle değil, gerçek DOM'da (390px, http servis) ölçülen .network-set
   genişlikleriyle yeniden hesaplandı:
   Track 1: 9 öğe/1502.8px → 14 öğe/2431.9px ⇒ ×1.618 · 57.0s×1.618≈92.2s
   Track 2: 10 öğe/1616.2px → 14 öğe/2187.5px ⇒ ×1.353 · 63.2s×1.353≈85.5s
   768+ karşılıkları aynı ×1.25 ilişkisiyle: 92.2×1.25≈115.3s, 85.5×1.25≈106.9s.
   2. dalga Task 11: 5 yeni mecra eklendi (Financial Post, National Post, Montreal Gazette →
   track 1; ADVFN, The Daily Press → track 2), 14/14'ten 17/16'ya çıktı. Süreler yine
   gerçek DOM'da (390px, http servis) ölçülen .network-set genişlikleriyle hesaplandı:
   Track 1: 14 öğe/2431.9px → 17 öğe/2913.5px ⇒ ×1.198 · 92.2s×1.198≈110.5s
   Track 2: 14 öğe/2187.5px → 16 öğe/2461.3px ⇒ ×1.125 · 85.5s×1.125≈96.2s
   768+ karşılıkları aynı ×1.25 ilişkisiyle: 110.5×1.25≈138.1s, 96.2×1.25≈120.3s.
   Task 12: Track 1'de Postmedia (network-word) ÇIKTI, Financial Times (yeni symbol,
   Yahoo News'ten sonra) GİRDİ ve AP 16→22px büyüdü — öğe sayısı 17'de sabit kaldı
   ama set genişliği değişti. Yine tahminle değil, gerçek DOM'da (390px) ölçüldü;
   eski ölçüm bu turda birebir yeniden üretildi (2913.5 → 2913.6px, aynı tarayıcı):
   Track 1: 17 öğe/2913.6px → 17 öğe/3039.6px ⇒ ×1.0432 · 110.5s×1.0432≈115.3s
     (net değişim: −Postmedia ≈−97px, +Financial Times ≈+184px, +AP ≈+29px)
   Track 2: DEĞİŞMEDİ (2461.3px, 16 öğe) ⇒ 96.2s aynen korunur.
   Doğrulama (px/sn sabit mi): eski 2913.6/110.5=26.37 px/sn, yeni 3039.6/115.3=26.36 px/sn.
   768+ karşılığı aynı ×1.25 ilişkisiyle: 115.3×1.25≈144.1s (track 2: 120.3s aynen).
   Task 15 — SADELEŞTİRME (bant küçüldü, ilk kez): altı mecra BANTTAN çıkarıldı —
   Financial Times, Star Tribune, Edmonton Examiner, Nanton News, Peace River
   Record-Gazette (track 1) ve WRAL (track 2).
   DEĞİŞMEZ KIRILDI — bilinçli: bugüne kadar "bant listesi = canlı rapor listesi"
   (33 mecra, küme-EŞ) tutuluyordu. Bu görevden sonra bant, raporun bir ALT
   KÜMESİ: bant 27, canlı rapor 33. Bu GÖRSEL bir sadeleştirmedir, "bu mecralar
   ağımızda yok" beyanı DEĞİLDİR; bu yüzden canlı rapor tablosuna ve Base plan
   kartındaki Star Tribune logosuna (#n-startribune, .logo-st) DOKUNULMADI.
   Yeni ilişkinin kilidi test/build.test.js'te (bant ⊆ rapor).
   ŞERİT DENGESİ: ham çıkarma 12/15 öğe ve 1960.1px/2365.4px (390) bırakıyordu —
   405px'lik fark, iki şeridi gözle farklı uzunlukta gösterirdi. StreetInsider.com
   track 2'den track 1'e (Investing.com'un yanına, finansal veri siteleri kümesine)
   TAŞINDI; taşıma öğeyi silmediği için mecra listesi değişmez. Sonuç 13/14 öğe.
   Süreler yine tahminle değil, gerçek DOM'da (390px, http servis) ölçülen
   .network-set genişlikleriyle, px/sn hızı şerit başına sabit tutularak:
   Track 1: 17 öğe/3039.6px → 13 öğe/2155.4px ⇒ ×0.7091 · 115.3s×0.7091≈81.8s
   Track 2: 16 öğe/2461.3px → 14 öğe/2170.0px ⇒ ×0.8817 · 96.2s×0.8817≈84.8s
   Doğrulama (px/sn sabit mi): t1 eski 3039.6/115.3=26.36, yeni 2155.4/81.8=26.35;
   t2 eski 2461.3/96.2=25.59, yeni 2170.0/84.8=25.59.
   768+ karşılıkları aynı ×1.25 ilişkisiyle: 81.8×1.25≈102.3s, 84.8×1.25≈106.0s
   (ölçülen 1440 genişlikleri 2696.1px/2696.8px, yani 390'ın ×1.251/×1.243'ü —
   ×1.25 kabulü ölçümle örtüşüyor: 2696.1/102.3=26.35 ve 2696.8/106.0=25.44 px/sn).
   İki şerit artık neredeyse eşit genişlikte (390'da 14.7px, 1440'ta 0.6px fark)
   ama süreleri EŞİT DEĞİL (81.8s / 84.8s): şerit başına px/sn hızı tarihsel
   olarak farklı ve öyle korundu — eşit süre, zıt yönlü iki şeridi mekanik bir
   ayna gibi gösterirdi.
   yeni-mecralar Task 1 — BANT BÜYÜDÜ (27 -> 30): yeni medya anlaşmalarıyla üç
   yerel TV istasyonu eklendi — Fox Illinois ve CBS19 News track 1'e (News
   Channel Nebraska'nın yanına, yerel yayın kümesine), ABC12 News track 2'ye
   (KTTC'nin yanına, oradaki FOX 54 + KTTC yerel TV kümesine). Öğe dağılımı
   13/14 -> 15/15.
   ŞERİT DENGESİ: üçünü de tek şeride koymak 390'da ~2570/2170px bırakırdı.
   İki bölünme ölçülerek denendi — (Fox+ABC12 | CBS19) 78.5px fark,
   (Fox+CBS19 | ABC12) 36.2px fark. İkincisi seçildi; ayrıca öğe sayısını da
   eşitliyor (15/15). Mevcut bir öğeyi Task 15'teki gibi karşı şeride taşımak
   farkı DAHA DA azaltmıyor (en dar taşınabilir öğe bile 46px gap ile birlikte
   farkı ters yöne büyütürdü), o yüzden taşıma yapılmadı.
   Süreler yine tahminle değil, gerçek DOM'da (390px, http servis) ölçülen
   .network-set genişlikleriyle, px/sn hızı ŞERİT BAŞINA sabit tutularak:
   Track 1: 13 öğe/2155.4px -> 15 öğe/2348.4px ⇒ ×1.0895 · 81.8s×1.0895≈89.1s
   Track 2: 14 öğe/2170.0px -> 15 öğe/2312.2px ⇒ ×1.0656 · 84.8s×1.0656≈90.4s
   Doğrulama (px/sn sabit mi): t1 eski 2155.4/81.8=26.35, yeni 2348.4/89.1=26.36;
   t2 eski 2170.0/84.8=25.59, yeni 2312.2/90.4=25.58.
   768+ karşılıkları aynı ×1.25 ilişkisiyle: 89.1×1.25≈111.4s, 90.4×1.25≈113.0s
   (ölçülen 1440 genişlikleri 2939.4px/2877.6px, yani 390'ın ×1.2517/×1.2445'i —
   ×1.25 kabulü bu turda da ölçümle örtüşüyor). */
.network-track{display:flex;width:max-content;animation:network-scroll 89.1s linear infinite}
.network-track--rev{animation-duration:90.4s;animation-direction:reverse}
.network-set{display:flex;align-items:center;gap:46px;padding-inline-end:46px}
/* RTL (T3): marquee akışı ASİMETRİKTİR (tek yöne kayar). RTL'de flex sırası
   dönüp şerit satır-sonuna yaslandığı için aynı işaretli kayma ikinci seti
   değil BOŞLUĞU açardı; --dir çarpanı işareti çevirir. LTR: -50% × 1 = -50%. */
@keyframes network-scroll{to{transform:translateX(calc(-50% * var(--dir)))}}
.network-marquee:hover .network-track{animation-play-state:paused}
.network-marquee.is-paused .network-track,.report-rows-viewport.is-paused .report-rows-track{animation-play-state:paused}
.network-logo{flex:0 0 auto;display:inline-flex;align-items:center;color:#1b2a63;opacity:.85}
.network-logo svg{height:24px;width:auto;display:block;fill:currentColor;stroke:none}
/* Task 12: AP bantta 16→22px. Gerekçe: 16px, tune EDİLMEMİŞ varsayılanın
   (.network-logo svg{height:24px}) bile altındaydı — ajansın optik ağırlığı
   komşularına göre düşük kalıyordu. Doğrudan komşusu USA Today ile aynı
   yüksekliğe çekildi (240:50 en-boy ⇒ 76.8px → 105.6px genişlik).
   DİKKAT: yalnız height değişti. #n-ap'ın iki-tonlu fill:var(--ap-mark)/
   var(--ap-word) yapısına DOKUNULMADI; bant bu değişkenleri hiç set etmediği
   için currentColor geri-dönüşüyle tek-ton siluet olarak boyanmaya devam eder,
   plan kartlarındaki iki-tonlu render ise etkilenmez. */
.network-logo--ap svg{height:22px}
.network-logo--usatoday svg{height:22px}
.network-logo--yahoonews svg{height:20px}
.network-logo--gm svg{height:16px}
.network-logo--barchart svg{height:15px}
.network-logo--buffalonews svg{height:16px}
.network-logo--torontosun svg{height:15px}
.network-logo--province svg{height:15px}
.network-logo--calgaryherald svg{height:16px}
.network-logo--kttc svg{height:16px}
.network-logo--nationalpost svg{height:15px}
.network-logo--montrealgazette svg{height:15px}
/* Yeni mecralar (yeni-mecralar / Task 1) — bant YÜKSEKLİK güdümlü (plan kartı
   GENİŞLİK güdümlü, iki tablo AYRI). Değerler tahmin değil: 1440'ta gerçek
   DOM'da her sembol izole rasterize edilip mürekkep alanı ve ana satır
   yüksekliği ölçüldü (plan kartı tablosuyla AYNI yöntem).
     logo            768+ h  genişlik  ana satır  mürekkep   kıyas komşu
     CBS19 News       25px    83.7px     15.5       979px²    Calgary Herald 1020
     Fox Illinois     23px    43.5px     18.3       583px²    KTTC 667 / barchart 708
     ABC12 News       23px   122.8px     22.5      1680px²    Buffalo News 1113
   Bandın ölçülen komşu aralığı: mürekkep 667-2346px², ana satır 9.8-20px.
   CBS19 brief'in önerdiği 28px'ten 25'e İNDİRİLDİ: 28'de AP ve USA Today ile
   BİREBİR aynı yükseklikte oluyordu (1222px²) — bir yerel istasyonun bandın
   iki en büyük markasını boyca eşitlemesi optik olarak yanlış okunuyordu.
   ABC12 haber kilidi YATAY (en/boy 5.34) ve tek OPTİK OLMAYAN istisnadır:
   yüksekliğini optik ağırlık değil ŞERİT AYRIŞMA EŞİĞİ belirledi (bkz. plan
   kartı tablosundaki eşik ölçümü — 18px altında şeritler kapanıyor). Taban
   18px (96.1px genişlik) = eşiğin tam üstü; 768+ 23px (122.8px) = temiz bölge.
   Bedeli komşularının bir tık üstünde bir kütle (1680px² / Buffalo News 1113,
   Calgary Herald 1020) ama mark uzun ve seyrek olduğu için gözle ağır
   durmuyor. Brief'in 20px önerisi düz 2022 markası içindi, o varlık değişti.
   Fox Illinois 23px'te kaldı: ana satırı (18.3px) zaten komşu üst sınırında
   (National Post 18.5, Toronto Sun 18.0), yükseltmek onu domine ettirirdi.
   ŞERİT DENETİMİ (ABC12'nin ince dikey "|||" şeritleri): yürürlükteki bant
   değerleri TABAN 18px (96.1px genişlik) ve 768+ 23px (122.8px). Bu ikisi
   optik ağırlıktan DEĞİL, ölçülen ayrışma eşiğinden geliyor: sembol DPR 1'de
   izole rasterize edilip 8x nearest büyütülerek orta tarama çizgisinde koyu
   blok sayıldı.
     13px  şeritler tek gri bloğa KAPALI
     15px  çoğunlukla kapalı
     16px  sınırda
     18px  AYRIŞIYOR   <- bant tabanı: eşiğin tam üstü
     23px  temiz       <- 768+
   DPR 1'de şeritler ayrık ama YUMUŞAK; DPR 2 ve 3'te — 390 CSS px'lik her
   gerçek telefonun DPR'si — NET. En kötü durum (DPR 1) bile ayrık olduğu için
   bant için ayrı bir minimum genişlik GEREKMEDİ.
   UYARI (bu paragraf bilinçli sapmanın TEK gerekçe kaydıdır): saf optik
   hizalama bu marka için 15px/81px veriyordu ve yorumun eski bir sürümü o
   ölçüleri anlatıyordu — ölçüm onu ÇÜRÜTTÜ. 18px'in altına düşürülürse
   şeritler kapanır, mark tanınmaz olur; "optik hizalama 15px diyor" gerekçesi
   GEÇERSİZDİR.
   KABUL EDİLEN SINIR: bu ölçekte "ILLINOIS" ve "abc" satırları kılcaldır —
   markaların kendi doğası, vektörleştirme kusuru değil. */
.network-logo--cbs19 svg{height:20px}
.network-logo--foxillinois svg{height:18px}
.network-logo--abc12 svg{height:18px}
.network-word{font-size:17px;font-weight:850;letter-spacing:-.02em;white-space:nowrap}
.network-word small{font-weight:700;font-size:.72em;opacity:.7}
/* 8. tur: "Hikayenizi..." satırı bir satır aşağı alındı (14px→38px üst boşluk). */
.network-more{margin:38px 0 0;text-align:center;font-size:14px;font-weight:850;color:#2b3557}
@media (prefers-reduced-motion:reduce){
  .network-track{animation:none;width:100%}
  .network-set{flex-wrap:wrap;justify-content:center;gap:16px 30px;padding-inline-end:0}
  .network-set[data-dup]{display:none}
  .network-marquee{mask-image:none;-webkit-mask-image:none}
}

/* Yapay zeka sahnesi: HTML telefon mockup'ı + cam rozetler (koyu blok) */
.phone-stage{position:relative;margin:20px 0 4px;display:grid;justify-items:end}
.phone{position:relative;width:min(320px,86%);background:linear-gradient(180deg,#151c3d,#0b1243);border-radius:34px;padding:6px;box-shadow:0 30px 70px rgba(0,0,0,.45),inset 0 1px 1px rgba(255,255,255,.14)}
/* left:50% + translateX(-50%): .sticky-cta ile aynı yönden bağımsız ortalama
   idiomu (bkz. oradaki RTL notu) — fiziksel bırakıldı. */
.phone-notch{position:absolute;top:6px;left:50%;transform:translateX(-50%);width:92px;height:20px;background:#0b1243;border-radius:0 0 14px 14px;z-index:2}
.phone-screen{background:linear-gradient(180deg,#f6f9ff,#eef3ff);border-radius:28px;padding:32px 12px 14px;display:grid;gap:9px}
.chat-app{display:flex;align-items:center;gap:7px;color:var(--pe-navy);font-weight:950;font-size:14px;padding:0 4px 2px;letter-spacing:-.01em}
.chat-app .ic{width:16px;height:16px;color:var(--pe-blue)}
.chat-status{width:7px;height:7px;border-radius:50%;background:var(--pe-gold);margin-inline-start:auto}
.chat-q{display:flex;align-items:center;justify-content:flex-end;gap:8px}
.chat-q span{background:linear-gradient(135deg,#145bff,#0637b8);color:#fff;border-radius:16px;border-end-end-radius:4px;padding:10px 13px;font-size:13.5px;font-weight:750;line-height:1.4;max-width:82%}
.chat-avatar{flex:0 0 26px;width:26px;height:26px;border-radius:50%;background:#dfe8ff;color:var(--pe-blue-dark);display:inline-flex;align-items:center;justify-content:center}
.chat-avatar .ic{width:14px;height:14px}
.chat-a{background:#fff;border:1px solid #e2eaff;color:var(--pe-navy);border-radius:16px;border-end-start-radius:4px;padding:11px 13px;font-size:13px;font-weight:400;line-height:1.45;box-shadow:0 8px 20px rgba(9,16,51,.06)}
.chat-sources-label{color:#66708a;font-size:10.5px;font-weight:950;text-transform:uppercase;letter-spacing:.06em;padding:2px 4px 0}
.chat-source{display:flex;align-items:center;gap:9px;background:#fff;border:1px solid #e2eaff;border-radius:14px;padding:9px 11px;box-shadow:0 8px 20px rgba(9,16,51,.05)}
.chat-source-thumb{flex:0 0 30px;width:30px;height:30px;border-radius:9px;background:#eaf1ff;color:var(--pe-blue);display:inline-flex;align-items:center;justify-content:center}
.chat-source-thumb .ic{width:16px;height:16px}
.chat-source div{display:grid;gap:1px;min-width:0}
.chat-source b{font-size:12.5px;line-height:1.25;color:var(--pe-navy);letter-spacing:-.01em}
.chat-source span{font-size:11px;color:#66708a;font-weight:700}
.chat-input{display:flex;align-items:center;justify-content:space-between;gap:8px;background:#fff;border:1px solid #e2eaff;border-radius:999px;padding:8px;padding-inline-start:14px;color:rgba(102,112,138,.6);font-size:12px;font-weight:700;cursor:default}
.chat-input i{width:28px;height:28px;border-radius:50%;background:var(--pe-blue);color:#fff;display:inline-flex;align-items:center;justify-content:center}
.chat-input .ic{width:15px;height:15px}
.phone-badge{position:absolute;inset-inline-start:0;z-index:2;display:flex;align-items:center;gap:9px;background:rgba(20,28,70,.78);border:1px solid rgba(255,255,255,.18);backdrop-filter:blur(8px);border-radius:15px;padding:9px 12px;box-shadow:0 14px 34px rgba(0,0,0,.35);pointer-events:none;animation:badge-float 6s ease-in-out infinite alternate}
.phone+.phone-badge{top:-10px}
.phone-badge+.phone-badge{top:auto;bottom:8px;animation-delay:-3s}
.phone-badge .ic{width:15px;height:15px;color:#fff;flex:0 0 auto}
.phone-badge div{display:grid;gap:1px}
.phone-badge b{font-size:12px;font-weight:850;color:#fff;line-height:1.2}
.phone-badge span{font-size:10.5px;font-weight:700;color:rgba(255,255,255,.72);line-height:1.3}
@keyframes badge-float{from{transform:translateY(-3px)}to{transform:translateY(3px)}}
@media (prefers-reduced-motion:reduce){.phone-badge{animation:none}}
@media (max-width:360px){.phone-badge+.phone-badge{display:none}}
/* Güven rayı: haber yayınının 3 kazanımı, tek gövdeli kart */
.trust-list{margin:16px 0;background:#fff;border:1px solid #dde7ff;border-radius:20px;padding:5px 16px;box-shadow:0 12px 30px rgba(9,16,51,.07)}
.trust-item{display:flex;align-items:flex-start;gap:12px;padding:14px 0}
.trust-item+.trust-item{border-top:1px solid #eef2fb}
.trust-copy{display:grid;gap:3px}
.trust-copy b{font-size:15px;line-height:1.3;letter-spacing:-.015em;color:var(--pe-navy)}
.trust-copy span{font-size:12.5px;line-height:1.4;color:#66708a;font-weight:700}

/* Hedef kitle kartları */
.audience-grid{display:grid;grid-template-columns:1fr 1fr;gap:9px;margin:18px 0}
.audience-card{display:flex;align-items:flex-start;flex-direction:column;gap:8px;border:1px solid #dde7ff;background:#fff;border-radius:18px;padding:13px 12px;box-shadow:0 10px 26px rgba(9,16,51,.06);transition:transform .5s cubic-bezier(.32,.72,0,1),box-shadow .5s cubic-bezier(.32,.72,0,1)}
.audience-card:hover{transform:translateY(-2px);box-shadow:0 16px 36px rgba(9,16,51,.10)}
.audience-copy{display:grid;gap:3px}
.audience-copy b{font-size:13.5px;letter-spacing:-.015em;color:var(--pe-navy);line-height:1.2}
.audience-copy span{font-size:12px;line-height:1.35;color:#3a4564;font-weight:400}

/* Canlı rapor paneli */
.report-panel{margin:20px 0;background:#fff;border:1px solid #dde7ff;border-radius:24px;padding:16px;box-shadow:0 26px 60px rgba(9,16,51,.12)}
.report-head{display:flex;align-items:center;justify-content:space-between;gap:10px}
.report-brand{display:inline-flex;align-items:center}
.report-brand img{display:block;height:19px;width:auto}
.report-updated{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:800;color:#3a8759;background:#ecfaf1;border:1px solid #c9eed9;border-radius:999px;padding:5px 10px}
.report-updated i{width:7px;height:7px;border-radius:50%;background:var(--pe-green)}
.report-title{margin:12px 4px 10px;font-size:19px;font-weight:950;letter-spacing:-.025em;color:var(--pe-navy)}
.report-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:9px}
.report-stat{border:1px solid #e6edff;background:#f8fbff;border-radius:15px;padding:11px 12px;display:grid;gap:2px}
.report-stat small{font-size:10.5px;font-weight:850;text-transform:uppercase;letter-spacing:.04em;color:#66708a}
.report-stat b{font-size:20px;font-weight:950;letter-spacing:-.035em;color:var(--pe-navy);line-height:1.05}
.report-stat:nth-child(3) b{color:var(--pe-green);font-size:16px}
.report-stat span{font-size:11px;color:#8b94ab;font-weight:700}
.report-table{margin-top:12px;border:1px solid #e6edff;border-radius:16px;overflow:hidden}
.report-table-title{padding:11px 13px;font-size:13.5px;font-weight:950;color:var(--pe-navy);background:#f8fbff;border-bottom:1px solid #e6edff}
.report-row{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) minmax(0,.9fr) minmax(0,.9fr);gap:8px;align-items:center;padding:10px 13px;border-bottom:1px solid #eef2fb;font-size:12.5px;font-weight:700;color:#3a4564}
.report-row-head{font-size:10.5px;font-weight:850;text-transform:uppercase;letter-spacing:.045em;color:#8b94ab;background:#fbfcff}
.report-source{font-weight:900;color:var(--pe-navy);min-width:0}
.report-source-word{font-weight:850;color:#1b2a63;letter-spacing:-.01em}
.report-source-word small{font-size:.75em;font-weight:700;opacity:.7}
/* 8. tur: kategori hücresi kaynak sütununun ÖNÜNE geçmesin diye küçültüldü —
   kaynak (.report-source-word) tablodaki asıl odak, kategori yalnız bağlam. */
.report-category{font-size:11px;font-weight:500;color:#66708a}
.report-status{display:inline-flex;width:max-content;background:#ecfaf1;color:#2c8054;border-radius:999px;padding:3px 9px;font-size:11px;font-weight:900}
.report-link{color:#2c8054;font-weight:900}
/* 8. tur: "Tahmini Aylık Trafik" kolonu SADECE masaüstünde (768+, aşağıdaki
   ilgili katmana bkz.) — kullanıcı isteği böyleydi, mobilde tablo zaten 4
   kolonluk 2 satırlık karta dönüşüyor, 5. veri orada sıkışırdı. Değeri
   bulunamayan satırlarda "—" kullanılır (uydurma sayı YOK — bkz. commonNote
   yanındaki dürüstlük notları); .report-traffic-unknown o "—" hücresini
   diğerlerinden ayırt eder (daha soluk renk). */
.report-traffic,.report-traffic-head{display:none}
.report-table-footer{padding:11px 13px;text-align:center;font-size:12.5px;font-weight:900;color:var(--pe-blue);background:#f8fbff}
/* Rapor satırları: 4 satırlık pencere; kalan mecralar satır satır yukarı akar
   (sürekli kayan metin küçük puntoda okunmaz — her adım arasında tam duraklama var).
   Task 11: bant 5 yeni mecrayla genişleyince (Financial Post, National Post, Montreal
   Gazette, ADVFN, The Daily Press) rapor listesi de "mevcut satırlar ∪ TÜM bant mecraları"
   kuralıyla 11'den 33 satıra çıktı. Satır başına süre SABİT tutuldu (33s/11=3s/satır),
   toplam süre satır sayısıyla orantılı uzatıldı: 33s × 33/11 = 99s. Adım yüzdeleri buna göre
   yeniden hesaplandı (segment=100/33≈3.03%, hold=7.6×11/33≈2.53%, hareket payı≈0.5% — eski
   9.09/7.6/1.49 oranıyla aynı, yalnız 33 segmente bölünmüş).
   Task 12: Postmedia satırı ÇIKTI ama yerine Financial Times satırı GİRDİ —
   satır sayısı 33'te SABİT kaldı, bu yüzden o turda @keyframes report-flow
   bloğu ve 99s süre KASITLI OLARAK DEĞİŞTİRİLMEDİ.
   yeni-mecralar Task 1: satır sayısı BU SEFER GERÇEKTEN değişti, 33 -> 36.
   Üç yeni yerel TV istasyonu (CBS19 News, Fox Illinois, ABC12 News) yalnız
   banda eklenseydi test/build.test.js'teki "bant ⊆ rapor" kilidi KIRILIRDI:
   ağda var denen bir mecranın raporda karşılığı olmak zorunda. Kullanıcı yeni
   anlaşma yaptığını bildirdiği için rapora eklemek dürüstlük kanonuyla da
   tutarlı (mecra İCAT EDİLMEDİ, ürün sahibinin bildirdiği anlaşma yazıldı).
   Yukarıdaki formül N=36 için uygulandı: süre=3×36=108s, segment=100/36≈2.7778%,
   hold=7.6×11/36≈2.3222%, son adım translateY(calc(var(--row-h) * -36)).
   Satır başına 3s SABİT kaldı; dikişsizlik canlı doğrulandı (0% ve 100%
   karelerinin arası tam bir birincil blok boyu, dup blok o boşluğu doldurur).
   (Dikkat, değişmeden kalan kural: .report-row'lar tableRows.N'e KONUMSAL
   bağlanır — bir satır silinirse sonraki TÜM indeksler HER İKİ blokta da
   yeniden numaralandırılmalıdır.) */
.report-rows-viewport{--row-h:48px;height:calc(var(--row-h) * 4);overflow:hidden;
  -webkit-mask-image:linear-gradient(to bottom,#000 0,#000 calc(100% - 22px),transparent 100%);
  mask-image:linear-gradient(to bottom,#000 0,#000 calc(100% - 22px),transparent 100%)}
/* 8. tur: kullanıcı isteğiyle akış hızlandırıldı (108s→78s, satır başına
   ~3s→~2.17s) — keyframe % adımları --row-h'e bağlı olduğu için süre
   değişikliği ekstra bir hesap gerektirmedi. */
.report-rows-track{animation:report-flow 78s cubic-bezier(.45,0,.2,1) infinite}
.report-rows-viewport:hover .report-rows-track,.report-rows-viewport:active .report-rows-track{animation-play-state:paused}
.report-rows-track .report-row{height:var(--row-h);padding-top:0;padding-bottom:0}
/* İnceleme düzeltmesi (Bulgu 1, <768 yalnız — 768+ zaten taşmasızdı, dokunulmadı):
   taban 4-kolonlu tek-satır grid'inde, uzun çok-kelimeli mecra adlarında (ör. "Peace
   River Record-Gazette", "News Channel Nebraska") kaynak kolonu yalnızca ~100-120px
   olduğundan metin 2-3 satıra sarıyor, ama satır yüksekliği sabit --row-h (44px)
   olduğundan üçüncü satır bir sonraki satırın üstüne taşıyordu — hem varsayılan
   animasyonlu sunumda (satır kayan pencereye girince) hem ≤430'da statik durumda.
   Ad KISALTILMAZ/ELLIPSIS'lenmez (dürüstlük kanonu — yayın adı yanlış temsil
   edilemez); bunun yerine satır "ad (tam genişlik, tek satır) + meta (kategori/
   durum/link, ikinci satır)" 2 satırlık bir karta dönüştürüldü — .network-word'ün
   nowrap deseniyle aynı ruhta, ama grid yerine flex-wrap ile: kaynak hücresi
   flex-basis:100% ile TEK BAŞINA tüm satırı kaplayıp sonraki 3 öğeyi otomatik
   ikinci satıra iter (network-scroll'daki gibi bir "zorla sar" numarası). Ad artık
   ~305-380px genişliğinde tek satırda (en uzun ad 27 karakter ≈ 190px — bolca pay
   var), taşma riski kalmadı. Yalnız <768'de: --row-h 44→48px'e büyütüldü (gerçek DOM
   ölçümüyle: 2 satırlık doğal içerik yüksekliği 37px, 48px ~11px pay bırakıyor),
   yalnız BU token değişti — keyframe % formülü aynı kaldı (adımlar
   zaten var(--row-h)'ye bağlı, otomatik ölçekleniyor, satır başına 3s sabit kaldı).
   768+ için ayrı bir --row-h/font-size kuralı zaten var (aşağıda, ~52px) ve
   dokunulmadı; bu blok yalnız <768'i hedefler ki 768+'ın hâlihazırda taşmasız
   4-kolonlu grid'i (inceleme: "768/1024/1280/1440 temiz") bozulmasın. */
@media (max-width:767px){
  .report-rows-track .report-row{display:flex;flex-wrap:wrap;align-content:center;
    align-items:center;row-gap:4px;column-gap:8px}
  .report-rows-track .report-source{flex:0 1 100%;white-space:nowrap;overflow:visible}
  .report-rows-track .report-row>span:nth-child(2){flex:1 1 auto;min-width:0;white-space:nowrap}
  .report-rows-track .report-status{flex:0 0 auto}
  .report-rows-track .report-link{flex:0 0 auto}
  /* Kolon başlığı (Fix 5, final-fix-wave): satırlar yukarıda 2 satırlık
     kartlara döndüğü için (Kaynak tek başına 1. satır, Kategori/Durum/
     Bağlantı 2. satırda akar) taban 4-kolonlu tek-satır .report-row-head
     grid'i artık altındaki kartlarla hizalanmıyor — "Kaynak | Kategori |
     Durum | Bağlantı" etiketleri kartların hiçbir sütununa denk gelmiyordu.
     Kartları başlığa uydurmak (head'i de 2 satırlı bir düzene çevirmek)
     4 küçük punto etiketi için orantısız karmaşıklık katardı; en temiz okuma
     başlığı bu genişlikte tamamen gizlemek — .report-table-title zaten
     tabloyu tanımlıyor, .report-source-word markası + kategori/durum/link
     her kartta kendi bağlamını taşıyor. */
  .report-row-head{display:none}
}
/* Adımlar --row-h'e bağlı: mobilde (44px) çıktı eski px değerleriyle bit-eş
   (44*N = eski -Npx), 768+'ta token büyüdüğünde akış otomatik ölçeklenir */
@keyframes report-flow{
  0%,2.32%{transform:translateY(0)}
  2.78%,5.10%{transform:translateY(calc(var(--row-h) * -1))}
  5.56%,7.88%{transform:translateY(calc(var(--row-h) * -2))}
  8.33%,10.66%{transform:translateY(calc(var(--row-h) * -3))}
  11.11%,13.43%{transform:translateY(calc(var(--row-h) * -4))}
  13.89%,16.21%{transform:translateY(calc(var(--row-h) * -5))}
  16.67%,18.99%{transform:translateY(calc(var(--row-h) * -6))}
  19.44%,21.77%{transform:translateY(calc(var(--row-h) * -7))}
  22.22%,24.54%{transform:translateY(calc(var(--row-h) * -8))}
  25.00%,27.32%{transform:translateY(calc(var(--row-h) * -9))}
  27.78%,30.10%{transform:translateY(calc(var(--row-h) * -10))}
  30.56%,32.88%{transform:translateY(calc(var(--row-h) * -11))}
  33.33%,35.66%{transform:translateY(calc(var(--row-h) * -12))}
  36.11%,38.43%{transform:translateY(calc(var(--row-h) * -13))}
  38.89%,41.21%{transform:translateY(calc(var(--row-h) * -14))}
  41.67%,43.99%{transform:translateY(calc(var(--row-h) * -15))}
  44.44%,46.77%{transform:translateY(calc(var(--row-h) * -16))}
  47.22%,49.54%{transform:translateY(calc(var(--row-h) * -17))}
  50.00%,52.32%{transform:translateY(calc(var(--row-h) * -18))}
  52.78%,55.10%{transform:translateY(calc(var(--row-h) * -19))}
  55.56%,57.88%{transform:translateY(calc(var(--row-h) * -20))}
  58.33%,60.66%{transform:translateY(calc(var(--row-h) * -21))}
  61.11%,63.43%{transform:translateY(calc(var(--row-h) * -22))}
  63.89%,66.21%{transform:translateY(calc(var(--row-h) * -23))}
  66.67%,68.99%{transform:translateY(calc(var(--row-h) * -24))}
  69.44%,71.77%{transform:translateY(calc(var(--row-h) * -25))}
  72.22%,74.54%{transform:translateY(calc(var(--row-h) * -26))}
  75.00%,77.32%{transform:translateY(calc(var(--row-h) * -27))}
  77.78%,80.10%{transform:translateY(calc(var(--row-h) * -28))}
  80.56%,82.88%{transform:translateY(calc(var(--row-h) * -29))}
  83.33%,85.66%{transform:translateY(calc(var(--row-h) * -30))}
  86.11%,88.43%{transform:translateY(calc(var(--row-h) * -31))}
  88.89%,91.21%{transform:translateY(calc(var(--row-h) * -32))}
  91.67%,93.99%{transform:translateY(calc(var(--row-h) * -33))}
  94.44%,96.77%{transform:translateY(calc(var(--row-h) * -34))}
  97.22%,99.54%{transform:translateY(calc(var(--row-h) * -35))}
  100%{transform:translateY(calc(var(--row-h) * -36))}
}
@media (prefers-reduced-motion:reduce){
  .report-rows-track{animation:none}
  /* <768: 33 satır height:auto ile tam açılınca panel 390'da 1911px'lik bir
     duvara dönüşüyordu (final-fix-wave incelemesi) — 768+ ile aynı 8 satırlık
     pencereye kapaklanıp kaydırılabilir kılındı (bkz. 768+reduce birleşik
     bloğundaki eşdeğer kural ve oradaki yorum, satır ~1141). */
  .report-rows-viewport{height:auto;max-height:calc(var(--row-h) * 8);overflow-y:auto;-webkit-mask-image:none;mask-image:none}
  .report-rows-dup{display:none}
}

/* Blok arka plan varyasyonları */
/* Sahnenin atmosferi bölüm zemininde durur (kutu içinde değil): kolaj
   .phone-stage sahneleri gibi doğrudan zeminin üstünde yüzer. */
.block-guaranteed{background:radial-gradient(circle at calc(50% - 24% * var(--dir)) 42%,rgba(15,85,255,.09),transparent 40%),linear-gradient(180deg,#fff,#f2f6ff)}
.block-google{background:radial-gradient(circle at 12% 8%,rgba(15,85,255,.10),transparent 34%),linear-gradient(180deg,#fbfdff,#eef4ff)}
.block-audience{background:linear-gradient(180deg,#fff,#f6f9ff)}
.block-report{background:linear-gradient(180deg,#fff,#f2f6ff)}

@media (max-width:380px){
  .punch{font-size:21px}
  .report-row{grid-template-columns:minmax(0,1.2fr) minmax(0,.9fr) minmax(0,.8fr) minmax(0,.8fr);font-size:11.5px}
  .report-source-word{font-size:11px;letter-spacing:-.02em}
}

/* ============================================================
   Panel önerileri: Yayın Sözü kutusu, Nasıl çalışır, mikro güvenceler
   ============================================================ */
/* Nasıl çalışır: aktör etiketli dikey zaman çizgisi */
.steps-flow{margin:18px 0}
/* "Nasıl çalışır?" bölüm başlığıdır ve adım başlıklarına ÜSTÜNLÜK kurmalı.
   Eskiden ikisi de 15px'ti (950'ye karşı 900) — aynı punto, komşu ağırlık:
   başlık dördüncü bir adım gibi okunuyordu. Üstünlük artık PUNTODAN geliyor,
   ağırlıktan değil. */
.steps-title{display:block;font-size:17px;font-weight:950;letter-spacing:-.02em;color:var(--pe-navy);margin-bottom:12px}
.steps-timeline{list-style:none;margin:0;padding:0;position:relative}
.steps-timeline:before{content:"";position:absolute;inset-inline-start:17px;top:12px;bottom:26px;width:2px;background:linear-gradient(180deg,var(--pe-blue),#bcd2ff 65%,var(--pe-green))}
.step{position:relative;display:flex;gap:14px;padding-bottom:20px}
.step:last-child{padding-bottom:6px}
.step-node{position:relative;z-index:1;flex:0 0 36px;width:36px;height:36px;border-radius:50%;background:#fff;border:2px solid var(--pe-blue);color:var(--pe-blue);display:inline-flex;align-items:center;justify-content:center}
.step-node .ic{width:17px;height:17px}
.step-copy{min-width:0;padding-top:1px}
/* Üç katmanlı tipografi kuralı (bkz. 4. tur): başlık 950 / ETİKET 700 /
   gövde 400. Bu hap bir etiket; 10.5px'te 950 ağırlık harfleri birbirine
   yapıştırıyordu. */
.step-tag{display:inline-flex;font-style:normal;font-size:10.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--pe-blue-dark);background:#eaf1ff;border-radius:999px;padding:3px 8px;margin-bottom:4px}
/* Adım başlığı bölüm başlığının ALTINDA bir kademe: 900 -> 800. Böylece
   blok 950 -> 700 -> 800 -> 400 diye basamaklanıyor; eskiden 950/900 ile
   başlayıp doğrudan 400'e düşüyor, arada hiçbir kademe kalmıyordu. */
.step-copy b{display:block;font-size:15px;font-weight:800;letter-spacing:-.015em;line-height:1.25;color:var(--pe-navy)}
.step-copy span{display:block;margin-top:3px;font-size:12.5px;line-height:1.4;font-weight:400;color:#66708a}
.step:last-child .step-node{background:var(--pe-green);border-color:var(--pe-green);color:#fff}
.step:last-child .step-tag{background:#ecfaf1;color:#2c8054}
/* Gezen nokta (yalnız 1080+, ~satır 730): temel katmanda açıkça kapalı —
   .steps-timeline 768+'ta grid'e döndüğünde boş bir çocuk bile STRETCH ile
   gerçek bir hücre kaplayıp 2x2 eşleşmeyi bozar. */
.steps-dot{display:none}


/* Kart içi örnek rapor linki (Task 4): üç kartta da .plan-note'un ALTINDA,
   kartın en son öğesi. Task 9 bu linki bölüm altına tek satıra almıştı çünkü
   ölçüsü CTA ile yarışıyordu (850 ağırlık + kalıcı altı çizgi + koyu mavi);
   geri gelirken YERİ değil ÖLÇÜSÜ değişti — .plan-note ile aynı punto/renk
   ailesi, altı çizgi yalnız :hover/:focus-visible'da. min-height:44px KORUNUR:
   dokunmatik hedef boyutu görsel ağırlıktan bağımsızdır. Bölüm altındaki
   .plans-report-link varyantı ve tek kopya SİLİNDİ — artık kullanılmıyor. */
.plan-report-link{display:flex;align-items:center;justify-content:center;gap:6px;min-height:44px;margin:2px 0 0;font-size:12px;font-weight:700;color:#66708a;text-decoration:none;border-radius:10px}
.plan-report-link .ic{width:14px;height:14px;opacity:.85}
.plan-report-link:hover{color:var(--pe-blue-dark);text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px}
/* Koyu Starter kartında aynı sessizlik seviyesi: .plan-starter .plan-note ile
   aynı beyaz-şeffaf ton, hover'da tam beyaza açılır. */
.plan-starter .plan-report-link{color:rgba(255,255,255,.75)}
.plan-starter .plan-report-link:hover{color:#fff}
/* Odak izi: .hero-miniplan:focus-visible ile aynı halka (Task 2 precedent).
   Koyu Starter zemininde mavi halka kaybolduğu için orada altın halkaya döner.
   Tam yoğunluk (nihai inceleme I-1): .45 alfa beyaz kart üstünde 2.08:1,
   .75 alfa altın Starter'ın en parlak mavi pikselinde (#285ad3) 2.85:1 —
   ikisi de 3:1 eşiğinin altındaydı. Opak karşılıkları 5.58:1 ve 4.01:1. */
.plan-report-link:focus-visible{outline:3px solid var(--pe-blue);outline-offset:2px}
.plan-starter .plan-report-link:focus-visible{outline-color:var(--pe-gold)}
.plan-note{margin:6px 0 0;text-align:center;font-size:12px;font-weight:700;color:#66708a}
.plan-starter .plan-note{color:rgba(255,255,255,.75)}


.audience-cover{margin:14px 0 0;text-align:center;font-size:14px;font-weight:850;color:#2b3557}
.audience-disclaimer{margin:6px 0 0;text-align:center;font-size:11.5px;font-weight:700;color:#8b94ab}

.footer-support{font-weight:800;color:var(--pe-blue-dark)}
/* Destek satırı artık gerçek bir mailto bağlantısı (<a> tüm satırı sarar —
   gerekçe template.html'deki footer notunda). Taban katmanda bağlantı,
   önceki düz metnin BİREBİR aynısı boyanır (renk/kalınlık miras, alt çizgi
   yok) — böylece ≤430 footer'ı piksel olarak değişmez; 768+ katmanında
   bağlantı görünümünü alır (Task 5). */
.footer-support a{color:inherit;font-weight:inherit;text-decoration:none}
/* Odak halkası TABAN katmanda (nihai inceleme I-2): Task 5'te yalnız 768+
   footer bloğuna yazılmıştı, bu yüzden mobilde mailto durağı tarayıcının 1px
   varsayılanına düşüyordu. Buraya taşındı; 768+ kopyası SİLİNDİ. Renk tam
   yoğunluk (I-1): .45 alfa footer zemininde 2.05:1, #0f55ff 5.30:1.
   border-radius:6px yalnız 768+ bloğunda kalır (bağlantı görünümünün parçası);
   mobilde halka bu yüzden köşesiz — kırpma/örtüşme yok, ölçüldü. */
.footer-support a:focus-visible{outline:3px solid var(--pe-blue);outline-offset:3px}

/* GİZLİ DURUM — bant ve yüzen düğme TEK durumu paylaşır (app.js aynı toggle
   çağrısıyla ikisine de ekler/çıkarır; ayrı eşik/zamanlayıcı YOK).

   Task 17 düzeltme turu 1, İKİ değişiklik:

   1) `visibility:hidden` EKLENDİ. Task 10'dan beri gizleme yalnız
      opacity + transform + pointer-events ile yapılıyordu; bu kontrolü
      EKRANDAN kaldırıyor ama TAB SIRASINDA ve ERİŞİLEBİLİRLİK AĞACINDA
      bırakıyordu — klavye kullanıcısı hero'dayken #stickyCtaButton'a
      odaklanıp ekran dışına "kayboluyordu" (gerçek WCAG 2.4.3/2.4.7 hatası,
      ölçümle doğrulandı: task-17-report.md §7.1). visibility ikisini birden
      kapatır. GEÇİŞ KORUNUYOR: --vis-delay ile visibility'nin değişimi
      kayma/sönme animasyonunun sonuna (.45s) ERTELENİR, yani çıkış
      animasyonu tam olarak görünür; GERİ GELİRKEN gecikme 0s'dir (taban
      değer), yani kontrol anında odaklanabilir olur.

   2) prefers-reduced-motion:reduce artık gizlemeyi İPTAL ETMİYOR, yalnız
      HAREKETİ kaldırıyor. Eski kural (`opacity:1;pointer-events:auto`)
      gizli durumu reduce altında tamamen no-op yapıyordu — yani bant
      HİÇ çekilmiyordu. Bu, hem yukarıdaki odak hatasını hem de yüzen
      düğmenin fiyat örtmesini reduce altında AYNEN geri getirirdi.
      Reduce'un anlamı "hareketi azalt", "işlevi kapat" değil: durum
      değişimi aynen olur, yalnız animasyonsuz/anında olur (geçişleri
      taban katmandaki `*{transition:none!important}` zaten kapatıyor).
      Kayma dönüşümü reduce altında sıfırlanır — öğe zaten görünmez,
      ekran dışına atmanın bir anlamı yok. */
.sticky-cta,.wa-fab{transition-property:background,border-color,box-shadow,transform,opacity,visibility}
.sticky-cta{transition-duration:.18s,.18s,.18s,.45s,.45s,0s;transition-timing-function:ease,ease,ease,cubic-bezier(.32,.72,0,1),cubic-bezier(.32,.72,0,1),linear;transition-delay:0s,0s,0s,0s,0s,var(--vis-delay,0s)}
.wa-fab{transition-duration:.16s,0s,0s,.45s,.45s,0s;transition-timing-function:ease,linear,linear,cubic-bezier(.32,.72,0,1),cubic-bezier(.32,.72,0,1),linear;transition-delay:0s,0s,0s,0s,0s,var(--vis-delay,0s)}
.sticky-cta.sticky-hidden,.wa-fab.sticky-hidden{--vis-delay:.45s;opacity:0;visibility:hidden;pointer-events:none}
.sticky-cta.sticky-hidden{transform:translate(-50%,115%)}
.wa-fab.sticky-hidden{transform:translateY(28px) scale(.86)}

@media (prefers-reduced-motion:reduce){
  .sticky-cta.sticky-hidden{transform:translate(-50%,0)}
  .wa-fab.sticky-hidden{transform:none}
}

/* ============================================================
   Deneme paketi: koyu AI bloğu, birleşik karşılaştırma, kompakt kitle
   ============================================================ */
/* 10) AI bloğu koyu tema — sayfa ortasında ritim kırılımı */
.block-ai{background:radial-gradient(circle at 85% 6%,rgba(123,60,255,.30),transparent 44%),radial-gradient(circle at 8% 94%,rgba(15,85,255,.22),transparent 46%),linear-gradient(180deg,#0a1140,#060b2e)}
.block-ai .section-label{background:rgba(255,255,255,.10);border:1px solid rgba(255,255,255,.16);color:#ffcf24}
.block-ai .h2{color:#fff}
.block-ai .h2 strong{color:#ffcf24}
.block-ai .lead{color:rgba(255,255,255,.84)}
.block-ai .punch{color:#fff;margin:26px 0 8px}
.block-ai .punch strong{color:#ffcf24}
.block-ai .phone-stage{margin-bottom:14px}

/* 3) AI kazanım satırı + araç rozetleri */
.ai-checks{list-style:none;display:flex;flex-wrap:wrap;gap:9px 20px;margin:16px 0 0;padding:0}
.ai-checks li{position:relative;padding-inline-start:25px;font-size:14px;font-weight:850;color:#fff;line-height:1.3}
.ai-checks li:before{content:"✓";position:absolute;inset-inline-start:0;top:1px;width:17px;height:17px;border-radius:50%;background:#ffcf24;color:#091033;font-size:11px;font-weight:950;display:inline-flex;align-items:center;justify-content:center}
.tools-label{margin:16px 0 9px;font-size:11.5px;font-weight:950;letter-spacing:.05em;text-transform:uppercase;color:#9db8ff}
.ai-tools{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 4px}
.ai-tool{flex:1 1 auto;min-width:96px;min-height:40px;display:inline-flex;align-items:center;justify-content:center;gap:8px;border-radius:999px;border:1px solid rgba(255,255,255,.22);background:rgba(255,255,255,.06);color:#dfe8ff;font-weight:850;font-size:12px;padding:0 14px}
.tool-logo{width:16px;height:16px;fill:currentColor;stroke:none;opacity:.92;flex:0 0 auto}
.tool-word{font-weight:950;font-size:13px;letter-spacing:.02em}

/* 8) Kimler İçin: 2 sütun kompakt kartlar (sabit mobil akış) */
.audience-card .ic-circle{flex-basis:30px;width:30px;height:30px}
.audience-card .ic-circle .ic{width:15px;height:15px}



/* ============================================================
   Gerçek mecra logoları (tek renk maske tekniği):
   background:currentColor + PNG alpha maskesi — SVG sprite ile aynı davranış
   ============================================================ */
.logo-mask{display:block;background:currentColor;-webkit-mask:var(--lm) no-repeat center/contain;mask:var(--lm) no-repeat center/contain}
/* Yukarıdaki 5 mask class'ının --lm değerleri (base64 data URI, ~67KB gzip)
   src/assets/css/logo-masks.css'e taşındı (Fix 2, final-fix-wave) — render-
   bloklamayan ikinci bir stylesheet olarak template.html head'inde yüklenir
   (media=print + onload deferred-load deseni + <noscript> yedeği). Bu satır
   yalnız kaynağı işaret eder; .logo-mask{...} taban kuralı (bir üst satır)
   burada, var(--lm) tüketicisi olarak kalmaya devam eder. */
.network-logo .logo-mask--benzinga{height:17px}
.network-logo .logo-mask--dj{height:16px}
.network-logo .logo-mask--si{height:16px}
.network-logo .logo-mask--windsorstar{height:20px}
.network-logo .logo-mask--financialpost{height:16px}
/* .plan-logos-row .logo-mask yükseklikleri SİLİNDİ (Task 9) — yerlerini yukarıdaki
   tek optik genişlik tablosu aldı; yükseklik .logo-mask--*'ın aspect-ratio'sundan
   türer (benzinga 420/59 → 178px genişlikte ≈25px, dj 420/50 → 193px'te ≈23px).
   .report-source .logo-mask / .report-source .logo-mask--benzinga SİLİNDİ
   (desktop-polish-3 / Task 3) — rapor satırlarından mecra logoları kaldırıldı,
   .report-source artık yalnız metin taşıyor; bu iki kural yalnız o logo
   markup'ını hedefliyordu, başka hiçbir seçici .report-source .logo-mask
   kapsamına girmiyordu (doğrulama: grep). Taban .logo-mask kuralı ve --lm
   custom property'leri SİLİNMEDİ — bant (.network-logo .logo-mask--*, birkaç
   satır yukarıda) ve plan kartları (.plan-logos-row .logo-mask--benzinga/--dj,
   yukarıdaki not) bu maskeleri hâlâ kullanıyor. */

/* ==== Masaüstü katmanı: tipografi (768+) ==== */
@media (min-width:768px){
  /* 8. tur: kolon genişletmenin (bkz. yukarısı) yanında punto tavanı da 64→54px'e
     indi. 2026-08-31: İngilizce başlık metni güncellendi ("They Are Searching
     for You. What Do They Find?") ve clamp'in üst ucu (54px) bu yeni metinle
     tipik masaüstü genişliklerinde (≥~1200px) ilk span'i ("They Are Searching
     for You.") yine 2 satıra düşürüyordu (toplam 3 satır). Sabit 47px'e
     geçildi — canlıda ölçüldü: 1280px+'ta ilk span 1 satırda kalıyor (toplam
     2 satır), 1024px ve altında (nadir masaüstü genişliği) hâlâ sarabilir —
     bu, 420px altı için zaten var olan .hero-title{font-size:37px} kuralıyla
     aynı türden kabul edilmiş bir ödünleşim. */
  .hero-title{font-size:47px;letter-spacing:-.03em}
  .h2{font-size:clamp(38px, 1.6vw + 26px, 44px);letter-spacing:-.03em}
  .offer-title{font-size:clamp(46px, 2vw + 30px, 56px)}
  /* Kullanıcı isteği (7. tur): masaüstünde ~%35 küçültüldü (36px tavan → 24px). */
  .punch{font-size:clamp(20px, 1vw + 14px, 24px)}
  .lead{font-size:17px;line-height:1.6}
  .hero-lead{font-size:16px;line-height:1.6}
  .lead,.hero-lead{max-width:var(--measure)}
  /* Final CTA: konteyner artık tam genişlik (koyu bant); yalnız metin blokları ölçülenir */
  .final-punch .h2,.final-punch .lead{max-width:var(--measure)}
}

/* ==== Masaüstü katmanı: düzen ==== */
@media (min-width:768px){
  :root{--pad:32px;--shell:960px}

  /* Üst bar: page-shell zaten shell genişliğinde ortalıyor; iç konteyner için güvence */
  .topbar{max-width:var(--shell);margin-inline:auto}
  /* Dil seçici sağa yaslanır, marka solda; auto margin aradaki boşluğu yutar
     (2026-08-28 spec, 3. tur: eski .topbar-badge kaldırıldığı için bu görev
     şimdi ilk sağ-taraf öğesi olan .lang-select'e geçti). */
  .lang-select{margin-inline-start:auto}
  /* Task 10 (desktop-polish-3): eski topbar-cta'nın boşluğunu devralan
     WhatsApp bağlantısı YALNIZ 768+'ta açılır (taban katmanda display:none —
     mobil topbar'da hiç görünmez, brief kuralı). Güven rozetinin (yukarıda)
     hemen sağında, aynı flex sırasında — margin-inline-start:auto zaten rozeti+bunu
     birlikte sağa yasladığından ek konumlandırma gerekmiyor. */
  .topbar-whatsapp{display:inline-flex}
  /* Üst bar CTA'sı masaüstünde TAMAMEN gizlidir (desktop-polish-3 / Task 2).
     Daha önce bu satır .btn'in display:flex'ini ezip butonu 768+'ta AÇIYORDU;
     artık taban katmandaki .btn.topbar-cta{display:none} ile aynı yönde,
     özgüllük sigortası olarak tekrarlanır: seçici .topbar .btn.topbar-cta
     (0,3,0) — sonraki hiçbir masaüstü katmanı (1000+/1080+ ve sahne blokları)
     daha özgül bir kuralla butonu geri açamaz. Mobil davranış DEĞİŞMEZ
     (taban kural zaten gizliyordu; buton hiçbir genişlikte görünmez).
     Masaüstünde satın alma yolu: hero CTA ("Yayın Planını Seç") + hero plan
     çipleri + #plans paket kartları + final CTA — hepsi #plans'e götürür. */
  .topbar .btn.topbar-cta{display:none}

  /* Alt yapışkan satın-al çubuğu masaüstünde gizli; hero CTA + plan bölümü
     satın alma yolunu taşır, alt boşluk artık gerekmiyor.
     Task 17: yüzen WhatsApp düğmesi de bandın kaderini paylaşır — 768+'ta
     WhatsApp yolunu ÜST ÇUBUK (.topbar-whatsapp, tam bu katmanda açılıyor) ve
     SSS kutusu (.faq-whatsapp-link) taşır; üçüncü bir yüzen kopya masaüstü
     kompozisyonuna girmez. İki kural aynı satırda ve aynı gerekçeyle. */
  .sticky-cta,.wa-fab{display:none}
  body{padding-bottom:0}

  /* 4 adımlı süreç: dikey zaman çizgisi yerine 2x2 ızgara (bağlantı çizgisi ızgarada anlamsız, gizlenir) */
  .steps-timeline{display:grid;grid-template-columns:repeat(2,1fr);gap:20px 28px}
  .steps-timeline:before{display:none}
  .step{padding-bottom:0}

  /* Hedef kitle kartları: 3 kolon */
  .audience-grid{grid-template-columns:repeat(3,1fr)}

  /* Paket kartları: 3 kolonlu ızgara artık BU katmanda DEĞİL — eşiği 1000px'e
     taşındı (aşağıdaki @media (min-width:1000px) bloğu). Ölçüm: 768px'te kart
     yalnız 218.7px genişlik / 915.8px yükseklik; 30px'lik madde girintisi
     düşülünce 178.7px'lik metin kolonu kalıyor, her madde 2-3 satıra kırılıyor.
     Fiyat kartı için kabul edilebilir alt sınır ~240px içerik genişliğidir;
     bu da 3 kolon için ≥1000px viewport demektir (1000px'te içerik 242.7px).
     Mecra logo paneli KALDIRILDI (Task 9, Faz 1): kap (border-radius:14px +
     background + border + padding), 768+ özel logo yükseklikleri ve
     Starter/Core panel zeminleri tamamen silindi — kart yayı 24px, panelinki
     14px olduğu için iki farklı yarıçaplı yüzey iç içe geçip "kart → panel →
     logolar" üç seviyeli bir kapsayıcı zinciri üretiyordu.
     .plan-grid .plan-logo-word 768+ override'ı da Faz 2'de silindi — yerini
     taban katmandaki tek optik boyut tablosu (.plan-logo-word{font-size:23px})
     aldı; breakpoint'e özel ikinci bir boyut tablosu YOK.
     GÜNCEL (2026-08-28 spec): eski "beyaz zemin" override'ı SİLİNDİ —
     .plan-reach artık kutu değil, üst ayraçlı çıplak istatistik (bkz. taban
     katman); koyu Starter kartında ayraç zaten kendi rengini taşıyor,
     ayrıca bir zemine ihtiyaç yok. */

  /* SSS: tek kolon, ortalanmış — başlık (rozet+h2), kart ve WhatsApp kutusu
     (Task 10) AYNI 920px kutusunda hizalı kalır (Task 6: sayfaya göre dar
     duran 720px measure bu bölümden kaldırıldı, dördü tek ortak
     max-width+margin-inline paylaşır). */
  .faq-section>.section-label,.faq-section>.h2,.faq-grid,.faq-whatsapp{max-width:920px;margin-inline:auto}
  .faq-section>.section-label{display:flex}

  /* Final CTA: konteyner tam genişlik kalır (koyu bant tam genişlik), yalnız metin
     blokları ortalanır; buton satırı ortalanmış inline olur */
  .final-punch .h2,.final-punch .lead{margin-inline:auto}
  .final-punch .cta-row{justify-content:center}

  /* Canlı rapor: center-head ile ortalanmış başlığı izler, buton satırı da
     ortalanır (guaranteed bloğunun sola yaslı cta'sına dokunulmaz — o bölüm
     center-head kullanmıyor, Task 3'te kasıtlı olarak sola alındı) */
  .block-report .cta-row{justify-content:center}

  /* CTA satırları: yan yana, otomatik genişlikte butonlar */
  .cta-row{grid-template-columns:repeat(2,auto);justify-content:start}
  .cta-row .btn{width:auto;min-width:220px}

  /* ==== Alt bilgi (768+): kapanış bandı ====
     Teşhis, İKİ ayrı sebep (ikisi de aşağıda çözülür):

     BİRİNCİL — footer İÇERİĞİ hiç boyanmıyordu (reveal/opacity:0 hatası);
       tam gerekçe ve ölçümler aşağıdaki ".footer-note>.reveal" notunda.
     İKİNCİL — kontrast ve doluluk. Footer KUTUSU gizli değildi: 1440'ta
       display:grid, visibility:visible, 120.2px yükseklik, sayfanın
       %98.5'inde; hiçbir ata öğede clip/overflow/max-height yok,
       .sticky-cta zaten 768+'ta display:none. Ama beyaz kabuk
       (.page-shell #fff) üzerinde #f7f9ff zemin + #e6edff 1px kenarlık
       görünmez bir eşikti ve bant 7835px'lik sayfanın yalnız %1.5'i
       kadardı, sağ yarısı boştu. İçerik boyansa bile "yok" gibi okurdu.

     Üç kaldıraç, üçü de sayfanın kendi diliyle:
     1) EŞİK: zemin, body gradyanının üst ucu olan mavi-tonlu #eef4ff'e
        çekilir ve var(--pe-border) 1px çizgiyle kapatılır; üstteki inset
        gölge (--shadow ailesinin ters/oyuk hâli) footer'ı beyaz kabuğun
        ALTINA oturan bir kaide gibi okutur — bölüm geçişi kasıtlı olur.
     2) DOLULUK: sağdaki boş kolon artık gerçek bölüm çapalarını taşıyor
        (#how, #live-report, #faq, #plans) — hepsi sayfada var olan
        bölümler, etiketleri kendi başlık/aria-label'larından türetildi.
     3) AYRAK: marka+menü satırıyla yasal satır arasında 1px ayraç; ek DOM
        YOK — grid'in ::before'u ızgara öğesi olarak 3. satıra konur.
        content YALNIZ bu media bloğunda tanımlı olduğundan 768 altında
        pseudo-element hiç kutu üretmez (mobil bit-eşliği).

     Dürüstlük kanonu: rozet/sertifika/üyelik/ödeme logosu/adres/telefon/
     sosyal hesap eklenmedi — tüm metin tr.json'da mevcut içerikten gelir.

     Izgara: satır1 logo | menü, satır2 açıklama | menü(devam),
             satır3 ayraç (tam genişlik), satır4 telif | destek. */
  .footer-note{
    display:grid;grid-template-columns:minmax(0,1fr) auto;column-gap:56px;row-gap:0;
    align-items:start;text-align:start;max-width:var(--shell);margin-inline:auto;
    padding:40px var(--pad) 36px;
    background:linear-gradient(180deg,#eef4ff,#f7faff);
    border-top:1px solid var(--pe-border);
    box-shadow:inset 0 14px 26px -20px rgba(9,16,51,.16)
  }
  /* ==== ASIL HATA: masaüstünde footer İÇERİĞİ hiç boyanmıyordu ====
     app.js'in REVEAL_SELECTORS listesinde `.footer-note>*` var: her footer
     çocuğuna .reveal (opacity:0) eklenir ve ancak IntersectionObserver
     kesişince .is-revealed ile 1'e çıkar. Observer'ın rootMargin'i
     '0px 0px -8% 0px' — yani kökün ALT %8'i ölü bant. Footer sayfanın EN
     dibinde olduğundan, sayfa sonuna kadar kaydırıldığında footer'ın alt
     satırları bu ölü banda düşer ve HİÇBİR ZAMAN kesişmez.
     Mobilde sorun yok: body{padding-bottom:96px} (sticky CTA payı) footer'ı
     96px yukarı iterek ölü bandın dışında tutuyor. 768+ katmanında sticky
     bar gizlenip body{padding-bottom:0} yapıldığı için o yastık kayboluyor —
     hata tam olarak burada doğuyor.
     ÖLÇÜM (normal motion, sayfa sonuna kaydırıldı, HEAD d0d317e dist'i):
       1440 → logo=0 desc=0 support=0 copyright=0   (DÖRT ÇOCUK DA GÖRÜNMEZ)
        768 → logo=1 desc=0 support=1 copyright=0
        430 → hepsi 1 (mobil sağlam)
     Yani masaüstünde footer, içeriği hiç boyanmayan boş bir bant olarak
     duruyordu; ürün sahibinin "footer gözükmüyor" geri bildiriminin
     birincil sebebi budur (düşük kontrast ikincil sebep).
     ÇÖZÜM: kapanış bloğunun giriş animasyonuna ihtiyacı yok — 768+'ta footer
     çocukları reveal'dan muaf tutulur, her zaman görünür. Özgüllük
     (0,2,0) > .reveal (0,1,0), bu yüzden katman sırasından bağımsız kazanır;
     .reveal.is-revealed de zaten aynı değeri verdiğinden çakışma yok.
     Mobil (<768) DEĞİŞMEZ: orada reveal akışı çalışmaya devam eder. */
  .footer-note>.reveal{opacity:1;transform:none}

  .footer-note::before{content:'';grid-column:1/-1;grid-row:3;height:1px;background:var(--pe-border);margin:26px 0 18px}
  .footer-logo{grid-column:1;grid-row:1}
  .footer-logo img{height:30px}
  .footer-desc{grid-column:1;grid-row:2;margin:12px 0 0;max-width:360px}

  /* Çapa menüsü: sağa yaslı dikey liste, marka bloğunun iki satırını kapsar */
  .footer-nav{grid-column:2;grid-row:1/span 2;display:flex;flex-direction:column;align-items:flex-end;gap:9px}
  /* Bağlantı görünümü .plan-report-link precedent'i: sessiz renk ailesi,
     alt çizgi YALNIZ :hover/:focus-visible'da. Odak halkası
     .hero-miniplan/.plan-report-link ile aynı (Task 2/Task 4 precedent). */
  .footer-nav a{color:#3a4564;font-size:13.5px;font-weight:750;line-height:1.5;text-decoration:none;border-radius:6px;transition:color .16s ease}
  .footer-nav a:hover{color:var(--pe-blue-dark);text-decoration:underline;text-underline-offset:3px}
  /* Tam yoğunluk (nihai inceleme I-1): .45 alfa footer'ın #f7f9ff zemininde
     2.05:1 veriyordu; #0f55ff aynı zeminde 5.30:1. */
  .footer-nav a:focus-visible{outline:3px solid var(--pe-blue);outline-offset:3px}

  /* Yasal satır: telif solda, destek (mailto) sağda */
  .footer-note>.footer-small:last-child{grid-column:1;grid-row:4;margin:0}
  .footer-support{grid-column:2;grid-row:4;margin:0;justify-self:end;text-align:end}
  .footer-support a{text-decoration:underline;text-underline-offset:3px;text-decoration-thickness:1px;text-decoration-color:rgba(0,60,199,.4);border-radius:6px;transition:text-decoration-color .16s ease}
  .footer-support a:hover{text-decoration-color:currentColor}
  /* :focus-visible kuralı TABAN katmana taşındı (nihai inceleme I-2) —
     buradaki kopya mobili kapsamadığı için silindi. */
}

/* ==== Ara bant: 768-999 — paket kartları hâlâ tek kolon ====
   3 kolon bu bantta kartı 218.7px'e sıkıştırıp maddeleri 2-3 satıra kırıyordu;
   kartlar mobil akış davranışını korur, yalnız ortalanıp biraz genişler. */
@media (min-width:768px) and (max-width:999.98px){
  .plan-grid{max-width:560px;margin-inline:auto;gap:18px}
}

/* ==== Masaüstü katmanı: paket kartları 3 kolon (1000+) ====
   768+ katmanından buraya taşındı (bkz. yukarıdaki gerekçe). min-width:0 şart:
   aksi halde grid item'ların min-content genişliği 1fr paylarını eşitsiz
   şişirip kabuğu taşırıyor. align-items:stretch + kart flex-column: Starter ve
   Core eşit yükseklikte, buton grubu margin-top:auto ile karta yaslanır. */
@media (min-width:1000px){
  .plan-grid{grid-template-columns:repeat(3,1fr);gap:24px;align-items:stretch}
  .plan-grid .plan-card{min-width:0;display:flex;flex-direction:column}
  .plan-grid .plan-card>ul{margin-bottom:0}
  .plan-grid .plan-card>.btn{margin-top:auto}
  /* Eşit 3 kolonda ad+fiyat yan yana sığmıyor; dar kartta üst üste istifle */
  .plan-grid .plan-top{flex-direction:column;align-items:flex-start;gap:4px}
  /* Dar kartta mutlak konumlu "Seçildi" rozeti, uzun "EN ÇOK TERCİH EDİLEN"
     etiketinin üzerine biniyordu; akışa alıp doğal satır kaydırmasına bırak.
     align-self:flex-start — kart flex-column olduğu için akışa alınan çip de
     varsayılan `stretch` ile tam genişliğe gerilirdi. */
  .plan-grid .plan-card.is-selected .selected-mark{position:static;display:inline-flex;margin:0 0 8px;margin-inline-end:8px;vertical-align:top;align-self:flex-start}
  /* Rozet gerilme hatası (Task 9): .badge{display:inline-flex} kart
     display:flex;flex-direction:column olunca flex item'a dönüşüyor ve
     align-items verilmediği için varsayılan `stretch` ile geriliyordu —
     ölçüldü: 1280/1440'ta 338.7px'lik kartta rozet 298.7px, yani içerik
     genişliğinin TAMAMI. Rozet bir pill değil, tam genişlik başlık bandı
     oluyordu. Rozet metinleri değişmez. */
  .plan-grid .plan-badge{align-self:flex-start;width:max-content;max-width:100%}
  /* Seçim mikro-kalkışı 3 kolonda KAPALI (Task 4 düzeltme turu). Taban katmandaki
     `.plan-card.is-selected{transform:translateY(-3px)!important}` seçili kartı 3px
     yukarı itiyor; tek kolonda zararsız ama üç kartın hizalandığı kompozisyonda
     seçili kartın üst VE alt kenarını 3px kaydırıyor — Starter'ın simetrik ±12px
     taşmasını 15/9'a bozan da buydu (ölçüldü). Seçim zaten 4px halka + renkli
     gölge + "Seçildi" pill ile üç ayrı kanaldan bildiriliyor; 3px'lik kayma
     algılanabilir bir sinyal değil ama hizayı ölçülebilir şekilde bozuyor.
     Özgüllük taban kuraldan yüksek (0,3,1 > 0,2,0), ikisi de !important. */
  .plan-grid .plan-card.is-selected{transform:none!important}
  /* Base artık TAM YÜKSEKLİĞE UZAR (eski `align-self:start` SİLİNDİ, Task 4
     düzeltme turu). Kart kısa kaldığında üç kartın alt kenarı üç ayrı hizada
     bitiyordu — ürün sahibi bunu "kutuların ölçüsü farklı" olarak okudu.
     Artık ızgaranın `align-items:stretch`'i Base'i de kapsar, `.btn`'in
     margin-top:auto'su CTA grubunu (buton + not + rapor linki) kart tabanına
     yaslar; dolayısıyla ÜÇ KARTIN da CTA grubu ve alt kenarı aynı hizada.

     Artık yükseklik TEK BİR DELİĞE yığılmaz — Task 9'un haklı endişesi buydu.
     Fazla alan yalnızca VİTRİN bölgesine (.plan-channels) verilir ve orada iki
     esnek bölgeye bölünür. Bölge seçimi kasıtlı: rozet ızgarasının ÜSTÜNDEKİ
     saç teli (.plan-logos border-top) üç kartta zaten hizalı (ölçüldü: base
     334.5 / starter 331.4 / core 332.4) — esnemeyi bu çizginin ALTINDA tutmak
     üç kartın ortak nirengi noktalarını (fiyat, erişim çipi, madde listesi,
     vitrin çizgisi) bozmadan bırakır.

     Logolar ŞİŞMEZ: ızgara SATIRI uzar (minmax(32px,1fr)) ama align-items:center
     logoyu kendi doğal yüksekliğinde tutup satırın ortasına oturtur — yani
     fazlalık "logolar arası nefes payı" olur, "gerilmiş logo" değil (genişlik
     tablosu zaten sabit, height:auto). İstatistik şeridi esnemez; logo yığınının
     altında kendi doğal yüksekliğinde durur.

     Task 7: esneyen ızgara dört metin rozetinden ÜÇ LOGOYA geçti; satır sayısı
     4 -> 3 olduğu için grid-template-rows da 3'e indi. Yığının doğal alt sınırı
     3x32 + 2x14 (row-gap) = 124px, yani 1080+'ta dolduracağı ~195px'in çok
     altında — flex:1 1 auto boşluğu eskisi gibi eritiyor, delik kalmıyor
     (ölçüldü: Base=Core her bantta 0.0px). */
  .plan-grid .plan-base>.plan-channels{flex:1 1 auto;display:flex;flex-direction:column}
  .plan-grid .plan-base .plan-logos-row{flex:1 1 auto;
    grid-template-rows:repeat(3,minmax(32px,1fr))}
}

@media (min-width:1080px){
  :root{--pad:48px;--shell:1160px}

  /* 4 adımlı süreç: tek satırda 4 kolon. --steps-cycle: gezen nokta VE node
     ışımaları TEK bu süreden beslenir (aşağıda .steps-dot ve step-glow-*
     animasyonları var(--steps-cycle) kullanır) — aksi halde iki animasyon
     bağımsız sürelerle drift edip senkronu kaybederdi. */
  .steps-timeline{grid-template-columns:repeat(4,1fr);--steps-cycle:6s}

  /* Adım kolonu v2 (Ascend ortalanmış model): node üstte ortada, altında
     tag/başlık/açıklama dikey istiflenir. text-align:center burada tek
     kural — .step-copy ve içindeki tag/başlık/açıklama miras alır, ayrı
     kural gerekmez. */
  .step{flex-direction:column;align-items:center;text-align:center;gap:16px}

  /* Adım çizgisi v2: yalnız node satırından geçer — yalnız 1080+'ta gösterilir
     (768-1079'daki 2x2 ızgarada tek yatay çizgi anlamsız, o katman çizgisiz
     kalmaya devam eder; yukarıdaki 768+ .steps-timeline:before{display:none}
     bu katmanda geri açılır).
     top:24px = 48px node'un düşey merkezi (yükseklik/2) — node .step'in üst
     kenarına hizalı kaldığı için (flex-direction:column, justify-content
     varsayılan flex-start) bu değer satır-düzeninden değişmeden kalır.
     left/right: kolon ORTALANMIŞ olduğundan node merkezi artık kolonun
     kendi merkezi. 4 eşit grid kolonunda (column-gap:28px, satır ~597)
     kolon genişliği=(100% - 3×28px)/4, kolon merkezinin kenara uzaklığı=
     kolon_genişliği/2 = %12.5 - 10.5px — simetrik geometri olduğu için
     ilk/son kolon aynı formülü paylaşır (Playwright boundingBox ile
     doğrulandı, bkz. task-8-report: node merkezleri ile çizgi uçları
     ±1px içinde örtüşüyor). */
  .steps-timeline:before{display:block;inset-inline:calc(12.5% - 10.5px);top:24px;bottom:auto;width:auto;height:2px;background:#e3e9f5}
  /* transform-origin MANTIKSAL DEĞİL: dolum LTR'de sol, RTL'de sağ kenardan
     büyümeli. calc ile tek kaynaktan — LTR: 50% - 50%×1 = 0% = left. */
  .steps-timeline:after{content:"";position:absolute;inset-inline:calc(12.5% - 10.5px);top:24px;height:2px;background:linear-gradient(90deg,var(--pe-blue),var(--pe-green));transform-origin:calc(50% - 50% * var(--dir)) center;transform:scaleX(0);transition:transform 900ms cubic-bezier(.65,0,.35,1)}
  .steps-timeline.is-revealed:after{transform:scaleX(1)}

  /* Gezen nokta: dolum çizgisinin üstünde sürekli akan parlak nokta. .steps-dot
     çizgiyle AYNI left/right/top formülünü paylaşan sıfır-yükseklik bir "ray"
     kutusu (width:auto = çizgi uzunluğu); görünen nokta bu kutunun ::before'u,
     kutunun sol kenarına sabit. Kutunun KENDİSİ translateX(0→100%) ile kendi
     genişliği kadar (=çizgi uzunluğu) kayar — % değeri elemanın kendi kutusuna
     göre çözüldüğü için nokta tam çizgi başından sonuna gider, sarar. Yalnız
     normal motion'da var (reduce'da .steps-dot{display:none} — bkz. 768+reduce
     birleşik blok, satır ~985): reduce'da nokta yok, çizgi statik tam-dolu
     (mevcut güvence, satır ~804, dokunulmadı). z-index:2 çizgi/dolumun
     (z-index:auto) üstünde kalmasını garanti eder. */
  .steps-dot{display:block;position:absolute;inset-inline:calc(12.5% - 10.5px);top:24px;height:0;z-index:2;pointer-events:none;will-change:transform;animation:steps-dot-travel var(--steps-cycle) linear infinite}
  .steps-dot:before{content:"";position:absolute;inset-inline-start:0;top:0;width:8px;height:8px;margin:-4px 0 0;margin-inline-start:-4px;border-radius:50%;background:#fff;box-shadow:0 0 0 2px rgba(15,85,255,.35),0 0 10px 3px rgba(15,85,255,.55)}
  /* Nokta yolculuğu %0→%88'de biter (fix, desktop-polish-3 task-1): eskiden
     transform yalnız 0%/100%'de tanımlıydı (tek segment, TÜM döngü boyunca
     doğrusal), bu da node4'ün GEOMETRİK varışını %100'e denk düşürüyor,
     dolayısıyla fade-out'a (eski %94-100) sığması için ışıma erken (%85-87)
     çekiliyordu — "nokta varmadan node4 yanıyor" hissi buradan geliyordu.
     Şimdi transform 88%'de de tanımlı: 0→88% aralığı translateX(0→100%)
     (tek doğrusal segment, ray'i baştan sona kat eder), 88→100% aralığı
     translateX(100%)→translateX(100%) (İKİ UÇ AYNI DEĞER = düz/hold segment,
     nokta node4 üstünde sabit kalır) — bkz. üstteki yorum, "hold segment"
     tam olarak budur. opacity ayrı zaman dizisiyle enterpolе olur (0%,6%,96%,
     100%) — 96% burada step-glow-*'ün ortak "hold" bitişiyle (yeni 96%,
     aşağıda) senkron: nokta sönümü ile node resetleri AYNI 96→100% aralığında
     birlikte gerçekleşir ("tümü tamam" ardından ortak sıfırlanma). */
  /* RTL (T3): nokta yolculuğu ASİMETRİKTİR — ray'i satır-başından satır-sonuna
     kat eder. --dir işareti çevirir; LTR'de 100% × 1 = 100%, yani çıktı birebir
     eski değer. Ayrı bir RTL keyframe kopyası YAZILMADI (iki ayrı bakım riski). */
  @keyframes steps-dot-travel{
    0%{transform:translateX(0);opacity:0}
    6%{opacity:1}
    88%{transform:translateX(calc(100% * var(--dir)))}
    96%{opacity:1}
    100%{transform:translateX(calc(100% * var(--dir)));opacity:0}
  }

  /* Node cilası: daire 36→48px, ikon 17→22px, hafif mavi glow halkası */
  .step-node{flex:0 0 48px;width:48px;height:48px;box-shadow:0 0 0 6px rgba(15,85,255,.08)}
  .step-node .ic{width:22px;height:22px}

  /* İkon ışıma senkronu (yeniden zamanlandı, desktop-polish-3 task-1): nokta
     bir node'a vardığında o ikon kısa bir vuruşla parlar (PULSE) ve döngü
     sonuna dek yanık kalır (LIT). Varış yüzdeleri artık .steps-dot'un YENİ
     iki-segmentli hareketinden türetiliyor (üstteki steps-dot-travel yorumu):
     translateX(0→100%) yalnız %0→%88 aralığında doğrusal, %88'den sonra
     sabit (hold). Node merkezleri ray uzunluğunun %0/33.3/66.7/100'ünde
     olduğundan (4 eşit kolon, satır ~868-874 ile aynı geometri), her node'un
     GERÇEK varış anı artık positionFraction × %88:
       node1: 0 × 88 = %0  → nokta zaten %6'da tam görünür oluyor (opacity
              fade-in, steps-dot-travel), o yüzden fiili tetik %6 (0'dan
              erken yanamaz, görünmeyen bir noktanın "varışı" anlamsız).
       node2: (1/3) × 88 = %29.333 → %29.3
       node3: (2/3) × 88 = %58.667 → %58.7
       node4: (3/3) × 88 = %88 → nokta tam bu yüzdede ray'in sonuna ulaşıp
              hold'a giriyor; node4 ARTIK NOKTA GERÇEKTEN ÜZERİNDEYKEN yanıyor
              (eski hata: geometrik varış %100'dü ama ışıma %85-87'ye
              çekilmişti — "erken yanma" hissi buradan geliyordu).
     Her node aynı 3 durak deseniyle akar: base% (varış, idle→pulse başlangıcı)
     → peak=base+2% (beyaz halka flaş, en parlak an) → settle=base+5% (kalıcı
     LIT halka). settle noktasından itibaren TÜMÜ %96'ya kadar sabit yanık
     kalır (eskiden %94 — dot'un yeni opacity fade-in/out zaman dizisiyle
     (steps-dot-travel: 6%,96% opacity1) hizalanmak için ötelendi), böylece
     node4'ün settle'ı (%93) ile ortak reset başlangıcı (%96) arasında ~%3'lük
     bir pencerede DÖRDÜ BİRDEN yanık görünüyor ("tümü tamam" anı korunur).
     %96→%100 aralığında hem nokta opacity'si hem dördü de settle→idle'a
     birlikte söner (ortak sıfırlanma, dot'un translateX hold'u da %100'e
     dek sürdüğünden konum sıçraması olmaz). Dördü de var(--steps-cycle) +
     linear kullanır — nokta ile aynı süre/easing/gecikme tabanı, drift olmaz.
     box-shadow'un HER durakta aynı 3 katman sayısını koruması şart: farklı
     katman sayısı arasında tarayıcı ara-değer üretemeyip sertçe atlar.
     Tetikleyici kurallar (.step:nth-child(N) .step-node{animation:...}) BURADA
     değil, aşağıdaki ayrı "1080+ ve no-preference" bloğunda (satır ~800) —
     .step:nth-child(N) .step-node seçicisi .step-node'dan daha özgül olduğu
     için reduce bloğundaki düz .step-node{animation:none} onu YENEMEZ; tek
     güvenli çözüm tetikleyiciyi reduce'da hiç eşleştirmemek. */
  @keyframes step-glow-1{
    0%,6%{background:#fff;border-color:var(--pe-blue);color:var(--pe-blue);box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
    8%{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 3px #fff,0 0 0 10px rgba(15,85,255,.45),0 0 22px 6px rgba(15,85,255,.5);transform:scale(1.08)}
    11%,96%{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.16),0 10px 22px 0 rgba(15,85,255,.26);transform:scale(1)}
    100%{background:#fff;border-color:var(--pe-blue);color:var(--pe-blue);box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
  }
  @keyframes step-glow-2{
    0%,29.3%{background:#fff;border-color:var(--pe-blue);color:var(--pe-blue);box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
    31.3%{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 3px #fff,0 0 0 10px rgba(15,85,255,.45),0 0 22px 6px rgba(15,85,255,.5);transform:scale(1.08)}
    34.3%,96%{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.16),0 10px 22px 0 rgba(15,85,255,.26);transform:scale(1)}
    100%{background:#fff;border-color:var(--pe-blue);color:var(--pe-blue);box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
  }
  @keyframes step-glow-3{
    0%,58.7%{background:#fff;border-color:var(--pe-blue);color:var(--pe-blue);box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
    60.7%{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 3px #fff,0 0 0 10px rgba(15,85,255,.45),0 0 22px 6px rgba(15,85,255,.5);transform:scale(1.08)}
    63.7%,96%{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.16),0 10px 22px 0 rgba(15,85,255,.26);transform:scale(1)}
    100%{background:#fff;border-color:var(--pe-blue);color:var(--pe-blue);box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
  }
  @keyframes step-glow-4{
    0%,88%{background:var(--pe-green);border-color:var(--pe-green);color:#fff;box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
    90%{background:var(--pe-green);border-color:var(--pe-green);color:#fff;box-shadow:0 0 0 3px #fff,0 0 0 10px rgba(20,184,106,.45),0 0 22px 6px rgba(20,184,106,.5);transform:scale(1.08)}
    93%,96%{background:var(--pe-green);border-color:var(--pe-green);color:#fff;box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(20,184,106,.16),0 10px 22px 0 rgba(20,184,106,.26);transform:scale(1)}
    100%{background:var(--pe-green);border-color:var(--pe-green);color:#fff;box-shadow:0 0 0 0 rgba(255,255,255,0),0 0 0 6px rgba(15,85,255,.08),0 0 0 0 rgba(15,85,255,0);transform:scale(1)}
  }

  /* 1080+'ta kart genişliği ad+fiyatın yan yana sığması için yeterli; 768 katmanındaki
     istifleme sadece dar aralıkta gerekliydi, burada orijinal yan yana düzene dön */
  .plan-grid .plan-top{flex-direction:row;justify-content:space-between;align-items:flex-start;gap:14px}
  .plan-grid .plan-card.is-selected .selected-mark{position:absolute;inset-inline-end:14px;top:14px;margin:0}

  /* Starter (öne çıkan kart) SİMETRİK taşar — transform:translateY(-12px) SİLİNDİ
     (Task 4 düzeltme turu). Eski tek yönlü kaydırma kartı 12px yukarı itiyordu:
     üst kenarı komşularının 12px üstünde, ALT kenarı 12px ALTINDA kalıyordu ve
     göz bunu "Core daha uzun" diye okuyordu — ürün sahibinin 1440 ekran
     görüntüsündeki şikâyeti tam olarak buydu.
     margin-block:-12px yerine geçer: ızgara satırı içinde kart hem yukarı hem
     aşağı 12px büyür (stretch edilen yükseklik = satır + 24). Sonuç kasıtlı
     okunur bir kompozisyon: Base ve Core'un alt kenarı BİREBİR aynı hizada,
     Starter ikisinin de üstünden ve altından eşit taşar.
     transform DEĞİL margin kullanılır: transform yalnız boyamayı kaydırıp
     layout'u yerinde bıraktığı için alt kenar hizası hiçbir zaman düzelmezdi.
     `.plan-starter.is-selected` transform override'ı da SİLİNDİ — artık taban
     `.plan-card.is-selected{translateY(-3px)}` seçim mikro-kalkışı üç kartta da
     aynı şekilde çalışır (durum göstergesi, yerleşim değil). */
  .plan-grid .plan-starter{margin-block:-12px}

  /* Alt bilgi: aynı 4 satırlı ızgara, geniş kabukta daha rahat nefes —
     yapı 768+ katmanında kurulur, burada yalnız ölçüler açılır (Task 5). */
  .footer-note{column-gap:88px;padding:52px var(--pad) 46px}
  .footer-note::before{margin:32px 0 22px}
  .footer-desc{max-width:420px}
  .footer-nav{gap:11px}
}

/* Işıma tetikleyicileri (satır ~752'deki not): .step:nth-child(N) .step-node
   .step-node'dan daha özgül olduğundan, aşağıdaki reduce bloğundaki düz
   .step-node{...} kuralı animation'ı YENEMEZ — tek güvenli çözüm, tetikleyiciyi
   reduce eşleşmesin diye burada ayrı, no-preference'a bağlı bir blokta tutmak.

   Faz senkronu (Fix 4, final-fix-wave): çizgi dolumu reveal-gated'ken
   (.steps-timeline.is-revealed:after, satır ~865) nokta/ışıma 5 animasyonu
   sayfa yüklenir yüklenmez, scroll'dan bağımsız başlıyordu — bölüm görünüme
   girdiğinde döngünün rastgele bir fazında (ölçüm: 6s'lik döngüye 2264.8ms
   içeride) yakalanıp çizgiyle senkronsuz kalıyordu. Düzeltme: 5 animasyonun
   TAMAMI (nokta + 4 ışıma) varsayılan olarak duraklatılır; yalnız
   .steps-timeline'a is-revealed eklendiğinde (app.js IntersectionObserver,
   çizginin scaleX(1) tetikleyicisiyle AYNI class) çalışmaya başlarlar — ikisi
   artık aynı olayla aynı anda, fazın başından (0%) tetikleniyor. Bu ikinci
   fayda: ekran dışındayken 4 ışımanın arka plan/box-shadow repaint maliyeti
   de durur (bu 4'ü sayfadaki tek non-composited sonsuz animasyonlardı).
   Reduce'da bu blok hiç eşleşmediği için (yukarıdaki not) reduce hâlâ
   tamamen animasyonsuz kalır — pause/run çifti kasıtlı olarak SADECE bu
   no-preference bloğunda tutulur, ungated bir yere taşınmaz. */
@media (min-width:1080px) and (prefers-reduced-motion:no-preference){
  .steps-dot{animation-play-state:paused}
  .step:nth-child(2) .step-node{animation:step-glow-1 var(--steps-cycle) linear infinite;animation-play-state:paused}
  .step:nth-child(3) .step-node{animation:step-glow-2 var(--steps-cycle) linear infinite;animation-play-state:paused}
  .step:nth-child(4) .step-node{animation:step-glow-3 var(--steps-cycle) linear infinite;animation-play-state:paused}
  .step:nth-child(5) .step-node{animation:step-glow-4 var(--steps-cycle) linear infinite;animation-play-state:paused}
  /* :nth-child 2.-5. (1. değil): .steps-timeline'ın ilk çocuğu artık
     .steps-dot (satır ~722), gerçek adımlar 2.-5. çocuk sırasında. */
  .steps-timeline.is-revealed .steps-dot{animation-play-state:running}
  .steps-timeline.is-revealed .step-node{animation-play-state:running}
}

/* Adım çizgisi dolumu yalnız 1080+'ta var olduğu için güvence de aynı katmana
   bağlı (mevcut 768+reduce birleşik-sorgu deseniyle tutarlı, bkz. satır ~757).
   JS reduceMotion=true iken .is-revealed hiç eklenmediğinden (app.js reveal
   bloğu koşullu), bu kural olmadan dolum kalıcı scaleX(0)'da (görünmez) kalır —
   burada class'tan bağımsız olarak dolumu sabit tam-dolu (scaleX(1)) yapar.
   Aynı mantıkla node ışımaları da statik "tamamlanmış" haline sabitlenir —
   animasyonsuz (tetikleyici yukarıdaki no-preference bloğunda olduğu için
   burada zaten hiç eşleşmez), step-glow-*'ün LIT durağıyla aynı değerler
   (satır ~755-778). */
@media (min-width:1080px) and (prefers-reduced-motion:reduce){
  .steps-timeline:after{transition:none;transform:scaleX(1)}
  .step-node{background:var(--pe-blue);border-color:var(--pe-blue);color:#fff;box-shadow:0 0 0 6px rgba(15,85,255,.16),0 10px 22px rgba(15,85,255,.26)}
  .step:last-child .step-node{background:var(--pe-green);border-color:var(--pe-green);color:#fff;box-shadow:0 0 0 6px rgba(20,184,106,.16),0 10px 22px rgba(20,184,106,.26)}
}

/* ==== Masaüstü katmanı: sahneler ==== */
@media (min-width:768px){
  /* Hero: iki kolon (metin / foto) + altta tam genişlik özellik şeridi.
     DOM sırası korunur; görsel sıra grid-template-areas ile kurulur. */
  /* 8. tur düzeltmesi: metin kolonu 58fr→64fr'a genişledi — İngilizce gibi
     Türkçe'den daha uzun çeviri metinlerinde hero-title 5 satıra kadar
     sarıyordu (bkz. hero-title punto notu, aşağıda). */
  .hero{display:grid;align-content:center;column-gap:44px;padding:56px var(--pad) 60px;
    grid-template-columns:minmax(0,64fr) minmax(0,36fr);
    grid-template-areas:"kicker photo" "title photo" "lead photo" "cta photo" "mini photo" "rotator rotator"}
  .hero-kicker{grid-area:kicker;justify-self:start}
  .hero-title{grid-area:title;margin-top:20px}
  .hero-lead{grid-area:lead}
  .hero-cta{grid-area:cta}
  /* Hero plan çipleri 768+ (8. tur — "sil baştan, sade ama premium modern"):
     taban katmandaki düz/ince-kenarlı tek şerit (bkz. taban .hero-plans)
     burada yalnız BÜYÜR — gradyan/gölge/ayrı köşe YENİDEN eklenmiyor, aksi
     halde taban katmandaki düzleştirme boşa giderdi. text-transform yalnız
     SUNUM: metin içeriği tr.json'da olduğu gibi kalır. */
  .hero-plans{grid-area:mini;margin-top:20px}
  /* Üstteki 34px sekmeye yer açar. Sekme yalnız orta sütunda olsa da PADDING
     ÜÇÜNDE DE aynı, yoksa fiyatlar hizasını kaybederdi. */
  .hero-miniplan{padding:34px 14px 22px;gap:3px}
  .hero-plan-name{font-size:10.5px;font-weight:900;line-height:1;letter-spacing:.11em;
    text-transform:uppercase;color:#8a94ae}
  .hero-plan-price{font-size:22px;line-height:1;letter-spacing:-.04em;margin-top:2px;white-space:nowrap}
  /* Beyaz kart sekmenin ALTINDAN başlar (26px): rozet artık kutu çizgisinin
     üzerine BİNMİYOR, üstünde ayrı duruyor. Sekme 4..24px, kart 26px'ten
     aşağısı — aralarında 2px net boşluk var.
     RTL: sekmenin yatay ortalaması translate gerektiriyor (mantıksal özellikle
     ifade edilemez), --dir çarpanı işareti çevirir. */
  .hero-miniplan-pop:after{inset:26px 6px 6px;border-radius:14px}
  .hero-miniplan-pop .hero-plan-name{color:#8a94ae;font-weight:900}
  .hero-plan-tab{display:block;position:absolute;top:4px;inset-inline-start:50%;
    transform:translateX(calc(-50% * var(--dir)));z-index:2;
    background:#eaf0ff;border:1px solid #d3e0ff;border-radius:999px;
    padding:3px 9px;font-size:8px;font-weight:900;letter-spacing:.05em;
    text-transform:uppercase;color:var(--pe-indigo);white-space:nowrap;
    /* Sekme sütundan bir tık TAŞABİLİR: 768'de sütun 140px kalıyor ve Almanca
       rozet ("Am häufigsten gewählt") 135px istiyor. Taşan pay komşu sütunun
       ortalanmış metnine değmiyor, yalnız boş kenarına uzanıyor. */
    max-width:calc(100% + 14px);overflow:hidden;text-overflow:ellipsis}
  .hero-plans-note{padding:11px 18px}
  /* Foto: 451px'lik gerçek boyutu tavan (Constraint 7); kolonda dikey ortalanır,
     scene-bleed ile kabuğun sağ kenarına akar (blend-flush maskesi sağda kesim ister). */
  .hero-collage{grid-area:photo;align-self:center;margin-top:0}
  .hero-photo{width:min(451px,100%)}
  /* Kaynak görselin üst ~95px'i düz beyaz; object-position özneyi yukarı çeker
     (42 sabit — 45'i geçme, çene alt kesime yaklaşır). Maskenin dikey bileşeni de
     kısalır ki kısalan üst erime bandı yeniden boşluk açmasın (yatay bileşen —
     blend-flush'ın sağda erimesiz kenarı — dokunulmadan kalır). */
  .hero-photo img{object-position:50% 42%}
  .hero-photo{
    -webkit-mask-image:linear-gradient(to right,transparent 0,#000 12%,#000 100%),linear-gradient(to bottom,transparent 0,#000 5%,#000 94%,transparent 100%);
    mask-image:linear-gradient(to right,transparent 0,#000 12%,#000 100%),linear-gradient(to bottom,transparent 0,#000 5%,#000 94%,transparent 100%)}

  /* Rotator 768+: animasyon yok — üç özellik tek satırda, eşit üç kolon halinde statik.
     Sol kolona sığmadığı için (doğal satır genişliği ~670px) iki kolonun altına tam
     genişlik şerit olarak yerleşir; böylece her masaüstü genişliğinde üçü yan yana durur.
     Ayraç: oluğun ortasına mutlak konumlanmış boş content'li pseudo-element (Task 2'de
     4px daireden 1px dikey saç çizgisine döndü) — metin taşımadığı için ekran okuyucuya
     hiçbir koşulda sızmaz (liste ayrıca aria-hidden). */
  /* Güven satırı cilası (desktop-polish-3 / Task 2): metinler DEĞİŞMEZ,
     yalnız sunum. Üç değişiklik:
     1) Yüzey — düz rgba(255,255,255,.95) yerine çiplerle AYNI beyaz→açık mavi
        degrade + üstte 1px iç beyaz ışık; hero'nun alt sınırı artık çip
        satırıyla tek aileden okunuyor.
     2) İkon — dolu mavi disk (taban .ic-circle) masaüstünde açık mavi zemin +
        1px halka + koyu mavi glif'e döner: .plan-reach ve .faq summary::after
        ile aynı idiom, ince tipografinin yanında "çıkartma" gibi durmuyor.
     3) Hizalama/ayraç — her öğe kendi 1fr kolonunda ORTALANIR (li kutusu
        gerilmiş kalır, bu yüzden ayracın oluk-ortası matematiği bozulmaz) ve
        4px'lik nokta yerine uçları eriyen 1px dikey saç çizgisi kullanılır. */
  .hero-rotator{grid-area:rotator;height:auto;border-radius:18px;margin-top:32px;padding:14px 18px;
    background:linear-gradient(180deg,#fff 0%,#f4f8ff 100%);border-color:#e3ebff;
    box-shadow:inset 0 1px 0 #fff,0 12px 30px rgba(9,16,51,.08)}
  .hero-rotator ul{--rot-gap:24px;animation:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));column-gap:var(--rot-gap);align-items:center;padding:0}
  .hero-rotator li{position:relative;height:auto;padding:0;gap:10px;font-size:13px;line-height:1.35;
    justify-content:center;letter-spacing:-.005em;color:var(--pe-navy)}
  .hero-rotator li:last-child{display:none}
  .hero-rotator li .ic-circle{flex-basis:26px;width:26px;height:26px;background:#eaf1ff;
    color:var(--pe-blue-dark);box-shadow:inset 0 0 0 1px #d3e1ff}
  .hero-rotator li .ic-circle .ic{width:14px;height:14px;stroke-width:2.1}
  .hero-rotator li+li:before{content:"";position:absolute;inset-inline-start:calc(-1*var(--rot-gap)/2 - .5px);top:50%;width:1px;height:24px;background:linear-gradient(180deg,rgba(185,203,240,0) 0%,#b9cbf0 30%,#b9cbf0 70%,rgba(185,203,240,0) 100%);transform:translateY(-50%)}

  /* AP güven şeridi 768+ (Task 11, 8. tur düzeltmesi): eskiden "rotator rotator"
     gibi İKİ kolonu birden kaplıyordu (foto sütununun altına kadar) — kullanıcı
     bunun gereksiz geniş durduğunu belirtti. Artık yalnız metin kolonunu
     ("aptrust ." — sağ hücre boş) kaplıyor, kutu da width:fit-content ile
     içeriği kadar daralıp justify-self:center ile o kolonda ortalanıyor. */


  /* Sahne blokları: metin bir kolon, mockup/kolaj diğer kolon; dikey ortalı.
     768-1079'da metin kolonu bir tık geniş (56/44): "Arama Sonuçlarında" satırı
     38px'te 364px ister, 55/45'te kolona 3px sığmayıp tek kelimeye düşüyordu. */
  .scene-grid{grid-template-columns:minmax(0,56fr) minmax(0,44fr);column-gap:40px;align-items:center}
  .phone-stage{margin:0}
  .serp-stage .phone{width:min(300px,100%)}

  /* Koyu AI bloğu 768+: kabuğun dışına taşıp ekran genişliğine yayılır, içerik kabuk
     ölçüsünde kalır (padding'i kabuk kenarına hizalanır). body'de overflow-x:clip —
     100vw dikey kaydırma çubuğunu da saydığı için yatay çubuk doğmasın; clip,
     hidden'ın aksine kaydırma konteyneri yaratmaz, sticky/fixed davranışı bozulmaz. */
  body{overflow-x:clip}
  .block-ai{margin-inline:calc(50% - 50vw);padding-inline:max(var(--pad),calc(50vw - var(--shell)/2 + var(--pad)));padding-block:56px 64px}

  /* AI sahnesi: zigzag — mockup solda, metin sağda (DOM sırası değişmeden) */
  .block-ai .scene-grid{grid-template-columns:minmax(0,46fr) minmax(0,54fr);grid-template-areas:"stage copy"}
  .block-ai .scene-copy{grid-area:copy}
  .block-ai .phone-stage{grid-area:stage}
  .block-ai .phone{width:min(320px,84%)}

  /* Rozetler: mockup artık tam genişlik yerine kolon içinde durduğu için, mobildeki
     "telefonun dış kenarına taşan cam rozet" oranını korumak üzere bir tık küçülürler
     (1080+'ta kolon genişleyince orijinal ölçülerine döner). */
  .phone-badge{gap:8px;padding:8px 11px;border-radius:13px}
  .phone-badge b{font-size:11px}
  .phone-badge span{font-size:10px}

  /* Garantili yayın (Task 3): bölüm tek gride iner — metin+punch+cta sol
     kolonda üstte/altta 1fr boşluk satırlarıyla dikey ortalanır, kolaj sağ
     kolonda 5 satırın tümünü kaplar. DOM sırası değişmez (.scene-grid
     display:contents ile kutusunu bırakır, çocukları doğrudan bölüm gridine
     katılır); punch/cta bu bölümde sola hizalanır (diğer bölümlerin ortalı
     punch'ına dokunulmaz — seçici yalnız .block-guaranteed kapsamında). */
  .block-guaranteed{display:grid;grid-template-columns:minmax(0,52fr) minmax(0,48fr);column-gap:44px;grid-template-rows:1fr auto auto auto 1fr;grid-template-areas:". scene" "copy scene" "punch scene" "cta scene" ". scene"}
  .block-guaranteed .scene-grid{display:contents}
  .block-guaranteed .scene-copy{grid-area:copy}
  /* 9. tur: eski .guaranteed-scene yerine .phone-stage (bkz. yukarısı) aynı
     "scene" grid-area'sına oturuyor; justify-items:end zaten .phone-stage'in
     taban kuralında (googleRisk/aiVisibility ile ortak). */
  .block-guaranteed .report-scene{grid-area:scene;align-self:center;margin:0}
  /* Sahnenin iç kompozisyonu artık @container rs-scene ile yönetiliyor
     (bkz. .rs-* bloğu); burada yalnız sahnenin grid içindeki yeri belirlenir. */
  .block-guaranteed .punch{grid-area:punch;text-align:start;margin:26px 0 0}
  .block-guaranteed .cta-row{grid-area:cta;margin:20px 0 0;justify-content:start}

  /* Google görünürlüğü (Task 4): trust-list tam kabuk genişliğinde telefonun
     altına giriyordu, telefon kolonunda 300px kalıp sağda ~150px boş
     bırakıyordu. Bölüm tek gride iner: metin üstte solda, telefon sahnesi
     sağda (iki satır boyunca), trust-list metin altında solda dar kolonda,
     punch en altta tam genişlik satırda. DOM sırası değişmez (.scene-grid
     display:contents ile kutusunu bırakır, çocukları doğrudan bölüm gridine
     katılır — yalnız .block-google kapsamında, genel .scene-grid grid'i
     diğer bölümlerde etkin kalır). */
  .block-google{display:grid;grid-template-columns:minmax(0,55fr) minmax(0,45fr);column-gap:64px;grid-template-areas:"copy stage" "trust stage" "punch punch";align-items:start}
  .block-google .scene-grid{display:contents}
  .block-google .scene-copy{grid-area:copy}
  .block-google .serp-stage{grid-area:stage;align-self:center}
  .block-google .trust-list{grid-area:trust;margin:22px 0 0}
  .block-google .punch{grid-area:punch;margin-top:34px}

  /* Telefon büyütmesi (Fix 1, final-fix-wave): 1080+'a taşındı (bkz. o katman
     altındaki not) — 768-1079 arasında telefon ölçeksiz kalır. Ölçüm: 1.34
     scale + transform-origin:right center sol kenardan içeri (kopya kolonuna)
     büyüyordu; 768'de 28.4px, 790'da 19.6px, 810'da 13.2px glyph mürekkebi
     kopya sütununun altında kalıyordu (830+'ta temizdi — dar aralık ~55/45
     kolon oranında kopya sütunu yalnızca ~288px). */

  /* Canlı rapor akışı: satır token'ı büyür (44→52px), pencere 5 satıra çıkar
     (calc(var(--row-h)*5) — keyframe'ler --row-h'e bağlı olduğu için akış
     otomatik ölçeklenir, ayrı bir keyframe seti gerekmez). Panel artık 920px'te
     kapanıp ortalanır (1160px kabukta serbest bırakılınca aşırı geriliyordu,
     Task 6); kolonlar bu ölçüye göre yeniden dengelenir — kaynak (logo) kolonu
     daha da daralır, kategori metni genişler; logo yüksekliği daha ferah
     panelle orantılı büyütülür. */
  .report-panel{max-width:920px;margin-inline:auto}
  .report-rows-viewport{--row-h:52px;height:calc(var(--row-h) * 5)}
  .report-rows-track .report-row{font-size:14.5px}
  /* 8. tur: 5. kolon (trafik) eklendi — kaynak biraz daha da daraldı (.62→.52),
     kategori (zaten küçültülmüş punto, bkz. .report-category) biraz daralttı,
     trafiğe kendi payı (.5fr) ayrıldı. */
  .report-row{grid-template-columns:minmax(0,.52fr) minmax(0,.85fr) minmax(0,.6fr) minmax(0,.5fr) minmax(0,.5fr);gap:14px;padding-inline:20px}
  .report-traffic{display:block;font-weight:700;color:var(--pe-navy);font-variant-numeric:tabular-nums}
  .report-traffic.report-traffic-unknown{color:#a7aec0;font-weight:400}
  /* Başlık hücresi yalnız görünürlük değiştirir — punto/renk zaten
     .report-row-head'den miras (diğer 4 başlıkla aynı stil, bkz. yukarısı). */
  .report-traffic-head{display:block}

  /* Medya logo marquee: track/logo ölçüleri ~1.25x büyür (kayan davranış aynen
     sürer — network-scroll translateX(-50%) zaten yüzdesel, px'e kilitli
     değil). Süre aynı oranda uzatılır ki içerik genişleyince hız algısı sabit
     kalsın (px/sn değişmez). --pad zaten token olduğu için bleed hiçbir
     değişiklik gerektirmeden çalışmaya devam eder.
     Task 11: temel süreler (57s/63.2s — yukarıdaki ".block-network" bloğu
     başındaki yoruma bkz.) burada da aynı ×1.25 ilişkisiyle taşınır:
     30s/38s → 37.5s/47.5s idi; şimdi 57s/63.2s → 71.3s/79.0s.
     Network bandı revizyonu: temel süreler 92.2s/85.5s'e taşınınca (yukarıdaki
     ".block-network" bloğu başındaki yoruma bkz.) 768+ karşılıkları da aynı
     ×1.25 ilişkisiyle güncellendi: 92.2×1.25≈115.3s, 85.5×1.25≈106.9s.
     5 mecralık ek genişletme (Financial Post, National Post, Montreal Gazette,
     ADVFN, The Daily Press): temel süreler 110.5s/96.2s'e taşınınca (yukarıdaki
     ".block-network" bloğu başındaki yoruma bkz.) 768+ karşılıkları da aynı
     ×1.25 ilişkisiyle güncellendi: 110.5×1.25≈138.1s, 96.2×1.25≈120.3s.
     Task 12 (Postmedia çıktı / Financial Times girdi / AP büyüdü): temel süre
     110.5s→115.3s'e taşındı (yukarıdaki ".block-network" yorumundaki ölçüme bkz.),
     768+ karşılığı aynı ×1.25 ilişkisiyle: 115.3×1.25≈144.1s. Track 2 hiç
     değişmediği için 120.3s aynen korundu.
     Task 15 (bant sadeleştirildi — altı mecra çıktı, StreetInsider.com track 2'den
     track 1'e taşındı): temel süreler 81.8s/84.8s'e indi (yukarıdaki
     ".block-network" bloğu başındaki ölçüme bkz.), 768+ karşılıkları aynı ×1.25
     ilişkisiyle: 81.8×1.25≈102.3s, 84.8×1.25≈106.0s. */
  .network-track{animation-duration:111.4s}
  .network-track--rev{animation-duration:113.0s}
  .network-set{gap:58px;padding-inline-end:58px}
  .network-logo svg{height:30px}
  /* Task 12: AP 20→28px — taban katmanındaki 16→22 büyütmesinin 768+
     karşılığı, yine USA Today ile eşitlenerek (96px → 134.4px genişlik). */
  .network-logo--ap svg{height:28px}
  .network-logo--usatoday svg{height:28px}
  .network-logo--yahoonews svg{height:25px}
  .network-logo--gm svg{height:20px}
  .network-logo--barchart svg{height:19px}
  .network-logo--buffalonews svg{height:20px}
  .network-logo--torontosun svg{height:19px}
  .network-logo--province svg{height:19px}
  .network-logo--calgaryherald svg{height:20px}
  .network-logo--kttc svg{height:20px}
  .network-logo--nationalpost svg{height:19px}
  .network-logo--montrealgazette svg{height:19px}
  .network-logo--cbs19 svg{height:25px}
  .network-logo--foxillinois svg{height:23px}
  .network-logo--abc12 svg{height:23px}
  /* MASKE AİLESİ (nihai inceleme I-5): bant logo yükseklik tablosu elle iki
     yerde sürdürülüyor (taban: ".network-logo svg{height:24px}" + 12 özel
     kural; burada: 30px + aynı 12 kural, ×1.25 ilişkisiyle. Task 15'te
     --startribune ve --financialtimes satırları iki tablodan da düştü:
     ikisinin de banttaki tek kullanımı kalktı, 14 → 12). Maske tabanlı 5
     mecra (.network-logo .logo-mask--*, taban katmanda) bu 768+ tablosuna hiç
     yazılmamıştı: 390 ile 1440 arasında bayt-eş kalıyor, SVG kardeşleri
     büyürken maskeler yerinde sayıyordu. Sonuç, bandın optik yayılımı mobilde
     1.60× iken masaüstünde 1.88×'e açılıyordu (Digital Journal 16px, AP 28px —
     aynı satırda yarı ağırlıkta okunuyordu).
     Değerler kardeş tablonun AYNI ×1.25 ilişkisi: 17→21, 16→20, 20→25.
     KAPSAM: seçici .network-logo ile başlıyor, yani YALNIZ bant. Plan
     kartlarındaki aynı maskeler (.plan-logos-row .logo-mask--benzinga/--dj,
     genişlikle boyutlanır) ve Task 13'te ayarlanan AP/Benzinga/Globe and Mail
     değerleri ETKİLENMEZ — ölçümle doğrulandı (final-fix-report §I-5). */
  .network-logo .logo-mask--benzinga{height:21px}
  .network-logo .logo-mask--dj{height:20px}
  .network-logo .logo-mask--si{height:20px}
  .network-logo .logo-mask--windsorstar{height:25px}
  .network-logo .logo-mask--financialpost{height:20px}
  .network-word{font-size:21px}
}

/* Hareket azaltma + 768+ birleşik durumu: yukarıdaki sahne katmanı aynı seçicilere
   (.report-rows-viewport, .network-set) sabit yükseklik/gap değeri atıyor ve dosyada
   satır 432/326'daki fallback kurallarından SONRA geldiği için, 768px'te reduced-motion
   fallback'i sessizce ezilir (satır adı eşit özgüllükte, sonraki kural kazanır).
   Rapor: bant 33 satıra çıktıktan sonra (Task 11) height:auto ile tümü kesilmeden
   statik açılıyordu — panel 1280'de 560'tan 2016px'e (+%21 sayfa yüksekliği)
   şişiyordu (final-fix-wave incelemesi). Düzeltme: satırlar HÂLÂ tümü DOM'da/
   erişilebilir kalır (kesilmez/gizlenmez), yalnız pencere max-height:calc(var(--row-h)*8)
   ile 8 satıra kapaklanıp overflow-y:auto ile kaydırılabilir kılınır — 33 satırın
   tamamına klavye/fare/dokunmatik kaydırmayla erişilebilir, panel artık sınırsız
   büyümez. Ağ: sarmalanmış statik satırın gap/padding'i marquee değerine dönmesin.
   Task 6'da burada sabit 5 kolonlu bir grid vardı (`repeat(5,minmax(0,1fr))`); Task 7'nin
   bant revizyonuyla track başına öğe sayısı 9-10'dan 14'e çıkıp uzun word-fallback'ler
   eklenince (ör. "Peace River Record-Gazette", 27 karakter) `minmax(0,1fr)` kolonları
   `.network-word`'ün `white-space:nowrap` metnini kendi hücresine sığdıramadı ve metin
   komşu hücrelere taşarak üst üste bindi (768-1440 tamamında, inceleme bulgusu). Düzeltme:
   sabit kolonlu grid yerine, tabandaki (<768, satır ~352) mobil reduce kuralıyla AYNI
   `flex-wrap` deseni — her öğe kendi doğal genişliğinde akar, sığmayınca satır sarar,
   metin asla komşu öğeye taşmaz. `.network-logo{flex:0 0 auto}` (satır 338) zaten
   flex-wrap ile uyumlu. Dup set'in gizlenme kuralı (üstteki genel reduce bloğu,
   `.network-set[data-dup]`) öznitelik seçici olduğu için burada da daha özgül kalıp
   gizli kalmaya devam eder; yalnız görünen set akar, çakışma yok. */
@media (min-width:768px) and (prefers-reduced-motion:reduce){
  .report-rows-viewport{height:auto;max-height:calc(var(--row-h) * 8);overflow-y:auto}
  .network-set{display:flex;flex-wrap:wrap;justify-content:center;align-items:center;gap:26px 30px;padding-inline-end:0}
  /* Gezen nokta yalnız 1080+'ta var olur (satır ~725); temel katmanda zaten
     display:none (satır ~508, bkz. o satırdaki not). Burada 768+reduce ile
     eşleşen üst kümede AYRICA söndürülür: 1080+'ta reduce ile birlikte
     nokta tamamen kalkar, çizgi statik tam-dolu kalır (satır ~804, node
     ışımaları da statik yanık — dokunulmadı). */
  .steps-dot{display:none}
}

@media (min-width:1080px){
  .hero{column-gap:56px;padding:52px var(--pad) 60px;grid-template-columns:minmax(0,62fr) minmax(0,38fr)}
  /* Geniş ekranda oluk açılır; 768-1079'da sarma riski olduğu için (üçüncü
     öğe orada iki satıra iniyor) tipografi bumpı yalnız BU katmanda. */
  .hero-rotator{padding:16px 22px}
  .hero-rotator ul{--rot-gap:40px}
  .hero-rotator li{font-size:13.5px;gap:11px}
  .hero-miniplan{padding:38px 14px 26px}
  .hero-plan-price{font-size:30px}
  .hero-miniplan-pop:after{inset:28px 8px 8px}
  .scene-grid{grid-template-columns:minmax(0,55fr) minmax(0,45fr);column-gap:64px}
  .block-ai .scene-grid{grid-template-columns:minmax(0,42fr) minmax(0,58fr)}
  .phone-badge{gap:9px;padding:9px 12px;border-radius:15px}
  .phone-badge b{font-size:12px}
  .phone-badge span{font-size:10.5px}

  /* Telefon sağ boşluğu doldurur (Fix 1, final-fix-wave: 768+'tan buraya
     taşındı — 768-1079'da kopya kolonuna 28.4px'e varan glyph örtmesi ölçüldü,
     bkz. yukarıdaki 768+ .block-google bloğundaki not). CSS-mockup olduğu için
     raster büyütme yasağı kapsamı dışında (global kısıt madde 2).
     transform-origin:right center ile sağ kenardan büyür — kolon/kabuk sağ
     kenarıyla hizalı kalır, taşmaz. Gölge, büyümüş silüetle dengeli kalsın
     diye hafif derinleştirilir. */
  /* transform-origin MANTIKSAL DEĞİL: ölçek, kabuğun SATIR-SONU kenarına
     kilitli kalmalı. LTR: 50% + 50%×1 = 100% = right. */
  .block-google .serp-stage .phone{transform:scale(1.34);transform-origin:calc(50% + 50% * var(--dir)) center;box-shadow:0 22px 52px rgba(0,0,0,.38)}

  /* Rozet telafisi: .phone-badge, .phone'un DEĞİL .serp-stage'in (ortak üst
     kapsayıcı) mutlak konumlanmış çocuğudur — transform yalnız kendi
     torunları için taşıyıcı blok kurar, kardeşi etkilemez. phone %34
     ölçeklenince sağ kenar sabit kalır (transform-origin:right) ama dikey
     merkezden büyüdüğü için üst/alt kenar her yönde (scale-1)/2×391px≈66px
     kayar; rozetler eski (ölçeksiz) kenar konumunda sabit kalıp telefonun
     içine gömülür. Rozetlerin kendisi ölçeklenmez (yalnız yeniden konumlanır)
     — bu yüzden backdrop-filter blur yarıçapı (8px) değişmeden kalır, orantısı
     bozulmaz. 391px, bu bölümün 768-1440 arası sabit .phone yüksekliğidir
     (width:min(300px,...) hiçbir katmanda büyümüyor); üst/alt ofsetler o
     ölçüye göre elle hesaplanmıştır. Bu kurallar yalnız 1080+'ta etkindir;
     768-1079'da .phone ölçeksiz olduğu için rozetler taban (ölçeksiz) top/
     bottom değerlerini kullanmaya devam eder (satır ~368/460). */
  .block-google .serp-stage .phone+.phone-badge{top:-76px}
  .block-google .serp-stage .phone-badge+.phone-badge{bottom:-74px}

  /* ==== Garantili yayın sahnesi: zigzag + kolaj yeniden kurgusu ====
     (desktop-polish-3 / Task 8) — YALNIZ 1080+; 768-1079 ve mobil bit-eş kalır.

     Sorun (ürün sahibi): "Dağıtım Değil / Garantili Yayın" ile "Markanızın
     İtibarı / Arama Sonuçlarında Başlar" bölümlerinin İKİSİ de solda yazı /
     sağda görsel; ikisinin görseli de dikey, koyu çerçeveli bir telefon
     silüeti. Alt alta gelen iki neredeyse aynı kompozisyon göz yoruyor.

     Çözüm iki parçalı:

     (1) ZIGZAG — bu bölümde sahne SOL kolona, metin SAĞ kolona geçer. Sayfa
         ritmi böylece garantili(görsel sol) → google(görsel sağ) →
         ai(görsel sol) olur. DOM SIRASI DEĞİŞMEZ: 768+ katmanındaki
         `.scene-grid{display:contents}` kurgusu (bkz. o katmandaki not)
         korunur, yalnız grid-template-areas aynalanır. Kolon oranı 56/44'ten
         44/56'ya döner — sayısal olarak metin kolonu AYNI genişlikte kalır
         (1280/1440'ta 564px), yani başlık/paragraf satır kırılmaları
         değişmez, yalnız yer değiştirir.
         Erişilebilirlik: sahne `aria-hidden="true"` ve içinde yalnız iki
         `<figure><img alt="">` var — odaklanabilir öğe, metin veya bağlantı
         YOK. Erişilebilirlik ağacında hiç görünmediği için görsel sıra ile
         DOM sırasının ayrışması ne okuma ne de odak sırasını bozar; klavye
         sırası kopya → punch → cta olarak kalır.

     (2) 9. tur: kolaj artık gerçek HTML .phone-stage (bkz. yukarısı) — raster
         tuval/maske hesapları (eski guaranteed-photo/guaranteed-cards) tamamen
         KALKTI. Yalnız korunan şey sayfa ritmi: bu bölüm google/ai'dan farklı
         olarak sahneyi SAĞ değil SOL kolona alıyordu (aynalı grid-template-areas)
         — o görsel ritim burada da bilinçli olarak sürdürülüyor, .phone-stage
         sola geçiyor, metin sağa. */
  /* 10. tur: sahne kolonu 44fr→50fr — yeni katmanlı kompozisyon dar kolonda
     okunmuyordu (telefon içi metin ~8px'e iniyordu). */
  .block-guaranteed{grid-template-columns:minmax(0,50fr) minmax(0,50fr);
    grid-template-areas:"scene ." "scene copy" "scene punch" "scene cta" "scene ."}

}

/* Dil değiştirici — topbar'da logonun yanında. Tek dil yayındayken build
   bu bloğu hiç üretmez (bkz. build.js deriveMeta > langSwitch), dolayısıyla
   bu kurallar yalnız ikinci dil geldiğinde devreye girer.
   2026-08-28 spec (3. tur): eski <nav><a> listesi (kod/endonim responsive
   toggle, yatay kaydırma) native <select>'e taşındı — tek kapalı kutu her
   dil sayısında sabit genişlikte kaldığı için o karmaşıklığın hiçbirine
   gerek kalmadı; tarayıcının kendi açılır listesi kullanılıyor. */
.lang-select{max-width:130px;padding:7px 10px;border-radius:8px;border:1.5px solid var(--pe-border);background:#fff;color:var(--pe-text);font-size:13px;font-weight:600;cursor:pointer}
.lang-select:hover{border-color:var(--pe-muted)}
.lang-select:focus-visible{outline:3px solid var(--pe-blue);outline-offset:2px}

/* Meta Pixel onay bandı (assets/js/meta.js). Karar verilene kadar görünür,
   Pixel yüklenmez. Reddet ve Kabul et eşit ağırlıkta (ikisi de tek tık).
   Sabit çubuğun (z 50) ve WhatsApp düğmesinin (z 51) üstünde durur. */
.consent-bar{position:fixed;left:50%;transform:translateX(-50%);bottom:12px;z-index:60;
  width:calc(100% - 24px);max-width:560px;padding:14px 16px;border-radius:14px;
  background:var(--pe-navy);color:#fff;box-shadow:0 18px 50px rgba(3,9,40,.35);
  display:flex;flex-direction:column;gap:12px}
.consent-bar[hidden]{display:none}
.consent-text{margin:0;font-size:13px;line-height:1.5;font-weight:400}
.consent-actions{display:flex;gap:8px;justify-content:flex-end}
.consent-btn{flex:1 1 0;min-height:40px;padding:8px 14px;border-radius:10px;cursor:pointer;
  font:inherit;font-size:13px;font-weight:700;border:1px solid rgba(255,255,255,.55);
  background:transparent;color:#fff}
.consent-btn-accept{background:#fff;color:var(--pe-navy);border-color:#fff}
.consent-btn:focus-visible,.footer-consent-link:focus-visible{outline:3px solid var(--pe-gold);outline-offset:2px}
@media (min-width:768px){
  .consent-bar{flex-direction:row;align-items:center}
  .consent-actions{flex:0 0 auto}
  .consent-btn{flex:0 0 auto}
}
.footer-consent-link{padding:0;border:0;background:none;font:inherit;color:inherit;
  text-decoration:underline;cursor:pointer}
