/* ═══════════════ GÖKYÜZÜ KATMANI — indexdesign.md Faz 1 ═══════════════
   Yukarıdaki hiçbir satır düzenlenmedi; her şey bu çitin içinde EKLENDİ.
   Tasarım kilitlenince core/tokens.css'e taşınacak (§2.1). */

:root{
  /* Kâğıt & mürekkep — §4.1 tablosu */
  /* 2026-08-06: kâğıt bir tık beyazlatıldı (istek). Sıcak kırık-beyaz karakteri
     kaybolmasın diye üç kanal eşit açılmadı, sarı ucu korunarak yükseltildi. */
  /* "Çok sarımsı" geri bildirimi: sorun parlaklık değil DOYGUNLUKTU. Önceki
     tonlarda R−B farkı 9/6 idi, gözde sarı okuyordu. Hem açıldı hem sarı ucu
     kısıldı: R−B artık 4/2 — kâğıt hissi duruyor, sarılık gidiyor. */
  --kagit-taban:#F5F4F1;     /* #EAE6DE → #F1EDE6 → #F6F3ED → şimdi */
  --kagit-merkez:#FCFCFA;    /* geniş radyal gradyanla merkeze doğru açılır */
  --murekkep:#0A0A0A;        /* saf #000 değil — baskıda saf siyah sertçe durur */
  --sky-gren:.06;            /* §4.4 · .05–.09 arası ayarlanabilir */
}

/* Eski atmosfer — SİLİNMEDİ, gizlendi (§3).
   ⚠️ Buradaki "nebula" ana sayfanın CSS gradyanı (.nebula-bg) + JS'in bastığı
   55 adet .star div'i — VİDEO DEĞİL. Nebula VİDEOSU 04.09.2026'da projeden
   tamamen kaldırıldı (kullanıcı kararı): eleman, denetleyici, CSS ve script
   etiketleri silindi, bu yüzden video seçicileri de bu satırdan çıkarıldı.
   Sadece display:none yetmez: 55 element ve 55 CSS animasyonu çalışmaya devam
   ederdi ve §4.5'in "aynı anda 60 animasyonlu element" bütçesi tek başına dolardı.
   Bu yüzden #stars'a data-sky="off" eklendi, üreteç IIFE'si oradan erken çıkıyor. */
.nebula-bg,.stars{display:none!important}

/* §5 — dört katman, hepsi <body>'nin DOĞRUDAN çocuğu.
   position:fixed, transform/filter/perspective taşıyan bir atanın içinde kırılır;
   .shell'in içine konsalardı sayfa kaydıkça gökyüzü de kayardı. */
.sky-paper,.sky-canvas,.sky-stars,.sky-grain{
  pointer-events:none;
}
/* 🔴 İKİ FARKLI DAVRANIŞ (2026-08-06: "arka plan kaydırmada sabit kalmasın").
   SABİT kalanlar — kâğıt ve gren: kâğıt zeminin TONU, gren ile vinyet ise
   EKRANIN dokusu/kenar solması. Bunlar kayarsa ton sayfa boyunca dalgalanır
   ve vinyet ortalarda bir yerde asılı kalır.
   KAYANLAR — toz ve yıldızlar: gökyüzünün kendisi. Belge boyunca uzanıyorlar,
   böylece aşağı inildikçe yeni yıldızlar görünüyor.
   İkisi ayrılmasaydı ya tonu ya da yeni yıldızları kaybederdik. */
.sky-paper,.sky-grain{position:fixed;inset:0}
.sky-canvas,.sky-stars{position:absolute;top:0;left:0;width:100%}
/* 🔴 2026-08-18 EKLENDİ — footer'ın altında kalıcı boşluk hatası (mobil).
   .sky-stars/.sky-canvas-k'nin height'ı belge yüksekliğine (dh) kilitli
   ama İÇLERİNDEKİ bant kapları (core/sky.js bantKonum) kasıtlı olarak
   kendi diliminden TAŞIYOR — komşu bant sınırındaki büyük parıltılar
   kırpılmasın diye (bantPay). Belge dh'nin tam katı olmadığında SON
   bandın bu payı, kabın kendi height'ının (=dh) ÖTESİNE taşıp belgenin
   kaydırılabilir alanını dh'den fazla uzatıyordu — footer'ın altında
   boş bir şerit (ölçüldü: masaüstünde 278px, mobilde 134px).
   overflow:hidden bu taşmayı KABIN KENDİ SINIRINDA keser: [0,dh] aralığı
   dışına hiçbir şey sızmaz. İçerideki gerçek yıldız KONUMLARI zaten
   [0,dh) ile sınırlı (core/sky.js → nokta()), yani kırpılan yalnızca bu
   taşma payı — görünür hiçbir yıldız gövdesi kesilmiyor. */
