/* ============================================================================
   Kidlio Tanıtım Sitesi — Tasarım Sistemi v2
   MAVİ marka · Quicksand (başlık) + Nunito (metin) · pofuduk + glassmorphism
   Tema: [data-theme="light"|"dark"] — tüm renkler token'dan gelir.
   ========================================================================== */

/* ----------------------------------------------------------------------------
   1) Tokens
---------------------------------------------------------------------------- */
:root {
  /* Marka mavileri */
  --blue:        #2E8BF7;
  --blue-deep:   #1A6FF5;
  --blue-light:  #6CB4FF;
  --blue-ghost:  #EAF3FF;
  /* MARKA MAVİSİNİN MÜREKKEP UCU — `--sun-ink` / `--violet-tx` ile aynı desen.
     `--blue` bir AKSAN pigmentidir: çip zemini, gradyan durağı, ikon dolgusu,
     `--blue-ghost` tinti. Aynı pigment küçük METİN olarak gece zemininde
     yetmiyor: mavi ghost çipin üstünde 4.04:1, yani AA'nın ALTINDA. (Kart
     yüzeyinde 4.90:1 — yüzey #151B3D'ye koyulaşınca o ölçüm 4.20'den yukarı
     çıktı; belirleyici olan artık ghost çip.)
     Token açık temada `--blue`nin KENDİSİ (yani light hiç değişmez),
     koyu temada ailenin açık ucuna döner. Fillere DOKUNMAZ: yalnız
     `color:` yazan kurallar bunu okur. */
  --blue-ink:    var(--blue);
  --ink:         #243769;
  --sun:         #FFD166;
  /* Sarının AÇIK ZEMİNDE OKUNAN ucu. `--sun` bir PİGMENT (tema geçişindeki
     güneş, "etkinlik öner" ikonu) ve krem/beyaz üstünde 1.27:1 ile kayboluyor;
     `--cat-dusun-deep` (#DC8214) 2.69:1 ile hâlâ büyük metin eşiğinin (3:1)
     altında. Bu uç 3.11:1 — hue neredeyse aynı, yalnız bir tık koyu. İhtiyaç
     yeni değil: hero başlığının el-çizimi altı çizgisi aynı sebeple #EDAE33'ü
     data-URI'nin İÇİNE gömmek zorunda kalmıştı (bkz. §5), token'a bağlanamadığı
     için. Koyu temada ters yönde çalışır — orada ham `--sun` doğrudur. */
  --sun-ink:     #C97A12;
  --moon:        #E9F0FF;

  /* Tema geçişi göğü (bölüm 32). Bunlar YÜZEY token'ı değil PİGMENT: gece göğü
     her iki temada da aynı gecedir, o yüzden [data-theme] altında değil burada.
     Yüzey token'ları (--bg, --card) geçiş bittiğinde zaten devralıyor. */
  --sky-night:   linear-gradient(180deg, #02081A 0%, #06173A 46%, #123055 100%);
  /* Gündüz göğü DENİZ MAVİSİ, soluk bir pastel değil: bu gradyan sayfanın
     zemini değil, geçişin ödülü — ekranı 1.6sn boyunca kaplayacak tek şey o.
     Eski hâli (#BADCFF → krem) perde açılınca "beyazımsı bir dikdörtgen" gibi
     duruyordu; doygun azurdan açık turkuaza inen bu sıra hem markanın mavisini
     hem de beyaz bulutların kontrastını taşıyor. */
  --sky-day:     linear-gradient(180deg, #1B7FD4 0%, #3FA3EC 30%, #79C9F6 60%, #BDE9FF 84%, #E9F7FF 100%);
  /* Şafak: aydınlığa geçişin İLK yarısı. Gündüz göğü perdenin altında hazır
     bekler, bunun opaklığı düşerken ortaya çıkar — yani gökyüzü "açılır".
     Tek süsleme değil: batan ay (#E9F0FF) doğrudan --sky-day üstüne düşünce
     gerçekten görünmez oluyordu; ayın kaydığı kareler artık burada geçiyor.
     Ağırlık mavi tarafta duruyor, sıcaklık yalnız ufukta: güneşin doğduğu yer
     orası, gökyüzünün geri kalanı turuncuya kaçarsa varılan mavi sürpriz değil
     tezat olurdu. */
  --sky-dawn:    linear-gradient(180deg, #0D1740 0%, #23336F 30%, #4A5A9E 55%, #A2739C 78%, #E9A97E 100%);

  /* AKSİYON mavisi (butonlar) — marka mavisinden bir tık derin, hafif indigoya
     kaçık. Neden ayrı token: --blue dekoratif aksan (link, çip, ikon, gradyan);
     buton "yapılacak şey"i işaret eder ve sıcak krem zeminde daha oturaklı bir
     ton ister. Parlak azur (#2E8BF7) beyaz üstünde 3.4:1 idi — bu 5.2:1 (AA).
     Muhabbet periwinkle'ından (#6E73F0) uzak durmak için indigoya fazla
     kaçmıyor: hue 221°, muhabbet 238°. */
  --btn:         #2563EB;
  --btn-deep:    #1E52C8;   /* hover: renk koyulur, hale büyümez */
  --btn-ring:    rgba(23, 50, 120, .28);   /* nötr mürekkep — mavi hale değil */
  --btn-tx:      var(--btn);   /* aksiyon rengi METİN/kenar olarak (ghost, ring) */

  /* Kategori kimlik renkleri (yalnızca kategori öğelerinde) — app v2.34 paleti.
     Ham renkler yalnızca DOLGU/gradyan/nokta/çip zemininde kullanılır.
     METİN (etiket, pill metni, link) için WCAG gereği -deep varyantları:
     #F5A51E ve #23C38C beyaz üstünde metin olarak ASLA kullanılmaz. */
  --cat-oyna:        #FF2DBE;  --cat-oyna-deep:     #D71E9B;  /* Oyna (play) */
  --cat-dusun:       #F5A51E;  --cat-dusun-deep:    #DC8214;  /* Düşün (think) */
  --cat-kesfet:      #23C38C;  --cat-kesfet-deep:   #0FA06E;  /* Keşfet (explore) */
  /* Keşfet ailesinin MÜREKKEP ucu: -deep beyaz üstünde 3.35:1 ile idare eder
     ama DOYGUN yeşil bir zeminin (hero'daki pedagog rozeti) üstünde 2.6:1'e
     düşüyor. Bu ton aynı hue'da (158°) ve o zeminde 5.6:1 — zemin koyulaşınca
     metin de koyulaşmak zorunda, yoksa "opak" rozet okunmaz rozet olur. */
  --cat-kesfet-ink:  #07694A;
  --cat-muhabbet:    #6E73F0;  --cat-muhabbet-deep: #5550E1;  /* Muhabbet (conversation) */

  /* KATEGORİ MÜREKKEBİ — küçük metin için, TEMAYLA ÇEVRİLİR.
     `-deep` varyantı AÇIK zemin için koyulaştırılmıştır; gece zemininde ters
     yönde çalışır ve sitede bunu tek tek düzelten dağınık
     `[data-theme="dark"] … { color: var(--cat-X) }` kuralları birikmişti.
     Bugün tek kaynak bu dört token. Açık temada `-deep`in KENDİSİ — yani light
     hiçbir yerde değişmez. `-deep` FİLL olarak da kullanılıyor (rozet
     gradyanının koyu durağı, dolu yeşil onay diski) ve o kullanımlar bu
     token'ı OKUMAZ: gece temasında açılan bir gradyan durağı beyaz glyph'i
     eşiğin altına düşürürdü.
     Koyu temadaki değerler ÖLÇÜLDÜ (`--card-solid` üstünde, sitenin en zorlu
     küçük-metin yüzeyi). Seçim #1B2A46 üstünde yapıldı; yüzey #151B3D'ye
     KOYULAŞINCA dördü de yukarı gitti, yani seçim güvenli tarafta kaldı —
     parantezdeki eski ölçüm, hangi ikisinin GERÇEKTEN eksik olduğunu
     gösterdiği için duruyor:
       Oyna     #FF7FD3 7.35    (eski yüzeyde 6.29; ham 4.35 ✗ idi)
       Düşün    ham     8.19    (eski yüzeyde 7.01 ✓ — ham kaldı)
       Keşfet   ham     7.37    (eski yüzeyde 6.31 ✓ — ham kaldı)
       Muhabbet #A0A5FF 7.42    (eski yüzeyde 6.36; ham 3.66 ✗ — en kötüsü)
     Dördü de 7.35-8.19 bandında: aynı okunabilirlik, chroma korunuyor.
     Beyazla karıştırarak açmak da denenebilirdi ama %58 karışım Düşün'ü
     9.6'ya, Keşfet'i 9.1'e çıkarıp ikisini pastele düşürüyor — gerekmeyen
     yerde kimlik kaybı. Sadece EKSİK olan ikisi kaldırıldı. */
  --cat-oyna-tx:     var(--cat-oyna-deep);
  --cat-dusun-tx:    var(--cat-dusun-deep);
  --cat-kesfet-tx:   var(--cat-kesfet-deep);
  --cat-muhabbet-tx: var(--cat-muhabbet-deep);
  /* Geriye dönük takma adlar (mevcut kullanımlar --c-* bekliyor) → yeni ham renk */
  --c-oyna:     var(--cat-oyna);
  --c-dusun:    var(--cat-dusun);
  --c-kesfet:   var(--cat-kesfet);
  --c-muhabbet: var(--cat-muhabbet);

  /* MOR — kategori rengi DEĞİL, kategori taşımayan ikinci aksan. Bugün yalnız
     İKİ yerde: /iletisim sahnesinin renk yıkaması ve /sss'in "Plan" grubu.
     HERO'DA ARTIK YOK (2026-08-26, kullanıcı kararı): nicelik sayısı orada
     morla yazılıyordu, hero lacivert + Kidlio mavisine indirilince kategori
     taşımayan ÜÇÜNCÜ bir renk karşılıksız kaldı — sayı telefonun üstündeki
     lacivert rozete taşındı. `--violet-tx2` (gradyanın açık ucu) o gün
     kullanımsız kaldığı için silindi; geri gerekirse #A855F7 / #D8B4FE.
     Hue 263-271°: muhabbet periwinkle'ı (238°) ile karıştırılmasın diye
     bilerek uzak — 17 derece fark eden ilk deneme "muhabbet kategorisi rengi"
     diye okunuyordu. Kategori renklerindeki kural burada da geçerli: ham renk
     dolgu/parıltı için, METİN için -tx (krem zeminde 6.8:1). */
  --violet:     #7C3AED;   /* ham: yıkama/tint zemini */
  --violet-tx:  #6D28D9;   /* metin ucu */

  /* Yüzeyler & metin — LIGHT ("soğuk kağıt")
     Zemin DataFluvia design pack'inin `--dp-paper`ından geliyor (2026-09-07,
     kullanıcı kararı): pack'te `--dp-paper` → `--df-canvas` = #F6F8FC, yani
     ekosistemin ortak çalışma zemini. Kartlar saf beyaz kalır — ayrışma
     bundan gelir ve kart:zemin oranı 1.031 → 1.045'e ÇIKAR (zemin soğurken
     bir tık koyulaşıyor).
     ÖNCESİ #FDFAF6 idi ("sıcak kağıt", krem). Gerekçesi "mavi atmosfer olmaktan
     çıkıp AKSAN olsun"du ve o iş hâlâ duruyor: yeni zemin de nötr-soğuk bir
     kağıt, marka mavisinin kendisi değil (#F6F8FC hue 220° ama S %55/L %98,
     yani pigment değil kağıt). Sitedeki "krem üstünde ölçüldü" notları
     (`Features.css` §, `tests/test_site_pages.py`) geçerliliğini KORUYOR:
     luminans .9683 → .9549, yani metin kontrastı %1.4 değişiyor — tx1 11.16 →
     11.01, `--ac-tx` ailesinin en dara olanı 5.75 → 5.67. Hiçbiri eşik
     değiştirmiyor.
     Gövde TEK ZEMİN: bölümler arasında açık/koyu bant almaşması yok (eski
     .section--tint + --bg-soft kaldırıldı) — ritmi kartlar ve boşluk taşır. */
  --bg:          #F6F8FC;
  --card:        rgba(255, 255, 255, .96);
  --card-solid:  #FFFFFF;
  --border:      rgba(72, 54, 38, .10);
  --border-strong: rgba(72, 54, 38, .18);
  --tx1:         #243769;
  --tx2:         #5B6B92;
  --tx3:         #8B97B8;

  --grad-brand:  linear-gradient(135deg, #6CB4FF 0%, #2E8BF7 55%, #1A6FF5 100%);
  --grad-text:   linear-gradient(120deg, #1A6FF5, #2E8BF7 45%, #6CB4FF);

  /* Gölgeler nötr-sıcak: mavi gölge + mavi zemin çamurlu bir hale veriyordu.
     (Buton gölgesi marka mavisi kalır — o bilinçli bir aksan.) */
  --shadow-sm:   0 2px 10px -2px rgba(60, 45, 32, .07);
  --shadow:      0 14px 40px -14px rgba(60, 45, 32, .15);
  --shadow-lg:   0 30px 70px -24px rgba(60, 45, 32, .22);
  /* Marka gradyanının MAVİ halesi. Adı bir dönem --shadow-btn'di ama birincil
     buton bunu bilerek kullanmıyor (aşağıdaki .btn-primary notu): buton nötr
     mürekkep halkası taşır. Bu token yalnız --grad-brand'li dekoratif öğelerin
     (telefon pill'i, adım numarası) altında durur. */
  --shadow-brand:  0 10px 24px -8px rgba(26, 111, 245, .45);
  /* Kart üst kenarı ışık çizgisi — "yukarıdan aydınlatılmış" net kenar */
  --edge:        inset 0 1px 0 rgba(255, 255, 255, .92);

  /* Renkli parıltı ölçeği — nötr --shadow ailesinin RENKLİ karşılığı.
     Yukarıdaki gölgeler yüzeyi zeminden ayırır; bunlar öğenin KENDİ aksan
     rengini altına sızdırır (kategori mavisi, özellik moru...). İkisi farklı
     iş yapar, o yüzden ayrı ölçek.

     Rengi öğe verir: kullanım yerinde --glow-c yazılır, token onu okur.
     .cat-emoji { --glow-c: var(--cat); box-shadow: var(--glow-sm); }

     Üç kademe = üç boyut sınıfı:
       --glow-sm  48-64px ikon rozeti (düz/hafif zeminli)
       --glow     74-92px orb + gradyan rozet; ayrıca sm'in HOVER karşılığı
                  (ikon parıltısı bir kademe yukarı çıkar — ölçek bunun için)
       --glow-lg  kart yüzeyinin hover'da kalkması (nötr --shadow ile birlikte)

     Önce 9 bildirim elle yazılmıştı: 6/8/10/12/20/22/26/36px dikey, 14-68px
     bulanıklık, 38-70% arası altı ayrı karışım oranı. Görsel olarak üç şey
     eden yerde on beş sayı vardı. Kaymalar ≤4px bulanıklık / ≤8 puan oran.

     (Bir dönem buradaki listenin dışında Özellikler sayfasının dekoratif
     ikon kutusu da anılıyordu; o kural sayfayla birlikte silindi.) */
  --glow-sm:     0 8px 18px -11px color-mix(in srgb, var(--glow-c, var(--blue)) 60%, transparent);
  --glow:        0 10px 23px -10px color-mix(in srgb, var(--glow-c, var(--blue)) 68%, transparent);
  --glow-lg:     0 22px 46px -22px color-mix(in srgb, var(--glow-c, var(--blue)) 40%, transparent);

  /* Odak halkası — erişilebilirlik öğesi, TEK değer. Dört bildirim ayrı ayrı
     yazılmıştı (.14 / .18 / .22 üç farklı opaklık): odak göstergesi forma
     göre değişmez, hep aynı kalınlıkta ve aynı güçte olur. Rengi --ring-c
     verir (koyu panel üstünde beyaz). */
  --ring:        0 0 0 4px color-mix(in srgb, var(--ring-c, var(--blue)) 18%, transparent);

  /* Radius ölçeği — yüzeyler bir tık daha kare (24-32 → 16-26); telefon,
     balon, çip, avatar ve yuvarlak butonlar bilinçli olarak dışarıda tutulur.

     Ölçek BAĞLAYICI: yüzey radius'u ham px yazılmaz, buradan gelir. Bir kez
     40 bildirim 8/9/11/12/14/15/17/20/24/28px diye elle yazılmıştı — görsel
     olarak 4 kademe eden şey 14 ayrı sayıydı. Hepsi ≤2px kayma ile buraya
     bağlandı; 16-26 zarfı (yukarıdaki karar) aynen korundu.

     Bilerek DIŞARIDA kalanlar:
     - Gerçek cihaz köşesi modelleyenler — .phone 52, .phone-screen 42,
       .phone--mini 40/50, .sps/.cps-screen 33, .ps-tabbar ve .cat-act-media
       (çok değerli köşe). Token bunları bozar.
     - Kılcal 1-3px: ayraç, toggle çubuğu, nokta. Form dili meselesi değil.
     - 6px (x5) ve 13px (x1, .nav-brand): en yakın kademeye 3-4px var, yani
       ≤2px kuralının dışında. Marka öğesi + küçük çipler; göz kararı
       taşımak yerine olduğu gibi bırakıldı.

     22px (x5) ÇÖZÜLDÜ — ölçeğe 5. kademe EKLENMEDİ. 16/18/22/26 bir ölçek
     değil gürültü olurdu; bu maddenin dersi zaten "az sayıda değer". Bunun
     yerine boyuta göre ayrıldılar:
       .about-story, .principle-card, .duo-card → --r-xl
         (padding 24-32px, sayfanın en büyük içerik yüzeyleri)
       .ps-card → --r-lg  (padding 15x14, telefon maketi içindeki küçük kart;
         26px bu boyutta balon gibi duruyordu)
     Not: --r 16 ile --r-lg 18 arasında yalnız 2px var — ölçeğin kendisinde
     kalan tek gürültü bu. Ayrı bir karar, burada dokunulmadı. */
  --r-sm:  10px;
  --r:     16px;
  --r-lg:  18px;
  --r-xl:  26px;
  --r-full: 999px;

  /* Boşluk ölçeği — kart dolgusu ve ızgara boşluğu için clamp rampaları.
     Radius ve gölgede olan buradaydı da: 38 ayrı clamp() elle ayarlanmıştı,
     ON İKİ farklı büyüme eğimiyle (1.9 / 2.4 / 3 / 3.2 / 3.4 / 3.5 / 3.6 /
     4 / 5 / 6 / 8 / 9vw). Sonuç ARA genişliklerde görünür: yan yana duran iki
     yüzeyden biri 3vw, diğeri 3.6vw ile büyüyünce pencere yeniden boyutlanırken
     aralarındaki ilişki kayıyor — hiçbir maketin göstermediği bir kayma.

       --sp-sm  küçük yüzey dolgusu (kategori paneli, balon butonu)
       --sp-md  orta yüzey dolgusu (kategori kartı, paket, fayda kartı, formlar)
       --sp-lg  iki sütunlu ızgara boşluğu (gece, telefon, güven, footer...)
       --sp-xl  bölüm içi büyük ayrım (gün hikâyesi, CTA kutusu dikeyi)

     17 rampa 4 tokene bağlandı. Mobil ucunda kayma ≤2px; masaüstü ucunda ≤4px,
     bir istisnayla: .foot-inner 56→50. Saf boşluk, sarma riski yok.

     Bilerek DIŞARIDA:
     - .section (56/9vw/104) ve .hero/.page-hero — bölüm ritmi ayrı bir ölçek,
       kart dolgusuyla aynı ailede değil.
     - .night (34/5vw/60) ve .kd-invite (32/5vw/48) — 5vw eğimli tam-panel
       yüzeyler; en yakın kademeye 6-12px var.
     - .hero-grid (44/6vw/92) — sayfanın tek en büyük boşluğu, kendi başına.
     - Çift eksenli dolgular (.step, .legal-body, .trust-explain yüzeyi) —
       yatay ve dikeyi ayrı ayarlanmış, tek token karşılamıyor. */
  --sp-sm: clamp(16px, 2.2vw, 22px);
  --sp-md: clamp(24px, 3.2vw, 36px);
  --sp-lg: clamp(26px, 4vw, 50px);
  --sp-xl: clamp(40px, 6vw, 72px);

  /* Punto ölçeği — sitenin METİN kademeleri.
     215 font-size bildirimi 70 ayrı değer kullanıyordu. Asıl kanıt tek bir
     bantta: 0.90-1.05rem arasında 13 farklı değer vardı (.92 .93 .94 .95 .96
     .97 .98 .99 1 1.02 1.04 1.05 1.0625) — .97 ile .98 arasındaki fark 16px
     kökte 0.16 PIKSEL. Bu bir kademe değil, kararsızlık.

     107 bildirim (36 kaynak değer) 11 kademeye bağlandı. En büyük kayma
     0.8px; çoğu 0.3px'in altında.

     Bilerek DIŞARIDA:
     - Telefon simülasyonunun iç tipografisi — app-parity maketi, ayrı karar.
     - İkon/maskot punto'ları (1.5rem üstü: .nf-mascot 3.4 ...).
       Bunlar metin değil, KUTU ÖLÇÜSÜ; font-size
       burada ikonun boyutunu veriyor. Metin ölçeğine sokmak ikisini karıştırır.
     - .nav-brand (1.42) — marka kelime-işareti, radius'ta da dışarıdaydı.
     - em birimli olanlar — ebeveyne göreli, farklı mekanizma.
     - clamp() rampaları (.hero-title, .sec-title, .cta-box h2...) — başlık
       ailesi kendi içinde tutarlı ve viewport'a bağlı; ayrı mesele. */
  --fs-3xs: .62rem;   /* mikro etiket */
  --fs-2xs: .68rem;
  --fs-xs:  .74rem;   /* çip, rozet */
  --fs-sm:  .82rem;   /* yardımcı metin */
  --fs-md:  .88rem;
  --fs:     .95rem;   /* GÖVDE */
  --fs-lg:  1rem;
  --fs-xl:  1.06rem;  /* öne çıkan gövde */
  --fs-2xl: 1.15rem;  /* küçük başlık */
  --fs-3xl: 1.25rem;
  --fs-4xl: 1.35rem;  /* kart başlığı */

  /* Hareket ölçeği — SÜRE ve EĞRİ iki ayrı eksen.
     44 transition bildirimi 37 farklı değerden kuruluydu; süre tarafında ON İKİ
     ayrı sayı: .15 .18 .2 .22 .25 .28 .3 .34 .35 .4 .5 .7. .18s ile .2s
     arasındaki fark 20 MİLİSANİYE — hiçbir gözün ayıramayacağı bir aralık için
     iki ayrı değer. Eğri tarafı daha beter: `ease` 88 kez, yanında SEKİZ ayrı
     cubic-bezier, üçü zaten aynı eğrinin farklı yazımı
     (.22,.9,.35,1 · .22, .9, .35, 1 · .22,.9,.35,1.1).

     Süre kademesini hız değil, öğenin gittiği YOL belirler:
       --t-xs  renk/zemin takası, yol yok (link, çip, fatura sekmesi)
       --t-sm  VARSAYILAN hover: küçük kontrol 2-3px kalkar + gölge
       --t     kart/panel yüzeyi, akordeon, telefon — büyük yüzey, uzun yol
       --t-lg  ekran/örtü girişi (telefon ekran geçişi, tab bar)
       --t-xl  giriş animasyonu (hero fadeUp merdiveni, scroll reveal)

     .25s (15 bildirim) için 5. kademe AÇILMADI — radius'taki 22px kararının
     aynısı: boyuta göre ayrıldılar. Kart/yüzey olanlar --t (.3s), küçük
     kontrol olanlar --t-sm (.2s). En büyük kayma 100ms (.4→.5 ps-tabbar,
     .8→.7 hero telefon sütunu); geri kalan her şey ≤50ms.

     Eğriler — `ease` varsayılan kalır, bu ikisi onun dışındaki iki iş:
       --ease-out  yumuşak yavaşlama; dört varyantı vardı (.22,.9,.35,1 /
                   .22,1,.36,1 / .3,.9,.3,1 / .22,.9,.35,1.1)
       --ease-pop  geri sekme; .3,1.4,.5,1 ile .36,1.4,.46,1 aynı işi yapıyordu

     Bilerek DIŞARIDA:
     - Sonsuz ortam döngüleri (2.5-9s: orbFloat, twinkle, phoneFloat, cpsClouds).
       Bunlar etkileşim değil ARKA PLAN; periyotları da bilerek birbirini
       tutmuyor — hepsi ölçeğe oturursa sayfa tek bir nabızla atmaya başlar.
     - .mini-chart barGrow eğrisi (.25,1,.35,1.15): taşma payı 1.15, --ease-pop
       1.4. Çubuk hedef genişliğini gözle görülür biçimde aşardı.
     - psTap .9s, psBarGrow 1s, barGrow 1s, psOrbPress .6s, bounceIn .6s — iki
       kademenin tam ortasına düşüyorlar (≥100ms kayma), üstelik tek kullanımlık
       jestler. Not: bounceIn ÜÇ ayrı sürede çağrılıyor (.5 hover kıpırtısı →
       --t-lg, .7 kutlama girişi → --t-xl, .6 hâlâ ham). İlk ikisi ayrı iş, .6
       hangisi olmak istediğine karar vermemiş — bir sonraki elin işi.

     Azaltılmış hareket buraya bakmaz: 25) bloğu süreyi global ezer. */
  --t-xs: .15s;
  --t-sm: .2s;
  --t:    .3s;
  --t-lg: .5s;
  --t-xl: .7s;
  --ease-out: cubic-bezier(.22, .9, .35, 1);
  --ease-pop: cubic-bezier(.3, 1.4, .5, 1);

  --font-head: 'Quicksand', 'Nunito', system-ui, -apple-system, sans-serif;
  --font-body: 'Nunito', system-ui, -apple-system, 'Segoe UI', sans-serif;
  /* EL YAZISI (2026-09-06): ikinci kullanım (navbar sekmeleri) çıkınca
     eyebrow'un hardcode zinciri token oldu — Layouts/Site.html'in "ikinci
     kullanım çıkarsa buradan genişletilir" notunun CSS ayağı. Caveat tek
     ağırlıkla (600) yüklü; bu yüzü kullanan her kural 600 yazar, başka
     ağırlık istemek yüklemeyi genişletmeden sahte-bold üretir. Caveat'in
     x-yüksekliği küçük: aynı optik boy için punto Quicksand'inkinden
     ~1.3 kat BÜYÜK yazılır (eyebrow ve navbar aynı kuralı uygular). */
  --font-hand: 'Caveat', 'Segoe Script', 'Bradley Hand', cursive;
  /* DISPLAY YÜZÜ — yalnız H1'ler (2026-08-29, kullanıcı isteği: başlıklara
     karakter). Quicksand ile Nunito ikisi de yuvarlak-hatlı akraba, yani
     başlık ile gövde arasında kontrast yoktu; Baloo 2 sticker/suluboya dilini
     taşıyan chunky bir yüz. Gövde ve h2-h5 Quicksand'da kalır — Display'i
     her başlığa yaymak sesi kalınlaştırır, inceltmez. Font değişikliği bu
     tek satırdan yapılır; latin-ext (ğ ş ı İ) yüklenmezse zincir Quicksand'a
     düşer ve hiçbir şey hata vermez. Genişliği yüzünden Özellikler girişinin
     tavanı yeniden ölçüldü (bkz. Features.css .f2-h1 notu). */
  --font-display: 'Baloo 2', var(--font-head);

  --nav-h: 76px;
  --container: 1180px;

  /* TEK DİKEY RİTİM (2026-09-02). Bölüm geçişlerinin boşluğu bu tek
     değişkenden gelir — sayfa dosyaları (Features/Growth/Faq/Pricing) kendi
     clamp'lerini yazdığı için aynı sitede 62 · 72 · 84 · 104px'lik dört ayrı
     "bölüm arası" vardı ve hepsi de fazlaydı: iki komşu bölümün dolgusu
     TOPLANDIĞI için 104px'lik tavan masaüstünde 208px'lik ölü bant demekti.
     Yeni tavan 68px → geçiş 136px. Özel durumlar (has-steps · has-strip ·
     cta-sec) ARTIK KENDİ SAYISINI YAZMAZ, bu değerin çarpanını alır; yoksa
     token değişince biri değişip beşi kalır. */
  --sec-pad: clamp(38px, 5.4vw, 68px);

  /* YATAY ŞERİDİN UCU KESİLMEZ, SOLAR (2026-08-30, konsey kararı 6).
     Parmakla kaydırılan şeritlerin (hızlı çözüm · /sss hızlı geçiş ·
     /ozellikler giriş şeridi) sağ ucunda kelimeler ortasından kesiliyordu:
     panelin bir üyesi yarım kalan "Bugün Ded..." etiketini görüp SAYFAYI BOZUK
     SANDI. Aynı desen sitede dört yerde tekrarlıyor, o yüzden çözüm de tek
     yerde duruyor — bir şerit `mask-image: var(--strip-mask)` yazar, gerisi
     buradan gelir.
     RAMPA ASİMETRİK ve öyle kalmalı: sağ uç 40px (kesilen içeriğin olduğu
     yer), sol uç 20px. Simetrik 40px'te şerit sayfa ilk açıldığında —
     yani scrollLeft 0 iken, hiçbir şey kesilmemişken — ilk çipin kendi
     metnini soluklaştırıyordu; 20px büyük ölçüde çipin kendi iç dolgusuna ve
     köşe yarıçapına düşer.
     RENK YOK, OK YOK, ANİMASYON YOK: maske nötr bir alfa rampasıdır, bir
     kontrol gibi okunmaz — kaydırılabilirliği anlatan şey hâlâ kesilen çipin
     kendisi (bkz. /sss şeridinin "çubuk gizli, kaydırma açık" notu).
     Şeridin KENDİ zemini olsaydı maske onu da yerdi; dördü de zeminsiz.

     UÇ SOLAR AMA YALNIZ KESİK VARSA (2026-09-10, kullanıcı: "çipler sağdan
     soldan blurlu görünüyor"). Maske koşulsuz yazıldığında şerit KAYDIRILABİLİR
     OLMASA BİLE iki ucu soluyordu — 1440px'de `.f2-rail-nav ul`ın kendi
     ölçüsü 1180 = 1180, yani hiçbir şey kesilmemişken ilk çipin solu ve son
     çipin sağı silikti; asimetrik rampa (20/40) o kusuru azaltmıştı, kapatmamıştı.
     Rampa artık ÜÇ token ve durumu tek bir genel kanca yazıyor (Site.js,
     `data-strip` → `data-edge`); uç kuralları bu bölümün sonunda. Ölçüler
     DEĞİŞMEDİ (20/40) — değişen tek şey maskenin NE ZAMAN uygulandığı.
     Şablonuna `data-strip` yazılmayan bir şerit eski (koşulsuz) davranışta
     kalır: kural sessizce bozulmaz, yalnız o şerit fırsatı kullanmaz. */
  --strip-fade-l: 20px;
  --strip-fade-r: 40px;
  --strip-mask: linear-gradient(to right,
                  transparent 0, #000 var(--strip-fade-l),
                  #000 calc(100% - var(--strip-fade-r)), transparent 100%);
  /* Tek uçlu iki kardeş: yalnız sağ ucu (şeridin başındayken) ya da yalnız sol
     ucu (sonundayken) soldurur. */
  --strip-mask-r: linear-gradient(to right,
                    #000 calc(100% - var(--strip-fade-r)), transparent 100%);
  --strip-mask-l: linear-gradient(to right,
                    transparent 0, #000 var(--strip-fade-l));

  /* Gece paneli (uyku) — her iki temada sabit */
  /* RAMPA DARALTILDI (2026-09-02): parlak durak #23346B → #1A2854, ara durak
     #14204A → #131E48. Eski aralık gece bantlarının (`.night`, `.gx-trust`,
     `.cta-sec` gecesi) sol üstünden sağ altına kadar uzanan, kenarsız bir
     ışık rampasıydı ve koyu yüzeyde SİS okunuyordu — gerekçenin tamamı
     Sleep.css'in başındaki "KOYU YÜZEYLERDE SİS" notunda. Gradyan silinmedi:
     yön (sol üstten ışık) gece bantlarının derinliğini taşıyan tek şey, ama
     artık bir yıkama değil ton farkı. */
  --night-bg:   radial-gradient(120% 140% at 20% 0%, #1A2854 0%, #131E48 45%, #0C1533 100%);
  --night-tx:   #EAF1FF;
  --night-tx2:  #AFC0E4;

  --foot-bg:    #14204A;
  --foot-tx:    #D9E4F8;
  --foot-tx2:   #90A3CC;

  /* Koyu çip (mağaza butonları) — sayfa zemininin üstünde durur, o yüzden
     temanın yüzey ailesini izler. CTA'nın mavi paneli üstündeki kopyaları
     bilinçli olarak literal kalır: o panel iki temada da aynı. */
  --chip-dark:  #14204A;

  /* Yerli form kontrolleri (onay kutusu vb.) tarayıcının kendi çizimini
     kullanır ve bu çizim `color-scheme` ile belirlenir. Bildirilmezse
     tarayıcı İŞLETİM SİSTEMİNİN tercihini okur — OS koyu, site açık temadaysa
     onay kutusu siyah bir kutu olarak sayfadan kopuyordu (`accent-color` yalnız
     işaretli hâli boyar, boş kutunun çerçeve/zemin rengini DEĞİL). Token temayla
     birlikte döner, OS'le değil. */
  color-scheme: light;
}

[data-theme="dark"] {
  color-scheme: dark;
  /* ————— YÜZEY AİLESİ: OPAK GECE LACİVERTİ (2026-08-26 akşamı, kullanıcı
     kararı — üç hex kullanıcı tarafından verildi) —————
     Kart bir gün boyunca YARI SAYDAM bir gri-mavi idi (rgba(31,47,76,.85),
     sayfa zemini üstündeki efektifi #1B2A46). İki şikâyeti birden taşıyordu ve
     ikisi de aynı ölçüden geliyor: chroma C .056, yani hue lacivert bandında
     olmasına rağmen yüzey PETROL/gri-mavi okunuyordu — ve %15'lik saydamlık
     sayfa zeminini yüzeyin İÇİNDEN geçirip o griliği pekiştiriyordu.
     Bugünkü aile üç OPAK hex; zeminle aynı hue bandında ama chroma'sı
     belirgin biçimde yüksek, yani yüzey açılırken griye değil MAVİYE gider.
     Dört ölçü yükü taşıyor:

     1) ALFA YOK, ÜÇÜ DE TAM OPAK. `--card` ile `--card-solid` bu yüzden AYNI
        DEĞER ve öyle kalmak zorunda: ayrıştıkları an color-mix tabanları,
        mobil menü paneli ve üstüne içerik binen her kutu saydam kardeşinden
        görünür biçimde ayrılır. (Saydam yüzeyin kendisi zaten iki kez
        şikâyet konusu oldu — aşağıdaki KAYIT.)
     2) MERDİVEN, OKLCH L: taban .2376 → seçili .2846 → hover .3139; üçü de
        H 272-273 · C .065-.090. Yüzey açılırken hue'sunu korur ve chroma'sı
        onunla birlikte ARTAR. Beyazla karıştırmak tersini yapar (chroma
        düşer, yüzey griye kayar); koyu temada "kir" tam olarak odur.
        DİKKAT — HOVER BU AİLEDE SEÇİLİDEN AÇIK. Eski kural bunun tersiydi
        ("kalıcı durum geçici olandan sönük kalmasın"); üç değer kullanıcı
        tarafından verildi ve hover en üst kademe. Bir gün geri çevrilecekse
        değişecek şey token'ların değeri, kuralların hangisini okuduğu değil.
     3) METİN ÖLÇÜMÜ YENİ YÜZEY ÜSTÜNDE: tx1 14.8 · tx2 11.0 · tx3 6.8 — üçü
        de eski değerlerin (12.6 · 9.4 · 5.8) ÜSTÜNDE, çünkü yüzey koyulaştı.
        Aynı sebeple aşağıdaki KAYIT'ta "tek ödün" diye geçen madde de kapandı:
        dolgu buton kart üstünde 2.6 → 4.9.
     4) BEDELİ KART:ZEMİN ORANI: 1.33 → 1.14. Yüzeyi sayfadan ayıran iş artık
        büyük ölçüde KENARIN üstünde — kenarı inceltmek/soluklaştırmak bu
        yüzden eskisinden daha pahalı (aşağıya bkz.).

     KAYIT — bu yüzeyden ÖNCEKİ iki tur, ikisi de geri alındı:
     · Nötr gri-mavi (rgba(31,47,76,.85)): yukarıdaki iki şikâyetin kaynağı.
     · Uygulamanın gece zemini (#191970, KidlioBackground dark tabanı); amaç
       "site kartı değil uygulamanın kendi yüzeyi" hissiydi. Ölçüldüğünde
       H 272.8 · C .144, yani lacivert değil DOYGUN MOR ve sayfa yüzeyi olarak
       parlaktı. Mockup'lar o rengi AYNEN kullanmaya devam ediyor (.fs, .ps-*,
       .phone-screen, --sleep-bg, --cat-sky-dk) — orada doğru, sayfa yüzeyi
       olarak değildi; ikisi zaten iki ayrı iş yapıyor.

     ————— ESKİ NOT (hâlâ geçerli olan kısımlar) —————
     İKİ KURAL (ikisi de "kirli görünüyor" şikâyetinin sebebiydi):
     1) Yüzeyler OPAK. Yarı saydam kart arkasındaki her şeyi içinden sızdırıp
        lekeleniyordu. Bugün alfa hiç yok.
     2) Kart zeminden açılırken DOYGUNLUĞUNU KORUR. Eski #151C33 açılırken
        doygunluk kaybediyordu (ΔL +4.7 / ΔS −7.8) → gri plaka.
     3) ZEMİN SABİT KALIR, DEĞİŞEN YÜZEYDİR (2026-08-24, kullanıcı kararı —
        üç kart tonu gerçek sayfada yan yana görülüp seçildi). Bir kez zemin de
        koyulaştırılmıştı (#020814) ve GERİ ALINDI: istenen şey kartın kendi
        rengiydi, sayfanınki değil. Zemini indirmek kartı ayrıştırmanın kolay
        ama yanlış yolu — sayfanın tamamını karartıp aynı farkı elde ediyor,
        yani düzeltilmesi istenen yüzey hiç düzelmiyor.
        Elenenler (o günkü ölçümle): #0E2C63 (doğru aile ama uygulamayla ilgisi
        yok), #071634 (zeminden koyu — kutular yüzey değil oyuk okunuyordu). */
  /* Gece zemini de aynı kaynaktan (2026-09-07, kullanıcı kararı): design
     pack'in `--dp-paper`ı koyu temada `--df-canvas` = `--df-navy-990` =
     #030A1C. ÖNCESİ #040F25 idi ve "ZEMİN SABİT KALIR" (2026-08-24) kuralıyla
     korunuyordu — o kural bugün kullanıcı tarafından, ekosistem eşleşmesi
     için bilerek geri alındı; aşağıdaki §3 notu tarihçe olarak duruyor.
     Kazanç ölçüldü: aşağıda §4'te "bedeli" diye kayıtlı olan kart:zemin oranı
     1.14 → 1.18'e çıkıyor (zemin koyulaştı, kart aynı kaldı), yani kenarın
     üstündeki yük bir tık hafifliyor. Metin kontrastları da yukarı gidiyor. */
  --bg:          #030A1C;
  /* Taban yüzey. `--card-solid` ile AYNI değer olmak zorunda (yukarıda §1):
     opak kalması gereken yüzeyler (mobil menü paneli, color-mix tabanları)
     saydam olmayan kardeşinden ayrışamaz. */
  --card:        #151B3D;
  --card-solid:  #151B3D;
  /* Yükseltilmiş/seçili ve hover. Ölçü token'ın KENDİSİNDE durur, kurallarda
     değil — üç yerde ayrı ayrı yazılan bir vurgu sessizce ayrışır. */
  --card-active: #1D2552;   /* okL .2846 — taban +.047 */
  --card-hover:  #222C5E;   /* okL .3139 — taban +.076 */
  /* Kenar: MAVİ-MOR ve DÜŞÜK OPAKLIK. Ölçü: kenar-kart RGB toplam farkı 95
     (efektif rgb(47,53,104) vs rgb(21,27,61)). Kenar bu ailede eskisinden daha
     çok iş yapıyor, çünkü kart:zemin oranı 1.14'e indi (yukarıda §4) — yani
     kartın çerçevesi, yüzeyi sayfadan ayıran şeyin büyük yarısı. Daha aşağı
     bir opaklık ölçülmüş "puslu görünüyor" sınırına (fark ~90) girer.
     `-strong` aynı pigment, orantılı olarak yükseltilmiş alfa (fark 138). */
  --border:        rgba(140, 145, 255, .22);
  --border-strong: rgba(140, 145, 255, .32);
  /* Kapanış kutusu ailesi (.cta-box · /sss .fq-help) yüzeyini ESKİ gece
     zemininden okur ve okumaya devam eder: kart ailesi nötrleşirken o iki kutu
     DEĞİŞMEYECEK (kullanıcı kararı, 2026-08-26). İkisi tek değerden beslenir —
     ayrı ayrı yazılan bir yüzey ayrışır ve "sayfa sonu tek tasarım dilidir"
     kuralı sessizce kırılır.
     /iletisim'in .cx-team'i BU AİLEDE DEĞİL (aynı gün, kullanıcı kararı):
     aileye alınma gerekçesi "kardeşi .cta-box'tan ayrışmasın"dı, oysa
     /iletisim ctaBand ÇAĞIRMIYOR — ayrışacağı kardeş o sayfada yok ve geriye
     nötr kart ailesinin yanında duran mor-mavi bir kutu kalıyordu. Bugün koyu
     temada --card okur (Contact.css §2); açık teması değişmedi. Onu buraya
     geri bağlamak o kararı sessizce geri alır. */
  --cta-surface: #191970;
  /* Gövde metni de puslunun bir parçasıydı: doygunluğu düşük mavi-gri,
     doygun royal zemin üzerinde siliniyordu. tx2 8.3→10.7:1, tx3 4.6→6.6:1. */
  --tx1:         #EAF1FF;
  --tx2:         #C3D2F2;
  --tx3:         #93A5CC;
  --blue-ghost:  rgba(46, 139, 247, .14);
  --btn-ring:    rgba(2, 7, 20, .55);    /* koyu zeminde gölge daha derin olmalı */
  /* #2563EB koyu kart üstünde metin olarak 3.3:1 — AA'nın altında. Ghost buton
     ve focus halkası için aynı ailenin açık ucu. Dolgu butonun zemini --btn
     olarak kalır: beyaz metinle 5.2:1 zaten geçiyor.
     2026-08-26'da BİR KADEME DAHA AÇILDI (kullanıcı kararı): #6C97F5 kart
     üstünde 5.04:1 ile AA'yı geçiyordu ama payı 0.5'ti ve bu token sitenin
     BÜTÜN ikincil eylemlerini taşıyor — `.btn-ghost`, `.cta-arrow`,
     `.f2-more--lg`, `.cw-more`, `.gw-more`, `/iletisim`in kanal satırları,
     `/sss`in "Kidlio hakkında" grubu. Yeni değer aynı hue ailesinde: kart
     6.92 · sayfa zemini 9.22 · kapanış kutusu 7.17. Bu token'ın MÜREKKEBİ
     çevrilen iki yüzeyi (`.cx-tab[aria-selected]` ve `.f2-fs .fs-quick .is-on`)
     kendi koyu tema kurallarını taşıyor, yani açılma onları etkilemez. */
  --btn-tx:      #8FB4FF;

  /* Aksan mavisinin mürekkep ucu (yukarıdaki `--blue-ink` notu). Ölçüm:
     sayfa zemini 8.73 · kart 6.55 · kapanış kutusu 6.79 · mavi ghost çip 7.40
     — hepsi AA'nın rahat üstünde. Yeni renk uydurulmadı, sitenin zaten var
     olan `--blue-light`i; gece yüzeylerinde bugün de o kullanılıyor
     (`.night-mode .e i`, `.px-plan--navy .px-more`, `.hero-count::after`). */
  --blue-ink:    var(--blue-light);

  /* Kategori mürekkebi — gerekçe ve ölçümler açık tema bloğunda. Düşün ile
     Keşfet HAM renklerine döner (zaten 7.01 / 6.31); Oyna ile Muhabbet AA'nın
     altında kaldığı için bir kademe açılır. Ham renkler (dolgu, gradyan,
     nokta, tint) DEĞİŞMEDİ. */
  --cat-oyna-tx:     #FF7FD3;
  --cat-dusun-tx:    var(--cat-dusun);
  --cat-kesfet-tx:   var(--cat-kesfet);
  --cat-muhabbet-tx: #A0A5FF;

  /* Sarının koyu ucu gece zemininde ters çalışır: #C97A12 lacivert üstünde
     donuk kalır, ham `--sun` (#FFD166) 7.9:1. Token aynı işi görsün diye
     burada pigmentin kendisine döner. */
  --sun-ink:     var(--sun);

  /* Mor da aynı sebeple açılır: #6D28D9 gece zemininde 1.8:1 — /sss'in "Plan"
     grubu orada okunmuyordu. Aynı hue'nun açık ucu, -tx 7.2:1. */
  --violet:     #A855F7;
  --violet-tx:  #C084FC;

  /* Footer light temada zeminden KOYU bir çapa; dark'ta zeminden AÇIK olduğu
     için öne fırlıyordu (aynı öğe iki temada ters davranıyordu). Artık koyu. */
  --foot-bg:     #030917;
  --chip-dark:   #092254;   /* mağaza çipi royal aileye taşınır */

  /* Koyu temada geniş siyah gölge yükseklik ANLATMAZ — zemin zaten siyaha
     yakın, gölge yalnızca oluklara ve komşu kartların üstüne gri bir is
     bırakır. Sıkı gölge + net kenar, koyu temanın doğru yükseklik modeli:
     yükseklik yüzeyin AÇIKLIĞINDAN gelir, gölgeden değil. Geçiş bandı
     53px'ten 40px'e indi. */
  --shadow-sm:   0 1px 3px rgba(0, 0, 0, .5);
  --shadow:      0 4px 14px -6px rgba(0, 0, 0, .6);
  --shadow-lg:   0 10px 28px -12px rgba(0, 0, 0, .7);
  --shadow-brand:  0 10px 24px -8px rgba(26, 111, 245, .55);
  /* Üst kenar ışığı NÖTR beyazken kartın tepesini griye çekiyordu (kartın
     kendisi renkli). Aynı aileden bir ışık: kenar hâlâ okunur, ton kaymaz. */
  --edge:        inset 0 1px 0 rgba(175, 210, 255, .09);
}

/* KOYU TEMADA KART VURGUSU YALNIZ YÜZEYİ AÇAR (2026-08-26, kullanıcı kararı).
   Tek bildirim `background`: boyut, gölge, kenar ve hareket kendi kurallarında
   duruyor ve oralara DOKUNULMAZ — hover'da ikinci bir gölge ya da büyüme
   eklemek, istenen "sakin" koyu temanın tam tersini üretir.
   Açık temada bu kuralların hiçbiri geçmez; token'lar da yalnız burada tanımlı.
   Özgüllük (0,3,0) taban kuralların (0,2,0) üstünde, yani sıra ne olursa olsun
   kazanır — dosyanın çok aşağısındaki .faq-item.is-open de dahil. */
[data-theme="dark"] .quick-card:not(.is-open):hover,
[data-theme="dark"] .cat-card:hover,
[data-theme="dark"] .area-card:hover { background: var(--card-hover); }

/* Seçili, hover'dan bir kademe daha açık: kalıcı bir durum geçici olandan
   sönük kalırsa hiyerarşi ters döner. `.quick-card`ın hover kuralı zaten
   `:not(.is-open)` ile korunuyor, yani açık kartın üstüne gelmek onu geri
   karartmaz. */
[data-theme="dark"] .quick-card.is-open,
[data-theme="dark"] .faq-item.is-open { background: var(--card-active); }

/* ---- Yatay şeridin solan ucu: DURUM KURALLARI ----------------------------
   Maskeyi `--strip-mask` ile açan her şerit (`.quick-grid` mobil, `.fq-jump`
   mobil, `.f2-rail-nav ul`) bu üç kuralı da bedava okur; hangi durumda
   olduğunu Site.js ölçüp `data-edge` olarak yazar (gerekçe: token notu).
   ÖZNİTELİK ÇİFTİ (0,2,0) şeritlerin kendi seçicilerini (0,1,1 ve daha
   düşük) bilerek yener — kural şeridin yanında değil BURADA durur, yoksa
   dördüncü şerit açan onu kopyalamayı unutur ve hata almaz.
   `data-edge` hiç yazılmazsa (JS kapalı) şeridin kendi iki uçlu maskesi
   geçerli kalır. */
[data-strip][data-edge="none"] {
  -webkit-mask-image: none; mask-image: none;
}
[data-strip][data-edge="start"] {          /* şeridin başı: yalnız SAĞ uç kesik */
  -webkit-mask-image: var(--strip-mask-r);
          mask-image: var(--strip-mask-r);
}
[data-strip][data-edge="end"] {            /* şeridin sonu: yalnız SOL uç kesik */
  -webkit-mask-image: var(--strip-mask-l);
          mask-image: var(--strip-mask-l);
}

/* ----------------------------------------------------------------------------
   2) Base
---------------------------------------------------------------------------- */
*, *::before, *::after { box-sizing: border-box; }

/* `main` yalnız ARKA PLAN FİGÜRLERİ için konumlandırılmıştır (katman ona göre
   ölçülüyor). Yığın bağlamı AÇMAZ (`z-index: auto`), yani figürlerin `-1`i
   kök bağlama çıkar ve zemin ile içerik arasına oturur — açsaydı figürler
   main'in kendi zemininin altına düşüp tamamen görünmez olurdu. */
main { position: relative; }

html {
  scroll-behavior: smooth;
  scroll-padding-top: calc(var(--nav-h) + 12px);
}

body.kd {
  margin: 0;
  font-family: var(--font-body);
  font-size: var(--fs-xl);
  line-height: 1.65;
  color: var(--tx1);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* NOT: Burada bir dönem kategori renkli "ambient glow" katmanı (body::before,
   pembe/amber/yeşil ışık havuzları) denendi ve KALDIRILDI — özellikle koyu
   temada zemini renkli yıkayıp marka mavisini eziyordu. Zemin sade kalır;
   renk yalnızca içerik öğelerinden (kategori çipleri, rozetler) gelir. */

/* ÇİZGİ FİGÜRLER DE DENENDİ VE KALDIRILDI (2026-09-01, aynı gün, üçüncü ve
   son deneme; kullanıcı kararı: "yok ya beğenmedim, kaldıralım"). Ne olduğu:
   `main`in içinde `.bgf` katmanı, sayfa sözlüğüne göre seçilen 14 nesnenin
   (top · uçurtma · kitap · blok · yaprak · kâğıt uçak · çadır · boya kalemi ·
   ay · yıldız · bulut · kova…) satır içi SVG çizimleri, `--gut` formülüyle yan
   boşluğa itilmiş, %13 mürekkep (koyuda %16), hareketsiz.

   ÜÇ TURUN ÖLÇÜLEN DERSİ — dördüncüyü önermeden önce bu bloğu oku:
   1) Fikir üç kez ve ÜÇ AYRI BİÇİMDE denendi: nokta ızgarası (doku), ortam
      ışığı (renk alanı), çizgi figürler (kenar). Üçü de farklı bir algı
      mekanizmasına oynadı ve üçü de aynı yerden reddedildi.
   2) Görünürlük problemi ÇÖZÜLDÜ, ve mesele o değildi. Sırasıyla ölçüldü:
      alfa %5 → "bgde hiçbir şey yok"; %16/%20 → görünür (ort 1.68-2.79 / max
      ~21) ama "hiç beğenmedim"; figür 52-90px → ekranın binde 4'ü, "bişeyler
      olmadı sanki"; 180-310px + kırpılma sınırı (`max(--out,--cap)`, 1400px
      altında boy ×0.78) → her genişlikte %67+ görünür, metin kontrastı dört
      kombinasyonda da figürlü = figürsüz (10.96 / 16.84, SIFIR fark) — ve yine
      istenmedi. Yani reddin sebebi ne görünmezlik ne okunabilirlikti.
   3) Kaydedilen sınır: `.bgf` 900px altında kapalıydı ve panelin 10 kişisinden
      8'i mobilde geziyor — üç tur boyunca uğraşılan katmanı hedef kitlenin
      %80'i hiç görmedi. Arka plan dekoruna dördüncü kez girilecekse ilk soru
      "ne koyalım" değil, "bunu kim görecek" olmalı.

   ZEMİN SADE KALIR. Renk ve doku yalnız içerik öğelerinden gelir (kategori
   çipleri, rozetler, kartlar, illüstrasyonlar). */


/* ORTAM IŞIĞI DA DENENDİ VE KALDIRILDI (2026-09-01, aynı gün, kullanıcı
   kararı: "hiç beğenmedim"). Ne olduğu: `body.kd::after`te üç dev soluk renk
   lekesi (kenarlarda, sayfa rengine göre `--amb-1`), nokta ızgarasının yerine.
   İki tur alfa denendi ve ikincisi ölçümle doğrulanmıştı — %5/%3.5 GÖRÜNMEZ
   çıktı ("bgde hiçbir şey yok"), %16/%20 görünür oldu (açık ort 1.68-2.79 /
   max ~21, koyu ort 1.82-2.63 / max ~22, metin kontrastı en kötü 4.96 → 4.83,
   AA duruyor). Yani mesele görünürlük DEĞİLDİ: renkli yıkamanın kendisi
   istenmedi — bu, aynı fikrin (kategori renkli ışık havuzları) ÜÇÜNCÜ kez
   geri alınışıdır. Dördüncüsünü önermeden önce bu satırı oku.
   Ölçümden kalan ve taşınabilir tek ders yukarıda, gren notunun yanında
   duruyor: grenin eşiği düz gradyana taşınmaz (gürültü ≠ gradyan).
   Yerine gelen: arka plan FİGÜRLERİ — kendi bölümünde. */

/* KÂĞIT GRENİ (2026-08-29, kullanıcı isteği; frontend-design önerisi 2).
   Suluboya illüstrasyonlarla kırık beyaz zeminin kaynaşmasını sağlayan ÇOK
   HAFIF nokta gürültüsü — "hikâye kitabı kâğıdı" yüzeyi. Nokta DESENİNE
   (.hero-dots vb. düzenli benekler) rakip değil, altına giren ölçüsüz bir
   materyal dokusu; reveal animasyonunun "defter sayfası" metaforunun zemin
   karşılığı. Beş karar yükü taşır:
   - `body::before` + `z-index: -1`: gövde zemininin ÜSTÜNDE, bütün içeriğin
     ALTINDA boyanır. Kendi zeminini boyayan her yüzey (kartlar, paneller,
     uygulama maketleri) onu örter — gren yalnız sayfanın görünen kâğıdında
     durur, ürün ekranlarının "temiz zemin" sözüne dokunmaz (yasak olan
     hale/gradyan/renkli gölgeydi; materyal dokusu yerel bir görsel olay
     değil, sayfanın her yerinde eşit bir yüzey).
   - `position: fixed`: tek bileşik katman, kaydırmada yeniden boyanmaz
     (mobil performans, Fatma'nın düşük donanımı).
   - `pointer-events: none`: hiçbir tıklamayı yemez.
   - NOISE NÖTR ve İÇİNDE griye çevrilir (feColorMatrix saturate 0): yukarıdaki
     "ambient glow" kaydının tam tersi — gren renk YIKAMAZ, yalnız doku verir.
   - YALNIZ AÇIK TEMA: koyu tema lacivert geceyi "puslu/kirli" gösterme
     riskiyle korundu (koyu yüzey şikâyetlerinin hepsi o yöndeydi); display
     none ile tamamen inder. Yoğunluk `opacity`den ayarlanır — .035 başlangıç
     değeriydi ve ÖLÇÜMLE görünmez çıktı (Playwright, gren açık/kapalı farkı:
     ortalama 0.9, max 3/255 — algı eşiğinin altında; hero'da "var" sanılan
     doku `.hero-dots` deseninin kendisiydi). .07 = ölçülen max ~7/255, kâğıt
     hissi gözle seçilir, metin kontrastı etkilenmez (boya kâğıt üstünde,
     metnin altında değil). Desteklemeyen tarayıcıda data-URI sessizce düşer. */
body.kd::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  opacity: .07;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='260' height='260'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23g)'/%3E%3C/svg%3E");
}
[data-theme="dark"] body.kd::before { display: none; }

body.kd.nav-locked { overflow: hidden; }

h1, h2, h3, h4, h5 {
  font-family: var(--font-head);
  font-weight: 700;
  line-height: 1.18;
  color: var(--tx1);
  margin: 0 0 .5em;
  letter-spacing: -.01em;
}
/* H1 display yüzü (bkz. --font-display notu). line-height bir kademe ferah:
   Baloo 2'nin x-height'u Quicksand'tan büyük, 1.18'de iki satırlık bir başlık
   (alt sayfa başlıkları `balance` ile sarabiliyor) satırları birbirine
   sokuyordu. */
h1 {
  font-family: var(--font-display);
  line-height: 1.2;
}

p { margin: 0 0 1em; color: var(--tx2); }
/* Bağlantı mürekkebi `--blue` DEĞİL `--blue-ink`: sitedeki serbest linklerin
   çoğu küçük punto ve gövde metninin içinde (`mailto:` adresleri, gizlilik ve
   koşullar sayfalarının satır içi bağlantıları). Açık temada iki token aynı
   değer, koyu temada bu açık uca döner — bkz. token bloğu. */
a { color: var(--blue-ink); text-decoration: none; }
img { max-width: 100%; display: block; }
ul { padding-left: 1.2em; }

/* Kart üst kenarı ışık çizgisi (--edge) — cam/kart yüzeylerine "yukarıdan
   aydınlatılmış" net bir kenar verir. Gölge zaten var; sadece inset eklenir. */
.glass, .quick-card, .cat-card, .faq-item {
  box-shadow: var(--shadow), var(--edge);
}

/* SATIR KIRIĞI CÜMLENİN ORTASINA DÜŞMEZ.
   `|clauses` filtresi (Helpers/Typography.py) kopyayı noktalama sınırlarında
   öbeklere ayırır; öbek burada ATOMİK bir satır-içi kutu olur. Atomik kutu iki
   satıra bölünemez, yani tarayıcı ancak öbekler ARASINDA kırabilir → kırık her
   zaman bir noktalamadan sonra gelir ("Listeye yazıl — / çıktığı gün…"), eskisi
   gibi öbeğin ortasında değil ("… çıktığı / gün ilk planını al").

   `text-wrap: balance` bunun yerini TUTMAZ: o yalnız satır uzunluklarını
   eşitler, kırığın nereye düşeceğini umursamaz. İkisi birlikte çalışır —
   balance, kalan kırılma fırsatları arasından en dengelisini seçer.

   Bu kural düşerse hiçbir şey hata vermez: öbekler satır-içi metne döner ve
   kırıklar sessizce cümle ortasına geri düşer. Kutu kaba sığmazsa kendi içinde
   sarar (shrink-to-fit), yani dar ekranda yatay taşma olmaz.

   620px ALTINDA KAPALI, ve eşik ölçülerek seçildi. Dar kolonda (390px'te kopya
   ~330px ≈ 30 karakter) öbeklerin çoğu satırdan uzundur: kural kırığı zaten
   noktalamaya taşıyamaz, yalnız sığmayan öbeği aşağı atıp yarım satır bırakır.
   Altı sayfada toplam fark: 390px'te +486px, 480px'te +231px, 620px'te +60px,
   768px ve üstünde +30px (o da /ozellikler hero'sunun dört maddeyi alt alta
   dizmesi — istenen şey). Yani bedelin tamamı mobilde ve mobil sayfa boyu bu
   sitede bilerek kısaltılmış bir ölçü (bkz. UI-Templates.md "Mobil uzunluk").
   Eşik yeni değil: duvarın 12→8 karoya inmesi ve `.phone { zoom }` de 620px. */
@media (min-width: 620px) {
  .clause { display: inline-block; }
}

::selection { background: rgba(46, 139, 247, .22); }

/* OTOMATİK DOLDURMA ZEMİNİ — TARAYICININ DEĞİL, SİTENİN RENGİ (2026-09-05)
   Kullanıcı bildirimi: koyu temada e-posta kutusuna tıklayıp kayıtlı adresi
   seçince kutunun İÇİ hardal-kahverengiye dönüyordu. Sebep sitede değil
   tarayıcıdaydı: `color-scheme: dark` bildirildiği için Chrome/Edge autofill'i
   koyu şemanın kendi vurgusuyla — sarımsı kahve — boyuyor, ve o rengi
   `background` ile ezmek mümkün değil (UA stili !important). Tek yol devasa
   bir `inset` box-shadow'la zemini örtmek + metnin rengini
   `-webkit-text-fill-color` ile geri vermek.

   ÜÇ SEÇİCİ, ve sebebi ODAK HALKASI: sitedeki iki form da (`.wl-input` ve
   /iletisim'in `.cx-field`i) halkayı `box-shadow: var(--ring)` ile çiziyor.
   Odaktaki bir autofill kutusunda tek bir box-shadow bildirimi ikisinden
   birini yutardı — o yüzden odak varyantı örtüyü VE halkayı birlikte yazar.
   Seçici `html` ile başlar: sayfa CSS'leri Site.css'ten SONRA yükleniyor ve
   `.cx-field input:focus-visible` bu kuralla aynı ağırlıkta; `html` olmadan
   koyu temada /iletisim'de kahverengi geri gelirdi.

   Zemin `--card-solid`: iki formun da (odaktaki) kutu rengi zaten o. */
html input:-webkit-autofill,
html textarea:-webkit-autofill,
html select:-webkit-autofill {
  -webkit-text-fill-color: var(--tx1);
  caret-color: var(--tx1);
  box-shadow: inset 0 0 0 100px var(--card-solid);
  /* Chrome zemini bir geçişle boyuyor; geçiş asla bitmezse renk hiç oturmaz.
     Örtüyle birlikte ikinci emniyet — biri sürüm değişiminde kırılırsa öteki
     tutar. */
  transition: background-color 100000s ease 0s;
}
html input:-webkit-autofill:focus,
html input:-webkit-autofill:focus-visible,
html textarea:-webkit-autofill:focus,
html textarea:-webkit-autofill:focus-visible {
  box-shadow: inset 0 0 0 100px var(--card-solid), var(--ring);
}
/* Firefox: aynı iş, orada zemin `background-image` ile geliyor. */
html input:autofill, html textarea:autofill {
  background-image: none;
  -webkit-text-fill-color: var(--tx1);
}

:focus-visible {
  outline: 3px solid color-mix(in srgb, var(--btn-tx) 60%, transparent);
  outline-offset: 2px;
  border-radius: 6px;
}

.skip-link {
  position: absolute; left: -9999px; top: 10px; z-index: 300;
  padding: 10px 18px; background: var(--btn); color: #fff;
  border-radius: var(--r-full); font-weight: 700;
}
.skip-link:focus { left: 12px; }

/* ----------------------------------------------------------------------------
   3) Utilities
---------------------------------------------------------------------------- */
.container {
  width: min(var(--container), 100% - 40px);
  margin-inline: auto;
}

/* Tek zemin: bölüm bantları (.section--tint) kaldırıldı — açık/koyu almaşma
   sayfayı dilimlenmiş gösteriyordu. Ayrımı artık kart kenarı + boşluk veriyor. */
.section { padding: var(--sec-pad) 0; position: relative; }

.sec-head { max-width: 720px; margin-bottom: clamp(34px, 5vw, 54px); }
.sec-head.is-center { margin-inline: auto; text-align: center; }

/* CAM PİL (2026-09-07, kullanıcı kararı — referans görsel). Etiket çipi ve
   rozet bağlantısı AYNI kabuğu paylaşır; fark yalnız `.eyebrow-cta`nın
   eklediği ok, ağırlık ve hover. Düz ghost zemin + nötr kenar, sayfada bir
   "durum etiketi" gibi duruyordu; bugün kenarı, zemini ve halesi bölümün
   aksanından türeyen bir pil.
   RENK TEK YERDEN: `--ec` (dört katman birden döner — kenar · zemin · hale ·
   ok). Ayrı ayrı yazılsalardı biri sessizce geride kalırdı. */
.eyebrow {
  --ec: var(--sec-accent, var(--btn));
  display: inline-flex; align-items: center; gap: 8px;
  padding: 7px 16px; margin-bottom: 16px;
  /* BUZLU ZEMİN: aksanın %6'sından %15'ine inen çok açık bir geçiş — pil
     "renkli" değil "renk almış beyaz" duruyor. */
  background: linear-gradient(180deg,
              color-mix(in srgb, var(--ec) 6%, var(--card-solid)),
              color-mix(in srgb, var(--ec) 15%, var(--card-solid)));
  border: 1px solid color-mix(in srgb, var(--ec) 38%, transparent);
  border-radius: var(--r-full);
  /* YÜZEN GÖLGE + İÇ PARLAMA, halka DEĞİL. Bir dönem burada 4px'lik renkli bir
     halka vardı (aynı gün, daha erken bir tur): pili zeminden koparıyordu ama
     etiketi "seçili durumda bir çip" gibi gösteriyordu. Referans düzende
     derinlik iki şeyden gelir — altına düşen yumuşak gölge ve üst kenardaki
     1px'lik beyaz iç parlama. */
  box-shadow: 0 10px 22px -12px color-mix(in srgb, var(--ec) 55%, transparent),
              inset 0 1px 0 rgba(255, 255, 255, .7);
  /* Yedek `--blue-ink`, `--blue` DEĞİL: etiket sitenin en küçük metni
     (`--fs-sm`, büyük harf, harf aralıklı) ve kendi mavi ghost çipinin
     üstünde duruyor — ham aksan orada 4.74:1, yani payı yok. */
  color: var(--sec-accent, var(--blue-ink));
  font-family: var(--font-head);
  font-size: var(--fs-sm); font-weight: 700;
  letter-spacing: .04em; text-transform: uppercase;
}

/* BAŞLIK AKSAN RENGİNİ TAŞIMAZ, `--tx1` OKUR (2026-08-30, konsey kararı 5).
   Aksan döngüsü (aşağıdaki `is-*` bloğu) SİLİNMEDİ ve silinmemeli — bilgiyi
   `.eyebrow` çipi taşımaya devam ediyor. Değişen şey ölçek: bölüm başlığı
   sayfanın en büyük ikinci yazısı ve ana sayfada ard arda DÖRT doygun
   kategori tonunda geliyordu; on ebeveynin dördü sayfayı "kalabalık/dağınık"
   diye okudu ve tasarımcıların üçü de bağımsız olarak aynı yere bastı.
   Rozet küçük ve kendi tintli zemininde duruyor — orada renk bir işaret;
   40px'lik bir başlıkta aynı renk bölümün KONUSU sanılıyor.
   `--sec-accent`i geri yazmak istersen: bilgi kaybı yok, yalnız gürültü geri
   gelir. */
.sec-title { font-size: clamp(1.7rem, 3.4vw, 2.5rem); color: var(--tx1); }
/* `text-wrap: pretty` (2026-09-04) — son satırda tek kelime bırakmaz. Bölüm
   alt başlıkları ortalanmış ve kısa; dul kelime burada en çok göze batan yer
   ("…uyuyor mu diye / bakıyoruz."). `|clauses` ile ÇAKIŞMAZ: filtre öbekleri
   atomik kutulara alır, pretty ise kalan kırılma fırsatları arasından seçer —
   ikisi aynı yönde çalışır (bkz. §2'deki `balance` notu, aynı mantık).
   Desteklemeyen tarayıcı değeri yok sayıp `wrap`'a döner; bozulma riski yok. */
.sec-sub { font-size: var(--fs-xl); margin: 0; text-wrap: pretty; }

/* ── Bölüm aksan ritmi ──────────────────────────────────────────────────────
   Her bölüm sırayla bir kategori aksan rengi alır; sayfa tek renkte boğulmaz
   ve her blok "ayrı bir oda" gibi okunur.

   Ritmi YALNIZCA başlık taşır: eyebrow çipi + .sec-title renklenir. Zemin TEK
   RENK kalır — satır ~228'deki "tek zemin" kararı korunur.

   NOT: zemin tonlaması (%3-4.5 opaklıkta, aralıklı) bir kez daha denendi ve
   yine elendi — düşük opaklıkta bile bölümler "blok blok" okunuyor. Sorun
   opaklık değil, tam-genişlik yatay bandın kendisi. Tekrar denemeye değmez.

   Fallback'li var(): modifier verilmeyen bölüm hiç değişmez.

   Light'ta -deep varyantı (sıcak krem üstünde WCAG AA); dark'ta ham varyant —
   royal lacivert zeminde -deep fazla koyu kalıyor. */
/* Aksan bir SARMALAYICIYA yazılır, tek tek başlıklara değil: token'lar custom
   property olduğu için içerideki .eyebrow ve .sec-title miras alır. (Bir dönem
   listede Özellikler sayfasının grup kutusu da vardı; o sayfa sahne düzenine
   geçince kendi aksanlarını Features.css'teki `.ac-*` ile taşımaya başladı.) */
.section.is-oyna { --sec-accent: var(--cat-oyna-deep);     --sec-accent-ghost: rgba(255,  45, 190, .09); }
.section.is-dusun { --sec-accent: var(--cat-dusun-deep);    --sec-accent-ghost: rgba(245, 165,  30, .12); }
.section.is-kesfet { --sec-accent: var(--cat-kesfet-deep);   --sec-accent-ghost: rgba( 35, 195, 140, .12); }
.section.is-muhabbet { --sec-accent: var(--cat-muhabbet-deep); --sec-accent-ghost: rgba(110, 115, 240, .12); }

/* Koyu temada aksan HAM renk değil `-tx` MÜREKKEBİ (2026-08-26). Ham varyant
   dördünün ikisinde yetiyordu, ikisinde yetmiyordu: etiket kendi tintli
   çipinin üstünde okunuyor ve orada Oyna 4.87 · Muhabbet **3.97** — sonuncusu
   AA'nın altında ve sitenin en küçük metni. `-tx` ikisini açar, Düşün ile
   Keşfet'i olduğu yerde bırakır (bkz. token bloğu). `.sec-title` aynı
   token'ı miras alıyor ama o büyük metin, zaten geçiyordu. */
[data-theme="dark"] .section.is-oyna { --sec-accent: var(--cat-oyna-tx);     --sec-accent-ghost: rgba(255,  45, 190, .18); }
[data-theme="dark"] .section.is-dusun { --sec-accent: var(--cat-dusun-tx);    --sec-accent-ghost: rgba(245, 165,  30, .18); }
[data-theme="dark"] .section.is-kesfet { --sec-accent: var(--cat-kesfet-tx);   --sec-accent-ghost: rgba( 35, 195, 140, .18); }
[data-theme="dark"] .section.is-muhabbet { --sec-accent: var(--cat-muhabbet-tx); --sec-accent-ghost: rgba(110, 115, 240, .18); }
/* ── Bölüm aksan ritmi sonu ─────────────────────────────────────────────── */

/* Buttons */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 9px;
  padding: 14px 28px;
  font-family: var(--font-head); font-size: var(--fs-lg); font-weight: 700;
  border-radius: var(--r-full); border: 2px solid transparent;
  cursor: pointer; text-decoration: none;
  transition: transform var(--t-sm) ease, box-shadow var(--t-sm) ease, background var(--t-sm) ease, border-color var(--t-sm) ease;
  will-change: transform;
}
.btn:active { transform: scale(.97); }

/* Birincil buton: TEK TON + yumuşak gölge (gradyan ve renkli hale yok).
   Neden: sıcak krem zeminde gradyanın açık ucu (#6CB4FF) ile .45 opaklıklı
   mavi hale birlikte "yanma" etkisi yapıyordu — krem (~40°) ve mavi (~215°)
   neredeyse karşıt tonlar, eşzamanlı kontrast tavanda. Buton hâlâ sayfanın
   en dikkat çekeni; sadece şiddeti düştü.
   Ton --btn'den gelir (marka --blue'sundan derin/indigo-kaçık aksiyon mavisi).
   NOT: --grad-brand / --shadow-brand token'larına DOKUNULMADI — telefon pill'i,
   adım numaraları ve tier rozeti dekoratif gradyanları korunur. */
.btn-primary {
  background: var(--btn);
  color: #fff;
  box-shadow: 0 8px 18px -8px var(--btn-ring);
}
.btn-primary:hover {
  transform: translateY(-2px);
  background: var(--btn-deep);
  box-shadow: 0 12px 24px -10px var(--btn-ring);
}

/* backdrop-filter YOK: --card opak (dark alfa 1.0, light .96) → blur'un
   görünür işi yok, yalnızca gereksiz GPU katmanı açıyordu. */
.btn-ghost {
  background: var(--card);
  color: var(--btn-tx);
  border-color: var(--border-strong);
}
.btn-ghost:hover { transform: translateY(-2px); border-color: var(--btn-tx); box-shadow: var(--shadow-sm); }

.btn-lg { padding: 17px 34px; font-size: var(--fs-xl); }

/* ── Ok çipli metin CTA — PokPok uyarlaması #2 ───────────────────────────────
   Buton değil, satır içi link: metnin sağında dolu yuvarlak çip + chevron.
   PokPok'un en çok tekrar eden öğesi (.cta_arrow, 17 kural) — ikincil "tümünü
   gör" eylemleri buton kabuğundan çıkar, sayfada tek birincil buton kalır.

   Çip EYLEM mavisi (--btn), bölüm aksan rengine BAĞLANMAZ: aksan ritmi yalnız
   başlıkta yaşar, eylem iki temada da mavi (Public.css'teki gold override
   notuyla aynı karar). Beyaz chevron #2563EB üstünde 4.6:1.

   Hover'daki 3px kayma global prefers-reduced-motion bloğuyla (25) zaten
   kapsanıyor (*::after dahil) — burada ayrıca ele almaya gerek yok. */
.cta-arrow {
  display: inline-flex; align-items: center; gap: 11px;
  font-family: var(--font-head);
  font-size: var(--fs-lg); font-weight: 700;
  color: var(--btn-tx);
  text-decoration: none;
  /* DOKUNMA HEDEFİ (WCAG 2.5.8) — ve ölçü `min-height` ile verilir, dolguyla
     DEĞİL: dolgu, mobilde iki satıra sarabilen bir etiketi ("Uyku Seslerini
     keşfet") gereksizce büyütür. Kural 2026-09-01'de eklendi, çünkü bileşen
     o gün ana sayfanın BÜTÜN "içindekiler" bağlantılarını devraldı — uyku
     bölümündeki bağlantı öncesinde 46px'lik bir `.btn`di ve ölçülmeden
     çevrilseydi 390px'te **29px**'e düşecekti. */
  min-height: 44px;
  padding: 4px 2px;
  border-radius: var(--r-sm);
}
.cta-arrow::after {
  content: "\f101";   /* fa-angle-double-right — FA5 Free Solid, tema fontuyla gelir.
                          TEK CHEVRON DEĞİL: 2026-09-07 kullanıcı kararıyla sitedeki
                          bütün "ileri" okları `»` oldu (rozet bağlantısı, adım
                          bağlayıcısı, hızlı çözüm kartları) — tek `›` yön değil
                          "kapalı/açılır" gibi okunuyordu. */
  font-family: "Font Awesome 5 Free"; font-weight: 900;
  display: inline-flex; align-items: center; justify-content: center;
  flex: none; width: 26px; height: 26px;
  font-size: var(--fs-xs); line-height: 1;
  color: #fff; background: var(--btn);
  border-radius: var(--r-full);
  transition: transform var(--t-sm) ease, background-color var(--t-sm) ease;
}
.cta-arrow:hover {
  text-decoration: underline;
  text-underline-offset: 5px; text-decoration-thickness: 2px;
}
.cta-arrow:hover::after { transform: translateX(3px); background: var(--btn-deep); }
.cta-arrow:focus-visible { outline: 3px solid var(--btn-tx); outline-offset: 3px; }

.cta-arrow-lg { font-size: var(--fs-2xl); gap: 13px; }
.cta-arrow-lg::after { width: 31px; height: 31px; font-size: var(--fs-md); }

/* ROZETİN KENDİSİ BAĞLANTI (2026-09-07, kullanıcı kararı) — ana sayfanın dört
   dünya bölümünde `.eyebrow` pili tıklanabilir ve ok onun İÇİNDE duruyor.
   Sınıf `.cta-arrow`ın ÜSTÜNE biner (dosyada ondan sonra, aynı özgüllük), üç
   şeyi geri yazar:

   1) TİPOGRAFİ — taban bileşen `--fs-lg` ve normal yazım; rozet `--fs-sm`,
      büyük harf, harf aralıklı. Sırf sınıf sırası taşıdığı için burada
      yeniden yazılıyor, `.eyebrow`ın kendi kuralı sessizce kaybediyor.
   2) DİSK KALKAR, GERİYE YALNIZ GLYPH KALIR (kullanıcı kararı). Taban bileşen
      oku dolu bir çipin içine koyuyor; rozetin İÇİNDE o disk pilin içinde
      ikinci bir pil oluyordu.
   3) RENK: MAVİ ÇIKAR, BÖLÜM AKSANI GİRER — ok `color: inherit` ile rozetin
      kendi mürekkebini sürüyor. Kontrast sorusu da böyle kapanıyor: glyph,
      yanındaki metinle AYNI renk, yani rozet yazısı okunuyorsa ok da okunur.
      (Denenip bırakılan ara adım: aksan renginde disk + koyu glyph. Beyaz
      chevron aksan turuncusunda #DC8214 üzerinde **2.90**, grafik eşiğinin
      3:1 altındaydı; koyu glyph geçiyordu ama disk fikri zaten elendi.)

   Ok `»` (fa-angle-double-right, FA5 Free Solid) — tek chevron rozetin
   içinde "bir şey daha var" değil "kapalı" gibi okunuyordu.
   MIN-HEIGHT 44px TABANDAN GELİR ve dokunulmaz: rozet 34px'lik bir etiketti,
   bağlantıya dönüştüğü an dokunma hedefi (WCAG 2.5.8) onu bağlar. */
/* TIKLANABİLİR PİL — referans görselin birebir karşılığı (2026-09-07,
   kullanıcı kararı). Kabuk tabandan (`.eyebrow`) gelir; buradaki fark dört
   şey: RENK, ölçü, ok ve tepki.

   RENK BURADA MAVİ, aksan DEĞİL — ve bu bilinçli bir ayrım: etiket çipi
   bölümün rengini taşır (ritim), eylem sitenin tek eylem rengini
   (`--btn`). İstisna dört dünya rozeti: orası hem etiket hem bağlantı ve
   kullanıcı kararıyla aksan rengini sürüyor (`.wall-head` kuralı, aşağıda).

   YAZI KOYU KRALİYET MAVİSİ (`--btn-tx`, beyazda 5.17), OK BİR KADEME AÇIK
   (%88 aksan + beyaz): referansta okun metinden açık olması, düğmenin yönünü
   metinden ayıran şey. */
.eyebrow-cta {
  --ec: var(--btn);
  position: relative;
  gap: 11px;
  font-weight: 800; letter-spacing: .05em;
  color: var(--btn-tx);
  /* ÖLÇÜ: 13/26 → 9/18 (2026-09-07, kullanıcı: "buton bu kadar büyük olmasın").
     Pil bir bilgi satırının ucunda duruyor ve o satırdan uzun görünüyordu;
     dokunma hedefi tabandaki `min-height: 44px`ten geliyor, dolgudan değil. */
  padding: 9px 18px;
  transition: transform var(--t-sm) var(--ease-out), box-shadow var(--t-sm) ease,
              border-color var(--t-sm) ease;
}
/* ÜÇ KÜÇÜK ÇİZGİ, PİLİN SOL ÜST DIŞINDA. Referansın "çocuk uygulaması"
   karakteri buradan geliyor ve tek işi o: dekoratif, `pointer-events: none`,
   ekran okuyucuda yok (pseudo-element). SVG satır içi data-URI — yeni bir
   varlık dosyası açmıyor (CI perf bütçesine sıfır bayt) ve yuvarlak uçlu
   stroke, FA glyph'iyle yapılamayacak tek şey oydu.
   TEK İSTİSNA `.faq-two-more` (aşağıda): orada süs, hemen üstündeki bölümün
   düğmesiyle arka arkaya düşüyordu. */
.eyebrow-cta::before {
  content: "";
  position: absolute; left: -11px; top: -10px;
  width: 24px; height: 24px;
  pointer-events: none;
  /* RENK MASKEDEN GELİR, SVG'DEN DEĞİL. Data-URI'nin içine `var(--ec)` yazılamaz
     (URL bir dize, custom property orada çözülmez), o yüzden çizgiler ilk
     halinde SABİT maviydi ve turuncu rozetin yanında yabancı duruyordu. SVG
     artık yalnız ŞEKLİ veriyor (alfa maskesi), rengi zemin katmanı taşıyor —
     böylece süs de pilin öteki üç katmanı gibi `--ec`den türüyor. */
  background: color-mix(in srgb, var(--ec) 80%, #FFF);
  -webkit-mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="none" stroke="%23000" stroke-width="3.2" stroke-linecap="round"><path d="M19.5 4 16.4 10.4"/><path d="M9.5 7.5 13.6 11.4"/><path d="M4.5 17.6 10.2 16.4"/></svg>') no-repeat center / contain;
  mask: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30" fill="none" stroke="%23000" stroke-width="3.2" stroke-linecap="round"><path d="M19.5 4 16.4 10.4"/><path d="M9.5 7.5 13.6 11.4"/><path d="M4.5 17.6 10.2 16.4"/></svg>') no-repeat center / contain;
}
.eyebrow-cta::after {
  content: "\f101";   /* fa-angle-double-right */
  /* AİLE VE AĞIRLIK BURADA YAZILIR, `.cta-arrow`tan MİRAS BEKLENMEZ: bu sınıfı
     `.cta-arrow` olmadan taşıyan bağlantılar var (`.gw-more`) ve orada glyph,
     başlık fontunun tanımadığı bir kod noktası olarak (dizgi çubukları gibi)
     çiziliyordu. FA5 Free Solid 900 ağırlık ister; anchor'ın kendi 800'ü
     pseudo-element'e de inerdi. */
  font-family: "Font Awesome 5 Free"; font-weight: 900;
  width: auto; height: auto;
  /* Ok METİNDEN BÜYÜK ve bir kademe AÇIK: küçük büyük harfli bir etikette aynı
     boyda ve aynı renkte bir `»` harflerin arasına karışıyor. */
  font-size: 1.1em;
  color: color-mix(in srgb, var(--ec) 88%, #FFF);
  background: none; border-radius: 0;
}
/* Altı çizili bir rozet düğme değil, yanlışlıkla linklenmiş bir etiket gibi
   duruyor — hover'da düğme KALKAR ve halesi büyür. Okun 3px kayması TABANDAN
   (`.cta-arrow:hover::after`) gelir, yalnız oradaki `--btn-deep` maviye
   dönüşü iptal edilir. */
.eyebrow-cta:hover {
  text-decoration: none;
  transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--ec) 58%, transparent);
  box-shadow: 0 16px 30px -14px color-mix(in srgb, var(--ec) 70%, transparent),
              inset 0 1px 0 rgba(255, 255, 255, .8);
}
.eyebrow-cta:hover::after { background: none; }
.eyebrow-cta:focus-visible { outline-color: var(--sec-accent, var(--btn-tx)); }

/* ANA SAYFANIN "İÇİNDEKİLER" SATIRI (2026-09-01, konsey kararı 8) — her ÖZET
   bölümün dibinde, tam sayfasına giden tek tip bağlantıyı ortalayan satır.
   Kendi görseli YOK: zemin, kenar, gölge yazmaz — görünen şey yalnız
   `.cta-arrow`ın kendisi. Bir yüzey eklemek onu bölümün içindeki ikinci bir
   kutuya, yani "dolu blok sayısı" hesabına sokar.

   ÜST BOŞLUK BİR KADEME BÜYÜK (`.energy-line`ın 22px'ine karşı 26-38px):
   bağlantı bölümün içeriğinin PARÇASI değil, onun ardından gelen bir
   "devamı var" işareti — içerikle aynı aralıkta dururken listenin son satırı
   gibi okunuyordu. */
.sec-more { display: flex; justify-content: center; margin: clamp(26px, 3.4vw, 38px) 0 0; }
/* Rozet biçimli bağlantı bu satırda da durabilir (bkz. `.eyebrow-cta`), ama
   `.eyebrow`ın 16px'lik alt payı orada satırın altına ölü boşluk bırakır —
   rozet bir başlığın üstünde değil, bölümün dibinde. */
.sec-more .eyebrow-cta { margin-bottom: 0; }

/* GECE YÜZEYİNDE MÜREKKEP ÇEVRİLİR, VE BU ÖLÇÜLMÜŞ BİR ZORUNLULUK.
   `.night` lacivert bir yüzey ve İKİ TEMADA DA öyle kalıyor; `--btn-tx` ise
   açık temada `--btn`in kendisi (#2563EB). Gradyanın üç durağında ölçüldü:
   **2.29 / 3.04 / 3.47** — üçü de AA'nın altında, en kötüsü de kopyanın
   durduğu sol üst durağın (#23346B) üzerinde. Koyu temada aynı token açık uca
   dönüyor (#8FB4FF, 5.71-8.66) ve geçiyor, ama kural KOŞULSUZ yazılır: yüzey
   temayla değişmiyor, o yüzden mürekkebi de yüzeyin kendi token'ı taşır
   (`--night-tx`, 10.44-15.82).
   ÇİP DOKUNULMAZ — kendi zeminini (`--btn`) taşıyor, beyaz chevron orada her
   yüzeyde 4.6:1; onu da çevirmek bağlantıyı iki farklı dilde konuşturur.
   Kural `.night`e kapsanmıştır, yani `/uyku` ve `/gelisim`in lacivert bantları
   bu sınıfı taşıdığı gün aynı düzeltmeyi bedavaya alır. */
.night .cta-arrow { color: var(--night-tx); }
.night .cta-arrow:focus-visible { outline-color: var(--night-tx); }
/* ÇİP DE ÇEVRİLİR — ve bu ikinci ölçüm. Taban çip `--btn` (#2563EB) zemin,
   beyaz chevron: beyaz/çip 5.17 (glyph okunur), ama ÇİPİN KENDİSİ gece
   duraklarına karşı **2.29 / 3.04 / 3.47** — ve bağlantı tam da en açık
   durağın (#23346B) üzerinde duruyor, yani disk zemine gömülüp geriye
   "havada duran bir chevron" kalıyordu. Gece sürümünde disk `--blue-light`
   (5.41-8.21) ve glyph lacivert (7.20). Renk uydurulmadı: `--blue-light`
   sitenin gece mavisi ve `--blue-ink` koyu temada zaten ona dönüyor.
   HOVER'I DA ÇEVİRMEK ŞART: taban hover `--btn-deep`e KOYULAŞIYOR, gece
   yüzeyinde bu diski görünür olmaktan çıkarır — burada yön ters, disk
   açılır (`--night-tx`, glyph 13.87). */
.night .cta-arrow::after { color: #14204A; background: var(--blue-light); }
.night .cta-arrow:hover::after { background: var(--night-tx); }

/* "Glass" adı tarihsel: yüzey artık opak, cam değil. backdrop-filter kaldırıldı
   — koyu temada --card alfası 1.0 olduğu için backdrop matematiksel olarak
   hiç katkı veremiyordu; açık temada .96 ile katkısı ölçüm eşiğinin altında. */
.glass {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow);
}

/* Scroll reveal — hikâye kitabı sayfası. `html.js` guard'ı ZORUNLU: JS yoksa
   içerik gizlenmez. (Sınıfı Layouts/Site.html <head>'indeki tek satırlık
   script ekler.)

   Bölüm düz kaymaz: ALT KENARINDAN menteşelenir, üstü hafifçe geriye yatmış
   halden düzlüğe çevrilir — kitap sayfası gibi. Dört karar yük taşıyor:

   - `perspective()` transform LİSTESİNİN İÇİNDE, ata öğede değil. `.reveal`
     sayfa boyunca onlarca ayrı ebeveynin altında duruyor; hepsine `perspective`
     vermek mümkün değil. Bedeli: kaçış noktası `transform-origin`e, yani alt
     kenara oturur — menteşenin zaten orada olmasını istediğimiz için sorun değil.
   - Bitiş `transform: none`, `perspective(...) rotateX(0)` DEĞİL. Kalıcı bir 3B
     transform öğeyi kendi katmanına terfi ettirir ve metin sabit çözünürlükte
     rasterlenip bulanık kalır. Hareket boyunca 3B, bittiğinde hiç transform yok.
   - `transform-origin` is-visible'da SIFIRLANMIYOR: sınıfın eklendiği an origin
     de değişseydi geçiş görünür bir zıplamayla başlardı. Kalıcı alt-kenar
     origin'in tek yan etkisi kendi `rotate`'i olan hover'lardı; sitede artık
     hiç örneği yok (`.quick-card`ın -1.4deg'lik sticker eğimi 2026-08-27'de
     hızlı çözüm sahnesiyle birlikte kalktı, bkz. §11).
   - Açı bilerek 6deg + perspective 1100px: 400px'lik bir karoda üst kenar ~%3
     daralır. Sayfa çevrilme hissi okunur, içerik yamulmuş görünmez. Daha
     kısa perspective ya da >8deg açıda kartlar "devriliyor" gibi duruyordu.
   translateY 26px→18px indi: dönüş zaten dikey yol katıyor, ikisi toplanınca
   giriş fazla uzuyordu. */
.js .reveal {
  opacity: 0;
  transform: perspective(1100px) translateY(18px) rotateX(6deg);
  transform-origin: 50% 100%;
  transition: opacity var(--t-xl) ease var(--d, 0ms), transform var(--t-xl) var(--ease-out) var(--d, 0ms);
}
.js .reveal.is-visible { opacity: 1; transform: none; }

/* ----------------------------------------------------------------------------
   4) Navbar — ORTADA NAVİGASYON KAPSÜLÜ (2026-08-26, kullanıcı kararı)

   Üç kutu: sol logo · ortada yedi sekmelik KAPSÜL · sağda dil + tema + CTA.
   Öncesinde navbar kenardan kenara saydam bir satırdı ve kaydırınca sayfa
   genişliğinde buzlu bir BANT açıyordu (`.nav::before`). Bugün bant yok: yüzey
   yalnız kapsülün (ve yanındaki iki küçük pilin) kendisinde, yani navbar
   sayfanın üstünde YÜZER.

   YÜKÜ TAŞIYAN KARARLAR:

   - `position: fixed`, `sticky` DEĞİL — ve bu bir gerileme değil, aynı davranış.
     Navbar zaten `inset: 0 0 auto` ile her zaman tepeye yapışık; `sticky`ye
     çevirmek onu AKIŞA sokar, yani sayfanın en üstünde 72px'lik gerçek bir yer
     kaplar. Sitedeki her hero o payı `calc(var(--nav-h) + …)` ile KENDİ
     dolgusundan veriyor (hero, `pageHero`, /uyku, /gelisim, /fiyatlandirma…):
     akışa giren bir navbar o payı ikinci kez ekler ve on sayfanın onunda birden
     ~76px'lik ölü bant açar. "Floating" görüntüsünü veren şey konumlandırma
     değil, ÜSTTEKİ 14px'lik dolgu (aşağıda) ve bandın yokluğu.
   - DIŞ DOLGU 14px → kaydırmada 8px. Sıkışmanın tamamı burada: `--nav-h` (76px)
     navbar'ın durgun boyundan (44 + 28 = 72px) bilerek 4px fazla ve KAYDIRILMIŞ
     boy 44 + 16 = 60px. Aradaki 16px, /ozellikler'in ilerleme bandının
     `--f2-nav-gap` payının ta kendisi. Yani İÇERİK SATIRI HER İKİ DURUMDA DA
     44px OLMAK ZORUNDA: kapsülü ya da CTA'yı kaydırmada küçülten bir kural o
     hesabı sessizce bozar ve bandın altından bir önceki sahne akıp geçer.
   - BLUR YALNIZ KAPSÜLDE (ve dil/tema pilinde), çok hafif. Sayfa genişliğinde
     `backdrop-filter` kalıcı bir GPU katmanı demekti; bugün blur yalnız
     ~600px'lik bir kutuda ve yüzeyin %88 opak olmasının tek sebebi altından
     geçen içeriğin belli belirsiz okunması.
   - GLOW / BELİRGİN GÖLGE YOK. Kapsülü zeminden ayıran şey 1px kenar; renkli
     bir hale, sayfanın üstünde yüzen bir kutunun etrafına ikinci bir görsel
     olay koyardı (dünya kartlarının ve `.f2-media` halesinin aynı gerekçesi).
   - AKTİF SAYFA "MİNİ-PİLL": kapsülün içinde, sekmenin kendi zemini. Durum tek
     kaynaktan okunur — `aria-current="page"` şablonda, görünüm `.is-active`
     sınıfında; ikisi birlikte yazılır.

   `white-space: nowrap` LOAD-BEARING: navbar öğeleri esnek kutulardır ve dar
   bir masaüstünde (ölçüldü: 1280px) flex öğeleri içerik genişliğinin altına
   sıkışıyordu. Sıkışan bir etikette metin SARAR ve navbar tek bir breakpoint
   olmadan iki kat yükselir. Sarma yasak; yer sorunu §24'teki 1021–1440
   bloğunda boşluk toplayarak çözülür.
---------------------------------------------------------------------------- */
.nav {
  /* KAPSÜL PALETİ — bileşene kapsanmış üç değer. Koyu tarafın üçü de zaten
     sitenin token'ları (`--card-solid` #151B3D · `--border`
     rgba(140,145,255,.22)); açık taraf kapsüle özel, çünkü `--card` (%96 beyaz)
     ve `--border` (sıcak kahve) yüzen bir kutuda ikisi de yanlış: biri altından
     hiçbir şey geçirmiyor, öteki mavi kapsülün kenarında gri okunuyor. */
  --nav-cap:      rgba(255, 255, 255, .88);
  --nav-cap-edge: rgba(50, 78, 170, .14);
  --nav-cap-tx:   #24304A;
  /* Mini-pill mürekkebi + (eski) zemini. Mürekkep ham `--blue` DEĞİL — o, bu
     tintin üstünde 3.05:1 (eski `--blue-ghost` kuralının sessiz hatasıydı,
     16px/600 küçük metin sayılır). `--btn-deep` ile 5.8:1. NOT (2026-09-06):
     `--nav-pill` ZEMİNİNİ artık hiçbir kural basmıyor — hover/aktif pill
     öldü, yerine kelime mürekkebi + alt çizgi (sekme kuralının notu). Token
     yine de tanımlı kalır: Sleep.css gece hero'sunda ikisini birden çevirir
     ve `--nav-pill-tx` hover mürekkebi olarak yaşamaya devam ediyor. */
  --nav-pill:     rgba(37, 99, 235, .10);
  --nav-pill-tx:  var(--btn-deep);

  position: fixed; inset: 0 0 auto; z-index: 100;
  padding: 14px 0;
  transition: padding var(--t-sm) ease;
}
[data-theme="dark"] .nav {
  --nav-cap:      var(--card-solid);
  --nav-cap-edge: var(--border);
  --nav-cap-tx:   #CFD9F2;                  /* açık gri-beyaz, kapsülde 11.9:1 */
  --nav-pill:     rgba(108, 180, 255, .16);
  --nav-pill-tx:  var(--blue-ink);          /* #6CB4FF — pill üstünde 5.6:1 */
}
.nav.is-scrolled { padding: 8px 0; }

/* `display: contents` ŞART. `.nav-links` mobilde kayan panelin kendisi (bkz.
   §24) ve bağlantı + dil + tema ÜÇÜNÜ birden taşımak zorunda; masaüstünde ise
   kapsül ile dil/tema `.nav-inner` satırının iki AYRI öğesi olmalı. Sarmalayıcı
   burada dağılır, mobilde `display: flex` ile geri gelir. */
.nav-inner {
  position: relative;                       /* kapsülün çivilendiği kutu, aşağı bak */
  width: 100%;
  padding-inline: clamp(20px, 4vw, 48px);
  display: flex; align-items: center; gap: 14px;
}
.nav-links { display: contents; }

.nav-brand {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 10px;
  font-family: var(--font-head); font-size: 1.42rem; font-weight: 700;
  color: var(--tx1);
}
.nav-brand img { width: 42px; height: 42px; border-radius: 13px; }
.nav-brand:hover .nav-brand-mark { animation: wiggle var(--t-lg) ease; }
.nav-brand-name { white-space: nowrap; }

/* KIDO'NUN ELINDEKI KURE NEFES ALIR (2026-09-06, kullanici karari). Maskotu
   degistirmek yerine onun ZATEN TASIDIGI isigi canlandirir: karakter aynen
   kalir, header'a hareket gelir. Saf CSS parilti — YENI DOSYA YOK, perf
   butcesine sifir bayt (canli three.js ~600 KB olurdu, tavan 1.365 MB).
   Konum PNG'den OLCULDU (kido-mascot.png 512x512, pembe-magenta sarmal
   kumesi): kure merkezi %50 / %65, capi genisligin ~%26'si — parilti ondan
   genis ki kenari yumusak dagilsin. Yuzde oldugu icin 38px'ten 230px'e her
   basimda ayni yere oturur.
   `spsGlow` YENIDEN KULLANILDI (ambient keyframes) — kendi transform'unu
   tasiyor ve global prefers-reduced-motion blogu onu zaten kapsiyor, ek
   medya sorgusu gerekmiyor. Wiggle sarmalayiciya tasindi: img'de kalsaydi
   hover'da ayi donerken parilti yerinde kalir, kure isigindan kacardi. */
.nav-brand-mark { position: relative; display: inline-flex; }
.nav-brand-mark::after {
  content: ""; position: absolute; left: 50%; top: 65%;
  width: 46%; aspect-ratio: 1; border-radius: 50%;
  background: radial-gradient(circle,
    rgba(216, 116, 255, .95) 0%,
    rgba(176, 66, 240, .5) 38%,
    rgba(176, 66, 240, 0) 70%);
  mix-blend-mode: screen; pointer-events: none;
  animation: spsGlow 3.6s ease-in-out infinite;
}

/* ORTADAKİ KAPSÜL. Taban kural AKIŞTADIR (`margin-inline: auto`) ve mobilde
   kayan panelin içinde öyle kalır; masaüstünde (≥1021px) kapsül VIEWPORT
   MERKEZİNE ÇİVİLENİR — aşağıdaki bloğa bak, gerekçe orada.
   BOY 44px SABİT ve üç parçadan gelir: 34 (sekme) + 2×4 (dolgu) + 2×1 (kenar).
   Kenarı hesaba katmamak navbar'ı 74px'e çıkarıyordu ve `--nav-h` (76px) ile
   arasındaki pay 4px'ten 2px'e, `--f2-nav-gap`in ölçtüğü fark da 16px'ten
   14px'e düşüyordu — yani /ozellikler'in ilerleme bandı ile navbar'ın dibi
   arasında 2px'lik bir aralık açılıyordu (ölçüldü, Chromium). */
.nav-menu {
  flex: 0 1 auto;
  margin-inline: auto;
  display: flex; align-items: center; gap: 2px;
  padding: 4px;
  border-radius: var(--r-full);
  background: var(--nav-cap);
  border: 1px solid var(--nav-cap-edge);
  backdrop-filter: blur(10px) saturate(140%);
  -webkit-backdrop-filter: blur(10px) saturate(140%);
}

/* KAPSÜL VIEWPORT MERKEZİNE ÇİVİLENİR (≥1021px; 2026-08-27, kullanıcı kararı).
   Akışta `margin-inline: auto` kapsülü logo ile SAĞ GRUBUN ARASINDA ortalar —
   ama iki yan grup eşit genişlikte değil: sağda dil + tema + CTA var, solda
   yalnız logo. Fark ekranda görünüyordu: kapsülün merkezi viewport merkezinden
   **67px SOLDA** kalıyordu (1440×900'de ölçüldü). Bugün kutu akıştan çıkar ve
   merkeze oturur; ölçü artık yan grupların genişliğinden BAĞIMSIZ.
   Üç şey yükü taşıyor:
   - **Kapsam `min-width: 1021px` OLMAK ZORUNDA.** Altında kapsül kayan panelin
     İÇİNDE yaşıyor (§24); orada `position: absolute` onu panelin akışından
     çıkarır ve sekmeler üst üste biner.
   - **`.nav-side { margin-left: auto }` ŞART.** Kapsül akıştan çıkınca boşluğu
     paylaştıran `margin-inline: auto` da gitti; sağ grubu sağa yaslayan tek
     şey bu satır (mobil bloktaki `.nav-right` kuralının kardeşi).
   - **BİNDİRME ÖLÇÜLDÜ, varsayılmadı — ve GERÇEK ÇIKTI.** Eski kuralın
     gerekçesi buydu: çivilenmiş kapsül, iki yan grubun genişlik farkının
     YARISINI sağ paydan yer. İlk ölçümde 1021px'te kapsül ile dil pili
     arasındaki pay **-1.0px**, yani pil kapsülün üstüne biniyordu; §24'e
     eklenen 1021–1120 kademesi onu **+27.4px**'e çıkardı. Bugünkü ölçüm
     (Chromium, sol pay / sağ pay): 1920 → 508 / 352 · 1440 → 268 / 112 ·
     1280 → 258 / 123 · 1121 → 181 / 47 · 1021 → 152 / **27**. Kapsüle sekme
     eklemek, CTA'yı ya da dil pilini büyütmek en dar bandı yeniden negatife
     düşürür ve HİÇBİR ŞEY HATA VERMEZ — önce bu sayılar yeniden ölçülür.
     BU TABLO ALTI SEKMENİNDİR. 2026-09-07'de yedinci sekme ("Ana Sayfa")
     eklendi ve §24'ün iki kademesi hesapla genişletildi/kısıldı (kısılmış bant
     1280 → 1440, en dar bantta dolgu + punto); tablo O OTURUMDA ÖLÇÜLEMEDİ —
     tarayıcı yoktu. Yani bugünkü paylar tahmin; ilk fırsatta yeniden okunur. */
@media (min-width: 1021px) {
  .nav-menu {
    position: absolute;
    left: 50%; top: 50%;
    transform: translate(-50%, -50%);
    width: max-content;
    margin-inline: 0;
  }
  .nav-side { margin-left: auto; }
}

/* Dil + tema — sağ grubun sol yarısı. DOM'da kayan panelin içinde (yukarı bak),
   masaüstünde `display: contents` sayesinde burada. */
.nav-side {
  flex: 0 0 auto;
  display: flex; align-items: center; gap: 6px;
}

/* CTA + hamburger — panelin DIŞINDA, her genişlikte barda.
   `position: relative` + `z-index` LOAD-BEARING: mobilde kayan panel
   (`.nav-links`, `position: fixed`) sağ üst köşeyi kaplıyor ve konumlanmış bir
   öğe olarak konumlanmamış kardeşlerinin ÜSTÜNE boyanır. Bu ikisi olmadan
   hamburger panelin altında kalır — yani menüyü kapatacak düğme tıklanamaz. */
.nav-right {
  position: relative; z-index: 2;
  flex: 0 0 auto;
  display: flex; align-items: center; gap: 10px;
}

.nav-link {
  position: relative;
  display: inline-flex; align-items: center;
  min-height: 34px; padding: 0 15px;
  border-radius: var(--r-full);
  color: var(--nav-cap-tx);
  /* NUNITO 600, TEK MÜREKKEP (2026-09-06, beşinci tur; kullanıcı: "hepsi
     aynı lacivert, aynı font, Nunito 600 — hover'da sadece kelime mavi +
     altında minicik bir çizgi"). Aynı gün denenen iki şey burada öldü:
     · EL YAZISI (Caveat 600 ×1.3, "bugün ne yapsak'taki gibi") — token
       `--font-hand` eyebrow'da yaşamaya devam ediyor, Google Fonts satırına
       DOKUNULMAZ. ×1.3 çarpanı Caveat'in küçük x-yüksekliği içindi; Nunito'da
       kalsa sekmeler bir kademe BÜYÜMÜŞ okunur — üç kademesi de (burası,
       §24 dar bant, mobil panel) çarpansız döndü.
     · Mürekkep `--nav-cap-tx` (açıkta #24304A lacivert, 12.9:1; koyuda
       #CFD9F2; /uyku gece hero'su kendi çevirisini yapar — Sleep.css) —
       yani "lacivert" sabit pigment DEĞİL, kapsülün ölçülü metin token'ı:
       sabit yazılsa gece hero'sunda ve koyu temada görünmez olurdu.
     nowrap + min-height 34px DURUR (§24 kademe/44px hesabı; kapsül
     Quicksand ölçüsüne yakın genişliğe geri döndü, çivilenme payı rahatladı). */
  font-family: var(--font-body); font-weight: 600;
  font-size: var(--fs-lg);
  white-space: nowrap;
  transition: color var(--t-xs) ease;
}
/* RENKLİ SEKMELER DENENDİ VE KALDIRILDI (2026-09-06, aynı gün, dört tur;
   beşinci turda kullanıcı: "hepsi aynı lacivert"). Ne olduğu: her sekme
   nth-of-type ile altı metin token'ı (--blue-ink · --cat-oyna-tx ·
   --cat-kesfet-tx · --violet · --sun-ink · --ink/--moon gece çifti).
   Dört turda iki kez "iki sekme aynı renk" düzeltmesi yapıldı ve dersler
   KALIR — renk bu satıra geri gelecekse önce bunlar okunur:
   · morlar TEK AİLEDİR (violet 265° ile periwinkle 243° "aynı" okundu) —
     kesin ayrışan metin ailesi BEŞ: mavi · pembe · yeşil · amber · mor;
   · --cat-dusun-tx beyaz kapsülde 2.9:1 (büyük metin eşiği 3:1'in ALTI),
     turuncu ailesinin tek okunur ucu --sun-ink;
   · ham --cat-* asla metin olmaz (§1 yasağı);
   · mobil paneldeki `color: var(--tx2)` o gün düşmüştü ve GERİ GELMEDİ —
     tek mürekkep artık taban kuraldan (--nav-cap-tx) akar, panel zemini
     (--card-solid) o token'ın ölçülü yüzeyi. */
/* HOVER = KELİME MAVİ + MİNİCİK ÇİZGİ (2026-09-06, beşinci tur). Pill
   ZEMİNİ ÖLDÜ: hover ve aktif durum artık kutu boyamaz, yalnız kelimenin
   mürekkebini çevirir ve altına currentColor'dan minik bir çizgi koyar.
   Mürekkep yine `--nav-pill-tx` (açıkta --btn-deep 5.8:1, koyuda
   --blue-ink 5.6:1, /uyku gece hero'sunda Sleep.css'in beyazı) — ham
   --blue'nun 3.05:1 tuzağı ve token'ın tema/gece çevirileri aynen geçerli,
   `--nav-pill` zemin token'ı tanımlı kalır (Sleep.css çeviriyor, silinirse
   çeviri yetim düşer). Çizgi ::after'da ve opacity ile açılır: scaleX
   yerine opacity, mobil panelde konumu ayrıca sola alınabilsin diye
   transform'u tek işe bırakır. Aktif sayfa AYNI dili konuşur (mini-pill
   yerine kalıcı çizgi); durum kaynağı değişmedi — aria-current şablonda,
   görünüm .is-active'de. */
.nav-link::after {
  content: "";
  position: absolute;
  left: 50%; bottom: 5px;
  width: 18px; height: 2px;
  margin-left: -9px;
  border-radius: var(--r-full);
  background: currentColor;
  opacity: 0;
  transition: opacity var(--t-xs) ease;
}
.nav-link:hover { color: var(--nav-pill-tx); }
.nav-link.is-active { color: var(--nav-pill-tx); }
.nav-link:hover::after,
.nav-link.is-active::after { opacity: 1; }

.nav-lang {
  display: inline-flex; align-items: center;
  background: var(--nav-cap);
  border: 1px solid var(--nav-cap-edge);
  border-radius: var(--r-full);
  padding: 3px;
  backdrop-filter: blur(10px) saturate(140%);
  -webkit-backdrop-filter: blur(10px) saturate(140%);
}
.nav-lang-btn {
  position: relative;
  display: inline-flex; align-items: center;
  min-height: 32px; padding: 0 11px;
  border-radius: var(--r-full);
  font-family: var(--font-head); font-size: var(--fs-sm); font-weight: 700;
  /* PASİF DİL SÖNÜK (2026-09-07, kullanıcı kararı: "seçim net belli olmuyor").
     Eskiden pasif dil `--nav-cap-tx` (#24304A, kapsülde ~12:1) ile sitenin en
     koyu mürekkebini taşırken AKTİF olan `--blue-ink`ti — ve o token açık
     temada ham `--blue`nin (#2E8BF7) takma adı, yani beyaz topuzun üzerinde
     **3.03**. Seçili olan, seçili olmayandan dört kat sönük çıkıyordu.
     Şimdi ikisi de yerini biliyor: pasif `--tx2` (5.6), aktif `--btn-tx`
     (#2563EB, 5.17) + beyaz topuz + gölge. */
  color: var(--tx2);
  transition: color var(--t-xs) ease;
}
.nav-lang-btn:hover { color: var(--nav-cap-tx); }
/* Görseli büyütmeden dokunma hedefini ~44px'e çıkar (WCAG 2.5.8) */
.nav-lang-btn::after { content: ""; position: absolute; inset: -8px -3px; border-radius: inherit; }
/* Aktif dil (`TR`/`EN`) `--card-solid` üstünde duruyor — koyu temada #151B3D.
   Etiket iki karakter ve `--fs-sm`: sitedeki en küçük durum işareti, o yüzden
   ham pigment değil mürekkep token'ı okur (ham `--blue` bu ikilinin ghost
   kardeşinde 4.04 ile AA'nın altında; bkz. `--blue-ink` notu). */
.nav-lang-btn.is-active {
  background: var(--card-solid); color: var(--btn-tx);
  font-weight: 800;
  box-shadow: var(--shadow-sm);
}

.nav-theme {
  display: inline-flex; align-items: center; justify-content: center;
  width: 40px; height: 40px;
  border-radius: var(--r-full);
  color: var(--nav-cap-tx);
  border: 1px solid var(--nav-cap-edge);
  background: var(--nav-cap);
  backdrop-filter: blur(10px) saturate(140%);
  -webkit-backdrop-filter: blur(10px) saturate(140%);
  transition: color var(--t-xs) ease, transform var(--t-xs) ease;
}
.nav-theme:hover { color: var(--nav-pill-tx); transform: rotate(15deg); }
.nav-theme svg { width: 19px; height: 19px; }
.nav-theme i { font-size: 18px; line-height: 1; }

/* Zemin `--btn` (#2563EB) + beyaz metin — `.btn-primary`dan gelir, burada
   yalnız ÖLÇÜ veriliyor. 44px hem satırın boyu hem dokunma hedefi (WCAG 2.5.8);
   ölçü `min-height` ile verilir, dolguyla değil — dolgu iki satıra sarabilecek
   bir etiketi de büyütür. */
.nav-cta {
  min-height: 44px; padding: 0 18px;
  font-size: var(--fs-md); white-space: nowrap;
}

/* Hamburger */
.nav-toggle {
  display: none;
  width: 44px; height: 44px;
  border: 1px solid var(--nav-cap-edge); border-radius: var(--r);
  background: var(--nav-cap);
  backdrop-filter: blur(10px) saturate(140%);
  -webkit-backdrop-filter: blur(10px) saturate(140%);
  cursor: pointer;
  flex-direction: column; align-items: center; justify-content: center; gap: 5px;
  z-index: 2;
}
.nav-toggle span {
  width: 20px; height: 2.4px; border-radius: 2px;
  background: var(--tx1);
  transition: transform var(--t-sm) ease, opacity var(--t-sm) ease;
}
.nav.is-open .nav-toggle span:nth-child(1) { transform: translateY(7.4px) rotate(45deg); }
.nav.is-open .nav-toggle span:nth-child(2) { opacity: 0; }
.nav.is-open .nav-toggle span:nth-child(3) { transform: translateY(-7.4px) rotate(-45deg); }

/* ----------------------------------------------------------------------------
   5) Hero
---------------------------------------------------------------------------- */
/* HERO TAM OLARAK BİR EKRANDIR. Eskiden dolgu sabitti (üstte 54–110px + nav,
   altta 60–104px) ve hero ~1060px'e çıkıyordu: masaüstünde bile alt ucu — yani
   waitlist formu ve store rozetleri — ilk ekranın ALTINDA kalıyordu. Ziyaretçi
   asıl eylemi görmek için kaydırmak zorundaydı, üstelik yukarıda 180px boş
   dolgu dururken. İki dert tek karar: dolgu küçülür, `min-height: 100svh` +
   `align-content: center` ile ARTAN dikey boşluk içeriğin arasına değil
   ETRAFINA dağılır. Yüksek ekranda hero kendiliğinden ferahlar, kısa ekranda
   sıkışır ama taşmaz.
   - `svh`, `vh` DEĞİL: mobilde adres çubuğu açıkken 100vh viewport'tan büyüktür
     ve hero yine ekrana sığmazdı.
   - `safe center`: mobilde tek kolona inince içerik ekrandan uzun olur; düz
     `center` negatif boşluğu iki yana taşırır ve hero'nun TEPESİ navbar'ın
     altında kalır (kaydırarak da ulaşılamaz). `safe` o durumda `start`a döner.
     Düz `center` önce yazılır: desteklemeyen tarayıcı onu okur. */
.hero {
  position: relative;
  display: grid;
  align-content: center;
  align-content: safe center;
  min-height: 100vh;
  min-height: 100svh;
  padding: calc(var(--nav-h) + clamp(18px, 3vh, 44px)) 0 clamp(22px, 3.5vh, 52px);
  overflow: clip;
}

/* HERO ARKA PLANI ARTIK YOK — iki kuşak da burada öldü, ikisi de geri gelmesin:
   1) Yüzen renkli "blob" ışıma küreleri (sol/sağ açık mavi, altta amber bir
      "güneş"): zemini yıkayıp sayfayı bulanıklaştırıyordu → kaldırıldı.
   2) `.hero-bg` + `.hero-dots` (26px mavi nokta ızgarası, parallax'ın uzak
      düzlemi): 2026-09-01, kullanıcı isteği + konsey (panel 10 kişi, A 5 · B 4
      · C 1 · F 1). İki gerekçe: ızgara markanın TERSİ bir dil — suluboya ve
      yuvarlak hatlı bir sitedeki tek "teknik/şablon" dokusuydu (Deniz: "bir
      şablon kokuyor"); ve doku YALNIZ hero'nun arkasındaydı, yani sayfanın
      geri kalanı çıplak krem kalıyordu. Yerine geçen şey hero'da değil
      `body`de — ilk denemesi (ortam ışığı) aynı gün geri alındı, notu
      yukarıda; bugünkü karşılığı arka plan figürleri.
   Nokta dokusunu geri isteyen biri çıkarsa, ölçüm de burada kayıtlı: kâğıt
   greninin ".035 görünmez" ölçümünde hero'da "gren var" sanılan doku tam
   olarak bu ızgaraydı — yani hissi taşıyan şey buydu, ve karşılığı boş
   bırakılmadı, `body`ye taşındı. */

.hero-grid {
  width: min(var(--container), 100% - 40px);
  margin-inline: auto;
  display: grid;
  /* SOL KOLON GENİŞLETİLDİ: 1.08fr/.92fr → 1.22fr/.78fr (2026-09-05 üçüncü
     istek; kullanıcı: "başlığı küçültme, ALANI GENİŞLETEBİLİRSİN"). Yeni
     h1'in ikinci satırı ("ekran dışı aktivite fikirleri.") tek satır sözü
     verdi ve punto kolon eninden türüyor (cqw, §5 başlık notu) — kolonu
     genişletmek puntoyu BÜYÜTMENİN yolu. Sağ kolonun bedeli ölçülür: telefon
     330px sabit, kolon .78fr'de her genişlikte onu taşımaya yeter; kartların
     bindirmesi phone-wrap'a göre olduğu için onlar telefonla birlikte kayar
     (bant payı ölçümü aşağıdaki kart bloğunda). */
  grid-template-columns: minmax(0, 1.22fr) minmax(0, .78fr);
  gap: clamp(44px, 6vw, 92px);
  align-items: center;
}

/* EYEBROW ÇİP DEĞİL, DÜZ SATIR (2026-09-05, "A · Gökyüzü" — kullanıcı:
   "çiplerin kalktığı yerlerde sen de kaldır"). AYNI GÜN İKİ REVİZYON DAHA:
   (1) "rengi değişsin ama yazı tipi böyle olsun" → büyük-harf + harf aralığı
   + mürekkep çizgisi (::after) EMEKLİ, renk Kidlio mavisi; (2) "bu fontla yaz
   Caveat, 500–600 ağırlık … sonuna kalp koy el yazısı ile" → satır artık
   CAVEAT 600 (Google Fonts, Layouts/Site.html'den tek ağırlık yüklenir;
   yedek zincir sistem el yazıları). Caveat'in x-yüksekliği küçük — aynı
   optik boy için punto Quicksand'inkinden bir-iki kademe BÜYÜK yazılır,
   küçültme "font düzelsin" diye geri alınmaz. Renk --blue, --btn değil:
   --btn h1 vurgusunun ve düğmelerin tonu, eyebrow onlarla yarışmaz.
   Emekli çizgi geri istenirse: width 44px, height 3px, margin-top 7px,
   currentColor %85. */
.hero-eyebrow {
  display: inline-block;
  /* Dikey ritim GRUPLUDUR, eşit aralıklı değil. Eskiden her blok arası 24–30px
     idi; eşit aralıklı bir istif gruplanmaz, duvar gibi okunur — "kalabalık"
     hissinin yarısı oradan geliyordu. Artık üst grup (etiket + başlık + alt
     başlık) sıkı, gruplar arası (→ rozetler, → CTA) geniş. Değerler `vh`'ye
     bağlı: yüksek ekranda açılır, kısa ekranda kapanır. */
  font-family: var(--font-hand);
  font-weight: 600;
  font-size: clamp(1.45rem, 2vw, 1.75rem);
  color: var(--blue);
  animation: fadeUp var(--t-xl) ease both;
}
/* El çizimi kalp — satırın parçası, emoji değil (emoji yasağı testli).
   currentColor: satır hangi mürekkebi giyerse kalp de onu giyer. */
.hero-eyebrow-heart {
  width: .8em; height: auto;
  vertical-align: -.08em;
  margin-left: 6px;
  rotate: -6deg;
}
/* ÇİP SATIRI (2026-09-01). Alt marj ÇİPTEN BURAYA taşındı: iki çip dar ekranda
   alt alta sarıyor ve marj çipin kendisinde kalsaydı sarma noktasında ikisinin
   ARASINA da girerdi (26px + satır boşluğu = hero fold'un altına iner; mobil
   ilk-ekran bütçesi Site.css §5'te ölçülü duruyor).
   `justify-content` mobilde `.hero-grid`in `text-align: center`inden gelmez —
   flex kabı hizalamayı kendi yazar; 761px altında ortalanır (§5'in sonunda). */
.hero-tags {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 10px;
  margin-bottom: clamp(12px, 2.4vh, 26px);
}
/* DENEME ÇİPİ (`.hero-trial`) 2026-09-05'TE ÖLDÜ — dördüncü yeri olmadı.
   Yolculuğu: `.hero-tags` satırı (2026-09-01) → formun üstü (aynı gün) →
   telefonun sağındaki bant (2026-09-05 sabahı) → ve aynı gün "A · Gökyüzü"
   hero'suyla birlikte KALDIRILDI: sağ bant artık iki uygulama kartının
   (`.hero-card`, aşağıda), deneme vaadi ise form panelinin köşesindeki sarı
   %50 etiketinin ikinci satırı ("+ 7 gün ücretsiz deneme", `.hero-deal`).
   Böylece 2026-09-01'in gerekçesi de geri geldi: vaat formun bağlamında
   okunuyor (kaydol → çıkınca deneme senin). Çip geri istenirse önce
   docs/ui/Home-Hero.md'nin 2026-09-05 bölümü okunur — bandın genişlik
   hesapları ve ≤960px satır düzeninin üç sessiz tuzağı orada kayıtlı. */
/* SOL KOLON BİR CONTAINER (2026-09-05 üçüncü istek: "ekran dışı aktivite
   fikirleri tek satırda olsun", "tikli alanlar da tek satırda olsun").
   Başlığın ve rozet satırının "tek satır" sözü viewport'a değil kolonun KENDİ
   enine göre verilmek zorunda: iki kolonlu düzende kolon ~%54, tek kolonluda
   %100 — vw katsayısı iki rejimde birden doğru olamaz, cqw olur. Parallax'ın
   `.hero-copy`a yazdığı inline transform ile çakışmaz (inline-size containment
   yalnız yatay ölçüyü kapsar). */
.hero-copy { container-type: inline-size; }
/* Puntoda `min(6vw, 7.4vh)`: hero artık tek ekrana sığmak zorunda ve iki
   satırlık başlık o bütçenin en büyük kalemi. Yalnız genişliğe bağlıyken geniş
   ama ALÇAK bir ekranda (16:10 dizüstü, açık geliştirici araçları) 4.3rem'lik
   başlık tek başına ~150px yiyip formu aşağı itiyordu. vh terimi ancak ~930px
   yükseklik altında devreye girer — normal masaüstünde punto aynı. */
.hero-title {
  font-size: clamp(2.5rem, min(6vw, 7.4vh), 4.3rem);
  font-weight: 700;
  letter-spacing: -.02em;
  margin-bottom: clamp(11px, 2.2vh, 24px);
  animation: fadeUp var(--t-xl) ease .08s both;
}
/* TEK SATIR SÖZÜ YALNIZ İKİ KOLONLU DÜZENDE (2026-09-05 üçüncü istek; kullanıcı
   düzeltmesi aynı oturumda: "başlığı küçültme, alanı genişletebilirsin").
   İki hamle birlikte çalışır: (1) `.hero-grid`in sol kolonu genişletildi
   (aşağıdaki grid notu), (2) punto o GENİŞLETİLMİŞ kolonun kendi eninden
   türer (cqw) ve `white-space: nowrap` sözü tutar — yani punto "küçültülmüş"
   bir sabit değil, kolonun taşıyabildiği EN BÜYÜK ölçü. Katsayı ölçülür,
   uydurulmaz (ölçüm notu aşağıda). 960 ve altında bu blok hiç açılmaz:
   mobil başlık eski clamp'iyle kalır ve sarabilir. cqw bilmeyen tarayıcı
   vw'li yedeğe düşer. */
/* KATSAYI ÖLÇÜLDÜ (Chromium 1280×900, Quicksand 700, letter-spacing -.02em)
   ve KOPYAYLA BİRLİKTE DEĞİŞİR — üç değer de ölçümde kayıtlı:
   - BUGÜNKÜ KOPYA ("0–10 yaş çocuklar için / ekransız aktivite fikirleri."):
     en geniş satır EN hl'i ("screen-free activity ideas.", punto × 11.15) →
     100/11.15 = 8.97; %2 pay ile 8.75cqw. 673 kolonda punto 58.9 — 2026-09-10
     öncesindeki 8.35'ten YÜKSEK, çünkü TR hl'i "ekran dışı"dan "ekransız"a
     kısaldı ve en geniş hat TR'den EN'e geçti.
   - "ekran dışı aktivite fikirleri." (2026-09-06 → 09-10): en geniş hat TR
     hl'iydi (× 11.70) → 8.35cqw, 673 kolonda 56.2px.
   - "ekran dışı aktiviteler." (2026-09-05 gecesi, ertesi gün geri alındı):
     × 9.38 → 10.4cqw ve masaüstünde 4.3rem tavanı. Kopya kısalırsa hazır.
   ÜÇÜNCÜ SATIR DENENDİ VE GERİ ALINDI (2026-09-10, aynı gün): "pedagog
   onaylı" bir tur h1'in ikinci satırıydı, sonra okun yanına rozet oldu
   (`.hero-arrow-badge`). O turun ölçümü Home-Hero.md §2026-09-10'da duruyor
   ve ibare h1'e geri istenirse tekrar geçerli: iki satıra sığdırmak en geniş
   hattı × 16.64/17.50'ye çıkarıp puntoyu MOBİL tabanın (40px) altına
   düşürüyor, üç satır ise dikey freni doğrusallaştırmayı gerektiriyor.
   vw'li yedeğin tavanı 3.4rem: 54.4 × 11.15 = 607 ≤ 664 — cqw'siz tarayıcı
   geniş ekranda da taşmaz. */
/* `7.4vh` TERİMİ BURADA DA YAŞAR (tabandaki kuralın aynı gerekçesi): cqw'ye
   geçerken bir kez düşürüldü ve 1366×768'de hero 790px'e çıktı (ölçüldü — 22px
   taşma; 768'de 7.4vh başlığı frenliyor, heroH 768'e iner). İki satırda
   orantılı terim yetiyor; ÜÇ satırda yetmiyordu (o ölçüm Home-Hero.md'de). */
@media (min-width: 961px) {
  .hero-title {
    font-size: clamp(2rem, min(3.4vw, 7.4vh), 3.4rem);
    font-size: min(8.75cqw, 7.4vh, 4.3rem);
    white-space: nowrap;
  }
}
/* Vurgu satırı TEK RENK ve bir tık koyu. Eski gradyan (koyu→açık mavi)
   harflerin sağ ucunu solduruyordu; parlak azur (--blue) ise üstündeki koyu
   lacivert satırın yanında zayıf kalıyordu. --btn (kobalt) ile sayfada tek bir
   baskın mavi oluyor: hero vurgusu + butonlar aynı ton, --blue küçük aksanlara
   (link, çip, ikon) kalıyor. Sarı el-çizimi altı çizgi (::after) duruyor. */
.hero-title .hl {
  position: relative; display: inline-block;
  color: var(--btn);
}
/* Çizgi de bir tık koyu: #FFD166 (--sun) sıcak krem zeminde neredeyse eriyordu.
   #EDAE33 hâlâ güneş sarısı ama zeminden ayrışıyor. Renk data-URI'nin içinde
   (SVG stroke) olduğu için token'a bağlanamıyor — --sun'a dokunulmadı, o hâlâ
   "etkinlik öner" ikonunun ve tema geçişindeki güneşin rengi.
   /ozellikler h1'i AYNI deseni taşır (2026-08-30, kullanıcı onayı): kobalt
   sözcük + aynı çizgi. Gerekçe hero'nunkiyle aynı — vurgu sözcüğü hemen
   altındaki mavi CTA ile aynı tonu okur, sayfada tek baskın mavi kalır.
   Genişlik etkisi yok: çizgi yer kaplamaz, tek satır ölçüsü Features.css
   .f2-h1 notundaki hesabı izlemeye devam eder. */
/* Çizgi SATIRIN DEĞİL `.hl-mark`IN altında (2026-09-05 üçüncü istek: "ekran
   dışı alanın altı çizgili olsun") — mavi mürekkep satırın tamamında kalır,
   sarı vuruş yalnız ilk öbeğin ("ekran dışı" / "screen-free") altına iner.
   /ozellikler'in `.f2-h1 .hl::after`ı BİLEREK eski davranışta: orada vurgu
   tek kelime, çizgi zaten kelimenin altında.
   İKİ ÇİZGİNİN ÖLÇÜ BİRİMİ AYRI ve birleştirilmemeli: buradaki `.hl-mark`
   inline-block, yani ölçüsünü SATIR KUTUSUNDAN alır ve `bottom: -4px` doğru
   yere düşer; /ozellikler'deki `.hl` `inline` (satır sonu fırsatı açmasın
   diye, kendi notu aşağıda) ve orada aynı px değeri çizgiyi bir sonraki
   satırın harflerine bindiriyordu — o yüzden orası em ile yazılı. */
.hero-title .hl-mark { position: relative; display: inline-block; }
.hero-title .hl-mark::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -4px; height: 10px;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 10' preserveAspectRatio='none'%3E%3Cpath d='M2 7 Q 30 2, 60 6 T 118 4' fill='none' stroke='%23EDAE33' stroke-width='4' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 100% 100%;
}
/* `inline-block` DEĞİL `inline` + `nowrap` (2026-09-06). inline-block ATOMIK
   satır içi kutudur ve tarayıcı onun HEMEN ARDINDA bir satır sonu fırsatı
   açar; TR başlığında vurgudan sonra virgül geldiği için mobilde ikinci satır
   VİRGÜLLE BAŞLIYORDU (360·375·390·393·402·412·430px'te ölçüldü).
   Şablondaki `&#8288;` (word joiner) TEK BAŞINA ÇÖZMEDİ — ölçüldü: Blink
   atomik satır içi kutunun çevresindeki kırılma fırsatını word joiner ile
   bastırmıyor, HTML'de karakter duruyorken satır yine virgülle başlıyordu.
   `inline`da o fırsat hiç doğmaz. `nowrap` şart: altı çizgi `::after` ile
   mutlak konumlanıyor ve iki kelimelik vurgu ("hazır plan") kendi içinde
   sararsa çizgi yalnız ilk parçanın altına düşerdi — inline-block bunu
   dolaylı olarak engelliyordu, açık kural onun yerine geçer.
   Altı çizginin geometrisi DEĞİŞMEZ (ölçüldü: aynı x/genişlik/y). */
.f2-h1 .hl { position: relative; display: inline; white-space: nowrap; color: var(--btn); }
/* ÇİZGİNİN ÖLÇÜSÜ px DEĞİL em, ve bu bir güzelleştirme değil ÇAKIŞMA
   düzeltmesi (2026-09-10, kullanıcı: "responsivede sarı çizgi yazının üstüne
   biniyor"). `display: inline` bir kutunun mutlak konumlanan çocuğu, satır
   kutusuna değil YAZI TİPİNİN İÇERİK ALANINA göre yerleşir: Baloo 2'de o alan
   1.60em (ölçüldü: ascent 1.074em + descent 0.521em), oysa `.f2-h1`in satır
   yüksekliği 1.14em. Yani içerik alanı satır kutusundan her iki uçta ~0.23em
   taşar ve `bottom: -4px` çizgiyi taban çizgisinin 0.38em altına, yani BİR
   SONRAKİ SATIRIN harflerinin arasına indiriyordu. Masaüstünde görünmüyordu
   çünkü başlık orada tek satır (390px'te ölçüldü: çizgi 172.8–182.8, ikinci
   satırın büyük harf tepesi 175.8 — 7px örtüşme).
   Bugünkü kural taban çizgisine bağlıdır ve ÖLÇEKLE BÜYÜR: içerik alanının
   dibi taban + 0.52em olduğu için `bottom: .13em` + `height: .19em`, çizgiyi
   her puntoda taban + 0.20em ile + 0.39em arasına koyar (390'da 6.1–12.0px,
   ikinci satırın harflerine 1px değil ~4.5px pay kalır — `.f2-h1`in mobil
   satır yüksekliği aynı turda 1.14 → 1.22 oldu, gerekçesi Features.css'te).
   ORAN ANA SAYFANIN VURGUSUYLA AYNI HİZAYA GELDİ: `.hl-mark` çizgisi orada
   taban + 0.23em'de duruyor (inline-block olduğu için ölçüsünü satır
   kutusundan alıyor); burada 0.20em. px yazılırsa kural yine puntoya göre
   kayar ve çakışma başka bir genişlikte geri gelir. */
.f2-h1 .hl::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: .13em; height: .19em;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 120 10' preserveAspectRatio='none'%3E%3Cpath d='M2 7 Q 30 2, 60 6 T 118 4' fill='none' stroke='%23EDAE33' stroke-width='4' stroke-linecap='round'/%3E%3C/svg%3E") no-repeat center / 100% 100%;
}

/* DÖRT DÜNYA SATIRI (2026-09-05, ikinci referans görseli): başlığın hemen
   altında kalın mürekkep bir satır — dünya adları başlıkla alt metin arasında
   köprü. Üst grubun (etiket + başlık + bu satır + alt metin) parçası, o yüzden
   marjı sıkı; büyük boşluk gruplar ARASINDA kalır (§5 dikey ritim). */
.hero-cats {
  font-family: var(--font-head);
  font-weight: 800;
  font-size: clamp(1.12rem, 1.8vw, 1.4rem);
  letter-spacing: .01em;
  color: var(--tx1);
  /* `hero_sub` 2026-09-05'te kullanıcı kararıyla ÖLDÜ ("bunu kaldır") —
     üst grubu rozetlerden ayıran boşluğu (eski `.hero-sub`
     `margin-bottom: clamp(20px, 4vh, 40px)`) artık bu satır taşıyor.
     Alt metin geri gelirse boşluk ona geri verilir, iki yerde birden durmaz.
     Ölü kuralın geri kalanı: font 1.06–1.2rem, max-width 34em, fadeUp .16s.
     Mobil eşlikçileri de onunla gitti (960 bloğundaki `margin-inline: auto`
     ve kısa-ekran bloğundaki marj kısaltması). */
  margin-bottom: clamp(20px, 4vh, 40px);
  animation: fadeUp var(--t-xl) ease .12s both;
}

/* PEDAGOG ONAY SATIRI — hero'daki TEK yeşil, ve KUTU DEĞİL SATIR.
   (2026-08-26, kullanıcı kararı.) Uzun süre doygun yeşil zeminli, kenarlıklı,
   iki satırlık bir KART'tı. Kart olarak doğru çalışıyordu ama sol kolonda alt
   alta ÜÇ dolu blok bırakıyordu — yeşil kart → mavi CTA butonu → store
   rozetleri — ve hero'nun "kalabalık" okunmasının kaynağı renk sayısı değil
   tam olarak o yığındı (aynı teşhis §5'in başındaki hero notunda ve
   `.hero-soon` ghost kararında da yazılı).
   Satır aynı iddiayı taşır, ~46px daha az yer kaplar ve yeşili hero'da tek bir
   yere hapseder: sarı YALNIZ başlığın altı çizgisinde, yeşil YALNIZ burada,
   geri kalan her şey lacivert + Kidlio mavisi.
   GÖZDEN KAÇMASIN DİYE İKİ ÖNLEM: dolu yeşil bir onay diski (satırın tek
   grafiği) ve ilk öbeğin 800 ağırlıkta, `-ink` mürekkeple yazılması. Zeminsiz
   ama sessiz değil.
   Ayraç `·` gerçek metin (şablon notu): ekran okuyucu duraklamayı ondan alır.
   Boşluk `vh`ye bağlı ve GRUPLU kalır — alt başlıktan sonra sıkı, CTA'dan
   önce geniş (§5'in dikey ritim notu). */
/* SATIR-İÇİ AKAR, flex satır DEĞİL. Flex hâli masaüstünde aynı görünüyordu ama
   mobilde metin iki satıra sarınca onay diski İKİ SATIRIN ORTASINDA, metnin
   solunda asılı kalıyordu — cümlenin işareti değil, yanına konmuş bir ikon
   gibi. `display: inline-grid` + `vertical-align` ile disk cümlenin İLK
   kelimesiyle aynı satıra oturur ve sarma doğal akar; ortalama da mobilde
   `.hero-grid`in `text-align: center`inden bedava gelir (ayrı bir kural
   gerekmiyor). */
.hero-trust {
  max-width: 100%;
  margin: 0 0 clamp(22px, 4.6vh, 46px);
  font-size: var(--fs-xl); line-height: 1.55;
  color: color-mix(in srgb, var(--tx1) 72%, var(--tx2));
  animation: fadeUp var(--t-xl) ease .2s both;
}
/* Onay diski DOLU yeşil, beyaz glyph. Beyaz daire + yeşil glyph hâli zeminden
   hiç ayrışmıyordu. Gradyan AÇIK uçta başlayıp %70'te -deep'e oturur — glyph
   gövdesi hep -deep'in üstünde kalır (beyaz 3.4:1, grafik eşiği 3:1); açık ucu
   ortaya taşırsan eşik düşer. Hale --glow-c ile ölçekten gelir, elle yazılmaz.
   Ölçü 24px ve `vertical-align` ona bağlı: daha büyük bir disk satır kutusunu
   kendisi büyütür ve cümlenin satır aralığı komşularından ayrışır. */
.hero-trust-ico {
  display: inline-block;
  width: 24px; height: 24px;
  /* DİSK METNİN ORTASINA HİZALI ve hizanın ölçüsü UYDURULMAZ (2026-09-01,
     kullanıcı: *"check işaretini yazıyla ortala, aşağıya kaymış"*). Eski
     `vertical-align: -6px` ölçüldüğünde disk merkezini metnin görsel
     merkezinden 8,4px AŞAĞIDA bırakıyordu: `inline-grid`in taban çizgisi
     KENDİ İÇİNDEKİ glyph'in (FA check) taban çizgisidir, kutunun alt kenarı
     değil — yani -6px, sanılanın aksine, bilinmeyen bir referanstan ölçülen
     bir kaydırmaydı. `overflow: hidden` kutuyu kaydırma bağlamı yapar ve taban
     çizgisi ALT KENARA sentezlenir; hesap bundan sonra kapalı formdur:
     alt kenar = taban + 12px(yarı disk) - .35em(yarı cap yüksekliği).
     Halesi (`box-shadow`) kutunun DIŞINDA kaldığı için kırpılmaz. */
  position: relative;
  vertical-align: calc(.35em - 12px);
  margin-right: 9px;
  background: linear-gradient(145deg, var(--cat-kesfet) 0%, var(--cat-kesfet-deep) 70%);
  border-radius: 50%;
  color: #FFFFFF; font-size: var(--fs-xs);
  --glow-c: var(--cat-kesfet);
  box-shadow: var(--glow-sm), inset 0 1px 0 rgba(255, 255, 255, .3);
}
/* Mürekkep -deep DEĞİL -ink: -deep krem zeminde 3.35:1 ile ancak idare eder,
   -ink aynı hue'da (158°) ve 6.9:1. İkinci öbek yeşil DEĞİL, sitenin lacivert
   mürekkebi — ikisi de yeşil olsaydı satır "yeşil bir blok" okunurdu. */
/* Glyph AKIŞTAN ÇIKARILIR — dekor değil, hizanın ta kendisi: akışta kalırsa
   kutunun taban çizgisi onun taban çizgisi olur ve yukarıdaki hesap kapanmaz. */
.hero-trust-ico i { position: absolute; inset: 0; display: grid; place-items: center; }
/* TEKLİF ROZETİ (hero_trust4, 2026-09-06): disk YOK — yeşil disk ürün
   niteliğinin mührü, "7 gün ücretsiz deneme" bir TEKLİF; referans
   görselindeki ayrım da bu (üç yeşil disk + çıplak sarı yıldız). Renk
   duygu kartının kalbiyle aynı kararı verir: açık zeminde --sun-ink
   (dekor eşiği), koyu temada ham --sun. Glyph disksiz kalınca .7em'de
   nokta gibi kalıyordu → 1.7em (≈ disk çapının görsel dengi). Aynı
   özgüllük (0,1,0), dosyada sonra — base'i o yüzden yener. */
.hero-trust-ico--star {
  background: none;
  box-shadow: none;
  color: var(--sun-ink);
}
[data-theme="dark"] .hero-trust-ico--star { color: var(--sun); }
.hero-trust-ico--star i { font-size: 1.7em; }

.hero-trust strong {
  font-family: var(--font-head); font-weight: 800;
  color: var(--cat-kesfet-ink);
}
[data-theme="dark"] .hero-trust { color: var(--tx2); }
/* -ink gece zemininde okunmuyor; ham yeşile açılır (ikon iki temada da dolu). */
[data-theme="dark"] .hero-trust strong { color: var(--cat-kesfet); }

/* ÜÇ ROZET (2026-09-05, ikinci referans görseli — YALNIZ ana sayfa hero'su).
   Taban `.hero-trust` satır-içi akar (yukarıdaki gerekçe /kategoriler'in
   ortak bileşeni için hâlâ geçerli); ana sayfada üç kısa rozet var ve sarma
   ROZETLER ARASINDA olmalı, o yüzden kap flex + öğe `inline-flex`. Eski
   "flex'te disk iki satırın ortasında asılı kalır" tuzağı burada yok: rozet
   metni tek öbek, öbek içinde sarma `white-space` olmadan da pratikte
   gerçekleşmiyor (en uzunu ~200px). Üç etiketin ÜÇÜ DE lacivert mürekkep —
   yeşil yalnız disklerde kalır; üç yeşil etiket satırı "yeşil blok" yapardı
   (tek satırlı hâlin aynı gerekçesi). --tx1 temayla çevrilir, koyu tema için
   ayrı kural gerekmez; ama dark-strong kuralı (0,2,1) tek sınıflı yazımı
   (0,1,1) her zaman yener — o yüzden koyu tema seçicisi AÇIKÇA da yazılır
   (aynı özgüllük + dosyada sonra = ana sayfada geri alınır). Punto --fs-xl
   değil --fs: üç rozet --fs-xl'de 620px'lik kolonda iki satıra taşıyor. */
.hero-trust--badges {
  display: flex; flex-wrap: wrap; align-items: center;
  gap: 10px 1.5em;
  font-size: var(--fs);
}
.hero-trust--badges .hero-trust-item { display: inline-flex; align-items: center; white-space: nowrap; }
/* İnline-flex öğede dikey hiza `align-items`ten gelir; taban çizgisi hesabına
   gerek kalmaz. Kapalı-form `vertical-align` /kategoriler bileşeni için durur.
   ÖLÇÜLER EM (2026-09-05 üçüncü istek): rozet satırı masaüstünde TEK SATIR
   sözü verdi ve punto kolondan (cqw) türeyecek — disk/boşluk px kalsaydı
   satırın sabit kısmı küçülmez, dar kolonda söz yine bozulurdu. `.7em` glyph
   + `2.4em` disk ≈ eski 24px diskin --fs'teki ölçüsü; satır artık tek
   katsayıyla orantılı küçülüyor. */
.hero-trust--badges .hero-trust-ico {
  vertical-align: initial; flex: none;
  font-size: .7em;
  width: 2.4em; height: 2.4em;
  margin-right: .8em;
}
/* TEK SATIR YALNIZ İKİ KOLONLU DÜZENDE (≥961px): katsayı ölçüldü (aşağıdaki
   ölçüm notu) — punto kolon eninden türer, satır sarmaz. 960 ve altında kolon
   tüm ekran ama 390px'te üç rozet tek satıra ancak ~10px puntoyla sığar —
   okunmaz; mobilde sarma bilerek duruyor (taban kural), satır ortalanıyor. */
/* KATSAYI ÖLÇÜLDÜ ve 4. rozetle YENİDEN ÖLÇÜLDÜ (2026-09-06): üç rozetin
   değeri 2.27cqw'ydi (EN 43.31×, geniş dil İngilizce'ydi). "7 gün ücretsiz
   deneme" rozeti gelince geniş dil TR'ye döndü: toplam puntonun 54.08 katı
   (EN 53.11) — eski katsayıyla satır her masaüstü genişlikte ~120-150px
   taşıyordu (ölçüldü, _m4 turu). Sınır 100/54.08 = 1.85cqw; pay ile 1.81.
   BEDELİ AÇIK KAYIT: punto artık --fs tavanına HİÇ ulaşmıyor (kolon max
   ~674 → punto max ~12.2, 961'de 9.5) — dört rozetin tek satır sözü puntodan
   ödendi. Rozet kopyası yine UZARSA önce bu oran yeniden ölçülür. */
@media (min-width: 961px) {
  .hero-trust--badges {
    flex-wrap: nowrap;
    font-size: clamp(.6rem, .85vw, .95rem); /* cqw bilmeyen tarayıcı yedeği */
    font-size: min(1.81cqw, var(--fs));
  }
}
.hero-trust--badges strong,
[data-theme="dark"] .hero-trust--badges strong { color: var(--tx1); }

/* --- Nicelik: "1.000+ ekransız etkinlik" — TELEFONUN ALTINDAKİ STICKER ---
   2026-09-05 ("A · Gökyüzü", kullanıcı onayı, İKİ ADIM): önce sticker
   telefonun ALTINA indi ve 1440+ yan yerleşimi kalktı (bant kartların);
   aynı akşam KUTU DA EMEKLİ OLDU (kullanıcı: "1000+ etkinlik yazısını da
   örnekteki gibi yaz") — bugünkü biçim düz bir SATIR: mavi ikon + kalın
   sayı + etiket, akışta, telefonun altında. Aşağıdaki tarihçe KUTULU
   sticker'ın kararlarını anlatır; kutu geri istenirse ölçüleri ve tuzakları
   orada, `.sticker` kiti (kapanış + fiyat paneli) ondan türedi ve YAŞIYOR.
   Sayı bir dönem hero'nun altında kendi bölümündeydi (`.stat-line`, bir ekran
   boyu yer + tek cümle), sonra sol kolonda kutusuz MOR bir blok (mor gitti:
   hero lacivert + Kidlio mavisi, kategori taşımayan üçüncü bir aksan rengi
   burada karşılıksızdı), sonra telefonun tam üstünde onunla AYNI ENİDE
   lacivert bir BANT, sonra sol üst köşeye BİNEN küçük bir bilgi kartı. Dördü
   de geri dönüş sayılır. Bugün: telefonun tam üstünde ORTALANMIŞ, ona
   DEĞMEYEN, hafifçe eğik bir KİDLİO STICKER'I (2026-08-26 akşamı, kullanıcı
   kararı; ölçüler de kullanıcının: 170×75, 20px köşe, sayı 31px, eğim -2deg).
   YERİ EKRAN ENİNE GÖRE: 1440px'ten geniş ekranda telefonun SAĞINDAKİ boş
   bantta (kullanıcı kararı, aynı akşam), altında telefonun ÜSTÜNDE. İki
   yerleşim tek kutuyu paylaşır — ikinci bir sticker YOK, yoksa aynı iddia
   sayfada iki kez durur ve biri hep yanlış yerde olur.
   Bandın gerekçesi "telefonun kendi kapağı" idi ve düşme sebebi de oydu:
   telefon kadar geniş, doygun koyu bir yüzey cihazla aynı ağırlıkta okunuyor,
   yani kapak olsun diye yapılan şey kapağın altındakini bastırıyordu. Köşe
   kartından buraya iki şey taşındı ve kaldı: gölgesizlik, açık zemin + ince
   mavi çerçeve. Değişen tek şey sticker'ın telefona DOKUNMAMASI.
   Yükü taşıyan altı karar:
   - DAR EKRANDA AKIŞTA DURUR ve boşluk MARJLA verilir (`margin-bottom: 14px`,
     kullanıcı ölçüsü). Pay kutunun EĞİLMEMİŞ alt kenarından ölçülür; -2deg
     eğim alt-sağ köşeyi ~3px sarkıtır, yani gerçek boşluk köşeden köşeye
     11 → 17px arasında değişir ve ortalaması istenen 14px'tir. Sıfırdan
     büyük olduğu sürece sticker telefona DEĞMEZ — sözü tutan tek şey bu.
     Köşe kartı `position: absolute` idi ve bindirmesi `bottom: calc(100% -
     18px)` ile ölçülüyordu; "değmesin" istendiği anda o mekanizmanın tamamı
     gereksizleşti — akıştaki bir marj her `zoom` basamağında oransal kalır ve
     ölçülecek bir bindirme bırakmaz.
     Bedeli hero'nun dikey bütçesi: sağ kolon 688 → 776px (74 + 14 + 688).
     Merdiven (aşağıda) bunu taşıyor; 900/840/800/740/680 basamaklarının
     beşinde de hero tam 1.00 ekran (yeniden ölçüldü). 1440px'ten GENİŞ
     ekranda sticker akıştan çıkıp telefonun SAĞINA geçiyor (aşağıdaki medya
     sorgusu) ve o 93px'i hero'ya geri veriyor.
   - ORTALAMA SARMALAYICIDAN GELİR (`.phone-wrap` bir kolon + `align-items:
     center`), sticker'ın kendi marjından değil: kutu sabit genişlikte ve
     kolonun eni telefondan geliyor.
   - STICKER TELEFONLA BİRLİKTE SÜZÜLÜR (`phoneFloat`, aynı süre/easing,
     GECİKMESİZ). Telefon 7 saniyede 14px yukarı süzülüyor; sticker yerinde
     dursaydı aradaki boşluk 16 ile 30px arasında nefes alırdı — yani istenen
     ölçü yalnız duruşta doğru olurdu. Üç hareket çakışmaz: `fadeUp`
     `transform`u, `phoneFloat` `translate`i, eğim `rotate`ı kullanıyor.
   - ÖLÇÜ SABİT (170×74, boy `min-height` ile): içerik iki dilde de tek satır
     ("ekransız etkinlik" / "screen-free activities" 142px'lik iç genişliğe
     sığıyor, ölçüldü). Genişlik akışkan bırakılsaydı TR ve EN'de iki farklı
     sticker olurdu; `height` yerine `min-height`, çünkü sığmayan bir kopya
     kırpılmak yerine kutuyu büyütmeli.
   - EĞİM `rotate` İLE, `transform` ile DEĞİL: `transform: rotate(-2deg)`
     yazılsaydı `fadeUp`ın kendi transform'unu SİLERDİ ve sticker giriş
     animasyonunu sessizce kaybederdi (hero parallax'ta bir kez düşülen tuzak).
   - GÖLGE YOK (kullanıcı kararı, üç tasarımda da). Telefonun kendi
     `--shadow-lg`i zaten orada; ikinci bir gölge sticker'ı cihazdan koparıp
     sayfaya yapıştırılmış bir etiket yapar. Ayrımı ince mavi çerçeve verir.
   Sayı SABİT: eski `[data-count]` sayacı kaldırıldı (bkz. Index.html). */
.hero-count {
  /* AKIŞTA, telefonun altında ve ORTALANMIŞ (`.phone-wrap` kolonu). Boşluğu
     sarmalayıcının `gap`i verir — akıştan çıkarsa telefonla ilişkisi kopar.
     Telefonla birlikte süzülür (`phoneFloat`, sticker döneminin aynı
     gerekçesi: yerinde dursa aradaki boşluk nefes alırdı). */
  display: inline-flex; align-items: center; gap: 9px;
  margin: 0;
  font-size: var(--fs);
  color: var(--tx2);
  animation: fadeUp var(--t-xl) ease .26s both,
             phoneFloat 7s ease-in-out infinite;
}
/* (Satırın başındaki mavi ikon aynı akşam elendi — kullanıcı: "ikona gerek
   yok". Satır yalnız sayı + etiket.) */
/* YAN YERLEŞİM (1440+, sticker telefonun sağındaki bantta) 2026-09-05'TE
   KALKTI: bant "A · Gökyüzü" ile iki uygulama kartına verildi ve tek iddia
   iki yerde duramaz. Sticker artık HER ende akışta, telefonun altında.
   Eski eşiğin ölçümü kayıtta kalsın — biri geri isterse aynı tuzağa düşmesin:
   eşik 1440'ın altına çekilirse 1220–1300 arasında bant 120–150px kalır ve
   186px'lik sticker `.hero`nun `overflow: clip`i tarafından KIRPILIR; en dar
   durum uzun ekrandır (zoom çalışmaz, telefon tam 330px), 1400×1000'de sağ
   kenara yalnız 9.8px kalıyordu. Aynı hesap bugün kartların 1280px kapısını
   belirliyor (aşağıda). */
/* Sayı KALIN ve `--tx1` — TEMAYLA ÇEVRİLİR: açıkta lacivert, gece zemininde
   aynı token beyaza döner. nowrap: "1.000+" iki satıra düşerse veri değil
   paragraf gibi okunur. (Kutu döneminin sarı "+"ı, 30px puntosu ve üç süs
   aksanı — yıldız + iki nokta — kutuyla birlikte 2026-09-05 akşamı emekli
   oldu; `.hc-plus`/`.hc-fx` markup'tan da kalktı. Sarı "+" istenirse tarihçe
   git log'da ve `--sun-ink` token notunda.) */
.hero-count b {
  font-family: var(--font-head); font-weight: 800;
  font-size: 1.2em;
  letter-spacing: -.01em;
  white-space: nowrap;
  font-variant-numeric: tabular-nums;
  color: var(--tx1);
}
.hero-count small {
  font-size: inherit;
  font-weight: 700;
  color: var(--tx2);
}

/* ── STICKER KİTİ (2026-08-29, kullanıcı isteği — frontend-design önerisi) ──
   Hero'nun "1.000+" sticker'ı sitedeki en akılda kalıcı öğe; bu kit onun
   dilini KÜÇÜLTÜLMÜŞ ölçüde tekrar eder: aynı zemin/kenar karışımı, aynı
   -2deg eğim (`rotate`, transform değil), aynı gölgesizlik, aynı sarı yıldız
   aksanı. Değerler hero-count'tan GEÇİRİLMEDİ KOPYALANMADI — token'lar aynı,
   oranlar aynı, ölçüler küçük (b 17px / small 10.5px / köşe 14px).
   KURAL, kitin kendisi kadar önemli: NADİR kalır. Sticker işaretlenen
   yüzeyin KÖŞESİNE, kenarından taşarak vurulur (yapıştırılmış etiket);
   `aria-hidden`'dır — taşıdığı bilgi her zaman birinci kanaldan da okunur
   (CTA'da sayı hero'da, fiyatta deneme sözü başlıkta ve çiplerde). Kullanım
   yeri bugün ikidir: kapanış kutusu (`.cta-box`, Macros `ctaBand`) ve
   /fiyatlandirma'nın deneme paneli (`.px-panel-wrap`). Her yeni yer "dolu
   blok sayısı" hesabına girer — üçüncüsü eklenirse biri çıkarılmalı. */
.sticker {
  position: absolute; z-index: 2;
  display: inline-grid; justify-items: center;
  gap: 1px;
  padding: 7px 14px 6px;
  text-align: center; white-space: nowrap;
  rotate: -2deg;
  pointer-events: none;
  background: color-mix(in oklch, var(--blue) 7%, var(--card-solid));
  border: 1px solid color-mix(in oklch, var(--blue) 58%, var(--card-solid));
  border-radius: 14px;
  box-shadow: none;
}
[data-theme="dark"] .sticker {
  background: color-mix(in oklch, var(--blue) 20%, var(--card-solid));
  border-color: color-mix(in oklch, var(--blue-light) 42%, var(--card-solid));
}
.sticker b {
  display: block;
  font-family: var(--font-head); font-weight: 800;
  font-size: 17px; line-height: 1.1;
  letter-spacing: -.02em;
  font-variant-numeric: tabular-nums;
  color: var(--tx1);
}
.sticker small {
  display: block;
  font-size: 10.5px; font-weight: 700; line-height: 1.2;
  color: var(--tx2);
}
/* Mini yıldız — hero-count'un ::before'uyla aynı yazım (FA5 glyph, emoji
   yasağının CSS karşılığı), bir kademe küçük. */
.sticker::before {
  content: "\f005";
  font-family: "Font Awesome 5 Free"; font-weight: 900;
  position: absolute; top: -8px; right: -9px;
  font-size: 11px; line-height: 1;
  color: var(--sun-ink);
  rotate: 14deg;
  pointer-events: none;
}

/* CTA bloğu TEK hizalı kolon: waitlist formu üstte, "çok yakında" store
   rozetleri altında — ikisi de aynı sol kenardan başlar, ayrı ayrı yüzmıyor.
   Blok kolon genişliğine yayılır (form max-width 480 ile sol hizalı kalır),
   böylece input label'a göre ezilip daralmaz. */
.hero-cta {
  display: flex; flex-direction: column; align-items: flex-start;
  animation: fadeUp var(--t-xl) ease .24s both;
}
.hero-note { margin: 14px 0 0; font-size: var(--fs); color: var(--tx3); }

/* EYLEM ALANI TEK KUTUDA (2026-09-05, kullanıcı kararı: *"çıkınca ilk sen
   haber al'dan store çiplerine kadar olanı bir container içine al, bu alan
   çok karışık görünüyor, ferahlasın"*).
   Kutunun işi ZEMİN değil ÇERÇEVE: form başlığı, alt satırı, input+düğme,
   onay kutusu, hukuk satırı ve iki store rozeti — altı ayrı satır, hepsi krem
   hero zemininin üstünde serbest yüzüyordu ve hiçbiri ötekinin nerede bittiğini
   söylemiyordu. Tek kart hepsini bir eyleme bağlıyor.
   ZEMİN `--card`, gölge YOK: hero'nun tek gölgeli nesnesi telefon. İkinci bir
   gölge kutuyu kaldırır ve store rozetlerinin ghost hâlini (§18b) anlamsız
   kılar — o karar "hero'da üst üste dolu blok olmasın" diyordu, kutu da tam
   bunun için var.
   GENİŞLİK (2026-09-05 akşamı, kullanıcı: "kartı checkbox'lı yazı tek satıra
   sığacak şekilde genişlet"): kutu artık SOL KOLONUN TAMAMI (max-width yok)
   ve içindeki `.wl` de onunla açılır — 480px'lik form kolonu YALNIZ hero'da
   esner, kapanış kutusundaki form 480'de kalır. Onay metni de aynı istekle
   kısaldı (SiteContent notu). */
/* 2026-09-05, "A · Gökyüzü" (kullanıcı onayı): kutu KREM BİR PANEL oldu.
   İki bilinçli sapma, ikisi de kayda geçer:
   - GÖLGE GELDİ. Eski kural "hero'nun tek gölgeli nesnesi telefon" diyordu;
     zemin kremken paneli krem hero zemininden ayıran tek şey artık bu yumuşak
     gölge (kenar tek başına yetmiyordu, panel zeminle aynı sıcaklıkta).
     Gölge alçak ve dağınık — telefonun `--shadow-lg`iyle yarışmaz.
   - SARI HERO'DA BİR YER DAHA KAZANDI (sağ banttaki maskot kartı) —
     kullanıcı onayıyla (docs/ui/Home-Hero.md). Köşedeki sarı %50 etiketi de
     bu listedeydi; 2026-09-06'da öldü (aşağıdaki mezar taşı), sarı payı
     artık `.wl-mark` vuruşunda.
   `position: relative` DURUR: honeypot'un absolute input'u ve köşeye
   gelecek olası bir öğe buradan çapalanır — düşerse absolute çocuk en yakın
   konumlanmış ataya (hero'ya) kaçar ve hiçbir şey hata vermez. */
.hero-act {
  position: relative;
  width: 100%;
  padding: clamp(16px, 2vh, 22px) clamp(16px, 1.6vw, 24px) clamp(14px, 1.8vh, 20px);
  /* Karışım OKLCH'de (sRGB açık uçta chroma'yı yer, tint griye kaçar —
     `.cta-box`taki aynı gerekçe): %6 güneş sarısı = mock'taki krem panel. */
  background: color-mix(in oklch, var(--sun) 6%, var(--card-solid));
  border: 1px solid color-mix(in oklch, var(--sun) 40%, var(--card-solid));
  border-radius: var(--r-xl);
  box-shadow: 0 22px 44px -34px rgba(36, 55, 105, .45);
}
/* Gece zemininde krem tint çamurlaşır; panel sitenin normal kart yüzeyine
   döner, ayrımı kenar taşır (gölge gece zemininde zaten okunmuyor). */
[data-theme="dark"] .hero-act {
  background: var(--card);
  border-color: var(--border-strong);
  box-shadow: none;
}
/* Form kolonu YALNIZ hero panelinde kutuyla açılır (kapanış kutusunda 480). */
.hero-act .wl { max-width: none; }
/* Rozetler kutunun içinde: üst payı kutunun kendi dolgusundan sonra gelir,
   `clamp(12px, 2.4vh, 22px)` orada iki kat boşluk gibi okunuyordu. */
.hero-act .hero-soon { margin-top: 14px; }

/* %50 ETİKETİNİN MEZAR TAŞI (doğum 2026-09-05 "A · Gökyüzü", bir küçültme
   turu 2026-09-06 sabahı — dolgu 5/12, punto 13/9.5, köşe 11, top -12 —
   ölüm aynı gün: "öncekinden iyi ama yine kampanya kartı gibi duruyor,
   premiumluğu düşürüyor"). `.hero-deal`, panelin sağ üst köşesine vurulmuş
   iki satırlık sarı etiketti (rotate -2deg, hardcode #4A3A08/#6B5410
   mürekkep, `linear-gradient(160deg, --sun, #F5B82E)` zemin, fadeUp .3s).
   Küçültme işe yaramadı çünkü sorun boyut değil TÜRDÜ: doygun sarı zemin +
   eğim + köşeden taşma üçlüsü her boyda "indirim kuponu" grameri okutur —
   arka plan figürlerinin kapanış dersinin akrabası. Vaatlerin yeni yerleri:
   %50 → `wl_sub`un içindeki `.wl-mark` vuruşu (aşağıda, .wl-sub'un yanı);
   deneme → hero'dan TAMAMEN çıktı ("İlk haftan bizden." başlığı denendi ve
   kullanıcı olgusuyla düştü — deneme herkese açık; SiteContent wl_title
   notu; başlık şimdi "İlk günden oyunun hazır.", panel kararı iki turda,
   UserPanel.md). Etiket geri istenirse önce docs/ui/Home-Hero.md'nin
   2026-09-06 bölümü okunur; §24'teki mobil `top: -28px` kademesi de onunla
   birlikte silindi. */

/* Panel içi tipografi — YALNIZ hero kapsamı (`.hero-act …`): aynı form
   kapanış kutusunda eski görünümüyle basılmaya devam eder, makroya
   dokunulmaz. Referans görselin hiyerarşisi: küçük mavi etiket ("ERKEN
   KATILIM") → büyük panel başlığı (`wl_title`) → teşvik satırı. */
.hero-act-eyebrow {
  display: block;
  margin: 0 0 4px;
  font-weight: 900; font-size: var(--fs-xs);
  letter-spacing: 1.8px; text-transform: uppercase;
  color: var(--blue-ink);
}
.hero-act .wl-label {
  display: block;
  margin-bottom: 4px;
  font-family: var(--font-head); font-weight: 700;
  font-size: 1.3rem; line-height: 1.25;
  color: var(--tx1);
}
/* Başlığa dönen etikette zarf ikonu kalabalık — yalnız hero'da gizlenir. */
.hero-act .wl-label-ico { display: none; }

/* (Eski .hero-badges/.badge-chip çip şeridi kaldırılmıştı; adı bir süre iki
   güven rozetini yan yana tutan sarmalayıcı olarak yaşadı, 2026-08-26'da o da
   gitti: kalite artık tek satır, nicelik telefonun üstünde.) */

/* (Kaydırma ipucu — .hero-scroll / .hero-scroll-arrow / @keyframes heroScrollBob
   — KALDIRILDI. Hero ~1060px'ken alt ucu ilk ekranın altında kalıyordu ve ipucu
   o kusurun yamasıydı: `position: fixed` olmasının tek sebebi bile akışta kalsa
   kendisinin de fold'un altına düşecek olmasıydı. Hero artık tam bir ekran, alt
   ucu görünüyor; ipucu ekranın altında yer kaplayan fazladan bir öğeden ibaret
   kalmıştı. Şablon, JS kancası ve iki dildeki `hero_scroll` kopyası da silindi.) */

/* --- Telefon mockup --- */
.hero-visual {
  position: relative;
  display: flex; justify-content: center;
  animation: fadeUp var(--t-xl) ease .2s both;
  perspective: 1200px;
}

/* `position: relative` YÜK TAŞIR: nicelik kartı (§5'in `.hero-count` notu)
   akıştan çıkmış ve konumunu BU kutudan alıyor — sarmalayıcı statik bırakılırsa
   kart en yakın konumlanmış ataya (hero'nun kendisine) kaçar, telefonun
   köşesinden kopar ve hiçbir şey hata vermez. Kutunun ölçüsü de telefonundur:
   akışta tek çocuk o. */
/* BOŞLUK STICKER'IN MARJINDA DEĞİL, SARMALAYICININ `gap`İNDE (kullanıcı kararı,
   2026-08-26 akşamı, birebir değerlerle verildi). Kolon flex olduğu için gap
   yalnız İKİ çocuk varken iş yapar — sitede `.phone-wrap` sınıfını taşıyan tek
   öğe ana sayfa hero'su (öteki telefonlar `phone-wrap--lg` / `cw-hero-phone` /
   `night-phone-wrap`), yani kural başka hiçbir sayfaya dokunmuyor. ≥1440px'te
   sticker `position: absolute` ile akıştan çıkıyor ve gap orada zaten geçmiyor;
   o yerleşimin payı kendi `left: calc(100% + 14px)`inden geliyor. */
.phone-wrap { position: relative; display: flex; flex-direction: column; align-items: center; gap: 14px !important; }

/* ── "A · GÖKYÜZÜ" KATMANI (2026-09-05, kullanıcı onayı) ─────────────────────
   Üç yeni dekordan İKİSİ YAŞIYOR: EL ÇİZİMİ OK (kopyadan telefona) ve sağ
   bantta İKİ UYGULAMA KARTI — üçüncüsü, güneş halkası, 2026-09-06'da öldü
   (bir alttaki mezar taşı). Arka plan dekorunun üç kez denenip üç kez geri
   alındığı kayıt (dosyanın kapanış notu) OKUNDU: bu katman sayfa geneli bir
   doku değil, hero'nun KENDİ nesneleri; ok ve kartlar yalnız ≥1240px'te
   (aşağıda). Kartlar `.phone-wrap`ın İÇİNDE — sticker'ın gerekçesi: parallax
   sarmalayıcıyı kaydırıyor, `zoom` merdiveni onu ölçekliyor; dışarıda kalan
   her şey sayfa kaydıkça telefondan ayrılır. */

/* MEZAR TAŞI (2026-09-06): `.hero-halo` — telefonun arkasındaki halka,
   İKİ BİÇİMİ DE AYNI GÜN ÖLDÜ. Tarihçe tek nefeste: 2026-09-05'te bej
   GÜNEŞ HALKASI olarak doğdu (425 → kullanıcı isteğiyle 540px, card-solid
   karışımlı iki-duraklı radial, %78'de biten kenar), 2026-09-06 sabahı
   kullanıcı "shape değil IŞIK" dedi ve hale rafine edildi (444px, merkez
   41%/362, `--sun` %30→%16 TRANSPARANA dağılan gradyan + 14px blur,
   sol-altta %11 `--blue` organik leke, gecede mavi ışıma) — AYNI GÜN
   "haleyi kaldır" ile o da gitti. Bu, hero/arka plan dekorunun DÖRDÜNCÜ
   ölümü (doku · renk alanı · kenar figürleri · ışık halesi — ilk üçün
   kaydı dosyanın kapanış notunda). Ders öncekiyle aynı: rafine etmek
   kurtarmadı, dekorun kendisi istenmiyor. Beşincisini önermeden önce
   kapanış notundaki soru sorulur: "ne koyalım" değil "bunu kim görecek".
   Telefon zeminden gölgesiyle (`--shadow-lg`) zaten ayrışıyor. */

/* Ok: `.hero-visual`ın sol üstünde, kolonlar arası boşlukta. Kendini çizerek
   gelir (stroke-dashoffset); mürekkep metin ailesinden. 1240 kapısı kartlarla
   ortak: dar ekranda kolon arası boşluk (clamp alt ucu 44px) oku taşıyamaz,
   kopyanın üstüne biner. */
/* OK ARTIK YALNIZ DEĞİL: 2026-09-10'da yanına "Pedagog onaylı" rozeti geldi
   (kullanıcı: *"başlıktan kaldır, telefona giden okun oraya badge gibi
   koy"*), ikisi tek sarmalayıcıda (`.hero-arrow-note`) duruyor. Konum
   sarmalayıcıya taşındı: rozet + ok tek blok olarak yerleşir, yoksa iki ayrı
   `absolute` öğe her genişlikte elle hizalanırdı. 1240 kapısı da buraya
   taşındı — ikisi birlikte açılır, birlikte kapanır. */
.hero-arrow-note {
  display: none;
  position: absolute;
  top: -18px;
  /* SAĞ KENARDAN ÇAPALI, ve çapa noktası SOL kolonun payı değil TELEFONUN
     kenarı: `.hero-visual`ın solundan +40px, yani rozetin sağ kenarı her
     genişlikte telefonun (kolon içinde 48–62px içeride) SOLUNDA kalır.
     `left` ile çapalanırsa rozet sağa doğru büyür ve telefona binerdi. */
  right: calc(100% - 22px);
  width: max-content;
  text-align: right;
  color: color-mix(in srgb, var(--tx1) 75%, var(--tx2));
  pointer-events: none;
}
/* Ok sarmalayıcının SAĞINA yaslanır (blok + `margin-left: auto`), negatif sağ
   marj ucu telefonun kenarına 6px bindirir — rozet sola doğru büyürken okun
   ucu yerinde kalsın diye. */
.hero-arrow {
  display: block;
  width: 92px; height: auto;
  margin: 0 -32px 8px auto;
}
/* Rozet OKUN ALTINDA, kuyruğunun dibinde ve okla aynı el-çizimi dilde: kart
   yüzeyi + yumuşak gölge + hafif eğim, yani sahneye İĞNELENMİŞ küçük bir
   etiket. İLK DENEME (aynı gün) rozeti okun ÜSTÜNE koymuştu ve kullanıcı
   reddetti (*"çok kötü olmuş"*). Ölçüm sebebi gösterdi: rozet 1512'de
   (874,106), okun kutusu (887,144) — yani rozet okun ne sol ne sağ kenarıyla
   hizalıydı, üstelik h1 ile telefon arasındaki 139px'lik boşluğun DIŞINDA,
   sahnenin en boş yerinde tek başına duruyordu. Şimdi rozetin sağ kenarı okun
   ucuyla aynı düşeyde bitiyor; iki öğe tek "işaret" gibi okunuyor.
   ÜÇ AYAR KULLANICIDAN (aynı gün, *"biraz daha sola alıp bir tık daha
   büyütürsen, çapraz hafif dursa yine süper olacak"*): sağ çapa 40 → 22px
   (telefona boşluk 7 → 25px), punto 13 → 14px, eğim -3 → -5deg. Okun negatif
   sağ marjı buna karşı BÜYÜTÜLDÜ (-14 → -32px): sarmalayıcı sola kayarken
   okun ucu telefonun kenarında piksel piksel yerinde kaldı — kayan şey yalnız
   rozet. Punto büyürken rozetin metne boşluğu ölçüldü (en dar: EN 1512),
   çakışma yok. Eğim
   `rotate` ile (transform tuzağı: `.hero-visual`ın parallax'ı transform
   yazıyor, çocuğunda transform kullanmak onunla yarışmaz ama okun kendi
   çizim animasyonuyla aynı dili konuşsun diye ayrı özellik kullanıldı).
   Punto SABİT px: rozet kolonun cqw bağlamının DIŞINDA (sağ kolonda) ve
   sahnenin ölçüsüyle değil kendi okunabilirliğiyle sınırlı. */
.hero-arrow-badge {
  display: inline-flex; align-items: center;
  padding: 8px 16px 8px 11px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: 999px;
  box-shadow: var(--shadow-sm);
  color: var(--tx1);
  font-weight: 700; font-size: 14px; line-height: 1.2;
  white-space: nowrap;
  rotate: -5deg;
}
.hero-arrow-badge .hero-trust-ico {
  vertical-align: initial; flex: none;
  font-size: 9px;
  width: 20px; height: 20px;
  margin-right: 8px;
}
.hero-arrow path {
  stroke-dasharray: 230;
  stroke-dashoffset: 230;
  animation: heroArrowDraw 1s ease .9s forwards;
}
@keyframes heroArrowDraw { to { stroke-dashoffset: 0; } }
@media (prefers-reduced-motion: reduce) {
  .hero-arrow path { animation: none; stroke-dashoffset: 0; }
}

/* İki uygulama kartı: telefonun sağ kenarına ~30px binen, bandın içine taşan
   küçük kartlar — keşif kartı (beyaz, katalog görseli) + maskot kartı (sarı).
   Telefonla BİRLİKTE süzülürler (`phoneFloat`, sticker'ın gerekçesi) ve eğim
   `rotate` ile (transform tuzağı). GENİŞLİK KAPISI 1240px ve HESAPLI: kart
   kenardan 102px taşıyor; bant = kolon içi pay (~102px) + sayfa kenarı
   ((vw−1180)/2, 1240'ta 30px) → 1240'ta 30px pay kalır, altında `.hero`nun
   `overflow: clip`i kartın sağ yarısını sessizce KIRPARDI (sticker'ın eski
   1440 eşiğiyle aynı tuzak, oradaki ölçümden türetildi). */
.hero-card {
  display: none;
  position: absolute;
  z-index: 2;
  width: 132px;
  padding: 8px 8px 9px;
  justify-items: center; gap: 6px;
  text-align: center;
  pointer-events: none;
  background: var(--card-solid);
  border: 1px solid var(--border);
  border-radius: 16px;
  box-shadow: 0 16px 32px -22px rgba(36, 55, 105, .5);
}
.hero-card img {
  width: 100%; height: auto;
  border-radius: 10px;
  display: block;
}
.hero-card b {
  font-family: var(--font-head); font-weight: 700;
  font-size: 12.5px; line-height: 1.3;
  color: var(--tx1);
}
/* Keşif kartı referans görselin ölçüsünde ve yerinde (kullanıcı, iki turda:
   "örnekteki büyüklükte ve yerinde" + "daha yukarısında ve bu kadar içinde
   değil"): telefonun ÜST kenarı hizasına yakın 176px'lik polaroid. Bindirme
   İKİ KADEMELİ, çünkü bant öyle: 1240–1439'da bant ~119–139px, kart kenara
   ~70px biner (taşma 106px, kırpılmaz); ≥1440'ta bant ≥216px ve kart
   örnekteki gibi dışarı çıkar (~44px bindirme). Tek değer seçilseydi ya
   1280'lik dizüstünde kart kırpılır/kaybolur ya geniş ekranda örnekten uzak
   dururdu — ikisi de 1280 ekran görüntüsünde YAŞANDI (kapı bir tur 1280'e
   çekildi, o genişlikte kartlar tamamen düştü, geri alındı). Görsel 720×338
   yatay; polaroid oranına `aspect-ratio` + `object-fit: cover` ile kırpılır
   (kutu büyütülüp şerit gibi bırakılırsa örnekteki kare his kaybolur). */
.hero-card--pick {
  /* Bindirme 70 → 95px (2026-09-05: sol kolon 1.22fr'ye genişleyince sağ
     kolonun içi payı ~100 → ~47px'e indi ve 1240'ta kartın sağı 11px, maskot
     kartınki 20px KIRPILIYORDU — ölçüldü). Dar bandın çözümü yine kapıyı
     oynatmak değil bindirmeyi artırmak; ≥1440 değerleri örnekteki gibi durur. */
  top: 46px; left: calc(100% - 95px);
  width: 176px;
  padding: 10px 10px 12px;
  gap: 8px;
  rotate: 3deg;
  animation: fadeUp var(--t-xl) ease .34s both,
             phoneFloat 7s ease-in-out infinite;
}
.hero-card--pick img { aspect-ratio: 8 / 7; object-fit: cover; }
.hero-card--pick b { font-size: 13.5px; }
/* DUYGU NOTU KARTI (2026-09-06, kullanıcı tarifi: "küçük, sıcak, premium
   bir duygu kartı … parlak kampanya etiketi gibi değil; yumuşak köşeli,
   açık krem-sarı, mini not kartı; üstte çok küçük bir kalp; hafif gölge,
   ince border"). Önceki hâli doygun sarı zeminde açılış Kido'suydu (78px
   yuvarlak maskot + "Birlikte, ekransız.", mürekkep hardcode #4A3A08) —
   %50 etiketiyle AYNI GÜN aynı teşhisle gitti: doygun sarı zemin + gölge
   kampanya etiketi okutuyor. Zemin artık eylem panelinin krem ailesi
   (OKLCH karışım — sRGB açık uçta chroma'yı yer, `.hero-act`taki aynı
   gerekçe; %14, panelin %6'sından bir tık sıcak ki beyaz keşif kartından
   ayrışsın), İNCE sarı kenar, ALÇAK lacivert gölge (eski amber gölge
   "parlak etiket"in yarısıydı). Mürekkep hardcode DEĞİL `--tx1`: zemin
   krem, koyu lacivert üstünde okunur ve temayla çevrilir. Kalp EMOJİ
   DEĞİL — eyebrow kalbiyle aynı el-çizimi SVG (currentColor), rengi
   `--sun-ink` (açık zeminde 3.11:1; dekor için yeter, koyu temada ham
   `--sun`a döner). İki satır ("Küçük anlar," / "büyüyen bağlar.") kopyaya
   yazılmaz: iç genişlik + `text-wrap: balance` virgülden kırar. */
.hero-card--together {
  /* 16 → 41px: pick kartıyla aynı ölçümün ikinci yarısı (1240'ta 20px kırpık).
     2026-09-06 (kullanıcı): "konsept doğru, konum ince ayarı" — kart
     telefonun sağ yanına yapışık okundu → top 424 → 396 (bir tık yukarı)
     ve ≥1440'ta bindirme 16 → 4px (aşağıda): kenarla arasında nefes.
     1240 bandında bindirme DURUR — oradaki 41px kırpık ölçümünden. */
  top: 396px; left: calc(100% - 41px);
  padding: 12px 12px 13px;
  gap: 4px;
  rotate: -4deg;
  background: color-mix(in oklch, var(--sun) 14%, var(--card-solid));
  border-color: color-mix(in oklch, var(--sun) 45%, var(--card-solid));
  border-radius: 18px;
  box-shadow: 0 12px 26px -20px rgba(36, 55, 105, .45);
  animation: fadeUp var(--t-xl) ease .42s both,
             phoneFloat 7s ease-in-out infinite;
}
/* Gece zemininde krem tint çamurlaşır; kart panelle aynı kararı verir
   (normal kart yüzeyi, ayrımı kenar taşır), kalp ham sarıya döner. */
[data-theme="dark"] .hero-card--together {
  background: var(--card);
  border-color: var(--border-strong);
}
.hero-note-heart { width: 13px; height: auto; color: var(--sun-ink); }
[data-theme="dark"] .hero-note-heart { color: var(--sun); }
.hero-card--together b {
  color: var(--tx1);
  font-size: 13px; line-height: 1.4;
  text-wrap: balance;
}
@media (min-width: 1240px) {
  .hero-arrow-note { display: block; }
  .hero-card { display: inline-grid; }
}
@media (min-width: 1440px) {
  .hero-card--pick { left: calc(100% - 44px); }
  /* -16 → +8 (2026-09-06, kullanıcı: "telefonun sağ yanına yapışık, bir tık
     nefes alsın"): phone-wrap'ın %100'ü telefonun kenarından 2px ötede,
     yani -4px hâlâ 6px BİNDİRMEYDİ (ölçüldü) — gerçek boşluk için işaret
     değişir: +8px = telefonla arasında ~6px hava. Kırpılma payı ölçüldü:
     1440'ta kartın sağı viewport kenarına 68-12=56px içeride, 1512'de 92,
     1920'de 295 — hero'nun `overflow: clip`i dokunmuyor. 1240 bandında
     bindirme (-41) DURUR, oranın gerekçesi kırpık ölçümü. */
  .hero-card--together { left: calc(100% + 8px); }
}

.phone {
  position: relative;
  /* 306 → 330px (%+7.8): hero'nun tek görseli ve sayfanın "gerçek ürün"
     kanıtı — panelin (Deniz) 15 saniyelik taramasında okunan şey bu. Büyüme
     doğrudan hero'nun dikey bütçesine giriyor; karşılığı aşağıdaki `zoom`
     merdiveninin sıklaştırılmasıyla ödendi. */
  width: min(330px, 76vw);
  border-radius: 52px;
  padding: 11px;
  background: linear-gradient(160deg, #2B3555, #16203E);
  box-shadow:
    var(--shadow-lg),
    inset 0 0 0 2px rgba(255,255,255,.06);
  transform: rotateY(calc(var(--tiltY, 0) * 1deg)) rotateX(calc(var(--tiltX, 0) * 1deg));
  transition: transform var(--t) var(--ease-out);
  animation: phoneFloat 7s ease-in-out infinite;
}

/* KISA EKRANDA HERO'NUN BOYUNU TELEFON BELİRLER. 306px genişlikte mockup
   ~638px yüksektir; navbar + dolgu ile birlikte ~770px'in altındaki her
   viewport'ta hero'nun "tek ekran" sözü telefon yüzünden bozulur (sol kolon
   metni `vh` clamp'leriyle zaten kısalıyor, telefon kısalmıyor).
   Ölçek `zoom` ile yapılıyor, ve iki alternatif bilerek elendi:
   - `width` daraltmak: içeriği KIRPAR. `.phone-screen` sabit puntolu satırlar
     taşır ve `overflow: hidden`dır; ayrıca kendi `min-height: 588px`i var.
   - `transform: scale()`: görüntüyü küçültür ama DÜZENDE hâlâ 638px yer kaplar,
     yani hero hiç kısalmaz — çözülmek istenen şey tam olarak budur.
   `zoom`u desteklemeyen eski tarayıcıda kural sessizce düşer: davranış bugünkü
   hâline döner, kırılan bir şey olmaz.
   Eşik 961px, hero'nun tek kolona indiği kırılma noktasıyla (max-width: 960)
   bilerek aynı: mobilde hero zaten bir ekrandan uzun, telefonu küçültmek orada
   yalnızca mockup'ı sebepsiz ufaltırdı. */
@media (min-width: 961px) and (max-height: 800px) { .phone { zoom: .88; } }
@media (min-width: 961px) and (max-height: 700px) { .phone { zoom: .78; } }

/* ANA SAYFA HERO'SUNUN KENDİ MERDİVENİ — daha sık ve daha dik, çünkü burada
   kısaltılması gereken şey telefon DEĞİL, "rozet + telefon" bloğunun tamamı
   (2026-08-26). Telefon %8 büyüdü ve üstüne 46px'lik nicelik rozeti bindi:
   ikisi birlikte hero'nun dikey bütçesinden ~110px daha istiyor ve eski iki
   basamaklı merdiven (800→.88, 700→.78) o bütçeyi 1366×768 ile 1536×864 gibi
   ÇOK YAYGIN iki ölçüde aşıyordu — yani rozetin ya da telefonun alt ucu ilk
   ekranın altında kalıyordu. Ölçülen bütçe (Chromium, 1440 genişlik): içeriğe
   kalan yükseklik = 0.935·vh − 76px (nav + `vh`ye bağlı hero dolgusu), sağ
   kolon (rozet + boşluk + telefon) = 748px · zoom. Basamaklar her bandın EN
   KISA ekranına göre ve ~15px payla seçildi; 660–980 arası 20px adımlarla
   taranıp doğrulandı.
   MERDİVEN 680'DE BİTER, daha aşağısı için basamak eklenmez: 660px'te SOL
   kolon 526px ve sağ kolon ondan zaten kısa — yani orada hero'nun boyunu
   telefon değil kopya belirliyor, telefonu küçültmek hiçbir şey kazandırmaz.
   `align-content: safe center` o noktada `start`a döner ve sayfa kaydırılır.
   ÖLÇEK SARMALAYICIYA YAZILIR, telefona DEĞİL (2026-08-26 akşamı). Nicelik
   kartı artık `.phone-wrap`ın içinde akıştan çıkmış duruyor ve konumunu
   ondan alıyor; telefonu tek başına ölçeklemek kartı yerinde bırakır, yani
   kart küçülen telefonun ekranına doğru büyür ve bindirme her ekran boyunda
   başka bir yere düşer. Sarmalayıcı ölçeklenince ikisi de aynı `zoom`
   uzayında kalır: bindirme (22px) ve taşma (28px) her basamakta oransal.
   Bir sonraki satır ŞART — yukarıdaki genel `.phone { zoom }` kuralları
   (800/700px) hero'nun telefonunu da yakalıyor ve sarmalayıcının ölçeğiyle
   ÇARPIŞIRDI; (0,2,0) özgüllükle hero'da geri alınıyor, o kurallar
   Kategoriler/Uyku sayfalarının telefonları için olduğu gibi kalır.
   `zoom`, `scale()` DEĞİL — gerekçe hemen yukarıda: scale düzende hâlâ tam boy
   yer kaplar, yani hero hiç kısalmaz. */
.hero-visual .phone { zoom: 1; }
@media (min-width: 961px) and (max-height: 900px) {
  .hero-visual .phone-wrap { zoom: .93; }
}
@media (min-width: 961px) and (max-height: 840px) {
  .hero-visual .phone-wrap { zoom: .88; }
}
@media (min-width: 961px) and (max-height: 800px) {
  .hero-visual .phone-wrap { zoom: .80; }
}
@media (min-width: 961px) and (max-height: 740px) {
  .hero-visual .phone-wrap { zoom: .73; }
}
@media (min-width: 961px) and (max-height: 680px) {
  .hero-visual .phone-wrap { zoom: .68; }
}
/* Mobilde de küçülür. Hero tek kolona indiğinde metin `vh` clamp'leriyle
   kısalıyor ama telefon kısalmıyordu: hero 390×844'te 1.568px, yani "hero tam
   BİR ekrandır" kuralı masaüstünde tutup mobilde tutmuyordu (ölçüldü).
   Yükseklikten payı en büyük olan tek blok telefon (617px). Yine `zoom`,
   `transform: scale()` değil — scale düzende hâlâ tam boy yer kaplar, yani
   hero hiç kısalmaz; çözülmek istenen tam olarak odur (bkz. §5). */
@media (max-width: 620px) {
  .phone { zoom: .84; }
  /* Hero'da ölçek yine SARMALAYICIDA (yukarıdaki merdivenin aynı gerekçesi:
     nicelik kartı konumunu ondan alıyor, ayrı ölçeklenirse bindirme kayar).
     `.hero-visual .phone { zoom: 1 }` yukarıda geneli hero'da geri aldığı için
     bu satır olmadan hero'nun telefonu mobilde HİÇ küçülmez. */
  .hero-visual .phone-wrap { zoom: .84; }
}

.phone-notch {
  /* iPhone 16 Pro Dynamic Island — daha ince, üste yakın hap */
  position: absolute; top: 20px; left: 50%; transform: translateX(-50%);
  width: 92px; height: 24px; border-radius: var(--r-full);
  background: #0B1226; z-index: 3;
}

.phone-screen {
  /* Uygulamanın taban mavisi — token BURADA tanımlanır ki hem telefon gövdesi
     hem içindeki .ps-screens aynı değeri kullansın. */
  --app-screen-bg: #1A6FF5;   /* KidlioBackground light taban mavisi */
  position: relative;
  border-radius: 42px;
  overflow: hidden;
  /* TEK ZEMİN. Eskiden gövde soluk gök gradyanıydı, detay ekranı ise doygun
     mavi: aynı telefonun içinde iki ayrı uygulama rengi görünüyordu. Ayrıca
     sağ üstteki radial "güneş" parlamaları kaldırıldı — düz zemin. */
  background: var(--app-screen-bg);
  padding: 64px 15px 20px;
  /* iPhone 16 Pro ekran oranı ≈ 1:2.17 (1206×2622). aspect-ratio ile boy
     genişlikten türer; min-height yalnızca güvenli alt sınır. */
  aspect-ratio: 1 / 2.17;
  min-height: 588px;
}
[data-theme="dark"] .phone-screen {
  --app-screen-bg: #191970;   /* KidlioBackground dark taban (gece laciverdi) */
}

.ps-status {
  position: absolute; top: 22px; left: 26px; right: 26px;
  display: flex; justify-content: space-between; align-items: center;
  /* Zemin her ekranda doygun mavi → durum çubuğu daima beyaz (light'ta eski
     --ink 2.54:1 ile okunmuyordu; beyaz 4.53:1 / dark 14.85:1). */
  font-size: .74rem; font-weight: 800; color: #fff;
}

/* Selam satırı — uygulamadaki gibi el sallayan güneş + zamana göre selam +
   çocuk adı alt satırı (kaynak: KidlioApp home getGreeting()). */
.ps-greet {
  display: flex; align-items: center; gap: 11px;
  margin-bottom: 10px; /* tab bar için dikey bütçe: 16→10 */
}
.ps-kido {
  position: relative;
  width: 48px; height: 48px; border-radius: var(--r);
  background: #fff; box-shadow: var(--shadow-sm);
  display: grid; place-items: center;
  overflow: visible;
}
.ps-kido img { width: 38px; height: 38px; }
/* El sallayan güneş rozeti (uygulamadaki waving icon) */
.ps-kido::after {
  content: "\f185"; font-family: "Font Awesome 5 Free"; font-weight: 900;
  position: absolute; right: -7px; bottom: -6px;
  font-size: .7rem; line-height: 1; color: #F5A51E;
  filter: drop-shadow(0 1px 2px rgba(0,0,0,.25));
  transform-origin: 70% 70%;
  animation: psWave 2.6s ease-in-out infinite;
}
/* Selamlama mavi zeminin ÜSTÜNDE duruyor (kart içinde değil) → beyaz. */
.ps-greet b { display: block; font-family: var(--font-head); font-size: 1.02rem; color: #fff; }
/* SAF beyaz — .86 alfa 3.76:1'e düşüyordu. Doygun mavide saf beyaz zaten
   4.53:1, yani hiç pay yok: ikincil metin opaklıkla değil puntoyla ayrılır. */
.ps-greet small { color: #fff; font-size: .82rem; }

/* Yüzey OPAK — detay ekranındaki .ps-sec ile aynı reçete. Doygun mavi zemin
   üzerinde .72 alfa kartı zemini içinden sızdırıp bulanık bir leke gibi
   okunuyordu; aynı "pus" sorunu sayfa kartlarında da bu şekilde çözülmüştü. */
.ps-card {
  background: rgba(255,255,255,.95);
  border: 1px solid rgba(26,111,245,.08);
  border-radius: var(--r-lg);
  padding: 15px 14px;
  box-shadow: 0 10px 26px -14px rgba(10,40,120,.45);
}
[data-theme="dark"] .ps-card { background: rgba(18,20,90,.88); border-color: rgba(255,255,255,.14); box-shadow: var(--shadow-sm); }

/* Plan kartının başlık SATIRI — `<h5>` DEĞİL, `<div class="ps-card-h">`
   (2026-08-26): partial her zaman `aria-hidden` bir maketin içinde render
   ediliyor, yani başlığın erişilebilir adı boştu (gerekçe PhonePlan.html'de).
   İlk dört bildirim taban `h1..h5` kuralından KOPYALANDI — `<div>` onları
   miras almaz ve yazılmazsa satır Nunito 400'e düşer. Ölçüler değişmedi. */
.ps-card-h {
  font-family: var(--font-head); font-weight: 700;
  line-height: 1.18; letter-spacing: -.01em;
  margin: 2px 2px 12px;
  font-size: .96rem; color: var(--ink);
  display: flex; align-items: center; gap: 6px;
}
[data-theme="dark"] .ps-card-h { color: #EAF1FF; }
/* Plan başlığı başında kıvılcım, sonunda ilerleme rozeti ("Bugun" / "N an" onay rozeti) */
.ps-card-h::before { content: "\f0d0"; font-family: "Font Awesome 5 Free"; font-weight: 900; font-size: .85em; color: #F5A51E; }
.ps-plan-badge {
  margin-left: auto;
  padding: 3px 9px; border-radius: var(--r-full);
  font-size: .62rem; font-weight: 800;
  color: var(--blue); background: rgba(46,139,247,.12);
}
[data-theme="dark"] .ps-plan-badge { color: var(--blue-light); background: rgba(108,180,255,.16); }

/* Plan satırı — nötr kart yüzeyi (uygulamadaki sade plan kartı). Kategori rengi
   satırı boyamaz; yalnızca thumb halkasında + kategori etiketinde yaşar.
   --pc: satırın kategori rengi (thumb/etiket için, inline set edilir). */
.ps-item {
  --pc: var(--blue);
  position: relative;
  display: flex; align-items: center; gap: 11px;
  padding: 9px 12px;   /* tab bar için dikey bütçe: 11→9 */
  margin-top: 6px;     /* 8→6 */
  border-radius: var(--r);
  /* Satır artık BEYAZ kartın içinde duruyor (zeminin değil) → beyaz üstüne
     beyaz olmasın diye hafif mavi tint; ayırt edilebilir ama kartı bölmez. */
  background: rgba(26,111,245,.055);
  border: 1px solid rgba(26,111,245,.10);
  box-shadow: none;
}
[data-theme="dark"] .ps-item {
  background: rgba(255,255,255,.06);
  border-color: rgba(255,255,255,.10);
}
.ps-item:first-of-type { margin-top: 0; }

.ps-dot {
  flex: 0 0 46px; width: 46px; height: 46px;
  border-radius: var(--r);
  display: grid; place-items: center;
  font-size: 1.3rem;
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--pc) 22%, transparent);
}
.ps-thumb {
  flex: 0 0 46px; width: 46px; height: 46px;
  border-radius: var(--r); overflow: hidden;
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--pc) 22%, transparent);
}
.ps-thumb img { width: 100%; height: 100%; object-fit: cover; }
/* Plan satırındaki renkli noktada kategori illüstrasyonu (WebP, şeffaf zemin) */
.ps-dot--img img { width: 78%; height: 78%; object-fit: contain; display: block; filter: drop-shadow(0 1px 2px rgba(0,0,0,.18)); }

/* Satır bilgisi — üstte kategori badge (Oyna · 15dk) + alt kategori, altında
   başlık. Uygulamadaki DailyPlanWidget kart info bloğunun düzeni. */
.ps-item-info { min-width: 0; flex: 1; display: flex; flex-direction: column; gap: 4px; }
.ps-item-meta { display: flex; align-items: center; justify-content: space-between; gap: 6px; min-width: 0; }
.ps-cat {
  flex: 0 0 auto;
  padding: 2px 7px; border-radius: var(--r-full);
  font-size: .58rem; font-weight: 800; white-space: nowrap; letter-spacing: .1px;
  /* WCAG: kategori rengi burada METİN — açık zeminde (F5A51E/23C38C okunmaz).
     Ham rengi koyulaştırarak beyaz çip üstünde okunur bir ton elde ediyoruz;
     çip zemini (aşağıda) ham renkte kalır (dolgu). */
  color: color-mix(in srgb, var(--pc) 62%, #17233f);
  background: color-mix(in srgb, var(--pc) 13%, transparent);
}
[data-theme="dark"] .ps-cat { color: color-mix(in srgb, var(--pc) 78%, #ffffff); }
.ps-sub {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  font-size: .58rem; font-weight: 600; color: var(--tx2);
}
.ps-item-info b {
  display: block; font-family: var(--font-head); font-size: .87rem; line-height: 1.2;
  color: var(--ink);
}
[data-theme="dark"] .ps-item-info b { color: #EAF1FF; }

/* "Neden bu öneri" çipi — app'teki koyu yarı saydam pill (küçük, beyaz metin) */
.ps-reason {
  align-self: flex-start;
  margin-top: 3px;
  padding: 2px 8px; border-radius: var(--r-full);
  background: rgba(15,27,46,.55);
  color: #fff; font-size: .52rem; font-weight: 700; letter-spacing: .1px;
  white-space: nowrap;
}

.ps-pill {
  margin: 12px auto 0; width: fit-content; /* 16→12: plan ekranında bara sığar */
  padding: 10px 22px;
  background: var(--grad-brand);
  color: #fff; font-weight: 800; font-size: .86rem;
  border-radius: var(--r-full);
  box-shadow: var(--shadow-brand);
}

/* Alt tab bar — app'in dekoratif kopyası (kaynak: KidlioApp
   src/components/GlobalTabBar.tsx). phone-screen viewport'una sabitlenir (plan
   ekranı içeriği taşabildiği için plan ekranına bağlanamaz — overflow kırpardı).
   Plan içeriği alta çarpmasın diye plan ekranına alt boşluk verilir;
   detay/kutlama ekranlarında gizlenir.

   KÖŞE KURALI: app'te yalnızca ÜST köşeler yuvarlak (borderTopLeftRadius /
   borderTopRightRadius), alt kenar cihazın dibine yapışık. Burada da öyle —
   bir zamanlar `border-radius: 0 0 36px 36px` vardı ve barın 36px'lik alt
   kavisi, ekranın 42px'lik kavisinden içeride kaldığı için alt köşelerde mavi
   zemin sızıyordu: bar "dipten kopuk" görünüyordu. Alt köşeler 0 kalmalı;
   dışarı taşan kısmı zaten .phone-screen'in overflow'u ekran şekline kırpar. */
.ps-screen--plan { padding-bottom: 52px; }
.ps-tabbar {
  position: absolute; left: 0; right: 0; bottom: 0; z-index: 2;
  display: flex; align-items: center;
  padding: 7px 6px 13px;               /* alt: iOS safe-area payının ölçeklisi */
  border-top: 1px solid rgba(46,139,247,.25);
  /* app'teki cam bar: açık mavi zemin + üstten beyaz iç parlama */
  background:
    linear-gradient(to bottom, rgba(255,255,255,.42), rgba(255,255,255,0) 60%),
    rgba(225,240,255,.96);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  border-radius: 18px 18px 0 0;        /* sw(24) → ekran genişliğine ölçekli */
  transition: opacity var(--t-lg) ease;
}
.phone-screen:has(.ps-screen--detail.is-active) .ps-tabbar,
.phone-screen:has(.ps-screen--done.is-active) .ps-tabbar { opacity: 0; }
[data-theme="dark"] .ps-tabbar {
  background:
    linear-gradient(to bottom, rgba(174,205,255,.06), rgba(174,205,255,0) 60%),
    rgba(50,60,160,.96);
  border-top-color: rgba(174,205,255,.22);
}
.ps-tab {
  position: relative;
  flex: 1;
  display: grid; place-items: center;
  min-height: 26px;
  font-size: .84rem; line-height: 1;
  color: rgba(59,130,246,.35);         /* TAB_INACTIVE_LIGHT */
}
[data-theme="dark"] .ps-tab { color: rgba(255,255,255,.40); }
.ps-tab.is-active { color: #3B82F6; }  /* TAB_ACTIVE_LIGHT */
[data-theme="dark"] .ps-tab.is-active { color: #AECDFF; }
/* Aktif sekmenin arkasındaki hap — app'teki pillBg */
.ps-tab.is-active::before {
  content: ""; position: absolute; z-index: -1;
  width: 35px; height: 28px; border-radius: 10px;
  background: rgba(59,130,246,.15);
}
[data-theme="dark"] .ps-tab.is-active::before { background: rgba(174,205,255,.22); }
/* Ortadaki yüzen orb — app'teki FloatingOrb: beyazdan maviye dikey gradyan,
   bardan yukarı kalkık. (app'in orbHighlight beneği burada taşınmadı: gradyanın
   tepesi zaten beyaz, bu ölçekte leke gibi duruyordu.) */
.ps-tab.ps-tab--orb,
[data-theme="dark"] .ps-tab.ps-tab--orb {
  flex: 0 0 auto;
  width: 42px; height: 42px; margin: -16px 6px 0;
  border-radius: 50%;
  color: #fff; font-size: .95rem;
  background: linear-gradient(to bottom, #FFFFFF 0%, #7FB8FA 35%, #1A6FF5 100%);
  box-shadow: 0 6px 12px -2px rgba(26,111,245,.55);
}

/* --- Telefon turu: ekran döngüsü (sınıfları JS yönetir; JS yokken yalnız
       is-active işaretli 1. ekran görünür — bugünkü statik tasarım) --- */
.phone-screen { display: flex; flex-direction: column; }
.ps-screens { position: relative; flex: 1; }

.ps-screen {
  opacity: 0; visibility: hidden; pointer-events: none;
  transform: translateX(36px);
  transition: opacity var(--t-lg) ease, transform var(--t-lg) ease, visibility 0s linear var(--t-lg);
}
.ps-screen--plan { position: relative; }
.ps-screen--detail, .ps-screen--done { position: absolute; inset: 0; }
.ps-screen.is-exit { transform: translateX(-36px); }
.ps-screen.is-active {
  opacity: 1; visibility: visible;
  transform: none;
  transition: opacity var(--t-lg) ease, transform var(--t-lg) ease, visibility 0s;
}

/* Dokunma göstergesi (parmak ucu + halka dalgası) */
.ps-tap {
  position: absolute; top: 0; left: 0; z-index: 4;
  width: 34px; height: 34px; margin: -17px 0 0 -17px;
  border-radius: 50%;
  background: color-mix(in srgb, var(--blue) 38%, transparent);
  box-shadow: 0 0 0 2px rgba(255,255,255,.7), var(--shadow-sm);
  opacity: 0; pointer-events: none;
}
.ps-tap::after {
  content: ""; position: absolute; inset: -2px;
  border-radius: 50%;
  border: 2px solid var(--blue);
  opacity: 0;
}
.ps-tap.is-tapping { animation: psTap .9s ease both; }
.ps-tap.is-tapping::after { animation: psTapRipple .9s ease both; }

/* Ekran 2 — etkinlik detayı: gerçek uygulama ekranının küçültülmüş kopyası.
   Uygulamanın kendine özgü renkleri app-brand-matching token olarak burada
   (kaynak: KidlioApp KidlioBackground.tsx, categoryColors.ts, categories.ts): */
.ps-screens {
  /* --app-screen-bg .phone-screen'de tanımlı (tek zemin), buradan miras alınır */
  --app-play: #FF2DBE;        /* categoryColors.play.solid (Oyna pembesi) */
  --app-play-soft: #FFA5E1;   /* play orb gradyanı — açık durak */
  --app-play-deep: #D71E9B;   /* play orb gradyanı — koyu durak */
  --app-science: #3CC795;     /* "Doğa ve Bilim" alt kategori chip rengi */
  --app-body-tx: #4B5563;     /* uygulama kart gövde metni */
}
[data-theme="dark"] .ps-screens {
  --app-science: #5EEAB5;     /* alt kategori darkColor */
  --app-body-tx: rgba(255,255,255,.8);
}

.ps-screen--detail {
  /* Uygulamadaki gibi uçtan uca mavi zemin: phone-screen padding'ini geri al */
  inset: -62px -16px -18px;
  padding: 56px 13px 13px;
  display: flex; flex-direction: column;
  /* Gövde ile birebir aynı düz zemin — sağ üst beyaz "güneş" parlaması ve
     sol alt lacivert gölge kaldırıldı; ekranlar arası renk farkı kalmadı. */
  background: var(--app-screen-bg);
}

/* İç kaydırma: içerik uygulamadaki doğal boyunda (ekrandan uzun) durur;
   tur sırasında JS, .ps-detail-inner'ı translateY ile aşağı süpürür. */
.ps-detail-scroll { flex: 1; min-height: 0; overflow: hidden; }
.ps-detail-inner {
  display: flex; flex-direction: column; gap: 8px;
  will-change: transform;
}

/* Üst bar: geri butonu + "Pedagog eşliğinde" rozeti + favori kalbi.
   ROZET METNİ `detail.badge`DAN gelir; "onaylı" DEĞİL (mühür formu yasak,
   gerekçe SiteContent.py'deki trust_explainer notunda). */
.ps-app-head { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.ps-hbtn {
  width: 22px; height: 22px; border-radius: var(--r-sm);
  background: rgba(255,255,255,.88);
  display: grid; place-items: center;
  color: var(--ink); font-weight: 800; font-size: .74rem; line-height: 1;
}
.ps-trust {
  padding: 3px 10px; border-radius: var(--r-full);
  background: rgba(255,255,255,.88);
  color: #166534; font-weight: 800; font-size: .56rem; white-space: nowrap;
}
.ps-detail-title {
  display: block; text-align: center;
  font-family: var(--font-head); font-size: 1.04rem; font-weight: 700; line-height: 1.2;
  color: #fff; text-shadow: 0 1px 6px rgba(10,40,120,.35);
}

/* Uygulamadaki section kartı (Özet / Gereken Malzemeler / Nasıl Yapılır) */
.ps-sec {
  background: rgba(255,255,255,.95);
  border: 1px solid rgba(26,111,245,.08);
  border-radius: var(--r);
  padding: 10px 11px;
  box-shadow: 0 3px 10px -4px rgba(10,40,120,.35);
}
[data-theme="dark"] .ps-sec { background: rgba(18,20,90,.88); border-color: rgba(255,255,255,.14); }
.ps-sec-head { display: flex; align-items: center; gap: 5px; }
.ps-sec-ico {
  flex: 0 0 18px; width: 18px; height: 18px; border-radius: 6px;
  background: color-mix(in srgb, var(--app-play) 20%, #fff);
  display: grid; place-items: center; font-size: .6rem; line-height: 1;
}
[data-theme="dark"] .ps-sec-ico { background: color-mix(in srgb, var(--app-play) 36%, transparent); }
.ps-sec-head h6 { margin: 0; font-size: .73rem; color: var(--ink); flex: 1; min-width: 0; }
[data-theme="dark"] .ps-sec-head h6 { color: #fff; }
.ps-chip--sub, .ps-chip--age {
  padding: 2px 7px; border-radius: 6px;
  font-size: .56rem; font-weight: 800; white-space: nowrap;
}
.ps-chip--sub { background: var(--app-science); color: #fff; }
.ps-chip--age { background: rgba(15,27,46,.06); border: 1px solid rgba(15,27,46,.1); color: var(--ink); }
[data-theme="dark"] .ps-chip--age { background: rgba(255,255,255,.1); border-color: rgba(255,255,255,.16); color: #fff; }
.ps-sec-body { margin: 6px 1px 0; font-size: .68rem; line-height: 1.45; color: var(--app-body-tx); }

/* Görsel — uygulamadaki gibi tam genişlik, 2:3 dikey aktivite kartı */
.ps-detail-hero {
  display: block; flex: none;
  aspect-ratio: 2 / 3;
  border-radius: var(--r); overflow: hidden;
  box-shadow: 0 6px 16px -6px rgba(0,0,0,.4);
}
.ps-detail-hero img { width: 100%; height: 100%; object-fit: cover; }

/* "0 / N" ilerleme chip'i (Malzemeler + Nasıl Yapılır başlıklarında) */
.ps-progress {
  padding: 2px 7px; border-radius: 6px;
  font-size: .56rem; font-weight: 800; color: var(--ink);
  background: rgba(15,27,46,.06);
}
[data-theme="dark"] .ps-progress { color: #fff; background: rgba(255,255,255,.1); }

/* Malzeme checklist'i — kare onay kutuları */
.ps-mats { list-style: none; margin: 6px 0 0; padding: 0; display: flex; flex-direction: column; gap: 5px; }
.ps-mats li { position: relative; padding-left: 20px; font-size: .67rem; line-height: 1.4; color: var(--app-body-tx); }
.ps-mats li::before {
  content: ""; position: absolute; left: 1px; top: 2px;
  width: 11px; height: 11px; border-radius: 3px;
  border: 1.5px solid #9CA3AF;
}

/* Adım ilerleme çubuğu + numaralı timeline (ilk adım "aktif" pembe halka) */
.ps-stepbar { height: 4px; border-radius: var(--r-full); background: rgba(15,27,46,.06); margin: 6px 0 2px; overflow: hidden; }
[data-theme="dark"] .ps-stepbar { background: rgba(255,255,255,.08); }
.ps-stepbar i { display: block; width: 8%; height: 100%; border-radius: inherit; background: var(--app-play); }

.ps-steps { list-style: none; margin: 3px 0 0; padding: 0; counter-reset: psstep; }
.ps-steps li {
  counter-increment: psstep;
  position: relative; padding: 5px 0 5px 28px;
  font-size: .67rem; line-height: 1.4; color: var(--app-body-tx);
}
.ps-steps li::before {
  content: counter(psstep);
  position: absolute; left: 0; top: 4px;
  width: 18px; height: 18px; border-radius: 50%;
  display: grid; place-items: center;
  font-size: .6rem; font-weight: 800;
  background: #E5E7EB; color: #9CA3AF;
}
[data-theme="dark"] .ps-steps li::before { background: rgba(255,255,255,.08); color: rgba(255,255,255,.55); }
.ps-steps li:first-child::before { background: #fff; border: 2px solid var(--app-play); color: var(--app-play); }
[data-theme="dark"] .ps-steps li:first-child::before { background: rgba(255,255,255,.1); }
.ps-steps li:not(:last-child)::after {
  content: ""; position: absolute; left: 8px; top: 24px; bottom: -4px;
  width: 2px; border-radius: 1px;
  background: color-mix(in srgb, var(--app-play) 16%, transparent);
}

/* "Tamamla" orb'u — uygulamadaki dairesel kategori-gradyan CTA */
.ps-orb {
  position: relative;
  align-self: center; flex: 0 0 auto;
  margin: 3px 0 4px;
  width: 66px; height: 66px; border-radius: 50%;
  display: grid; place-items: center;
  /* Sol üstteki beyaz "parlama" (specular highlight) kaldırıldı — telefonun
     içinde güneş yansıması istenmiyor; renk gradyanı tek başına kalıyor. */
  background:
    linear-gradient(160deg, var(--app-play-soft) 0%, var(--app-play) 55%, var(--app-play-deep) 100%);
  color: #fff; font-weight: 800; font-size: .66rem; text-align: center;
  box-shadow: 0 8px 20px -6px color-mix(in srgb, var(--app-play) 70%, transparent);
}
/* Tur, dokunma anında is-pressed verir: basılma (scale) + halka dalgası */
.ps-orb::after {
  content: ""; position: absolute; inset: -4px;
  border-radius: 50%;
  border: 2px solid #fff;
  opacity: 0; pointer-events: none;
}
.ps-orb.is-pressed { animation: psOrbPress .6s var(--ease-pop) both; }
.ps-orb.is-pressed::after { animation: psOrbRing var(--t-xl) ease .16s both; }

/* Ekran 3 — kutlama / tamamlama */
.ps-screen--done {
  display: flex; flex-direction: column;
  align-items: center; justify-content: center;
  text-align: center;
}
.ps-confetti {
  position: absolute; inset: 8px; pointer-events: none;
  background-image:
    radial-gradient(circle at 14% 18%, var(--c-oyna) 3px, transparent 4px),
    radial-gradient(circle at 82% 12%, var(--c-dusun) 3px, transparent 4px),
    radial-gradient(circle at 68% 26%, var(--c-kesfet) 2.5px, transparent 3.5px),
    radial-gradient(circle at 28% 32%, var(--c-muhabbet) 2.5px, transparent 3.5px),
    radial-gradient(circle at 90% 46%, var(--c-oyna) 2px, transparent 3px),
    radial-gradient(circle at 8% 58%, var(--c-dusun) 2.5px, transparent 3.5px),
    radial-gradient(circle at 80% 72%, var(--c-muhabbet) 3px, transparent 4px),
    radial-gradient(circle at 18% 82%, var(--c-kesfet) 3px, transparent 4px),
    radial-gradient(circle at 55% 92%, var(--c-oyna) 2px, transparent 3px),
    radial-gradient(circle at 42% 8%, var(--sun) 2.5px, transparent 3.5px);
  opacity: .9;
  animation: confettiDrift 4.5s ease-in-out infinite alternate;
}
.ps-done-kido {
  width: 84px; height: 84px; border-radius: var(--r-xl);
  background: #fff; box-shadow: var(--shadow);
  display: grid; place-items: center;
  margin-bottom: 14px;
}
[data-theme="dark"] .ps-done-kido { background: rgba(18,20,90,.95); }
.ps-done-kido img { width: 64px; height: 64px; }
.ps-screen--done.is-active .ps-done-kido { animation: bounceIn var(--t-xl) ease .4s both; }
/* Kutlama metni de doğrudan mavi zeminde → beyaz. */
.ps-done-title { font-family: var(--font-head); font-size: 1.35rem; color: #fff; }
.ps-done-sub { color: #fff; font-size: .84rem; margin-top: 4px; }
.ps-done-progress {
  width: 66%; height: 8px; margin-top: 16px;
  border-radius: var(--r-full);
  /* Yiv de mavi zeminde: mavi-üstü-mavi yerine beyaz saydam → dolgu okunur. */
  background: rgba(255,255,255,.28);
  overflow: hidden;
}
.ps-done-progress i {
  display: block; height: 100%;
  border-radius: inherit;
  background: var(--grad-brand);
  transform-origin: left;
}
.ps-screen--done.is-active .ps-done-progress i { animation: psBarGrow 1s ease .5s both; }
/* "4/4 etkinlik" — light'ta --tx2 koyu mavi-gri olduğu için mavi zeminde
   tamamen kayboluyordu (görsel kontrolde yakalandı, ölçüm probe'unda yoktu). */
.ps-done-count { color: #fff; font-size: .74rem; font-weight: 800; margin-top: 7px; }
.ps-screen--done .ps-pill { margin-top: 18px; }


/* ----------------------------------------------------------------------------
   7) (Stats bandı ve ardından gelen .stat-line "sıcak satır" da kaldırıldı;
      ölü kuralları temizlendi. Sayı artık hero'da, telefonun sol üst köşesine
      binen küçük bilgi kartında — .hero-count. HERO'NUN SAYACI GİTTİ: sticker
      170px'lik bir kutu, orada kıpırdayan bir rakam okunacak bir hareket değil.
      Site.js'in sayaç bloğu DURUYOR ve ölü DEĞİL: ana sayfada hâlâ tek bir
      [data-count] var — gelişim çemberinin merkezindeki "1.000+" sayacı
      (Components/Site/GrowthWheel.html). Blok "hiçbir düğüm bulmuyor" diye
      silinirse o sayı sayfaya sessizce sabit gelir.)
---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
   8) Kategori kartları
---------------------------------------------------------------------------- */
/* IZGARA KOLON SAYISI İÇERİĞE GÖRE, "4" DİYE VARSAYILARAK DEĞİL.
   Taban `repeat(4, 1fr)` idi ve tek kullanıcısı kategori sayfalarının "Diğer
   dünyalar" bölümüydü: orada HER ZAMAN 3 kart var (dört kategoriden bulunulan
   çıkar), yani dört sayfanın dördünde de satırın sağında 299px boş bir kolon
   duruyordu (1440'ta ölçüldü). Kolon sayısı bu yüzden kart sayısına eşit: 3.
   `auto-fit` denenip elendi: 1180px kapta minmax(240px,1fr) yine 4 yuva açar,
   yani aynı boş kolonu geri getirir.
   (Bir dönem bir de `.cat-grid--map` vardı — Kategoriler sayfasındaki dört
   dünya kart haritası. Bölüm üstündeki balonları tekrarladığı için kaldırıldı,
   bkz. Categories.html'in tepesindeki not.) */
.cat-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
}

.cat-card {
  --cat: var(--blue);
  --glow-c: var(--cat);   /* parıltı ölçeği kategorinin rengini alır (rozete de miras kalır) */
  position: relative;
  display: flex; flex-direction: column; gap: 12px;
  padding: var(--sp-md);
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm);
  transition: transform var(--t) var(--ease-out), box-shadow var(--t) ease, border-color var(--t) ease;
}
.cat-card:hover {
  transform: translateY(-4px);
  border-color: color-mix(in srgb, var(--cat) 30%, var(--border));
  box-shadow: var(--shadow), var(--glow-lg);
}
.cat-card:hover .cat-emoji {
  transform: translateY(-2px);
  box-shadow: var(--glow);
}

.cat-emoji {
  width: 64px; height: 64px;
  display: grid; place-items: center;
  font-size: 2rem;
  border-radius: var(--r);
  background: color-mix(in srgb, var(--cat) 12%, var(--card-solid));
  border: 1px solid color-mix(in srgb, var(--cat) 18%, transparent);
  box-shadow: var(--glow-sm);
  transition: transform var(--t) var(--ease-out), box-shadow var(--t) ease;
}
/* Diğer kategoriler kartında kategori illüstrasyonu (WebP, şeffaf zemin) */
.cat-emoji--img img { width: 78%; height: 78%; object-fit: contain; display: block; filter: drop-shadow(0 2px 3px rgba(0,0,0,.18)); }

.cat-name {
  font-size: var(--fs-4xl); margin: 4px 0 0;
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 10px;
}
.cat-name .tag {
  font-size: var(--fs-sm); font-weight: 700;
  color: color-mix(in srgb, var(--cat) 78%, var(--tx1));
}
.cat-desc { margin: 0; }

/* "İncele →" — KATEGORİ RENGİ AMA ZEMİNİN MÜREKKEBİYLE KARIŞMIŞ HÂLİ.

   Ham `--cat-deep` yazıyordu ve dört kategoride sekiz kombinasyonun BEŞİ AA'nın
   altındaydı (ölçüldü, kart zemininde): açık temada Düşün 2.90 · Keşfet 3.35,
   koyu temada Oyna 3.22 · Keşfet 4.44 · Muhabbet 2.56. `-deep` varyantı AÇIK
   zemin için koyulaştırılmıştır; gece zemininde tam ters yönde çalışır — bu
   yüzden karışım YÖNÜ temaya göre değişir, tek bir değer iki temayı birden
   kurtaramaz (.energy-line ikonundaki aynı kural).

   Oran her iki yönde de en yüksek geçen değer: kategori rengi olabildiğince
   korunsun, ölçüm 4.5'i geçsin. Sonuç (kart zemininde, dört kategori):
     açık 6.63 · 4.98 · 4.97 · 7.52    koyu 7.56 · 10.0 · 9.44 · 7.22
   Oranı yükseltmek renge yaklaştırır ve ölçümü AA'nın altına indirir; hiçbir
   şey hata vermez, yalnız bağlantı okunmaz olur. */
.cat-more {
  margin-top: auto; padding-top: 14px;
  font-family: var(--font-head); font-weight: 700;
  color: color-mix(in oklch, var(--cat-deep, var(--cat)) 62%, var(--tx1));
  transition: transform var(--t-sm) ease;
}
[data-theme="dark"] .cat-more { color: color-mix(in oklch, var(--cat) 58%, #FFF); }
.cat-card:hover .cat-more { transform: translateX(5px); }

/* ----------------------------------------------------------------------------
   8b) Kategori balonları (ana sayfa) — uygulamadaki dairesel gradyan balonlar;
       tıklayınca o kategoriden 4 gerçek etkinlik açılır.
       Gradyan durakları categoryColors.ts .gradient[] dizilerinden.

       YERLEŞİM KURALI: ızgara SABİT. Kartlar 1-2. satıra elle yerleştirilir,
       panel `grid-column: 1 / -1` ile otomatik olarak ALTLARINA (3. satır)
       düşer. Böylece bir kart açıldığında hiçbir kart yer değiştirmez —
       eski davranışta açılan kart tüm satırı kaplayıp kalan üçünü kaydırıyor,
       düzen tek sütunlu/dengesiz görünüyordu.

       DURUM: gizli checkbox (.cat-switch) → `:checked + .cat-bubble + .cat-panel`.
       CSS-only; JS yoksa da açılır. Site.js yalnız "tek panel açık" ekler.
---------------------------------------------------------------------------- */
.cat-bubbles {
  display: grid;
  /* DÖRT KOLON, iki değil (2026-09-01). İki kolonluk hâli, balonların yanında
     `PhoneCategories` maketi dururken doğruydu: kolonun yarısını telefon
     alıyordu. Maket kalkınca (bkz. Index.html'deki bölüm notu) dört balon
     1440'ta ~580px genişliğinde dört BOŞ beyaz karta dönüştü — maskot + ad +
     tek satır, gerisi boşluk; yani tam olarak "230px kutuda iki satır bilgi"
     eleştirisinin kendisi. Dört kolonda kart ~270px'e iner ve dolu okunur.
     ÖLÇÜLDÜ: balon ızgarası 1440x900'de 471 → 251px. */
  grid-template-columns: repeat(4, 1fr);
  gap: clamp(14px, 2vw, 20px);
  align-content: start;
  /* .cat-switch'in çıpası. Olmazsa gizli checkbox belgenin sol üstüne
     konumlanır ve odaklandığı an tarayıcı sayfayı EN BAŞA kaydırır. */
  position: relative;
}

/* Kart hücreleri SABİT ve bu bir süs değil: paneller aynı ızgaranın çocuğu ve
   açıldıklarında `1 / -1` ile tam satır isterler. Otomatik akış bırakılsaydı
   açılan bir panel, kendisinden SONRAKİ balonları da alt satırlara dağıtırdı —
   yani bir kategoriyi açmak dört dünyanın düzenini bozardı.
   2026-09-01: dördü de TEK SATIRDA (1/1..1/4). Öncesi 2x2 idi ve doğruydu —
   balonların yanında `PhoneCategories` maketi duruyordu, kolonun yarısı
   telefonundu. Maket kalkınca 2x2, 1440'ta dört ~580px'lik BOŞ beyaz kart
   üretti (maskot + ad + tek satır, gerisi boşluk). Kategori sayısı değişirse
   burası ve `.cat-bubbles`ın kolon sayısı BİRLİKTE güncellenir; ayrışırsa
   fazladan kolon sessizce implicit olarak açılır. */
.cat-bubble:nth-of-type(1) { grid-area: 1 / 1; }
.cat-bubble:nth-of-type(2) { grid-area: 1 / 2; }
.cat-bubble:nth-of-type(3) { grid-area: 1 / 3; }
.cat-bubble:nth-of-type(4) { grid-area: 1 / 4; }

/* Panel: kapalıyken display:none olduğu için ızgarada hiç hücre tüketmez;
   açıldığında tam genişlik ister ve 1-2. satır dolu olduğundan 3. satıra iner. */
.cat-panel { display: none; grid-column: 1 / -1; }
.cat-switch:checked + .cat-bubble + .cat-panel { display: block; }

/* Durumu taşıyan onay kutusu. display:none DEĞİL — klavyeyle ulaşılabilir
   kalmalı (Tab ile odaklan, Space ile aç/kapa). */
.cat-switch {
  position: absolute; top: 0; left: 0;
  width: 1px; height: 1px; margin: 0;
  padding: 0; border: 0; overflow: hidden; white-space: nowrap;
  clip-path: inset(50%);
}

.cat-bubble {
  /* Slug bazlı gradyan durakları (açık → orta → koyu) */
  --cg1: #6CB4FF; --cg2: #2E8BF7; --cg3: #1A6FF5;
  --glow-c: var(--cat);   /* --cat inline gelir (CategoryBubbles.html) */
  cursor: pointer;
  display: flex; flex-direction: column; align-items: center; text-align: center;
  gap: 8px; padding: var(--sp-sm) 14px;
  border-radius: var(--r-lg);
  background: var(--card);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-sm);
  transition: transform var(--t) var(--ease-out), box-shadow var(--t) ease,
              border-color var(--t) ease, background var(--t) ease;
}
.cat-bubble--oyna     { --cg1: #FFA5E1; --cg2: #FF2DBE; --cg3: #D71E9B; }
.cat-bubble--dusun    { --cg1: #FEE682; --cg2: #F5A51E; --cg3: #DC8214; }
.cat-bubble--kesfet   { --cg1: #78EBBE; --cg2: #23C38C; --cg3: #0FA06E; }
.cat-bubble--muhabbet { --cg1: #AFBEFF; --cg2: #6E73F0; --cg3: #5550E1; }

.cat-bubble:hover {
  transform: translateY(-4px);
  border-color: color-mix(in srgb, var(--cat) 30%, var(--border));
  box-shadow: var(--shadow), 0 22px 44px -26px color-mix(in srgb, var(--cat) 42%, transparent);
}
.cat-switch:focus-visible + .cat-bubble { outline: 3px solid color-mix(in srgb, var(--cat) 55%, transparent); outline-offset: 3px; }

/* MASKOT SERBEST DURUR, KUTU İÇİNDE DEĞİL (2026-09-01, konsey kararı 6:
   "boşalan yere resim gir, kutu değil — suluboya illüstrasyonlar ve maskotlar
   tam boy görünsün"). Buradaki `.cat-orb` uzun süre DOLU bir gradyan disk +
   3px beyaz halka idi ve suluboya kesit onun içinde %78'e küçültülüyordu:
   92px'lik dairede ~72px'lik maskot, yani sitenin ayırt edici varlığı bir
   rozetin içine sıkışmıştı. Ölçüldü (1440x900): görünen maskot 72 → 138px.

   KURAL YENİ DEĞİL, sitenin her yerindeki maskot kuralının ta kendisi —
   `/kategoriler`in `.cw-mark`ı, kapanış kutusunun maskotu, `.steps-mascot`,
   `.trust-explain-kido` hepsi böyle: kutusu/kenarlığı/zemini yok, derinliği
   yalnız `drop-shadow` verir. Ana sayfanın dört dünya kartı bu kuralın
   sitedeki son istisnasıydı.

   RENK GİTMEDİ, KUTUSU GİTTİ: `--cat` artık sert kenarlı bir disk değil,
   maskotun arkasındaki yumuşak hale. Kategori kimliği hale + renkli ad +
   renkli "Etkinlikleri gör" satırıyla üç kanaldan okunuyor. Karışım OKLCH'de
   (`.cta-box`taki aynı gerekçe): sRGB'de açık uçta chroma kaybolur ve dört
   hale birbirinden ayrılmayan dört griye iner. Koyu temada oran %26 → %20:
   gece zemininde aynı değer, özellikle Düşün'ün amberinde, halesi olmayan
   bir "kahverengi leke" gibi okunuyordu.

   `cpsBubbleFloat` KALIR (uygulamanın imza hareketi) ama HOVER ARTIK
   GÖRSELDE: `.cat-orb`un transform'u sonsuz animasyonun elinde, oraya yazılan
   bir `scale` sessizce yenilir — eski `.cat-bubble:hover .cat-orb` kuralı tam
   olarak bu yüzden ÖLÜYDÜ ve hiçbir şey hata vermiyordu. */
.cat-orb {
  width: clamp(104px, 12vw, 138px); aspect-ratio: 1;
  display: grid; place-items: center;
  border-radius: 50%;
  background: radial-gradient(circle at 50% 46%,
              color-mix(in oklch, var(--cat) 26%, transparent) 0 50%, transparent 72%);
  animation: cpsBubbleFloat 5s ease-in-out infinite;
}
[data-theme="dark"] .cat-orb {
  background: radial-gradient(circle at 50% 46%,
              color-mix(in oklch, var(--cat) 20%, transparent) 0 50%, transparent 72%);
}
/* GÖRSELSİZ KATEGORİ YEDEĞİ — burada disk KALMAK ZORUNDA: beyaz bir glyph
   şeffaf halenin üstünde krem zeminde görünmez olur. Yedek bugün hiç
   çalışmıyor (dört kategorinin dördünde de `img` var) ama düşerse sessizce
   boş bir daire kalır. */
.cat-orb-ico {
  width: 78%; height: 78%;
  display: grid; place-items: center; border-radius: 50%;
  background: radial-gradient(120% 120% at 32% 18%, var(--cg1), var(--cg2) 60%, var(--cg3));
  border: 3px solid rgba(255,255,255,.6);
  box-shadow: inset 0 8px 14px -8px rgba(255,255,255,.6);
  font-size: clamp(1.7rem, 3.4vw, 2.2rem); line-height: 1; color: #fff;
  filter: drop-shadow(0 2px 3px rgba(0,0,0,.2));
}
[data-theme="dark"] .cat-orb-ico { border-color: rgba(255,255,255,.28); }
/* Kategori illüstrasyonu — şeffaf WebP, hale kadar TAM BOY. */
.cat-orb-img {
  width: 100%; height: 100%; object-fit: contain; display: block;
  filter: drop-shadow(0 8px 14px rgba(0,0,0,.22));
  transition: transform var(--t) var(--ease-out);
}
.cat-bubble:hover .cat-orb-img { transform: scale(1.06); }

.cat-bubble-name { font-family: var(--font-head); font-weight: 800; font-size: var(--fs-2xl); color: var(--tx1); }
.cat-bubble-ex { font-size: var(--fs-sm); color: var(--tx2); font-weight: 700; }
/* `margin-top: auto` TABANA İTER — DÜZ `2px` DEĞİL. Izgara satırı en uzun
   karta göre eşitleniyor (grid `stretch`, ölçüldü: 320px'te "Keşfet" (tek
   satır) ile "Muhabbet Et" (iki satıra sarar) kartı birebir 301px), ama
   `.cat-bubble` içi `flex-start` olduğu için fazla boy varsayılan olarak
   ALTA düşüyordu — kısa başlıklı kartın çipi bir satır yukarıda kalıyor,
   ikisi yan yana bakınca sıra bozuk okunuyordu. `auto` çipi her zaman kartın
   dibine oturtur, başlık kaç satır sürerse sürsün (TR/EN ikisinde de). */
.cat-bubble-cue {
  margin-top: auto;
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--fs-sm); font-weight: 800;
  color: var(--cat-deep, var(--cat)); /* METİN: WCAG için -deep varyantı */
}
.cat-bubble-cue i { transition: transform var(--t-sm) ease; font-size: .8em; }

/* Açık kart — panel artık altta ve uzakta durduğu için kaynağın hangi kart
   olduğu GÖZLE seçilebilmeli: kategori tintli zemin + kalın kategori halkası. */
.cat-switch:checked + .cat-bubble {
  background: color-mix(in srgb, var(--cat) 8%, var(--card-solid));
  border-color: color-mix(in srgb, var(--cat) 45%, var(--border));
  box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--cat) 32%, transparent),
              var(--shadow), 0 22px 44px -26px color-mix(in srgb, var(--cat) 42%, transparent);
}
.cat-switch:checked + .cat-bubble .cat-bubble-cue i { transform: rotate(180deg); }

/* Genişleyen etkinlik paneli — ızgaranın altında, tam genişlikte tek şerit */
.cat-panel {
  padding: var(--sp-sm);
  border-radius: var(--r-lg);
  background: color-mix(in srgb, var(--cat) 6%, var(--card-solid));
  border: 1px solid color-mix(in srgb, var(--cat) 18%, var(--border));
  box-shadow: var(--shadow-sm);
  animation: catPanelIn var(--t) var(--ease-out) both;
}
/* Panel başlık satırı: solda mini kategori küresi + başlık, sağda Kapat */
.cat-panel-top {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px; flex-wrap: wrap; margin-bottom: 14px;
}
.cat-panel-head {
  flex: 1 1 240px; min-width: 0; margin: 0;
  font-size: var(--fs-lg); color: var(--tx2);
  display: inline-flex; align-items: center; gap: 10px;
}
.cat-panel-head b { color: color-mix(in srgb, var(--cat) 78%, var(--tx1)); }
/* Kartla panel arasındaki görsel bağ — karttaki orb'un küçük kopyası.
   --cg* değerleri karta ait olduğu için burada gradyan --cat/--cat-deep'ten. */
.cat-panel-mark {
  flex: none; width: 34px; height: 34px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: radial-gradient(120% 120% at 32% 18%,
    color-mix(in srgb, var(--cat) 42%, #fff), var(--cat) 62%, var(--cat-deep, var(--cat)));
  border: 2px solid rgba(255,255,255,.6);
  box-shadow: 0 6px 14px -8px color-mix(in srgb, var(--cat) 70%, transparent);
  color: #fff; font-size: .82rem;
}
[data-theme="dark"] .cat-panel-mark { border-color: rgba(255,255,255,.28); }
.cat-panel-mark img { width: 80%; height: 80%; object-fit: contain; display: block; }

/* Kapat — kartın <label>'ı ile aynı checkbox'a bağlı, yani JS'siz de kapatır */
.cat-panel-close {
  cursor: pointer; margin-left: auto;   /* dar ekranda alt satıra düşse de sağda kalsın */
  display: inline-flex; align-items: center; gap: 7px;
  padding: 7px 14px; border-radius: var(--r-full);
  font-size: var(--fs-sm); font-weight: 800;
  color: var(--cat-deep, var(--cat));   /* METİN: WCAG için -deep varyantı */
  background: color-mix(in srgb, var(--cat) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--cat) 26%, transparent);
  transition: background var(--t-sm) ease, border-color var(--t-sm) ease;
}
.cat-panel-close:hover {
  background: color-mix(in srgb, var(--cat) 18%, transparent);
  border-color: color-mix(in srgb, var(--cat) 40%, transparent);
}
.cat-panel-close i { font-size: .9em; }

.cat-acts {
  display: grid; grid-template-columns: repeat(4, 1fr);
  gap: 12px;
}
/* Vitrin kartı — uygulamadaki ActivityCard'ın düzeni: üstte medya alanı
   (görsel varsa görsel, yoksa kategori gradyanı), medyadan taşan emoji balonu,
   ortalı başlık, renkli meta pill'leri (süre=amber, yaş=indigo —
   ActivityCard.tsx renkleri), altta kategori-tint'li malzeme kutusu.
   Markup: Macros.html activityCard() (Index paneli + Kategoriler ortak). */
.cat-act {
  display: flex; flex-direction: column; align-items: center; gap: 7px;
  padding: 0 12px 14px;
  border-radius: var(--r-lg);
  background: var(--card-solid);
  border: 1px solid var(--border);
  box-shadow: var(--shadow-sm);
}
/* Hover kalkışı bilerek YOK — ve transition da yok, çünkü geçecek durum yok.
   Kart tıklanabilir değil: düz bir <div> (Macros.html activityCard), link de
   değil, JS de bağlı değil. Kalkan bir kart tıklanabilirlik vaat eder; panelde
   karşılığı olmadığı için ölü uç hissi verirdi. Etkinlik detayı uygulamada
   yaşar (ana sayfadaki telefon maketinin 2. ekranı onu zaten gösteriyor) —
   buradaki kart vitrindir. Dönüşüm panelin altındaki "tümü" CTA'sında.
   Buraya hover/tıklama eklemeden önce: kart gerçekten bir yere gidiyor mu? */
.cat-act-media {
  position: relative;
  width: calc(100% + 24px); margin: 0 -12px;
  height: 96px;
  border-radius: 19px 19px 20px 20px;
  overflow: hidden;
  /* Görselsiz durum: düz kutu değil — gradyan + nokta dokusu + emoji filigran
     (uygulamadaki no-image fallback'in ruhu; "içerik boş mu" hissini önler) */
  background:
    radial-gradient(rgba(255,255,255,.35) 1.5px, transparent 1.5px),
    linear-gradient(135deg,
      color-mix(in srgb, var(--cat) 55%, transparent),
      color-mix(in srgb, var(--cat) 22%, transparent));
  background-size: 18px 18px, 100% 100%;
}
.cat-act-media-ico {
  position: absolute; right: 12px; bottom: 6px;
  font-size: 38px; opacity: .34;
  color: color-mix(in srgb, var(--cat) 70%, #fff);
  transform: rotate(-8deg);
}
.cat-act-media:has(img)::after { display: none; }
.cat-act-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cat-act-bubble {
  width: 44px; height: 44px; margin-top: -26px;
  display: grid; place-items: center;
  border-radius: 50%;
  font-size: var(--fs-4xl);
  background: var(--card-solid);
  box-shadow: var(--shadow-sm);
}
/* Kategori illüstrasyonu balonda — emoji yerine WebP (şeffaf zeminli).
   Balon zemini arkada kalır; görsel balonu ~%80 doldurur. */
.cat-act-bubble--img img {
  width: 82%; height: 82%; object-fit: contain; display: block;
  filter: drop-shadow(0 1px 2px rgba(0,0,0,.18));
}
.cat-act-name {
  font-family: var(--font-head); font-size: var(--fs); line-height: 1.2;
  text-align: center; color: var(--tx1);
}
/* margin-top:auto → başlık 1 mi 2 mi satır, meta ve malzeme kutusu yine de
   dört kartta aynı hizada oturur (kartlar zaten ızgarada eşit yükseklikte). */
.cat-act-tags { margin-top: auto; display: flex; justify-content: center; gap: 6px; flex-wrap: wrap; }
.cat-act-tag {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 8px; border-radius: var(--r-sm); border: 1px solid transparent;
  font-size: var(--fs-2xs); font-weight: 800; white-space: nowrap;
}
.cat-act-tag i { font-size: .82em; }
.cat-act-tag--dur { color: #92400E; background: #FEF3C7; border-color: #FDE68A; }
.cat-act-tag--age { color: #4338CA; background: #E0E7FF; border-color: #C7D2FE; }
[data-theme="dark"] .cat-act-tag--dur { color: #FCD34D; background: rgba(252,211,77,.12); border-color: rgba(252,211,77,.25); }
[data-theme="dark"] .cat-act-tag--age { color: #A5B4FC; background: rgba(165,180,252,.12); border-color: rgba(165,180,252,.25); }
.cat-act-hint {
  width: 100%;
  display: inline-flex; align-items: center; justify-content: center; gap: 5px;
  padding: 6px 10px; border-radius: var(--r-sm);
  background: color-mix(in srgb, var(--cat) 11%, transparent);
  font-size: var(--fs-xs); color: var(--tx2); font-weight: 700;
  text-align: center;
}
.cat-act-hint i { color: color-mix(in srgb, var(--cat) 70%, var(--tx2)); font-size: .82em; }

/* Panelin "derinlik" satırı — kartların VİTRİN olduğunu, asıl detayın
   uygulamada durduğunu söyler. Altındaki .cat-panel-more niceliği vaat eder
   ("1000+ etkinlik"), bu satır niteliği: özet + malzeme + adım adım anlatım.
   Kartlar bilerek sessiz olduğu için (bkz. .cat-act) sözü panel üstleniyor. */
/* NOT SOLDA ROZET, BAĞLANTI SAĞDA — ikisi TEK SATIR (2026-09-07, kullanıcı
   kararı). Alt alta dururken panelin dibi iki ayrı sola yaslı satırdı ve
   bağlantı, kendisinden uzun ve sessiz bir cümlenin altında kayboluyordu;
   yan yana konunca satır "not | eylem" diye okunuyor. Dar ekranda `wrap`
   ikisini yine alt alta indirir — sabit bir kırılma noktası YAZILMAZ, panel
   genişliği balon ızgarasından geliyor ve medya sorgusuyla ayrışırlar. */
.cat-panel-foot {
  display: flex; align-items: center; justify-content: space-between;
  flex-wrap: wrap; gap: 12px 18px;
  margin-top: 14px;
}

/* Rozetin dili `.cat-panel-close` ÇİPİNİN AYNISI (aynı panelde, aynı kategori
   karışımı): tepede kapatma çipi, dipte not rozeti — panel iki ucundan aynı
   biçimle kapanıyor. Fark yalnız METİN rengi: bu bir eylem değil, gövde
   metnidir, o yüzden `--tx2` kalır ve kategori rengi yalnız ikonda durur. */
.cat-panel-depth {
  display: inline-flex; align-items: center; gap: 9px;
  margin: 0;
  padding: 8px 14px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--cat) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--cat) 26%, transparent);
  font-size: var(--fs-sm); line-height: 1.45;
  color: var(--tx2);
}
.cat-panel-depth i { flex: none; color: var(--cat-deep, var(--cat)); }

/* BAĞLANTI DA BİR DÜĞMEDİR (2026-09-07, kullanıcı kararı): solda rozet, sağda
   düğme — satırın iki ucu artık aynı ailenin iki ağırlığı. Zemin DOLU DEĞİL
   tint: `--cat` doldurulursa beyaz metin amberde ~2.8:1'e düşer (çip halkası
   da tam bu ölçüm yüzünden çizgiliydi). Tint + `-deep` metin, `.cat-panel-close`
   ve not rozetiyle aynı formülün bir kademe koyusu; sayfanın gerçek dolu
   düğmesi (waitlist) tek kalır. */
.cat-panel-more {
  display: inline-flex; align-items: center; gap: 8px;
  margin-left: auto;   /* rozet kısa kalsa da düğme sağ uçta durur */
  padding: 9px 16px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--cat) 13%, transparent);
  border: 1px solid color-mix(in srgb, var(--cat) 34%, transparent);
  font-family: var(--font-head); font-weight: 800; font-size: var(--fs);
  color: var(--cat-deep, var(--cat)); /* METİN: WCAG için -deep varyantı */
  transition: background var(--t-sm) ease, border-color var(--t-sm) ease;
}

/* KOYU TEMADA BU DÖRT SATIR `-deep` OKUYAMAZ (2026-08-26). Dördü de kategori
   renkli KÜÇÜK metin (balon ipucu, panel kapatma çipi, derinlik satırı, panel
   bağlantısı) ve `--cat-deep` şablondan INLINE geliyor (`colorDeep`) — yani
   `--cat-*-tx` token'ları buraya ulaşamaz, formül kuralın içinde yazılmak
   zorunda. Ölçüm (`--card-solid` #151B3D üstünde, `-deep` ham hâliyle):
   Oyna 3.62 · Düşün 5.77 · Keşfet 4.99 · Muhabbet **2.88** — ikisi hâlâ AA'nın
   altında ve hiçbiri hata vermiyordu, çünkü `-deep` AÇIK zemin için
   koyulaştırılmış bir tondur ve gece zemininde ters yönde çalışır. (Kural
   #1B2A46 üstünde kondu; orada dördün ÜÇÜ eksikti — 3.10 · 4.94 · 4.28 ·
   2.47. Yüzey koyulaşınca ölçüm yukarı gitti, ihtiyaç kalkmadı.)
   Formül yeni değil: `.cat-more`ın koyu tema karışımının AYNISI
   (8.51 · 11.26 · 10.63 · 8.13) — aynı kartların üstünde iki farklı kategori
   mürekkebi olmasın diye bilerek tekrarlandı. Karışım OKLCH'de: sRGB'de açık
   uçta chroma kaybolur ve dört renk birbirinden ayrılmayan dört pastele iner.
   Özgüllük her dördünde de tabandan yüksek, yani sıra yük taşımıyor. */
[data-theme="dark"] .cat-bubble-cue,
[data-theme="dark"] .cat-panel-close,
[data-theme="dark"] .cat-panel-depth i,
[data-theme="dark"] .cat-panel-more { color: color-mix(in oklch, var(--cat) 58%, #FFF); }

/* TEK OK, ve o ok ÇİFT CHEVRON (2026-09-07, kullanıcı kararı). Satırda üç ok
   birden vardı: kopyanın sonundaki "→", halkalı chevron çipi ve ikisinin
   üst üste bindiği okuma ("gör → ›"). Kopyadaki ok `cat_see_post`tan silindi
   (ana sayfanın "TEK OK" kuralının ta kendisi — bkz.
   `test_home_body_links_to_every_nav_page_the_same_way`), halka da kalktı:
   `\f101` tek başına yönü söylüyor ve çip, kategori renginde bir ikinci
   nesne olmadan duruyor. Kontrast gerekçesi düşmedi, GEÇERSİZ kaldı — glyph
   currentColor, yani metnin kanıtlanmış oranını devralıyor. */
.cat-panel-more::after {
  content: "\f101";   /* fa-angle-double-right */
  font-family: "Font Awesome 5 Free"; font-weight: 900;
  display: inline-flex; align-items: center; justify-content: center;
  flex: none;
  font-size: var(--fs-sm); line-height: 1;
  transition: transform var(--t-sm) ease;
}

.cat-panel-more:hover {
  background: color-mix(in srgb, var(--cat) 22%, transparent);
  border-color: color-mix(in srgb, var(--cat) 50%, transparent);
}
.cat-panel-more:hover::after { transform: translateX(3px); }

@keyframes catPanelIn {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ----------------------------------------------------------------------------
   9) Nasıl çalışır — 3 adım
---------------------------------------------------------------------------- */
/* ÜÇ AYRI KART — tek yatay şerit DEĞİL (2026-08-26, kullanıcı kararı).
   Öncesinde üç adım tek `.glass` panelin içinde yan yana yatay satırlardı
   (~180px). Kazandığı şey gerçekti — bölüm bir dönem üç uzun kart olarak
   ~600px yer kaplıyordu — ama bedeli hiyerarşiydi: üç adım tek bir beyaz
   kutunun içinde tek bir NESNE gibi okunuyor, "üç ayrı adım" olduğu yalnız
   metinden anlaşılıyordu; numaralar da ikonun köşesine sıkışmış 25px'lik
   rozetlerdi, yani sayfanın sırayı anlatan tek işareti en küçük öğesiydi.
   Bugün her adım kendi kartı, numara kartın en büyük ikinci yazısı ve
   kartları kesikli mavi bir yol + küçük oklar birbirine bağlıyor: sıra
   metinden değil DÜZENDEN okunuyor. Yükü taşıyan yedi karar:

   - ZEMİN DÜZ YÜZEY RENGİ: `--card-solid` (açıkta beyaz, koyuda uygulamanın
     gece zemini #191970) — MAVİ TİNT DEĞİL (2026-08-26 akşamı, kullanıcı
     kararı). Kart bir gün boyunca %10/%20'lik mavi tintle durdu; sorun
     ölçümde değil ton sayısındaydı: zemin, kenar, numara, ikon ve yol
     zaten aynı maviden geliyor ve tintli zemin beşinci bir mavi ekleyip
     kartı "mavi bir blok" yapıyordu. Kırık beyaz sayfa zemininin üstünde
     temiz beyaz bir yüzey mavi öğeleri öne çıkarır (referans: Abode).
     Kenar, numara, ikon ve ok DEĞİŞMEDİ — mavi yalnız onlarda.
   - YÜZEY HAFİF KALIR: 1px kenar + 20px köşe, GÖLGE YOK. Kart burada bir
     "yükseltme" değil, üç öğeyi birbirinden ayıran şeyin kendisi; gölge
     eklemek üç adımı sayfadan koparıp yüzen üç panele çevirirdi
     (`.hero-count` sticker'ındaki aynı gerekçe: ayrımı KENAR taşır).
   - KENARIN karışımı OKLCH'de kalır: sRGB'de açık uçta chroma kaybolur ve
     ince mavi çizgi griye kaçar (`.cta-box`taki aynı ölçüm). Oranı
     yükseltmek çizgiyi kalın bir renk bandına yaklaştırır.
   - 20px köşe TOKEN DEĞİL ve bilerek: `--r-lg` 18, `--r-xl` 26 — ikisi de
     kullanıcının istediği ölçü değil. Yeni bir token açmak bu tek ölçüyü
     tasarım sistemine sokardı.
   - KESİKLİ YOL + OK, kartın KENARINA yapışan renkli şerit DEĞİL. Yasak olan
     (bkz. UI-Templates.md "dekoratif renkli şerit") bir kutunun bir yüzüne
     konan, hiçbir şey söylemeyen bant; buradaki çizgi iki kart ARASINDA durur
     ve tek işi "önce bu, sonra bu" demek — okun yönü onu bir bilgi yapıyor.
   - Ok FA GLYPH'i olarak yazılır (`\f101` = `»` + font-family + weight 900), metin
     karakteri değil: sitede her glyph Font Awesome (emoji yasağı CSS
     `content:` için de geçerli).
   - GİRİŞ SOLDAN SAĞA ve gecikme JS'ten gelir: her kart ayrı `.reveal`,
     Site.js kardeşlere `--d` = i x 80ms yazıyor. Burada ayrı bir
     `animation-delay` merdiveni YAZILMAZ — iki kaynak sessizce ayrışır ve
     hareket azaltma bloğu yalnız birini sıfırlar.
   - Numara `.step-no` ADI KORUNDU (eski sticker rozetin adıydı): şablon, CSS
     ve testlerde birden geçiyor; kaçan tek bir sınıf hiçbir hata vermeden
     numarayı gövde puntosuna düşürür. */
.steps {
  --steps-gap: clamp(18px, 2.6vw, 32px);
  /* Yolun rengi TEK YERDE: çizgi, ok ve mobil dikey hâli aynı değişkeni okur.
     Ayrı ayrı yazılsalardı biri temayla çevrilir öteki kalırdı. */
  --step-path: color-mix(in oklch, var(--blue) 58%, var(--card-solid));
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--steps-gap);
}

.step {
  position: relative;
  display: grid;
  grid-template-columns: auto 1fr auto;
  align-content: start;
  column-gap: 14px; row-gap: 14px;
  padding: clamp(20px, 2.2vw, 26px);
  background: var(--card-solid);
  border: 1px solid color-mix(in oklch, var(--blue) 26%, var(--card-solid));
  border-radius: 20px;
}

/* Izgara yerleşimi AÇIKÇA yazılır. Yalnız satır verilip kolon verilmediğinde
   otomatik yerleşim numarayı ve ikonu aynı hücreye taşıyor, kopya da yukarı
   kayıyor — `.gx-card` chevron'unda ve `.cx-way` okunda bir kez düşülen tuzak. */
.step-no {
  grid-column: 1; grid-row: 1;
  font-family: var(--font-head); font-weight: 800;
  font-size: clamp(2.05rem, 3.4vw, 2.5rem);
  line-height: .9;
  letter-spacing: -.02em;
  color: var(--btn-tx);
}

/* DOLU rozet, glyph BEYAZ — kart beyaza dönerken DEĞİŞMEDİ (kullanıcı kararı:
   "ikonları koru"). Tintli zemin döneminde zorunluydu (açık rozet kendi kartının
   zeminine karışıyordu, hero güven rozetindeki aynı tuzak); beyaz kartta artık
   zorunlu değil ama üç kartın tek dolu öğesi o ve numaranın karşı ağırlığı
   orada duruyor. Ghost'a çevirmek kartı üç açık mavi lekeye indirir. */
.step-ico {
  grid-column: 3; grid-row: 1; justify-self: end;
  width: 46px; height: 46px;
  display: grid; place-items: center;
  background: linear-gradient(145deg, var(--blue), var(--btn-deep) 70%);
  border-radius: 14px;
}
.step-ico i { font-size: 1.1rem; line-height: 1; color: #fff; }
.step:hover .step-ico i { animation: bounceIn var(--t-lg) ease; }

/* BAŞLIK NUMARANIN YANINDA, altında değil (2026-09-07, kullanıcı kararı):
   numara + başlık tek satırda okununca kart "3. adım: birlikte oynayın" diye
   tek cümle oluyor; başlık ikinci satıra inince numara kendi başına duran ve
   hiçbir şey söylemeyen bir süse dönüyordu. Izgara bu yüzden ÜÇ kolon
   (numara | başlık | rozet) ve üçü de AÇIKÇA yerleştirilir — kolon verilmeyen
   otomatik yerleşim üçünü ikişer hücreye dağıtıyor (aynı tuzak yukarıda). */
.step-title { grid-column: 2; grid-row: 1; align-self: center; font-size: var(--fs-xl); margin: 0; }
.step-copy { grid-column: 1 / -1; grid-row: 2; margin: 0; font-size: var(--fs); }

/* Kesikli yol — kartların ARASINDAKİ boşlukta, ucunda küçük bir ok. Genişlik
   boşluktan ok payı (9px) düşülerek gelir; yoksa çizgi okun altından geçer. */
.step + .step::before {
  content: "";
  position: absolute; z-index: 0;
  top: 50%; left: calc(-1 * var(--steps-gap));
  width: calc(var(--steps-gap) - 9px); height: 0;
  margin-top: -1px;
  border-top: 2px dashed var(--step-path);
}
.step + .step::after {
  content: "\f101";   /* fa-angle-double-right (2026-09-07: tekten çifte) */
  font-family: "Font Awesome 5 Free"; font-weight: 900;
  position: absolute; z-index: 0;
  top: 50%; left: -9px;
  transform: translateY(-50%);
  font-size: .58rem; line-height: 1;
  color: var(--step-path);
}

/* Maskot ÜÇÜNCÜ KARTIN sağ üst köşesinde (eskiden şeridin köşesindeydi ve
   hiçbir adıma ait değildi). Kutusuz durur, derinliği yalnız drop-shadow
   verir; kabında overflow:hidden OLAMAZ — süzülürken kırpılır. `top` orbFloat'ın
   -11px'lik yukarı fazını KAPSAR (bkz. UI-Templates.md "Maskot kartların
   üstünde durur"). */
.steps-mascot {
  position: absolute; z-index: 2;
  top: -28px; right: -4px;
  width: 58px; height: 58px;
  display: grid; place-items: center;
  pointer-events: none;
  animation: orbFloat 5s ease-in-out infinite;
}
.steps-mascot img { width: 100%; height: 100%; object-fit: contain; filter: drop-shadow(0 6px 12px rgba(36,55,105,.22)); }

/* Bölümün ALT payı yarıya iner: kartlar tek panelden hafif olduğu için altta
   kalan 104px "bölüm bitti" değil "sayfa durdu" okunuyordu; kategoriler daha
   erken başlasın. Seçici (0,2,0) olmak ZORUNDA — 24'teki mobil
   `.section { padding: 44px 0 }` dosyada SONRA geliyor ve aynı özgüllükte
   yazılsaydı payı geri verirdi (`.section.cta-sec`teki aynı gerekçe). */
.section.has-steps { padding-bottom: calc(var(--sec-pad) * .55); }

/* ----------------------------------------------------------------------------
   10) UYGULAMA PANELİ (.fs) — ürün ekranının saf-CSS replikası

   Bu bölüm 2026-08-31'e kadar ana sayfanın "Özellik turu"nun eviydi (dört
   fayda satırı + dört panel). Tur konsey kararı 1 ile kaldırıldı; gerekçe
   `Pages/Site/Index.html`deki nottadır. Geriye kalan `.fs` ailesi bir bölüme
   değil bir YÜZEYE ait ve ÜÇ SAYFA onu paylaşıyor:
     - `/ozellikler` — beş sahnenin replika panelleri
     - `/gelisim`    — hero'daki `.gx-screen`
     - `/fiyatlandirma` — deneme paneli `.px-panel`

   O yüzden buradaki hiçbir kural "ana sayfa" varsayamaz. Yükü taşıyan üç
   karar korunuyor:
   - Telefon gövdesi yok, GÖKYÜZÜ var. Uygulamanın değişmez imzası
     KidlioBackground (açık `#1A6FF5` güneş+bulut, koyu `#191970` ay+yıldız) ve
     "gerçek uygulama" hissini tek başına en çok o veriyor. Bulut ve yıldızlar
     CSS ŞEKLİ, glyph değil: FA'nın bulutu düz siluet, sticker gibi duruyor.
   - Kartların içi LİSTE, kutu yığını değil: satırları kılcal çizgi ayırır,
     kategori rengi yalnız küçük resmin halkasında, noktasında ve süre
     rozetinde görünür.
   - Zemin düz mavi değil ince bir geçiş: düz dolguyla kartın altında kalan
     boşluk "boyanmış dikdörtgen" okunuyordu.

   ÖLÜ KALINTI (bilerek bırakıldı, ayrı temizlik işi): `.fs-plan-*`,
   `.fs-strategy`, `.fs--fill` ve `.fs-badge` yalnız silinen turda geçiyordu,
   ama paylaşılan kuralların ARASINA serpiştirilmiş durumdalar — tek tek
   sökmek `/ozellikler`de sessiz bir görsel gerileme riski taşıyor.
---------------------------------------------------------------------------- */
/* SOL KOLON (`.ftour*`) SİLİNDİ — 2026-08-31, konsey kararı 1.
   Ana sayfanın "Uygulamada seni neler bekliyor?" bölümü kaldırıldı;
   gerekçe Index.html'deki nottadır. Aşağıdaki `.fs` ailesi KALIR —
   /ozellikler, /gelisim ve /fiyatlandirma onu paylaşıyor. */

/* ======================== UYGULAMA PANELİ (.fs) =========================== */
.fs {
  position: relative;
  flex: 1;
  overflow: hidden;
  padding: 20px 18px;
  border-radius: 24px;
  /* KidlioBackground tabanı (#1A6FF5), ama DÜZ DEĞİL: aşağı doğru açılan ince
     bir geçiş. Düz dolgu, kartın altında kalan boşluğu "boyanmış dikdörtgen"
     yapıyordu; gökyüzünün derinliği bu geçişten geliyor. */
  background: linear-gradient(180deg, #1560DE 0%, #1A6FF5 42%, #3D8CFF 100%);
  color: #fff;
  font-size: .88rem; line-height: 1.4;
  box-shadow: var(--shadow);
}
[data-theme="dark"] .fs { background: linear-gradient(180deg, #12124F 0%, #191970 46%, #262699 100%); }

/* Gökyüzü süsü. Bulutlar ve yıldızlar CSS ŞEKLİ, glyph değil: FA'nın bulutu
   düz siluet, ekranda sticker gibi duruyor; 2px'lik bir yıldız ikonu ise
   okunmuyor (emoji zaten yasak). */
.fs-sky { position: absolute; inset: 0 0 auto; height: 170px; pointer-events: none; }
.fs-sky::before {
  content: ""; position: absolute; top: 14px; right: 18px;
  width: 32px; height: 32px; border-radius: 50%;
  background: radial-gradient(circle, #FFF6C4, #FFD84D 58%, rgba(255,216,77,0) 72%);
  box-shadow: 0 0 26px 10px rgba(255,216,77,.30);
}
.fs-sky::after {
  content: ""; position: absolute; top: 44px; left: -10%; width: 120%; height: 54px;
  background:
    radial-gradient(24px 12px at 16% 62%, rgba(255,255,255,.46), transparent 72%),
    radial-gradient(32px 15px at 25% 56%, rgba(255,255,255,.38), transparent 72%),
    radial-gradient(20px 10px at 66% 72%, rgba(255,255,255,.32), transparent 72%),
    radial-gradient(28px 13px at 77% 64%, rgba(255,255,255,.24), transparent 72%);
}
/* Gece: ay + yıldız tozu (bulut yok — gece göğünde bulut aydınlık leke okunur) */
[data-theme="dark"] .fs .fs-sky::before {
  background: radial-gradient(circle at 36% 36%, #F2F6FF, #C9D8FF 60%, rgba(201,216,255,0) 74%);
  box-shadow: 0 0 20px 6px rgba(201,216,255,.26);
}
[data-theme="dark"] .fs .fs-sky::after {
  top: 0; left: 0; width: 100%; height: 160px;
  background:
    radial-gradient(1.6px 1.6px at 11% 24%, rgba(255,255,255,.92), transparent 60%),
    radial-gradient(1.2px 1.2px at 29% 11%, rgba(255,255,255,.72), transparent 60%),
    radial-gradient(1.7px 1.7px at 44% 30%, rgba(255,255,255,.85), transparent 60%),
    radial-gradient(1.1px 1.1px at 58% 16%, rgba(255,255,255,.60), transparent 60%),
    radial-gradient(1.5px 1.5px at 72% 34%, rgba(255,255,255,.80), transparent 60%),
    radial-gradient(1.2px 1.2px at 88% 20%, rgba(255,255,255,.66), transparent 60%),
    radial-gradient(1.3px 1.3px at 19% 46%, rgba(255,255,255,.50), transparent 60%),
    radial-gradient(1.4px 1.4px at 63% 52%, rgba(255,255,255,.45), transparent 60%);
}

/* Plan panelinde kart paneli neredeyse tamamen doldurur, gökyüzüne yalnız
   ~20px'lik bir şerit kalır. Güneş orada eski yerinde (top: 14px) dururken
   kartın yuvarlak köşesi onu ısırıyor ve sarı bir leke gibi okunuyordu; yukarı
   çekilince kartın ARDINDAN doğan bir güneş oluyor — kasıtlı görünen tek hâli
   bu. Koyu temada aynı öğe ay olduğu için kural ikisini birden taşır.

   BUGÜN ETKİSİZ ve BİLEREK DURUYOR: tek çağıranı özellik turunun plan paneli
   ve o panel 2026-08-31'de `fs--bare`e geçti — gök gizli olduğu için bu kural
   hiçbir şey boyamıyor. Silinmedi, çünkü `fs--bare` tek satırla geri
   alınabilir ve o gün güneş yeniden kartın köşesini ısırır; ayrıca
   /gelisim ile /fiyatlandirma'nın kendi güneş düzeltmeleri bu kuralı
   gerekçe olarak gösteriyor. */
.fs--fill .fs-sky::before { top: 4px; right: 76px; width: 22px; height: 22px; }

/* Panel içeriği DİKEYDE ORTALANIR: tek kart bir cihaz ekranının tepesine
   yapışınca altında bir ekran boyu boş gök kalıyordu. */
.fs-body {
  position: relative; z-index: 1;
  display: grid; align-content: center; gap: 10px;
  height: 100%;
}

/* Gökyüzünün üstünde duran tek satırlık etiket */
.fs-label { font-size: .86em; font-weight: 800; color: var(--tx2); display: flex; align-items: center; gap: 6px; }
.fs-label--sky { color: rgba(255,255,255,.94); text-shadow: 0 1px 6px rgba(10,24,55,.35); }

/* Cam kart — uygulamadaki panel.
   Modern kart = az çizgi, çok boşluk: geniş yarıçap (20px), kılcal ışık
   kenarlığı ve YAYVAN-YUMUŞAK gölge (0 18px 40px -22px). Eski hâli 16px köşe +
   kısa gölgeyle gökyüzünün üstüne "yapıştırılmış" bir kutu gibi duruyordu. */
.fs-card {
  display: grid; gap: 12px;
  padding: 14px 15px;
  border-radius: 20px;
  background: rgba(255,255,255,.96);
  border: 1px solid rgba(255,255,255,.72);
  color: var(--tx1);
  box-shadow: 0 18px 40px -22px rgba(10,24,55,.85);
}
[data-theme="dark"] .fs .fs-card {
  background: rgba(10,24,55,.86);
  border-color: rgba(255,255,255,.10);
  color: #EAF1FF;
  box-shadow: 0 18px 40px -24px rgba(0,0,0,.85);
}

/* ---- ÇIPLAK PANEL (`fs--bare`) — MAVİ GÖKYÜZÜ YOK ------------------------
   Ana sayfanın özellik turu 2026-08-31'de bu varyanta geçti (kullanıcı kararı:
   *"Elif için bugünün planı alanının arkasındaki mavi bg'yi kaldır,
   özellikler sayfasındaki kartlar gibi görünsün"*). Gök süsü, panel zemini ve
   panel gölgesi kalkar; geriye krem sayfanın üstünde duran BEYAZ KARTIN
   KENDİSİ kalır — /ozellikler'in `.f2-fs--bare` varyantının birebir aynı
   dili (o sayfanın ölçüleri ve gerekçesi `Features.css`te).

   AYNI GÜN /gelisim'in hero ekranı ve /fiyatlandirma'nın deneme paneli de
   varyanta geçti (aynı kullanıcı kararı), yani BUGÜN SİTEDE MAVİ GÖKLÜ TEK
   BİR `.fs` PANELİ KALMADI. Kural yine de MODİFİER, taban DEĞİL: gök zemini
   uygulamanın kendi imzası (KidlioBackground) ve varyant şablondan tek
   sınıfla geri alınabiliyor — tabana yazılırsa o dönüş yolu kapanır ve gök
   süsünün bütün konum düzeltmeleri (`.fs--fill`, `.gx-screen`, `.px-panel`)
   sahipsiz kalır. Aynı sebeple `fs-sky` düğümü üç şablonda da DOM'da duruyor.
   Panele özgü mürekkep düzeltmeleri sayfanın kendi dosyasında: göğün üstünde
   duran her şey (Gelişim'in `.gx-who`su, Fiyatlandırma'nın `.px-state` ve
   `.px-pnote`u) beyaz üstüne kurulmuştu ve krem zeminde görünmez olurdu.

   DÖRT ŞEY YÜK TAŞIYOR:
   • Koyu tema için AYRI, `[data-theme="dark"]` ön ekli satır ŞART: temel gece
     kuralı (`[data-theme="dark"] .fs`) (0,2,0) ile daha güçlü ve dosyada ÖNCE
     geliyor — öneksiz satır yalnız açık temayı karşılar, gece panelin zemini
     lacivert kalırdı.
   • KART ZEMİNDEN AYRIŞMAK ZORUNDA: gök gidince `.fs-card`ın .96 alfalı
     beyazı krem sayfayla neredeyse eş parlaklıkta kalıyor. Üç meşru kaldıraç
     — saf beyaz zemin, `--border-strong` kılcal kenar ve ÜÇ KATMANLI NÖTR
     gölge (temas + orta + ortam). Renkli hale/aksan gölgesi yasak: ürün
     ekranlarının arkası boş durur (aynı kural /ozellikler'de testle bağlı).
   • `.fs-body` GRID'den FLEX sütuna geçer: kart kalan boyu güvenilir doldurur
     (grid'te `auto` satır yüzdeyle büyümüyor — /ozellikler'de ölçüldü) ve
     içerik `justify-content` ile dikeyde ortada kalır. Sağ kolon `align-self: stretch` olduğu için panel kutusu
     sekme değişince boy değiştirmez; değişen yalnız içi. */
.fs--bare,
[data-theme="dark"] .fs--bare {
  background: none;
  box-shadow: none;
  color: var(--tx2);
}
.fs--bare .fs-sky { display: none; }
.fs--bare .fs-label--sky { color: var(--tx2); text-shadow: none; }
[data-theme="dark"] .fs--bare .fs-label--sky { color: var(--night-tx2, #AFC0E4); }
.fs--bare .fs-body {
  display: flex; flex-direction: column; justify-content: center;
}
.fs--bare .fs-card {
  flex: 1; align-content: center;
  background: #fff;
  border-color: var(--border-strong);
  box-shadow:
    0 2px 6px rgba(10,24,55,.10),
    0 10px 24px -12px rgba(10,24,55,.22),
    0 30px 60px -28px rgba(10,24,55,.45);
}
[data-theme="dark"] .fs--bare .fs-card {
  background: rgba(10,24,55,.95);
  border-color: rgba(140,145,255,.28);
  box-shadow:
    0 2px 6px rgba(0,0,0,.45),
    0 26px 52px -26px rgba(0,0,0,.85);
}
.fs-sec {
  display: flex; align-items: center; gap: 7px;
  font-family: var(--font-head); font-size: 1em; font-weight: 700; color: var(--tx1);
}
[data-theme="dark"] .fs .fs-sec { color: #EAF1FF; }
.fs-sec > i { color: var(--blue); }
/* Tek rozet biçimi, iki kullanım: kart başlığının sağındaki `em` (gelişim/aile)
   ve plan kartının "Bugün" rozeti. Ayrı yazılsalardı biri değişince ötekiler
   sessizce ayrışırdı. */
.fs-sec em, .fs-badge {
  font-style: normal; font-size: .76em; font-weight: 800;
  padding: 4px 10px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--blue) 13%, transparent);
  color: color-mix(in srgb, var(--blue) 78%, var(--ink));
  white-space: nowrap;
}
.fs-sec em { margin-left: auto; }
[data-theme="dark"] .fs .fs-sec em,
[data-theme="dark"] .fs .fs-badge { color: color-mix(in srgb, var(--blue) 45%, #fff); }

/* ---- 1) Günlük plan kartı — dört kategori, dört satır ----
   Kart bir uygulama listesi gibi okunmalı: kutu içinde kutu yok, satırları
   KILCAL ÇİZGİ ayırır ve kategori rengi yalnız üç küçük yerde görünür (küçük
   resim halkası, nokta, süre rozeti). Eski hâlde tek etkinlik tonlu-kenarlıklı
   bir kutunun içindeydi; dört tanesi yan yana konunca kart kutu yığınına
   dönüyordu — "kalabalık" hissinin kaynağı da oydu. */
.fs-plan-head {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  align-items: center; gap: 6px 10px;
}
.fs-plan-title {
  font-family: var(--font-head); font-size: 1.06em; font-weight: 700;
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fs-plan-line { grid-column: 1 / -1; display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.fs-plan-line small { font-size: .8em; font-weight: 700; color: var(--tx3); }
[data-theme="dark"] .fs .fs-plan-line small { color: #A9BCE4; }
.fs-strategy {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 11px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--blue) 12%, transparent);
  font-size: .8em; font-weight: 800; color: color-mix(in srgb, var(--blue) 78%, var(--ink));
}
[data-theme="dark"] .fs .fs-strategy { color: color-mix(in srgb, var(--blue) 45%, #fff); }

.fs-plan-list { list-style: none; margin: 0; padding: 0; display: grid; }
.fs-plan-list li {
  --pc: var(--blue);
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; gap: 11px;
  padding: 9px 0;
}
.fs-plan-list li + li { border-top: 1px solid color-mix(in srgb, var(--tx3) 20%, transparent); }
.fs-plan-list li:first-child { padding-top: 1px; }
.fs-plan-list li:last-child { padding-bottom: 1px; }
.fs-thumb {
  width: 42px; height: 42px; flex: none;
  border-radius: 13px; overflow: hidden; display: grid; place-items: center;
  background: color-mix(in srgb, var(--pc, var(--blue)) 16%, transparent);
  box-shadow: 0 0 0 1px color-mix(in srgb, var(--pc, var(--blue)) 24%, transparent);
}
.fs-thumb img { width: 100%; height: 100%; object-fit: cover; }
.fs-plan-copy { display: grid; gap: 2px; min-width: 0; }
.fs-plan-copy > b { font-size: .98em; font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* Alt satır tek satır kalmalı: taşarsa dört satırın boyu farklılaşır ve liste
   ritmini kaybeder — malzeme metni uzun olabilir, o yüzden "…" ile kırpılır.
   Bu yüzden BLOK, flex değil: `text-overflow` blok kutuya uygulanır; flex'te
   metin isimsiz bir öğe olur ve kırpma sessizce üç noktasız yapılır. Kategori
   noktası da o yüzden ::before. */
.fs-plan-sub {
  display: block; font-size: .82em; color: var(--tx3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.fs-plan-sub::before {
  content: ""; display: inline-block; vertical-align: middle;
  width: 7px; height: 7px; border-radius: 50%;
  margin: -2px 9px 0 3px;
  background: var(--pc);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--pc) 20%, transparent);
}
[data-theme="dark"] .fs .fs-plan-sub { color: #A9BCE4; }
.fs-dur {
  flex: none; font-size: .78em; font-weight: 800; white-space: nowrap;
  padding: 4px 10px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--pc) 12%, transparent);
  color: color-mix(in srgb, var(--pc) 72%, var(--ink));
}
[data-theme="dark"] .fs .fs-dur { color: color-mix(in srgb, var(--pc) 40%, #fff); }
/* Aile paneli — satır kopyası (plan kartı kendi `.fs-plan-copy`sini kullanır) */
.fs-feat-copy { display: grid; gap: 1px; min-width: 0; }
.fs-feat-copy > b { font-size: 1.02em; font-weight: 700; }
.fs-feat-copy > small { font-size: .84em; color: var(--tx3); }

/* ---- 2) Hızlı çözüm — uygulamadaki 2x3 ızgara, gökyüzü üstünde cam çipler ----
   TEK OKUYANI /ozellikler'in yorgun panelidir (`fs-tired` dalı), yani bu blok
   HER SAYFAYA inip tek sayfada iş görüyor. 2026-08-31'de sahnesiyle birlikte
   silinmişti; aynı gün GERİ ALINDI (kullanıcı kararı) — gerekçe SiteContent'in
   FEATURE_SCENES notunda. Silinecekse önce SAHNE silinir, tersi değil. */
.fs-quick { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }
.fs-quick > span {
  display: flex; align-items: center; gap: 8px;
  padding: 12px 13px; border-radius: 16px;
  background: rgba(255,255,255,.16); border: 1px solid rgba(255,255,255,.26);
  /* Gerçek cam: çipin ardındaki gökyüzü bulanıklaşır, düz beyaz katman değil */
  backdrop-filter: blur(8px); -webkit-backdrop-filter: blur(8px);
  font-size: .9em; font-weight: 800; color: #fff;
}
.fs-quick i { font-size: 1em; opacity: .92; }

/* ---- 4) Aile üyeleri ---- */
/* Plan listesiyle aynı dil: kutu yok, satırları kılcal çizgi ayırır. */
.fs-members { list-style: none; margin: 0; padding: 0; display: grid; }
.fs-members li + li { border-top: 1px solid color-mix(in srgb, var(--tx3) 20%, transparent); }
.fs-members li {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto;
  align-items: center; gap: 11px;
  padding: 9px 0;
}
.fs-members li:first-child { padding-top: 1px; }
.fs-members li:last-child { padding-bottom: 1px; }
.fs-av {
  display: grid; place-items: center; width: 34px; height: 34px; border-radius: 50%;
  background: linear-gradient(135deg, #7FB6FF, #2E8BF7);
  font-size: .95em; font-weight: 800; color: #fff;
}
.fs-av.is-owner { background: linear-gradient(135deg, #B79BFF, #7C5CE0); }
.fs-members b { font-size: .98em; font-weight: 700; display: flex; align-items: center; gap: 6px; }
.fs-members b em {
  font-style: normal; padding: 1px 8px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--blue) 14%, transparent);
  font-size: .8em; color: color-mix(in srgb, var(--blue) 78%, var(--ink));
}
[data-theme="dark"] .fs .fs-members b em { color: color-mix(in srgb, var(--blue) 45%, #fff); }
.fs-role {
  padding: 3px 10px; border-radius: var(--r-full);
  background: color-mix(in srgb, var(--tx3) 15%, transparent);
  font-size: .74em; font-weight: 800; letter-spacing: .03em;
  text-transform: uppercase; color: var(--tx2); white-space: nowrap;
}
.fs-role.is-owner {
  background: color-mix(in srgb, #7C5CE0 16%, transparent); color: #7C5CE0;
  display: inline-flex; align-items: center; gap: 5px;
}
[data-theme="dark"] .fs .fs-role.is-owner { color: #C4B0FF; }

/* ---- 5) Özellikler sayfasının üç replikası ----------------------------------
   Aynı `.fs` derisi (gökyüzü + cam kart), üç yeni iç parça. Ana sayfadaki dört
   panelde KULLANILMAZ, bilerek: bu üç ekran orada yok, olsaydı Özellikler
   sayfası yine ana sayfanın kesiti olurdu. Parçalar `.fs` altında duruyor
   çünkü deri tek yerde kalmalı — kopyalanan bir gökyüzü ilk token
   değişiminde ikiye ayrılır. */

/* Etiketli alan: "Kaç yaşında?" + yaş çipleri (onboarding kesiti) */
.fs-field { display: grid; gap: 8px; }
.fs-field > b { font-size: .86em; font-weight: 800; color: var(--tx2); }

/* Onbir çip (0–10) SARMALANIR. Uygulamada şerit yatay kaydırılıyor; kaydırma
   çubuğu olmayan durağan bir kesitte kaydırma görünmez, yani "1'den 5'e kadar"
   diye okunurdu. Sarmalamak kırpmaktan dürüst. */
.fs-ages { display: flex; flex-wrap: wrap; gap: 6px; }
.fs-ages i {
  min-width: 26px; padding: 4px 0; border-radius: 9px;
  background: color-mix(in srgb, var(--tx3) 12%, transparent);
  font-style: normal; font-size: .8em; font-weight: 800; text-align: center;
  color: var(--tx2);
}
.fs-ages i.is-on { background: var(--blue); color: #fff; }

/* İsim alanı KESİKLİ kenarlı: gerçek bir input değil, ve ekranda da opsiyonel
   ("Adı (istersen)"). Dolu bir kutu olsaydı doldurulması gereken bir alan gibi
   okunur, kurulumun kısalığı iddiası da onunla birlikte zayıflardı. */
.fs-input {
  padding: 9px 12px; border-radius: 12px;
  border: 1px dashed color-mix(in srgb, var(--tx3) 42%, transparent);
  font-size: .86em; color: var(--tx3);
}
.fs-cta {
  padding: 10px 12px; border-radius: 14px;
  background: var(--blue); color: #fff;
  font-family: var(--font-head); font-weight: 800; font-size: .9em; text-align: center;
}

/* "Bu Yaşta": panelin taşıdığı tek şey cümlenin KENDİSİ, o yüzden kartın en
   büyük parçası o. Alttaki not kılcal çizgiyle ayrılır — aynı kartta hem iddia
   hem sınırı duruyor. */
.fs-tip { margin: 0; font-size: .95em; line-height: 1.5; }
.fs-note {
  font-size: .78em; color: var(--tx3);
  padding-top: 9px;
  border-top: 1px solid color-mix(in srgb, var(--tx3) 20%, transparent);
}

/* Yorgun modu: önce SÜZGEÇ, sonra sonucu. Süzgeç satırı olmadan liste sıradan
   bir öneri listesi olurdu; modun vaadi ("sıfır hazırlık, kısa") tam olarak o
   satırda ve uygulamanın kendi kuralıyla birebir. */
.fs-rule {
  display: flex; align-items: center; gap: 7px;
  margin-top: -3px;
  font-size: .8em; font-weight: 700; color: var(--tx2);
}
.fs-rule i { color: var(--blue); }
.fs-tired { list-style: none; margin: 0; padding: 0; display: grid; }
.fs-tired li { display: flex; align-items: center; gap: 10px; padding: 9px 0; font-size: .92em; }
.fs-tired li + li { border-top: 1px solid color-mix(in srgb, var(--tx3) 20%, transparent); }
.fs-tired li:first-child { padding-top: 1px; }
.fs-tired li:last-child { padding-bottom: 1px; }
.fs-tired b { font-weight: 700; }
.fs-tag {
  margin-left: auto; white-space: nowrap;
  padding: 3px 9px; border-radius: var(--r-full);
  background: color-mix(in srgb, #16A34A 14%, transparent);
  color: #15803D; font-size: .74em; font-weight: 800;
}

/* Karanlık temada kartın zemini lacivert; açık tema metin token'ları orada
   okunmaz. Aynı düzeltme kartın diğer parçalarında da var (fs-sec, fs-members). */
[data-theme="dark"] .fs .fs-field > b,
[data-theme="dark"] .fs .fs-rule { color: #A9BEE4; }
[data-theme="dark"] .fs .fs-note,
[data-theme="dark"] .fs .fs-input { color: #93A9CE; }
[data-theme="dark"] .fs .fs-ages i { background: rgba(255,255,255,.10); color: #C6D6F2; }
[data-theme="dark"] .fs .fs-ages i.is-on { background: var(--blue); color: #fff; }
[data-theme="dark"] .fs .fs-tag { color: #6EE7A0; }

/* ----------------------------------------------------------------------------
   11) Hızlı çözüm — ORTADA ÜRÜN, ÇEVRESİNDE DURUMLAR (2026-08-27)

   Bölüm 3x2'lik bir kart ızgarasıydı ve her kart kendi içinde açılan bir
   akordeondu: fikirler kartın ALTINDA beliriyordu, ürün ekranı bölümde hiç
   görünmüyordu. Bugün fikirler ortadaki telefonun PLANINA yazılıyor — bölüm
   "şu durumda şunları öneririm" demek yerine ürünün o durumda ne gösterdiğini
   GÖSTERİYOR. Düzenin sunum mantığı MetaMask'ın "merkezde sabit ürün +
   çevresinde fayda kartları" sahnesinden, kartların yerine akıcı yerleşmesi
   Mojo'dan; ikisinden de alınan yalnız DÜZEN ve HAREKET MODELİ — renkler,
   yuvarlaklık ve renkli başlık Kidlio'nun kendi sistemi olarak kaldı.

   YÜKÜ TAŞIYAN KARARLAR:
   - KART SAYISI YİNE ALTI. Referansta dört kart var ama altı durumun altısı da
     ebeveynin kendini tanıdığı bir cümle; biri silinince bölüm "benim durumum
     yok" riskine giriyor (panel kararı, UserPanel.md 2026-08-24). Altısı
     3 + 3 olarak telefonun iki yanına dağılır.
   - MERKEZ SABİT: `.qs-device` `phoneFloat`ı kapatır. Süzülen bir merkez,
     tıklamayla değişen ekranın üstüne İKİNCİ bir hareket koyardı.
   - GERİ ÇEKİLME OPAKLIKLA DEĞİL. Seçilmeyen kartların metni soluklaştırılmaz
     (sitenin "hiyerarşi opaklık kısarak verilmez" kuralı — `.hero-soon` ve
     hero güven satırındaki aynı teşhis); fark ÖLÇÜDE, yüzeyde ve gölgede.
   - AĞIR 3B YOK. Ne kartlarda ne telefonda `rotate3d`/`perspective` var;
     seçim jesti `scale`, plan geçişi çapraz solma + 10px kayma.
---------------------------------------------------------------------------- */
.qs {
  --qs-gap: clamp(14px, 1.9vw, 28px);
  max-width: 1080px; margin-inline: auto;
  display: grid; gap: 24px;
}
/* SAHNE KENDİ MENTEŞESİNİ KULLANMAZ. `.qs` bir `.reveal` — tetiği (is-visible)
   ondan alıyor — ama sayfa çevirme hareketi kutunun KENDİSİNE uygulansaydı
   çocukların yerleşme hareketiyle üst üste binerdi. (0,3,0) özgüllük §3'teki
   `.js .reveal.is-visible` ile eşit; dosyada sonra geldiği için kazanır. */
.js .qs.reveal { opacity: 1; transform: none; }

/* ---- Merkezdeki ürün --------------------------------------------------- */
.qs-phone { display: flex; justify-content: center; }
.qs-device { animation: none; transform: none; }

/* EKRAN İÇERİKTEN BÜYÜR, ORANDAN DEĞİL. Taban `.phone-screen` kuralı
   `aspect-ratio: 1 / 2.17` taşıyor; JS yokken altı plan alt alta durduğu için
   sabit oranlı bir kutu onları `overflow: hidden` ile SESSİZCE KIRPARDI — yani
   bölümün içeriğinin beşte dördü JS'e bağlanmış olurdu. `auto` ile ekran
   içerikten büyür ve HİÇBİR DURUMDA kırpmaz; `min-height` yalnızca alt sınır.
   SEÇİM DEĞİŞİNCE TELEFON BOY DEĞİŞTİRMEZ: JS varken altı panel de tek ızgara
   hücresinde duruyor (yalnız görünürlükleri değişiyor), yani hücrenin boyu her
   zaman EN UZUN planın boyu.

   EKRAN TABAN BOYUNA (588px) GERİ DÖNDÜ (2026-08-31, kullanıcı kararı:
   *"hızlı çözüm alanındaki telefon ekranını büyüt, diğerleri gibi olsun"*).
   Bir dönem 480px'e indirilmişti ve gerekçesi ölçülmüştü: plan 293px tutuyor,
   588'de pill ile tab bar arasında 160px'lik boş uygulama zemini kalıyor ve
   telefon "yarısı boş" okunuyordu. O gerekçeyi ORTADAN KALDIRAN ŞEY aynı gün
   eklenen tam boy görsel bandı (`.qs-shot`, aşağıda): plan ~537px'e çıktı,
   yani 588'de kalan pay yeniden ~50px — 480'in hedeflediği payın ta kendisi.
   Bandı geri alan biri bu satırı da geri almak zorunda, yoksa boşluk döner.
   Boy TABANDAN gelir (`.phone-screen { min-height: 588px }`), burada yeniden
   yazılmaz: iki yerde duran bir ölçü sessizce ayrışır. */
.qs-device .phone-screen { aspect-ratio: auto; }

/* Alt boşluk tab bar'ın payı (`.ps-screen--plan`taki 52px ile aynı ölçü). */
.qs-screens { display: grid; gap: 14px; padding-bottom: 52px; }

/* ---- Plan panelleri (eski kart akordeonunun paneli, artık ekranın içinde) -- */
.qc-panel { min-width: 0; }

/* Gizleme ".js" ön ekli: JS yoksa altı plan da okunur (yukarıdaki
   `aspect-ratio: auto` tam bunun için). `visibility` GECİKMELİ kapanır
   (0s linear <süre>), yoksa sönen panel kapanış boyunca tıklamayı yer. */
.js .qc-panel {
  grid-area: 1 / 1;
  opacity: 0; visibility: hidden;
  transform: translateY(10px) scale(.985);
  transition: opacity 260ms ease, transform 420ms var(--ease-out),
              visibility 0s linear 420ms;
}
.js .qc-panel.is-open {
  opacity: 1; visibility: visible; transform: none;
  transition: opacity 320ms ease 80ms, transform 460ms var(--ease-out) 80ms,
              visibility 0s;
}

.qs-ideas { list-style: none; margin: 0; padding: 0; }
.qs-ideas .ps-item { gap: 12px; }
/* Planın İLK satırı gerçek bir katalog etkinliği: görselli, kategori çipli ve
   yüzeyi bir kademe belirgin. Ayrım BİÇİMDEN okunur — "gerçek etkinlik" diye
   bir etiket yazılmaz (Gelişim kartlarındaki "tekrarlanan etiket başlıkları"
   kararının aynısı). */
.qs-pick { background: rgba(26,111,245,.09); border-color: rgba(26,111,245,.18); }
[data-theme="dark"] .qs-pick { background: rgba(255,255,255,.10); border-color: rgba(255,255,255,.16); }

/* GÖRSEL TAM BOY, KIRPMASIZ (2026-08-31, kullanıcı kararı: *"bir tane görseli
   tam göster ekranda"*). Satır artık yatay değil DİKEY bir kart: üstte
   etkinliğin kendi illüstrasyonu, altında kategori/süre çipi ve adı.

   ÜÇ ŞEY YÜK TAŞIYOR:
   • `aspect-ratio` KAYNAĞIN ORANIDIR (720/338, klasördeki 17 görselin 17'si de
     bu ölçüde). `.ps-thumb img`in `object-fit: cover`ı bu oranda hiçbir şeyi
     kırpmaz — "tam göster" tam olarak bu. Sabit bir yükseklik yazılırsa oran
     kayar ve görsel yeniden kırpılmaya başlar, hiçbir şey hata vermez.
   • ÖLÇÜ 46px'lik KARE THUMB'DAN GELİYORDU ve o kare yatay bir illüstrasyonun
     ortasından bir parça alıyordu: ekranda etkinliğin ne olduğu okunmuyordu.
     `flex: none` şart — taban `.ps-thumb` `flex: 0 0 46px` taşıyor ve yalnız
     `width` yazmak onu 46px'te bırakır.
   • Satırın kendi dolgusu (12px) KALIR: görsel satırın içinde durur, satırı
     uçtan uca kaplamaz — plan satırı bir kart değil, kartın İÇİNDEKİ satır.
   Kural yalnız `.qs-pick` kapsamında: aynı `.ps-thumb` hero telefonunun plan
   ekranında da geçiyor ve orada kare thumb doğru ölçü. */
/* `gap` YAZILMAZ: bir üstteki `.qs-ideas .ps-item` (0,2,0) ile daha güçlü ve
   12px'i o veriyor — burada tekrarlanan bir değer sessizce ölü kalırdı. */
.qs-pick { flex-direction: column; align-items: stretch; }
.qs-shot {
  flex: none; width: 100%; height: auto;
  aspect-ratio: 720 / 338;
  border-radius: 12px;
}
/* FİKİR SATIRLARINDA NUMARA YOK (kullanıcı kararı, 2026-08-27). 1·2·3 bir
   SIRA/ÖNCELİK anlatıyordu — üç fikir sıralı değil, hangisinden başlanacağını
   ebeveyn seçiyor (dört dünya kartından ve Özellikler'in sol kolonundan
   numaraların kaldırılma gerekçesinin aynısı). Satırı ayıran şey kendi
   yüzeyi; ayrıca bir madde işareti de EKLENMEZ, yoksa numaranın yerine geçen
   ikinci bir süs olur. Metnin dolgusu numaranın payını geri alır. */
.qs-idea { padding-inline: 14px; }
/* Fikirler sırayla belirir — planın "yazılıyor" hissi bu gecikmeden geliyor.
   Gecikme yalnız AÇILIŞTA: kapanışta 0, yoksa panel satırlardan önce söner. */
.js .qc-panel .ps-item {
  opacity: 0; transform: translateY(8px);
  transition: opacity var(--t) ease, transform var(--t) var(--ease-out);
}
.js .qc-panel.is-open .ps-item {
  opacity: 1; transform: none;
  transition-delay: calc(140ms + var(--i, 0) * 80ms);
}

/* ---- Durum kartları ----------------------------------------------------- */
.quick-grid { display: grid; gap: 12px; }

.quick-card {
  position: relative;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r);
  box-shadow: var(--shadow-sm);
  transition: transform 400ms var(--ease-out), box-shadow var(--t) ease,
              border-color var(--t) ease, background var(--t) ease;
}
.quick-card:not(.is-open):hover { transform: translateY(-3px); box-shadow: var(--shadow); }
/* SEÇİLİ YÜZEY BURADA, masaüstü bloğunda DEĞİL — ve özgüllüğü (0,2,0)
   kalmak zorunda: koyu temanın `[data-theme="dark"] .quick-card.is-open`
   kuralı (0,3,0) `--card-active` yazıyor ve sahneye kapsanmış bir
   `.qs .quick-card.is-open` (0,3,0) onunla BERABERE kalıp dosyada sonra
   geldiği için token merdivenini sessizce ezerdi. */
.quick-card.is-open {
  background: var(--card-solid);
  border-color: color-mix(in srgb, var(--blue) 38%, var(--border-strong));
  box-shadow: var(--shadow);
}

/* Kartın TAMAMI buton — "bu alana tıkla" isteği buydu. Başlık bu yüzden <h3>
   değil <span class="qc-title">: h3 (akış içeriği) <button> içinde geçersiz
   HTML. Görsel olarak birebir aynı — h3'ün taban kuralları burada tekrarlanır.
   İkon solda, başlık + cümle sağında, ok köşede: sahnede kartlar dar bir
   kolonda duruyor, ortalanmış istif orada iki kat yer kaplardı. */
.qc-head {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr) auto;
  grid-template-areas: "ico title more" "ico text more";
  align-items: center;
  column-gap: 13px;
  width: 100%; min-height: 44px;   /* WCAG 2.5.8 */
  padding: 14px 15px;
  background: none; border: 0;
  font: inherit; color: inherit; text-align: left;
  cursor: pointer;
  border-radius: var(--r);
}
.qc-title {
  grid-area: title;
  display: block;
  font-family: var(--font-head);
  font-weight: 700; line-height: 1.18; letter-spacing: -.01em;
  color: var(--tx1);
  font-size: var(--fs-lg);
  margin-bottom: 2px;
}
.qc-text { grid-area: text; display: block; font-size: var(--fs-sm); color: var(--tx2); line-height: 1.45; }

/* Yuvarlak "coin" ikon — FA5 mavi. Glyph rengi §26'da (dosyada sonra geliyor);
   seçili kartta da MAVİ kalır, yoksa oradaki kural onu sessizce geri çevirir. */
.quick-card .e {
  grid-area: ico;
  display: inline-grid; place-items: center;
  width: 46px; height: 46px;
  font-size: 1.3rem;
  background: var(--blue-ghost);
  border: 1px solid var(--border-strong);
  border-radius: 50%;
  box-shadow: var(--glow-sm);   /* --glow-c yok: ölçeğin varsayılan marka mavisi */
  transition: transform var(--t-sm) ease, background var(--t) ease,
              border-color var(--t) ease;
}
.quick-card:hover .e { transform: rotate(6deg) scale(1.06); }
/* Seçilince coin bir kez pop yapar ve zemini bir kademe doygunlaşır —
   kartın cevap verdiğini anlatan tek jest. */
.quick-card.is-open .e {
  animation: qcPop var(--t) var(--ease-pop);
  background: color-mix(in oklch, var(--blue) 16%, var(--card-solid));
  border-color: color-mix(in srgb, var(--blue) 45%, transparent);
}
@keyframes qcPop {
  0%   { transform: scale(1); }
  55%  { transform: rotate(-8deg) scale(1.16); }
  100% { transform: scale(1); }
}

/* Ok TELEFONA bakar: masaüstünde sol kolonda sağa, sağ kolonda sola
   (`--qs-turn`), mobilde yukarı — telefon orada kartların ÜSTÜNDE.
   Yön bir sınıftan değil bir değişkenden geliyor ki durum sayısı değişince
   `:nth-child` formülü yeniden sayılmak zorunda kalmasın. */
.qc-more {
  grid-area: more;
  display: block;
  font-size: .78rem;
  color: var(--blue-ink);
  opacity: .45;
  transform: rotate(-90deg);
  transition: transform var(--t) var(--ease-out), opacity var(--t-sm) ease;
}
.quick-card:hover .qc-more { opacity: .8; }
.quick-card.is-open .qc-more { opacity: 1; }

/* ---- Kartların sahneye yerleşmesi (Mojo) -------------------------------- */
/* VARSAYILAN CSS HÂLİ YERLEŞMİŞ HÂLDİR ve gizleme hem `.js` hem
   `:not(.is-visible)` ön ekli (trust-steps'in aynı kararı, tek farkla):
   dolgu `backwards`, `both` DEĞİL. `both` olsaydı animasyonun `to` karesi
   (`transform: none`) bittikten sonra da kalır ve seçili kartın
   `scale(1.045)`ini SESSİZCE ezerdi — "dolu bir CSS animasyonu bildirimi
   yener" tuzağı. `backwards` yalnız gecikme boyunca `from` karesini tutar,
   bitince bildirimler geri gelir. */
.js .qs:not(.is-visible) .qs-phone,
.js .qs:not(.is-visible) .quick-card { opacity: 0; }

.js .qs.is-visible .qs-phone { animation: qsRise 620ms var(--ease-out) backwards; }
.js .qs.is-visible .quick-card {
  animation: qsSettle 620ms var(--ease-out) backwards;
  animation-delay: calc(140ms + var(--i, 0) * 85ms);
}
@keyframes qsRise {
  from { opacity: 0; transform: translateY(18px) scale(.97); }
  to   { opacity: 1; transform: none; }
}
@keyframes qsSettle {
  from { opacity: 0; transform: translate(var(--qs-fx, 0px), 10px) scale(.94); }
  to   { opacity: 1; transform: none; }
}

/* ---- MOBİL: telefon üstte, kartlar YATAY ŞERİT -------------------------- */
/* Eşik 1024: 1023'ün altında üç kolonlu sahne, telefonun iki yanında ~200px'lik
   iki kolon demek ve "Malzemesiz" gibi kısa bir başlık bile iki satıra düşüyor.
   `touch-action: pan-x` ŞART — yazılmazsa tarayıcı ilk hareketin yönünü kendi
   tahmin eder ve şeridin üstünde başlayan dikey kaydırma kutuda takılır
   (Kategoriler şeridi ve /sss'in hızlı geçiş şeridiyle aynı kural).
   ÇUBUK GİZLİ, KAYDIRMA AÇIK: üç bildirim de gerekli (Firefox · eski Edge ·
   WebKit/Blink); `overflow-x: hidden` yapmak çubukla birlikte parmakla
   kaydırmayı da kapatır. Şerit `.container`ın içinde kalır, sayfada yatay
   taşma açılmaz. */
@media (max-width: 1023px) {
  .quick-grid {
    display: flex; gap: 12px;
    overflow-x: auto; overflow-y: hidden;
    touch-action: pan-x;
    scroll-snap-type: x proximity;
    padding: 4px 2px 8px;
    /* Uç kesilmez, solar — token ve gerekçesi :root'taki `--strip-mask`ta. */
    -webkit-mask-image: var(--strip-mask);
            mask-image: var(--strip-mask);
    scrollbar-width: none;
    -ms-overflow-style: none;
  }
  .quick-grid::-webkit-scrollbar { display: none; }
  /* KART %76'DAN %62'YE İNDİ (2026-09-04): `--strip-mask`in ipucu "kesilen
     kartın kendisi", ama %76'lık kartta ikinci karttan görünen yalnız ~53px
     (390px'te) ve 40px'lik solma onun neredeyse tamamını yiyordu — net ~13px,
     yani ziyaretçi TEK kart görüyordu (kullanıcı şikâyeti: "Yorgunum vs.
     butonların hepsi görünmüyor"). %62'de net kesit ~80px'e çıkar, /ozellikler
     rayındaki çiplerin ipucu gücüne yaklaşır. Uç (270px) tablette çoklu kart
     görünür kılmak için duruyor. */
  .quick-card { flex: 0 0 min(62%, 270px); scroll-snap-align: center; }
  .quick-card.is-open { transform: none; }
}

/* ---- MASAÜSTÜ: telefon ortada, kartlar iki yanında ---------------------- */
/* `display: contents` ŞART: kartlar `.qs` ızgarasının doğrudan çocuğu olmadan
   telefonun iki yanına yerleştirilemez, ve İKİ AYRI kolon <div>'i yazılsaydı
   mobilde iki ayrı kaydırma kutusu kalırdı. Satır/kolon indeksleri ŞABLONDA
   hesaplanır (`--qs-r`, `.qs-right`, `--qs-half`), CSS'te `:nth-child` ile
   DEĞİL — durum sayısı değişirse formül onunla gelir (Kategoriler'in
   `--cw-col` deseni). */
@media (min-width: 1024px) {
  .qs {
    grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
    column-gap: var(--qs-gap); row-gap: 0;
    align-items: center;
  }
  .qs-phone { grid-column: 2; grid-row: 1 / span var(--qs-half, 3); }
  .quick-grid { display: contents; }
  .quick-card {
    grid-column: 1; grid-row: var(--qs-r, auto);
    align-self: center;
    --qs-fx: 26px;                     /* sol kolon telefondan DIŞA akar */
  }
  .quick-card.qs-right { grid-column: 3; --qs-fx: -26px; --qs-turn: 180deg; }
  .qc-more { transform: rotate(var(--qs-turn, 0deg)); }
  /* SAĞ KOLONDA OK KARTIN SOL KENARINDA (2026-09-07, kullanıcı kararı).
     Yön zaten telefonu gösteriyordu (`--qs-turn: 180deg`) ama ok kartın SAĞ
     köşesinde, yani işaret ettiği şeyin ters ucunda duruyordu: "«" sağ kenarda
     kartın dışını değil kendi metnini gösteriyor gibi okunuyor. Grid alanları
     yer değiştiriyor, DOM değil — kartın okuma sırası (ikon → başlık → cümle)
     ekran okuyucuda ikisinde de aynı kalsın diye. */
  .qs-right .qc-head {
    grid-template-columns: auto auto minmax(0, 1fr);
    grid-template-areas: "more ico title" "more ico text";
  }

  /* Seçili öne, ötekiler geriye — metin kontrastına dokunmadan. */
  .qs .quick-card.is-open { transform: scale(1.045); background: var(--card-solid); }
  .js .qs .quick-card:not(.is-open) { transform: scale(.965); box-shadow: none; }
  .js .qs .quick-card:not(.is-open):hover { transform: scale(1); box-shadow: var(--shadow); }
}

/* Global (25) bloğu yalnız duration'ı sıfırlıyor; hem yerleşme animasyonunun
   hem sıralı belirişin GECİKMESİ var, o yüzden ikisi de burada kapatılır —
   yoksa hareket yok ama kartlar ~600ms görünmez bekler. Hareket azaltmada
   Site.js `is-visible`ı zaten anında yazıyor. */
@media (prefers-reduced-motion: reduce) {
  .js .qs.is-visible .qs-phone,
  .js .qs.is-visible .quick-card { animation: none !important; }
  .js .qc-panel.is-open .ps-item { transition-delay: 0s !important; }
  .quick-card.is-open .e { animation: none; }
}

/* ----------------------------------------------------------------------------
   12) Gece paneli — uyku
---------------------------------------------------------------------------- */
.night {
  position: relative;
  border-radius: var(--r-xl);
  background: var(--night-bg);
  padding: clamp(34px, 5vw, 60px);
  overflow: hidden;
  color: var(--night-tx);
  box-shadow: var(--shadow-lg);
}
.night h2, .night h3 { color: var(--night-tx); }
.night p { color: var(--night-tx2); }

.night-stars {
  position: absolute; inset: 0; pointer-events: none;
  background-image:
    radial-gradient(1.6px 1.6px at 12% 22%, rgba(255,255,255,.9), transparent 60%),
    radial-gradient(1.2px 1.2px at 32% 68%, rgba(255,255,255,.7), transparent 60%),
    radial-gradient(2px 2px at 56% 14%, rgba(255,255,255,.85), transparent 60%),
    radial-gradient(1.4px 1.4px at 74% 46%, rgba(255,255,255,.75), transparent 60%),
    radial-gradient(1.8px 1.8px at 88% 24%, rgba(255,255,255,.9), transparent 60%),
    radial-gradient(1.2px 1.2px at 44% 84%, rgba(255,255,255,.6), transparent 60%),
    radial-gradient(1.5px 1.5px at 92% 76%, rgba(255,255,255,.7), transparent 60%),
    radial-gradient(1.3px 1.3px at 8% 88%, rgba(255,255,255,.65), transparent 60%);
  animation: twinkle 4s ease-in-out infinite alternate;
}

/* AY SOLGUNDUR, GÜNEŞ DOYGUN (2026-09-01, konsey kararı 7).
   Disk uzun süre `#FFD166`ya kadar doygun bir amber gradyandı ve gece
   panelinin sağ üstünde 74px'lik dolu bir sarı daire olarak — yani GÜNEŞ
   olarak — okunuyordu. `/uyku`nun hero'sunda aynı hata bulunup düzeltilmişti
   (`.sx-moon`, Sleep.css) ama düzeltme buraya taşınmamıştı; üstelik Sleep.css
   o gün "ana sayfada çalışıyor, çünkü orada disk metnin arkasında ve alfası
   düşük" diye kayıt düşmüştü ve İKİSİ DE YANLIŞTI: disk %100 opak ve hiçbir
   metnin arkasında değil — sağ üstte, telefonun üstündeki boş bantta duruyor
   (1440x900'de ölçüldü: .night kutusu 1180x641, ay 74px, top 34 / right 40).

   Çözüm `.sx-moon`un aynısı ve DEĞERLERİ BİREBİR ORADAN GELİR — iki gece
   yüzeyinde iki farklı ay olması, ana sayfadan `/uyku`ya geçen ziyaretçiye
   aynı öğeyi iki kez tanıtır: krem uçlu gradyan (#FFFCF0 → #FFE9BC) + üç
   soluk krater. SICAKLIK HALE'DE KALIR (amber box-shadow): kaldırılırsa
   gece zemininde soğuk beyaz bir pul kalır. Krater konumları YÜZDE olduğu
   için 620px'teki 54px'lik hâlde de aynı yere düşer, ayrı kural gerekmez.
   Boy, konum ve `moonFloat` süzülmesi DEĞİŞMEDİ. */
.night-moon {
  position: absolute; top: 34px; right: 40px;
  width: 74px; height: 74px;
  border-radius: 50%;
  background:
    radial-gradient(circle at 33% 64%, rgba(226,214,186,.34) 0 11%, transparent 12%),
    radial-gradient(circle at 60% 27%, rgba(226,214,186,.24) 0 6%, transparent 7%),
    radial-gradient(circle at 71% 61%, rgba(226,214,186,.20) 0 5%, transparent 6%),
    radial-gradient(circle at 58% 42%, #FFFCF0, #FFE9BC 78%);
  /* Hale 2026-09-01'de daraltıldı (`.sx-moon` ile birlikte, parite kuralı):
     geniş amber yayılım ayı güneş gibi parlatıyordu. */
  box-shadow: 0 0 28px 6px rgba(255, 224, 160, .17);
  animation: moonFloat 8s ease-in-out infinite;
}

.night-grid {
  position: relative; z-index: 1;
  display: grid;
  grid-template-columns: 1.1fr .9fr;
  gap: var(--sp-lg);
  align-items: center;
}

/* Gece yüzeyinde cam pil SÖNER: zemin zaten koyu, aksan halesi orada bir leke
   olarak okunuyor (aynı düzeltme `/uyku` ve `/gelisim`in lacivert bantlarında,
   kendi dosyalarında). */
.night .eyebrow {
  background: rgba(255,255,255,.1);
  border-color: rgba(255,255,255,.2);
  border-width: 1px;
  box-shadow: none;
  color: #BBD4FA;
}

.night-modes { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
/* Uyku sayfasının "neden işe yarar" paneli tek kolon: satırlar cümle, çip
   değil. Bir dönem şablonda inline `style="grid-template-columns: 1fr"` idi —
   inline stil hiçbir medya sorgusuyla ezilemez ve tasarım kararı şablona
   sızmış olur. */
.night-modes--stack { grid-template-columns: 1fr; }
.night-mode {
  display: flex; align-items: center; gap: 10px;
  padding: 13px 16px;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.13);
  border-radius: var(--r);
  backdrop-filter: blur(6px);
  font-weight: 700; font-size: var(--fs);
  color: var(--night-tx);
  transition: background var(--t-sm) ease, transform var(--t-sm) ease;
}
.night-mode:hover { background: rgba(255,255,255,.13); transform: translateY(-3px); }
.night-mode .e { font-size: var(--fs-3xl); }

/* ---- Uyku bölümü mini telefon mockup'ı --------------------------------------
   Gerçek uygulamanın "Uyku Sesleri" ekranını (KidlioApp app/(tabs)/sleep/index.tsx)
   küçültülmüş, saf-CSS bir kopyası. Uygulamanın kendine özgü renkleri, hero
   mockup'ındaki desene uygun şekilde app-brand token'ları olarak burada
   (kaynak: KidlioBackground.tsx taban #191970, sleepSounds.ts, SortBar/PlayerBar
   mavi vurgu #6CB4FF→#2E8BF7). Yalnız ambient CSS animasyonu — JS yok. */
.sps-screen {
  --sleep-bg:      #191970;   /* KidlioBackground dark taban (gece laciverdi) */
  --sleep-bg2:     #0F1147;   /* dip derinliği (BodyDepth koyu duraği) */
  --sleep-accent:  #6CB4FF;   /* SortBar/PlayerBar mavi vurgu — açık durak */
  --sleep-accent2: #2E8BF7;   /* mavi vurgu — koyu durak */
  --sleep-card-tx: rgba(255,255,255,.92);  /* SoundCard adı (dark) */
  --sleep-stop:    #F87171;   /* PlayerBar durdurma (dark) */
  --sleep-safe:    #4ade80;   /* SafetyTip kalkan yeşili (dark) */
}

.night-grid--phone { grid-template-columns: 1.05fr .95fr; }
.night-copy .btn-primary { margin: 4px 0 22px; }
.night-copy .night-modes { margin-top: 4px; }
/* Güvenlik satırı: mod çiplerinin ALTINDA ve onlardan bir kademe sönük —
   bölümün vaadi değil, vaadin çerçevesi. Kutusu YOK (gece panelinin içinde
   ikinci bir yüzey "kutu içinde kutu" olurdu); ikon satırın başında durur ve
   metinle birlikte sarar, o yüzden `flex` değil satır-içi. */
/* MÜREKKEP SARI-YEŞİL (2026-09-07, kullanıcı kararı): satır gece panelinin
   tek UYARI cümlesi ve `--night-tx2` ile panelin öteki yardımcı metinlerinden
   ayrılmıyordu. Renk uydurulmadı, sitenin iki kategori renginin karışımı
   (`--cat-dusun` sarısı + `--cat-kesfet` yeşili) — yani palet dışına
   çıkmıyor. Karışım `oklch`te yapılır: sRGB'de aynı iki renk ortada
   çamurlaşıyor. */
.night-safe {
  margin: 16px 0 0; font-size: var(--fs-sm); line-height: 1.55;
  color: color-mix(in oklch, var(--cat-dusun) 55%, var(--cat-kesfet));
}
.night-safe i { margin-right: 8px; opacity: .85; }
.night-phone-wrap {
  display: flex; justify-content: center; align-items: center;
  min-width: 0;
}

/* Mini telefon — .phone'un kompakt (~%73 ölçek) türevi. Kendi float
   animasyonunu korur; hero'nun .phone kuralları ezilmez (yeni değiştirici).
   Genişlik + içerideki punto/kontrastlar, 1280px masaüstünde zum'suz okunacak
   şekilde ayarlandı (okunabilirlik geri bildirimi, 17.07). */
.phone--mini {
  width: min(244px, 64vw);
  border-radius: 40px;
  padding: 8px;
  animation: phoneFloat 8.5s ease-in-out infinite;
}
.phone--mini .phone-notch {
  top: 13px; width: 66px; height: 17px;
}
.phone--mini.phone-screen, .phone--mini .phone-screen { min-height: 0; }
/* Mini ekranlar içeriğe göre büyür; taban oran iPhone 16 Pro'ya yakın kalsın */
.phone--mini .cps-screen, .phone--mini .sps-screen { min-height: 470px; }

/* Detay sayfası büyütmesi — partial'daki telefon değişmeden, sarmalayıcı
   sınıfıyla ölçek (ana sayfa .phone--mini tabanı piksel piksel aynı kalır).
   Kategoriler + Uyku sayfalarında kullanılır. */
.phone-wrap--lg .phone--mini {
  width: min(306px, 76vw);
  border-radius: 50px;
  padding: 10px;
}
.phone-wrap--lg .phone--mini .phone-notch { top: 16px; width: 82px; height: 20px; }
.phone-wrap--lg .cps-screen,
.phone-wrap--lg .sps-screen { border-radius: 40px; padding-top: 50px; }
.phone-wrap--lg .cps-screen, .phone-wrap--lg .sps-screen { min-height: 590px; }
.phone-wrap--lg .cps-screen .ps-status,
.phone-wrap--lg .sps-screen .ps-status { top: 19px; font-size: .74rem; }

/* Sleep ekran zemini — uygulamadaki gece laciverdi + hafif dip derinliği */
.sps-screen {
  min-height: 0;
  padding: 44px 11px 13px;
  border-radius: 33px;
  background:
    radial-gradient(62% 40% at 86% 4%, rgba(148,112,245,.12), transparent 58%),
    radial-gradient(90% 46% at 50% 122%, var(--sleep-bg2), transparent 66%),
    var(--sleep-bg);
  color: #fff;
  display: flex; flex-direction: column; gap: 10px;
}
[data-theme="dark"] .sps-screen { background:
    radial-gradient(62% 40% at 86% 4%, rgba(148,112,245,.14), transparent 58%),
    radial-gradient(90% 46% at 50% 122%, #05052A, transparent 66%),
    var(--sleep-bg);
}
.sps-screen .ps-status { color: rgba(255,255,255,.92); top: 15px; left: 16px; right: 16px; font-size: .68rem; }

/* Yıldız alanı — uygulamadaki dark gökyüzü yıldızları (ambient twinkle) */
.sps-stars {
  position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  background-image:
    radial-gradient(1.5px 1.5px at 16% 12%, rgba(255,255,255,.95), transparent 60%),
    radial-gradient(1.2px 1.2px at 68% 8%, rgba(255,255,255,.75), transparent 60%),
    radial-gradient(1.6px 1.6px at 40% 16%, rgba(255,255,255,.85), transparent 60%),
    radial-gradient(1.1px 1.1px at 86% 18%, rgba(255,255,255,.7), transparent 60%),
    radial-gradient(1.3px 1.3px at 24% 22%, rgba(255,255,255,.6), transparent 60%),
    radial-gradient(1.2px 1.2px at 58% 24%, rgba(255,255,255,.7), transparent 60%);
  opacity: .85;
  animation: twinkle 4.2s ease-in-out infinite alternate;
}

/* Header — ay + başlık + alt başlık (uygulamadaki breathing moon) */
.sps-head { position: relative; z-index: 1; text-align: center; padding-top: 2px; }
.sps-moon {
  position: relative; display: inline-block;
  font-size: 1.6rem; line-height: 1;
  animation: spsMoonBreath 4.8s ease-in-out infinite;
}
.sps-moon-glow {
  position: absolute; left: 50%; top: 52%; transform: translate(-50%, -50%);
  width: 34px; height: 34px; border-radius: 50%;
  background: radial-gradient(circle, rgba(148,112,245,.5), transparent 70%);
  z-index: -1;
  animation: spsGlow 4.8s ease-in-out infinite;
}
.sps-title {
  display: block; margin-top: 3px;
  font-family: var(--font-head); font-size: 1.06rem; font-weight: 700; color: #fff;
}
.sps-sub { display: block; margin-top: 1px; font-size: .66rem; color: rgba(255,255,255,.86); }

/* Güvenlik bilgisi satırı — SafetyTip başlığı (yeşil kalkan) */
.sps-safety {
  position: relative; z-index: 1;
  display: flex; align-items: center; gap: 6px;
  padding: 7px 10px; border-radius: var(--r-sm);
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.12);
  font-size: .68rem; font-weight: 700; color: rgba(255,255,255,.95);
}
.sps-shield { color: var(--sleep-safe); font-size: .74rem; }
.sps-caret { margin-left: auto; font-size: .56rem; color: rgba(255,255,255,.72); }

/* Sıralama çipleri — SortBar (aktif çip mavi gradyan) */
.sps-sorts { position: relative; z-index: 1; display: flex; gap: 5px; }
.sps-sort {
  /* flex 1 1 auto: uzun "Sık Dinlediklerim" çipi kısaltılmadan sığsın
     (okunabilirlik — eşit bölüşümde ellipsis'e düşüyordu) */
  flex: 1 1 auto; text-align: center;
  padding: 6px 7px; border-radius: var(--r-sm);
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.12);
  font-size: .6rem; font-weight: 700; color: rgba(255,255,255,.95);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.sps-sort.is-active {
  background: linear-gradient(120deg, var(--sleep-accent), var(--sleep-accent2));
  border-color: transparent; color: #fff;
  box-shadow: 0 3px 9px -3px color-mix(in srgb, var(--sleep-accent2) 70%, transparent);
}

/* Dairesel ses kartları — SoundCard (3 sütun, emoji + ad; aktif kart parlar) */
.sps-grid {
  position: relative; z-index: 1;
  display: grid; grid-template-columns: repeat(3, 1fr);
  gap: 7px 6px; justify-items: center;
  padding: 2px 0;
}
/* POFUDUK YASTIK REÇETESİ (2026-09-02, kullanıcı kararı: "pofuduk göster").
   Kart daha önce DÜZ bir disk + tek bir alt gölgeydi: yuvarlaktı ama basıktı,
   ekranın zeminine yapışık duruyordu. Kabarıklık ÜÇ katmanla gelir ve üçü de
   birbirini tamamlar — biri eksik kalırsa disk yeniden düzleşir:

     1. ÜSTTEN IŞIK, `inset` (üst kenarda ince beyaz + sol üstte geniş hale).
        Yastığı şişiren asıl katman bu: göz bir yüzeyi ışığın GELDİĞİ yönden
        okur, ışık üstteyse hacim yukarı kabarır.
     2. ALTTAN GÖLGE, yine `inset` — küre alt kenarına doğru kendi içine
        gölgelenir. 1'siz kullanılırsa disk kabarmaz, ÇUKURLAŞIR (bombeyi
        tersine çeviren tek şey ışığın yönüdür, gölgenin varlığı değil).
     3. DIŞ GÖLGE, yumuşak ve OFSETLİ (0 7px 14px -6px): kartı zeminden
        koparır. `-6px` yayılma şart — sıfırda gölge kartın altından taşıp
        komşu kartın halesiyle birleşiyor ve ızgara lekeleniyordu.

   Renk gradyanı DEĞİŞMEDİ: kabarıklık ışıktan gelir, mordan değil. Aynı reçete
   /uyku'daki mod kartlarında ve 18 ses düğmesinde de kullanılıyor (Sleep.css);
   üçü aynı dili konuşsun diye yön (üst ışık / alt gölge) ve sıra sabittir. */
.sps-card {
  width: 100%; aspect-ratio: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 2px;
  border-radius: 50%;
  background:
    radial-gradient(75% 65% at 32% 18%, rgba(255,255,255,.22), transparent 70%),
    linear-gradient(155deg, rgba(185,165,255,.30) 0%, rgba(140,120,240,.18) 45%, rgba(80,60,200,.12) 100%);
  border: 1.5px solid rgba(148,112,245,.28);
  box-shadow:
    inset 0 1.5px 1px rgba(255,255,255,.34),
    inset 0 3px 6px -5px rgba(255,255,255,.18),
    inset 0 -8px 12px -6px rgba(12,10,48,.62),
    0 7px 14px -6px rgba(0,0,0,.55);
}
.sps-card-ico { font-size: 1rem; line-height: 1; color: var(--sleep-card-tx); }
.sps-card-name {
  font-size: .56rem; font-weight: 700; line-height: 1.15;
  color: var(--sleep-card-tx); text-align: center;
  letter-spacing: .2px; padding: 0 4px;
  text-shadow: 0 1px 3px rgba(0,0,0,.4);
}
/* Çalan kart — glow ring + hafif breathing (uygulamadaki isPlaying durumu) */
/* `box-shadow` TEK BİR ÖZELLİKTİR: buradaki liste yukarıdakini eklemez,
   TAMAMEN ezer. Yastık katmanları (inset'ler) bu yüzden burada da tekrar
   yazılır — yazılmazsa çalan kart, yani ızgaradaki TEK vurgulu kart, komşu
   beşinin aksine düz bir disk olur. */
.sps-card.is-playing {
  border-color: rgba(100,172,248,.7);
  box-shadow:
    inset 0 1.5px 1px rgba(255,255,255,.34),
    inset 0 3px 6px -5px rgba(255,255,255,.18),
    inset 0 -8px 12px -6px rgba(12,10,48,.62),
    0 0 0 4px rgba(100,172,248,.16),
    0 7px 16px -6px rgba(46,139,247,.6);
  animation: spsCardBreath 2.5s ease-in-out infinite;
}

/* Alttaki oynatıcı — PlayerBar (ses adı + play/stop + volume + timer çipleri) */
.sps-player {
  position: relative; z-index: 1; margin-top: auto;
  padding: 9px 10px; border-radius: var(--r);
  background: rgba(18,20,90,.72);
  border: 1px solid rgba(108,180,255,.28);
  display: flex; flex-direction: column; gap: 7px;
}
.sps-player-top { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.sps-now { font-size: .66rem; color: rgba(255,255,255,.95); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sps-now b { font-weight: 700; }
.sps-controls { display: flex; align-items: center; gap: 7px; flex: none; }
.sps-play {
  width: 27px; height: 27px; border-radius: var(--r-sm);
  display: grid; place-items: center;
  background: linear-gradient(135deg, var(--sleep-accent), var(--sleep-accent2));
  color: #fff; font-size: .64rem;
  box-shadow: 0 3px 8px -3px var(--sleep-accent2);
}
.sps-stop {
  width: 25px; height: 25px; border-radius: var(--r-sm);
  display: grid; place-items: center;
  background: rgba(248,113,113,.18);
  border: 1.5px solid rgba(248,113,113,.55);
  color: var(--sleep-stop); font-size: .62rem;
}
/* Dalga göstergesi — İSTEĞE BAĞLI, partial'a `spWave` ile açılır (bugün yalnız
   /uyku hero'su açıyor). Ses çubuğunun YERİNE geçmez, üstünde durur: ikisi
   farklı şey söylüyor (biri seviye, diğeri "çalıyor").
   `scaleY`, `height` değil: yükseklik animasyonu her karede düzeni yeniden
   hesaplatır. Gecikme şablondaki `--i`den, `:nth-child`ten değil — çubuk
   sayısı değişirse kural onunla gelir. */
.sps-wave {
  position: relative; z-index: 1;
  display: flex; align-items: center; justify-content: space-between;
  height: 16px;
}
.sps-wave i {
  flex: 0 0 2.5px; height: 100%; border-radius: 99px; transform-origin: 50% 50%;
  background: linear-gradient(180deg, var(--sleep-accent), var(--sleep-accent2));
  opacity: .85; transform: scaleY(.24);
  animation: spsWave 1.9s ease-in-out infinite alternate;
  /* GECİKME ADIMI DÖNGÜNÜN TAM KATI OLMAMALI (`alternate` → döngü 3.8s).
     Küçük bir adımda on beş çubuk sırayla yükselen bir MERDİVEN, tam bölende
     simetrik bir TEPE çizer; ikisi de "ses" değil "grafik" okunur ve alttaki
     seviye çubuğuyla (`.sps-vol`) karışır. 2.32s ≈ döngünün altın oranı. */
  animation-delay: calc(var(--i, 0) * -2.32s);
}
@keyframes spsWave { from { transform: scaleY(.2); } to { transform: scaleY(1); } }
/* Global reduced-motion bloğu yalnız SÜREYİ sıfırlar; süresi sıfırlanan sonsuz
   bir dalga son karesine (scaleY(1)) yapışır ve on beş çubuk bir duvara döner. */
@media (prefers-reduced-motion: reduce) {
  .sps-wave i { animation: none; transform: scaleY(.5); }
}

.sps-vol { height: 4px; border-radius: 2px; background: rgba(255,255,255,.14); overflow: hidden; }
.sps-vol i { display: block; width: 62%; height: 100%; border-radius: inherit; background: linear-gradient(90deg, var(--sleep-accent), var(--sleep-accent2)); }
.sps-timers { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.sps-timer {
  padding: 3px 8px; border-radius: 7px;
  background: rgba(255,255,255,.07);
  border: 1px solid rgba(255,255,255,.12);
  font-size: .58rem; font-weight: 700; color: rgba(255,255,255,.95);
}
.sps-timer.is-active {
  background: linear-gradient(120deg, var(--sleep-accent), var(--sleep-accent2));
  border-color: transparent; color: #fff;
}
.sps-fade {
  display: flex; align-items: center; gap: 5px;
  margin-left: auto; font-size: .56rem; color: rgba(255,255,255,.82);
}
.sps-switch {
  width: 20px; height: 12px; border-radius: 6px;
  background: var(--sleep-accent2); position: relative; flex: none;
}
.sps-switch::after {
  content: ""; position: absolute; top: 1.5px; right: 1.5px;
  width: 9px; height: 9px; border-radius: 50%; background: #fff;
}

/* Ambient keyframes — sakin nefes/parıltı (prefers-reduced-motion global bloğu
   bunları duration ile zaten kapsar; ek JS gerekmiyor). */
@keyframes spsMoonBreath {
  0%, 100% { transform: translateY(0) scale(1); }
  50%      { transform: translateY(-2px) scale(1.06); }
}
@keyframes spsGlow {
  0%, 100% { opacity: .35; transform: translate(-50%, -50%) scale(1); }
  50%      { opacity: .7;  transform: translate(-50%, -50%) scale(1.18); }
}
@keyframes spsCardBreath {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.05); }
}

/* ---- Kategoriler bölümü mini telefon mockup'ı -------------------------------
   Gerçek uygulamanın kategori/keşfet ekranını (KidlioApp app/(tabs)/activities/
   index.tsx) küçültülmüş, saf-CSS bir kopyası. Uygulamanın kendine özgü renkleri
   burada app-brand token'ları olarak (kaynak: categoryColors.ts gradyanları,
   KidlioBackground.tsx gökyüzü #1A6FF5/#191970). Görsel çeşitlilik için telefon
   Uyku'nun aynası olarak SOLDA. Yalnız ambient CSS animasyonu — JS yok. */
.cps-screen {
  --cat-sky:      #1A6FF5;   /* KidlioBackground açık gökyüzü tabanı */
  --cat-sky2:     #0A3CA0;   /* dip derinliği (BackgroundDecor depth, açık) */
  --cat-sky-dk:   #191970;   /* KidlioBackground dark taban (gece laciverdi) */
  --cat-sky-dk2:  #05052A;   /* dark dip derinliği */
  /* Kategori balon gradyanları — categoryColors.ts .gradient[] (açık→koyu) */
  --cat-play1:  #FFA5E1; --cat-play2:  #FF2DBE; --cat-play3:  #D71E9B;  /* Oyna (play) */
  --cat-think1: #FEE682; --cat-think2: #F5A51E; --cat-think3: #DC8214;  /* Düşün (think) */
  --cat-expl1:  #78EBBE; --cat-expl2:  #23C38C; --cat-expl3:  #0FA06E;  /* Keşfet (explore) */
  --cat-conv1:  #AFBEFF; --cat-conv2:  #6E73F0; --cat-conv3:  #5550E1;  /* Muhabbet (conversation) */
  --cat-orb:    #3A63C8;   /* Sürpriz küresi mavi gradyan orta ton */
  --cat-fav:    #FF6B7A;   /* Favorilerim kalp rengi */
}


/* Kategori ekran zemini — uygulamadaki mavi gökyüzü (açık) / laciverdi (koyu) */
.cps-screen {
  min-height: 0;
  padding: 42px 11px 14px;
  border-radius: 33px;
  background:
    radial-gradient(95% 45% at 22% 8%, rgba(255,255,255,.28), transparent 62%),
    radial-gradient(90% 60% at 50% 118%, var(--cat-sky2), transparent 72%),
    var(--cat-sky);
  color: #fff;
  display: flex; flex-direction: column; gap: 11px;
}
[data-theme="dark"] .cps-screen { background:
    radial-gradient(95% 45% at 22% 8%, rgba(120,150,255,.20), transparent 62%),
    radial-gradient(90% 60% at 50% 118%, var(--cat-sky-dk2), transparent 72%),
    var(--cat-sky-dk);
}
.cps-screen .ps-status { color: rgba(255,255,255,.95); top: 15px; left: 16px; right: 16px; font-size: .68rem; }

/* Süzülen yumuşak bulut/ışık cepleri (ambient drift) */
.cps-clouds {
  position: absolute; inset: 0; pointer-events: none; border-radius: inherit;
  background-image:
    radial-gradient(28px 14px at 24% 30%, rgba(255,255,255,.22), transparent 70%),
    radial-gradient(34px 16px at 74% 20%, rgba(255,255,255,.16), transparent 72%),
    radial-gradient(24px 12px at 60% 44%, rgba(255,255,255,.14), transparent 72%);
  opacity: .9;
  animation: cpsClouds 9s ease-in-out infinite alternate;
}

/* Selam başlığı — uygulamadaki "Hangi maceraya çıkalım?" */
.cps-greet {
  position: relative; z-index: 1; text-align: center;
  font-family: var(--font-head); font-weight: 800; color: #fff;
  font-size: .94rem; line-height: 1.2; padding: 2px 4px 0;
  text-shadow: 0 1px 4px rgba(0,0,0,.35);
}

/* Çocuk avatar şeridi — Tüm Aile + çocuklar (ilk aktif) */
.cps-kids {
  position: relative; z-index: 1;
  display: flex; gap: 7px; justify-content: center;
  padding: 1px 0 2px;
}
.cps-kid { display: flex; flex-direction: column; align-items: center; gap: 2px; opacity: .85; }
.cps-kid small { font-size: .52rem; font-weight: 700; color: rgba(255,255,255,.95); max-width: 44px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-shadow: 0 1px 2px rgba(0,0,0,.3); }
.cps-kid-av {
  width: 26px; height: 26px; border-radius: 50%;
  display: grid; place-items: center; font-size: .92rem;
  background: rgba(255,255,255,.16);
  border: 1.5px solid rgba(255,255,255,.4);
}
.cps-kid.is-active { opacity: 1; }
.cps-kid.is-active .cps-kid-av {
  background: #fff; border-color: #fff;
  box-shadow: 0 2px 8px -2px rgba(0,0,0,.35);
}
.cps-kid.is-active small { color: #fff; }

/* 2x2 dairesel gradyan kategori balonları — uygulamanın imza öğesi */
.cps-grid {
  position: relative; z-index: 1;
  display: grid; grid-template-columns: repeat(2, 1fr);
  gap: 9px; justify-items: center;
  padding: 3px 4px 1px;
}
.cps-bubble {
  width: 100%; aspect-ratio: 1;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 2px;
  border-radius: 50%;
  border: 2px solid rgba(255,255,255,.55);
  box-shadow: 0 5px 13px -6px rgba(0,0,0,.5), inset 0 6px 10px -6px rgba(255,255,255,.55);
  text-align: center;
  animation: cpsBubbleFloat 4s ease-in-out infinite;
}
/* Kategori gradyanları — categoryColors.ts .gradient dizileri (açık üst → koyu alt) */
.cps-b1 { background: radial-gradient(120% 120% at 32% 18%, var(--cat-play1),  var(--cat-play2)  62%, var(--cat-play3));  animation-delay: 0s;   }
.cps-b2 { background: radial-gradient(120% 120% at 32% 18%, var(--cat-think1), var(--cat-think2) 62%, var(--cat-think3)); animation-delay: .5s;  }
.cps-b3 { background: radial-gradient(120% 120% at 32% 18%, var(--cat-expl1),  var(--cat-expl2)  62%, var(--cat-expl3));  animation-delay: 1s;   }
.cps-b4 { background: radial-gradient(120% 120% at 32% 18%, var(--cat-conv1),  var(--cat-conv2)  62%, var(--cat-conv3));  animation-delay: 1.5s; }
.cps-b-emoji { font-size: 1.35rem; line-height: 1; filter: drop-shadow(0 1px 2px rgba(0,0,0,.25)); }
/* Telefon mockup 2x2 balonunda kategori illüstrasyonu (WebP, şeffaf zemin) */
.cps-b-img { width: 46%; height: 46%; object-fit: contain; display: block; filter: drop-shadow(0 1px 2px rgba(0,0,0,.3)); }
.cps-b-name {
  font-size: .64rem; font-weight: 800; line-height: 1.1; color: #fff;
  text-shadow: 0 1px 4px rgba(0,0,0,.5);
}
.cps-b-ex {
  font-size: .5rem; font-weight: 700; line-height: 1.1;
  color: rgba(255,255,255,.96); padding: 0 6px;
  text-shadow: 0 1px 3px rgba(0,0,0,.45);
}
/* Basılan balon — uygulamadaki press-scale (sakin nabız döngüsü) */
.cps-bubble.is-press { animation: cpsBubblePress 3.2s ease-in-out infinite; }

/* Alt satır — Sürpriz küresi + Favorilerim */
.cps-foot {
  position: relative; z-index: 1; margin-top: auto;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  padding-top: 4px;
}
.cps-surprise { display: flex; flex-direction: column; align-items: center; gap: 3px; }
.cps-orb {
  width: 38px; height: 38px; border-radius: 50%;
  display: grid; place-items: center;
  background: radial-gradient(circle at 34% 26%, #A9CBFF, #5E8FE8 42%, var(--cat-orb) 70%, #152C66);
  border: 1.5px solid rgba(255,255,255,.3);
  box-shadow: 0 4px 12px -4px rgba(58,99,200,.7);
}
.cps-orb-star {
  color: #FFF1C0; font-size: .9rem; font-style: normal;
  text-shadow: 0 0 6px rgba(255,233,168,.9);
  animation: cpsOrbSpin 7s linear infinite;
}
.cps-surprise small { font-size: .62rem; font-weight: 800; color: #fff; text-shadow: 0 1px 3px rgba(0,0,0,.4); }
.cps-fav {
  display: flex; align-items: center; gap: 7px;
  padding: 7px 13px; border-radius: var(--r);
  background: rgba(255,255,255,.16);
  border: 1px solid rgba(255,255,255,.35);
  font-size: .68rem; font-weight: 800; color: #fff;
  text-shadow: 0 1px 2px rgba(0,0,0,.3);
}
[data-theme="dark"] .cps-fav { background: rgba(10,24,55,.55); border-color: rgba(255,255,255,.14); }
.cps-fav .fa-heart { color: var(--cat-fav); font-size: .68rem; }
.cps-fav-count {
  min-width: 17px; text-align: center;
  padding: 1px 6px; border-radius: var(--r-sm);
  background: rgba(255,107,122,.35);
  font-size: .58rem; font-weight: 800;
}
.cps-fav-caret { font-size: .54rem; color: rgba(255,255,255,.85); }

/* Ambient keyframes — sakin süzülme/nabız/dönüş (prefers-reduced-motion global
   bloğu — 2133 civarı, `*` seçicisiyle tüm animation-duration'ları sıfırlar —
   bunları da kapsar; ek JS gerekmiyor). */
@keyframes cpsClouds {
  0%   { transform: translateX(0) translateY(0); opacity: .82; }
  100% { transform: translateX(6px) translateY(-3px); opacity: 1; }
}
@keyframes cpsBubbleFloat {
  0%, 100% { transform: translateY(0) scale(1); }
  50%      { transform: translateY(-3px) scale(1.015); }
}
@keyframes cpsBubblePress {
  0%, 68%, 100% { transform: translateY(0) scale(1); }
  80%           { transform: translateY(0) scale(.92); }
}
@keyframes cpsOrbSpin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

/* UYKU SAYFASININ KURALLARI ARTIK BURADA DEĞİL.
   `/uyku` 2026-08-25'te yeniden tasarlandı ve kendi dosyalarına taşındı
   (Css/Site/Sleep.css + Js/Site/Sleep.js, ön ek `sx-`) — Features/Categories/
   Growth ile aynı desen. Buradaki eski kurallar aynı commit'te SİLİNDİ:
     .mode-grid / .mode-card  → altı özdeş beyaz kart; yerini asimetrik bento
                                aldı (`.sx-bento`)
     .sound-chips / .sound-chip / .sound-more
                              → 18 adlık etiket bulutu; yerini uygulamanın
                                oynatıcısı aldı (`.sx-player`)
     .sleep-why / .sleep-why-list
                              → zaten HİÇBİR şablonda geçmiyordu (ölü kural)
   Site.css her sayfaya iner: ölü kural her ziyaretçiye iner demektir. */

/* ----------------------------------------------------------------------------
   13) Özellikler sayfasından ARTA KALANLAR (ve nereye ait oldukları)

   Bu bölüm bir dönem Özellikler sayfasının 11 satırlık `.feat-row` akışını
   taşıyordu: satır ızgarası, zigzag, plan rozetleri, dekoratif ikon kutusu,
   grup başlıkları, `.areas-strip` ve `.extras-grid`. Sayfa 2026-08-24'te sahne
   düzenine geçti (Pages/Site/Features.html + Css/Site/Features.css) ve o
   kuralların TAMAMI — hiçbir şablonda karşılığı kalmadığı için — silindi:
   Site.css her sayfaya iner, ölü kural her ziyaretçiye iner demektir.

   Burada kalan dördü Özellikler sayfasına HİÇ ait değildi, yalnız tarihsel
   olarak bu bölüme yazılmışlardı ve hâlâ kullanılıyorlar:
     .discount-*   → Fiyatlandırma bandı (aslında §14'ün parçası)
     .energy-line  → "yorgun akşam" vurgu şeridi
     .areas-grid / .area-card → kategori sayfalarındaki 8 alan ızgarası
     .devarea-ico  → Components/Site/DevAreaIcons.html rozeti (her sayfada)
---------------------------------------------------------------------------- */
/* İndirim bandı satırları: %50 listeye-özel vurgusu + "kaç ay?" notu */
.discount-extra { font-size: var(--fs); font-weight: 800; color: #15803D; }
[data-theme="dark"] .discount-extra { color: #6EE7A0; }
.discount-note { font-size: var(--fs-xs); font-weight: 600; color: var(--tx2); }

/* Enerji satırı — bölüm değil, ince sıcak vurgu şeridi (maskotsuz, hafif tonlu)

   Rengi bilinçli olarak bölüm aksanı (--cat-dusun, amber) DEĞİL. Soluk sarı
   zemin + amber kenarlık tarayıcı uyarı şeridinin birebir görsel dili; metin
   "sıfır hazırlık, sıfır suçluluk" derken renk "dikkat" diyordu — okuyanı
   rahatlatması gereken tek satır, tam tersini hissettiriyordu.

   Yerine akşam ışığı: solda oyna pembesi (şefkat), sağda muhabbet periwinkle'ı
   (dinginlik) — "yorgun akşamlar"ın kendi rengi. Düz tek ton yerine çok hafif
   bir gradyan olması da önemli: düz dolgu + kenarlık = durum kutusu, akan ton
   = ışık. Oranlar (9/11%) kasten fısıltı seviyesinde; şerit dikkat çekmemeli,
   sadece yumuşak durmalı. */
.energy-line {
  max-width: 940px; margin: 22px auto 0;
  padding: 13px 20px;
  text-align: center;
  font-family: var(--font-head); font-weight: 700; font-size: var(--fs-lg); line-height: 1.5;
  color: var(--tx1);
  background: linear-gradient(100deg,
    color-mix(in srgb, var(--cat-oyna) 9%, var(--card)) 0%,
    color-mix(in srgb, var(--cat-muhabbet) 11%, var(--card)) 100%);
  border: 1px solid color-mix(in srgb, var(--cat-muhabbet) 22%, transparent);
  border-radius: var(--r-full);
  box-shadow: var(--shadow-sm);
}
/* Kupa ikonu metinle aynı mürekkepte kalırsa satır tek blok gibi okunuyor;
   aksan rengi onu "sıcak bir işaret" yapıyor. Mürekkep artık tek token:
   light'ta `-deep`, dark'ta açılmış uç. Buradaki eski koyu tema kuralı HAM
   `--cat-muhabbet` yazıyordu ve o, kart yüzeyinde 3.66:1 ile sitedeki en zayıf
   kategori mürekkebiydi — token bunu 6.36'ya çıkarıyor. */
.energy-line i { color: var(--cat-muhabbet-tx); }

/* Kategorinin beslediği gelişim alanları (kategori detay sayfaları).

   IZGARA DEĞİL, ORTALANMIŞ SARMA — ve bu load-bearing. Kural `repeat(4, 1fr)`
   iken bölümün gerçek kart sayısı 2 (Düşün) ya da 3 (diğer üçü) idi: dört
   sayfanın dördünde de satırın sağında 299px boş bir kolon kalıyordu, yani
   "eksik yüklenmiş" gibi okunuyordu (1440'ta ölçüldü). Kart sayısı içerikten
   geldiği için kolon sayısı sabitlenemez; sarma her sayıda ortalanmış ve
   dengeli kalır. `max-width` şart: iki kartlı sayfada `flex: 1 1` onları
   590px'e kadar şişirir ve kart "kart" olmaktan çıkar.

   Kart bir BAĞLANTIDIR (`<a>` → /gelisim). Bölüm gelişim alanından bahsedip ne
   olduğunu söylemiyor, /gelisim'e de hiç bağlanmıyordu; dört kategori sayfası
   o sayfaya bir kez bile yol vermiyordu. */
.areas-grid {
  display: flex; flex-wrap: wrap; justify-content: center;
  gap: 16px;
}
.area-card {
  flex: 1 1 260px; max-width: 340px;
  display: flex; align-items: center; gap: 12px;
  padding: 15px 19px;
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r);
  box-shadow: var(--shadow-sm);
  color: var(--tx1); text-decoration: none;
  transition: transform var(--t-sm) ease, border-color var(--t-sm) ease, box-shadow var(--t-sm) ease;
}
.area-card:hover { transform: translateY(-4px); border-color: var(--border-strong); box-shadow: var(--shadow); }
.area-copy { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.area-copy b {
  font-family: var(--font-head); font-weight: 700; font-size: var(--fs-lg);
  line-height: 1.25; color: var(--tx1);
}
/* gloss = alanın ebeveyn dilindeki karşılığı; sekiz jargon başlık tek başına
   hiçbir şey anlatmıyor (aynı gerekçe Özellikler'in f2-areas şeridinde de). */
.area-copy small { font-size: var(--fs-xs); font-weight: 600; color: var(--tx2); line-height: 1.35; }

/* Gelişim alanı ikon rozeti — emoji yerine inline Phosphor SVG (bkz.
   Components/Site/DevAreaIcons.html). Renk, alan rengi (--da) ile solgun bir
   daire zemin; glyph koyu bir ton (--da-deep) ile ~3:1 kontrast sağlar. */
.devarea-ico {
  flex: 0 0 46px; height: 46px;
  display: grid; place-items: center;
  border-radius: var(--r);
  background: color-mix(in srgb, var(--da) 14%, transparent);
  color: var(--da-deep);
}
.devarea-ico svg {
  width: 1.2em; height: 1.2em;
}
/* Bilinmeyen bir alan anahtarı için savunma dalı. EMOJİ BASMAZ: yasak mutlak
   ("ne şablonda, ne kopyada, ne CSS content'inde") ve bir gün DEV_AREAS'a
   haritada karşılığı olmayan bir alan eklenirse bu dal sessizce o yasağı
   çiğnerdi — hiçbir şey hata vermeden. Bugün ulaşılamaz: sekiz alanın sekizi
   de _DA_ICONS'ta. `--da` / `--da-deep` bu dalda TANIMSIZ olduğu için taban
   kuralın color-mix'i geçersiz düşer; zemin ve mürekkep bu yüzden burada
   yeniden yazılır. */
.devarea-ico--fallback {
  font-size: var(--fs-2xl);
  background: var(--blue-ghost);
  color: var(--blue-ink);
}
[data-theme="dark"] .devarea-ico {
  background: color-mix(in srgb, var(--da) 22%, transparent);
  color: color-mix(in srgb, var(--da) 78%, #ffffff);
}

/* ----------------------------------------------------------------------------
   14) Ana sayfanın fiyat bölümü — /fiyatlandirma'nın KARTLARI

   KARAR İKİ KEZ DÖNDÜ, ikisi de kullanıcı kararı:
   • 2026-08-25: ana sayfa ile /fiyatlandirma ayrıldı. Burada fiyat sayfasının
     birebir kopyası duruyordu (üç kart + aylık/yıllık seçici + iki uzun
     liste); ziyaretçi aynı tabloyu sitede iki kez okuyor, ana sayfa da ürünü
     anlatmayı bırakıp satın alma ekranına dönüyordu. Bölüm bir ÖZETE indi ve
     kartların bütün kuralları (`.tier*`, `.tiers*`, `.discount-banner`)
     buradan `Css/Site/Pricing.css`e taşındı.
   • 2026-08-31 sabahı: kartlar ana sayfaya GERİ GELDİ (*"ana sayfadaki
     fiyatlandırma kısmında fiyat kartlarını gösterelim"*, tam tablo).
     Kurallar Site.css'e geri TAŞINMADI — `px-` ailesi Pricing.css'te kalır.
   • 2026-08-31 gecesi: kartlar YİNE KALKTI (konsey turu, karar 2 — "fiyatı
     iki kez okumak istemiyorum"). Bugün ana sayfada tek bir `px-` sınıfı
     yok, o yüzden Index.html `Pricing.css`/`Pricing.js` de YÜKLEMİYOR
     (ölçüldü: 33 + 5 KB, her ziyarete inen ölü ağırlıktı). Aşağıdaki üç
     parça bu turdan kalanlar.

   GERİYE KALAN ÜÇ PARÇA ve NEDEN:
   • `.ptease-points` — üç güven maddesi, kartların ÜSTÜNDE. Kartlar fiyatı
     söyler, bu satır riski. KUTUSU YOK: eski `.ptease` yüzeyi (zemin `--card`
     + kenar + gölge) iki büyük kartın üstünde ÜÇÜNCÜ bir dolu blok olurdu ve
     sitenin her yerinde ölçülmüş "dolu blok sayısı" kuralına takılırdı.
   • `.ptease-promo` — pembe %50 rozeti. Kartlardaki iki sayının (üstü çizili
     liste fiyatı + indirimli sayı) NİYE iki olduğunu söyleyen tek yer.
   • `.ptease-after` — "sonrasında standart aylık fiyat". Kartların kendi
     `px-after`ı plan başına konuşur; bu genel cümle /fiyatlandirma'nın
     `px-fine` dipnotunun ana sayfadaki karşılığı. Silinirse kampanya fiyatı
     kalıcı fiyat gibi okunur ve hiçbir şey hata vermez.
   Üçü de ORTALANIR: yaslanacakları bir kutu kalmadı (eski `.ptease` yüzeyi),
   ve kartlar da gidince bölümün tamamı eksende okunuyor.

   SİLİNENLER (kayıt, çünkü ikisi de ölçülmüş kararlardı ve bir gün özet geri
   istenirse buradan aranır):
   • `.ptease` kutusu — max 880px, `--card` zemin, `--border` kenar,
     `--shadow-sm`; vurgusu bilerek yoktu ki §16'nın tintli kapanış kutusuyla
     yarışmasın.
   • `.ptease-foot` / `.ptease-price` / `.ptease-tiers` ailesi — iki fiyatı
     elle listeleyen satırlar. İçinde 2026-08-26'nın "iki sayının ağırlığı
     ayrıştırıldı" kararı yaşıyordu: ödenecek sayı `clamp(1.375rem, 2.42vw,
     1.7rem)` + 800, üstü çizilen `--fs-sm` + 600 + `color-mix(in srgb,
     var(--tx3) 85%, var(--card-solid))` (ölçüldü: açık 2.4:1 · koyu 4.3:1,
     bilerek metin tabanının altında — ödenmeyecek sayı). Aynı işi bugün
     kartların `.px-price` / `.px-after` satırları yapıyor.
   NOT — 2026-08-31 AKŞAMI GERİ ALINDI (konsey kararı 2). Bu bölüm bir gün
   boyunca /fiyatlandirma'nın tam kartlarını taşıdı; ölçüldüğünde 1.270px
   masaüstü / 1.713px mobil ile ana sayfanın EN BÜYÜK bölümüydü (hero 900 /
   1.307px). Kartlar, seçici ve iki `px-cta` gitti; gerekçenin tamamı
   `Pages/Site/Index.html`deki nottadır.

   BUGÜNKÜ İSKELET: üç güven maddesi (tek satır) → %50 rozeti → "sonrasında"
   satırı → BİR dolu düğme + BİR metin bağlantısı. `.ptease-cta` / `.ptease-btn`
   bu yüzden geri geldi; ölçüsü kayıttaki değerin aynısı — `min-height: 46px`
   (WCAG 2.5.8, dolguyla DEĞİL, yoksa iki satıra saran bir etiket kutuyu da
   büyütür) ve 620px altında tam genişlik, birincil ÜSTTE. Sıra DOM'dan gelir:
   `order` ile çevrilirse klavye/ekran okuyucu sırası görsel sırayla ayrışır.

   İKİNCİ DOLU DÜĞME YOK ve olmayacak: "dolu blok sayısı" kuralı (hero'nun
   ghost store rozetleri, `.hero-trust`un kutudan satıra inmesi) burada da
   geçerli — yan yana iki dolu blok "hangisi asıl eylem" sorusunu geri getirir.
   O yüzden /fiyatlandirma'ya giden yol `.cta-arrow` metin bağlantısı.
---------------------------------------------------------------------------- */
.ptease-points {
  list-style: none; padding: 0;
  max-width: 880px; margin: 0 auto clamp(16px, 2.2vw, 22px);
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px;
}
/* HER MADDE KENDİ ROZETİNDE (2026-09-07, kullanıcı kararı). Yukarıdaki
   "KUTUSU YOK" notu ÇÜRÜMEDİ, kapsamı değişti: yasak olan şey üç maddeyi
   birden saran TEK dolu bloktu (kartların üstünde üçüncü bir yüzey); üç ayrı
   pil, rozet ailesinin (`.eyebrow`) bu bölümdeki karşılığı ve blok saymıyor.
   YARIÇAP 14px ve token DEĞİL: ölçüyü kullanıcı verdi, `--r-sm` (10) ile
   `--r` (16) arasında duruyor — yeni bir token açmak bu tek ölçüyü tasarım
   sistemine sokardı (`.step` okunun aynı kararı). */
.ptease-points li {
  display: flex; align-items: center; gap: 11px;
  padding: 10px 14px;
  background: var(--card);
  border: 1px solid var(--border-strong);
  border-radius: 14px;
  font-size: var(--fs); font-weight: 700; color: var(--tx1);
}
.ptease-ico {
  flex: 0 0 auto;
  display: grid; place-items: center;
  width: 38px; height: 38px;
  border-radius: 50%;
  background: var(--blue-ghost); color: var(--blue);
  font-size: 1rem;
}

/* İNDİRİM ETİKETİ — KÜÇÜK, PASTEL YEŞİL ROZET (2026-08-31, kullanıcı kararı;
   2026-08-26'dan beri pembeydi, o günün gerekçesi aşağıda aynen geçerli).
   Satır bir dönem kutusuzdu ve vurguyu yalnız mürekkepten (`--btn-tx`) alıyordu;
   gerekçesi "kutu içinde kutu" idi. Bugün tersi geçerli: bölümün ASIL eylemi
   kartların MAVİ CTA'sı ve indirim satırı da maviyken ikisi aynı sesle
   konuşuyor, yani vurgu olması gereken şey butonun rengine karışıyordu. Etiket
   maviden çıkınca mavi yalnız CTA'da kalır — denge renk EKLEYEREK değil,
   var olan iki rengi ayırarak kuruluyor.

   Üç şey yükü taşıyor:
   - ROZET KÜÇÜK KALIR (`--fs-sm`, ince dolgu, gölge YOK): §16'nın tintli
     kapanış kutusuyla ve mavi butonla ağırlık yarışına girmemeli — kaldırılma
     gerekçesi olan "dolu blok sayısı" kuralı hâlâ geçerli, o yüzden yüzey
     zeminden yalnız %10 ayrılır ve kutunun kendi kenarlığı yoktur.
   - YEŞİL YENİ RENK DEĞİL: `--cat-kesfet` ailesi, yani sitenin ONAY yeşili —
     hero'nun güven satırındaki dolu disk ve güven bölümünün üç onayı aynı
     aileden. Rozetin işi bir kazanç bildirmek ("%50 senin"), o yüzden site
     bunu zaten olumlu haber için kullandığı renkle söyler. Ham renk yalnız
     ZEMİN tintinde; METİN için mürekkep ucu, `.cat-more`daki ölçülmüş formülün
     aynısı — açıkta `--tx1` ile, koyuda beyazla karışır, çünkü `-deep` varyantı
     AÇIK zemin için koyulaştırılmıştır ve gece zemininde ters yönde çalışır.
     ORAN PEMBEDEN DEVRALINAMAZ, yeniden ölçüldü ve bu bir tuzak: pembenin
     açık tema karışımı `-deep` %72 idi; aynı sayı yeşille **4.36** veriyor,
     yani AA'nın (4.5) ALTINDA — çünkü Keşfet'in `-deep` ucu Oyna'nınkinden
     açık. Karışımı `--tx1`e doğru açmak (yani `-deep` oranını DÜŞÜRMEK)
     koyulaştırır: %72→4.36 · %65→4.76 · %60→5.07 · **%55→5.41** · %45→6.16.
     %55 seçildi — pembenin ölçülmüş 5.79'una en yakın değer, ve daha aşağısı
     yeşili laciverde boğar. Koyu tarafta yön ters (beyazla karışıyor) ve
     %62 olduğu gibi kaldı: 7.39, `--cat-*-tx` ailesinin ölçülmüş
     7.35–8.19 bandının tam içinde.
   - TİNT OKLCH'DE: sRGB'de açık uçta chroma kaybolur ve "çok açık yeşil" soluk
     bir griye iner (`.cta-box`taki aynı gerekçe). `in oklch` silinirse renk
     eskiye dönmez, `color-mix` geçersiz olur ve etiket ZEMİNSİZ kalır.
   Ölçüm (etiketin kendi zemininde): açık 5.41:1 · koyu 7.39:1 — ikisi de AA.

   ORTALAMA İKİ BİLDİRİMDİR (`.px-bill--shared`in aynı tekniği): `display:
   flex` + `width: fit-content` olmadan `margin-inline: auto` iş yapmaz —
   inline kutu ortalanmaz, blok kutu ise pili satır boyu genişletir. */
/* DOLU YEŞİL PİL, BEYAZ YAZI — `/fiyatlandirma` kartlarındaki kardeşiyle
   (`.px-promo`) BİREBİR AYNI değer (2026-09-04, kullanıcı kararı). Gerekçe ve
   ölçümler orada (Pricing.css): ton beyaz yazı AA'yı geçsin diye seçildi,
   marka yeşili (`--cat-kesfet`) beyazla yalnız 2.27 veriyor. Burada zemin
   karışımı `--card-solid`di ve açık temada bölümle 1.08:1'di; karışım gidince
   koyu tema override'ı da gereksizleşti (silindi). İki pilin AYRIŞMASI sessiz
   bir kırılmadır: aynı kampanyayı söylüyorlar. */
.ptease-promo {
  --promo-bg:  color-mix(in srgb, var(--cat-kesfet-deep) 30%, var(--cat-kesfet-ink));
  --promo-ink: #ffffff;
  display: flex; align-items: center; width: fit-content;
  margin: 0 auto clamp(14px, 2vw, 20px);
  padding: 4px 12px;
  border-radius: var(--r-full);
  background: var(--promo-bg);
  font-family: var(--font-head); font-weight: 800;
  font-size: var(--fs-sm); color: var(--promo-ink);
  letter-spacing: .01em;
}
/* "Sonrasında ne ödeyeceğim" — %50 rozetinin HEMEN ALTINDA, ortalanmış, küçük.

   MÜREKKEP `--tx2`, `--tx3` DEĞİL (2026-08-31). Ölçüldü: `--tx3` ile açık
   temada **2.80:1**, yani metin tabanının (4.5) altında — koyu tema zaten
   7.72 ile sorunsuzdu, o yüzden hata yalnız açık temada ve gözle fark
   edilmiyordu. Bu, dün `/fiyatlandirma`nın `.px-after`ı için verilen kararın
   birebir aynısı (orada 2.57 ölçülmüştü ve İKİ ayrı persona kampanya fiyatını
   KALICI fiyat sanmıştı — hata bireysel okuma hatası değil hiyerarşi
   hatasıydı). Burada bugün daha da ağır basıyor: konsey kararı 2 fiyat
   kartlarını bu bölümden kaldırdı, yani sayfada %50 rozetini niteleyen TEK
   cümle bu satır. Sönük bırakmak, kaldırmakla aynı sonucu verir.

   Not: /fiyatlandirma'daki ÜSTÜ ÇİZİLİ sayı `--tx3`te KALIR — ödenmeyecek
   sayının okunur olması gerekmiyor. Bu satır onun tersi: ödenecek olan. */
.ptease-after {
  margin: clamp(14px, 2vw, 18px) 0 0;
  text-align: center;
  font-size: var(--fs-sm); color: var(--tx2);
}

/* Tek dolu düğme + tek metin bağlantısı, ortalanmış. */
.ptease-cta {
  display: flex; flex-wrap: wrap;
  justify-content: center; align-items: center;
  gap: clamp(12px, 2vw, 22px);
  margin-top: clamp(18px, 2.6vw, 26px);
}
/* DÜĞME BİR KADEME DAR (2026-08-31, kullanıcı kararı): yatay dolgu `.btn`in
   28px'inden 20px'e iner, yani kutu 153 → 137px (ölçüldü, 1440px). Daralan
   şey YALNIZ YATAY DOLGU:
   - `min-height: 46px` DEĞİŞMEZ — dokunma hedefi (WCAG 2.5.8) ve zaten
     dolguyla değil `min-height` ile veriliyor; dikeyi kısmak butonu daraltmaz,
     KÜÇÜLTÜR ve hedefi tabanın altına indirir.
   - Punto (`--fs-lg`) da DEĞİŞMEZ: `t.wl_btn` sitenin tek birincil çağrısı ve
     navbar · hero · kapanış kutusundaki kardeşleriyle aynı sesle konuşuyor —
     puntoyu burada kısmak aynı etiketi sayfada iki ağırlıkta gösterirdi.
   - 620px altındaki `width: 100%` bunu zaten ezer, yani mobil hiç etkilenmez. */
.ptease-btn { min-height: 46px; padding-inline: 20px; }

@media (max-width: 620px) {
  .ptease-points { grid-template-columns: 1fr; gap: 11px; }
  /* Düğme ve bağlantı alt alta ve tam genişlikte; birincil ÜSTTE kalır ve bu
     DOM sırasından gelir, `order`dan değil. */
  /* TEK BAGLANTI ORTALANIR, GERILMEZ (2026-09-10). `align-items: stretch`
     IKI dugmelik bir satirin kuraliydi (ikisi de tam genislik olsun diye);
     2026-09-07'de dolu dugme SILINDI ve geride tek bir pil rozet kaldi —
     stretch onu kabin tamamina yayiyor, `.eyebrow-cta`nin kendi
     `justify-content`i olmadigi icin metin + `»` sol kenara yapisiyordu
     (olculdu 620px: link 580px genis, icerigi solda). Ortalama linkin KENDI
     olcusunde kalmasindan gelir; `justify-content: center` tabanda zaten var.
     `.ptease-btn { width: 100% }` ayni turda SILINDI: o sinif 2026-09-07'den
     beri sablonda yok ve `align-items: center` ile celisiyordu. */
  .ptease-cta { flex-direction: column; align-items: center; }
}

.benefit-cols {
  display: grid; grid-template-columns: 1fr 1fr; gap: 22px;
  margin-top: clamp(30px, 4vw, 46px);
}
.benefit-card {
  padding: var(--sp-md);
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r-lg);
  box-shadow: var(--shadow-sm);
}
.benefit-card h4 { font-size: var(--fs-2xl); margin-bottom: 14px; }
.benefit-card ul { list-style: none; padding: 0; margin: 0; display: grid; gap: 10px; }
.benefit-card ul li {
  display: flex; align-items: flex-start; gap: 10px;
  font-weight: 600; font-size: var(--fs); color: var(--tx2);
}
.benefit-card ul li::before {
  content: "\f00c"; font-family: "Font Awesome 5 Free"; font-weight: 900;
  color: var(--blue-ink); font-size: var(--fs-sm); margin-top: 3px;
}

/* ----------------------------------------------------------------------------
   15) SSS akordeon
---------------------------------------------------------------------------- */
.faq-list { max-width: 780px; margin-inline: auto; display: grid; gap: 14px; }

.faq-item {
  background: var(--card);
  border: 1px solid var(--border);
  border-radius: var(--r);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  transition: border-color var(--t-sm) ease, box-shadow var(--t-sm) ease;
}
.faq-item.is-open { border-color: var(--border-strong); box-shadow: var(--shadow); }

.faq-q {
  width: 100%;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 19px 24px;
  background: transparent; border: 0; cursor: pointer;
  font-family: var(--font-head); font-size: var(--fs-xl); font-weight: 700;
  color: var(--tx1); text-align: left;
}
/* İkon CHEVRON, artı değil (kullanıcı kararı, 2026-09-02) — /sss'in kendi
   panelindeki `.fq-q-ico` ile AYNI ikon ve aynı 180°'lik dönüş; biri değişirse
   ikisi birden değişir. Punto artının `--fs-2xl`inden küçük: chevron dolu bir
   glif, o boyda 30px'lik çipi dolduruyordu. */
.faq-q .ico {
  flex: 0 0 30px; height: 30px;
  display: grid; place-items: center;
  background: var(--blue-ghost); color: var(--blue);
  border-radius: 50%;
  font-size: var(--fs-sm); font-weight: 700;
  transition: transform var(--t) ease, background var(--t-sm) ease, color var(--t-sm) ease;
}
.faq-item.is-open .faq-q .ico { transform: rotate(180deg); background: var(--blue); color: #fff; }

.faq-a { max-height: 0; overflow: hidden; transition: max-height var(--t) ease; }
.faq-a p { padding: 0 24px 20px; margin: 0; font-size: var(--fs-lg); }
/* CEVABIN ALTINDAKİ BAĞLANTI (2026-09-04) — /sss'teki `.fq-a-link`in ortak
   makrodaki karşılığı, ölçüleri oradan: 44px dokunma hedefi (WCAG 2.5.8) ve
   altı çizili, çünkü bu bir bağlantı, buton değil. Üstündeki `<p>`nin alt
   dolgusu link varken kısılır, yoksa cevapla bağlantı arasında iki boşluk
   üst üste biner. Kırpma `.faq-a`da olduğu için kapalı kutuda link de
   erişilemez (kutu zaten `inert`). */
.faq-a p:has(+ .faq-a-link) { padding-bottom: 4px; }
.faq-a-link {
  display: flex; width: fit-content; align-items: center; gap: 8px;
  min-height: 44px; margin: 0 24px; padding-bottom: 10px;
  color: var(--blue-ink);
  font-family: var(--font-head); font-weight: 800; font-size: var(--fs);
  text-decoration: underline; text-underline-offset: 3px;
}
.faq-a-link:hover { text-decoration-thickness: 2px; }
.faq-a-link i { font-size: var(--fs-xs); }

/* ANA SAYFANIN SSS ÖZETİ İKİ KOLON (2026-08-30, konsey kararı 4 — ritmi kıran
   üç bölümden üçüncüsü). Solda başlık + "hepsini gör", sağda sorular; etiket
   çipi yok. Yalnız ANA SAYFA: /fiyatlandirma'nın abonelik SSS'i aynı makroyu
   tek kolonda çağırmaya devam ediyor, o yüzden kurallar `.faq-two` kapsamında
   ve `.faq-list`in kendi tabanına dokunulmuyor.

   ÜÇ AYRINTI YÜK TAŞIYOR:
   • `.faq-list`in `max-width: 780px` + `margin-inline: auto`su BURADA
     sıfırlanmak zorunda — kolon zaten dar, ortalanmış bir liste sağ kolonun
     içinde ikinci kez daralıp soluna boşluk bırakıyordu.
   • Sol kolon YAPIŞKAN DEĞİL. `/sss`in sol kolonu sticky çünkü orada yedi
     soru bir ekrandan uzun; burada dört soru var ve kolon zaten onlardan
     kısa — yapışacak yol yok, kural yalnız ölü ağırlık olurdu.
   • Başlık bu bölümde `.sec-title`ın taban ölçüsünde KALIR: duvarın büyük
     başlığı sayfada TEK olmalı, ikincisi onu "vurgu" olmaktan çıkarır. */
/* İKİ KOLON 2026-09-07'DE TEK KOLONA DÖNDÜ (kullanıcı kararı) ve yukarıdaki
   üç ayrıntının ikisi düştü, biri kaldı:
   • sol kolonun sticky OLMAMA gerekçesi konusuzlaştı (kolon yok);
   • `.faq-list`in ortalanması artık İSTENEN şey — liste bölümün kendi ekseninde
     duruyor, yalnız tavanı bir kademe geniş (780 → 1040px): dört soru dar bir
     kolonda "yan sütun" gibi okunuyordu;
   • başlığın `.sec-title` ölçüsünde KALMASI kuralı aynen geçerli — duvarın
     büyük başlığı sayfada tek. */
.faq-two { display: block; }
.faq-two-head {
  display: flex; flex-wrap: wrap;
  align-items: center; justify-content: center;
  gap: 8px 14px;
  max-width: none; margin: 0 auto clamp(20px, 2.8vw, 32px);
  text-align: center;
}
/* ROZETİN İÇİNDEKİ ŞEY BAŞLIĞIN KENDİSİ, o yüzden rozet ailesinin üç
   tipografi kuralı burada geri alınır: punto h2'den MİRAS (`inherit`), büyük
   harf yok, harf aralığı başlığınki. Kalanlar aynı: ghost pil, kenar, `»`.
   Ok bir kademe küçük (`.7em`) ve aksan renginde — başlık mürekkebiyle aynı
   boyda bir `»` başlığın parçası gibi okunuyordu. */
.faq-two-more {
  /* PUNTO BAŞLIĞIN YARISI (2026-09-07, kullanıcı kararı). `inherit` ile pil
     h2'nin tam ölçüsündeydi ve bölümün başlığı bir düğmenin içinde ekranın
     yarısını kaplıyordu; yarıya inince pil hâlâ başlık gibi okunuyor ama
     satırın kendisi kadar yer tutuyor. */
  font-size: .5em; font-weight: inherit;
  text-transform: none; letter-spacing: -.01em;
  color: var(--tx1);
  gap: 14px; padding: 8px 20px;
}
.faq-two-more::after { font-size: .9em; }
/* SÜS ÇİZGİLERİ YALNIZ BURADA KAPALI (2026-09-07, kullanıcı kararı): bir üstteki
   bölümün düğmesi de onları taşıyor ve iki süs arka arkaya gelince tekrar
   okunuyordu. Öteki düğmelerde duruyor. */
.faq-two-more::before { content: none; }
.faq-two .faq-list { max-width: 1040px; margin-inline: auto; }

/* ----------------------------------------------------------------------------
   16) Kapanış CTA'sı — TEK KUTU, her sayfada birebir aynı
   HTML `Macros.html: ctaBand`; sayfa sonu artık tek yerden gelir.

   Bir dönem burası tam genişlikte KOYU MAVİ bir banttı (gradyan zemin, iki
   dekoratif halka, beyaz metin, dolu koyu store rozetleri) ve Özellikler
   sayfası kendi açık mavi kutusunu ayrıca yazıyordu: aynı işi yapan iki farklı kapanış,
   iki farklı görsel dil. Bugün ikisi de bu kutu (kullanıcı kararı, 2026-08-24).
   Kararın özü: sayfa zeminine binen ikinci bir KENARDAN KENARA yüzey, sitenin
   "tek tasarım diliyle yapılmış" hissini tek başına bozuyordu. Bant geri
   geldiğinde hiçbir şey hata vermez — yalnız sayfa sonu siteden kopar.

   Pazarlama banner'ı DEĞİL: dev yazı, gradyan ve dekoratif leke yok; ağırlığı
   maskot + tek başlık + TEK eylem taşır.
---------------------------------------------------------------------------- */
/* CTA'nın ETRAFINDAKİ boşluk TEK yerden gelir.
   - Üstte: bölümün kendi dolgusu (~52–72px). Bir önceki bölümün alt dolgusu
     buna EKLENMEZ — ikisi toplandığında ~134px ediyor ve CTA sayfadan kopmuş
     gibi duruyordu; o yüzden komşusu `:has()` ile sıfırlanır.
   - Altta: hiç dolgu yok, boşluğu `.foot`un kendi `margin-top`u verir.
   İkisi de `.section` ile AYNI özgüllükte olamaz: §24'teki mobil
   `.section { padding: 44px 0 }` dosyada sonra geldiği için ikisini birden
   geri veriyordu. Bileşik seçici (0,2,0) o yüzden zorunlu. */
.section.cta-sec { padding-block: var(--sec-pad) 0; }
.section:has(+ .cta-sec) { padding-bottom: 0; }

.cta-box {
  /* Container'dan (1180px) bilerek DAR: maskot + kopya iki kolona yayılınca
     formun (max 480px) sağında ~300px ölü alan kalıyor ve satır "ferah" değil
     dengesiz okunuyor — Özellikler'deki zigzag satırlarının aynı tuzağı. */
  max-width: 1000px; margin-inline: auto;
  /* `relative` kapanış sticker'ı için (kit kuralı: köşeye, kenardan taşarak
     vurulur) — maskot zaten serbest dolaştığından kırpma yok. */
  position: relative;
  padding: clamp(26px, 3.4vw, 44px) clamp(22px, 4vw, 52px);
  border-radius: var(--r-xl);
  /* Tint KART yüzeyinden karılır, sayfa zemininden değil: kremin (#FDFAF6)
     içine mavi karıştırmak kutuyu gri gösteriyordu — istenen şey serin ve temiz
     bir yüzey, kirli bir gri değil.
     Karışım OKLCH'de, sRGB'de DEĞİL (kullanıcı kararı, 2026-08-24): sRGB'de
     beyaza doğru karışan mavi chroma'sını kaybedip griye kaçıyor (%7 → #F0F7FE,
     soluk ve klinik). OKLCH açık uçta chroma'yı koruduğu için aynı token daha
     temiz bir gök mavisi verir ve maskotun sıcak sarısı üstünde oturur.
     `in oklch` düşerse color-mix'in tamamı geçersiz olur ve kutu ZEMİNSİZ
     kalır — sözdizimi bozulursa fark edilir, sessizce eski renge dönmez.
     %12 BİR TAVANDIR, keyfî değil: sonuç #E7F2FF ve üstündeki gövde metni
     (`--tx2` #5B6B92) 4.68:1 — AA sınırının yalnız 0.18 üstünde. Tinti
     koyulaştıran biri hiçbir hata almaz, yalnız metin AA'nın altına düşer. */
  background: color-mix(in oklch, var(--blue) 12%, var(--card-solid));
  border: 1px solid color-mix(in srgb, var(--blue) 18%, var(--border));
  box-shadow: var(--shadow);

  display: grid; gap: clamp(14px, 3vw, 40px);
  align-items: center; justify-items: center;
  text-align: center;
}
/* Koyu temada karışım da OKLCH — iki tema iki farklı renk uzayında karışırsa
   biri diğerinin karşılığı olmaktan çıkar. Oran daha yüksek: koyu lacivert
   (#081E49) zeminde %12 kutuyu sayfadan ayırmaya yetmiyor. */
/* Taban `--card-solid` DEĞİL `--cta-surface`: kart ailesi 2026-08-26'da nötr
   lacivere çekilirken kapanış kutusu bilerek dışarıda bırakıldı, yani yüzey
   eski gece zemininden okunmaya devam ediyor. `--card-solid`e bağlansaydı
   kutu da onunla birlikte kayardı. /sss'in .fq-help'i ve /iletisim'in
   .cx-team'i aynı değeri aynı token'dan alır. */
[data-theme="dark"] .cta-box { background: color-mix(in oklch, var(--blue) 20%, var(--cta-surface)); }

/* Kapanış sticker'ı: kutunun SAĞ ÜST köşesine, kenardan taşıp vurulur.
   `top: -16px` → yüksekliğinin ~üçte biri kutunun içinde, "yapıştırılmış
   etiket" okunur; kopya padding'in altından başladığından çakışmaz. Sayı ve
   etiket hero sticker'ının KENDİ anahtarlarından gelir (`hero_trust_num` /
   `hero_trust_count`): aynı veri, aynı yazım, ikinci bir kaynak yok.
   Mobilde (<560px) bir kademe daha yukarı: maskot tek kolonda kutunun
   tepesinde ve ORTADA duruyor — sticker'ın kutuya sarkan ~16px'i onun başına
   değmesin diye. `aria-hidden`: sayı hero'da zaten okunuyor. */
.cta-box .sticker { top: -16px; right: clamp(18px, 4vw, 44px); }
@media (max-width: 559px) {
  .cta-box .sticker { top: -30px; right: 12px; }
}

/* Maskot SERBEST durur: kutu/kenarlık yok, derinliği yalnız drop-shadow verir
   (sitenin her yerindeki maskot kuralı). Eski hâli 88px'lik beyaz bir kutunun
   içinde, süzülen bir ikon gibiydi. */
.cta-art img {
  width: min(190px, 46vw); height: auto;
  filter: drop-shadow(0 16px 26px rgba(60, 45, 32, .22));
}
[data-theme="dark"] .cta-art img { filter: drop-shadow(0 18px 30px rgba(0, 0, 0, .5)); }

.cta-copy { width: 100%; display: grid; justify-items: center; }
/* Başlığın ALTINDA ARTIK CÜMLE YOK (2026-09-05, gerekçe Macros.html): 8px, kaybolan alt cümlenin kendi üst boşluğuna yaslanıyordu — başlıktan sonra doğrudan form geldiği için pay onun yerini alır. */
.cta-copy h2 { margin: 0 0 clamp(14px, 2vw, 20px); font-size: clamp(1.55rem, 3.2vw, 2.4rem); }
/* 46ch DUL KELİME bırakıyordu: 1440'ta kopya kolonu 624px ama 46ch yalnız
   468px'e izin veriyor, cümle ise tek satır için 477px (TR) / 514px (EN)
   istiyor — yani cümlenin son kelimesi dokuz piksel yüzünden tek başına alt
   satıra düşüyordu. 56ch (~570px) ikisini de tek satıra alır ve hâlâ kolonun
   içinde kalır. */
/* SEÇİCİ `p` DEĞİL `.wl-sub` (2026-09-05, ikinci tur). Kural kapanışın alt
   cümlesi için yazılmıştı; o cümle silinince geriye `.cta-copy` içindeki
   FORM paragrafları kaldı ve `.cta-copy p` ikisini birden boyuyordu — kendi
   sınıflarından daha spesifik olduğu için `.wl-legal`in `--fs-sm`ini de
   eziyor, gizlilik satırı hemen üstündeki onay metninin iki katı puntoda
   duruyordu (kullanıcı bildirimi, ekran görüntüsüyle). Daraltma iki satırı
   ayırır: teşvik satırı (`.wl-sub`) kapanışta büyük kalır, hukuk satırı
   onay metniyle aynı ölçüye döner. Genel `p` seçicisine geri dönen kişi
   `.wl-legal`i ikinci kez büyütmüş olur. */
.cta-copy .wl-sub { margin: 0 0 clamp(14px, 2vw, 22px); color: var(--tx2); font-size: var(--fs-xl); max-width: 56ch; }
/* Kolonun daraldığı yerde (768px'te kopya kolonu 474px) cümle yine sarar;
   `balance` o zaman iki satırı EŞİT böler, tek kelimelik kuyruk bırakmaz.
   Aynı kural mobilde başlığın kuyruğunu da toplar. Desteklemeyen tarayıcıda
   sessizce düşer ve bugünkü davranış kalır. */
.cta-copy h2, .cta-copy .wl-sub { text-wrap: balance; }

/* Store rozetleri İKİNCİL: formun altında, küçük ve — açık zeminde — hayalet.
   Dolu koyu iki blok mavi gönder butonuyla neredeyse aynı ağırlıkta okunur;
   aynı gerekçe hero'da `.hero-soon` için de geçerli (bkz. §18b). Ölçüler formun
   kolonuyla birebir aynı (max 480px, nowrap, 10px): değişen yalnız açık zemine
   ait dolgu/kenar, boyut değil. */
.cta-box .store-row {
  width: 100%; max-width: 480px; margin-top: 18px;
  flex-wrap: nowrap; gap: 10px;
}
.cta-box .store-btn { flex: 1 1 0; min-width: 0; justify-content: center; }
.cta-box .store-btn.is-soon {
  background: var(--card);
  color: var(--tx2) !important;   /* `.store-btn`in beyazı da !important */
  border: 1.5px dashed var(--border-strong);
  box-shadow: none;
}

@media (min-width: 768px) {
  /* Maskot solda, kopya sağda ve SOLA yaslı. Kutunun kendisi ortalanmış ve dar;
     içindeki kopyanın da ortalanması maskotu tek başına sola iten dengesiz bir
     düzen bırakıyordu. */
  .cta-box {
    grid-template-columns: auto minmax(0, 1fr);
    justify-items: start; text-align: left;
  }
  .cta-art img { width: min(230px, 22vw); }
  .cta-copy { justify-items: start; }
}

/* LACİVERT KAPANIŞ VARYANTI (`cta-box--navy`) BURADAN SİLİNDİ, 2026-08-25.
   /fiyatlandirma birkaç saat tam genişlikte lacivert bir bantla kapandı —
   gerekçesi "karar sayfasının kapanışı sayfanın en ağır bloğu olmalı"ydı — ve
   aynı gün geri alındı (kullanıcı kararı): kapanış maskotuyla birlikte diğer
   sayfalarla BİREBİR aynı kalır, sayfalar arasında yalnız kopya değişir.
   Yukarıdaki "tam genişlik bant YASAK" kuralının artık istisnası yok. */

/* ----------------------------------------------------------------------------
   17) Alt sayfa hero'su
---------------------------------------------------------------------------- */
.page-hero {
  position: relative;
  /* İlk-ekran denetimi (2026-08-30): üst clamp 36/6vw/72 → 22/3.6vw/44, alt
     30/5vw/56 → 22/3.4vw/40. 1440×900'de hero tepesi navbarın dibinden
     148px sonra başlıyordu (76 + 72); ortalamalı dar kolonla birleşince
     alt sayfaların ilk ekranı seyrek okunuyordu. `--nav-h` hâlâ dahil —
     navbar fixed, o kural değişmedi. */
  padding: calc(var(--nav-h) + clamp(22px, 3.6vw, 44px)) 0 clamp(22px, 3.4vw, 40px);
  text-align: center;
  overflow: clip;
}
.page-hero .container { max-width: 800px; }
.page-hero h1 { font-size: clamp(2rem, 4.6vw, 3.2rem); letter-spacing: -.02em; }
/* pretty: hero alt metni de ortalanmış — "…yaptığımızın kısa / hikâyesi."
   gibi dul kelimeleri engeller (bkz. §3 `.sec-sub`). */
.page-hero p { font-size: var(--fs-2xl); max-width: 38em; margin-inline: auto; text-wrap: pretty; }

/* Kategori detay hero — kategori rengi artık yalnız emoji kutusu + aksanlarda
   (blob ışımaları kaldırıldı). */
.page-hero--cat .cat-hero-emoji {
  width: 96px; height: 96px; margin: 0 auto 18px;
  display: grid; place-items: center;
  font-size: 3rem;
  background: color-mix(in srgb, var(--cat) 14%, transparent);
  border: 2px solid color-mix(in srgb, var(--cat) 30%, transparent);
  border-radius: var(--r-xl);
  animation: bounceIn .6s ease both;
}
/* Kategori hero kutusunda büyük illüstrasyon (WebP, şeffaf zemin) */
.page-hero--cat .cat-hero-emoji--img img { width: 78%; height: 78%; object-fit: contain; display: block; filter: drop-shadow(0 3px 6px rgba(0,0,0,.2)); }
.page-hero--cat .eyebrow {
  /* Cam pilin dört katmanı da kategori rengine döner — `--ec` yazılmazsa
     kenar/zemin kategoriye, HALE tabandaki maviye kalırdı. */
  --ec: var(--cat);
  color: color-mix(in srgb, var(--cat) 80%, var(--tx1));
  background: color-mix(in srgb, var(--cat) 10%, transparent);
  border-color: color-mix(in srgb, var(--cat) 25%, transparent);
}

/* Güvenli kullanım notu (Uyku sayfası) — sakin, bilgilendirici kart */
.safety-note {
  display: flex; gap: 14px; align-items: flex-start;
  padding: 18px 22px;
  border-radius: var(--r);
  /* SARI, yeşil değil (2026-09-02, kullanıcı kararı). Blok bir onay değil bir
     SINIR anlatıyor ("tıbbi bir çözüm değildir"); yeşil "her şey yolunda"
     diyordu, kehribar "dikkat et" diyor — ve /uyku'nun gece paletiyle de aynı
     bandda. Tek kullanıcısı /uyku, ama kural burada: başka bir sayfa
     `.safety-note` kullanırsa aynı anlamı taşımalı. */
  background: rgba(245,165,30,.10);
  border: 1px solid rgba(245,165,30,.34);
}
.safety-note-ico { color: #B45309; font-size: var(--fs-xl); margin-top: 2px; }
.safety-note b { font-family: var(--font-head); font-size: var(--fs-lg); color: var(--tx1); }
.safety-note ul { margin: 8px 0 0; padding-left: 18px; color: var(--tx2); font-size: var(--fs); }
.safety-note li + li { margin-top: 4px; }
[data-theme="dark"] .safety-note { background: rgba(245,165,30,.09); border-color: rgba(245,165,30,.26); }
[data-theme="dark"] .safety-note-ico { color: #F5A51E; }

/* ----------------------------------------------------------------------------
   18) İletişim — BU BÖLÜM SAYFAYA ÖZEL DOSYAYA TAŞINDI

   `.contact-grid` / `.contact-form` / `.form-*` kuralları 2026-08-25'te
   `Css/Site/Contact.css`e geçti (Features/Categories/Growth/Sleep/Pricing/Faq
   deseni). Site.css HER SAYFAYA iner; yalnız /iletisim'de geçen kurallar her
   ziyaretçiye inen ölü ağırlıktı. Buraya `.cx-*` kuralı GERİ EKLENMEZ —
   kapsam ayrı kaldığı sürece o sayfa başka bir sayfada gerileme yaratamaz.
---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
   18b) Waitlist (lansman e-posta kaydı) — sitenin birincil dönüşümü
   Form sitede İKİ yerde durur, ikisi de AÇIK zeminde: hero ve kapanış CTA'sı
   (§16). Koyu zemin çeşidi (`.wl--on-dark`) CTA bandıyla birlikte kaldırıldı —
   dönüşünde tek kullanıcısı olmayan bir varyantı canlı tutmak, üstelik ikinci
   bir görsel dil demekti.
---------------------------------------------------------------------------- */
.wl { width: 100%; max-width: 480px; }

.wl-label {
  display: block; margin-bottom: 10px;
  font-family: var(--font-head); font-weight: 800;
  font-size: clamp(1.02rem, 2vw, 1.18rem); color: var(--tx1);
}
.wl-label-ico { color: var(--blue-ink); margin-right: 4px; }
/* Form teşvik satırı — listeye özel %50 (uygulamada herkese %40) */
.wl-sub { margin: -4px 0 10px; font-size: var(--fs-md); font-weight: 600; color: var(--tx2); }
/* %50 VURGUSU (2026-09-06): sarı köşe etiketinin (`.hero-deal`, mezar taşı
   §18b) yerine kampanyanın çekirdeği CÜMLENİN İÇİNDE parlar — h1'in sarı
   el-çizimi vuruşunun küçük kardeşi (aynı SVG, alçak boy). İbare kopyaya
   HTML olarak yazılmaz; sarmayı `|clauses(t.wl_sub_mark)` yapar
   (Typography.py), yani vurgu makronun bastığı HER formda aynı (hero
   paneli + kapanış kutuları — kampanya tek görsel dille anılır). Mürekkep
   `--tx1`: vurgunun yükünü ağırlık + vuruş taşır, renk değil; vuruş
   dekoratiftir, düşerse metin aynen okunur. inline-block: vuruş ibarenin
   kendi kutusuna göre ölçülür ve ibare satır sarmasında bölünmez. */
.wl-mark { position: relative; display: inline-block; font-weight: 800; color: var(--tx1); }
/* MEZAR TAŞI (2026-09-06, aynı gün): `.wl-mark::after` — ibarenin altındaki
   6px sarı el-çizimi vuruş (h1 çizgisinin küçük kardeşi, data-URI SVG,
   %23EDAE33). Doğduğu gün kullanıcı kaldırttı ("%50 indirim yazısının
   altındaki çizgiyi de kaldır"): sarı etiket + sarı çizgi aynı kampanyanın
   iki süsüydü, etiket ölünce çizgi tek başına da fazla geldi. Vurgunun
   yükünü zaten ağırlık taşıyordu (üstteki not: "vuruş dekoratiftir,
   düşerse metin aynen okunur") — kalın mürekkep kaldı, süs gitti. Geri
   isteyen bu kaydı ve Home-Hero.md 2026-09-06 bölümünü okur. */
.wl-row { display: flex; gap: 10px; flex-wrap: wrap; }

/* ONAY KUTUSU + AYDINLATMA SATIRI (2026-09-04, hukuki denetim).
   Kutu ÖN İŞARETSİZ ve GERÇEK bir <input type=checkbox>: özel çizilmiş bir
   kutu klavye ve ekran okuyucu davranışını yeniden yazmak zorunda kalırdı ve
   bir onay kutusunun hukuki değeri tam olarak "kişinin kendisinin işaretlemiş
   olması"ndan geliyor — burada taklit etmenin kazancı yok.

   `align-items: start` ZORUNLU: metin iki satıra sardığında `center` kutuyu
   satırların ortasına indirip ilk satırla hizasını bozuyordu.
   `accent-color` ile marka rengi: tarayıcının kendi kutusu korunur, yalnız
   dolgusu boyanır — sıfır ekstra DOM.
   Punto `--fs-sm`den KÜÇÜK YAPILMAZ: okunmayan bir onay metni, alınmamış
   onaydır; küçültme isteği gelirse cevap "kısalt", "küçült" değil. */
.wl-consent {
  display: flex; align-items: start; gap: 10px;
  margin: 12px 0 0;
  font-size: var(--fs-sm); line-height: 1.5; color: var(--tx2);
  cursor: pointer;
}
/* KUTU 2026-09-05'TE KENDİMİZ ÇİZİLİR OLDU, ve sebebi renk değil ÖRTÜLEBİLİRLİK.
   `accent-color` yalnız İŞARETLİ hâli boyuyordu; işaretsiz kutunun zeminini
   tarayıcı çiziyordu ve Chrome, formu otomatik doldurduğunda o zemini kendi
   autofill vurgusuyla — koyu temada hardal-kahve — boyayıp bırakıyordu.
   `::selection` altındaki genel autofill kuralı buna yetmez: yerel widget
   çizimi `box-shadow`un ÜSTÜNDE, yani örtü kutuya hiç değmiyordu. `appearance:
   none` çizimi bize geçirir ve örtü çalışır.

   INPUT HÂLÂ GERÇEK BİR `<input type=checkbox>` — yukarıdaki hukuki gerekçe
   aynen duruyor. Değişen yalnız BOYAMA: klavye, `required` doğrulaması, ekran
   okuyucu rolü ve `:checked` durumu tarayıcının kendisinde kalıyor; tik bir
   `::before` (clip-path), div taklidi değil. */
.wl-consent input {
  flex: none; width: 18px; height: 18px; margin: 1px 0 0;
  appearance: none; -webkit-appearance: none;
  display: grid; place-content: center;
  border: 1.5px solid var(--border-strong);
  border-radius: 5px;
  background: var(--card-solid, #fff);
  /* Autofill örtüsü: zemini `background` ile ezmek mümkün değil (UA !important). */
  box-shadow: inset 0 0 0 100px var(--card-solid, #fff);
  cursor: pointer;
  transition: box-shadow var(--t-sm) ease, border-color var(--t-sm) ease;
}
.wl-consent input::before {
  content: ""; width: 11px; height: 11px;
  background: #FFF;
  clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);
  transform: scale(0);
  transition: transform var(--t-sm) ease;
}
.wl-consent input:hover { border-color: var(--btn-tx); }
.wl-consent input:checked {
  border-color: var(--blue);
  box-shadow: inset 0 0 0 100px var(--blue);
}
.wl-consent input:checked::before { transform: scale(1); }
.wl-consent input:focus-visible { outline: 3px solid var(--btn-tx); outline-offset: 2px; }
/* Onay kutusu satırıyla (.wl-consent) AYNI punto ve satır yüksekliği —
   metin artık tek satırda kaldığı için (form_privacy_note kısaltıldı) ikisi
   göz hizasında aynı boyda okunuyor; `line-height` eskiden gövdenin
   varsayılanına düşüyordu ve iki satıra döküldüğünde üstündeki satırdan daha
   "büyük" bir blok gibi görünüyordu. */
.wl-legal { margin: 8px 0 0; font-size: var(--fs-sm); line-height: 1.5; color: var(--tx2); }
.wl-legal a { color: inherit; text-decoration: underline; }
.wl-legal a:hover { color: var(--blue-ink); }
.wl-input {
  flex: 1 1 200px; min-width: 0;
  padding: 14px 18px;
  font-family: var(--font-body); font-size: var(--fs-lg);
  color: var(--tx1);
  background: var(--card-solid, #fff);
  border: 1.5px solid var(--border-strong);
  border-radius: var(--r-full);
  transition: border-color var(--t-sm) ease, box-shadow var(--t-sm) ease;
}
.wl-input::placeholder { color: var(--tx3); }
.wl-input:focus {
  outline: none;
  border-color: var(--btn-tx);
  --ring-c: var(--btn-tx);
  box-shadow: var(--ring);
}
/* Buton biraz kompakt: 480px'lik satıra input (260) + buton (~200) +
   10px gap rahat sığar; eski 28px dolgu butonu şişirip input'u eziyordu. */
.wl-btn { flex: 0 0 auto; white-space: nowrap; padding-inline: 20px; }
.wl-privacy { margin: 11px 0 0; font-size: var(--fs-sm); color: var(--tx3); }

.wl-msg {
  padding: 13px 18px; margin-bottom: 14px;
  border-radius: var(--r-sm);
  font-weight: 700; font-size: var(--fs); line-height: 1.45;
}
.wl-msg--ok  { background: rgba(35,195,140,.12); border: 1.5px solid rgba(35,195,140,.4); color: var(--tx1); }
.wl-msg--err { background: rgba(255,107,107,.12); border: 1.5px solid rgba(255,107,107,.4); color: var(--tx1); }

/* Kapanış CTA'sındaki rozetler de formun 480px kolonunu paylaşır — kuralları
   kutunun kendi bölümünde (§16), zemin/kenar ayarlarının yanında. */

/* Hero: pasif "çok yakında" store rozetleri waitlist'in ALTINDA, ikincil.
   Formun sol kenarıyla hizalı (üstteki .hero-cta kuralı bunu sağlar),
   küçük boyutta ve hafif kısık opaklıkla "ikincil" hiyerarşisini korur.
   Rozetler formla AYNI ızgaraya oturur: blok formun 480px'ini alır, iki rozet
   eşit sütun (flex-basis 0) ve form satırıyla aynı 10px boşluk ile bölüşür —
   böylece sol kenar input'la, sağ kenar gönder butonuyla hizalanır; içerik
   uzunluğuna göre farklı genişlikte durup sağ kenarı tırtıklamazlar. */
/* KOLON FORMUNKİNDEN DAR (480 → 400px, 2026-08-26 kullanıcı kararı: "biraz
   küçült, CTA ile yarışmasınlar"). Eskiden formun 480px'ini birebir paylaşıyor
   ve sağ kenarları gönder butonuyla hizalanıyordu; iki eşit genişlikte blok,
   üstündeki forma neredeyse aynı ağırlıkta bir ikinci satır veriyordu.
   Bugün SOL kenar hâlâ input'la hizalı — hizanın taşıyıcısı o — ama blok
   belirgin biçimde daha dar ve daha kısa, yani sırası gözle okunuyor.
   Küçültme `is-sm`in ALTINDA bir kademe ve yeni bir makro boyutu açmadan,
   yalnız `.hero-soon` kapsamında yapılır: aynı `is-sm` kapanış kutusunda da
   geçiyor ve orada ölçü doğru (§16) — token'ı büyütmek onu da küçültürdü.
   "Çok Yakında" etiketi DURUYOR: rozetlerin tek işi o durumu söylemek. */
.hero-soon { margin-top: clamp(12px, 2.4vh, 22px); width: 100%; max-width: 400px; }
.hero-soon .store-row { flex-wrap: nowrap; gap: 9px; }
.hero-soon .store-btn {
  flex: 1 1 0; min-width: 0; justify-content: center;
  gap: 8px; padding: 7px 12px;
}
.hero-soon .store-btn svg { width: 18px; height: 18px; }
.hero-soon .store-btn i { font-size: 16px; }
.hero-soon .store-tx strong { font-size: var(--fs-sm); }
.hero-soon .store-tx small { font-size: var(--fs-3xs); }

/* HERO'DA ROZETLER GHOST, dolu değil. Koyu gri iki blok, mavi CTA butonunun
   hemen altında ve onunla neredeyse aynı görsel ağırlıkta duruyordu: hero'nun
   alt yarısı üst üste ÜÇ dolu düğme olarak okunuyordu ve "sıkışık" hissinin
   büyük kısmı boşluk azlığından değil, o blok yığınından geliyordu.
   Bunlar pasif rozet — tıklanacak bir şey yok, mağaza linki daha doğmadı
   (SITE.appStoreUrl/googlePlayUrl None) — ve hiyerarşide en alttalar; ağırlık
   da öyle olmalı. Hiyerarşi artık opaklık kısarak değil (eski `opacity: .92`,
   metni de soluklaştırıyordu) ZEMİN kaldırılarak veriliyor.
   Kapsam `.hero-soon`: aynı hayalet muamele kapanış kutusunda da var (§16,
   kendi kuralıyla) ama FOOTER'daki rozetler koyu lacivert zemin üstünde
   duruyor, orada dolu hâlleri doğru — bu kural oraya sızmamalı.
   `color` !important, çünkü `.store-btn`in beyazı da !important. */
.hero-soon .store-btn.is-soon {
  background: var(--card);
  color: var(--tx2) !important;
  border: 1.5px dashed var(--border-strong);
  outline: none;
  box-shadow: none;
}

@media (max-width: 560px) {
  .wl-row { flex-direction: column; }
  /* Column yönlü flex'te .wl-input'un flex-basis'i YÜKSEKLİĞE dönüşür
     (260px uzunluklu dev input) — dikeyde esnemeyi kapat. */
  .wl-input { flex: 0 0 auto; }
  .wl-btn { width: 100%; }
}

/* ----------------------------------------------------------------------------
   18c) "Etkinlik Öner" — BU BÖLÜM DE SAYFAYA ÖZEL DOSYAYA TAŞINDI

   `.sg*` ailesi ve iletişim sayfasının `.aside-*` yan kartları 2026-08-25'te
   silindi: sayfa tek bir iletişim sahnesine indirildi, fikir formu artık
   "Ne için yazıyorsun?" seçicisinin ikinci yüzü ve kuralları
   `Css/Site/Contact.css`te. Yan kart yığını da (`.aside-stack`) o düzenle
   birlikte gitti — yerini iki bağlantı satırı + maskotlu güven notu aldı.
---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
   19) Yasal sayfalar
---------------------------------------------------------------------------- */
.legal { max-width: 820px; margin-inline: auto; }
.legal-body { padding: clamp(26px, 3.6vw, 44px); }
.legal-body h2 { font-size: var(--fs-3xl); margin: 1.6em 0 .5em; }
.legal-body h2:first-of-type { margin-top: 0; }
.legal-body ul { color: var(--tx2); }
.legal-updated { color: var(--tx3); font-size: var(--fs); font-weight: 700; }

/* ----------------------------------------------------------------------------
   20) 404 — MASKOT ANI: kayıp sayfayı arayan Kidlio (2026-08-29, kullanıcı
       isteği — frontend-design önerisi 4). Eskisi dev gradyan "404" + küçük
       ikondu; sayfanın en kolay akılda kalıcı anı buralı ve markanın
       sıcaklığını hataya taşıyor. Üç karar:
       - Dev gradyan sayı GİTTİ, yerinde eyebrow çipi ("404 · Sayfa kayıp"):
         gradyan metin şablonun en "hazır tema" öğesiydi ve numarayı çip de
         aynı iyi taşıyor.
       - Maskot BÜYÜK ve SERBEST (sitenin maskot kuralı: kutu/kenar yok,
         derinlik yalnız drop-shadow), hafif eğimli; yanı sıra yüzen bir
         BÜYÜTEÇ rozeti (fa-search) — "Kidlio arıyor" tek bakışta okunur.
         Rozet ayrı bir süzülmede, maskotla TERS FAZDA: ikisi aynı fazda
         oynarsa rozet maskota yapışık bir parça gibi durur.
       - Kopya SiteContent'te (nf_badge/nf_title/nf_text), cümle |clauses.
---------------------------------------------------------------------------- */
.nf {
  min-height: calc(100vh - var(--nav-h));
  display: grid; place-items: center;
  text-align: center;
  padding: calc(var(--nav-h) + 40px) 20px 60px;
}
.nf-mascot {
  position: relative;
  width: min(230px, 46vw);
  margin: 0 auto 10px;
  animation: orbFloat 4s ease-in-out infinite;
}
.nf-mascot img {
  width: 100%; height: auto;
  rotate: 4deg;
  filter: drop-shadow(0 16px 26px rgba(60, 45, 32, .22));
}
[data-theme="dark"] .nf-mascot img { filter: drop-shadow(0 18px 30px rgba(0, 0, 0, .5)); }
/* Büyüteç: `.quick-card .e` coin'in dili — mavi ghost zemin, kılcal kenar,
   okunan mavi glyph; eğimli, kendi süzülmesinde. */
.nf-lens {
  position: absolute;
  top: 4%; right: -8px;
  display: inline-grid; place-items: center;
  width: 52px; height: 52px;
  font-size: 1.25rem;
  background: var(--blue-ghost);
  border: 1px solid var(--border-strong);
  border-radius: 50%;
  box-shadow: var(--glow-sm);
  color: var(--btn-deep);
  rotate: 12deg;
  animation: lensFloat 3.6s ease-in-out infinite;
}
[data-theme="dark"] .nf-lens {
  background: rgba(108, 180, 255, .14);
  color: var(--blue-ink);
}
@keyframes lensFloat {
  0%, 100% { transform: translateY(0) rotate(-3deg); }
  50%      { transform: translateY(-8px) rotate(4deg); }
}
.nf .eyebrow { margin-bottom: 14px; }
.nf h1 { font-size: clamp(1.6rem, 3.6vw, 2.3rem); }
.nf p { max-width: 30em; margin-inline: auto; }

/* ----------------------------------------------------------------------------
   21) Footer
---------------------------------------------------------------------------- */
/* SCROLLBAR SAYFANIN SONUNDA FOOTER'IN RENGİNE DÖNER (kullanıcı, 2026-09-10:
   "/uyku'da kaydırma çubuğu koyu alanda gerçekten koyu oluyor, diğer
   sayfalarda olmuyor").

   BU KURAL /uyku'nun KOPYASI DEĞİL, ve olamazdı. Orada `html`e koşulsuz bir
   gece rengi yazılabiliyor çünkü SAYFANIN KİMLİĞİ gece; burada sayfa krem,
   koyu olan yalnız en alttaki bant. Site geneline koşulsuz gece rayı koymak
   denendi ve ÖLÇÜLDÜ (kompozit ekran görüntüsü, 1440×900): krem ana sayfanın
   sağ kenarında baştan sona duran 15px'lik lacivert bir sütun, çubuğu değil
   sayfanın çerçevesini değiştiriyordu. Ray tek renk olmak zorunda olduğu için
   tek çözüm, /uyku'daki `.nav.is-over-night` ile AYNI fikir: kaydırma
   çubuğunun rengi, ekranı hangi zemin sahipleniyorsa onu izler.

   EŞİK %40, VE "ÇOĞUNLUK" (%50) BİLEREK SEÇİLMEDİ: footer sayfa sonunda
   1024–1920px arası 420-427px, yani 900 yüksekliğinde ekranın %47'si ama 760
   yüksekliğinde %55'i (ölçüldü) — %50'lik bir eşik AYNI pencerede yalnız
   yükseklik değişince davranış değiştirirdi. Ölçülen aralık her genişlikte
   %46–100 olduğu için %40 pratikte tek bir şey demek: "sayfanın sonundasın".

   İki tema da aynı kuralı kullanır çünkü ray zaten `color-scheme`i izliyor;
   izlemediği tek şey footer'ın laciverdiydi. Track token'dan gelir (koyu
   temada #030917), tırnak literal: krem temanın footer'ında 1.93:1 (Chrome'un
   kendi varsayılanı 1.59, /uyku 1.86) — yani tutulabilir bir çubuk.

   JS YOKSA sınıf hiç yazılmaz ve ray bugünkü hâlinde kalır (Site.js, navbar'ın
   `is-scrolled`ıyla aynı `passive` kanca). /uyku'da bu sınıf da düşer ve
   track o sayfanın kendi #0E1737'si yerine #14204A olur — iki lacivert
   arasındaki fark RGB'de (6, 9, 19), yani o sayfanın kararına dokunmuyor. */
html.is-over-foot {
  scrollbar-color: #3A4C8A var(--foot-bg);
}

.foot {
  margin-top: clamp(40px, 7vw, 80px);
  background: var(--foot-bg);
  color: var(--foot-tx);
  border-radius: var(--r-xl) var(--r-xl) 0 0;
  padding: clamp(44px, 6vw, 72px) 0 0;
}

.foot-inner {
  width: min(var(--container), 100% - 40px);
  margin-inline: auto;
  display: grid;
  grid-template-columns: 1.6fr 1fr 1fr 1fr;
  gap: var(--sp-lg);
  padding-bottom: clamp(30px, 4vw, 48px);
}

.foot .nav-brand { color: #fff; }
.foot-tag { color: var(--foot-tx2); font-size: var(--fs); max-width: 30em; margin: 14px 0 20px; }

.foot-col h4 {
  color: #fff; font-size: var(--fs-lg); margin-bottom: 16px;
  letter-spacing: .02em;
}
.foot-col a {
  display: block;
  padding: 5px 0;
  color: var(--foot-tx2);
  font-weight: 600; font-size: var(--fs);
  transition: color var(--t-xs) ease, transform var(--t-xs) ease;
}
.foot-col a:hover { color: #fff; transform: translateX(4px); }

.foot-base {
  border-top: 1px solid rgba(255,255,255,.1);
  padding: 20px 0;
}
.foot-base-inner {
  width: min(var(--container), 100% - 40px);
  margin-inline: auto;
  display: flex; flex-wrap: wrap; gap: 10px;
  align-items: center; justify-content: space-between;
}
.foot-base p { margin: 0; color: var(--foot-tx2); font-size: var(--fs-md); }
.foot-note { font-weight: 700; }

/* Footer store butonları */
.foot .store-btn { background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.14); }
.foot a.store-btn:hover { background: rgba(255,255,255,.14); }

/* ----------------------------------------------------------------------------
   22) Store butonları
---------------------------------------------------------------------------- */
.store-row { display: flex; flex-wrap: wrap; gap: 13px; }

.store-btn {
  display: inline-flex; align-items: center; gap: 11px;
  padding: 11px 22px 11px 17px;
  background: var(--chip-dark);
  color: #fff !important;
  border-radius: var(--r);
  box-shadow: var(--shadow);
  transition: transform var(--t-sm) ease, box-shadow var(--t-sm) ease;
}
a.store-btn:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }

.store-btn svg { width: 26px; height: 26px; flex: none; }
.store-btn i { font-size: 23px; flex: none; line-height: 1; }

.store-tx { display: flex; flex-direction: column; line-height: 1.2; text-align: left; }
.store-tx small { font-size: var(--fs-2xs); font-weight: 600; opacity: .75; letter-spacing: .04em; text-transform: uppercase; }
.store-tx strong { font-family: var(--font-head); font-size: var(--fs-lg); font-weight: 700; }

.store-btn.is-soon {
  background: color-mix(in srgb, var(--chip-dark) 55%, transparent);
  outline: 1.5px dashed rgba(255,255,255,.3);
  outline-offset: -1.5px;
  cursor: default;
}

.store-row.is-sm .store-btn { padding: 9px 17px 9px 13px; border-radius: var(--r); }
.store-row.is-sm .store-btn svg { width: 21px; height: 21px; }
.store-row.is-sm .store-btn i { font-size: 19px; }
.store-row.is-sm .store-tx strong { font-size: var(--fs); }
.store-row.is-sm .store-tx small { font-size: var(--fs-3xs); }

/* ----------------------------------------------------------------------------
   23) Animasyonlar
---------------------------------------------------------------------------- */
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(26px); }
  to   { opacity: 1; transform: none; }
}
@keyframes phoneFloat {
  0%, 100% { translate: 0 0; }
  50%      { translate: 0 -14px; }
}
@keyframes orbFloat {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-11px); }
}
@keyframes moonFloat {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-8px); }
}
@keyframes wiggle {
  0%, 100% { transform: rotate(0); }
  25%      { transform: rotate(-9deg); }
  65%      { transform: rotate(7deg); }
}
@keyframes bounceIn {
  0%   { transform: scale(1); }
  40%  { transform: scale(1.14); }
  70%  { transform: scale(.96); }
  100% { transform: scale(1); }
}
@keyframes twinkle {
  from { opacity: .4; }
  to   { opacity: 1; }
}
@keyframes barGrow {
  from { transform: scaleY(0); }
  to   { transform: scaleY(1); }
}
@keyframes pulseSoft {
  0%, 100% { transform: scale(1); }
  50%      { transform: scale(1.02); }
}
/* Selam güneşinin el sallaması (hero plan ekranı) */
@keyframes psWave {
  0%, 60%, 100% { transform: rotate(0deg); }
  70%  { transform: rotate(16deg); }
  80%  { transform: rotate(-8deg); }
  90%  { transform: rotate(12deg); }
}
@keyframes psTap {
  0%   { opacity: 0; transform: scale(.5); }
  22%  { opacity: 1; transform: scale(1); }
  40%  { transform: scale(.8); }   /* basma anı */
  60%  { transform: scale(1); }
  100% { opacity: 0; transform: scale(1); }
}
@keyframes psTapRipple {
  0%, 38% { opacity: 0; transform: scale(1); }
  46%     { opacity: .9; }
  100%    { opacity: 0; transform: scale(2.2); }
}
@keyframes psOrbPress {
  0%   { transform: scale(1); }
  38%  { transform: scale(.86); }  /* basma anı */
  72%  { transform: scale(1.06); }
  100% { transform: scale(1); }
}
@keyframes psOrbRing {
  0%   { opacity: .85; transform: scale(1); }
  100% { opacity: 0; transform: scale(1.5); }
}
@keyframes psBarGrow {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}
@keyframes confettiDrift {
  from { transform: translateY(0) rotate(0deg); }
  to   { transform: translateY(-8px) rotate(2deg); }
}

/* ----------------------------------------------------------------------------
   B2C micro-touches — marker highlight, warm stat line, trust explainer,
   day-story (Özellikler), hello aside. Yalnız var(--...) token'ları; palet
   değişmez. Hareketler global prefers-reduced-motion bloğuyla (25) kapsanır.
---------------------------------------------------------------------------- */

/* Marker / fosforlu kalem vurgusu — kategori renk token'larıyla, başlık
   kelimelerinin arkasına yumuşak bir şerit. Metin okunur kalır (arka katman). */
.mark {
  position: relative;
  display: inline;
  padding: 0 .06em;
  background-image: linear-gradient(
    120deg,
    color-mix(in srgb, var(--mark-c) 30%, transparent),
    color-mix(in srgb, var(--mark-c) 30%, transparent));
  background-repeat: no-repeat;
  background-position: 0 78%;
  background-size: 100% 42%;
  border-radius: 3px;
}
.mark--0 { --mark-c: var(--cat-oyna); }
.mark--1 { --mark-c: var(--blue); }
.mark--2 { --mark-c: var(--cat-kesfet-deep); }
.mark--3 { --mark-c: var(--cat-dusun-deep); }
[data-theme="dark"] .mark {
  background-image: linear-gradient(
    120deg,
    color-mix(in srgb, var(--mark-c) 42%, transparent),
    color-mix(in srgb, var(--mark-c) 42%, transparent));
}

/* (Sıcak satır / .stat-line kaldırıldı: hero'nun hemen altında tam bir ekran
   boyu yer kaplayıp yalnız "1000+ ekransız etkinlik" diyordu. Sayı artık
   hero'da, telefonun sol üst köşesindeki küçük bilgi kartında — .hero-count.) */

/* Güven açıklayıcısı — içerik nasıl hazırlanır (maskot köşede + 3 rozet) */
.trust-explain {
  position: relative;
  display: grid;
  grid-template-columns: 1.35fr .9fr;
  gap: var(--sp-lg);
  align-items: center;
  padding: clamp(30px, 4vw, 52px);
  /* overflow: hidden YOK — bilerek. Maskot kartın ÜST kenarından taşarak
     bakıyor; kırpma açıkken süzülme (orbFloat) yukarı fazında kartın altında
     kayboluyordu. Kartın içinde taşan başka bir şey yok, kırpmaya gerek de. */
}
/* Maskot KUTUDA DEĞİL: zemin/kenarlık/gölge kutusu kaldırıldı, maskot serbest
   duruyor (steps-mascot ile aynı dil) — derinliği yalnız drop-shadow veriyor.
   Kartın üstünde durduğu için orbFloat'ın -11px'lik yukarı fazı da görünür
   kalır; taşma payı `top` içinde hesaba katılı. */
.trust-explain-kido {
  position: absolute; z-index: 2;
  top: clamp(-66px, -5.5vw, -44px); right: clamp(16px, 3.5vw, 42px);
  width: clamp(74px, 9vw, 108px); height: clamp(74px, 9vw, 108px);
  display: grid; place-items: center;
  pointer-events: none;
  animation: orbFloat 6s ease-in-out infinite;
}
.trust-explain-kido img {
  width: 100%; height: 100%; object-fit: contain;
  filter: drop-shadow(0 8px 14px rgba(36, 55, 105, .24));
}
.trust-explain-copy h2 { font-size: clamp(1.5rem, 3vw, 2.1rem); }
.trust-explain-copy p { margin: 0; font-size: var(--fs-xl); }
/* --- Sağ kolon: ÜÇ AŞAMALI SÜREÇ (2026-08-26, kullanıcı kararı) -------------
   Eskiden üç BAĞIMSIZ kutuydu: her biri gölgeli, hover'da 3px yükselen, sol
   yanında 44px'lik mavi ikon kutusu taşıyan bir kart. İki bedeli vardı —
   yükselen + gölgeli kart TIKLANABİLİR okunuyordu (sitedeki "tıklanmayan bir
   'İncele' sahte butondur" kuralının aynısı; bunlar hiçbir yere gitmiyor) ve
   üç kutu yan yana dururken aralarındaki SIRA hiç görünmüyordu, oysa iddia
   sıralı bir süreç: yazılır → yaşa uyarlanır → güvenlik kontrolünden geçer.
   Bugün kutular ince bir dikey çizgiyle bağlı, her aşamanın başında bir onay
   diski var; gölge, hover ve geçiş kaldırıldı, ayrımı yalnız 1px kenar taşır.

   ÇİZGİ "DEKORATİF RENKLİ ŞERİT" DEĞİL, o yasağın dışındadır: kutunun bir
   YÜZÜNE yapıştırılmış, hiçbir şey söylemeyen bir bant değil — kutuların
   ARASINDA duruyor ve tek işi "önce bu, sonra bu" demek ("Nasıl çalışır"
   bölümünün kesikli mavi yolunun aynı gerekçesi).

   Yeşil, kategori rengi olduğu için değil ONAY rengi olduğu için seçildi:
   hero'nun güven satırındaki dolu yeşil disk ve buradaki onay diskleri AYNI
   iddianın iki ucu (`.hero-trust-ico`), üstelik başlığın el-çizimi vurgusu
   (`.mark--2`) da aynı aileden. Gradyanın açık ucu %70'te -deep'e oturur:
   beyaz glyph hep koyu ucun üstünde kalır (3.4:1, grafik eşiği 3:1); açık ucu
   ortaya taşırsan eşik düşer — hero'da ölçülmüş aynı değer.

   ÖLÇÜLER TEK KAYNAKTAN (`--ts-*`): raylı düzende üç sayı birbirine bağlı —
   oluk genişliği, disk boyu ve diskin üst payı. Ayrı ayrı yazılırsa çizgi
   disklerin merkezinden geçmez ve kimse hata almaz, çizgi yalnız yamuk durur. */
.trust-steps {
  --ts-pad: 46px;              /* soldaki oluk: disk + nefes payı */
  --ts-node: 34px;
  --ts-node-top: 12px;         /* diskin li içindeki üst payı (başlık satırı) */
  --ts-gap: 14px;
  --ts-rail: calc(var(--ts-node-top) + var(--ts-node) / 2);   /* disk merkezi */
  --ts-step: 420ms;            /* aşamalar arası gecikme adımı */
  list-style: none; margin: 0;
  padding: 0 0 0 var(--ts-pad);
  display: grid; gap: var(--ts-gap);
}
.trust-step {
  position: relative;
  display: grid; gap: 2px;
  padding: 13px 16px;
  background: var(--card-solid);
  border: 1px solid var(--border);
  border-radius: var(--r);
  /* GÖLGE, HOVER VE GEÇİŞ YOK — bilerek: kart burada bir eylem değil, üç
     aşamayı birbirinden ayıran şeyin kendisi. */
}
.trust-step-t {
  font-family: var(--font-head); font-weight: 700; font-size: var(--fs-lg);
  color: var(--tx1); line-height: 1.35;
}
.trust-step-s { font-size: var(--fs-sm); color: var(--tx2); line-height: 1.5; }

/* Ray: iki katman aynı geometride — altta nötr iz, üstünde yeşil dolgu.
   Son aşamada çizilmez (bağlanacak bir sonraki disk yok). Her ikisi de kendi
   diskinin MERKEZİNDEN sonrakinin merkezine uzanır; disk opak olduğu için
   altında kalan uçlar görünmez. */
.trust-step:not(:last-child)::before,
.trust-step:not(:last-child)::after {
  content: ""; position: absolute;
  left: calc(var(--ts-pad) / -2 - 1px);
  width: 2px; border-radius: 1px;
  top: var(--ts-rail);
  bottom: calc(-1 * (var(--ts-gap) + var(--ts-rail)));
}
.trust-step:not(:last-child)::before { background: var(--border); }
.trust-step:not(:last-child)::after {
  background: var(--cat-kesfet);
  transform-origin: top;
}
.trust-step-node {
  position: absolute; z-index: 1;
  left: calc((var(--ts-pad) + var(--ts-node)) / -2);
  top: var(--ts-node-top);
  width: var(--ts-node); height: var(--ts-node);
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--card-solid);
  border: 2px solid var(--border);
  color: #FFFFFF; font-size: var(--fs-xs);
}
/* Dolu disk AYRI bir katman: zemini doğrudan animasyona bağlamak gradyan
   geçişi ister (tarayıcılar gradyanı interpolate etmez, kare kare zıplar). */
.trust-step-node::before {
  content: ""; position: absolute; inset: -2px;
  border-radius: 50%;
  background: linear-gradient(145deg, var(--cat-kesfet) 0%, var(--cat-kesfet-deep) 70%);
}
.trust-step-node i { position: relative; z-index: 1; }

/* VARSAYILAN CSS HÂLİ TAMAMLANMIŞ SÜREÇTİR — ray dolu, üç onay da basılı; iki
   gizleme kuralı da `.js` ön ekli (gelişim çemberinin aynı kararı). Ters
   kurulursa JS'siz ziyaretçi boş gri disklerle sönük bir ray görür ve hiçbir
   şey hata vermez. Kurallar `.is-visible`i DIŞLAMAZ (`:not(...)` yazılmaz):
   animasyon zaten normal bildirimleri ezer, ve `:not()` üçünün özgüllüğünü
   aşağıdaki hareket azaltma bloğunun üstüne çıkarıp onu sessizce etkisiz
   bırakırdı. */
.js .trust-steps .trust-step:not(:last-child)::after { transform: scaleY(0); }
.js .trust-steps .trust-step-node::before { opacity: 0; transform: scale(.55); }
.js .trust-steps .trust-step-node i { opacity: 0; transform: scale(.4); }

/* Bölüm ekrana girince: ray yukarıdan aşağı bir kez dolar, onaylar sırayla
   damgalanır. Tetik listenin kendi `.reveal`ı — Site.js `is-visible` yazıp
   gözlemi bırakıyor, "bir kez" garantisi oradan geliyor.
   Merdiven: onay(i) = i·adım + 60ms, ray(i) = i·adım + 130ms (330ms sürer,
   yani bittiğinde bir sonraki onay tam sırada). Gecikme `--i`den türer.

   DOLGU `both` OLMAK ZORUNDA ve başlangıç karesi keyframe'in İÇİNDE yazılır:
   `.is-visible` düştüğü anda yukarıdaki `.js …:not(.is-visible)` gizlemesi
   kalkıyor: `forwards` + örtük 0% ile animasyon "tamamlanmış hâlden tamamlanmış
   hâle" oynar, yani hiç görünmez. `both` gecikme boyunca `from` karesini tutar. */
.js .trust-steps.is-visible .trust-step-node::before {
  animation: trustStamp 320ms cubic-bezier(.2, .8, .3, 1.2) both;
  animation-delay: calc(var(--i) * var(--ts-step) + 60ms);
}
.js .trust-steps.is-visible .trust-step-node i {
  animation: trustStamp 260ms cubic-bezier(.2, .8, .3, 1.2) both;
  animation-delay: calc(var(--i) * var(--ts-step) + 150ms);
}
.js .trust-steps.is-visible .trust-step:not(:last-child)::after {
  animation: trustRail 330ms ease-out both;
  animation-delay: calc(var(--i) * var(--ts-step) + 130ms);
}
@keyframes trustRail {
  from { transform: scaleY(0); }
  to   { transform: scaleY(1); }
}
@keyframes trustStamp {
  from { opacity: 0; transform: scale(.5); }
  60%  { opacity: 1; transform: scale(1.1); }
  to   { opacity: 1; transform: scale(1); }
}
/* Bölümün KENDİ hareket azaltma bloğu ŞART: global blok (25) yalnız SÜREYİ
   sıfırlar, GECİKMEYİ değil — gecikmeli + `forwards` dolgulu bir animasyonda
   bu, onayların ~1 saniye boyunca GÖRÜNMEZ beklemesi demek. Üstelik hareket
   azaltmada Site.js `is-visible`ı zaten anında yazıyor. */
@media (prefers-reduced-motion: reduce) {
  .js .trust-steps .trust-step-node::before,
  .js .trust-steps .trust-step-node i,
  .js .trust-steps .trust-step:not(:last-child)::after {
    animation: none !important;
    opacity: 1; transform: none;
  }
}

/* İletişim maskotu (`.aside-hello-kido`) 2026-08-25'te buradan gitti — sayfa
   yeniden tasarlanınca yan kart yığını kalktı. MASKOT KURALI DEĞİŞMEDİ, yalnız
   taşıyıcısı değişti: bugün `.cx-team-kido` (Css/Site/Contact.css §2), aynı
   iki tuzağıyla birlikte — kabında `overflow: hidden` olamaz ve `top` değeri
   orbFloat'ın -11px'lik yukarı fazını kapsamak zorunda. */

/* ----------------------------------------------------------------------------
   Özellikler — "bir günün hikâyesi" (Sabah → Gün içinde → Akşam)
---------------------------------------------------------------------------- */
.day-story { display: grid; gap: var(--sp-xl); }
.day-moment { display: grid; gap: clamp(20px, 3vw, 32px); }
.day-moment-head {
  display: flex; align-items: center; gap: clamp(16px, 2.5vw, 24px);
  padding-bottom: 4px;
}
.day-moment-emoji {
  flex: 0 0 auto;
  width: clamp(58px, 7vw, 78px); height: clamp(58px, 7vw, 78px);
  display: grid; place-items: center;
  font-size: clamp(1.9rem, 3.4vw, 2.6rem);
  background: var(--blue-ghost);
  border: 1.5px solid var(--border-strong);
  border-radius: var(--r-lg);
  animation: orbFloat 5.5s ease-in-out infinite;
}
.day-moment-title { font-size: clamp(1.4rem, 2.8vw, 2rem); margin: 4px 0 4px; }
.day-moment-sub { margin: 0; font-size: var(--fs-xl); max-width: 44em; }

/* ----------------------------------------------------------------------------
   24) Responsive
---------------------------------------------------------------------------- */
@media (max-width: 1080px) {
  .bt-lg, .bt-md, .bt-half { grid-column: span 3; }
  /* .areas-grid burada YOK: artık ızgara değil ortalanmış sarma, kolon sayısı
     kart sayısına göre kendiliğinden düşer (bkz. kuralın yanındaki not). */
  /* `.quick-grid` burada YOK: hızlı çözüm artık ızgara değil sahne — kolon
     sayısı §11'in kendi 1024px eşiğinden geliyor (altında yatay şerit). */
  .cat-grid { grid-template-columns: repeat(2, 1fr); }
  .cat-acts { grid-template-columns: repeat(2, 1fr); }
}

/* DAR MASAÜSTÜ NAVBAR'I (1021–1440): boşluklar toplanır.
   Yedi sekmelik kapsül + logo + dil + tema + CTA, varsayılan ölçülerle
   ~1150px yer istiyor; kapsül `flex: 0 1 auto` olduğu için sığmadığında
   SIKIŞIR ve sıkışan bir etikette metin sarar (§4'teki nowrap notu). Burada
   kazanılan ~90px yalnız dolgu, boşluk ve punto kademesinden gelir: sekme
   sırası ve hamburger eşiği (1020px) DEĞİŞMEZ. İÇERİK SATIRININ BOYU DA
   44px KALIR — `min-height`lere dokunulmuyor, yalnız yatay ölçüler kısılıyor
   (`--nav-h` / `--f2-nav-gap` hesabı buna bağlı, §4). Kapsam bilerek
   `min-width: 1021px`: altında navbar zaten kayan panel.

   ÜST SINIR 1280 → 1440 (2026-09-07, "Ana Sayfa" sekmesi eklenirken).
   Çivilenmiş kapsül yeni sekmenin genişliğinin YARISINI sağ paydan yer ve
   taban kademenin en dar pikselinde (1281) altı sekmeyle ölçülmüş pay zaten
   yalnız **+5px**'ti (docs/ui/Navbar.md, 2026-09-06) — yani yedinci sekme
   taban kademeyi 1281'de doğrudan negatife düşürür. Bant o yüzden kısılmış
   ölçüleri 1440'a kadar taşır; 1441'de taban kademe yeniden başladığında
   viewport'un kendi büyümesi payı geri vermiş oluyor. UYARI: bu sınır
   HESAPLANDI, ölçülmedi (o oturumda headless tarayıcı yoktu) — kapsüle bir
   şey eklenmeden önce sayılar Chromium'da yeniden okunur. */
@media (min-width: 1021px) and (max-width: 1440px) {
  .nav-inner { padding-inline: clamp(18px, 2vw, 26px); gap: 10px; }
  .nav-link { padding: 0 11px; font-size: var(--fs-md); }
  .nav-lang-btn { padding: 0 9px; }
  .nav-theme { width: 38px; height: 38px; }
  .nav-cta { padding: 0 14px; }
}

/* EN DAR MASAÜSTÜ (1021–1120): bir kademe daha.
   Kapsül viewport merkezine ÇİVİLİ (§4), yani iki yan grubun genişlik farkının
   YARISI sağ paydan yeniyor — ve sağ grup (dil + tema + CTA) soldakinden
   ~130px geniş. Ölçüldü (Chromium, üstteki blokla): 1100'de kapsül ile dil
   pili arasında 36.9px kalıyor, 1021'de **-1.0px**, yani pil kapsülün üstüne
   biniyordu. Bant o yüzden burada bitmiyor, bir kademe daha iniyor; kazanılan
   yer yine yalnız DOLGU ve BOŞLUK — sekme sayısı, sıra, punto ve 44px'lik
   satır boyu DEĞİŞMEZ (`--nav-h` / `--f2-nav-gap` hesabı ona bağlı).
   Sekme dolgusundan kısılan her piksel kapsülü iki ucundan birden daraltır,
   yani sağ paya yalnız YARISI yazılır; sağ gruptan kısılan tamamı yazılır. */
@media (min-width: 1021px) and (max-width: 1120px) {
  .nav-inner { padding-inline: 10px; gap: 8px; }
  /* 9px → 7px (2026-09-06, Nunito dönüşü): Caveat'ten geniş yüzle kapsül
     1021'de dil piline -1px biniyordu (ölçüldü); 2px'lik kısma kapsülü iki
     ucundan 24px daraltır, sağ paya yarısı yazılır → +11px.
     7px → 5px + punto bir kademe (2026-09-07, "Ana Sayfa" sekmesi): 1021'deki
     pay altı sekmeyle +11px'ti ve yedinci sekme oradan ~40px alıyor. Geri
     kazanım yine YALNIZ yatay: sekme dolgusu (7×4px = 28px kapsül, sağ paya
     +14), punto (--fs-md → --fs-sm, yedi etiket ~30px kapsül → +15), dış dolgu
     (14 → 10, +4), dil pili (9 → 6, +6) ve CTA (12 → 10, +4). `min-height`ler
     ve satırın 44px'i DEĞİŞMEDİ. Sayılar HESAP, ölçüm değil — bkz. üstteki
     blok. */
  .nav-link { padding: 0 5px; font-size: var(--fs-sm); }
  .nav-lang-btn { padding: 0 6px; }
  .nav-cta { padding: 0 10px; }
}

/* MOBİL (≤1020px): barda YALNIZ logo + "Listeye katıl" + hamburger.
   Bağlantılar, dil ve tema `[data-nav-links]` panelinin içine iner — panel
   `.nav-links`, masaüstündeki `display: contents` burada `flex`e döner ve üç
   grup yeniden tek kutuda toplanır. Kapsülün YÜZEYİ panelin içinde kalkar:
   panelin kendi zemini (`--card-solid`) zaten var, iç içe iki yüzey kutu
   içinde kutu olurdu. */
@media (max-width: 1020px) {
  .nav-toggle { display: inline-flex; }
  /* KAYDIRMADA BUZLU BANT (2026-09-04, yalnız ≤1020px). Barda logo ile sağ
     grup arasında ~100px'LİK ŞEFFAF BOŞLUK var (ölçüldü, 390px'te) ve yüzen
     tasarım gereği `.nav`'ın zemini yok: kaydırınca sayfa içeriği (bölüm
     eyebrow pilleri) bu boşluktan ve CTA'nın kenarlarından görünüyordu —
     "butonun arkasında yarım pil" gibi okunuyordu. Masaüst `--nav-h` payıyla
     durgunda hiçbir şey geçmez; sorun yalnız mobilde ve yalnız kaydırmada.
     Yüzey KAPSÜLÜN KENDİ REÇETESİ (`--nav-cap` + aynı blur), yani yeni renk
     yok — açık temada %88 beyaz + blur, düz zeminde bant görünmez bile,
     yalnız altından içerik geçerken buzlaşıyor. `is-scrolled` eşiği (14px)
     zaten var; dururken tasarım olduğu gibi YÜZER. Masaüstü bilerek DIŞARIDA
     kaldı: orada kapsül iki yan grubu dolduruyor ve 2026-08-26 kararında bant
     bilerek kaldırıldı — bu kural o kararı mobil için DARALTIR, geri almaz.

     BUZ `.nav`in KENDİSİNE DEĞİL `::before`una yazılır, ve bu tercih değil
     ZORUNLULUK: `backdrop-filter` (ve `filter`/`transform`) taşıyan bir öğe,
     altındaki `position: fixed` çocuklar için İÇEREN BLOK olur. Kural üç gün
     boyunca doğrudan `.nav`e yazılıydı ve kayan panel (`.nav-links`, fixed)
     viewport'a değil 60px'lik BARA hapsoluyordu: sayfa tepedeyken menü tam
     açılıyor, birkaç piksel kaydırılmışken navbar'ın boyunda KESİLİYORDU
     (`is-scrolled` eşiği 14px). Pseudo-öğe aynı buzu verir, içeren blok
     kurmaz. `z-index: -1` onu bar içeriğinin ALTINDA tutar; `.nav` kendi
     yığın bağlamını (z-index: 100) zaten açtığı için negatif katman sayfaya
     sızmaz. */
  .nav.is-scrolled::before {
    content: "";
    position: absolute; inset: 0; z-index: -1;
    pointer-events: none;
    background: var(--nav-cap);
    backdrop-filter: blur(10px) saturate(140%);
    -webkit-backdrop-filter: blur(10px) saturate(140%);
  }
  /* Kapsül akıştan çıktı (panelin içinde), yani `margin-inline: auto`su artık
     boşluğu paylaştırmıyor: sağ grubu sağa YASLAYAN şey bu satır. */
  .nav-right { margin-left: auto; }

  .nav-links {
    position: fixed;
    top: 0; right: 0; bottom: 0;
    display: flex;
    width: min(340px, 86vw);
    flex-direction: column; align-items: stretch; gap: 6px;
    padding: 90px 26px 30px;
    background: var(--card-solid);
    box-shadow: var(--shadow-lg);
    transform: translateX(105%);
    transition: transform var(--t) var(--ease-out);
    overflow-y: auto;
  }
  .nav.is-open .nav-links { transform: none; }

  .nav-menu {
    flex-direction: column; align-items: stretch;
    width: 100%; margin: 0; gap: 6px;
    padding: 0;
    background: none; border: 0;
    backdrop-filter: none; -webkit-backdrop-filter: none;
  }
  /* Dil + tema tek satırda, aynı yükseklikte — tema düğmesi tek başına
     köşede yetim bir daire olarak durmasın. */
  .nav-side {
    flex-direction: row; align-items: center; flex-wrap: wrap;
    width: 100%; margin: 12px 0 0; gap: 10px;
  }

  /* 48px dokunma hedefi `min-height`ten, puntodan değil. `color: var(--tx2)`
     2026-09-06'da DÜŞTÜ ve tek-mürekkep dönüşünde de GERİ GELMEDİ — taban
     kuralın --nav-cap-tx'i panel zemininde (--card-solid) zaten ölçülü,
     buraya ikinci bir mürekkep yazmak onu media özgüllüğüyle ezerdi.
     Çizgi (::after) panelde SOLA yaslanır: satırlar stretch + metin solda,
     ortalanmış çizgi kelimenin değil kutunun altına düşerdi. */
  .nav-link { min-height: 48px; padding: 0 16px; font-size: var(--fs-xl); }
  .nav-link::after { left: 16px; margin-left: 0; }
  .nav-lang { width: fit-content; }
  .nav-theme { width: 44px; height: 44px; }
}

/* Dar telefonda CTA bir kademe küçülür — logo + CTA + hamburger 360px'e
   sığmak zorunda ("Listeye katıl" / "Join the list" iki dilde de tek satır).
   Marka kuralları `.nav`e KAPSANIR: `.nav-brand` sınıfını footer da kullanıyor
   ve orada logo küçülmemeli. */
@media (max-width: 430px) {
  .nav-inner { padding-inline: 16px; gap: 10px; }
  .nav-cta { padding: 0 13px; font-size: var(--fs-sm); }
  .nav .nav-brand { font-size: 1.2rem; gap: 8px; }
  .nav .nav-brand img { width: 36px; height: 36px; border-radius: 11px; }
}

@media (max-width: 960px) {
  /* Balonlar iki kolona iner: dört kolonda kart ~160px'e düşüyor ve maskot +
     ad yan yana okunmuyor. Kural taban `.cat-bubbles`tan SONRA gelmek ZORUNDA
     — bir kez dosyanın başındaki bir bloğa yazıldı ve taban 4 kolon sessizce
     kazandı (mobilde dört balon 113px'e sıkıştı). 620px bloğu yalnız boşluğu
     kısar; kolon sayısı buradan gelir. */
  .cat-bubbles { grid-template-columns: repeat(2, 1fr); }
  /* Kolonla BİRLİKTE: `grid-area: 1 / 3` iki kolonlu ızgarada var olmayan
     üçüncü kolonu implicit AÇAR ve iki balon kabın dışına taşar. */
  .cat-bubble:nth-of-type(3) { grid-area: 2 / 1; }
  .cat-bubble:nth-of-type(4) { grid-area: 2 / 2; }

  .hero-grid { grid-template-columns: 1fr; text-align: center; }
  /* Çip satırı bir FLEX kabı: `text-align: center` ona işlemez, hizalamayı
     kendisi yazar. Onsuz iki çip mobilde sola yapışıp ortalanmış başlıktan
     ayrışıyordu. */
  .hero-tags { justify-content: center; }
  /* Rozet satırı da flex — aynı gerekçe, aynı kural. */
  .hero-trust--badges { justify-content: center; }
  /* Mobilde CTA bloğu da ortalanır: form + rozetler tek kolon, aynı merkez
     hattında — form sola yapışıp rozetler ayrı satırda kaymasın.
     `align-items: center` BU İŞİ TEK BAŞINA YAPMAZ ve 2026-09-06'ya kadar
     yapmadı: `.hero-cta`nın tek çocuğu krem panel `.hero-act`tır, o da
     `width: 100%` — yani ortalama panelde biter, panelin İÇİNDEKİ kapaklı
     bloklara (`.wl` 480px, `.hero-soon` 400px) hiç inmez. İkisinin de marjı
     0 olduğu için ortalı bir panelin içinde SOLA yapışıyorlardı.
     ÖLÇÜLDÜ (768·820·912·960): panelin ÜÇ AYRI MERKEZİ vardı — eyebrow panel
     merkezinde (820'de 410), başlık/alt metin/form satırı 277'de, mağaza
     satırı 237'de. Panel genişledikçe fark büyüyordu: 960'ta eyebrow ile form
     arası 203px. Kusur taşma üretmediği için taşma taramasından geçmişti;
     yalnız GÖZLE görülüyordu ("erken katılım alanındaki her şey sola kaymış").
     Kapak KALIR (780px'lik panelde e-posta kutusu absürt uzar), yalnız
     ortalanır: dört merkez de artık panelin merkezi. */
  .hero-cta { align-items: center; width: 100%; margin-inline: auto; }
  .hero-cta .wl { width: 100%; max-width: 480px; margin-inline: auto; }
  .hero-cta .hero-soon { margin-inline: auto; }
  .hero-cta .store-row { justify-content: center; }
  .hero-soon .store-row { flex-wrap: wrap; }
  .hero-visual { margin-top: 20px; }

  /* Kartlar alt alta; YOL DA DİKEYE DÖNER (kapatılmaz — sıra bilgisini o
     taşıyor). Boşluk `--steps-gap`in KENDİSİNDEN ezilir, ayrı bir `gap`
     yazılarak değil: çizginin boyu da o değişkenden okunuyor, ikisi ayrışırsa
     yol ya kartların içine girer ya boşlukta yarım kalır. */
  .steps { --steps-gap: 30px; grid-template-columns: 1fr; max-width: 520px; margin-inline: auto; }
  .step + .step::before {
    top: calc(-1 * var(--steps-gap)); left: 50%;
    width: 0; height: calc(var(--steps-gap) - 9px);
    margin-top: 0; margin-left: -1px;
    border-top: 0; border-left: 2px dashed var(--step-path);
  }
  /* Ok aşağıyı gösterir; taban kuralın `translateY(-50%)`i yatay ortalamayı
     da kapsayacak şekilde yeniden yazılır. */
  .step + .step::after {
    content: "\f078";
    top: -9px; left: 50%;
    transform: translate(-50%, -50%);
  }

  .night-grid { grid-template-columns: 1fr; }
  .night-moon { top: 22px; right: 24px; width: 54px; height: 54px; }

  /* Kategoriler: telefonu üste al, kartları altında tam genişlik ver */

  .trust-explain { grid-template-columns: 1fr; }
  /* TEK KOLONA INEN IKI BOLUM BASLIGI DA ORTALANIR (2026-09-10) — gerekce
     `.gw-head`in 900px blogundaki notuyla ayni: sola yaslilik "gorsel sagda"
     yerlesiminin kuraliydi, tek kolonda o yerlesim yok. Olculdu: 960px'te
     `.night-copy` ve `.trust-explain-copy`nin yatay komsusu YOK, 1024'te var
     — esik bu yuzden uydurulmadi, ikisinin kendi kirilma noktasi.
     `.night-modes` cipleri ve `.cta-arrow` mirasla ortalanir, ayri kural
     istemez (ikisi de satir ici / grid icerigi). */
  .night-copy, .trust-explain-copy { text-align: center; }
  /* Maskot dar ekranda da kartın üstünde kalır (eskiden kart İÇİNE alınıyordu;
     o gün kırpma açıktı ve taşan hâli kesik görünüyordu). Ölçü/uzaklık zaten
     clamp'li, ayrı bir konum ezmesine gerek yok — yalnız üst boşluğu kısalt. */
  .trust-explain-kido { right: 14px; }
  .day-moment-head { flex-direction: column; align-items: flex-start; text-align: left; }
  .benefit-cols { grid-template-columns: 1fr; }

  .foot-inner { grid-template-columns: 1fr 1fr; }
}

/* MOBİL HERO: BLOK SAYISI DÜŞER, TELEFONUN ÜSTÜ İLK EKRANA GİRER
   (2026-08-30, konsey kararı 3 — panelin dört üyesi aynı fold'da takıldı:
   Zeynep "10 saniyede cevap diyorsan cevabı ilk ekranda göster", Deniz
   "gerçek ürün hissi", Elif, Fatma.) MASAÜSTÜNE DOKUNULMAZ — bütün kurallar
   620px'in altında.

   ÖLÇÜLDÜ (390×844, Chromium): telefonun tepesi 881px'teydi, yani fold'un
   (844) 37px ALTINDA — ziyaretçi hero'nun tamamını okuyup kaydırmadan ürünü
   HİÇ görmüyordu. Kopya sekiz blok tutuyordu; kazanç üç yerden toplandı ve
   hiçbiri kopya SİLEREK değil:
     - store rozetleri (rozet + payı = 70px) hero'dan kalkar,
     - formun iki mikro-kopya satırı (label + %50 satırı) tek satırda akar,
     - gruplar arası `vh` clamp'leri ve kopya→telefon payı bir kademe kısılır.
   Bu blok bu sayfanın §24'ünde durmak ZORUNDA: `.hero-visual`ın
   `margin-top: 20px`i 960px bloğunda yazılı ve aynı özgüllükte — §5'e
   yazılsaydı sessizce kaybederdi (dosyada sonra gelen kazanır). */
@media (max-width: 620px) {
  /* 1) ROZETLER FOOTER'DA DURUYOR. Hero'da pasif iki blok, formun hemen
     altında ve zaten hayalet (§18b): "çok yakında" bilgisini footer'ın dolu
     rozetleri de veriyor, üstelik hero'nun CTA'sı bir BEKLEME LİSTESİ formu —
     ürünün çıkmadığını cümlenin kendisi söylüyor ("Çıkınca ilk sen haber al").
     Masaüstünde hiçbir şey değişmez. */
  .hero-soon { display: none; }

  /* 2) İKİ MİKRO-KOPYA SATIRI TEK SATIRDA AKAR. Kopya silinmiyor, blok
     sayısı düşüyor: başlık (`.wl-label`) ve teşvik (`.wl-sub`) aynı satır
     kutusunda birleşir. Kapsam `.hero-cta`: aynı form kapanış kutusunda da
     geçiyor ve orada blok sıkışıklığı yok.
     `<label for>` bağı bozulmaz — `display: inline` semantiği değiştirmez.

     MEZAR TAŞI: `.hero-cta .wl-sub::before { content: "· " }` (2026-09-10,
     kullanıcı: *"Listeye katıl'dan önce anlam veremediğim bir nokta var,
     kaldır"*). Ayraç birleşen iki satırı ayırsın diye konmuştu ve kopyaya
     YAZILMAMASI hâlâ doğru karardı (iki dilde ikinci bir dize açardı) — ama
     ayıracak bir şey yoktu: `wl_title` iki dilde de NOKTAYLA bitiyor
     ("…hazır." / "…day one."), yani nokta zaten duraklamayı veriyordu ve
     ortadaki `·` cümle başına düşmüş sahipsiz bir işaret olarak okunuyordu.
     İki inline kutu arasındaki HTML boşluğu tek boşluğa çöker, yani ayrım
     kuralsız da duruyor. Geri isteyen önce `wl_title`ın son karakterine
     bakar: noktasız bir başlıkta ayraç yeniden gerekir. */
  .hero-cta .wl-label { display: inline; margin-bottom: 0; }
  .hero-cta .wl-sub { display: inline; margin: 0; }
  /* Panel BAŞLIĞI da bu satıra karışıyor (2026-09-05: `.hero-act .wl-label`
     masaüstünde 1.3rem'lik bir başlık) — birleşik satırda iki punto yan yana
     duramaz, mobilde gövde tipografisine döner. Özgüllük eşit (0,2,0), bu
     blok dosyada SONRA geldiği için kazanıyor; kural §5'e taşınırsa sessizce
     kaybeder. */
  .hero-act .wl-label { font-family: var(--font-body); font-weight: 800; font-size: inherit; }
  /* Satırdan sonraki payı artık `.wl-sub`ın marjı veremez (inline oldu). */
  .hero-cta .af-swap { display: block; margin-top: 12px; }

  /* 3) GRUPLU RİTİM KORUNUR, ÖLÇEĞİ KÜÇÜLÜR. Tabandaki clamp'ler 844px'lik
     bir ekranda üst uçlarına oturuyor (34 ve 39px); grup İÇİ sıkı, gruplar
     ARASI geniş kuralı (§5) aynen duruyor, yalnız iki kademe aşağıda.
     (`.hero-sub` öldü, 2026-09-05 — grup ayracı artık `.hero-cats`ta.) */
  .hero-cats { margin-bottom: clamp(16px, 2.6vh, 24px); }
  .hero-trust { margin-bottom: clamp(20px, 3.4vh, 30px); }

  /* 3a) %50 ETİKETİNİN MOBİL KADEMESİ DE ÖLDÜ (2026-09-06, etiketle
     birlikte — §18b'deki mezar taşı). Buradaki `top: -28px` kuralı,
     etiketin mobilde "ERKEN KATILIM"a binmesini açıyordu; etiket geri
     gelirse o ölçüm de geri gerekir. */

  /* 3b) FOLD BÜTÇESİ GERİ ALINIR (2026-09-05, ÖLÇÜLDÜ 390×844): yeni h1
     ("0–10 yaş çocuklar için / ekran dışı aktiviteler.") 40px'te DÖRT satıra
     sarıyor ve üç rozet üç satır tutunca telefonun tepesi 888px'e inmişti —
     fold'un 44px ALTI, yani konsey kararı 3 ("ürün ilk ekranda") sessizce
     bozuktu. İki kademe birden:
     - h1 puntosu masaüstündeki AYNI ölçülmüş katsayıya döner (8.35cqw —
       kolon burada tüm ekran; katsayı kopyayla birlikte değişir, §5 notu):
       390px'te ~29px, iki satır tek parça. `nowrap` BİLEREK YOK: taşan
       tarayıcıda sarmak kırpılmaktan iyi.
     - rozetler bir kademe iner (--fs-sm): üç satır yerine iki satır.
     Sonuç ölçüldü (390×844): telefonun tepesi 888 → 735 (TR) / 775 (EN). */
  .hero-title { font-size: clamp(1.7rem, 8.4vw, 2.5rem); font-size: min(8.35cqw, 2.5rem); }
  .hero-trust--badges { font-size: var(--fs-sm); }

  /* 4) KOPYA → TELEFON PAYI. Tek kolona inen ızgarada satır boşluğu 44px
     (clamp'in alt ucu) + `.hero-visual`ın 20px marjı = 64px, yani sayfanın
     en pahalı yerinde iki blokluk boşluk. Sticker telefonun ÜSTÜNDE ve
     akışta olduğu için pay iki kez okunuyordu. */
  .hero-grid { gap: 26px; }
  .hero-visual { margin-top: 6px; }
}

@media (max-width: 620px) {
  body.kd { font-size: var(--fs-lg); }


  .cat-grid { grid-template-columns: 1fr; }

  .cat-bubbles { gap: 12px; }
  .cat-acts { grid-template-columns: 1fr; }

  /* Bento tek kolona — yarım genişlikte pil şeritleri 3-4 satıra sarıyordu */
  .bt-lg, .bt-md, .bt-half { grid-column: 1 / -1; }
  /* Gelişim alanları dar ekranda tek kolon: iki kolonda alan adı ("Sosyal-
     Duygusal Gelişim") sarıyor ve gloss'la birlikte kart dört satıra çıkıyor. */
  .areas-grid { gap: 10px; }
  .area-card { flex: 1 1 100%; max-width: none; padding: 12px 14px; }
  .night-modes { grid-template-columns: 1fr; }
  .foot-inner { grid-template-columns: 1fr; }
  .foot-base-inner { justify-content: center; text-align: center; }

  /* Dar ekranda dikey ritmi sıkıştır — 14.000px'lik kaydırma yolunu kısaltır
     ama bölümler arası nefes payı korunur. Sayı artık BURADA DEĞİL
     `--sec-pad`in alt ucunda (38px); kural yine de duruyor, çünkü §16/§9'daki
     bileşik seçicilerin (0,2,0) gerekçesi bu kuralın dosyada SONRA gelmesi. */
  .section { padding: var(--sec-pad) 0; }
  .sec-head { margin-bottom: 22px; }
}

/* ----------------------------------------------------------------------------
   25) Erişilebilirlik — azaltılmış hareket
---------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
  html { scroll-behavior: auto; }
  /* .js .reveal ile aynı özgüllük (0,2,0) — yoksa gizli kalırdı */
  .js .reveal, .reveal { opacity: 1; transform: none; }
}

/* ----------------------------------------------------------------------------
   25b) Aile daveti landing (Invite.html) — sitenin geri kalanıyla aynı özen:
   hero zemini + kart. (Önceden hepsi inline style'daydı.)
---------------------------------------------------------------------------- */
.kd-invite-sec { display: grid; place-items: center; min-height: calc(100vh - var(--nav-h) - 80px); }
.kd-invite {
  max-width: 560px; margin: 0 auto;
  text-align: center;
  padding: clamp(32px, 5vw, 48px) clamp(22px, 4vw, 34px);
  border-radius: var(--r-lg);
}
.kd-invite-mascot { margin-bottom: 16px; }
/* img'ler sitede display:block — ortalamak için margin-inline gerekli */
.kd-invite-mascot img { width: 88px; height: 88px; object-fit: contain; margin-inline: auto; }
.kd-invite .sec-title { margin-bottom: 10px; }
.kd-invite-cta { margin: 28px 0 8px; }
.kd-invite-get { margin-top: 28px; padding-top: 22px; border-top: 1px solid var(--border); }
.kd-invite-get .sec-sub { margin-bottom: 14px; }
.kd-invite .store-row { justify-content: center; }

/* ----------------------------------------------------------------------------
   26) FontAwesome ikon boyutları — emoji kapsayıcılarına otursun
   (Kapsayıcının font-size'ı emojiyi büyütüyordu; .9em ile FA oranı doğru olur.)
---------------------------------------------------------------------------- */
/* `.step-ico i` bu listeden ÇIKARILDI: adım ikonu artık dolu rozetin üstünde
   BEYAZ glyph ve buradaki `color: var(--blue)` — dosyada sonra geldiği için —
   onu sessizce geri maviye çevirir, yani glyph kendi rozetinin içinde kaybolur.
   Ölçüsü ve rengi 9'da, rozetin kuralının hemen yanında duruyor. */
.quick-card .e i,
.night-mode .e i {
  font-size: .9em; line-height: 1;
  color: var(--blue-ink);
}
/* Gece paneli koyu zemin — ikon açık maviyle okunsun */
.night-mode .e i { color: var(--blue-light); }

/* ----------------------------------------------------------------------------
   27) Telefon mockup ikon kapsayıcıları (kategori balonu + çocuk avatarları).
   Sitede emoji kullanılmaz; her rozet Font Awesome ikonu gösterir.
---------------------------------------------------------------------------- */
.cps-b-ico { font-size: 1.35rem; line-height: 1; color: #fff; }
.cps-kid-av i { font-size: .78rem; color: #fff; }
.cps-kid.is-active .cps-kid-av i { color: var(--blue); }

/* ----------------------------------------------------------------------------
   28) Hakkımızda — hikâye kutusu + ilke kartları
---------------------------------------------------------------------------- */
/* METİN RENGİ TEMA TOKEN'INDAN GELİR. Burada bir dönem `var(--ink)` vardı:
   --ink marka lacivertidir (#243769), yalnız :root'ta tanımlı ve koyu temada
   ASLA override edilmez → koyu kart (#081E49) üstünde 1.3:1, yani yazı
   görünmüyordu. --tx1 açık temada birebir aynı değer (#243769), koyu temada
   #EAF1FF: açık tema piksel piksel aynı kalır, koyu tema okunur olur.
   (--ink'in geri kalan kullanımları .ps- ve .mini- telefon maketlerinde; onlar
   bilinçli olarak iki temada da AÇIK yüzeydir, dokunulmadı.)
   DİKKAT: bu yorumun içinde yıldız-bölü dizisi YAZILMAZ — yorumu erken kapatır
   ve altındaki kuralı yutar. */
/* İki anlatı kutusu (`Neden Kidlio?` · `Kidlio'yu kim yapıyor?`) 2026-09-03'te
   DÜZ KUTUDAN KONUŞMA BALONUNA döndü — kullanıcı: "neden kidlio alanını biraz
   daha eğlenceli yap ama gradient, ai slop vs kullanma, kartın şeklini
   değiştirebilirsin".

   Şekil keyfî DEĞİL, sayfanın kendi kurgusundan çıktı: iki bölümün de başlığı
   bir SORU ("Neden Kidlio?" · "Kidlio'yu kim yapıyor?") ve altındaki kutu o
   sorunun cevabı. Balon, sayfanın zaten yaptığı soru-cevabı görselleştirir;
   birinci metnin ilk cümlesi de içinde bir soru alıntılıyor ("Bugün ne
   yapsak?"), yani balon o cümlenin kaynağına da denk düşüyor.

   ÜÇ SINIR bilerek korundu — "eğlenceli" istenirken yasaklananlar bunlardı:
   1) GRADYAN YOK. Yüzey hâlâ düz `--card`; balon hissi yalnız GEOMETRİDEN
      (asimetrik köşe yarıçapı + kuyruk baloncukları) geliyor.
   2) YENİ VARLIK YOK, YENİ DOM YOK. Kuyruk iki pseudo-element; bir illüstrasyon
      ya da maskot eklenmedi (maskot zaten sayfa sonundaki ctaBand'de duruyor,
      ikinci kez koymak onu dekora çevirirdi).
   3) HAREKET YOK. Balon durur; sayfanın tek animasyonu `.reveal` kalır.

   İki balonun kuyruğu KARŞIT yönde (`--r` modifikatörü): aynı sayfada üst üste
   iki özdeş balon şablon gibi okunuyordu, ayna simetrisi ikisini bir DİYALOG
   gibi bağlıyor. */
.about-story {
  max-width: 720px; margin: 0 auto; padding: 30px 34px;
  border-radius: var(--r-xl) var(--r-xl) var(--r-xl) 6px;
  position: relative;
}
/* `text-wrap: pretty` — son satırda tek kelime bırakmayı engeller. 2026-09-04'te
   eklendi: "…gerçek bir insan / yazıyor." tam buradaki maker cümlesinde
   oluyordu. İlke kartlarına aynı gün eklenmişti ama BU paragraflar ölçümün
   dışında kalmıştı — dersi kayda geçsin: /hakkimizda'da üç ayrı metin yüzeyi
   var (hikâye · maker · kart gövdeleri), biri düzeltilirken öbürü unutulmasın. */
.about-story p { margin: 0 0 14px; color: var(--tx1); line-height: 1.75; text-wrap: pretty; }
.about-story p:last-child { margin-bottom: 0; }
/* Açılış paragrafı bir tık büyük: balonun "konuşan" cümlesi o. */
.about-story p:first-child { font-size: 1.08rem; }
/* "Kim yapıyor" balonunun altındaki üç bağlantı (fiyat · gizlilik · iletişim).
   BALONUN İÇİNDE ama gövdeden AYRI: sayfa o güne kadar çıkmaz sokaktı, ama
   bağlantıları paragrafın içine gömmek "gerçek bir insan cevap veriyor"
   cümlesinin ağırlığını dağıtırdı. Kılcal üst çizgi `/iletisim`in `.cx-way`
   kararının aynısı — kutu değil, çizgi. `:first-child` punto kuralı bu
   paragrafa DEĞMEZ (o kural ilk çocuğa bakıyor, bu ikinci). */
.about-links {
  display: flex; flex-wrap: wrap; gap: 10px 22px;
  margin: 18px 0 0; padding-top: 16px;
  border-top: 1px solid var(--border);
  font-size: var(--fs-sm);
}
.about-links a {
  color: var(--blue-ink); font-weight: 600; text-decoration: none;
  min-height: 24px; display: inline-flex; align-items: center;
}
.about-links a:hover { text-decoration: underline; }

/* Kuyruk = küçülen iki baloncuk. `.glass`ın kenarını ve gölgesini birebir
   tekrar eder, yoksa balonun gövdesinden kopuk iki daire gibi durur. */
.about-story::before, .about-story::after {
  content: ""; position: absolute;
  background: var(--card);
  border: 1px solid var(--border);
  box-shadow: var(--shadow);
  border-radius: 50%;
}
.about-story::before { width: 26px; height: 26px; bottom: -17px; left: 26px; }
.about-story::after  { width: 14px; height: 14px; bottom: -41px; left: 8px; }
.about-story--r { border-radius: var(--r-xl) var(--r-xl) 6px var(--r-xl); }
.about-story--r::before { left: auto; right: 26px; }
.about-story--r::after  { left: auto; right: 8px; }

/* Hikâye ile Sözümüz arasındaki boşluk (kullanıcı: "çok boşluk var, düzelt").
   Sebep ölçüldü: kısa bir anlatı bloğu iki TAM bölüm dolgusunun arasında
   kalıyordu — 68px alt + 68px üst = 136px, yani iki paragraflık kutunun
   kendisinden (220px) neredeyse yarısı kadar boşluk. Bölüm silinmedi, ritim
   ayarlandı; sayfanın geri kalanı standart `--sec-pad` ile devam eder. */
.about-sec--story { padding-top: 10px; padding-bottom: calc(var(--sec-pad) * .4); }
.about-sec--story + .section { padding-block: calc(var(--sec-pad) * .55); }
/* Bu bölümün başlığında alt cümle YOK (`sh_about_story.s` boş), yani standart
   54px'lik `.sec-head` alt boşluğu burada bir paragrafın değil hiçliğin
   altında duruyordu — aynı şikâyetin ikinci yarısı. */
.about-sec--story .sec-head { margin-bottom: clamp(24px, 3vw, 32px); }
/* Aynı düzeltme "Biz kimiz?" sınırına da uygulandı: ilk boşluk daraltılınca
   sayfanın EN GENİŞ boşluğu o oldu ve tek başına kaldığı için daha da göze
   batıyordu — bir ritim düzeltmesi yarım yapılırsa sorunu taşır, çözmez.
   Bu başlığın da alt cümlesi yok (`sh_about_maker.s` boş). */
/* MARKA ADI BÜYÜK HARFE ÇEVRİLMEZ. Bu bölümün eyebrow'u 2026-09-04'te
   "Biz kimiz?" sorusundan "BrainyTech" olgusuna döndü, ve `.eyebrow`un
   `text-transform: uppercase`ı onu Türkçe sayfada "BRAİNYTECH" yapıyordu:
   `i` → NOKTALI `İ`, çünkü sayfanın dili `tr` ve tarayıcı doğru olanı yapıyor.
   Sonuç markanın kendi yazımı değil, üstelik yalnız TR'de bozuluyordu — yani
   ekran görüntüsü alınmasa fark edilmezdi. Etiket burada bir SÖZCÜK değil bir
   ÖZEL AD; harf aralığı da düşürülür, o aralık büyük harf içindi. */
.about-sec--maker .eyebrow { text-transform: none; letter-spacing: .01em; }
.about-sec--maker { padding-top: calc(var(--sec-pad) * .55); }
.about-sec--maker .sec-head { margin-bottom: clamp(24px, 3vw, 32px); }

/* Hero'daki dört sahne — eğik, üst üste binen fotoğraf dizisi.
   ÖRTÜŞME BİLİNÇLİ: kullanıcı "görsellerin bir kısmı görünsün" dedi; hero'nun
   alt kenarıyla KESMEK denenmedi çünkü hero'nun zeminle aynı rengi var, düz
   kesik dört fotoğrafın ortasından geçen bir çizgi tasarım değil hata gibi
   okunur. Örtüşme aynı "bir kısmı" etkisini kenarsız verir. */
.about-fan { display: flex; justify-content: center; margin: 26px auto 0; }
.about-fan-i {
  width: clamp(84px, 11vw, 148px); height: clamp(84px, 11vw, 148px);
  object-fit: cover; display: block; flex: none;
  border-radius: 18px;
  border: 5px solid var(--card-solid);
  box-shadow: var(--shadow);
}
.about-fan-i + .about-fan-i { margin-left: clamp(-20px, -1.4vw, -14px); }
/* Açılar elle konuldu, formülle değil: düzenli bir artış "yelpaze" değil
   "döndürülmüş liste" gibi duruyordu. */
.about-fan-i:nth-child(1) { transform: rotate(-5deg) translateY(4px); }
.about-fan-i:nth-child(2) { transform: rotate(2.5deg); }
.about-fan-i:nth-child(3) { transform: rotate(-2deg) translateY(3px); }
.about-fan-i:nth-child(4) { transform: rotate(5deg) translateY(1px); }

.principle-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; max-width: var(--container); margin: 0 auto; }
/* Dört ilke kartı 2026-09-03'te GÖRSEL kazandı (kullanıcı isteği; suluboya
   sahneler static/Images/Site/about/, 800×800 webp). Düzen AYNI GÜN ÜÇ KEZ
   değişti, ders kayda geçsin:
   1) Yan yana (solda metin, sağda maskeyle eriyen görsel): kare kaynak +
      object-fit: cover dar kolonda sahneyi yanlardan yedi, mask da kalan
      görselin üçte birini silikleştirdi → "görseller yarım kalmış".
   2) Kutu kareye yaklaştırıldı (~277×300): kırpım azaldı ama mask hâlâ
      sahneyi yiyordu → "hâlâ yarım görünüyor".
   3) Görsel ÜSTTE, tam genişlik, aspect-ratio 1/1 = kaynağın kendisi,
      SIFIR kırpım, SIFIR mask, ama 2 sütun × 1080px'te kart ~530px, kare
      görsel de 530px yükseklik demekti — iki satır 1500px'i aşıyor, dört
      kartı aynı ekranda görmek imkansız oluyordu.
   4) BUGÜNKÜ HÂL (kullanıcı isteği: kartlar küçülsün, dördü tek satırda tek
      ekranda görünsün): ızgara 4 sütuna açıldı, tam konteyner genişliğinde
      (1180px) → kart ~270px, kare görsel de ~270px — hâlâ SIFIR kırpım,
      SIFIR mask, sadece küçük ölçekte. Gövde dolgusu ve rozet küçültüldü ki
      dar kart metni ezilmesin. 700px altı zaten tek sütun; 701–980 arası ara
      kademe olmadan 4 sütun aşırı sıkışırdı, o yüzden orta genişlikte 2
      sütuna dönen bir ara durak eklendi. */
.principle-card { padding: 0; border-radius: var(--r-xl); overflow: hidden; }
.principle-art { display: block; width: 100%; height: auto; aspect-ratio: 1 / 1; object-fit: cover; }
/* 2026-09-04 — kullanıcı: kart bir tık genişlesin + paragrafın son
   satırında tek kelime yalnız kalıp alta sarkmasın (widow/orphan). Playwright
   ile 16 genişlikte (390–1920px) ölçüldü: yalnız `gap`/`padding` daraltmak
   sorunu ÇÖZMÜYOR, bir genişlikte düzelttiği kartı başka genişlikte başka
   bir kart üstünden geri getiriyordu (köstebek vurma) — asıl çözüm aşağıdaki
   `.principle-body p{text-wrap:pretty}`. Buradaki 18px→14px yatay dolgu
   YALNIZ istenen "bir tık geniş" hissi için (grid gap'i de 16→12px oldu);
   `&nbsp;` DENENMEDİ — `Typography.py` bu yolu dar ekranda YATAY TAŞMA
   riski yüzünden zaten reddetmişti, aynı gerekçe burada da geçerli. */
.principle-body { padding: 16px 14px 20px; }
/* Eskiden renkli emoji vardı; ikon setine geçince glyph gövde rengini miras
   alıp donuklaşıyordu — .duo-card tikleriyle aynı marka mavisi. Şablonla
   birlikte disk kazandı: dolgu ham pigment değil %12 tint (mürekkep kuralı). */
/* 2026-09-04: disk artık başlığın ÜSTÜNDE değil BAŞINDA (kullanıcı isteği),
   o yüzden 38px→30px — 1.05rem'lik bir başlığın yanında 38px'lik disk
   satırı domine ediyor ve dar kartta başlığa kalan genişliği yiyordu.
   `flex: none` şart: flex satırında disk aksi hâlde başlık uzayınca ezilip
   ovalleşir. */
.principle-emoji { display: inline-grid; place-items: center; flex: none; width: 30px; height: 30px; border-radius: 50%; font-size: .85rem; line-height: 1; color: var(--blue-ink); background: color-mix(in srgb, var(--blue) 12%, transparent); }
/* 2026-09-04 (İKİNCİ TUR) — kullanıcı: "ikonlarla başlıkları ortala, şu an
   dengesiz duruyor". Önceki kural `align-items: start` idi (disk başlık iki
   satıra düştüğünde ORTAYA kaymasın diye) ama tek satırlık başlıklarda tam
   olarak bunun tersi bir sorun yaratıyordu: disk kutunun tepesine yapışıp
   metnin satır içi (leading) boşluğunun ÜSTÜNDE kalıyor, göz "disk yukarı
   kaymış" okuyordu. `center` iki satıra sarsa da (`text-wrap: balance`)
   yaygın ve kabul edilebilir bir düzen; tek satırlık çoğunluk durumu burada
   ağır bastı. Disk üstündeki `-1px` telafisi de bu yüzden kalktı. */
.principle-card h3 { display: flex; align-items: center; gap: 9px; margin: 0 0 6px; color: var(--tx1); font-size: 1.05rem; }
/* Başlık metni AYRI bir flex öğesi. İki sebep, ikisi de ölçümden çıktı:
   1) `text-wrap: balance` anonim flex öğesine güvenilir uygulanmıyor — metnin
      kendi kutusu olmalı. Disk satırdan ~39px yiyor (30 + 9 gap), 1024px'te
      başlığa 170px kalıyor ve "Ekran sende, oyun / onda" gibi TEK kelimelik
      ikinci satır çıkıyordu; balance bunu "Ekran sende, / oyun onda" yapar.
   2) `min-width: 0` olmadan flex öğesi kendi en uzun kelimesinin altına
      inemez ve dar kartta taşma riski doğar. */
.principle-h { min-width: 0; text-wrap: balance; }
/* `text-wrap: pretty` son satırda tek kelime bırakmayı ENGELLEYEN tarayıcı
   özelliği (balance'ın tersine: satır uzunluklarını değil, son satırdaki
   kelime sayısını hedefler). Ölçülen sonuç: 16 genişliğin 16'sında da widow
   sıfırlandı (bkz. yukarıdaki not). Yalnız Chromium ailesinde destekleniyor;
   desteklemeyen tarayıcı bilinmeyen değeri yok sayar ve eski `wrap`
   davranışına sessizce döner — bozulma riski yok, saf iyileştirme. */
.principle-body p { margin: 0; line-height: 1.55; font-size: 0.92rem; text-wrap: pretty; }

@media (max-width: 980px) {
  .principle-grid { grid-template-columns: repeat(2, 1fr); max-width: 640px; }
}
@media (max-width: 700px) {
  .principle-grid { grid-template-columns: 1fr; max-width: 420px; }
}

/* ----------------------------------------------------------------------------
   29) (boş) — Çift-kitle (duo) bölümü kaldırıldı, kuralları da onunla gitti.
   Numara bilerek duruyor: aşağıdaki bölüm numaraları kaymasın.
---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
   30) Etkinlik şeridi (marquee) — etkinlik duvarının giriş cümlesi

   İki özdeş grup + translateX(-50%): kayma tam BİR GRUP kadar olduğu için
   döngü başa dönerken dikiş görünmez. Şart, şablon tarafında: bir grup en az
   bir ekran kadar geniş olmalı (Index.html her kategorinin 4 etkinliğini
   dönüşümlü yazar = 16 öğe). Öğe azalırsa animasyon yine çalışır, sadece
   geniş ekranda bandın sonunda boş bir şerit açılır — sessiz bir kırılma, bu
   yüzden tests/test_site_pages.py grupları karşılaştırır.

   Hareketi durdurmak için JS YOK: global prefers-reduced-motion bloğu (25)
   duration'ı .01ms'ye çeker, bant -50%'ye atlar ve iki grup özdeş olduğu için
   görüntü hiç değişmez.
---------------------------------------------------------------------------- */
.marquee {
  overflow: hidden;
  /* Şerit 2026-09-01'den beri bölümün BAŞINDA değil, dört dünya balonlarının
     ALTINDA: payını eskiden `has-strip`in `.sec-head` marjı veriyordu, bugün
     kendi marjı vermek zorunda — yoksa bant kartların alt kenarına yapışır. */
  margin-top: clamp(30px, 4vw, 48px);
  padding: 15px 0;
  background: var(--card);
  border-block: 1px solid var(--border);
  /* Uçlarda yumuşak kayboluş — bant ekran kenarında bıçakla kesilmiş durmasın */
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 10%, #000 90%, transparent);
}
.marquee-track {
  display: flex; width: max-content;
  animation: mqSlide 48s linear infinite;
  will-change: transform;
}
/* Okumak (ya da sadece bakmak) isteyen durdurabilsin */
.marquee:hover .marquee-track { animation-play-state: paused; }

.marquee-row { display: flex; align-items: center; }
.marquee-item {
  display: inline-flex; align-items: center;
  font-family: var(--font-head);
  /* Vitrin punto'su: --fs ölçeği GÖVDE metnini tarar, bu bir başlık ailesi
     öğesi (bkz. token bloğundaki clamp() istisnası). */
  font-size: clamp(1.15rem, 2.4vw, 1.85rem); font-weight: 800;
  color: var(--cat-deep);   /* metin: -deep varyantı — WCAG notu, token bloğu */
  white-space: nowrap;
}
/* gap YOK: ::after de flex çocuğu olurdu ve ayraç payı gap ile toplanırdı. */
.marquee-item i { font-size: .92em; margin-right: 11px; }
/* Adın başında kategorinin KENDİ maskotu (kedi/baykuş/kelebek/papağan) — aynı
   dosyalar sayfanın üstündeki kategori balonlarında da kullanılıyor, yani hem
   ek indirme yok hem de dört yüz "bu ad şu dünyaya ait" diyor. 2.1em: satır
   kutusundan taşmadığı en büyük ölçü, bandın boyu değişmiyor; daha küçüğünde
   sulu boya yüz 30px'te lapaya dönüyor. */
.marquee-item img {
  height: 2.1em; width: 2.1em; object-fit: contain;
  margin-right: 12px;
  filter: drop-shadow(0 2px 4px rgb(0 0 0 / .14));
}
/* Ayraç nokta HER öğeden sonra: grubun son öğesinden sonrakini de yazar, yani
   iki grup arasındaki dikişte ritim kesilmez. */
.marquee-item::after {
  content: "·";
  margin: 0 clamp(20px, 3vw, 38px);
  color: var(--tx3); font-weight: 700;
}
[data-theme="dark"] .marquee-item { color: var(--cat); }

@keyframes mqSlide { to { transform: translateX(-50%); } }

/* Bant duvar bölümünün İÇİNDE, başlığın hemen altında durur — ayrı bir ada
   değil, başlığın kapsadığı içerik. Üstündeki boşluğu `.sec-head`in kendi alt
   payı verir (34–54px); altta daha dar bir pay bırakıyoruz ki adlar hemen
   altındaki resimlere yapışsın. Container'ın dışında kalır: maske ile solan
   uçlar ancak kenardan kenara akarken sonsuz görünür. */
.section > .marquee { margin-bottom: clamp(26px, 3.2vw, 38px); }
/* Bandı içine alan bölüm bir bant boyu (~80px) uzadı: üst payını o kadar kısıp
   sayfa ritmini eşitliyoruz. Kısılmazsa üstteki özellik turunun sonu ile başlık
   arasında bir ekranın dörtte biri kadar ölü boşluk açılıyor — orayı eskiden
   bant dolduruyordu. */
.section.has-strip { padding-top: calc(var(--sec-pad) * .62); }
.section.has-strip .sec-head { margin-bottom: clamp(24px, 3.4vw, 38px); }

/* DUVARIN BAŞLIĞI BÜYÜK TİPOGRAFİK BİR AN (2026-08-30, konsey kararı 4).
   Sayfanın on bölümü aynı kalıbı tekrar ediyordu: ortalanmış etiket →
   ortalanmış başlık → içerik. Buradaki fark ÖLÇEK: başlık bir kademe büyük ve
   hemen altından akan ad şeridiyle birlikte tek bir kompozisyon okunuyor.

   HİZA ORTALANMIŞTIR (2026-08-31, kullanıcı kararı: "sola yaslı kötü
   durmuş"). Bir dönem sola yaslıydı — gerekçesi "kalıbı kır"dı, ama bedeli
   görünür bir dengesizlikti: 860px'lik başlık kabının sağında ~320px boş
   şerit kalıyor, hemen altındaki ad şeridi ve duvar ise kenardan kenara
   akıyordu; başlık bölümüne değil kabın sol kenarına yaslanmış okunuyordu.
   Kalıbı kıran şey artık yalnız PUNTO, hiza sitenin geri kalanına döndü.

   DÖRT ŞEY YÜK TAŞIYOR:
   • Punto `.sec-title`ı EZER, o yüzden kural dosyada ondan SONRA (ikisi de
     (0,1,0); önce yazılsaydı sessizce kaybederdi ve başlık aynı boyda kalırdı).
   • Ortalama İKİ bildirimdir (`.sec-head.is-center`in aynı ikilisi):
     `margin-inline: auto` kutuyu kabın ortasına alır, `text-align: center`
     sarmış bir başlığın SATIRLARINI ve inline-flex `.eyebrow` çipini ortalar.
     Biri düşerse ya blok solda kalır ya çip sola yapışır.
   • `max-width` ch DEĞİL px: `ch` kabın GÖVDE puntosuna göre çözülür,
     başlığın kendi 3.3rem'ine göre değil (/gelisim güven bandında ölçülmüş
     aynı tuzak — 30ch yazan hâli başlığı beş satıra düşürmüştü).
   • Alt boşluk `.sec-head`in bandından küçük: başlık ile şerit AYNI
     kompozisyonun iki satırı, aralarındaki 34-54px onları iki ayrı bloğa
     çevirirdi. */
.wall-head {
  max-width: 860px; margin-inline: auto; text-align: center;
  margin-bottom: clamp(18px, 2.4vw, 28px);
}
/* DÖRT DÜNYA ROZETİ AKSAN RENGİNİ SÜRER — tıklanabilir pillerin mavi olma
   kuralının tek istisnası (2026-09-07, kullanıcı kararı: "girdiğin badge ile
   uyumlu bir renk yap, o maviden vazgeç"). Sebep yapısal: bu pil hem bölümün
   ETİKETİ hem de bağlantısı, yani rengi bölümün ritmine ait. */
.wall-head .eyebrow-cta {
  --ec: var(--sec-accent, var(--btn));
  color: var(--sec-accent, var(--btn-tx));
}

.wall-title {
  font-size: clamp(2.05rem, 4.6vw, 3.3rem);
  line-height: 1.08; letter-spacing: -.02em; text-wrap: balance;
}

/* Duvarın dibi ile "Hızlı çözüm" başlığı arasındaki boşluk. Ölçüldü (1440×900):
   26px (duvarın kendi tuğla payı) + 104px (bu bölümün alt dolgusu) + 104px
   (sonraki bölümün üst dolgusu) = 234px, yani sayfanın en geniş dikey boşluğu —
   iki bölüm dolgusu üst üste biniyor ve duvar "bitmiş" değil "kopmuş"
   okunuyordu. Bugün ~146px. Üç şey yükü taşıyor:
     • Pay İKİ TARAFA bölünür (30 + 90). Tek taraftan kısmak istenen toplamı
       ancak alt dolguyu ~16px'e indirerek verir, yani bir bölümü dolgusuz
       bırakır; boşluğun tamamı komşunun olur.
     • Duvarın KENDİ `padding-bottom: 26px`ine dokunulmaz — o bir boşluk değil,
       tuğla kaydırmasının (`:nth-child(even) → margin-top`) alt karşılığı; onu
       kısmak son karo sırasını duvarın kutusuna yapıştırır.
     • MOBİLDE (≤620px) HİÇ GEÇMEZ: orada duvar 8 karoya, bölüm dolgusu 44px'e
       iniyor (ikisi de ölçülmüş kararlar, bkz. §24 ve duvarın mobil bloğu) ve
       boşluk zaten 108px. `min-width` sorgusu bu yüzden şart — clamp'in alt
       ucuyla yapılsaydı mobil ritim de sessizce değişirdi. */
@media (min-width: 621px) {
  .section.has-strip { padding-bottom: calc(var(--sec-pad) * .32); }
  .section.has-strip + .section { padding-top: var(--sec-pad); }
}

/* ----------------------------------------------------------------------------
   31) Etkinlik duvarı — 12 gerçek etkinlik görseli, mozaik

   Altıgen değil YUMUŞAK KARE: altıgen ızgara serin/teknik duruyor, bu ürünün
   dili çocuk. Mozaik hissi karo BOYUTUNU rastgeleleştirmekten değil, düzgün
   ızgaraya tuğla kaydırması (:nth-child(even) → margin-top) vermekten geliyor
   — rastgele boyut, `grid-auto-flow: dense` ile bile arada delik bırakıyor.

   Sütun sayıları 4 / 2: ikisi de karo sayısını (12) tam böler, dolayısıyla
   "çift çocuk" her zaman aynı sütunlara denk gelir ve kaydırma sütun sütun
   okunur. Bölmeyen bir sayıya geçilirse (5 sütun, ya da 13 karo) hem son satır
   yarım kalır hem kaydırma zikzağa döner — karo sayısı şablonda 12'ye
   sabitlenmiş, orada nedeni yazıyor.

   TABAN 6 DEĞİL 4 (2026-09-01, konsey kararı 6: "boşalan yere resim gir, kutu
   değil — suluboya illüstrasyonlar tam boy görünsün"). Altı sütunda karo
   1440'ta **185px**ti: duvar, ürünün ayırt edici varlığını bir pul kontağı
   gibi gösteriyordu ve o varlık sayfada başka HİÇBİR yerde tam boy geçmiyordu
   (Deniz'in "amatör görünen site = amatör ürün" itirazının ölçülebilir hâli).
   Dört sütunda karo **281px** — sayfanın en büyük görsel öğesi artık uygulamanın
   kendi illüstrasyonu. Bedel ölçüldü ve BİLEREK ödendi: bölüm 1.107 → 1.669px,
   sayfa 7.905 → 8.467px (1440x900). Kararın "Kazanç" sütunu zaten ±0px yazıyor
   — bu tur kısaltma turuydu, bu madde onun İSTİSNASI: 1 ve 3'ün açtığı yerin
   kutuyla değil resimle doldurulması. Kısaltmak isteyen buraya değil, kararı
   1-5'e bakar.

   ESKİ ORTA BASAMAK (`max-width: 1000px` → 4 sütun) SİLİNDİ, kaybolmadı:
   taban zaten 4 olduğu için kural birebir kendini tekrar ediyordu. 621-1000px
   arasında karo 132-227px, yani eski masaüstü ölçüsünün bandı — orada
   büyütecek bir şey yok, o yüzden rozet ve isim tipografisinin büyümesi
   `min-width: 1001px`e kapsanır.

   İKİ TRANSFORM, İKİ ELEMAN — bölümün en kritik kararı:
     .wall-tile   → `wallBreath` nefes animasyonu (CSS)
     .wall-inner  → imlece doğru eğilme (JS yalnız --tiltX/--tiltY yazar)
   Aynı elemanda toplansalardı animasyon inline transform'u sessizce ezerdi —
   hero parallax'ında bir kez yaşandı (bkz. UI-Templates.md). JS'in transform
   yerine değişken yazması da bilinçli: geri alma tek satır, kural CSS'te kalır.

   Azaltılmış harekette ayrı iş yok: 25) bloğu süreyi .01ms'ye çeker, nefes son
   karesinde (translate 0) donar; eğilme zaten JS tarafında reduceMotion kapılı.
---------------------------------------------------------------------------- */
.wall {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 18px;
  /* Tuğla kaydırması: tek sütunlar yukarıda, çift sütunlar aşağıda. Alt kenarda
     aynı kadar boşluk bırakılır ki bölüm dolgusu simetrik kalsın. */
  padding-bottom: 26px;
}
.wall-tile:nth-child(even) { margin-top: 26px; }

.wall-tile {
  position: relative;
  animation: wallBreath 7.5s ease-in-out infinite;
  /* 12 karo, 7.5s / 12 = .62s: negatif gecikme hepsini döngünün farklı yerinden
     başlatır — duvar tek vücut değil, tek tek nefes alır. */
  animation-delay: calc(var(--i, 0) * -.62s);
}
.wall-inner {
  display: block; position: relative;
  border-radius: var(--r);
  overflow: hidden;
  background: var(--card-solid);
  box-shadow: var(--shadow-sm), var(--edge);
  transform:
    perspective(600px)
    rotateX(calc(var(--tiltX, 0) * 1deg))
    rotateY(calc(var(--tiltY, 0) * 1deg))
    scale(var(--tiltS, 1));
  /* transform KISA (--t-xs): eğilme imleci takip eder, uzun süre gecikme gibi
     hissettirirdi. Gölge daha yumuşak geçebilir. */
  transition: transform var(--t-xs) var(--ease-out), box-shadow var(--t);
  will-change: transform;
}
.wall-tile:hover .wall-inner {
  --tiltS: 1.06;
  --glow-c: var(--cat);
  box-shadow: var(--shadow), var(--glow-lg);
  z-index: 2;
}
.wall-inner img {
  width: 100%; aspect-ratio: 1 / 1;
  object-fit: cover;
  display: block;
}

/* Kategori rozeti — hangi karo hangi kategoriden, isim belirmeden de belli */
.wall-badge {
  position: absolute; top: 7px; left: 7px;
  width: 24px; height: 24px;
  display: grid; place-items: center;
  border-radius: var(--r-full);
  background: var(--cat); color: #fff;
  font-size: 11px;
  box-shadow: 0 2px 8px -2px rgba(0, 0, 0, .45);
}

/* İsim: masaüstünde üstüne gelince belirir, dokunmatikte hep açık (aşağıda) */
.wall-name {
  position: absolute; inset: auto 0 0 0;
  padding: 34px 9px 8px;
  display: grid; gap: 1px;
  /* Perde KOYU olmak zorunda: karolar suluboya illüstrasyon, çoğunun altı açık
     (gökyüzü, beyaz masa, açık ten). İlk deneme .88/.55 idi ve isim dokunmatik
     ekranda — perdenin hep açık olduğu yerde — okunmuyordu. Gölge ikinci
     savunma: parlak bir noktaya denk gelen harfin kenarını ayırır. */
  background: linear-gradient(to top, rgba(12, 10, 22, .96), rgba(12, 10, 22, .78) 46%, rgba(12, 10, 22, 0));
  color: #fff;
  text-shadow: 0 1px 3px rgba(0, 0, 0, .55);
  opacity: 0; transform: translateY(8px);
  transition: opacity var(--t-sm), transform var(--t-sm);
}
.wall-name b { font-family: var(--font-head); font-size: var(--fs-xs); line-height: 1.25; }
.wall-name small { font-size: 10px; opacity: .82; }
.wall-tile:hover .wall-name { opacity: 1; transform: none; }

/* 4 SÜTUNLU MASAÜSTÜNDE ROZET VE İSİM DE BİR KADEME BÜYÜR (2026-09-01).
   Karo 185 → 281px'e çıkınca 24px'lik rozet ve `--fs-xs` isim, üstünde
   durdukları resme göre küçüldü: rozet "hangi dünya" işaretini veremeyecek
   kadar ufalıyor, isim de 281px'lik perdenin içinde yitiyordu. Ölçüler
   `min-width: 1001px`e KAPSANIR — 621-1000px arasında karo hâlâ 132-227px,
   yani taban değerler orada doğru. */
@media (min-width: 1001px) {
  .wall-badge { top: 10px; left: 10px; width: 30px; height: 30px; font-size: 13px; }
  .wall-name { padding: 44px 13px 12px; }
  .wall-name b { font-size: var(--fs-sm); }
  .wall-name small { font-size: 11px; }
}

/* Dokunmatikte hover diye bir şey yok: isim gizlenirse hiç görünmez. */
@media (hover: none) {
  .wall-name { opacity: 1; transform: none; }
}

@media (max-width: 620px) {
  .wall { grid-template-columns: repeat(2, 1fr); gap: 11px; padding-bottom: 20px; }
  .wall-tile:nth-child(even) { margin-top: 20px; }

  /* MOBİLDE 8 KARO, MASAÜSTÜNDE 12 — ve kırpma CSS'te, şablonda değil.
     12 sayısı load-bearing: 6/4/2 kolona bölünen tek sayı, tuğla ofseti
     (:nth-child(even) → margin-top) ancak öyle kolon hizasında kalıyor.
     Şablonda 12'yi azaltmak masaüstündeki 4 kolonlu breakpoint'i bozardı.
     Mobilde ise kolon sayısı 2: 8 karo tam 4 satır, ofset yine hizalı ve
     bölüm ~360px kısalıyor (duvar 1.083px → ~723px, ölçüldü 390×844).
     İndirilen görsel de dörde düşer — panelde Fatma'nın (düşük veri)
     gerekçesi buydu. Deniz'in itirazı da karşılanıyor: masaüstünde duvar
     eksiksiz, çünkü "gerçek ürün" hissini o taşıyor. */
  .wall-tile:nth-child(n+9) { display: none; }
}

@keyframes wallBreath {
  0%, 100% { transform: translate3d(0, 0, 0); }
  50%      { transform: translate3d(0, -7px, 0); }
}

/* ----------------------------------------------------------------------------
   32) Tema geçişi — gök gösterisi
   Güneş batar, ay doğar, gökyüzü sayfayı süpürür, yıldızlar belirir.
   Akış: Site.js tıklamayı alır, bu katmanı kurar, data-theme'i KATMANIN
   ALTINDA çevirir ve tercihi arka planda /set-theme'e yazar.

   Dört karar taşıyıcı:

   1) Katman GERÇEK bir perde, View Transitions değil. startViewTransition
      geçiş boyunca canlı DOM'u gizleyip anlık görüntü gösterir — yay ve
      yıldızlar o anlık görüntünün içinde DONARDI. Zaten istenen efekt
      "gökyüzü sayfayı süpürsün"dü, yani perdenin ta kendisi.
   2) Tema tam da perde ekranı kapatmışken çevrilir (skySweep %42–%68 arası
      opak). Kullanıcı çevrilmeyi görmez, perde kalkınca yeni temayı bulur.
   3) Yıldız bir GLYPH değil, CSS noktası. 3px'lik bir yıldız ikonu zaten
      tanınmaz; emoji ise en baştan yasak.
   4) Düğmenin kendi ikonu uçuş boyunca gizlenir (.is-flying) ve yayın
      SONUNDA yenisi iner — uçan şeyin düğme olduğu hissi buradan geliyor.
   5) İKİ YÖN SİMETRİK ama aynı değil. Koyuya giderken gökyüzü kararır ve
      yıldızlar yanar; aydınlığa giderken perde ŞAFAKLA açılır (--sky-dawn),
      yıldızlar teker teker söner, bulutlar sürüklenir ve güneş konarken göğü
      bir kez yıkar. Düz --sky-day perdesi hem ödülsüz kalıyordu hem de batan
      ayı yutuyordu — ikisi de aynı katmanla çözüldü.

   Konum değişkenlerini (--ox/--oy: düğmenin merkezi, --ex: yayın karşı ucu,
   --r: en uzak köşeye uzaklık) JS yazar; hepsi px.
---------------------------------------------------------------------------- */
.theme-sky {
  position: fixed;
  inset: 0;
  z-index: 9999;
  pointer-events: none;   /* katman tıklamayı yutarsa site 900ms kilitlenir */
  overflow: hidden;
  clip-path: circle(0px at var(--ox) var(--oy));
  animation: skySweep 1300ms linear forwards;
  /* Yayın tepesi. İki uçlu kısıt, ikisi de ölçülerek bulundu:
     - 90px'lik yükseliş yayı yay yapan şey; masaüstünde düğme zaten en üstte
       (oy≈49) olduğu için oradaki gerçek yükseliş 19px'e iner, o kadar yer var.
     - max(30px, …) tavanı: sabit bir yükselişte güneş üst kenardan TAŞIYORDU.
     Yalnız "oy - 18px" yazsaydık mobilde (düğme menü içinde, oy≈600) yay
     dümdüz bir çizgi olurdu — orada bol yer varken. */
  --peak: max(30px, calc(var(--oy) - 90px));
}
.theme-sky.is-to-dark  { background: var(--sky-night); }

/* Aydınlığa geçiş BİLEREK daha uzun (1300 → 1600ms). Koyuya geçişte ödül ilk
   yarıda: perde kararır, yıldızlar yanar, iş biter. Aydınlıkta ödül SONDA —
   şafak eriyip deniz mavisi ortaya çıkıyor — ve 1300ms'de o mavi ancak 100ms
   görünüp perdeyle birlikte siliniyordu. 300ms fazlası tamamen o mavinin.
   JS'teki SHOW/COVER sözlüğü bu iki süreyi yansıtmak ZORUNDA. */
.theme-sky.is-to-light { background: var(--sky-day); animation-duration: 1600ms; }

/* ---- Şafak katmanı: yalnız aydınlığa giderken ----
   Aydınlığa geçiş iki dertliydi: (1) düz mavi bir perde açılıp kapanıyordu,
   koyuya geçişteki "yıldızlar yanıyor" ödülünün karşılığı yoktu; (2) batan ay
   beyaza yakın (#E9F0FF) ve gündüz göğünün tepesi #BADCFF — kontrast 1.2:1,
   yani ay yolun tamamında fona gömülüydü.

   İkisini tek katman çözüyor: perde ŞAFAKLA açılır (koyu indigodan turuncuya),
   ay bu karanlık zeminde net görünerek batar, güneş yükselirken katman erir ve
   gündüz göğü altından çıkar. Yani "gökyüzü aydınlanıyor", sadece "mavi bir
   dikdörtgen belirdi" değil.

   Aralık iki uçtan da sıkışık: %50'den (800ms) önce erimeye başlarsa batan ay
   (860ms'te sahneden çıkıyor) aydınlıkta kaybolur; %74'ten (1184ms) sonra
   biterse deniz mavisi perde sönmeden önce hiç görünmez. İkisinin arasında
   kalan ~400ms, gösterinin bütün ödülü. */
.theme-sky.is-to-light::before {
  content: "";
  position: absolute;
  inset: 0;
  background: var(--sky-dawn);
  animation: dawnLift 1600ms linear forwards;
}
@keyframes dawnLift {
  0%, 50%   { opacity: 1; }
  74%, 100% { opacity: 0; }
}

/* ---- Gün doğumu patlaması ----
   Sabit bir noktaya değil, DOĞAN GÜNEŞİN KENDİSİNE bağlı: güneş ufuktan
   çıkarken taşıdığı ışık büyüyerek göğü yıkıyor. Perdeye (--ox/--oy) bağlasak
   parlama, güneş daha yoldayken varış noktasında patlardı — ışığın kaynağı
   görünürde yanlış yerde olurdu.

   İki ayrıntı taşıyıcı: (1) pseudo'nun transform'u ebeveynin yay transform'uyla
   ÇARPIŞMAZ, üstüne biner — bu yüzden yay tek elemanda kalabiliyor;
   (2) z-index:-1 ışığı ikonun ARKASINA atar, yoksa güneşin yüzünü yıkardı.
   .theme-body zaten will-change ile bir yığma bağlamı, negatif katman dışarı
   taşmıyor. */
.is-to-light .theme-body--in::after {
  content: "";
  position: absolute;
  top: 50%; left: 50%;
  width: 260px; height: 260px;
  margin: -130px 0 0 -130px;
  z-index: -1;
  border-radius: var(--r-full);
  /* Işık neredeyse BEYAZ, sarı değil: sarı (#FFD166) yarı saydam hâlde mavi
     göğün üstüne binince tamamlayıcı renk kuralı gereği yeşilimsi gri bir leke
     veriyordu. Sıcaklık yalnız merkezde, kenar beyaza çözülüyor — gerçek güneş
     parlaması da böyle davranır. */
  background: radial-gradient(circle,
    rgba(255, 252, 240, .95) 0%, rgba(255, 246, 224, .45) 38%, rgba(255, 255, 255, 0) 70%);
  opacity: 0;
  animation: sunBloom 720ms ease-out 860ms forwards;
}
@keyframes sunBloom {
  0%   { opacity: 0;  transform: scale(.3); }
  30%  { opacity: .9; }
  100% { opacity: 0;  transform: scale(3.6); }
}

/* Hız eğrisi keyframe BAŞINA veriliyor, animasyonun tamamına değil. Tek bir
   cubic-bezier(.4,0,.2,1) ile ölçüldü: perde 120ms'te 909px, ~250ms'te tüm
   ekran — süpürme göze görünmeden bitiyor ve yayın ilk yarısını yutuyordu.
   Genişleme artık %35'e (455ms) yayılıyor ve neredeyse doğrusal ilerliyor;
   bir perde için okunaklı olan bu, keskin ease-out değil. */
@keyframes skySweep {
  0%   { clip-path: circle(0px at var(--ox) var(--oy));      opacity: 1;
         animation-timing-function: cubic-bezier(.30, .20, .40, 1); }
  35%  { clip-path: circle(var(--r) at var(--ox) var(--oy)); opacity: 1;
         animation-timing-function: linear; }
  80%  { clip-path: circle(var(--r) at var(--ox) var(--oy)); opacity: 1;
         animation-timing-function: ease-in; }
  100% { clip-path: circle(var(--r) at var(--ox) var(--oy)); opacity: 0; }
}

/* ---- Gök cisimleri: biri batar, öteki doğar ---- */
.theme-body {
  position: absolute;
  top: 0; left: 0;
  width: 54px; height: 54px;
  margin: -27px 0 0 -27px;   /* translate merkezi hizalasın */
  display: grid; place-items: center;
  border-radius: var(--r-full);
  box-shadow: 0 0 46px 16px var(--glow);
  will-change: transform, opacity;
}
.theme-body i { font-size: 26px; line-height: 1; color: var(--body-tint); }

/* Hangi cismin güneş olduğu YÖNE bağlı: koyuya giderken güneş batan, açığa
   giderken doğan taraftır. Renk ve hale tek yerden, iki satırda. */
.is-to-dark  .theme-body--out,
.is-to-light .theme-body--in  { --glow: rgba(255, 209, 102, .30); --body-tint: var(--sun); }
.is-to-dark  .theme-body--in  { --glow: rgba(233, 240, 255, .24); --body-tint: var(--moon); }

/* Batan ay tek istisna: hale AYDINLATMAZ, gölgelendirir. Gece göğünde açık bir
   hale ayı ayırıyor, gündüz göğünde ise açık-üstüne-açık oluyordu — ay yolun
   yarısında kayboluyordu. Koyu kuşak şafakta (kendisi de koyu) görünmez,
   gökyüzü açıldıkça ayı zeminden ayıran şey hâline geliyor; drop-shadow da
   ikonun kenarını keskin tutuyor. */
.is-to-light .theme-body--out   {
  --glow: rgba(16, 24, 62, .28);
  --body-tint: #FFFFFF;
  box-shadow: 0 0 30px 4px var(--glow);   /* 46/16'lık hale koyu renkte leke oluyordu */
}
.is-to-light .theme-body--out i { filter: drop-shadow(0 2px 4px rgba(16, 24, 62, .6)); }

.theme-body--out { animation: bodySet  950ms cubic-bezier(.45, 0, .55, 1) forwards; }
.theme-body--in  { animation: bodyRise 820ms cubic-bezier(.45, 0, .55, 1) 430ms both; }

/* Aydınlığa giderken perde 1600ms; yay da onunla birlikte yayılır, yoksa
   gösterinin son 300ms'i boş gökyüzü olurdu. Ay ŞAFAK ERİMEDEN çıkmalı
   (860 < 800…1184 aralığının ortası), güneş ise perde sönmeye başlamadan
   (%80 = 1280ms) düğmeye konmalı: 480 + 920 = 1400ms, ikonun geri geldiği an
   olan 1460ms'ten hemen önce. */
.is-to-light .theme-body--out { animation-duration: 860ms; }
.is-to-light .theme-body--in  { animation-duration: 920ms; animation-delay: 480ms; }

/* Yay: ara X noktaları başlangıç ile bitiş arasında oranlanır — JS'e dört ayrı
   nokta yazdırmaktansa tek bir uç nokta yeter.

   İki cismin ufku AYRI (--ex sola, --mx sağa) ve bu şart: ikisi de aynı
   noktadan girip çıkarken 700ms'te sol üstte üst üste biniyorlardı, devir
   teslim değil çarpışma gibi duruyordu. Artık güneş sahneden sola batar, ay
   düğmenin tarafından, sağdan doğar — yolları hiç kesişmez.

   Tepe noktası --peak ile sınırlı: düğme zaten ekranın en üstünde (oy≈49), bu
   yüzden sabit "oy - 56px" yükselişi güneşi üst kenardan TAŞIRIYORDU. */
@keyframes bodySet {
  0%   { transform: translate(var(--ox), var(--oy)) scale(1); opacity: 1; }
  30%  { transform: translate(calc(var(--ox) + (var(--ex) - var(--ox)) * .30), var(--peak)) scale(1.06); opacity: 1; }
  70%  { transform: translate(calc(var(--ox) + (var(--ex) - var(--ox)) * .70), calc(var(--oy) + 18vh)) scale(.92); opacity: .8; }
  100% { transform: translate(var(--ex), calc(var(--oy) + 44vh)) scale(.7); opacity: 0; }
}
@keyframes bodyRise {
  0%   { transform: translate(var(--mx), calc(var(--oy) + 44vh)) scale(.7); opacity: 0; }
  40%  { transform: translate(calc(var(--ox) + (var(--mx) - var(--ox)) * .70), calc(var(--oy) + 16vh)) scale(.92); opacity: .95; }
  100% { transform: translate(var(--ox), var(--oy)) scale(1); opacity: 1; }
}

/* ---- Yıldızlar: yalnız koyuya giderken. Gündüz göğünde yıldız olmaz. ---- */
.theme-stars { position: absolute; inset: 0; }
.theme-star {
  position: absolute;
  width: var(--s); height: var(--s);
  border-radius: var(--r-full);
  background: #fff;
  box-shadow: 0 0 6px 1px rgba(255, 255, 255, .5);
  opacity: 0;
}
.is-to-dark .theme-star { animation: starOn 520ms ease-out var(--d) forwards; }

/* Aynı düğümler ters yönde: aydınlığa giderken yıldızlar hazır YANIYOR ve
   teker teker sönüyor — koyuya geçişteki "yanma"nın karşılığı, ikinci bir DOM
   ağacına gerek kalmadan. `both` şart: gecikme boyunca %0 karesi geçerli
   olmasa taban kuralın opacity:0'ı yıldızları hiç göstermezdi. */
.is-to-light .theme-star { animation: starOff 600ms ease-in var(--d) both; }

@keyframes starOn {
  0%   { opacity: 0;   transform: scale(.4); }
  60%  { opacity: 1;   transform: scale(1.15); }
  100% { opacity: .85; transform: scale(1); }
}
@keyframes starOff {
  0%   { opacity: .9; transform: scale(1); }
  30%  { opacity: 1;  transform: scale(1.35); }   /* sönmeden önce son bir parıltı */
  100% { opacity: 0;  transform: scale(.3); }
}

/* ---- Bulutlar: yalnız aydınlığa giderken. Gece göğünde bulut çizmiyoruz. ----
   Yıldızın gündüz karşılığı. Yıldız gibi bunlar da GLYPH değil: FA'nın bulutu
   tek renk bir siluet, gökyüzünün önünde çıkartma gibi duruyordu; üç daireden
   kurulan yumuşak biçim hem daha kabarık hem de ölçekten bağımsız.
   Konum/genişlik/yön JS'ten gelir (px), çünkü hepsi viewport'a göre. */
.theme-cloud {
  position: absolute;
  top: var(--y);
  left: 0;
  width: var(--w);
  height: calc(var(--w) * .30);
  background: #fff;
  border-radius: var(--r-full);
  opacity: 0;
  animation: cloudDrift 1150ms cubic-bezier(.24, .62, .36, 1) var(--d) forwards;
}
.theme-cloud::before,
.theme-cloud::after {
  content: "";
  position: absolute;
  background: inherit;
  border-radius: var(--r-full);
}
.theme-cloud::before { width: 48%; height: 170%; left: 11%; bottom: 30%; }
.theme-cloud::after  { width: 34%; height: 126%; right: 13%; bottom: 24%; }

@keyframes cloudDrift {
  0%   { opacity: 0;   transform: translateX(var(--from)); }
  35%  { opacity: .88; }
  100% { opacity: .88; transform: translateX(var(--to)); }
}

/* ---- Düğme: ikon uçarken yok, indiğinde yeni ikon ---- */
.nav-theme i { transition: opacity 180ms ease, transform 180ms ease; }
.nav-theme.is-flying i { opacity: 0; transform: scale(.4); }

/* JS azaltılmış harekette katmanı zaten hiç kurmuyor; bu, kuralın CSS
   tarafında da yazılı durması için (global blok 25 yalnız süreyi kısaltır,
   bu da perdeyi görünür bir çakma hâline getirirdi). */
@media (prefers-reduced-motion: reduce) {
  .theme-sky { display: none; }
  .nav-theme i { transition: none; }
}

/* ----------------------------------------------------------------------------
   34) Gelişim çemberi — "Her etkinliğin bir amacı var"
   (Components/Site/GrowthWheel.html · ana sayfa, hızlı çözümden sonra)

   NUMARA SIRASI DOSYADA BİLEREK ATLIYOR: 33 (Formlar) dosyanın SONUNDA kalmak
   zorunda — gerekçesi kendi başlığında yazılı (özgüllük beraberliğini sıra
   çözüyor). Yeni bloklar bu yüzden onun ÜSTÜNE girer.

   Sekiz yay + ortada sayaç, yanında sekiz alan çipi. Yay uzunlukları EŞİT ve
   veri taşımaz; sebebi partial'ın başında.
---------------------------------------------------------------------------- */
/* BAŞLIK KARTIN İÇİNDE, ÇEMBER SAĞDA (2026-08-30, konsey kararı 4 — ana
   sayfanın "ortalanmış başlık bandı → içerik" kalıbını kıran üç bölümden
   biri). Kolonlar 2026-08-30'da YER DEĞİŞTİRDİ: bilgi (başlık + sekiz çip)
   geniş SOL kolonda, dekoratif çember dar SAĞ kolonda.

   İKİ ŞEY YÜK TAŞIYOR:
   1) YERLEŞİM AÇIK YAZILIR (`grid-column`/`grid-row`), otomatik akışa
      bırakılmaz: DOM sırası başlık → ÇEMBER → çipler ve bunun sebebi mobil
      (tek kolonda "başlık, görsel, liste" okunmalı). Otomatik akış çemberi
      sol kolonun ikinci satırına koyar, yani masaüstünde başlığın altına.
   2) Başlık ÜSTE hizalanır ama çember kendi iki satırlık alanının ORTASINDA
      durur (`align-self: center`) — `align-items: center` tabanda kalsaydı
      başlık kendi hücresinde ortalanıp çiplerden kopardı.
   Geniş kolon `minmax(0, 1fr)`: düz `1fr` grid öğesinin min-content'i kadar
   küçülmez ve uzun bir alan adı ("Sosyal-Duygusal Gelişim") kolonu şişirip
   çemberi ezerdi. */
.gw {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(250px, 360px);
  /* ÜÇÜNCÜ SATIR bilgi satırının: kartın dibinde, iki kolonu birden kapsıyor
     (2026-09-07 — düğme kartın sağ alt köşesinde). */
  grid-template-rows: auto 1fr auto;
  gap: clamp(24px, 4vw, 54px);
  align-items: start;
  padding: clamp(22px, 3.2vw, 38px);
}
.gw-head { grid-column: 1; grid-row: 1; max-width: 34em; }
/* Başlık ile çip listesi arası: `.sec-head`in bölüm bandındaki 34-54px'lik
   payı burada fazla — başlık ve liste artık AYNI kartın içinde. */
.gw-head .sec-sub { margin-top: 10px; }
.gw-side { grid-column: 1; grid-row: 2; }
.gw-chart { grid-column: 2; grid-row: 1 / span 2; align-self: center; }
.gw-proof { grid-column: 1 / -1; grid-row: 3; }

/* ---- Çember ---- */
.gw-chart { position: relative; width: 100%; max-width: 360px; margin-inline: auto; aspect-ratio: 1; }
/* -90deg: ilk yay saat 12'den başlasın. Yayların dashoffset'i bu dönüşe göre
   hesaplandı (partial'daki geometri notu). */
.gw-ring { display: block; width: 100%; height: 100%; transform: rotate(-90deg); }
/* ARKA HALKA (gri "track") YOK, ve geri gelmemeli. Sekiz yayın ardında duran
   16px'lik gri çember, yayların arasındaki boşlukları da doldurduğu için
   çemberi "eksik doldurulmuş bir ilerleme çubuğu" gibi gösteriyordu — oysa
   yaylar bir ilerleme DEĞİL, sekiz alanın haritası (partial'daki not). Renkli
   yaylar zaten daireyi kendileri çiziyor; gri halka yalnız onların
   doygunluğunu düşürüyordu. */

/* VARSAYILAN HÂL ÇİZİLMİŞ ÇEMBERDİR: JS yoksa (.js sınıfı yoksa) sekiz yay
   olduğu gibi durur. Toplanmış hâl `.js` ön ekli, açılma `.is-visible` ile
   geliyor — reveal'in kendi kuralıyla aynı mantık. Sıra önemli: üçü de aynı
   özelliği yazıyor, sonuncusu kazanmalı. */
.gw-arc {
  fill: none;
  stroke-width: 16;
  stroke-linecap: round;
  stroke-dasharray: 52.5 575.82;
  transition: stroke-dasharray .75s cubic-bezier(.2, .8, .25, 1),
              stroke-width var(--t-sm) ease,
              stroke-opacity var(--t-sm) ease;
  transition-delay: calc(var(--i) * 70ms), 0s, 0s;
}
.js .gw-arc { stroke-dasharray: 0 628.32; }
.gw.is-visible .gw-arc { stroke-dasharray: 52.5 575.82; }

/* Bir alanın üstüne gelince (çipten ya da yayın kendisinden) o yay öne çıkar,
   ötekiler solar. Solma `stroke-opacity` ile, `opacity` ile DEĞİL: `opacity`
   yukarıdaki açılma animasyonunun kullandığı özellik, ikisi aynı olsaydı
   vurgulama açılışı ezerdi. */
.gw.is-focus .gw-arc { stroke-opacity: .3; }
.gw.is-focus .gw-arc.is-on { stroke-opacity: 1; stroke-width: 23; }

/* Merkez: yazı alanı halkanın İÇ dairesine sığmalı. İç yarıçap 92/120 → o
   dairenin içine sığan karenin kenarı kutunun ~%54'ü; %23 yan dolgu tam o. */
.gw-core {
  position: absolute; inset: 0;
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  padding-inline: 23%;
  text-align: center;
}
.gw-core-num {
  font-family: var(--font-head); font-weight: 900;
  font-size: clamp(2.15rem, 5vw, 3.05rem); line-height: 1;
  /* Sayaç 0'dan 1.000'e sayarken rakam genişliği değişirse altındaki etiket
     her karede kayar — hero'daki sayının kuralının aynısı. */
  font-variant-numeric: tabular-nums;
  /* Düz renk ÖNCE: gradyan metnin desteklenmediği tarayıcıda `transparent`
     sayıyı tamamen görünmez yapardı ve hiçbir şey hata vermezdi. */
  color: var(--blue-deep);
}
@supports (background-clip: text) or (-webkit-background-clip: text) {
  .gw-core-num {
    background: var(--grad-text);
    -webkit-background-clip: text; background-clip: text;
    color: transparent;
  }
}
.gw-core-unit { margin-top: 3px; font-size: var(--fs-sm); font-weight: 700; color: var(--tx2); }
.gw-core-rule { width: 30px; height: 1px; margin: 9px 0 8px; background: var(--border-strong); }
.gw-core-label {
  font-size: var(--fs-xs); font-weight: 800; color: var(--tx2);
  letter-spacing: .01em; line-height: 1.3;
}

/* ---- Sekiz alan çipi ---- */
.gw-list {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px;
  list-style: none; margin: 0; padding: 0;
}
/* Çip bir <button>, `<li>` ise yalnız onun taşıyıcısı (gerekçe:
   GrowthWheel.html). `display: grid` ŞART — tek çocuk hücrenin tamamına yayılır,
   yani butonun kutusu eski `<li>`nin kutusuyla birebir aynı kalır; yazılmazsa
   buton yalnız içeriği kadar yükselir ve komşusundan uzun bir satırda kenarlık
   erken biter. */
.gw-li { display: grid; }
/* İlk üç bildirim BUTON SIFIRLAMASI, tasarım değil: `font: inherit` olmadan
   düğme UA yazı tipine (Arial 13.3px) düşer ve rozetin `1.05em` ikonu da onunla
   küçülür; `background: transparent` olmadan gri UA yüzeyi görünür (vurgu hâli
   zaten aşağıda boyanıyor); `text-align: left` olmadan iki satırlık metin
   ortalanır. Görünüm `<li>` hâliyle aynı kalsın diye buradalar. */
.gw-item {
  font: inherit; color: inherit; text-align: left;
  background: transparent; -webkit-appearance: none; appearance: none;
  margin: 0; width: 100%;
  display: flex; align-items: center; gap: 11px;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--r);
  transition: transform var(--t-sm) ease, border-color var(--t-sm) ease,
              background var(--t-sm) ease;
}
.gw-item:hover, .gw-item.is-on {
  transform: translateY(-2px);
  border-color: color-mix(in srgb, var(--da) 46%, transparent);
  background: color-mix(in srgb, var(--da) 8%, transparent);
}
/* Çipler bilgiyi TAŞIYAN taraf: bir alan vurgulanırken ötekiler SOLMAZ.
   Solan yay dekoratif, solan metin okunmaz metindir. */
.gw .devarea-ico { flex: 0 0 38px; height: 38px; border-radius: 12px; }
.gw .devarea-ico svg { width: 1.05em; height: 1.05em; }
.gw-item-copy { display: flex; flex-direction: column; min-width: 0; }
.gw-item-copy b {
  font-family: var(--font-head); font-weight: 700;
  font-size: var(--fs); line-height: 1.25; color: var(--tx1);
}
.gw-item-copy small { font-size: var(--fs-xs); line-height: 1.35; color: var(--tx2); }

.gw-proof {
  display: flex; align-items: flex-start; flex-wrap: wrap; gap: 9px;
  margin: 16px 2px 0;
  font-size: var(--fs-sm); font-weight: 700; color: var(--tx2);
}
/* Satırın YANINDAKİ bağlantı — /gelisim'e (2026-08-26, kullanıcı kararı).
   Dar ekranda cümlenin yanına sığmaz; `flex-wrap` onu kendi satırına indirir,
   yoksa iki öğe sıkışıp cümle harf harf sarardı. Mürekkep `--btn-tx`: bölümün
   aksanı (oyna pembesi) küçük punto metinde AA'yı zorlar, sekiz alan rengi ise
   burada bir SINIFLANDIRMA taşıyor — bağlantı ise nötr bir sayfa eylemi.
   Ok bir FA glyph'i ve hover'da kayar — metnin içine "→" yazılmaz; punto ise
   satırınki (`--fs-sm`). (Aynı dili /kategoriler'in `.cw-areas-more` satırı da
   konuşuyordu; o satır 2026-08-31'de kaldırıldı, bu kural sitede tek kaldı.) */
/* BİÇİM ROZET, YERİ SATIRIN SAĞ UCU (2026-09-07, kullanıcı kararı). Bağlantı
   `.eyebrow.eyebrow-cta` giyiyor (bkz. §"Ok çipli metin CTA" altındaki not),
   yani okunu kendisi `»` olarak çiziyor — şablondaki `fa-arrow-right` <i>'si
   bu yüzden silindi, yoksa satırda iki ok olurdu.

   MÜREKKEP TOKEN'I DEĞİŞMEDİ (`--btn-tx`, aşağıda geri yazılıyor) ve bu
   ölçülmüş bir istisna: rozet normalde bölüm aksanını sürer, buranın aksanı
   ise oyna pembesi (`--cat-oyna-deep` #D71E9B) — küçük punto metinde AA'yı
   zorluyor, üstelik sekiz alanın rengi bu kartta bir SINIFLANDIRMA taşıyor.
   Bağlantı nötr bir sayfa eylemi, o yüzden rozetin şeklini alır, rengini
   almaz.

   `margin-left: auto` satırın SAĞ ucuna iter; `flex-wrap` hâlâ açık, yani dar
   ekranda alta iner (kutunun kendi kuralı, yukarıdaki not). */
.gw-more {
  margin-left: auto; align-self: center;
  white-space: nowrap;
}
/* Aksan YEREL DEĞİŞKENDEN çevrilir, tek tek kurallardan değil: `--ec` kenarı,
   zemini, haleyi ve oku birden taşıyor (bkz. `.eyebrow-cta`). */
.gw-more.eyebrow-cta { --ec: var(--btn); color: var(--btn-tx); }
/* Mürekkep tek token: açık temada `-deep` (metin kontrastı), koyu temada
   ailenin açık ucu — .energy-line ile aynı kural. */
.gw-proof i { margin-top: .15em; color: var(--cat-kesfet-tx); }

@media (max-width: 900px) {
  /* Tek kolon: açık yerleşim SÖKÜLÜR ve DOM sırası geçerli olur — başlık,
     çember, çipler. Kalan `grid-column: 2` mobilde var olmayan bir kolona
     yazar ve grid sessizce ikinci bir kolon AÇAR (çember tek başına sağda,
     başlığın yanında bir şerit). */
  .gw { grid-template-columns: 1fr; grid-template-rows: none; }
  .gw-head, .gw-side, .gw-chart, .gw-proof { grid-column: auto; grid-row: auto; }
  .gw-chart { max-width: 290px; }
  /* BASLIK ISTIFI TEK KOLONDA ORTALANIR (2026-09-10). Masaustunde sola
     yasliligin gerekcesi "baslik kartin ICINDE, cember SAGDA" (2026-08-30
     konsey karari 4) ve o gerekce burada YOK: olculdu, 900px altinda
     `.gw-head`in yatay komsusu yok — cember DOM sirasiyla altina iner.
     Sayfanin diger butun bolum basliklari (`.sec-head`, `.wall-head`) her
     genislikte ortali, yani tek kolonda sola yasli kalan bu blok sayfanin
     TEK istisnasi oluyordu. `/ozellikler`de `.f2-subhead` ayni gerekceyle
     ortalandi; masaustu piksel piksel ayni kalir (kural 900px'in altinda). */
  .gw-head { text-align: center; margin-inline: auto; }
  /* `.gw-more`un `margin-left: auto`su satirin SAG ucuna iter ve tek kolonda
     kutu tek basina kaldigi icin o itis `justify-content`i YENER — birlikte
     yazilmadan ortalama etkisiz kalir (olculdu: skew +21px). */
  .gw-proof { justify-content: center; }
  .gw-more { margin-left: 0; }
}
@media (max-width: 560px) {
  .gw-list { grid-template-columns: 1fr; }
  .gw-chart { max-width: 240px; }
}

/* Global azaltılmış-hareket bloğu yalnız SÜREYİ sıfırlıyor; buradaki sıralı
   açılma GECİKMEYE dayanıyor, o yüzden kendi bloğu şart (§11'deki durumun
   aynısı). */
@media (prefers-reduced-motion: reduce) {
  .gw-arc { transition-delay: 0s !important; }
}

/* ----------------------------------------------------------------------------
   35) Gelişim sayfası → `Css/Site/Growth.css`

   Bu bölüm 2026-08-25'te SAYFAYA ÖZEL dosyaya taşındı (Features.css /
   Categories.css deseni): ≈110 satır her sayfaya iniyor ama yalnız /gelisim'de
   geçiyordu. Buraya `.ga-*`, `.gn-*` ya da `.gx-*` kuralı GERİ EKLENMEZ —
   kapsam ayrı kaldığı sürece o sayfa başka bir sayfada gerileme yaratamaz.
---------------------------------------------------------------------------- */

/* ----------------------------------------------------------------------------
   33) Formlar: yerinde gönderim (Site.js "Formlar" bölümü)

   Üç form da (waitlist, iletişim, etkinlik öner) sayfayı yenilemeden gönderilir.
   Sonuç, alanların TAM YERİNDE gösterilir: .af-swap bir kap, içinde iki yüz
   ([data-ajax-body] = alanlar, [data-ajax-result] = mesaj) — biri gizlenirken
   diğeri açılır, kap ikisi arasında yükseklik geçişi yapar.

   Neden yükseklik animasyonu, ızgara üst üste bindirme değil: iki yüzü aynı
   ızgara hücresine koymak kabı DAİMA uzun olanın (formun) boyunda tutar; kısacık
   "teşekkürler" satırının altında koca bir boşluk açılırdı. Yükseklik geçişi
   yalnız px→px arasında çalışır, o yüzden JS önce mevcut yüksekliği kilitler.

   overflow BİLEREK kısılmadı: .wl-input:focus halkası box-shadow ile çiziliyor,
   overflow:hidden onu kırpardı. Geçiş sırasındaki birkaç px taşma zaten sönük.
---------------------------------------------------------------------------- */
.af-swap { transition: height 340ms cubic-bezier(.22,.61,.36,1); }
[data-ajax-body], [data-ajax-result] {
  transition: opacity 190ms ease, transform 190ms ease;
}
[data-ajax-body].is-off, [data-ajax-result].is-off {
  opacity: 0; transform: translateY(-5px) scale(.99);
}
/* Mesaj kutusu takas kabının tek çocuğu — sunucu render'ındaki üst kardeşinden
   farklı olarak altında boşluk taşımaz. */
.af-result { margin: 0; }

/* ---- Buton: gönderim sürerken halka ----
   Etiket ve ikon `color: transparent` ile kaybolur (ikisi de aynı rengi
   miras alır), böylece buton GENİŞLİĞİ sabit kalır — spinner metnin yerine
   geçseydi satır her gönderimde zıplardı.
   Bu blok dosyanın SONUNDA ve (0,2,0) özgüllükte: buton rengini yazan her
   bileşik kuralla eşit ağırlıkta olup sonra geldiği için hepsini susturur —
   yeni bir `.x .btn { color }` kuralı bunun ÜSTÜNE yazılırsa spinner'ın
   altından etiket görünür. */
.btn.is-busy {
  position: relative;
  color: transparent;
  pointer-events: none;
}
.btn.is-busy::after {
  content: "";
  position: absolute; inset: 0; margin: auto;
  width: 20px; height: 20px;
  border-radius: 50%;
  border: 2.5px solid rgba(255,255,255,.34);
  border-top-color: #fff;
  animation: afSpin 700ms linear infinite;
}
@keyframes afSpin { to { transform: rotate(360deg); } }