.sky-stars,.sky-canvas-k{overflow:hidden}
/* 🔴 KATMAN MODELİ — gökyüzü NEGATİF z-index'te. §5'ten bilinçli sapma.
   Brief'in önerdiği yol (gökyüzü 0–3, içerik 10+) önce aynen uygulandı ve
   YETMEDİ: bu model içeriğin z-index'ine BAĞIMLI. Sayfada .shell'in içinde
   yığınlama bağlamı yaratan bir sürü şey var (nav'da position:sticky +
   backdrop-filter, .fade-in'de opacity:0 + transform, kartlarda
   backdrop-filter) ve bunlardan biri araya girdiğinde sıra sessizce bozuluyor.
   Negatif z-index bağımlılığı tamamen kaldırır: negatif katmanlar KÖK
   elemanın arka planı ile normal akıştaki TÜM içeriğin ARASINA boyanır.
   Artık .shell'in z-index'i ne olursa olsun içerik üstte kalır.
   ⚠️ Şartı: body'nin arka planı ŞEFFAF olmalı — negatif z-index'li bir çocuk
   ebeveyninin arka planının ALTINDA kalır. Kâğıdın taban rengi bu yüzden
   html'de duruyor (geçici blokta --bg), body'de değil. */
/* 🔴 FİKİR 3 — KÂĞIT GRADYANI KÖK ELEMANA TAŞINDI (2026-08-08).
   .sky-paper position:fixed bir katmandı ve sabit katmanlar CİHAZ
   çözünürlüğünde rasterize ediliyor: iPhone 15'te 393×852×3²×4 ≈ 12 MB.
   Yıldız tuvallerini dpr 1'e kilitlemiştik ama arkalarındaki bu katman
   dpr 3'te duruyordu — gökyüzünün en pahalı tek parçası oydu.

   Gradyan artık html'de. Kök elemanın arka planı tuvale yayılır ve NEGATİF
   z-index'li çocukların ALTINA boyanır — yani piksel piksel aynı sonuç,
   fazladan katman yok. (body'ye konsaydı gökyüzünü örterdi; negatif z-index'li
   çocuk ebeveyninin arka planının altında kalır. Kural aynı, eleman farklı.)
   background-attachment:fixed şart: gradyan ekrana çapalı kalmalı, belgeyle
   kaymamalı — .sky-paper'ın position:fixed'i tam bunu yapıyordu.

   ⚠️ .sky-paper elemanı ve sınıfı SİLİNMEDİ, yalnızca boyayacak bir şeyi
   kalmadı. Boyaması olmayan eleman doku ayırmaz; sınıf/eleman silmeme
   kuralı da bozulmuş olmuyor. */
:root{
  /* ⚠️ SEÇİCİ 'html' DEĞİL ':root' — ÖZGÜLLÜK MESELESİ.
     index.html'in kendi <style>'ı sky.css'ten SONRA yükleniyor ve içinde
     'html{background:var(--bg)}' var. 'html' (0,0,1) ile yazsaydık o satır
     kazanır, gradyan sessizce kaybolurdu — sayfa düz zeminle açılırdı ve
     hiçbir test görmezdi. ':root' (0,1,0) kaynak sırasından bağımsız
     kazanıyor. Aşağıdaki koşum bunu ayrıca sınıyor. */
  background:radial-gradient(ellipse 130% 110% at 38% 30%,
    var(--kagit-merkez) 0%, var(--kagit-taban) 68%) fixed;
}
.sky-paper{ z-index:-4 }
/* Yükseklikleri JS ölçüp px olarak yazıyor — belge yüksekliği yüzdeyle
   çözülmez (body'nin yüksekliği auto). */
/* 🔴 #skyCanvas ARTIK ÇİZİLMİYOR — bant tuvalleri devraldı (2026-08-07).
   Eleman duruyor: genişlik ölçümü buradan okunuyor, id'si de korunmalı.
   Yükseklik 0, piksel yok.
   Çizim .sky-canvas-k kabındaki bant tuvallerinde; kap AYNI z katmanında,
   böylece toz + sabit parıltılar canlı yıldızların altında kalmaya devam
   ediyor (kâğıt < toz < yıldız < gren sırası bozulmadı). */
.sky-canvas{z-index:-3;display:block}
.sky-canvas-k{position:absolute;top:0;left:0;width:100%;z-index:-3;display:block}
/* Bant tuvali: top/height JS'ten px olarak yazılıyor (taşma payı dâhil). */
.sky-bant-cv{position:absolute;left:0;width:100%;display:block}
.sky-stars {z-index:-2;display:block}

/* ── BANTLAR (Faz D performans mimarisi) ──
   .sky-stars artık tek dev <svg> DEĞİL, bant bant <svg> tutan bir kap.
   Her bant ekran yüksekliğinde ve kendi kutusu var — IntersectionObserver
   ancak gerçek bir kutuyu izleyebilir, bu yüzden <g> değil <svg>.
   overflow:visible şart: bant sınırına yakın büyük parıltılar kırpılmasın. */
.sky-bant{position:absolute;left:0;width:100%;overflow:visible;display:block}

/* 🔴 FİKİR 1 — HER CANLI YILDIZ KENDİ KATMANINDA (2026-08-08).
   Bant kabı artık <div>; içindeki yıldızların her biri bağımsız bir <svg>.
   Sebebi: SVG alt ağacı compositor'a devredilemez, tek boyama birimidir —
   ortak <svg> içindeyken 15 noktacığın opaklığı için bandın TAMAMI her
   karede yeniden boyanıyordu. Bağımsız eleman olunca opacity/transform
   animasyonu saf compositor işi: boyama sıfır. */
.sky-canli{position:absolute;display:block;overflow:visible}

/* will-change YALNIZCA görünen bantta.
   Her yıldıza serpilseydi belgedeki 70+ eleman birden katmana terfi eder,
   kazandığımız boyamayı bellekte geri öderdik. Görünür bantla sınırlıyken
   aynı anda ~20-30 küçük katman oluyor — compositor için rahat aralık.
   (Etkin bir opacity animasyonu zaten çoğu motorda kendiliğinden terfi
   ettirir; bu satır garantiyi ekliyor, tek başına şart değil.) */
.sky-bant.gorunur .sky-canli{will-change:opacity}
.sky-bant.gorunur .sky-canli.gezer{will-change:opacity,transform}

/* Parıltı yolunun tanımı — görünmez, yalnızca <use> hedefi. */
.sky-defs{position:absolute;width:0;height:0;overflow:hidden}

/* 🔴 GÖRÜNMEYEN BANT TİKLEMEZ.
   animation:none DEĞİL, play-state:paused — animasyon nesnesi yaşıyor,
   yalnızca ilerlemiyor. none olsaydı bant göründüğünde animasyon baştan
   başlar ve negatif gecikmelerin kurduğu faz dağılımı bozulurdu; tüm bant
   aynı anda nabız atardı (index2 geliştirilirken yaşandı). */
.sky-bant:not(.gorunur) *{animation-play-state:paused}

/* 🔴 FİKİR 2 — KAYDIRIRKEN HİÇBİR ŞEY TİKLEMEZ.
   Bant kapısı "görünmeyeni durdur" diyordu; bu da "kaydırırken görüneni de
   durdur" diyor. İkisi birlikte: animasyon yalnızca sayfa DURURKEN ve
   yalnızca GÖRÜNEN bantta çalışıyor.
   Görsel sonuç: kaydırma boyunca titreme donuyor. Faz korunduğu için
   durduktan sonra sıçramadan devam ediyor. */
html.sky-kayiyor .sky-stars *{animation-play-state:paused}
.sky-grain {z-index:-1}

/* §5'in "içerik z-index 10+" maddesi yine de uygulandı: negatif katmanlarla
   artık gerekli değil ama .shell'i 1'de bırakmak, ileride pozitif z-index'li
   bir katman eklenirse aynı tuzağı geri getirirdi. */
.shell{z-index:10}

/* Gren ile vinyet AYNI katmanda ama AYRI pseudo-elemanlarda: opacity elemanın
   tamamına uygulanır, ikisi tek elemanda olsaydı vinyet de .07'ye düşerdi. */
.sky-grain::before,.sky-grain::after{content:'';position:absolute;inset:0}
.sky-grain::before{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)'/%3E%3C/svg%3E");
  /* 🔴 mix-blend-mode KALDIRILDI (2026-08-07, kaydırma tökezlemesi).
     Harmanlama modu, compositor'ın bu tam ekran sabit katmanı öylece
     kaydırmasını engeller: her karede ARKASINDAKİNİ OKUYUP yeniden
     harmanlaması gerekir. Kaydırma jank'inin başlıca kaynağıydı.
     Görsel kayıp yok denecek kadar az: %7 opaklıkta koyu gren, açık kâğıt
     üstünde multiply ile normal arasında gözle ayırt edilemiyor.
     Opaklık .07 → .06'ya çekildi, multiply'ın hafif koyulaştırma etkisi
     böylece dengelendi. */
  opacity:var(--sky-gren);
}
/* Kenar solması — en fazla %4 koyulaşma (§4.4/2). Abartılırsa ucuz durur. */
.sky-grain::after{
  background:radial-gradient(ellipse 76% 70% at 50% 46%,
    transparent 58%, rgba(10,10,10,.04) 100%);
}

/* Üç kademe de aynı dört köşeli parıltı — yalnızca ölçek farklı.
   (T1 toz canvas'ta, SVG'de değil.) */
.sky-stars use{fill:var(--murekkep)}

/* §4.5 — SADECE opacity. transform/filter animasyonu yok, will-change serpme yok.
   2026-08-06: "arka plan ölü duruyor" geri bildirimi üzerine sönme derinleşti.
   Eskiden kendi opaklığının %25'ine iniyordu — hiç kaybolmuyor, sadece
   soluyordu. Şimdi %5'e iniyor ve orada KISA BİR SÜRE DURUYOR (%42–%58):
   yıldız gerçekten yok oluyor, sonra geri beliriyor. Düz sinüs geçişte bu
   "yokluk" anı olmadığı için göz hareketi bir bütün olarak algılamıyordu. */
@keyframes sky-titre{
  0%,100%{opacity:var(--o,.6)}
  42%    {opacity:calc(var(--o,.6) * .05)}
  58%    {opacity:calc(var(--o,.6) * .05)}
}
.sky-canli.titrer{
  animation:sky-titre var(--sure,7s) ease-in-out infinite;
  animation-delay:var(--gec,0s);   /* NEGATİF — yoksa hepsi aynı anda nabız atar */
}

/* ── YER DEĞİŞTİREN YILDIZLAR ──
   "Bir yerde sönüp bir yerde belirsin" isteği. Numara şu: sıçrama opaklık
   TAM SIFIRKEN oluyor (%30→%34 ve %80→%84 arası), bu yüzden göz hareketi
   görmüyor — yıldız bir yerde kayboluyor, başka bir yerde beliriyor.
   Hedef her yıldız için ayrı: --dx/--dy JS'te tohumlu üretiliyor ve ekran
   dışına taşmayacak şekilde kırpılıyor.
   ⚠️ Brief §4.5 "transform animasyonu yok" diyordu; bu bilinçli sapma.
   translate compositor'da çalışır, layout tetiklemez — yer değiştirmenin
   cx/cy animasyonuyla yapılması ise her karede yeniden boyama demekti. */
@keyframes sky-gez{
  0%  {opacity:var(--o,.6); transform:translate(0,0)}
  30% {opacity:0;           transform:translate(0,0)}
  34% {opacity:0;           transform:translate(var(--dx,0),var(--dy,0))}
  55% {opacity:var(--o,.6); transform:translate(var(--dx,0),var(--dy,0))}
  80% {opacity:0;           transform:translate(var(--dx,0),var(--dy,0))}
  84% {opacity:0;           transform:translate(0,0)}
  100%{opacity:var(--o,.6); transform:translate(0,0)}
}
/* Süre ve gecikme .titrer'den miras — SADECE keyframe adı değişiyor.
   Özgüllük bilerek (0,3,0): kaynak sırasına bağlı kalmasın. */
.sky-canli.titrer.gezer{ animation-name:sky-gez }
/* T4'ün 2-3 tanesinde çok hafif scale serbest (§4.5 son madde).
   transform-box:fill-box olmadan SVG'de ölçek başlangıcı viewBox'ın sol üstüdür
   ve yıldız yerinden kayar; burada kendi merkezinden ölçekleniyor. */
@keyframes sky-nabiz{
  0%,100%{opacity:1;transform:scale(1)}
  46%    {opacity:.12;transform:scale(.90)}
  56%    {opacity:.12;transform:scale(.90)}
}
.sky-canli.nabiz{
  transform-box:fill-box;transform-origin:50% 50%;
  animation:sky-nabiz var(--sure,9s) ease-in-out infinite;
  animation-delay:var(--gec,0s);
}

@media (prefers-reduced-motion: reduce){
  .sky-stars *{ animation:none !important; }
}
/* ═══════════════ GÖKYÜZÜ KATMANI SONU ═══════════════ *