@import url("hero.css");        /* hero/banner bileşeni — tek kaynak, ayrı dosya */
@import url("alt-cubuk.css");   /* alt çubuk bileşeni — tek kaynak, ayrı dosya */
/* =====================================================================
   KANON — BİLEŞEN KATMANI
   ---------------------------------------------------------------------
   SABİT RENK YOK. Her renk, ölçü, boşluk ve yuvarlaklık tokenlar.css'ten
   gelir; aksan renkleri markalar/<marka>.css'in doldurduğu yuvalardan.
   Bu dosyada tek bir hex, tek bir ham px yoktur.

   Yükleme sırası:  tokenlar.css → markalar/<marka>.css → bilesenler.css

   Kaynak: dump/fit-prototip · 61 public sayfa (admin hariç).
   Sayım DESEN üzerinden: aynı kutu N adla yazılmışsa tek bileşendir ve
   yayılımı N adın birleşimidir. Gerekçe 02-bilesenler.md §0.

   Her bloğun başındaki sayı, o bileşenin kaç sayfada geçtiğidir.
   3'ten az geçenler bu dosyada YOKTUR (02-bilesenler.md §ADAY).

   🔴 işaretli satırlar kaynaktaki ölçülmüş kusurları DÜZELTİR; hangi
   ölçümle düzeldiği 02-bilesenler.md'de yazılı.
   ===================================================================== */


/* =====================================================================
   0 · TABAN KATMANI — 2026-09-04 · ADMIN TURU
   ---------------------------------------------------------------------
   🔴 KANONUN HİÇ SINANMAMIŞ VARSAYIMI: "kabuk zaten sıfırlamıştır."
   Bugüne kadar her kanon ekranı donörün kabuk CSS'ini de yüklüyordu ve
   `box-sizing` · `body` sıfırlaması · yazı yüzü ORADAN geliyordu. Kanon
   üç dosya olarak TEK BAŞINA hiç kullanılmadı — admin ekranları ilk
   kez öyle kullanıyor (kabuk artık kanonun kendi §75a/b'si).

   ÖLÇÜLDÜ, ilk admin kabuğu basıldığında ortaya çıktı:
       beklenen                  çıkan
       ray 76px                  77px    ← kenar kutunun DIŞINDA
       menü 264px                265px   ← aynı
       gövde sol 340px           348px   ← body'nin 8px UA payı
   Yani `*{box-sizing:border-box}` ve `body{margin:0}` yokken §75'in
   BÜTÜN piksel ölçüleri 1–8px kayıyordu.

   DEĞERLER DONÖRDEN ÖLÇÜLDÜ (`admin-uyeler-v1`, render edilmiş DOM):
       box-sizing   border-box
       body margin  0px
       body zemin   rgb(249,249,249)   = --zemin
       body renk    rgb(33,30,22)      = --murekkep
       body yüzü    Gilroy, system-ui  = --yazi-yuzu
       body punto   16px               = --yazi-16
       body ağırlık 500                = --agirlik-govde
       body satır   24.8px (16×1.55)   = --satir-govde
       kaydırma     smooth
   Hiçbiri uydurulmadı; hepsinin tokeni ZATEN kanonda vardı.

   ⚠ KOPYALAMA-KURALI'NIN "İKİNCİ SIFIRLAMA" TUZAĞINA DÜŞMÜYOR.
     O kural şunu yasaklıyordu: *"kabuk yüklendikten SONRA sayfaya ikinci
     bir sıfırlama yazmak, kanondan SONRA geldiği için dört bileşen
     kuralını birden ezdi."* Buradaki fark konum: bu blok kanonun EN
     BAŞINDA, bütün bileşen kurallarından ÖNCE. Bileşen kuralları onu
     ezer, o bileşen kurallarını değil. Sayfaya yazılan sıfırlama hâlâ
     yasak — çünkü o kanondan sonra gelir.

   ⚠ DONÖR KABUĞUYLA BİRLİKTE YÜKLENDİĞİNDE ETKİSİZ: değerler kabuğunkiyle
     birebir aynı, yani mevcut public ekranlarda hiçbir şey değişmez.
     Regresyon ölçüldü (bkz. `docs/admin-kanon-kararlari.md` K-B1).
   ===================================================================== */

*,*::before,*::after{ box-sizing:border-box; }
body{
  margin:0;
  background:var(--zemin);
  color:var(--murekkep);
  font-family:var(--yazi-yuzu);
  font-size:var(--yazi-16);
  font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde);
  -webkit-font-smoothing:antialiased;
}
html{ scroll-behavior:smooth; }
/* Hareket azaltma isteği kaydırmayı da kapsar — kaynağın `smooth`u bir
   tercih, kullanıcının isteği bir şart. */
@media (prefers-reduced-motion:reduce){ html{ scroll-behavior:auto; } }
/* Görsel taşmasın — kanonda `img` için tek kural yoktu ve admin medya
   ızgarası ilk tüketicisi. */
img,svg,video{ max-width:100%; }
/* 🔴 DÜĞME ALTI ÇİZİLİ ÇİZİLİYORDU — ölçüldü 2026-09-04, 12 örnek tek
   ekranda. `.dugme` `text-decoration` BİLDİRMİYOR; `<button>`da sorun
   yok (UA zaten çizmiyor) ama `<a class="dugme">`de UA'nın `underline`ı
   miras kalıyor. `.panel-menu-link` ve `.kisi-hucre` kendi bildirimlerini
   taşıdığı için temizdi — yani kusur bileşenin değil, TABANIN eksiğiydi.
   ⚠ Genel `a{text-decoration:none}` YAZILMADI: akan metindeki bağın altı
     çizili KALMALI (WCAG 1.4.1 — bağ yalnız renkle ayrılmaz). Kural
     düğme rolündeki bağa yazılıyor, bağın kendisine değil. */
a.dugme,a.sayfa-dugme,a.ikon-dugme,a.cip,a.suzgec-dugme{ text-decoration:none; }


/* =====================================================================
   1 · KART — 39 sayfa · kaynakta 51 ad
   `.fp-card` `.pnl-card` `.form-card` `.tips-card` `.od-card` `.au-card`
   `.info-card` `.svc-card` `.demo-card` `.coach-card` … (tam liste 02 §14)
   ===================================================================== */

.kart{
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg);
  box-shadow:var(--golge-sm);
}
/* 🔴 TABAN ÇAĞRISI TAŞINMADI — `token-envanteri` ölçtü (B7), 2026-09-03.
   §63d'de `--cizgi-vurgu` (#dddddd) KİLİTLİ kartın kenarı olarak ayrıldı
   ve tabanın hover kenarı için `--cizgi-vurgu-acik` (#dcdcdc) açıldı;
   ama YUVA AYRILDI, ÇAĞRI YERLERİ TAŞINMADI. Bu iki satır hâlâ kilitli
   kartın değerini taban rolünde kullanıyordu. */
.kart:hover{ border-color:var(--cizgi-vurgu-acik); }

.kart-bas{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--bosluk-16);
  padding:var(--bosluk-20) var(--bosluk-24);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.kart-bas:has(p){ align-items:flex-start; }
.kart-bas:has(p)>:first-child{ min-width:0; }
.kart-bas p{
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); margin-top:var(--bosluk-4);
  /* 🔴 YASLAMA İSTİSNASI — kabuk katmanı `p`ye `text-align:justify` yazıyor
     ve DOĞRUDAN bildirim, kabın kalıtımını yener. Ölçüldü 2026-09-01:
     kart açıklaması iki yana yaslanıyordu, kaynakta `start`. §21'in aynısı. */
  text-align:left; text-align-last:auto;
}
.kart-baslik{
  display:flex; align-items:center; gap:var(--bosluk-8);
  font-size:var(--yazi-16); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); line-height:var(--satir-govde);
  letter-spacing:normal;
}
/* 🔴 KANON ADI YOKLUĞU İÇERİK KAYBETTİRDİ — ölçüldü 2026-09-03.
   slot-egzersiz `.kart.dolgulu` + `.ozet-bas` kabında gövde metnini
   saracak bir kanon adı BULAMADI (`.kart-bas p` var ama `.kart-bas`a
   bağlı) ve sınıfsız `<p>` bırakmak tarayıcı varsayılanı basmak olacağı
   için kaynağın KATALOG TANITIM CÜMLESİNİ ÇIKARDI.
   🔴 Kanon boşluğunun en pahalı biçimi: ad yokluğu İÇERİK siliyor.
   Ölçüt kaynağın kendi kart gövde metni: 13px · `--muted` · gövde satırı.
   Bileşen değil KALEM — §1'in içinde, yeni bölüm açılmadı (K8/1). */
.kart-metin{
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); line-height:var(--satir-govde);
}
.kart-metin + .kart-metin{ margin-top:var(--bosluk-9); }
.kart-metin a{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }

.kart-baslik i{ color:var(--aksan); font-size:var(--yazi-15); }

.kart-govde{ padding:var(--bosluk-24); }
.kart-govde.bosluksuz{ padding:0; }

.kart-alt{
  display:flex; align-items:center; gap:var(--bosluk-16); flex-wrap:wrap;
  padding:var(--bosluk-16) var(--bosluk-24);
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.kart-alt>.dugme{ margin-left:auto; }
/* 🔴 PANEL KARTININ AYAĞI SARMAZ. Taban `.kart-alt` `flex-wrap:wrap`
   yazıyor; kaynağın karşılığı (`fit-shell.css:1477`) yalnız `padding` ve
   `border-top` bildiriyor, sarma varsayılanda kalıyor → `nowrap`.
   Kaynağın seçicisiyle AYNI kapsama yazıldı (`.pnl-card .pc-foot`);
   taban değiştirilmedi, çünkü `.kart-alt`ı başka kaplar da kullanıyor ve
   onların ölçülmüş çifti yok — ölçülmemiş bir kalemi değiştirmek,
   ölçülmüş bir kalemi düzeltmekle aynı şey değildir.
   ⚠ ÜÇ TUR GÖRÜNMEDİ: `flexWrap` ölçüm listesinde yoktu (2026-09-02'de
   eklendi). Sarma kararını hiçbir özellik okumuyordu. */
.kart.panel .kart-alt{ flex-wrap:nowrap; }
.kart-alt .not{
  font-size:var(--yazi-12-5); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde);
}
.kart-alt .not a{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }
.kart-alt .not a:hover{ text-decoration:underline; text-underline-offset:2px; }

/* ---- varyantlar ---- */
.kart.dolgulu{ padding:var(--bosluk-24); }
.kart.tasma-kapali{ overflow:hidden; }     /* içindeki tablo köşeleri kırpılsın */
.kart.genis{                                /* giriş kartı ailesi — 02 §1 B12 */
  border-radius:var(--yuvarlak-xl);
  padding:var(--bosluk-32) var(--bosluk-40) var(--bosluk-32);
  display:flex; flex-direction:column;
}
/* ---- PANEL VARYANTI — kaynak `.pnl-card` (fit-shell.css:1456-1478) ----
   🔴 ÖLÇÜMLE AYRILDI (2026-09-01, destek modülü turu). Kanon 51 kart adını
   tek `.kart`e indirmişti; render edilmiş DOM kaynakta İKİ ayrı kart kiti
   olduğunu gösterdi ve ikisi de yayılımlı:
       `.fp-card` ailesi (taban)   başlık 20/24 · gap 8  · ayak 16/24
       `.pnl-card` ailesi (panel)  başlık 18/22 · gap 10 · ayak 14/22
   Kaynak kendi şerhinde bunu numaralandırmış bile: §C3 "başlık kabı
   18px 22px", §C5 "gövde 22px", §C6 "ayak 14px 22px".
   Aynı gerekçe §11'de de yaşandı (modül şeridi ≠ kategori şeridi):
   ölçüm iki kalemin ayrı olduğunu söylüyorsa kanon onları birleştirmez.
   ✅ Gövde dolgusu ÖLÇÜLDÜ (2026-09-01, hesabim turu · B41): kaynağın
     bildirimi (22px) doğrulandı. `hesabim-v1 .pnl-card .pc-body` → 22px,
     `destek-v1` → 0px çünkü orada sınıf `pc-body flush`. İki ekran çelişmiyor,
     ikinci `.bosluksuz` kipinde. Kural aşağıda yazılı; not kapandı. */
.kart.panel+.kart.panel{ margin-top:var(--bosluk-16); }
.kart.panel>.kart-bas{ padding:var(--bosluk-18) var(--bosluk-22); gap:var(--bosluk-14); }
.kart.panel>.kart-bas .kart-baslik{ gap:var(--bosluk-10); }
.kart.panel>.kart-bas p{ margin-top:var(--bosluk-5); }
/* §C5 · panel gövdesi 22px (taban `.kart-govde` 24px değil).
   ⚠ `:not(.bosluksuz)` ZORUNLU: bu seçici (0,3,0), `.kart-govde.bosluksuz`
   ise (0,2,0) — kapsam daraltılmazsa panel kuralı `.bosluksuz`u yener ve
   destek panelinin kenardan kenara akan listesi 22px içeri kaçar. Ölçümde
   yakalandı (taleplerim, 2 kırmızı). */
.kart.panel>.kart-govde:not(.bosluksuz){ padding:var(--bosluk-22); }
/* Panel ayağı BLOKTUR, taban `.kart-alt` gibi flex satır DEĞİL — ölçüldü
   (`.pnl-card .pc-foot` display:block). Taban ayak birden çok düğmeyi yan
   yana dizer; panel ayağı tek bir bloğu (sayfalama) taşır ve o blok kendi
   ortalamasını yapar. Flex kalsaydı sayfalama içeriği kadar daralır,
   `justify-content:center` görünmez olurdu. */
.kart.panel>.kart-alt{ display:block; gap:normal; padding:var(--bosluk-14) var(--bosluk-22); }
/* 🔴 AYAĞIN İKİNCİ KİPİ — `.kart-alt.eylem` (02 §36 · B41).
   Yukarıdaki blok kipi destek panelinin sayfalaması için doğru; hesabim'in
   ALTI ayağı ise `not + kaydedildi rozeti + düğme` üçlüsünü yan yana taşıyor
   ve düğme sağa yapışıyor. Blok kipte üçü alt alta düşer. İki ayrı KULLANIM,
   kusur değil — §11'in "modül şeridi ≠ kategori şeridi" deseninin aynısı.
   Ölçüm: `hesabim-v1 .pnl-card .pc-foot` render edilmiş DOM. */
.kart.panel>.kart-alt.eylem{
  display:flex; align-items:center; gap:var(--bosluk-14); flex-wrap:wrap;
}
.kart.panel>.kart-alt.eylem>.dugme{ margin-left:auto; padding:var(--bosluk-14) var(--bosluk-26); }
.kart.panel>.kart-alt.eylem .not{ font-size:var(--yazi-12-5); color:var(--metin-ikincil); }

/* ---- FORM VARYANTI — kaynak `.form-card` / `.fc-head` ---------------
   Kaynağın ÜÇÜNCÜ kart kiti (bkz. B31: taban `.fp-card`, panel
   `.pnl-card`). Ayrımı yapısal, süs değil: form kartının başlığı kabın
   İÇİNDE yaşar — kart tek bir dolgu taşır (26px) ve başlık o dolgunun
   içinde alt ayraçla ayrılır. Taban/panel kitinde başlık KENDİ dolgusunu
   taşıyan ayrı bir şerittir ve kart dolgusuzdur.
   Sebebi de belli: form alanları kart kenarına kadar uzanmalı; ayrı
   şeritli başlık iki farklı sol kenar üretirdi (B34'ün ta kendisi). */
.kart.form{ padding:var(--bosluk-26); }
.form-bas{
  margin-bottom:var(--bosluk-22);
  padding-bottom:var(--bosluk-18);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.form-bas h2{
  font-size:var(--yazi-20); font-weight:var(--agirlik-kalin);
  display:flex; align-items:center; gap:var(--bosluk-11);
}
.form-bas h2 i{
  flex:none; width:38px; height:38px;
  border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  display:grid; place-items:center; font-size:var(--yazi-15);
}
.form-bas p{
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); margin-top:var(--bosluk-7);
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}

.kart.uyari-kart   > .kart-bas{ border-bottom-color:var(--uyari-cizgi); }
.kart.uyari-kart   .kart-baslik i{ color:var(--uyari); }
.kart.tehlike-kart > .kart-bas{ border-bottom-color:var(--tehlike-cizgi); }
.kart.tehlike-kart .kart-baslik i{ color:var(--tehlike); }

@media (max-width:640px){
  /* 🔴 `flex-direction` TABANDA YAZILMAZ — kaynak İKİYE AYRILIYOR ve
     ikisi de ölçüldü (@390):
       destek-v1  `.pc-head` → row      (≤640 dalı bildirmiyor)
       hesabim-v1 `.pc-head` → column   (sayfa CSS'i açıkça yazıyor)
     `.alan` 20/22 · `.kart-alt` block/flex · `.zorunlu` renginin DÖRDÜNCÜ
     örneği: aynı kit, iki sayfada iki ayrı karar. Ayrım kusur değil
     KULLANIM: hesabim'in 10 kart başlığının onu da uzun açıklama taşıyor
     ve 390px'te satır kipinde başlığı eziyor; destek'inkiler kısa.
     §11'in "ölçüm iki kalemin ayrı olduğunu söylüyorsa birleştirme"
     kuralı (B24) — kip aşağıda, `.acikli`. */
  /* 🔴 SARMA EKLENDİ — 2026-09-04, 390 geçişinde ölçüldü.
     `.kart-bas` `space-between` + `nowrap` taşıyor; başlık ile sağdaki
     kalem (rozet · durum hapı · eylem) 390'da sığmayınca kutu SARMIYOR ve
     sağdaki kalem kabın dışına taşıyor.
     ÖLÇÜLDÜ (`admin-antrenorler` @390 · `.adim-liste > .kart > .kart-bas`):
         span.rozet.bekleme "Bekliyor"  sağ kenar 474 > 390
     🔴 Taşma kök `scrollWidth`ine YANSIMIYOR çünkü §60b `overflow-x:clip`
     yazıyor — clip kesiyor, yani rozet EKRANIN DIŞINDA KALIYOR ve hiç
     okunamıyor. Kırpma kusuru göstermiyor, GİZLİYOR.
     ⚠ Üç varyantın `flex-direction:column`ı (aşağıda) bu işi zaten
       yapıyordu; taban satır kipinde kaldığı için yalnız onlar temizdi.
       `wrap` tabana yazılınca dört kip de kapanıyor ve sütun kipleri
       etkilenmiyor — tek kolonda sarma görünmez. */
  .kart-bas{ align-items:flex-start; gap:var(--bosluk-12); padding:var(--bosluk-16); flex-wrap:wrap; }
  /* AÇIKLAMALI PANEL — başlığı uzun açıklama taşıyan kart. Dar ekranda
     başlık ve sağ kalem alt alta iner. */
  .kart.panel.acikli>.kart-bas,
  .kart.uyari-kart>.kart-bas,
  .kart.tehlike-kart>.kart-bas{ flex-direction:column; }

  /* MD2 · ayağın eylem kipi — düğme TAM GENİŞLİK ve ÜSTTE. Taban
     `margin-left:auto` dar ekranda düğmeyi nota yapıştırıyordu. */
  .kart.panel>.kart-alt.eylem>.dugme{ width:100%; margin-left:0; order:1; }
  .kart.panel>.kart-alt.eylem .not{ order:2; }
  .kart.panel>.kart-alt.eylem .kaydedildi{ order:3; }

  /* MD3 · modal ayağının yatay dolgusu geri gelir (kaynakta `.pc-foot`un
     ≤640 dalı `.tfa-foot`un sıfırlamasını eziyor). */
  .modal-ayak{ padding-inline:var(--bosluk-16); }

  /* MD4 · adım şeridi küçülür */
  .adim-serit li{ font-size:var(--yazi-11-5); }

  /* MD5 · kapak düzenleme düğmesi — `.kapak-muhur`un kardeşi, aynı köşe
     ailesi; mühürün dalı yazılırken atlanmıştı. */
  .kapak-duzenle{
    top:var(--bosluk-12); right:var(--bosluk-12);
    padding:var(--bosluk-8) var(--bosluk-13); gap:var(--bosluk-6);
    font-size:var(--yazi-11);
  }
  .kart-govde{ padding:var(--bosluk-16); }
  .kart.dolgulu{ padding:var(--bosluk-20); }
  .kart.genis{ padding:var(--bosluk-24) var(--bosluk-20); border-radius:var(--yuvarlak-lg); }
  /* Form kartı dar ekranda küçülür VE köşesi düşer — kaynak
     `destek-v1.html:224` (`.form-card{padding:20px 16px;border-radius:
     var(--radius-md)}`). Kanonda mobil dal hiç yoktu, 26px/16r kalıyordu. */
  .kart.form{ padding:var(--bosluk-20) var(--bosluk-16); border-radius:var(--yuvarlak-md); }
}


/* =====================================================================
   2 · DÜĞME — 51 sayfa
   Kaynağın EN DERLİ TOPLU bileşeni: 61 sayfanın 50'si tek `.btn` adını
   kullanıyor. Kanon yalnız varyant adlarını Türkçeleştiriyor.
   ===================================================================== */

.dugme{
  display:inline-flex; align-items:center; justify-content:center;
  /* 🔴 `justify-content` KUTUYU ortalar, METNİ değil — iki satıra düşen
     düğmede ikinci satır sola yaslanıyordu. Kaynak `fit-shell.css:242`
     açıkça `text-align:center` yazıyor (02 §36 · B44 · slot-3).
     B36'nın düğme ailesindeki karşılığı; §2'yi kullanan HER ekranı etkiler. */
  text-align:center;
  gap:var(--bosluk-10);                    /* kaynak 10px */
  font-family:inherit; font-weight:var(--agirlik-kalin);
  font-size:var(--yazi-14-5);
  cursor:pointer; border:none;
  /* Kaynak `14px 26px` (fit-shell.css:245). İlk turda 4px ölçeğine
     yuvarlanıp 16/24 olmuştu; ara kademeler geldikten sonra birebir. */
  padding:var(--bosluk-14) var(--bosluk-26);
  border-radius:var(--yuvarlak-md);
  transition:var(--sure-yavas) var(--yumusama);
  min-height:44px;                 /* WCAG 2.5.8 — kaynakta bazı düğmelerde eksikti */
}
.dugme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--odak-ofset);
}

.dugme.birincil{ background:var(--aksan-koyu); color:var(--kagit); }
.dugme.birincil:hover{ background:var(--aksan-koyu-2); transform:translateY(-2px); }

/* 🔴 İKİNCİL KİP · O2 · Beyar kararı 2026-09-03 — "aksanın tam gücü".
   ÖNCEKİ HÂLİ: `background:--kagit · color:--murekkep · border:--cizgi`.
   ÖLÇÜLDÜ (38 ekran · her sekme tıklanmış · görünen 88 `.hayalet`):
       yüzey ↔ kap   1.00:1      beyaz kartın üstünde BEYAZ
       kenar ↔ kap   1.18:1      #ECECEC · arayüz sınırı eşiği 3:1
       metin ↔ yüzey 16.64:1
   Yani kutunun kendisi görünmüyordu; ekranda duran tek şey etiketti.
   Beyar bunu "siyah beyaz, tasarımsız" diye gördü.

   🔴 KAYNAK DA BİLDİRMİYOR — kanon kusuru DEĞİL, kaynağın kusuru.
   123 donör dosyası ölçüldü: `.btn-ghost` 616 örnek / 85 ekran ve
   BİREBİR aynı sayılar (beyaz · #ECECEC · 12px köşe · 14/26 · 700).
   Kaynağın dolgu taşıyan tek sessiz kipi `.ff-btn` de kâğıttan
   1.05:1 ayrılıyor. Yani ortada taşınacak bir ikincil düğme YOKTU.
   S1 ①'in içtihadı burada da geçerli: "kaynağın ölçülmüş kusuru,
   kanon düzeltir" — ama değer kaynaktan gelemediği için Beyar seçti.

   YENİ DEĞER YAZILMADI. Kanondaki nötr çizgilerin hiçbiri eşiği
   geçmiyor (`--cizgi` 1.18 · `--cizgi-vurgu` 1.36 · `--cizgi-vurgu-koyu`
   1.66); 3:1 veren en açık nötr gri #959595 ve kanonda böyle bir yuva
   YOK. Eşiği geçen tek MEVCUT token aksanın kendisi:
       --aksan  #0093D0  →  kâğıda karşı  3.45:1
   `.dugme.satir` (§47) aynı rengi %30 alfayla kullanıyor ve 1.43'e
   düşüyor; buradaki tam güç yeni ölçü değil, o tokenin kendisi.

   ⚠ AD KORUNDU, YENİ AD AÇILMADI. `.dugme.ikincil` diye yeni bir ad
     ekranlara ulaşmazdı: üretici onu basmıyor ve § GÖMÜLÜ TABLO
     KABI'nın düştüğü kuyruğa düşerdi. `.hayalet` bugün 88 örnek /
     19 ekranda duruyor; kip onun üstüne yazılınca tazelemeyle iner.
     S1 ⑤'in kendi kuralı: "Ad korunur, biçim tek yerden gelir."

   Hover §2'nin KENDİ ailesinden alındı — `.dugme.uyari:hover` aynı
   biçimi zaten yazıyor (kenar koyulaşır · yıkama dolar · kalkar).
   Aksan karşılığı: `--aksan-koyu` (5.36) + `--aksan-yikama`. */
.dugme.hayalet{
  background:var(--kagit); color:var(--aksan-koyu);
  border:var(--cizgi-1) solid var(--aksan);
}
.dugme.hayalet:hover{
  border-color:var(--aksan-koyu); background:var(--aksan-yikama);
  transform:translateY(-2px);
}

.dugme.uyari{
  background:var(--kagit); color:var(--uyari);
  border:var(--cizgi-1) solid var(--uyari-cizgi);
}
.dugme.uyari:hover{ border-color:var(--uyari); background:var(--uyari-yikama); transform:translateY(-2px); }

.dugme.tehlike{ background:var(--tehlike); color:var(--kagit); }
.dugme.tehlike:hover{ background:var(--tehlike-koyu); transform:translateY(-2px); }

/* 🔴 ÇİZGİLİ TEHLİKE — 2026-09-04 · YENİ BİLEŞEN DEĞİL, İKİ VARYANTIN
   BİRLEŞİMİ. `.hayalet`in kutusu + tehlike ailesinin rengi.

   NEDEN GEREKTİ: on admin form ekranı silme düğmesini SATIR İÇİ bildirimle
   çiziyordu — `style="color:var(--hs-danger);border-color:var(--hs-danger-line)"`
   — ve `--hs-*` diye bir ad KANONDA YOK. Ölçüldü:
       --hs-danger        (BOŞ)
       düğmenin rengi     rgb(33,30,22)   ← mürekkep, kırmızı DEĞİL
   Yani yıkıcı eylem tehlike rengini hiç taşımıyordu; bildirim sessizce
   düşüyor ve düğme sıradan bir hayalet düğme gibi görünüyordu.
   ⚠ Hiçbir denetim yakalamıyordu: sabit hex değil (token okuyor), uydurma
     sınıf değil (satır içi). Üçüncü desen — TANIMSIZ TOKEN OKUYAN SATIR İÇİ
     BİLDİRİM — kayda geçti, denetimi henüz yazılmadı.

   ⚠ `.dugme.tehlike` (DOLGU kırmızı) BU İŞ İÇİN KULLANILMADI: S1 ④ açıkça
     *"Yıkıcı eylem dolgu kırmızıyla BAĞIRMAZ … `.dugme.tehlike` yerinde
     duruyor ama ayak sözleşmesinde kullanılmaz"* diyor. Bu düğmeler
     formun "tehlikeli bölge" panelinde tek başına duran, kasıtlı olarak
     seçilen eylemler — ne bağıran dolgu, ne rengini kaybetmiş hayalet.
   ⚠ Kenar `--tehlike-cizgi-yumusak`: `--tehlike-cizgi` (.34 alfa) bu boyda
     çok soluk kalıyor, yumuşak olan uyarı kutusunun kenarıyla aynı aile. */
.dugme.hayalet.tehlike{
  background:var(--kagit); color:var(--tehlike);
  border-color:var(--tehlike-cizgi-yumusak);
}
.dugme.hayalet.tehlike:hover{
  background:var(--tehlike-yikama); border-color:var(--tehlike); color:var(--tehlike-koyu);
  transform:none;
}

.dugme.cizgili{                    /* koyu zeminde ince kenarlı */
  background:transparent; color:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
}

.dugme.kucuk{ padding:var(--bosluk-12) var(--bosluk-20); font-size:var(--yazi-13-5); }

.dugme[disabled]{ opacity:.45; cursor:not-allowed; transform:none !important; }

/* 🔴 KAYNAKTAN AYRILDI — kaynakta İKİ birincil düğme vardı, İKİ kontrastla:
   biri aksanın kendisini (3.54:1, AA ALTI · 23 sayfa), öteki koyu adımını
   (5.45:1, AA · 30 sayfa) kullanıyordu. Kanonda tek birincil var ve AA
   geçen adımı kullanır. Ayrım kaybolmuyor: ikisi de aynı işi yapıyordu.
   Ölçüm ve sayfa listesi 02-bilesenler.md §16 G5. */


/* =====================================================================
   3 · FORM ALANI KİTİ — 11 sayfa · kaynak `.fk-*`
   ===================================================================== */

/* 🔴 ÖLÇÜM DÜZELTMELERİ · 2026-09-01 (destek `#yeni` turu) — B35.
   Kitin ALTI değeri 4px merdivenine yuvarlanmıştı; ikisi hariç hepsi
   İKİ BAĞIMSIZ SAYFADA da aynı çıktı (`destek-v1` · `hesabim-v1`), yani
   yuvarlama kanonun kendi hatasıydı, sayfa sapması değil:
       etiket alt payı   8 → 9      girdi dolgusu 12/16 → 13/15
       etiket boşluğu    8 → 7      yardım boşluğu    8 → 7
       ızgara boşluğu 16/20 → 16/18
   ⚠ `.alan` alt payı İKİ SAYFADA FARKLI: destek 20px · hesabim 22px
     (kanon 24 yazıyordu, ikisine de uymuyordu). Kanona ölçülen ikisinden
     biri kondu (20); hesabim turunda yeniden bakılacak — 02 §34'te
     "kaynak çelişkisi" olarak bildirildi. */
/* 🔴 20 → 22 · BEYAR KARARI 2026-09-01 (02 §29 md.14). Kaynak kendi içinde
   çelişiyordu: `hesabim-v1` 22 (6 örnek) · `odemelerim-v1` 22 · `destek-v1`
   20 (4 örnek). Üç bağımsız ölçümün ikisi 22 dedi ve 22 kartın kanonik iç
   nefesi (`.ayar-satir` 17/22 · `.kart-bas` 18/22 · panel gövdesi 22).
   Destek ekranlarındaki 20 artık BELGELENMİŞ SAPMA. */
.alan{ margin-bottom:var(--bosluk-22); }
.alan:last-child{ margin-bottom:0; }

.alan-etiket{
  display:flex; align-items:baseline; gap:var(--bosluk-7);
  font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); margin-bottom:var(--bosluk-9);
}
.alan-etiket .zorunlu{ color:var(--aksan-koyu); }
.alan-etiket .istege-bagli{
  font-size:var(--yazi-11-5); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde);
}
.alan-etiket .alan-sayac{
  margin-left:auto; font-size:var(--yazi-11-5);
  color:var(--metin-ikincil); font-weight:var(--agirlik-govde);
  letter-spacing:var(--aralik-genis);
}

.alan-girdi,.alan-secim,.alan-metin{
  width:100%; min-height:44px;              /* WCAG 2.5.5 — kit ölçüsü */
  font-family:inherit; font-size:var(--yazi-14);
  font-weight:var(--agirlik-govde); color:var(--murekkep);
  background:var(--zemin);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  padding:var(--bosluk-13) var(--bosluk-15);
  outline:none;
  transition:border-color var(--sure) var(--yumusama),
             box-shadow  var(--sure) var(--yumusama);
}
.alan-girdi::placeholder,.alan-metin::placeholder{ color:var(--yer-tutucu); }
.alan-girdi:focus,.alan-secim:focus,.alan-metin:focus{
  border-color:var(--aksan);
  box-shadow:var(--golge-halka);
}
.alan-metin{ min-height:104px; resize:vertical; line-height:var(--satir-genis); }
/* UZUN kip — serbest anlatım alanı (destek talebi gövdesi, mesaj).
   Kaynakta ölçülen İKİNCİ değer: `destek-v1.html:122` 140px, `hesabim-v1`
   104px. İkisi de gerçek; rol farklı, o yüzden birleştirilmedi. */
.alan-metin.uzun{ min-height:140px; }
.alan-secim{
  appearance:none; -webkit-appearance:none; cursor:pointer;
  background-repeat:no-repeat;
  background-position:right var(--bosluk-16) center;
  padding-right:var(--bosluk-40);
  /* 🔴 OK KAYNAĞIN GLİFİ — token katmanında, gerekçesiyle (`--secim-ok`).
     Eskiden iki CSS üçgeniyle çiziliyordu; kip farkıydı ve ölçüm
     görmüyordu (`backgroundImage` OZ listesinde yoktu). */
  background-image:var(--secim-ok);
  background-size:auto;
  background-position:right var(--bosluk-15) center;
}

.alan-yardim{
  display:flex; align-items:flex-start; gap:var(--bosluk-7);
  font-size:var(--yazi-12-5); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); margin-top:var(--bosluk-8);
  line-height:var(--satir-orta);
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}
/* Uzun yardım metni ikonun ALTINA sarmasın diye metin kendi kutusunda. */
.alan-yardim>span{ min-width:0; }
.alan-yardim i{
  color:var(--aksan-koyu); font-size:var(--yazi-12);
  margin-top:2px; flex:none;
}
.alan-yardim.tamam{ color:var(--aksan-koyu); }

/* Hata — kaynakta İKİ ad, İKİ mekanizma, İKİ renk vardı
   (`.fk-hata.show` + `--hs-danger` · `.fk-field.has-error .fk-error` +
   yerel `--au-danger`). Kanon çoğunluğu ve kabukta tanımlı olanı aldı. */
/* 🔴 K3 GERİ ALINDI — İKİ AYRI BİLEŞEN TEK ADA İNDİRİLMİŞ.
   Kaynakta iki farklı sınıf var ve adları bir harf ayrı:
     .fk-err    (destek-v1)  form ALANININ hatası — flex-start · 600 · 1.45
     .fk-error  (giris-v1)   kimlik formunun hatası — center · 700 · display:none
   `.alan-hata` BİRİNCİSİNİN karşılığı; ikincisininki `.giris-hata`.
   Bir tur önce ikincisinin ölçüsü birinciye yazıldı ve `olustur` ekranı
   dört 🔴 verdi — ölçüm iki ekranın çeliştiğini gösterdi ve haklıydı.
   ⚠ "Aynı seçici birden fazla kez tanımlı" tuzağının kardeşi: burada
   seçici aynı değil, ADI BİR HARF FARKLI. `.fk-err` ↔ `.fk-error`.
   (2026-09-02) */
.alan-hata{
  display:none; align-items:flex-start; gap:var(--bosluk-7);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--tehlike); margin-top:var(--bosluk-8);
  line-height:var(--satir-sik);
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}
.alan-hata.goster{ display:flex; }
.alan-hata i{ font-size:var(--yazi-12); margin-top:2px; flex:none; }
.alan-girdi.hatali,.alan-secim.hatali{
  border-color:var(--tehlike);
  box-shadow:0 0 0 var(--odak-kalinlik) var(--tehlike-yikama);
}

/* 🔴 K2 — ALT PAYI KAYNAKTA YOK. `.fk-grid{display:grid;gap:16px 18px}`;
   ızgaradan sonraki nefesi `.fk-grid + .fk-field{margin-top:22px}` veriyor
   ve o kural kanonda da var. Kanonun eklediği `margin-bottom:20` çoğu
   yerde marj çakışmasıyla 22'ye yeniliyordu (zararsız) ama ızgaradan
   sonra payı 20'den KÜÇÜK bir kardeş gelirse 20'ye yuvarlıyordu —
   kayıt panosunda `.onay-satirlari`nin 18'i tam öyle (slot-1 ölçtü).
   Ölçüm: FIT `0px` ↔ kanon `0px 0px 20px`. */
.alan-izgara{ display:grid; gap:var(--bosluk-16) var(--bosluk-18); margin-bottom:var(--bosluk-20); }
/* 🔴 ALT PAYI SAYFA YERELDİR. Kabuk (`fit-shell.css:4852`) `.fk-grid`e
   alt pay YAZMIYOR; `destek-v1` sayfa yerel olarak `margin-bottom:20px`
   ekliyor, `giris-v1` eklemiyor. Kanonun sayfa yerel katmanı yok, o
   yüzden aynı çizim taban + kapsam ezmesiyle üretiliyor: taban destek'in
   20'sini taşır, kimlik kartı sıfırlar.
   ⚠ Kayıt panosunda bu fark GÖRÜNÜR bir sonuç veriyordu: ızgaradan
   sonraki `.onay-satirlari`nin 18'i marj çakışmasında 20'ye yuvarlanıyordu
   (slot-1 ölçtü). */
.giris-kart .alan-izgara{ margin-bottom:0; }
/* Koşullu alan grubu `hidden` ile kapanır — kural AÇIKÇA yazılmalı:
   `.alan-izgara`nın kendi `display:grid`i (0,1,0) UA'nın `[hidden]`
   kuralını (0,0,1) ezer ve grup gizlenmez (kaynağın kendi şerhi,
   destek-v1.html:142-146; `.alan-hata[hidden]` ile aynı desen). */
.alan-izgara[hidden]{ display:none; }
.alan-izgara .alan{ margin-bottom:0; }
.alan-izgara.c2{ grid-template-columns:1fr 1fr; }
.alan-izgara.c3{ grid-template-columns:repeat(3,1fr); }
/* 🔴 24 → 22 · ÖLÇÜLDÜ 2026-09-01 (`.fk-grid` üst payı) — B35 ailesi. */
.alan-izgara+.alan-izgara,
.alan-izgara+.alan,.alan+.alan-izgara{ margin-top:var(--bosluk-22); }

/* ---- FORM DÜZEYİ HATA ÖZETİ — kaynak `.fk-summary` ------------------
   Alan hatası (`.alan-hata`) DEĞİLDİR: o tek alanı, bu FORMU anlatır ve
   gönderide `role="alert"` ile duyurulur. §13 `.uyari-kutu.tehlike` ile
   birleştirilmedi — ölçüm ayırdı: 13/600 · dolgu 13/15 · boşluk 9
   (kutu: 13.5/500 · dolgu 16 · boşluk 12). */
.alan-ozet{
  display:none; align-items:flex-start; gap:var(--bosluk-9);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta);
  line-height:var(--satir-orta);
  padding:var(--bosluk-13) var(--bosluk-15);
  margin:0 0 var(--bosluk-20);
  border-radius:var(--yuvarlak-md);
  background:var(--tehlike-yikama);
  border:var(--cizgi-1) solid var(--tehlike-cizgi-ozet);
  color:var(--tehlike-koyu);
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}
.alan-ozet.goster{ display:flex; }
.alan-ozet i{ font-size:var(--yazi-14); margin-top:1px; flex:none; }

/* ---- DOSYA SEÇİCİ — kaynak `.fk-file` kiti -------------------------
   Gerçek `<input type=file>` GİZLENMEZ, `.yalniz-okuyucu` ile ekran
   okuyucuya açık kalır; görünen kalem onun `<label>`ıdır. Böylece klavye
   odağı gerçek girdide durur ve odak halkası etikete yansıtılır. */
.alan-dosya{ display:flex; align-items:center; gap:var(--bosluk-12); flex-wrap:wrap; }
.alan-dosya-dugme{
  display:inline-flex; align-items:center; justify-content:center;
  gap:var(--bosluk-9); min-height:44px;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  padding:var(--bosluk-11) var(--bosluk-16);
  cursor:pointer; transition:var(--sure) var(--yumusama);
}
.alan-dosya-dugme:hover{ border-color:var(--aksan); color:var(--aksan-koyu); }
/* 🔴 KAYNAKTAN AYRILDI — halka aksan YIKAMASI idi (`3px var(--fit-wash)`),
   beyaz düğme zeminine karşı 1.11:1: klavye odağı görünmüyordu. §11'in
   sekme odağıyla birebir aynı kusur ve aynı düzeltme (02 §29 md.2). */
.alan-dosya input[type="file"]:focus-visible+.alan-dosya-dugme{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--odak-ofset);
}
.alan-dosya-ad{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--murekkep-yumusak); min-width:0; overflow-wrap:anywhere;
}
.alan-dosya-sil{
  border:none; background:none; padding:0; cursor:pointer;
  font-family:inherit; font-size:var(--yazi-12-5);
  font-weight:var(--agirlik-kalin); color:var(--aksan-murekkep);
}
.alan-dosya-sil[hidden]{ display:none; }

/* ---- GÖNDERİ ŞERİDİ — kaynak `.tk-submit` --------------------------
   Not SOLDA, düğme SAĞDA; ikisi arasında `space-between`. Üstünde 1px
   ayraç: form biter, karar başlar. */
.alan-gonder{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--bosluk-16); flex-wrap:wrap;
  margin-top:var(--bosluk-22); padding-top:var(--bosluk-20);
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.alan-gonder .not{
  font-size:var(--yazi-12-5); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); max-width:300px;
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}
/* Gönder düğmesi taban `.dugme`den BÜYÜK — kaynağın kendi kuralı
   (`.tk-submit .btn{padding:14px 28px;font-size:15px}`). Formun son
   kararı, ekranın en ağır kalemi. */
.alan-gonder .dugme{ padding:var(--bosluk-14) var(--bosluk-28); font-size:var(--yazi-15); }

@media (max-width:640px){
  .alan-izgara.c2,.alan-izgara.c3{ grid-template-columns:1fr; }
  .alan-gonder .dugme{ width:100%; justify-content:center; }
  .alan-gonder .not{ max-width:none; }
}


/* =====================================================================
   4 · TABLO — 4 sayfa
   Kaynakta ortak sınıf YOK (`.od-tab` · `.fd-tablo` · `.ld-tablo`).
   Desen aynı: versal başlık, hairline satır ayracı, hover zemini.
   ===================================================================== */

.tablo{ width:100%; border-collapse:collapse; }
.tablo th,.tablo td{
  padding:var(--bosluk-13) var(--bosluk-16);   /* 🔴 12 → 13 · B22 ailesi (02 §36) */
  border-bottom:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-13-5);
  text-align:left; vertical-align:middle;
}
.tablo thead th{
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;   /* 🔴 .02 → .06 (B44) */
  color:var(--murekkep-yumusak); background:var(--zemin);
}
.tablo tbody tr:last-child td{ border-bottom:0; }
.tablo tbody tr:hover{ background:var(--zemin); }
.tablo td b{ display:block; color:var(--murekkep); font-weight:var(--agirlik-kalin); }
.tablo td small{
  display:block; font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil); margin-top:3px;
}
.tablo .sag{ text-align:right; }
/* ---- HÜCRE TİPLERİ (slot-3 T3) — sayı hizası ve ağırlık ölçüldü ------
   `tabular-nums` ZORUNLU: referans numaraları ve tutarlar alt alta
   dizildiğinde orantılı rakamlarla kolon kayıyor. */
.tablo .no{
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-genis); font-variant-numeric:tabular-nums;
  color:var(--murekkep);
}
/* Kaynak mirası AÇIKÇA kesiyor — `.no`nun tabular aralığı alt satıra inmesin. */
.tablo .no small{ letter-spacing:normal; }
.tablo .tarih{
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil); white-space:nowrap;
}
.tablo .tutar{
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-ekstra);
  color:var(--murekkep); white-space:nowrap; font-variant-numeric:tabular-nums;
}
/* Defter kipi — yatay kaydırmanın anlam kazandığı eşik (slot-3 V7). */
.tablo.defter{ min-width:640px; }

/* dar ekranda yatay kaydırma — tablo sayfayı taşırmaz */
/* 🔴 BU ŞERHİN GEREKÇESİ ÖLÇÜLDÜ VE ÇÜRÜDÜ — 2026-09-03, O1.
   Eskiden şöyle yazıyordu:
       "`border-radius` — kap kartın DIŞINDA kullanıldığında köşeyi
        kırpsın diye. Kart içinde `overflow:hidden` zaten kırpıyor,
        o yüzden görünürde fark yoktu."
   İki yerinden birden yanlış:
     ① `.kart` tabanı `overflow` BİLDİRMİYOR (bkz. satır 28). Ölçüldü,
        38 ekran · her sekme tıklanmış: 168 kart `visible`, 27 kart
        `hidden` — ve o 27'si yalnız `.tasma-kapali` taşıyanlar. Yani
        şerhin dayandığı kırpma kartların %86'sında YOK.
     ② Kırpma OLSA DA kusuru düzeltmiyor, çünkü kap kartın KÖŞESİNDE
        değil ORTASINDA duruyor. Ölçülen dokuz kart içi tablonun kart
        tepesine uzaklığı 97–323px; hiçbiri tepeye değmiyor. Kartın
        kırpması oraya ulaşmıyor, kabın kendi 16px'i orada çiziyor.
   OLUMSUZ SINAMA (fit-odemelerim#iade · başlık şeridinin sol-üst
   köşesinden 7×7 piksel · şerit `--zemin` 249, kâğıt+kenar 251):
       bugünkü hâl              → köşede 251'lik yay  KUSUR VAR
       karta overflow:hidden    → köşede 251'lik yay  KUSUR AYNEN DURUYOR
       kabın radius'u sıfır     → her piksel 249      KUSUR YOK
   Kaldıraç `overflow` değil, kabın KENDİ `border-radius`'u.
   Taban değeri KALIYOR — kart dışında doğru (ölçüldü: 4 tablo, 3 ekran).
   Kart içi kip aşağıda ayrı ad alıyor: § GÖMÜLÜ TABLO KABI. */
/* 🔴 `position:relative` — 2026-09-04. EKRAN OKUYUCU METNİ KIRPMADAN
   KAÇIP SAYFAYI TAŞIRIYORDU.
   §20 `.yalniz-okuyucu` `position:absolute` kullanıyor. Kabın konumu
   `static` olduğu sürece o eleman en yakın KONUMLANDIRILMIŞ atasını
   bulamıyor ve BELGEYE göre çözülüyor: statik konumunda, yani tablonun
   gerçek genişliğinde duruyor. Kabın `overflow-x:auto`su onu KIRPAMIYOR —
   kırpma yalnız kabın kendi akışına uygulanır, belgeye çapalanmış mutlak
   eleman kabın dışına düşer ve `documentElement.scrollWidth`e katılır.

   ÖLÇÜLDÜ (`admin-duyurular` @1440, iki panelde):
       FIT     tablo 1060px · sr-only sol 1406 · taşma 0   ← 34px kala
       GASTRO  tablo 1182px · sr-only sol 1529 · taşma 89  🔴
   Yani kusur KANONDA, tetikleyicisi İÇERİK UZUNLUĞU. FIT'in metinleri
   kısa olduğu için hiç doğmamış; Gastro'da doğdu (revenge-56 ölçtü,
   burada FIT'te de mekanizma doğrulandı — konumlu ata "YOK").

   ⚠ ALTERNATİF REDDEDİLDİ: `.yalniz-okuyucu`ya `left:0` yazmak elemanı
     akışa geri sokma riski taşır ve §20'nin bütün tüketicilerini etkiler.
     Kabı kapsayıcı bloğa çevirmek tek satır ve görünür hiçbir şeyi
     oynatmıyor (regresyon ölçüldü).
   ⚠ TAŞMA SINAMASININ KÖR NOKTASI: "kırpan atası var mı" sorusu bu
     kusuru GÖRMEZ — ata zincirinde `overflow-x:auto` bir kap VARDIR ve
     eleman yine de kaçar. `position` de sorulmalı. */
.tablo-kap{
  width:100%; overflow-x:auto; -webkit-overflow-scrolling:touch;
  border-radius:var(--yuvarlak-lg);
  position:relative;
}


/* =====================================================================
   5 · ROZET — 37 sayfa · kaynakta 72 ad (yayılımı olan tek ad `.fp-badge`)
   ===================================================================== */

.rozet{
  /* 🔴 gap 4 → 6 (2026-09-02). Kanon 4 yazıyordu; kaynağın `.fp-badge`i
     6 yazıyor ve DÖRT bağlamda doğrulandı (FIT pk-paketim · od-abonelik
     ↔ kanon paketlerim · odemelerim). `.rozet` ↔ `.fp-badge` çifti
     hiçbir ekran dosyasında yoktu, o yüzden bugüne kadar hiç ölçülmedi;
     sohbet panelinin künye rozetinde ortaya çıktı (slot-3). */
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-genis);
  padding:var(--bosluk-4) var(--bosluk-12);
  border-radius:var(--yuvarlak-sm);
  border:var(--cizgi-1) solid;
  /* ⚠ `white-space` TABANDA BİLDİRİLMEZ — kaynağın `.fp-badge`i hiç
     bildirmiyor. Sayfa akışında satır kutusu zaten sarmıyor; dar bir
     kapta (sohbet balonunun künyesi) `normal`e düşmesi kaynağın
     davranışı. Kanonun `nowrap`ı orada ayrışıyordu.
     🔴 `.cipler.tek-satir>*` ve `.cip.hap` kendi `nowrap`larını yazıyor —
     ihtiyacı olan KAP yazar, taban değil. Bu dalgada altıncı kez aynı
     desen: iki kaynak sınıfı tek ada indiğinde davranış ayrışır. */
}
.rozet.olumlu{  background:var(--aksan-yikama); color:var(--aksan-koyu); border-color:var(--aksan-cizgi); }
.rozet.bekleme{ background:var(--altin-zemin);  color:var(--altin-metin); border-color:var(--altin-cizgi); }
.rozet.pasif{   background:var(--zemin);        color:var(--murekkep-yumusak); border-color:var(--cizgi); }
.rozet.durdu{   background:var(--tehlike-yikama); color:var(--tehlike-koyu); border-color:var(--tehlike-cizgi-yumusak); }
/* 🔴 KENAR BEYAZ — Beyar kararı, 2026-09-02: "KAYNAK kazanır."
   Ölçüldü: kaynak `1px solid #fff` basıyor, kanon `transparent` yazmıştı.
   Kapak fotoğrafının üstünde duran rozeti beyaz kenar AYIRIYOR; saydam
   kenarda rozet zemine karışıyor. Kanon kaynağa döndü. */
.rozet.dolu{    background:var(--aksan-koyu);   color:var(--kagit); border-color:var(--kagit); font-weight:var(--agirlik-kalin); }
/* 🔴 İKONLU KİP — 2026-09-04. `.durum-hapi.ikonlu` vardı, `.rozet`in
   karşılığı YOKTU ve bu K-R1 kararının eksik ayağıydı: karar *"renk tek
   başına taşımaz, yön İKONDAN okunur"* diyor ama rozetin ikonlu kipi
   olmayınca kural uygulanamıyordu.
   Gastro'da ölçüldü (revenge-56): `.rozet.olumlu` ile `.rozet.durdu`
   zeminleri ΔE76 **2.7** — gözle fark eşiği 2.3, yani ikisi aynı sütunda
   yan yana neredeyse ayırt edilemiyor. Marka kırmızı olunca olumlu ile
   olumsuz birbirine yaklaşıyor; ikon o farkı renkten bağımsız taşır.
   İkon rengi metinden MİRAS (`currentColor` deseni, §28'in kuralı) —
   dört varyantta dört ayrı ikon rengi tek kuralla doğuyor. */
.rozet.ikonlu>i{ font-size:var(--yazi-11); flex:none; }
.rozet.dolu i{  color:var(--kagit); font-size:var(--yazi-12); }


/* =====================================================================
   6 · ÇİP — 13 sayfa (filtre/etiket seçimi)
   ===================================================================== */

/* 🔴 gap 8 → 9 · dolgu 0 → 7px 0 (B44). Kaynak `fit-shell.css:2049`
   (`.fgroup`) ikisini de bildiriyor; kanon ikisini de kaçırmıştı. */
.cipler{ display:flex; flex-wrap:wrap; gap:var(--bosluk-9); align-items:center; padding:var(--bosluk-7) 0; }
/* TEK SATIR — kalemler sarmaz, sığmayan yatay kaydırılır.
   Ölçüm: `fit-shell.css:1112-1119` (`.fb-chiprow`).
   ⚠ `padding-block:5px` ÖLÇÜLDÜ ve gerekli: kalem `::before` ile 44px
     dokunma hedefi açıyor, `overflow-x` verilince dikey eksen de `auto`ya
     döner ve o hedef kırpılırdı. Dolgu hedefi kabın içinde tutar.
   ⚠ Kaydırma çubuğu gizlenir — şerit bir liste değil, bir seçim satırı;
     çubuk kalemlerin altında ikinci bir çizgi gibi okunuyordu. */
.cipler.tek-satir{
  flex-wrap:nowrap;
  overflow-x:auto; -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
  padding-block:var(--bosluk-6);
}
.cipler.tek-satir::-webkit-scrollbar{ display:none; }
/* Kural ÇOCUĞA yazılır, `.cip`e değil: tek satır kabının garantisi
   "içindeki hiçbir kalem daralmaz ve kırılmaz"dır — kalemin sınıf adı ne
   olursa olsun geçerli. `.cip` hedeflenseydi kabı başka bir kalem
   ailesiyle kullanan ekran sessizce iki satıra düşerdi (ölçüldü). */
.cipler.tek-satir>*{ flex:0 0 auto; white-space:nowrap; }
/* ORTALI KİP — bandın altındaki tip şeridi. Taban `.cipler` kart içi
   şerit için ölçüldü (gap 9 · dolgu 7px 0); bu KAP AYRI ve kaynağın
   kendi ölçüsü farklı: ortalı · gap 8 · dolgusuz. İki ölçüm çelişmiyor,
   iki ayrı kabı ölçüyorlar (slot-1 ↔ slot-3). */
.cipler.ortali{ justify-content:center; gap:var(--bosluk-8); padding:0; }
/* 🔴 ORTALI + KAYAN KAP = İLK KALEM ERİŞİLEMEZ. Ölçüldü: içerik kaba
   sığmayınca `center` taşmayı İKİ YANA dağıtır, ama `scrollLeft` negatif
   olamaz — soldaki pay geri getirilemez ve ilk çipin bir kısmı hiçbir
   kaydırmayla ortaya çıkmaz.
     kanon @1440  ilk çipin 18px'i kesik      (tek-satir açılınca doğdu)
     FIT   @ 390  ilk çipin 111px'i kesik     ← KAYNAKTA DA VAR
   `safe` anahtar sözcüğü tam bunun için: sığdığında ortalar, taşınca
   `start`a düşer. Kaynağın düz `center`ı taştığı anda kalem kaybediyor;
   kanon sığan hâlde AYNI görünür, taşan hâlde kalem kaybetmez.
   ⚠ Yalnız kayan kaba yazılır — sarmalı kapta taşma olmaz, gerekmez. */
.cipler.ortali.tek-satir{ justify-content:safe center; }
.cipler .etiket{
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); margin-right:2px;
}
/* 🔴 `.cip`in KENDİSİ §43'TE — burada BİLEREK YOK.
   Eskiden burada ikinci bir tanım vardı; §43 onu kaynağa çekmek için
   yazıldı ama ESKİ BLOK SİLİNMEMİŞTİ, o yüzden §43'te yeniden
   bildirilmeyen her özellik (özellikle kaldırılması gereken
   `min-height:44px`) sızmaya devam ediyordu.
   🔴 B25'İN KANONA SIZMIŞ HÂLİ: "aynı seçici iki kez tanımlı, son
   bildirim geçerli" tuzağı kaynakta değil, KANONUN KENDİSİNDE oluştu.
   slot-1 ölçümle yakaladı (2026-09-01).
   ⚠ Durum adı da tekti: §6 `.cip.secili`, §43 `.cip.aktif` yazıyordu ve
   ikisi yan yana yaşıyordu. Tek ad kaldı: `.aktif`.
   Yeni bir bileşen bir öncekini EZMEK için yazılıyorsa, eskisi SİLİNİR. */


/* =====================================================================
   7 · BOŞ DURUM — 24 sayfa · kaynakta 14 ad
   `.lib-empty` `.pe-ico` `.fpx-bos` `.pf-empty` `.pnl-empty` `.faq-none` …
   DÖRT PARÇA ZORUNLU: ikon · başlık · açıklama · eylem.
   (Kaynağın kendi kuralı — mesajlarim-v1 Kit §9: "boş ekran bir davettir")
   ===================================================================== */

.bos-durum{
  display:flex; flex-direction:column; align-items:center;
  text-align:center;
  padding:var(--bosluk-40) var(--bosluk-24);
}
.bos-durum[hidden]{ display:none; }

.bos-ikon{
  width:58px; height:58px;
  border-radius:var(--yuvarlak-md);
  /* 🔴 KAYNAKTAN AYRILDI — büyük boy `--aksan`/`--aksan-yikama` (3.18:1)
     kullanıyordu, küçük boy `--aksan-koyu`/`--aksan-yikama` (4.91:1).
     Kanon geniş paylı olanı iki boyda da kullanır. */
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  display:grid; place-items:center;
  font-size:var(--yazi-22);
  margin-bottom:var(--bosluk-16);
}
.bos-durum h3,.bos-durum h4{
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); margin-bottom:var(--bosluk-4);
}
.bos-durum p{
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); line-height:var(--satir-govde);
  max-width:38ch; margin-bottom:var(--bosluk-16);
  /* Kap `text-align:center` yazıyor ama kabuğun `p{text-align:justify}`
     kuralı KALITIMI yener — açıkça bildirilmeli (§21 · §24 ile aynı tuzak). */
  text-align:center; text-align-last:auto;
}

/* KART İÇİ boy — kaynak `.pnl-empty` (fit-shell.css:1505-1508).
   §D1: bağımsız kutu değildir, kartın İÇİNDE yaşar; §D5: tek eylem taşır.
   Ölçüldü (2026-09-01): taban `.bos-durum`dan dört yerde ayrılıyor ve
   dördü de kaynağın kendi bildirimi. `.buyuk` gibi ayrı bir kip. */
.bos-durum.kart-ici{ padding:var(--bosluk-44) var(--bosluk-24); }
.bos-durum.kart-ici .bos-ikon{ margin-bottom:var(--bosluk-14); }
.bos-durum.kart-ici h3,.bos-durum.kart-ici h4{ margin-bottom:var(--bosluk-5); }
/* 300px, `38ch` DEĞİL: kart içinde satır uzunluğu kabın genişliğinden
   bağımsız sabitlenmiş — kaynağın ölçüsü piksel. */
.bos-durum.kart-ici p{ max-width:300px; }

/* büyük boy — kendi kartı olan, sayfayı dolduran boş durum */
.bos-durum.buyuk{
  background:var(--kagit);
  border:var(--kesikli-kenar);
  border-radius:var(--yuvarlak-lg);
  padding:var(--bosluk-48) var(--bosluk-20) var(--bosluk-48);
}
.bos-durum.buyuk .bos-ikon{ width:64px; height:64px; font-size:var(--yazi-24); margin-bottom:var(--bosluk-20); }
.bos-durum.buyuk h3,.bos-durum.buyuk h4{ font-size:var(--yazi-20); margin-bottom:var(--bosluk-8); }
.bos-durum.buyuk p{ font-size:var(--yazi-14); max-width:50ch; margin-bottom:var(--bosluk-24); }

@media (max-width:640px){
  .bos-durum.buyuk{ padding:var(--bosluk-40) var(--bosluk-20); }
}


/* =====================================================================
   8 · SAYFALAMA — 3 sayfa · kaynak `.pagi` / `.pg`
   Biçim kabukta, davranış `fit-shell.js` FIT_PAGI'de.
   Kalemler:  «  ‹  1 2 3 … N  ›  »  + altında özet satırı
   ===================================================================== */

.sayfalama{
  display:flex; align-items:center; justify-content:center;
  gap:var(--bosluk-8); margin-top:var(--bosluk-40); flex-wrap:wrap;
}
.sayfa-dugme{
  /* 🔴 12px→13px · ÖLÇÜLDÜ 2026-09-01 (destek modülü, render edilmiş DOM):
     kaynak `.pg{padding:0 13px}`. Kanon 4px merdivenine yuvarlamıştı —
     §10 md.8'in tam olarak uyardığı hata. */
  min-width:44px; height:44px; padding:0 var(--bosluk-13);
  display:inline-flex; align-items:center; justify-content:center;
  font-family:inherit; font-size:var(--yazi-14);
  font-weight:var(--agirlik-kalin); color:var(--murekkep);
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  cursor:pointer; transition:var(--sure) var(--yumusama);
}
.sayfa-dugme:hover:not([disabled]):not(.aktif){ border-color:var(--aksan); color:var(--aksan-koyu); }
.sayfa-dugme:focus-visible{ outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset); }
/* 🔴 METİN ZEMİNİ `--aksan` OLAMAZ — kanonun kendi kararı, geç uygulandı.
   `tokenlar.css:386` `--aksan-koyu`yu "birincil düğme zemini (AA)" diye
   tanımlıyor, `--aksan`ın şerhi ise "vurgu, ikon, çip, odak halkası"
   diyor: hiçbiri metin zemini değil. Karar §11'de bir kez, ölçüsüyle
   birlikte verilmişti (parlak aksan 3.54 · koyu adım 5.45) ama YALNIZ
   `.sekmeler.ortali`ye uygulanmıştı. Kalan tüketiciler geride kaldı.
   Ölçüldü @1440, dört markada beyaz metin / aksan zemini:
     fit 3.45 · diet 3.68 · gastro 4.45 · gourmet 8.82   (eşik 4.5)
     koyu adımla → 5.36 · 5.33 · 5.86 · 10.89            ✅ dördü de
   Beşi de 11–14px KALIN, yani büyük metin muafiyeti yok (≥18.66px).
   Metin taşımayan aksan zeminleri (ölçer çubuğu, anahtar rayı, ikon)
   kuralın dışında; token şerhi zaten onları sayıyor. */
.sayfa-dugme.aktif{ background:var(--aksan-koyu); border-color:var(--aksan-koyu); color:var(--kagit); cursor:default; }
.sayfa-dugme.ok i{ font-size:var(--yazi-12); }
.sayfa-dugme[disabled]{ opacity:.4; pointer-events:none; }

.sayfa-nokta{
  color:var(--metin-ikincil); font-weight:var(--agirlik-kalin);
  padding:0 2px; font-size:var(--yazi-14); user-select:none;
}
.sayfalama-not{
  /* 🔴 `text-align-last:auto` · ÖLÇÜLDÜ 2026-09-04 (egzersizlerim
     `#egz-gecmis` · programlarim `#prg-gecmis` @1440). Not kutusu tam
     genişlikte ve `text-align:center` HESAPLANMIŞ değerde de center
     görünüyordu — ama metin SOLDA çiziliyordu (ölçüm: kutu x=157 w=1126,
     satır x=157 w=177). Kök kanonda değil kabukta: kabuğun yaslama
     sistemi `p, li, dd, blockquote, .lead, .lib-sub{text-align-last:start}`
     yazıyor ve NOT TEK SATIRLIK bir `<p>` — tek satır aynı zamanda SON
     satırdır, hizasını `text-align`in değil `text-align-last`in belirlediği
     satır. Kanonun B36 karşı-bildirimi (`.bos-durum p` · `.kapanis p`,
     70+ yerde) bu tüketiciyi atlamıştı; aynı bildirimle kapatıldı.
     ⚠ Hesaplanmış değer ölçümü bu kusuru GÖREMEZ: `text-align` center
     okur, kusur `text-align-last`ta durur. Ölçüm çifti satır kutusunu
     (Range rect) sormalı, kutuyu değil. */
  width:100%; text-align:center; text-align-last:auto;
  font-size:var(--yazi-12-5); color:var(--metin-ikincil);
  /* 🔴 8px→6px · ÖLÇÜLDÜ 2026-09-01: kaynak `.pagi-note{margin-top:6px}`.
     Aynı yuvarlama hatası. */
  font-weight:var(--agirlik-govde); margin-top:var(--bosluk-6);
}

@media (max-width:640px){
  .sayfalama{ gap:var(--bosluk-6); margin-top:var(--bosluk-32); }
  .sayfa-dugme{ min-width:40px; height:40px; font-size:var(--yazi-13); padding:0 var(--bosluk-10); }
}

/* 🔴 §8a · GASTRO PUBLIC KULVARININ SAYFALAMASI — Beyar kararı, 2026-09-05.
   Talimat: *"tarifler.html'deki sayfalama (numaralı, başa/sona, altında
   'X kayıttan a–b') kanon bileşeni olarak tek kaynak; listeleyen her
   yüzeyde (profil sekmeleri dahil) aynı."*

   Gastro'nun 912 sayfalık maket kulvarı kanonu YÜKLEMİYOR (ölçüldü:
   anasayfa'da kanon eklenince 1316 elemanın 727'sinin kutusu değişiyor).
   Bu yüzden §8 oraya BAĞLANMADI; §8'in İKİZİ üretildi:

     kaynak  scripts/olcum/varlik/gastro-pagi.css   (donör bloğu, dondu)
     üretici scripts/gastro-p2-lead.mjs  adım L1
     çıktı   Gastro/varliklar/reference/shared/dm-pagi.css
             md5 4325fc7831bda6fc17932dedea16914c
     kapsam  101 sayfa · 21'inde `.pagi` markup'ı çizili

   Dosya HER KURALI İKİ ADLA yazıyor — kaynağın adı (`.pagi/.pg/.pg.active/
   .pg.arrow/.pg[disabled]/.pg-dots/.pagi-note`) ve §8'in adı
   (`.sayfalama/.sayfa-dugme/.sayfa-dugme.aktif/.ok/.sayfa-nokta/
   .sayfalama-not`). İki kulvar aynı çizimi alır, markup çevrilmez.

   ── SÖKÜLEN KOPYALAR ────────────────────────────────────────────────
   Aynı kit SEKİZ CSS dosyasında ayrı ayrı yazılıydı (68 kural) ve
   aralarında SESSİZ SAPMA vardı:
     ansiklopedi.css   `.pg.arrow i` YOK        → ok ikonu 14px (12 olmalı)
     sozluk-liste.css  `text-decoration:none`   → fazladan
     sofra-duzeni.css  `.pagi` kabı YOK         → satır ortalanmıyor
     ≤640 daralma bloğu yalnız 3 dosyada
   Sekizi de söküldü; tek kaynak dm-pagi.css.

   ── §8 İLE ÖLÇÜLEN İKİ FARK — DONÖR KAZANDI, KANON DEĞİŞMEDİ ───────
   1) not üst payı   donör 12px  ↔  §8 6px
      §8'in şerhi 6px'i FIT destek modülünden ölçmüş; Gastro'nunki
      tarif-liste'den 12px. İki AYRI donör, çelişki değil. Kanon
      değeri DEĞİŞTİRİLMEDİ; ikiz dosya donörün değerini taşıyor.
   2) aktif hap      donör `--tomato` (beyaz metin 4.45:1)
                     ↔ §8 `--aksan-koyu` (Gastro'da 5.86:1)
      Bu KAYITLI bir Beyar kararıdır (handoff 2026-09-04 §4 md.14:
      *"donör kazanır"*). Bu tur onu değiştirmiyor, ÖLÇÜSÜYLE buraya
      yazıyor: WCAG AA eşiği 4.5, donör bir tık ALTINDA.

   ── KALAN TEK SAPMA (ölçüldü, 21 yüzey, 1440px) ────────────────────
   `.pagi-note` rengi maket kulvarında rgb(111,111,111), kanon
   kulvarında rgb(113,113,113) — iki kulvarın kendi `--muted` değeri.
   Sayfalama bileşeninin sapması DEĞİL; token kaydı olarak açık. */


/* =====================================================================
   9 · AYAR SATIRI — 3 sayfa · kaynak `.set-row` / `.sr-*`
   ===================================================================== */

.ayar-liste{ display:flex; flex-direction:column; }
/* DİKEY · 🔴 16px→17px · ÖLÇÜLDÜ 2026-09-01 (render edilmiş DOM):
   kaynak `.set-row{padding:17px 2px}`. Kanon 4px merdivenine yuvarlamıştı.

   YATAY · 🔴 KANON KARARI (02 §29 md.13) — 2px → 22px.
   Beyar istedi (2026-09-01), ölçümle doğrulandı. Kaynakta satırın yatay
   dolgusu 2px'ti; kartın KENDİ başlığı ve ayağı 22px kullanıyor, yani
   aynı kartın içinde iki ayrı sol kenar vardı:
       .pnl-card iç kenarı  291      (@1440, 860px okuma kolonu)
       .pc-head  başlığı    313      → nefes 22px
       .set-row  ikonu      293      → nefes  2px   ← 20px kayma
       satır sağı chevron  1147      → nefes  2px
   Satır kartın kenarına yapışıyor, başlıkla hizası kırılıyordu. Kanon
   satırı kartın kendi ölçüsüne çekti; artık üç kalem de 313'te başlar.
   ⚠ Değer `--kap-yan` (32px) DEĞİL: o SAYFA kabının yan dolgusu. Kart
     içindeki kanonik yatay nefes 22px — bu kartın kendi ölçülmüş değeri. */
.ayar-satir{
  display:flex; align-items:center; gap:var(--bosluk-16);
  padding:var(--bosluk-17) var(--bosluk-22);
}
.ayar-satir+.ayar-satir{ border-top:var(--cizgi-1) solid var(--cizgi); }
.ayar-satir[hidden]{ display:none; }

.as-ikon{
  flex:none; width:40px; height:40px;
  border-radius:var(--yuvarlak-md);
  background:var(--zemin); color:var(--murekkep-yumusak);
  display:grid; place-items:center; font-size:var(--yazi-15);
}
.as-metin{ flex:1; min-width:0; }
.as-metin b{ display:block; font-size:var(--yazi-14); color:var(--murekkep); }
.as-metin span{
  display:block; font-size:var(--yazi-12-5); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); margin-top:2px; line-height:var(--satir-sik);
}
.as-eylem{ flex:none; display:flex; align-items:center; gap:var(--bosluk-8); }

a.ayar-satir{ color:inherit; transition:background var(--sure-cabuk) var(--yumusama); }
a.ayar-satir:hover{ background:var(--aksan-yikama-2); }
a.ayar-satir:hover .as-ikon{ background:var(--aksan-yikama); color:var(--aksan-koyu); }

/* 🔴 DOLGU DA KÜÇÜLÜR (02 §36 · B42): kaynak satır içi seçime taban
   select'ten farklı dolgu veriyor — taban 13/40/13/15, satır içi 10/36/10/13.
   Kanon yalnız genişlik ve puntoyu almıştı, dolgu tabanda kalıyordu.
   slot-2 üç ayrı satırda doğruladı (`#vsGecmis` · `#ntfSessiz` · `#dlTarih`). */
.ayar-satir .alan-secim{
  width:220px; flex:none; font-size:var(--yazi-13);
  padding:var(--bosluk-10) var(--bosluk-36) var(--bosluk-10) var(--bosluk-13);
}
.ayar-satir .anahtar,.ayar-satir .as-eylem{ margin-left:auto; }

@media (max-width:640px){
  .ayar-satir{ flex-wrap:wrap; gap:var(--bosluk-10) var(--bosluk-14); }
  .ayar-satir .alan-secim{ width:100%; }
  /* Satır sarınca sağ kalem sola yığılmasın — kaynak `:5074` */
  .ayar-satir .anahtar,.ayar-satir .as-eylem{ margin-left:auto; }
}


/* =====================================================================
   10 · ANAHTAR — 3 sayfa · kaynak `.tgl`/`.tk` (+ profil'in `.hz-tgl`si)
   🔴 `.hz-tgl` DÜŞTÜ: ayrı bir kopyaydı, kapalı rayı 1.42:1 ile
   WCAG 1.4.11'i geçmiyordu ve dokunma hedefi 25px'ti (02 §4 B4).
   ===================================================================== */

.anahtar{
  position:relative; display:inline-flex; align-items:center;
  min-height:44px; flex:none; cursor:pointer;
}
.anahtar input{ position:absolute; opacity:0; pointer-events:none; }
.anahtar-ray{
  width:46px; height:26px;
  border-radius:var(--yuvarlak-md);
  background:var(--kontrol-kapali);      /* beyazla 3.43:1 → WCAG 1.4.11 */
  transition:background var(--sure) var(--yumusama);
  position:relative;
}
.anahtar-ray::after{
  content:""; position:absolute; top:3px; left:3px;
  width:20px; height:20px;
  border-radius:var(--yuvarlak-daire);
  background:var(--kagit);
  box-shadow:var(--golge-sm);
  transition:transform var(--sure) var(--yumusama);
}
.anahtar input:checked+.anahtar-ray{ background:var(--aksan); }
.anahtar input:checked+.anahtar-ray::after{ transform:translateX(20px); }
.anahtar input:focus-visible+.anahtar-ray{
  box-shadow:0 0 0 var(--odak-kalinlik) var(--aksan-yikama);
}


/* =====================================================================
   11 · SEKME RAYI — 4 sayfa · kaynak `.pf-tabbar`/`.pf-tabs`/`.dt`
   ===================================================================== */

.sekme-ray{ position:static; padding:0; margin:var(--bosluk-24) 0 var(--bosluk-22); }
.sekmeler{
  display:flex; flex-wrap:nowrap;
  overflow-x:auto; -webkit-overflow-scrolling:touch;
  gap:var(--bosluk-4);
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  padding:var(--bosluk-4);
  scrollbar-width:none;
  margin-inline:auto;
}
.sekmeler::-webkit-scrollbar{ display:none; }

.sekme{
  font-family:inherit; font-weight:var(--agirlik-kalin);
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  background:transparent; border:none;
  border-radius:var(--yuvarlak-sm);
  padding:var(--bosluk-9) var(--bosluk-16);
  min-height:44px; cursor:pointer; text-align:left;
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  transition:var(--sure) var(--yumusama);
  white-space:nowrap; flex:none; text-decoration:none;
}
/* 🔴 KALDIRMA GERİ ALINDI (2026-09-02) — kural kaynakta VAR, eksik olan
   AKTİF EZMESİYDİ:
     `.pf-tabs .dt i{ opacity:.85 }` + `.pf-tabs .dt.active i{ opacity:1 }`
   Kanonda taban vardı, `.aktif` ezmesi yoktu → İKİ sekmenin ikisi de
   soluktu ve ölçüm "FIT 1 ↔ kanon 2" dedi. O satır "kaynakta yok" diye
   okundu ve kural tamamen kaldırıldı; ölçüm ters yönden konuştu.
   🔴 DERS: bir sayı farkını okurken YÖN yetmez — farkı HANGİ ELEMANIN
   taşıdığına bakılır. "FIT 1 ↔ kanon 2" bir yokluk değil, bir FAZLALIK
   ve fazlalığın sebebi eksik bir EZMEYDİ. */
.sekme i{ font-size:var(--yazi-12-5); opacity:.85; }
.sekme.aktif i{ opacity:1; }
.sekme:hover{ color:var(--aksan-koyu); background:var(--aksan-yikama); }
.sekme.aktif{ background:var(--aksan-koyu); color:var(--kagit); }   /* §8 — metin zemini koyu adım */
/* 🔴 KAYNAKTAN AYRILDI — halka aksan YIKAMASI idi: liste zeminine karşı
   1.11:1, yani klavye odağı GÖRÜNMÜYORDU (02 §5 B11). */
.sekme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--odak-ofset);
}
.sekme-sayi{ font-size:var(--yazi-11); font-weight:var(--agirlik-kalin); opacity:.6; }

.sekmeler.esit .sekme{ flex:1; justify-content:center; }
/* Modül şeridi: kap genişliğini alır ve kalemleri ORTALAR.
   Kaynak `.pf-tabbar .fit-tabs{display:flex;flex-wrap:wrap;width:100%}`
   + `.fp-tabbar .fit-tabs{justify-content:center}`. */
/* 🔴 ŞERİT HİÇBİR GENİŞLİKTE İKİ SATIRA DÜŞMEZ — BEYAR KURALI, 2026-09-02:
       "kategoriler hiçbir zaman 2 satır olmaz, gerekirse slider olur"
   Gözle bulundu: `antrenorum`un SEKİZ sekmesi 1440'ta sarıyor ve
   "Görüşme Geçmişi" tek başına ikinci satıra düşüyor. `hareket-profilim`
   DOKUZ sekme alacak — kural şimdi gerekiyor.
   Kök: burada `flex-wrap:wrap` yazılıydı ve `nowrap` yalnız ≤900'de
   geliyordu (aşağıdaki medya dalı). Kaynak da öyle yapıyor
   (`fit-shell.css` `.pf-tabbar .fit-tabs{flex-wrap:wrap}` + ≤900 nowrap),
   yani bu kaynağın kendi kararıydı; Beyar onu DEĞİŞTİRDİ.
   Kip kaynağın KENDİ ortalama kalıbından alındı — uydurulmadı:
       .fit-tabs.is-center{ width:fit-content; max-width:100%;
                            margin-inline:auto; justify-content:center }
   Sığdığında ORTALI, sığmadığında KAYAR. `width:fit-content` olmadan
   `justify-content:center` taşan şeridin BAŞINI kırpar (kaydırılamaz
   bir orta) — ortalamayı kap değil içerik yapmalı. */
.sekmeler.ortali{
  display:flex; flex-wrap:nowrap;
  width:fit-content; max-width:100%; margin-inline:auto;
  justify-content:center;
  overflow-x:auto; -webkit-overflow-scrolling:touch;
  scrollbar-width:none;
}
.sekmeler.ortali::-webkit-scrollbar{ display:none; }
/* Kayan şeritte kalem BÜZÜLMEZ: `flex-shrink` serbest kalırsa sekme adı
   iki satıra kırılır ve "iki satır olmaz" kuralı ADIN içinde ihlal olur. */
.sekmeler.ortali .sekme{ flex:0 0 auto; white-space:nowrap; }
/* MODÜL ŞERİDİ KATEGORİ ŞERİDİNDEN BÜYÜKTÜR — kaynakta iki ayrı kalem:
   `.fit-tab` (modül, 13.5px · 10/18) ve `.dt` (kategori, 13px · 9/16).
   Kanon ilk turda ikisini tek ölçüye indirmişti; ölçüm ayrıldıklarını
   gösterdi (2026-09-01). */
.sekmeler.ortali .sekme{
  font-size:var(--yazi-13-5); padding:var(--bosluk-10) var(--bosluk-18);
  gap:var(--bosluk-8); text-align:center; line-height:normal;
}
/* 🔴 MODÜL ŞERİDİNİN AKTİF KALEMİ KOYU ADIMI KULLANIR, kategori şeridi
   parlak olanı — kaynakta iki ayrı değer (ölçüldü 2026-09-01):
     `.fit-tab[aria-selected="true"]` → `--fit-deep`
     `.dt.active`                     → `--fit`
   Kanon ikisini de `--aksan`a bağlamıştı. Ayrım geri geldi; yan etkisi
   erişilebilirlik kazancı: beyaz metin parlak aksanda 3.54:1, koyu
   adımda 5.45:1. */
/* ⚠ Buradaki `--aksan-koyu` bildirimi KALKTI: §8 `.sekme.aktif` artık
   koyu adımı kendisi taşıyor, bu satır etkisiz bir tekrar olurdu.
   Karar bu noktada doğmuştu, yeri §8'e taşındı. */
/* 🔴 `justify-content:flex-start` UYDURULMUŞTU — kaynak `fit-shell.css:2204`
   ≤900'de YALNIZ `flex-wrap:nowrap` bildiriyor, ortalamayı bozmuyor.
   Ölçüm: FIT `center` ↔ kanon `flex-start` (02 §36 · B45). B40'ın ailesi;
   OZ listesine `justifyContent` eklenince görünür oldu. */
/* ≤900 dalı KALKTI: `nowrap` artık TABANDA (yukarı bak). Kaynağın
   `fit-shell.css:2204` ölçümü hâlâ geçerli, yalnız eşiği kalmadı. */
/* 🔴 DAR EKRAN — 2026-09-01'de eklendi (02 §35 · B39). Kanonda mobil dal
   HİÇ YOKTU: 390px'te modül sekmesi masaüstü ölçüsünde (13.5px · 10/18)
   basılıyordu, kaynak ise küçültüyor. Ölçüm `fit-shell.css:3627-3631`
   (`.fit-tab`) ve `:2356-2358` (`.pf-tabbar`).
   ⚠ `min-height:44px` KÜÇÜLTÜLMEZ: dolgu inerken dokunma hedefi 44'ün
   altına düşmesin diye kaynak onu ayrıca bildiriyor — şerhi de bunu
   söylüyor ("dolgu yerine min-height"). */
@media (max-width:640px){
  .sekme-ray{ padding:var(--bosluk-10) 0; }
  /* 🔴 ÇİPİN MOBİL DALI — kanonda HİÇ YOKTU (`fit-shell.css:1283`).
     "Mobil dalı olmayan bileşen kanona girmesin" kuralının tam örneği:
     §43 masaüstünde kaynağa çekildi ama dar ekran dalı atlandı. */
  .cip{ font-size:var(--yazi-12); padding:var(--bosluk-7) var(--bosluk-12); }
  /* 🔴 `white-space:nowrap` TABANDA DEĞİL, YATAY KAYAN KAPTA. Kaynağın
     ≤640 kuralı `.chip`e yazılı (`fit-shell.css:1283`) ama kanon iki ayrı
     kaynak sınıfını (`.chip` ve `.df-fchip`) tek `.cip`e indiriyor ve
     ikisinin mobil davranışı AYRI: ortalı şerit yatay kayar (sarmamalı),
     kart içi süzgeç sarar. İki slot iki ayrı değer ölçtü, ikisi de
     haklıydı — kural ihtiyacı olan kaba taşındı.
     (§6'nın `.cipler.tek-satir>*`ı zaten aynı işi yapıyor.) */
  .cipler.ortali .cip,
  .cipler.ortali .cip-sayi{ white-space:nowrap; }
  /* Ortalı şerit dar ekranda SARMAZ, yatay kayar — altı çip tek satırda. */
  .cipler.ortali{
    flex-wrap:nowrap; overflow-x:auto; padding-bottom:var(--bosluk-4);
    scrollbar-width:none;
  }
  .cipler.ortali::-webkit-scrollbar{ display:none; }

  /* Kategori/süzgeç sekmesi — kaynak `.pf-tabs .dt` (`fit-shell.css:2358`) */
  .sekme{ font-size:var(--yazi-12-5); padding:var(--bosluk-9) var(--bosluk-13); }
  /* Modül sekmesi AYRI ve daha büyük — kaynak `.fit-tab` (`:3628`) */
  .sekmeler.ortali .sekme{
    font-size:var(--yazi-12-5); padding:var(--bosluk-9) var(--bosluk-14);
    min-height:44px;
  }
}

/* ARAMA KİPİ — şerit bir süzgeçse ve arama TÜM kalemleri geziyorsa, şerit
   söner ve tıklanamaz olur. Kaynak: `destek-v1.html:362`
   (`.pf-tabs.searching .dt`) — 02 §11 varyant tablosunda ölçülmüştü,
   kural ilk kez §21-24 turunda kanona yazıldı (Bölüm III).
   ⚠ Yalnız görünürlük: sönen sekme hâlâ odaklanabilir olsaydı klavye
   kullanıcısı görünmez bir kaleme takılırdı — `pointer-events` yetmiyor,
   bu yüzden liste ayrıca JS tarafında süzülür. */
/* SÜZGEÇ ŞERİDİ — 🔴 KANON KARARI (02 §29 md.13, aynı kalem).
   Kaynakta durum süzgeci `.sekmeler`in taban 4px'ini kullanıyordu ve ilk
   çip kabın sol kenarına yapışıyordu (@1440: kap iç kenarı 291, ilk çip
   295). Şerit bir seçim rayı değil, panelin BAŞLIK HİZASINDA duran bir
   süzgeci; aynı kolondaki kart başlığı 313'te başlıyor.
   Taban `.sekmeler` DEĞİŞMEDİ — modül şeridi ve kategori şeridi 4px'lik
   ray kipinde kalır (o ikisinde aktif hap rayın kenarına oturur ve
   segment kontrolü öyle okunur). Nefes yalnız bu kipe verildi. */
/* BANT İÇİ RAY — zebra bandının İÇİNDE duran şeritte dikey marj sıfırdır.
   Kaynağın kendi kuralı ve gerekçesi (destek-v1.html:478, ölçümüyle):
   bandın dolgusu 32/32 ama şeridin kendi `margin:24px … 22px`i binince
   içeriğin banda uzaklığı 56/54 çıkıyordu — hem fazladan boşluk, hem
   24≠22 olduğu için içerik bandın MERKEZİNDE değil. Zemin ve dolgu
   yazılmaz; ikisi de §18 zebra kuralında. */
.sekme-ray.bant-ici{ margin-block:0; }

.sekmeler.suzgec{ padding:var(--bosluk-4) var(--bosluk-22); }
/* SÜZGEÇ SAYACI KATEGORİ SAYACINDAN BÜYÜKTÜR — ölçüm ayırdı (2026-09-01),
   kaynakta iki ayrı kalem ve ikisi de aynı ekranda:
     `#faqTabs .dt .cnt`   11px · 700 · opacity .6   (kategori şeridi)
     `#tkFilter .dt .muted` 13px · 500 · opacity 1   (durum süzgeci)
   Süzgeçte sayı bilginin kendisi ("Kapatılan 4"), kategoride yardımcı bir
   not; kaynak ikincisini soluklaştırıyor, ilkini soluklaştırmıyor.
   ⚠ RENK YAZILMAZ: `.sekme`den miras gelir ve aktif kalemde beyaza döner.
     Kaynak bunu ayrı bir kuralla çözmüş (`.dt.active .muted` → beyaz);
     gerekçesi de ölçülü — `--muted` aksan zemininde 1.38:1, sayı
     OKUNMUYORDU. Kanonda kalıtım zaten doğru rengi veriyor. */
/* 🔴 PUNTO SABİT DEĞİL, KALITIM. Kaynağın `.muted`u yalnız renk ve ağırlık
   bildirir (`fit-shell.css:185`); punto `.dt`den kalıtımla gelir. Kanon
   burayı `--yazi-13`e sabitlemişti — masaüstünde `.sekme` zaten 13px
   olduğu için denk geliyordu, ≤640'ta `.sekme` 12.5px'e inince sayı 13px'te
   TAKILI kalıyordu (390px ölçümü, 02 §35). Kalıtım her genişlikte doğru. */
.sekmeler.suzgec .sekme-sayi{
  font-size:inherit; font-weight:var(--agirlik-govde); opacity:1;
}

.sekmeler.arama-modu .sekme{ opacity:.45; pointer-events:none; }


/* =====================================================================
   12 · KÜNYE IZGARASI — 3 sayfa · kaynak `.hs-facts`
   Hairline ızgara: hücreler kağıt, aradaki 1px boşluk çizgi rengini gösterir.
   ===================================================================== */

.kunye{
  display:grid; grid-template-columns:repeat(4,minmax(0,1fr));
  gap:var(--cizgi-1);
  background:var(--cizgi);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  overflow:hidden; margin:0;
}
.kunye>div{ background:var(--kagit); padding:var(--bosluk-16); min-width:0; }
.kunye dt{
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-genis); text-transform:uppercase;
  color:var(--murekkep-yumusak);
}
.kunye dd{
  font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); margin:var(--bosluk-4) 0 0;
  letter-spacing:var(--aralik-sik);
}
@media (max-width:1024px){ .kunye{ grid-template-columns:repeat(2,minmax(0,1fr)); } }
@media (max-width:640px){  .kunye{ grid-template-columns:1fr; } }


/* =====================================================================
   13 · UYARI KUTUSU — 3 sayfa · kaynak `.hs-warn`
   🔴 Tehlike varyantı kaynakta KABIN sınıfıyla açılıyordu
   (`.danger-card .hs-warn`). Kanon kendi sınıfını verir; kap kuralı
   mevcut markup kırılmasın diye köprü olarak kalır (02 §9 B9).
   ===================================================================== */

.uyari-kutu{
  display:flex; align-items:flex-start; gap:var(--bosluk-11);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde);
  border-radius:var(--yuvarlak-md);
  /* 🔴 16 → 14/16 · gap 12 → 11 · alt marj 20 → 18 (02 §36 · B41).
     hesabim-v1 `#dondur .hs-warn` render edilmiş DOM'undan ölçüldü;
     üçü de 4px yuvarlamasıydı (B22 ailesi). */
  padding:var(--bosluk-14) var(--bosluk-16);
  margin-bottom:var(--bosluk-18);
  /* 🔴 B36 — kaynak bunu `<p class="hs-warn">` olarak da kullanıyor, yani
     kabuğun `p{text-align:justify}` kuralı DOĞRUDAN vuruyor ve metni
     yaslıyor. Ölçüldü: FIT start ↔ kanon justify (02 §36 · B42). */
  text-align:left; text-align-last:auto;
  color:var(--uyari);
  background:var(--uyari-yikama);
  border:var(--cizgi-1) solid var(--uyari-cizgi);
}
/* 🔴 OKUMA KOLONUNDA ALT PAYI 22, 18 DEĞİL. Ölçüldü (`odemelerim`
   diyetisyen paneli, `.hs-warn`): FIT `0 0 22px` ↔ kanon `0 0 18px`.
   slot-3'ün `s3-sira.mjs`te bulduğu −4px aralık hatasının kökü; temiz bir
   token adımı, yani içerik değil BİLDİRİM farkı — ilk okuması doğruydu.
   ⚠ BU KURAL İKİ KEZ YANLIŞ YERE DÜŞTÜ ve ikisinde de SESSİZCE ÖLÜ KALDI:
   önce bir şerhin içine, sonra kuralın kendi gövdesine — ikinci seferinde
   şerhi de kırdı. Sebep aynı: çapa olarak kullandığım dize dosyada birden
   çok yerde geçiyor ve biri bir açıklamanın içinde ALINTI olarak duruyor.
   §0c/2 ile §0c/6'nın birleşimi. Ders: çapa SATIR BAŞINDAN aranır ve
   yazımdan sonra kuralın GERÇEKTEN eşleştiği ölçülür — ölçüm iki kez
   "18px" dedi ve iki kez de haklıydı, yazan bendim. */
.okuma-kolonu>.uyari-kutu{ margin-bottom:var(--bosluk-22); }
.uyari-kutu i{ flex:none; font-size:var(--yazi-15); margin-top:2px; }
.uyari-kutu b{ font-weight:var(--agirlik-ekstra); }
/* ⚠ ÇOCUKLARA DA — bkz. §14'ün aynı şerhi (slot-2 sızıntı taraması). */
.uyari-kutu>span,.uyari-kutu>b{ text-align:left; text-align-last:auto; }

.uyari-kutu.tehlike,
/* 🔴 KARTIN KENDİ KENARLIK RENGİ (02 §36 · B42 · slot-2 K6). Kanon yalnız
   başlık ayracını ve ikon rengini boyuyordu; kartın `border-color`u
   `--cizgi`de kalıyordu. Kaynak `.warn-card{border-color:var(--hs-warn-line)}`
   ve `.danger-card{border-color:var(--hs-danger-line)}` diyor — ölçüldü. */
.kart.uyari-kart{ border-color:var(--uyari-cizgi); }
.kart.tehlike-kart{ border-color:var(--tehlike-cizgi); }

.kart.tehlike-kart .uyari-kutu{        /* köprü — eski markup için */
  color:var(--tehlike-koyu);
  background:var(--tehlike-yikama);
  border-color:var(--tehlike-cizgi);
}


/* =====================================================================
   14 · DURUM SATIRI — 4 sayfa · kaynak `.hs-state`
   İkon ZORUNLU: renk tek başına taşıyıcı değildir (WCAG 1.4.1).
   ===================================================================== */

.durum-satir{
  flex:1; min-width:200px;
  display:flex; align-items:flex-start; gap:var(--bosluk-8);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--murekkep-yumusak); line-height:var(--satir-orta);
  margin:0;
  /* 🔴 B36 — kaynak bunu `<p class="hs-state">` olarak basıyor (odemelerim'de
     4 yerde), kabuğun `p{text-align:justify}`i doğrudan vuruyor. İki bağımsız
     ölçüm (slot-2 hesabim · slot-3 odemelerim) aynı sonucu verdi:
     FIT start ↔ kanon justify (02 §36 · B42). */
  text-align:left; text-align-last:auto;
}
/* ⚠ ÇOCUKLARA DA YAZILIR. slot-2'nin sızıntı taraması (altı sekme, görünür
   her p/li/span/dd/b) kanonda 15 yaslanan kalem buldu, kaynakta 0; 13'ü bu
   iki bileşenden geliyordu. `<b>` inline olsa da `text-align` kalıtımla
   iniyor ve `text-align-last` üzerinden çiziliyor. */
.durum-satir>span,.durum-satir>b{ text-align:left; text-align-last:auto; }
.durum-satir i{ flex:none; margin-top:3px; font-size:var(--yazi-11-5); color:var(--aksan-koyu); }
.durum-satir.kapali{ color:var(--uyari); }
.durum-satir.kapali i{ color:var(--uyari); }
.durum-satir.tamam{ color:var(--aksan-koyu); }


/* =====================================================================
   15 · ALT NOT — 3 sayfa · kaynak `.ntf-foot`
   Kartın kapanışı: üst çizgiyle ayrılmış ikonlu not şeridi.
   ===================================================================== */

.alt-not{
  display:flex; align-items:flex-start; gap:var(--bosluk-8);
  font-size:var(--yazi-12-5); color:var(--murekkep-yumusak);
  font-weight:var(--agirlik-govde); line-height:var(--satir-govde);
  margin-top:var(--bosluk-16);
  padding-top:var(--bosluk-14);   /* 🔴 16 → 14 · hesabim `#sil .ntf-foot` (B41) */
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.alt-not i{ color:var(--aksan-koyu); font-size:var(--yazi-12); margin-top:3px; flex:none; }
.alt-not a{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }
.alt-not a:hover{ text-decoration:underline; text-underline-offset:2px; }


/* =====================================================================
   16 · BİLGİ NOTU — 43 sayfa · kaynak `.hr-note`
   Hesap alanı dışında da en yaygın bileşenlerden. `fit-type.css` bunu
   yaslama istisnası olarak işaretlemiş (2–4 satırlık blok, nehir üretir).
   ===================================================================== */

/* 🔴 ÜÇ ÖLÇÜM DÜZELTMESİ · 2026-09-01 — B35'in aynı ailesi. Kaynak
   `fit-shell.css:2100` üçünü de yazıyor, kanon üçünü de yuvarlamıştı:
       boşluk 16 → 14 · dolgu 20/24 → 20/22 · üst pay 32 → 34
   İki ekranda da doğrulandı (destek `#taleplerim` maket şeridi ve
   `#yeni` sağlık sınırı). */
.bilgi-notu{
  display:flex; gap:var(--bosluk-14); align-items:flex-start;
  background:var(--aksan-yikama);
  border:var(--cizgi-1) solid var(--aksan-cizgi);
  border-radius:var(--yuvarlak-lg);
  padding:var(--bosluk-20) var(--bosluk-22);
  margin-top:var(--bosluk-34);
}
/* Kural AÇIKÇA yazılmalı: kutunun kendi `display:flex`i (0,1,0) UA'nın
   `[hidden]{display:none}` kuralını (0,0,1) ezer ve gizlenmesi istenen not
   ekranda kalır (ölçüldü 2026-09-01 — oluştur ekranının çevrimdışı
   bildirimi açılışta görünüyordu). `.alan-izgara[hidden]` ile aynı desen. */
.bilgi-notu[hidden]{ display:none; }
.bilgi-notu>i{ color:var(--aksan-koyu); font-size:var(--yazi-18); margin-top:2px; flex:none; }
.bilgi-notu p{
  font-size:var(--yazi-14); color:var(--murekkep-yumusak);
  /* 🔴 1.6 DEĞİL 1.72 — kaynağın kendi ölçülmüş kararı, 17 satırlık
     gerekçesiyle (`fit-shell.css:3825-3841`): notun ölçü sınırı kalkınca
     satır uzuyor, "uzun ölçü → daha çok interlinye". */
  font-weight:var(--agirlik-govde); line-height:var(--satir-not); margin:0;
  max-width:none;
  text-align:left; text-align-last:auto;      /* yaslama istisnası */
}
/* 🔴 9px, 8 DEĞİL — kaynak ölçüldü (02 §36 · B43 · slot-1). */
.bilgi-notu p+p{ margin-top:var(--bosluk-9); }
/* 🔴 KABIN İLK ÇOCUĞUYSA ÜST PAY DÜŞER — kaynak `fit-shell.css:2114`.
   Kanonda yoktu: not bir kabın ilk çocuğuyken 34px pay sarmalayıcının
   DIŞINA taşıyordu; kaynağın şerhi bu kusuru 7 sayfada ölçmüş. */
.kap>.bilgi-notu:first-child{ margin-top:0; }
.bilgi-notu p a{
  color:var(--aksan-koyu); font-weight:var(--agirlik-kalin);
  text-decoration:underline; text-underline-offset:2px;
}
.bilgi-notu.ortali{
  align-items:center;
  background:var(--aksan-yikama-2); border-color:var(--aksan-cizgi);
}
.bilgi-notu.ortali>i{
  margin-top:0; width:38px; height:38px;
  border-radius:var(--yuvarlak-daire);
  background:var(--kagit); display:grid; place-items:center;
  font-size:var(--yazi-16);
}


/* =====================================================================
   17 · KIRINTI — 49 sayfa · kaynak `.lib-crumb`/`.crumb-home`/`.cur`
   KOYU ZEMİN BİLEŞENİ — banner içinde yaşar.
   🔴 Ev ikonunun `13px` taban kuralı kaynakta 8 sınıflık bir
   `9px !important` zinciriyle eziliyordu; kanon 9px alır, zinciri atar.
   ===================================================================== */

.kirinti{
  display:flex; align-items:center; gap:var(--bosluk-9);   /* 🔴 8 → 9 · banner'da ölçüldü (B43) */
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--koyu-metin); margin-bottom:var(--bosluk-20);
  flex-wrap:wrap;
}
.kirinti a{ color:var(--koyu-metin); transition:color var(--sure) var(--yumusama); }
.kirinti a:hover{ color:var(--kagit); }
.kirinti>i{ font-size:var(--yazi-9); color:var(--koyu-metin-2); }
.kirinti-ev{ display:inline-flex; align-items:center; line-height:1; }
.kirinti-ev i{ font-size:var(--yazi-9); line-height:1; width:auto; color:var(--aksan-parlak); }
.kirinti-ev:hover i{ color:var(--kagit); }
.kirinti-simdi{ color:var(--aksan-parlak); }


/* =====================================================================
   18 · BÖLÜM BAŞLIĞI — 30 sayfa · kaynak `.sec-head`
   [üst etiket] / [h2 | araçlar] / [açıklama]
   ===================================================================== */

/* 🔴 KISAYOL, KARDEŞ SINIFI EZİYORDU — ölçüldü 2026-09-03 (slot-program).
   `.bolum{padding:X 0}` ve `.kap{padding:0 var(--kap-yan)}` İKİSİ DE
   kısayol; ikisi aynı elemana yazıldığında sonra yüklenen (`.kap`,
   `:1380`) diğerini TÜMÜYLE eziyor ve dikey nefes 0'a düşüyordu.
   Bedeli ölçüldü: `kaynak` sekmelerinde şeritle ilk kart arası 22px,
   kurulan sekmelerde 54px — yani kaynaktan derlenen sekmeler NEFESSİZ.
   Bestecinin `sar` alanı TEK sarmalayıcı basıyor; iki sınıfı birlikte
   vermek (`sar:"bolum kap"`) tam bu yüzden çalışmıyordu.
   Düzeltme: iki kural AYRI özelliğe yazılır — sıra artık fark etmez ve
   `.bolum.kap` birlikte çalışır.
   ⚠ Genel ders: kısayol bildirimi, aynı elemana yazılabilecek KARDEŞ
     sınıfların bildirimlerini de siler. Kanonda bir sınıf başka bir
     sınıfla BİRLİKTE kullanılabiliyorsa kısayol yazılmaz. */
.bolum{ padding-block:var(--bolum-nefes); }
.bolum.sik{ padding-block:var(--bolum-nefes-sik); }

/* 🔴 ÜÇ YUVARLAMA DÜZELTİLDİ (02 §36 · B42): margin-bottom 32→34 ·
   `.ust-etiket` 16→14 · `.giris-metni` 8→10. Kaynak `fit-shell.css:225·227·230`
   ORTAK blokta (`.sec-head,.cat-head,.guide-head`) — sayfa yaması değil, her
   ekranda geçerli. Destek turunda §18 ölçüm çiftlerinde yoktu, o yüzden kaçtı. */
.bolum-bas{
  display:grid; grid-template-columns:minmax(0,1fr) auto;
  column-gap:var(--bosluk-24); align-items:center;
  margin-bottom:var(--bosluk-34);
}
.bolum-bas>div:first-child{ display:contents; }
.bolum-bas .ust-etiket{ grid-row:1; grid-column:1/-1; justify-self:start; margin-bottom:var(--bosluk-14); }
.bolum-bas h2{ grid-row:2; grid-column:1; font-size:var(--yazi-34); }
.bolum-bas .bolum-araclar{ grid-row:2; grid-column:2; align-self:center; }
.bolum-bas .giris-metni{
  grid-row:3; grid-column:1/-1; margin-top:var(--bosluk-10);
  color:var(--metin-ikincil); font-weight:var(--agirlik-govde);
  font-size:var(--yazi-15-5); max-width:520px;
  text-align:left; text-align-last:auto;      /* yaslama istisnası */
}
@media (max-width:1024px){ .bolum-bas h2{ font-size:var(--yazi-30); } }
/* §18'in DAR EKRAN dalı — kanonda hiç yoktu (slot-3 ölçtü, kaynak
   `fit-shell.css:1255-1259`). */
@media (max-width:640px){
  .bolum-bas{ margin-bottom:var(--bosluk-24); column-gap:var(--bosluk-14); }
  .bolum-bas h2{ font-size:var(--yazi-24); }
  .bolum-bas .giris-metni{ font-size:var(--yazi-14-5); }
}

/* ---- ZEBRA — ardışık bantlar dönüşümlü boyanır ----------------------
   Kaynak: `fit-shell.css:4271-4276` (`.modul-govde .fit-pane > section`).
   Kural KAPTA durur, bantta değil: sayfa yalnız `<section class="bolum">`
   yazar, sıra ve zemin kendiliğinden gelir. Bant tarafı zemin ya da dolgu
   YAZMAZ — yazarsa iki sözlük olur ve zebra sırası kırılır.

   ⚠ BANTLAR TAM GENİŞLİKTİR, `.kap` bandın İÇİNDE durur. `.kap` dışarıda
     kalırsa zemin dar kolona hapsolur ve zebra görünmez.

   Dikey nefes `--bolum-nefes-sik` (32px): kaynağın `--sec-pad-sm`i, üst=alt.
   `.bolum`un tek başına kullanıldığındaki 64px'i değil — zebra sıkı ritim
   ister, bantlar arka arkaya geliyor. */
.zebra>.bolum{ padding:var(--bolum-nefes-sik) 0; }
/* 🔴 KENDİ ZEMİNİNİ TAŞIYAN BANT ŞERİTLENMEZ — ölçüldü, 2026-09-02.
   `antrenor-ol`un koyu hero bandı (`.ol-top`) kendi zeminini bildiriyor:
   radial + üç linear gradyan + fotoğraf + `#1b1913`. Üretici bandı `.zebra`
   sözleşmesine sokmak için `bolum` yazınca aşağıdaki şeritleme kuralı
   (0,3,0) sayfanın kendi kuralını (0,1,0) EZDİ: zemin BEYAZ oldu, beyaz
   `h1` ve giriş metni GÖRÜNMEZ hâle geldi.
   Ölçülen kontrast: donör 17.57 → çıktı 1.00.
   Zebra bir RİTİM sözleşmesidir, bir zemin dayatması değil; kendi yüzeyini
   taşıyan bant onun dışındadır. Sınıfı üretici SAYFA CSS'İNDEN TÜRETİR
   (elle liste yazılmaz — "yeşil listesi elle yazılmıştı" kusurunun dersi). */
/* 🔴 `:not()` ÖZGÜLLÜĞÜ KENDİ SÖZLEŞMESİNİ EZDİ — ölçüldü, 2026-09-02,
   Beyar gözle gördü ("zebra desenini düzgün kopyala, burda farklı").
   `:not(.kendi-zemini)` eklenince bu kuralın özgüllüğü (0,3,1) aşağıdaki
   `.zebra>.bolum.kimlik-bant` kuralının (0,3,0) ÜSTÜNE çıktı ve kimlik
   bandının zeminini beyaza çevirdi:
       donör  kimlik bandı rgb(249,249,249)  (--zemin)
       çıktı  kimlik bandı rgb(255,255,255)  (--kagit)  🔴
   Şerit ve gövde ikisinde de aynıydı; fark TEK bir değerdeydi.
   Ders: bir kurala süzgeç eklemek onun ÖZGÜLLÜĞÜNÜ de değiştirir ve
   aynı dosyadaki istisnalarını sessizce yener. Kendi yüzeyini bildiren
   iki kalem de artık aynı süzgeçte: `kendi-zemini` (üreticinin sayfa
   CSS'inden türettiği) ve `kimlik-bant` (kanonun kendi istisnası). */
.zebra>.bolum:nth-of-type(odd):not(.kendi-zemini):not(.kimlik-bant){ background:var(--kagit); }
.zebra>.bolum:nth-of-type(even):not(.kendi-zemini):not(.kimlik-bant){ background:var(--zemin); }

/* Sabit kabuğun altına inen ilk bant. Kaynak `.below-header`
   (dd-shell.css:260 — 112px, @≤640 62px); kanon token'ı zaten vardı.
   Değer TOPLAMDIR, bandın kendi nefesine eklenmez: kaynak da 74px'lik
   taban dolguyu ezip yerine geçiyor. */
.zebra>.bolum.kabuk-alti{ padding-top:var(--kabuk-h); }
/* Kimlik bandı ALT DOLGU TAŞIMAZ — kaynak `.fp-profil` yalnız üst dolgu
   bildiriyor (`fit-shell.css:4105`). Bandın altındaki nefesi sekme
   şeridinin kendi `margin-top`u (24px) verir; bant da dolgu koyarsa iki
   boşluk üst üste biner. ÖLÇÜLDÜ: şerit 32px aşağı kayıyordu. */
/* 🔴 KİMLİK BANDI ZEMİNİ GRİ, BEYAZ DEĞİL — ölçüldü (2026-09-01).
   Kaynak dosyada İKİ bildirim var ve İKİNCİSİ geçerli:
     fit-shell.css:4105  .fp-profil{…;background:var(--bg-white)}   ← eskimiş
     fit-shell.css:4444  .fp-profil{background:var(--bg)}           ← geçerli
   İkincisinin şerhi gerekçeyi yazıyor: profil beyaz · şerit gri · gövde
   beyaz olunca ÜÇ ZEMİN arka arkaya geliyordu. Kart kendi beyazını,
   kenarlığını ve gölgesini zaten taşıyor; zemin grileşince kart okunur
   kalıyor. 15 sayfada tek değer.
   ⚠ İlk turda 4105'i okuyup DURMUŞTUM. Ders: kaynakta bir seçici birden
     fazla kez bildirilebilir; son bildirim geçerlidir (KOPYALAMA-KURALI §2). */
.zebra>.bolum.kimlik-bant{ padding-bottom:0; background:var(--zemin); }
@media (max-width:640px){ .zebra>.bolum.kabuk-alti{ padding-top:var(--kabuk-h-dar); } }

/* ═══════════════════════════════════════════════════════════════════════
   § ZEBRA ↔ KART · A3 · Beyar kararı 2026-09-03
   ═══════════════════════════════════════════════════════════════════════
   KURAL:  KART TAŞIYAN BANT KÂĞIT OLAMAZ — zemine iner.

   Kart kendi kâğıdını, kenarını ve gölgesini ZATEN taşıyor. Bandı da
   kâğıtsa iki yüzey üst üste biner ve aralarındaki bütün ayrım tek bir
   `--cizgi` çizgisine (#ECECEC · kâğıda **1.18:1**) kalır. O sayı O2'de
   ölçüldü ve orada "kutunun kendisi görünmüyordu" diye karara bağlandı;
   burada aynı sayı, aynı sonuç.

   ── ÖLÇÜLDÜ (lead-a3-olc.mjs · 13 FIT ekranı · her sekme tıklanmış) ────
   İki zebra sistemi birlikte sayıldı — 75 tekil bant, 36'sı kart taşıyor:

       beyaz kart · KÂĞIT bandın üstünde   26   🔴
       beyaz kart · ZEMİN bandın üstünde   10   ✅

   Yani desen ekranın içinde bile tek değil. Beyar ikisini de gördü:
       fit-enerji-defterim#def-aktivite  bant 1 kâğıt · bant 2 zemin —
                                         aynı panoda iki ayrı kart kipi
       fit-hesabim#profil                sekmeden sekmeye değişiyor

   ── KAYNAK DA BÖYLE — KANON KUSURU DEĞİL, KAYNAĞIN KUSURU ─────────────
   Aynı soru donöre de soruldu (lead-a3-donor.mjs · 22 oturumlu sayfa):
   kart taşıyan 10 bandın 9'u kâğıt. Kaynak bu kararı hiç vermemiş.
   S1 ①'in içtihadı: "kaynağın ölçülmüş kusuru, kanon düzeltir."

   ── NEDEN BANT DEĞİŞİR, KART DEĞİL ────────────────────────────────────
   YENİ DEĞER YAZILMADI. Kanon bu kararı ZATEN BİR KEZ verdi — kimlik
   bandında, yukarıda, kaynağın kendi şerhiyle: "profil beyaz · şerit gri
   · gövde beyaz olunca ÜÇ ZEMİN arka arkaya geliyordu. Kart kendi
   beyazını, kenarlığını ve gölgesini zaten taşıyor; zemin grileşince
   kart okunur kalıyor." Bu blok o kararı bandın adından KURALIN KENDİSİNE
   taşır: artık `kimlik-bant` bir istisna değil, kuralın bir örneği.

   Karşı aday (kartın kenarını 3:1'e çıkarmak) ÖLÇÜMLE ELENDİ: O2 kanonun
   bütün nötr çizgilerini saydı — `--cizgi` 1.18 · `--cizgi-vurgu` 1.36 ·
   `--cizgi-vurgu-koyu` 1.66; eşiği geçen nötr gri kanonda YOK. Yani o
   yol yeni bir renk uydurmayı gerektirirdi. Bu yol mevcut iki tokenle
   (`--kagit` ↔ `--zemin`) çözüyor.

   ── ZEBRA RİTMİ ÖLMEZ ─────────────────────────────────────────────────
   Zebra bir RİTİM sözleşmesidir, bir zemin dayatması değil (yukarıda,
   `kendi-zemini` dalının gerekçesi). Kart taşıyan bant o ritmin ÜÇÜNCÜ
   istisnasıdır — `kendi-zemini` ve `kimlik-bant` ile aynı aileden:
   yüzeyini içeriği belirleyen bant şeritlemeye girmez.

   🔴 SÜZGEÇ ÖZGÜLLÜĞÜ BİLEREK YÜKSELTİLDİ. Bu dosyanın kendi dersi:
      "bir kurala süzgeç eklemek onun ÖZGÜLLÜĞÜNÜ de değiştirir ve aynı
      dosyadaki istisnalarını sessizce yener." Burada tersi isteniyor —
      kural donörün `.modul-govde .fit-pane > section:nth-of-type(2n+1)`
      kuralını (0,3,1) yenmeli. `:not()`lerle (0,5,1)'e çıkıyor ve iki
      istisnayı seçicinin KENDİSİ dışarıda bırakıyor; sessiz bir yenme
      yok, yazılı bir dışlama var.

   ── DİKİŞ · İKİ GRİ BANT ARKA ARKAYA ──────────────────────────────────
   Ölçüldü: kart taşıyan 36 bandın 7'si bir başka kartlı bandın hemen
   ardından geliyor, 4'ünün üst çizgisi YOK. Üçü BUGÜN de gri-gri
   (kusur bu bloktan önce de vardı), biri bu blokla griye iner. Dördü de
   aynı dikişle kapanır. `.bant-ustunde` dışarıda: o dal kartı bandın
   üstüne BİLEREK bindiriyor ve çizgi bindirmeyi bozardı.
   ═══════════════════════════════════════════════════════════════════════ */

.zebra > .bolum:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant),
.modul-govde .fit-pane > section:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant){
  background:var(--zemin);
}

.zebra > .bolum:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant)
  + .bolum:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant):not(.bant-ustunde),
.modul-govde .fit-pane > section:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant)
  + section:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant):not(.bant-ustunde){
  border-top:var(--cizgi-1) solid var(--cizgi);
}

/* ── 🔴 İSTİSNA · SEKME RAYININ ARDINDAKİ PANODA DİKİŞ ÇİZGİSİ YOK ────
   Beyar kararı, 2026-09-06 (Gastro parti 3 · L3):
   "g-hesabim#bagli ve tüm g-* sekme altları: divider YOK — sekme rayı
    altındaki çizgi dahil. Zebra çözülmüş, çizgiyi de kaldır."

   🔴 İSTİSNA KANONA YAZILDI, sayfaya EZME KURALI YAZILMADI. İlk deneme
      Gastro'nun kendi katmanına (`dm-p3.css`) `.sekme-ray ~ * .dikis`
      koymuştu ve ÜÇ DİKİŞİN İKİSİNİ kapatıp ÜÇÜNCÜSÜNÜ kapatamadı:
      görünen çizgi `.dikis`in kendi (0,2,0) kuralından değil, YUKARIDAKİ
      KARDEŞ DİKİŞİ kuralından geliyordu — `:has()` + dört `:not()` ile
      (0,9,2). Deponun kayıtlı dersi birebir çıktı: ":has()/:is()
      özgüllüğü sessizce yükseltir; sonra yüklenmek yetmez." Kusur CDP
      `CSS.getMatchedStylesForNode` ile bulundu; CSSOM taraması onu
      görüyordu ama hangisinin KAZANDIĞINI söylemiyordu.

   🔴 KAPSAM MARKAYA BAĞLI, kanona değil: karar `g-*` (Gastro) için
      verildi. `body[data-govde="gastro"]` guard'ı FIT kulvarını
      DEĞİŞTİRMEZ (FIT kapısı koşuldu, kutu imzası fark 0).

   Özgüllük yazılı: kapattığı iki kuralın ikisinden de yüksek
   ((0,12,1) ve (0,11,3) ↔ (0,10,0) ve (0,9,2)) — sessiz bir yenme
   değil, yazılı bir dışlama. */
body[data-govde="gastro"] .zebra > .sekme-ray
  ~ .bolum:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant)
  + .bolum:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant):not(.bant-ustunde),
body[data-govde="gastro"] .sekme-ray ~ .modul-govde .fit-pane
  > section:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant)
  + section:has(.kart, .fp-card, .ozet-karti):not(.kendi-zemini):not(.kimlik-bant):not(.bant-ustunde),
body[data-govde="gastro"] .sekme-ray ~ * .dikis:not(.bant-ustunde){
  border-top:0;
}

/* ── 🔴 BANT KENDİ ZEMİNİNİ BOYAMAZ · ÖLÇÜLDÜ 2026-09-04 ──────────────
   Beyar: "sekme rayının altında tam genişlik beyaz panel var, üst kenarı
   gri zeminden ince çizgiyle ayrılıyor; egzersizlerim/programlarim'da
   pano zeminde duruyor, içerik kartlar hâlinde."

   KÖK KAYNAĞIN KENDİ ZEBRASI — kanonunki onu YALNIZ YARISINDA eziyordu.
   `fit-shell.css:4275-4276` şunu yazıyor:
       .modul-govde .fit-pane > section:nth-of-type(odd){ background:var(--bg-white) }
       .modul-govde .fit-pane > section:nth-of-type(even){ background:var(--bg-cream) }
   Yukarıdaki kanon kuralı (0,5,1) bunu (0,3,1) YENİYOR — ama yalnız KART
   TAŞIYAN bantta. Kart taşımayan bant kaynağın beyazında kalıyordu ve
   sekme rayının hemen altında tam genişlik beyaz bir panel olarak
   okunuyordu.

   ÖLÇÜLDÜ (@1440, pano ilk çocuğu):
       fit-egzersizlerim #egz-gecmis   DIV.kap        x100 w1240  saydam
       fit-programlarim  #prg-gecmis   DIV.bolum.kap  x100 w1240  saydam
       fit-enerji-defterim #def-su     SECTION        x0   w1440  #ffffff  ← panel
   Yani kardeş sayfalarda bandın kendisi YOK; pano doğrudan kolonu taşıyor
   ve modül zemini görünüyor. Bant kullanan sayfalarda da olması gereken
   bu: bandın işi KOLONU TAŞIMAK, zemin boyamak değil.

   ÖZGÜLLÜK BİLEREK DÜŞÜK (0,4,1): yukarıdaki kart kuralını (0,5,1)
   YENMEZ — kart taşıyan bant `--zemin`de kalır. İkisi de aynı griye
   çıkar, yani sonuç tek zemin. `kendi-zemini` ve `kimlik-bant` seçicinin
   KENDİSİNDE dışlanır; yüzeyini içeriği belirleyen bant etkilenmez.
   Yeni renk YAZILMADI — bant saydamlaşıyor, gri modül zemininden geliyor. */
.modul-govde .fit-pane > section:not(.kendi-zemini):not(.kimlik-bant){
  background:transparent;
}


.ust-etiket{
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-etiket); text-transform:uppercase;
  color:var(--aksan-koyu);
}
.ust-etiket::before{
  content:""; width:26px; height:var(--cizgi-2);
  background:currentColor; border-radius:var(--yuvarlak-sm);
}
.ust-etiket i{ font-size:var(--yazi-13); }


/* =====================================================================
   19 · KAP — 60 sayfa · kaynak `.wrap`
   ===================================================================== */

.kap{ max-width:var(--kap-genislik); margin:0 auto; padding-inline:var(--kap-yan); }


/* =====================================================================
   20 · EKRAN OKUYUCU YARDIMCISI — 55 sayfa · kaynak `.sr-only`
   ===================================================================== */

.yalniz-okuyucu{
  position:absolute; width:1px; height:1px;
  padding:0; margin:-1px; overflow:hidden;
  clip:rect(0,0,0,0); white-space:nowrap; border:0;
}



/* =====================================================================
   21 · AKORDEON — kaynak `.qa` / `.qa-head` / `.qa-body`
   ---------------------------------------------------------------------
   Ölçüm: `dump/fit-prototip/destek-v1.html` satır 279-307 (`.ds-list`
   konu akordeonu) ve 370-390 (`.faq-list` soru akordeonu). İki blok
   BİREBİR aynı kuralları yazıyor — tek desen, iki yer.
   Kardeş yüzey doğrulaması: `dump/diet-hesap/hesabim-destek-cozum-merkezi`
   aynı sınıf ailesini aynı yapıyla basıyor (`dd-shell.css` B2 kanonu).

   YAPI — dördü de zorunlu:
     .akordeon              liste kabı
       .akordeon-kalem      tek soru (açık kip: .acik)
         .akordeon-bas      <button aria-expanded>  ← tıklanan yüzey
           .akordeon-ikon   soru ikonu
           .akordeon-ok     ▾ dönen ok
         .akordeon-govde    cevap kabı (max-height ile açılır)

   🔴 TEK AÇIK KALEM KURALI — Beyar kararı, 2026-09-01. BÜTÜN EKRANLARDA
      GEÇERLİ: bir `.akordeon` grubunda aynı anda YALNIZ BİR kalem açık
      olabilir. Yeni bir kalem açılırken aynı gruptaki diğerleri kapanır;
      açık kaleme tekrar basmak onu kapatır (hepsi kapalı geçerli bir hâl).
      Kural DAVRANIŞTIR, CSS değil — aşağıdaki mekanizma gereği açılma JS'in
      elinde, o yüzden kanon burada yalnız SÖZLEŞMEYİ yazar. Referans
      uygulama `deneme/cozum-merkezi.html`:
          kalem.forEach(kapa); if(!acikMiydi) ac(kalem);
      ⚠ Sözleşme hem `.acik` sınıfını hem `aria-expanded`i kapsar: ikisi
        birlikte güncellenmezse ekran okuyucu kapalı kalemi açık okur.

   ⚠ AÇILMA MEKANİZMASI CSS DEĞİL JS'TİR: `.akordeon-govde` kapalıyken
     `max-height:0`, açılırken JS ölçülen `scrollHeight`i piksel olarak
     yazar. Kanon yalnız geçişi ve kapalı hâli tanımlar; yüksekliği
     yazmaz, çünkü içerik uzunluğu bilinemez.
   ===================================================================== */

.akordeon{ display:flex; flex-direction:column; gap:var(--bosluk-12); }

.akordeon-kalem{
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg);
  overflow:hidden;
  transition:border-color var(--sure-yavas) var(--yumusama),
             box-shadow   var(--sure-yavas) var(--yumusama);
}
.akordeon-kalem[hidden]{ display:none; }
/* Kaynak açık kenarı aksanın DÜŞÜK ALFALI yazımıydı: fit .35, diet .40
   alfayla kendi yeşilini yazıyor. Bu dosyada alfa yazımı YASAK (kural 2)
   ve iki marka iki ayrı alfa kullanıyor; ikisinin de rolü "aksan tonlu
   hairline" — kanonun `--aksan-cizgi` yuvası tam bu.
   ÖLÇÜM (değerler 01-tokenlar.md ve markalar/*.css'te): fit'in alfalı
   bileşiği kağıt üstünde `--aksan-cizgi`den bir kademe koyu düşüyor,
   yani kanon kenarı bir tık açık. Açık kipi taşıyan İKİNCİ işaret olan
   `--golge-sm` yerinde durduğu için vurgu tek ayağa binmiyor. */
.akordeon-kalem.acik{ border-color:var(--aksan-cizgi); box-shadow:var(--golge-sm); }

.akordeon-bas{
  display:flex; align-items:center; gap:var(--bosluk-14);
  width:100%; text-align:left;
  background:none; border:none;
  font-family:inherit;
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-govde); color:var(--murekkep);
  padding:var(--bosluk-18) var(--bosluk-22);
  cursor:pointer;
  transition:color var(--sure) var(--yumusama);
}
.akordeon-bas:hover{ color:var(--aksan-koyu); }
.akordeon-kalem.acik .akordeon-bas{ color:var(--aksan-koyu); }
/* 🔴 KAYNAKTAN AYRILDI — halka aksan YIKAMASI idi (`--fit-wash`): kağıt
   zeminde 1.11:1, klavye odağı görünmüyordu. Sekme rayında ölçülen
   kusurun (02 §5 B11) aynısı, aynı düzeltme. */
.akordeon-bas:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  /* içeri ofset: kalem `overflow:hidden` taşıyor, dışa çizilen halka
     kırpılırdı */
  outline-offset:calc(-1 * var(--odak-kalinlik));
}

.akordeon-ikon{
  flex:none; width:34px; height:34px;
  border-radius:var(--yuvarlak-md);
  /* 🔴 KAYNAKTAN AYRILDI — kaynak `--fit` / `--fit-wash` (3.18:1).
     Boş durum ikonunda ölçülen kusurun (02 §5 B7) aynısı, aynı
     düzeltme: `--aksan-koyu` yıkama üstünde 4.91:1. */
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  display:grid; place-items:center;
  font-size:var(--yazi-14);
}

.akordeon-ok{
  margin-left:auto; flex:none;
  font-size:var(--yazi-12); color:var(--metin-ikincil);
  transition:transform var(--sure-yavas) var(--yumusama);
}
/* Ok KAĞIT zeminde duruyor (ikon çipinde değil): `--aksan` orada 3.54:1
   ve ikon eşiğini (3:1) geçiyor → kaynak değeri korundu. */
.akordeon-kalem.acik .akordeon-ok{ transform:rotate(180deg); color:var(--aksan); }

.akordeon-govde{
  max-height:0; overflow:hidden;
  transition:max-height var(--sure-agir) var(--yumusama);
}
/* Sol dolgu İKON HİZASIDIR, boşluk değil: baş dolgusu + ikon kutusu +
   ikon boşluğu. Ham 74px yazmak yerine parçalardan kuruldu — ikon boyu
   değişirse hiza kendiliğinden takip eder. */
.akordeon-govde p{
  padding:0 var(--bosluk-24) var(--bosluk-20)
          calc(var(--bosluk-22) + 34px + var(--bosluk-14));
  font-size:var(--yazi-14-5); color:var(--murekkep-yumusak);
  font-weight:var(--agirlik-govde);
  line-height:var(--satir-bol);
  /* 🔴 YASLAMA İSTİSNASI — kabuk katmanı `p`ye `text-align:justify`
     veriyor ve eleman seçicisi olduğu için kalıtımla gelen hizayı ezer.
     Kaynakta cevap metni SOLA yaslı (ölçüldü: `start`); yaslanınca
     kelime araları açılıyor ve okuma kolonunda göze batıyor.
     §18'in `.giris-metni` kuralı aynı istisnayı zaten taşıyor. */
  text-align:left; text-align-last:auto;
}
.akordeon-govde p+p{ padding-top:0; margin-top:calc(-1 * var(--bosluk-8)); }
.akordeon-govde a{
  color:var(--aksan-koyu); font-weight:var(--agirlik-kalin);
  text-decoration:underline; text-underline-offset:2px;
}

@media (max-width:640px){
  .akordeon-bas{ font-size:var(--yazi-14-5); padding:var(--bosluk-15) var(--bosluk-16); gap:var(--bosluk-11); }
  .akordeon-ikon{ width:30px; height:30px; font-size:var(--yazi-12-5); }
  .akordeon-govde p{
    padding:0 var(--bosluk-16) var(--bosluk-18)
            calc(var(--bosluk-16) + 30px + var(--bosluk-11));
    font-size:var(--yazi-14);
  }
}


/* =====================================================================
   22 · ARAMA KUTUSU — kaynak `.lib-search` (+ `.faq-search .sx`)
   ---------------------------------------------------------------------
   Ölçüm: `fit-shell.css:2004-2016` (taban kit) + `destek-v1.html:345-358`
   (AÇIK YÜZEY kipi). Kabuğun tabanı KOYU banner için yazılmış — cam
   zemin, beyaz metin, alfalı renk üçlüsü. Gövdeye inen kutu o kipte
   okunmuyordu ve kaynağın kendisi onu açık yüzey diline çevirmiş:
   kağıt zemin · `--line` kenar · `--slate` metin. KANON O KİPİ ALIR;
   koyu banner kipi bu dosyada yok (alfa yazımı yasak + tek kip yeter).

   Kardeş yüzey: diet `.nb-searchbar` aynı işi MUTLAK konumlu ikonla
   yapıyor. Kanon flex mekanizmasını seçti — kaynağın kendi mekanizması
   bu ve temizle düğmesi için üçüncü bir çocuk yeri açıyor.

   YAPI:
     .arama                 <form role="search">
       > i                  büyüteç
       .arama-girdi         <input type="search">
       .arama-temizle       × düğmesi · İSTEĞE BAĞLI, JS ile .gorunur
   ===================================================================== */

.arama{
  display:flex; align-items:center; gap:var(--bosluk-12);
  max-width:520px;
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  padding:var(--bosluk-4) var(--bosluk-4) var(--bosluk-4) var(--bosluk-18);
  transition:border-color var(--sure) var(--yumusama);
}
.arama:focus-within{ border-color:var(--aksan); }
.arama>i{ flex:none; font-size:var(--yazi-15); color:var(--metin-ikincil); }

/* 🔴 KANON SINIFA BAĞLIYDI, KAYNAK ETİKETE — ölçüldü, 2026-09-02.
   Kanon `.arama-girdi` SINIFINI bekliyor; kaynağın markup'ında o sınıf
   YOK, kural ETİKETE yazılmış:
       .lib-search input{flex:1;background:none;border:none;padding:11px 0…}
   Sonuç ekranda görüldü: girdi HAM TARAYICI ALANI olarak çizildi —
   809×39 yerine 149×19, `2px inset rgb(118,118,118)` UA çerçevesiyle.
   Arama kutusu 49px yerine 29px'e indi.

   🔴 Bu, "KAPI OLMAYAN ADI GÖREMEZ" tuzağının kardeşi: kanonun kuralı
   VARDI, markup'ta karşılığı YOKTU. Ad kapısı yanlış adı yakalar, HİÇ
   OLMAYAN adı yakalayamaz.

   Çözüm kanonun kendi §72 emsalini izler (`page-main` · `wrap` gibi
   kaynak adı korunur): kural ETİKETE de bağlanır. Sınıf kipi duruyor —
   kanon ekranları onu kullanmaya devam eder. */
.arama>input,
.arama-girdi{
  flex:1; min-width:0;
  background:none; border:none; outline:none;
  font-family:inherit; font-size:var(--yazi-14-5);
  font-weight:var(--agirlik-govde); color:var(--murekkep);
  padding:var(--bosluk-11) 0;
}
.arama>input::placeholder,
.arama-girdi::placeholder{ color:var(--yer-tutucu); }
/* 🔴 TARAYICININ KENDİ TEMİZLE DÜĞMESİ KAPATILIR. `type="search"` girdisi
   WebKit/Blink'te kendi × düğmesini basar; kit zaten kendi `.arama-temizle`
   kalemini taşıyor ve ikisi yan yana çıkıyordu (ölçüldü: kutuda İKİ ×,
   biri mavi sistem düğmesi biri gri kit düğmesi). Kaynakta tek düğme var.
   ⚠ `appearance:none` TEK BAŞINA YETMEZ bazı sürümlerde; `display:none`
     ikinci kilit. */
.arama-girdi::-webkit-search-cancel-button,
.arama-girdi::-webkit-search-decoration{
  -webkit-appearance:none; appearance:none; display:none;
}

.arama-temizle{
  /* 🔴 KAYNAKTAN AYRILDI — kaynak 40×42px, dokunma hedefi eşiğinin
     (44×44, WCAG 2.5.5/2.5.8) altında. Anahtarda ölçülen kusurun
     (02 §5 B4) aynı ailesi, aynı düzeltme. */
  flex:none; min-width:44px; height:44px; padding:0;
  border:none; border-radius:var(--yuvarlak-sm);
  background:var(--zemin); color:var(--murekkep);
  font-size:var(--yazi-14); cursor:pointer;
  display:none; place-items:center;
  transition:background var(--sure) var(--yumusama);
}
.arama-temizle.gorunur{ display:grid; }
.arama-temizle:hover{ background:var(--cizgi); }
.arama-temizle:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--odak-ofset);
}


/* =====================================================================
   23 · OKUMA KOLONU — kaynak `.faq-list`/`.faq-kat-note` max-width kuralı
   ---------------------------------------------------------------------
   Kap (`--kap-genislik` 1240px) SAYFANIN genişliğidir; akan metin orada
   okunmaz. Kaynak bunu her akan blokta tek tek yazıyor
   (`max-width:860px;margin:0 auto` — fit `.faq-list` `.faq-kat-note`
   `.faq-none` `.coll-cta` `.ds-list`); kanon tek bir kaba topladı.

   ⚠ `--olcu` (78ch) İLE KARIŞTIRMA: o akan metnin KENDİ satır ölçüsü
     (karakter tabanlı), bu KOLONUN genişliği (piksel tabanlı). Biri
     paragrafa, öbürü yerleşime aittir.

   `.okuma-notu` — kolonun tepesindeki "N sonuç" satırı. Kaynak
   `.faq-kat-note`, iki markada da birebir aynı kural.
   ===================================================================== */

.okuma-kolonu{ max-width:var(--okuma-kolonu); margin-inline:auto; }
/* Kolonun içindeki arama kutusu kendi 520px'ini bırakır, kolonu doldurur —
   kaynağın `.faq-searchbar .lib-search{max-width:860px}` kuralının karşılığı. */
.okuma-kolonu>.arama{ max-width:none; }

.okuma-notu{
  font-size:var(--yazi-13-5); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde);
  margin:0 0 var(--bosluk-18);
  overflow-wrap:anywhere;
  text-align:left; text-align-last:auto;    /* yaslama istisnası — bkz. §21 */
}
.okuma-notu b{ color:var(--murekkep); font-weight:var(--agirlik-kalin); }
/* 🔴 KAYNAKTA YOK, KANON EKLEDİ. Not sunucuda BOŞ basılıp JS ile
   doldurulan bir `role="status"` bölgesidir; boşken alt payı duruyor ve
   liste 20px aşağı kayıyordu. Sonuç yokken cümleyi boş durum kutusu
   söylüyor — o hâlde bu satırın yer kaplamaması gerekir. */
.okuma-notu:empty{ display:none; }

/* ── 23b · MODÜL OKUMA KOLONU — kaynak R15/3, ölçülmüş sözleşme ───────
   🔴 KANONA GEÇ GİRDİ VE BEDELİ ÖLÇÜLDÜ (2026-09-02, FIT v3 · slot turu).
   Kural kaynakta `destek-v1.html`in KENDİ <style> bloğundaydı, kabuk
   dosyasında değil; üretici sayfa stilini almadığı için sessizce düştü.
   Sonuç Beyar'ın v2 ile yan yana kıyasında görüldü: panel kartları
   860 yerine 1120 basılıyordu.

   ⚠ Bu, KOPYALAMA-KURALI'nın "kaynağın kuralı DOSYASINDA yazılıdır"
     maddesinin ikinci kez gerçekleşmesi. Aynı 860px, aynı dosya, aynı
     24 satırlık gerekçe bir tur önce de atlanmıştı ("Çip şeridi 1176px
     basıldı, Beyar 'tablar dar' dedi"). Kural artık KANONDA — sayfa
     stiline geri düşmesin diye.

   ── KAYNAĞIN ÖLÇÜMÜ (destek-v1.html, 1440px) ─────────────────────────
   Panelde ÜÇ ayrı genişlik vardı ve göz her blokta yeniden hizalanıyordu:
       arama kutusu      132 →  652   520px · SOLA yaslı
       kategori çipleri  132 → 1308   tam genişlik
       akordiyon         289 → 1150   860px · ortalı
   Talep satırı da 1176px'ti: ikon 135'te, konu 191'de, durum rozeti
   1287'de — arada ~600px boşluk kalıyordu. "Satır dar değil, KAP geniş."

   Karar: MODÜLÜN okuma kolonu 860px'tir; arama · çipler · akordiyon ·
   panel kartı · bilgi notu aynı kolona oturur. Yeni ölçü İCAT EDİLMEDİ —
   860 zaten akordiyonun kendi genişliğiydi, diğerleri ona çekildi.

   🔴 KAPSAM `.modul-govde` İLE SINIRLI, `main` İLE DEĞİL. Kimlik bandı
   (kapak 1176 · kimlik kartı 1120 · sayaç şeridi 1176) bu kolona
   GİRMEZ; o kabuk kalemidir ve `.modul-govde`nin KARDEŞİDİR. Kapsamı
   `main`e açmak kapağı 860'a düşürürdü — üretici bir tur bu hatayı
   yaptı (gövdeyi ikinci bir `.modul-govde`ye sarmıştı).
   --------------------------------------------------------------------- */
/* 🔴 PANEL İÇİ ÇİP ŞERİDİ DE KOLONA GİRER — ölçüldü, 2026-09-02.
   Kaynağın kuralı bunu ayrıca yazıyor:
     .fit-pane[data-pane="cozum"] .pf-tabbar .wrap > .pf-tabs{max-width:860px}
   Kanonda atlanmıştı; kategori çipleri 1440'ta duruyor, akordiyon 860'ta —
   göz her blokta yeniden hizalanıyordu (kaynağın kendi şerhinin
   ölçtüğü kusurun aynısı, bu kez kanonda).
   ⚠ KAPSAM `.fit-pane` İÇİ. Modül şeridi `.modul-govde`nin KARDEŞİDİR
     ve 1176'da kalır; kapsamsız yazılsaydı o da 860'a düşerdi. */
.modul-govde .fit-pane .sekmeler,
.modul-govde .kart.panel,
.modul-govde .sekme-ray.hesap,
.modul-govde .sekme-ray.bant-ici,
.modul-govde .bilgi-notu,
.modul-govde .akordeon,
.modul-govde .okuma-notu,
.modul-govde .arama,
.modul-govde .kapanis,
/* 🔴 KAYNAĞIN LİSTESİNDE SON MADDE BİR JOKERDİ, ATLANMIŞTI:
       .modul-govde .ds-body .wrap > * { max-width:860px; margin-inline:auto }
   Yani "hızlı çözümler" bandındaki HER doğrudan çocuk kolona girer —
   akordiyon (`.ds-list`), ipucu kabı (`.tk-aside` → `.ipucu-kap`) ve
   bandın kendi notu. Tek tek ad sayarak taşımak ikisini düşürdü:
   ölçüldü, ikisi de 1176'da duruyordu, kaynakta 860.
   Joker olarak taşınır — kaynağın kararı da joker. */
.modul-govde .ds-body .kap > *{
  max-width:var(--okuma-kolonu); margin-inline:auto;
}
/* 🔴 DİKEY MARJ SIFIRLANIR, YATAY `auto` KALIR. Ölçüldü @1440: bandın
   kendi dolgusu 32/32 ama içeriğin banda uzaklığı 56/54 çıkıyordu —
   `.sekme-ray.hesap` kabuktan `margin:24px … 22px` taşıyor. İki kusur
   birden: bant dolgusuna binen ikinci boşluk, ve 24≠22 olduğu için
   içerik bandın MERKEZİNDE değil. Zemin ve dolgu YAZILMAZ — ikisi de
   zebra kuralında. */
.modul-govde .sekme-ray.hesap,
.modul-govde .sekme-ray.bant-ici{ margin-block:0; }


/* =====================================================================
   24 · KAPANIŞ BANDI — kaynak `.coll-cta` / `.cc-ico` / `.cc-btns`
   ---------------------------------------------------------------------
   Ölçüm: `destek-v1.html:410-414` (+ mobil 417). Ekranın dibinde,
   aradığını bulamamış kullanıcıya NE YAPACAĞINI söyleyen ortalı bant.
   Boş durumdan (§7) farkı: boş durum bir yokluğu bildirir, bu bant
   içerik DOLUYKEN de durur ve bir sonraki adımı verir.

   DÖRT PARÇA: ikon · başlık · neden · eylem(ler).
   ===================================================================== */

.kapanis{
  text-align:center;
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg);
  padding:var(--bosluk-38) var(--bosluk-30);
  max-width:var(--okuma-kolonu); margin-inline:auto;
}
.kapanis-ikon{
  width:62px; height:62px;
  border-radius:var(--yuvarlak-lg);
  /* 🔴 KAYNAKTAN AYRILDI — §21 ve §7 ile aynı ölçüm: aksan, aksan
     yıkaması üstünde 3.18:1. `--aksan-koyu` 4.91:1. */
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  display:grid; place-items:center;
  font-size:var(--yazi-25);
  margin:0 auto var(--bosluk-16);
}
.kapanis h3{
  font-size:var(--yazi-21); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); margin-bottom:var(--bosluk-8);
}
.kapanis p{
  font-size:var(--yazi-14); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); line-height:var(--satir-genis);
  max-width:420px; margin:0 auto var(--bosluk-20);
  /* Kap `text-align:center` yazıyor ama kabuğun `p` kuralı kalıtımı
     eziyor — ortalama burada AÇIKÇA tekrarlanmalı (ölçüldü). */
  text-align:center; text-align-last:auto;
}
.kapanis-eylemler{
  display:flex; gap:var(--bosluk-12);
  justify-content:center; flex-wrap:wrap;
}

@media (max-width:640px){
  /* dar dolgu diet'in kendi kitinden ölçüldü (30px 20px → 32/20);
     fit mobilde yalnız düğmeleri esnetiyor, dolguyu bildirmiyor */
  /* ⚠ KAPANIŞ BANDININ MOBİL DOLGUSU YOKTUR. Kaynak `destek-v1.html:407`
     `38px 30px` yazar ve ≤640 için AYRI kural bildirmez — yani dolgu her
     genişlikte aynıdır. Kanon burada `32px 20px` uydurmuştu; 390px
     ölçümü yakaladı (02 §35). Kural silindi, taban değer geçerli. */
  .kapanis-eylemler .dugme{ flex:1; min-width:0; }
}



/* =====================================================================
   25 · KİMLİK KARTI — kaynak `.fp-kapak` / `.fp-kimlik` / `.pf-stats`
   ---------------------------------------------------------------------
   Ölçüm: `fit-shell.css:4105-4164` (kapak · kart · meta),
          `:4204-4211` (sayaç kutusu), `:4231-4233` (sayaç şeridi),
          `:4278-4293` (mobil), `:4335-4339` (kırıntı kipi).
   Kardeş doğrulama: diet `.pf-banner`/`.pf-head`/`.pf-ava`/`.pf-stats`
   AYNI geometriyi taşıyor (`planim.css:381` — avatar 128px, 4px beyaz
   kenar, `margin-top:-70px`; kart binmesi de aynı). İki marka, tek yapı.

   YAPI — sıra değişmez:
     .kapak                 görsel bant, perdesi ::after ile
       .kapak-muhur         sol üstte versal hap
     .kimlik                kapağa BİNEN kart (negatif margin)
       .kimlik-avatar       yuvarlak, karttan yukarı taşar
       .kimlik-govde
         h1 + .rozet        ad ve rozet(ler) AYNI satırda
         .kimlik-kullanici  @kullanıcı adı
         .kimlik-meta       ikonlu ikincil bilgi satırı
     .sayac-serit           kartın ALTINDA, hairline ızgara
       .sayac               tek kutu: ikon + etiket + sayı

   ⚠ ROZET YENİ BİLEŞEN DEĞİL: adın yanındaki kalemler §5 `.rozet`tir.
     Kaynağın `.fp-badge.ok/.wait/.off/.stop` dörtlüsü kanonda
     `.olumlu/.bekleme/.pasif/.durdu` olarak zaten var; burada yalnız
     başlık satırındaki ölçüsü bildiriliyor.

   ⚠ SAYAÇ ŞERİDİ AYIRICISINI KENARLIKLA DEĞİL IZGARA BOŞLUĞUYLA ÇİZER:
     kap `gap:1px` + çizgi rengi zemin, kutular kağıt. Kenarlıkla
     yazılsaydı satır kırıldığında (mobil) sarkan çizgiler kalırdı —
     kaynağın kendi çözümü bu ve ölçülerek alındı.
   ===================================================================== */

.kapak{
  position:relative;
  height:var(--banner-h-profil);
  border-radius:var(--yuvarlak-xl);
  overflow:hidden;
  background-size:cover; background-position:center;
  box-shadow:var(--golge-md);
}
/* Perde: görsel ne olursa olsun mührün ve kartın okunmasını garantiler. */
.kapak::after{ content:""; position:absolute; inset:0; background:var(--kapak-perde); }

.kapak-muhur{
  /* 🔴 ÜST 18, SOL 20 — ASİMETRİK VE KASITLI. Üç kaynak dosyasında da
     aynı ölçüldü (hesabim · destek · paketlerim). Kanon ikisini de 20
     yapmıştı; ilk turda `--bosluk-18` kademesi yoktu, artık var.
     B22 ailesi (slot-2 K8, 2026-09-01). */
  position:absolute; top:var(--bosluk-18); left:var(--bosluk-20);
  z-index:var(--kat-icerik);
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  background:var(--muhur-zemin); color:var(--murekkep);
  font-size:var(--yazi-11); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-muhur); text-transform:uppercase;
  padding:var(--bosluk-8) var(--bosluk-14);
  border-radius:var(--yuvarlak-sm);
}

/* Kart kapağa BİNER — negatif margin geometridir, boşluk değil. */
.kimlik{
  position:relative; z-index:var(--kat-kimlik);   /* 🔴 2 → 3 · kaynak `.fp-kimlik` */
  display:flex; gap:var(--bosluk-26); align-items:flex-start;
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg);
  box-shadow:var(--golge-md);
  padding:var(--bosluk-26) var(--bosluk-30) var(--bosluk-28);
  margin:-78px var(--bosluk-28) 0;
}

.kimlik-avatar{
  flex:none; width:128px; height:128px;
  border-radius:var(--yuvarlak-daire);
  background-size:cover; background-position:center;
  border:4px solid var(--kagit);
  box-shadow:var(--golge-md);
  margin-top:-70px;
}
/* Fotoğrafı olmayan üye — baş harf. Kaynak diet `.pf-ava.is-harf`
   (`planim.css:402`), oradaki beyaz metin marka renginin üstünde duruyordu.
   🔴 KAYNAKTAN AYRILDI: zemin `--aksan-koyu`. Beyaz metin aksanın kendisi
   üstünde 3.54:1 ile AA altında kalıyor (§2'de ölçülen G5'in aynısı);
   koyu adım 5.45:1. */
.kimlik-avatar.harf{
  display:grid; place-items:center;
  background:var(--aksan-koyu); color:var(--kagit);
  font-weight:var(--agirlik-kalin); font-size:var(--yazi-51);
  line-height:var(--satir-tek); letter-spacing:normal;
}

.kimlik-govde{ flex:1; min-width:0; }
.kimlik-govde h1{
  font-size:var(--yazi-29); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-baslik);
  display:flex; align-items:center; gap:var(--bosluk-12); flex-wrap:wrap;
}
.kimlik-govde h1 .rozet{ font-size:var(--yazi-11-5); }

.kimlik-kullanici{
  display:block; font-size:var(--yazi-14);
  color:var(--metin-ikincil); font-weight:var(--agirlik-govde);
  margin-top:var(--bosluk-3);
}

.kimlik-meta{
  display:flex; flex-wrap:wrap;
  gap:var(--bosluk-7) var(--bosluk-20);
  margin-top:var(--bosluk-13);
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde);
}
.kimlik-meta span{ display:inline-flex; align-items:center; gap:var(--bosluk-8); }
.kimlik-meta i{ color:var(--aksan-koyu); }

/* Kartın tanıtım cümlesi — kartın İÇİNDE kalır. Dışına alınsaydı sayaç
   şeridinin altında öksüz bir paragraf olurdu (kaynağın kendi ölçümü). */
.kimlik-giris{
  font-size:var(--yazi-14-5); color:var(--murekkep-yumusak);
  font-weight:var(--agirlik-govde); line-height:var(--satir-genis);
  margin-top:var(--bosluk-12);
  text-align:left; text-align-last:auto;    /* yaslama istisnası — bkz. §21 */
}
/* Kullanıcı adı aksanlı — kaynak `.fp-uad`. */
.kimlik-uad{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }

/* ---- sayaç şeridi — KARTIN DIŞINDA, KENDİ KARTI ----------------------
   🔴 DÜZELTİLDİ (2026-09-01). İlk yazımda şerit `.kimlik-govde`nin içine
   konmuştu; ÖLÇÜLDÜ ve yanlıştı: kaynak onu `.fp-kimlik`in KARDEŞİ olarak
   basıyor (`fit-shell.js:1706` — `.cp-stats.pf-stats` bloğu kartın dışında,
   `.wrap`ın doğrudan çocuğu).
   Kusur görünürdü: kartın iç genişliği avatar + dolgu düştükten sonra
   ~900px kalıyor, 5 kutu × `flex-basis:200px` oraya sığmıyor ve sıra
   4+1'e kırılıyordu. Kardeş olarak kap genişliğinin tamamını (1240px)
   alıyor ve beşi TEK SIRADA duruyor — kaynağın görüntüsü bu.
   Kutu ayırıcısı kenarlık değil ızgara boşluğu: kap `gap:1px` + çizgi
   rengi, kutular kağıt. Satır kırıldığında sarkan çizgi kalmaz. */
.sayac-serit{
  display:flex; flex-wrap:wrap;
  margin-top:var(--bosluk-14);
  gap:var(--cizgi-1);
  background:var(--cizgi);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  box-shadow:var(--golge-sm);
  overflow:hidden;
}
.sayac{
  flex:1 1 200px; min-width:0;
  display:flex; align-items:center; gap:var(--bosluk-12);
  background:var(--kagit);
  padding:var(--bosluk-15) var(--bosluk-20);
}
.sayac>i{
  flex:none; width:38px; height:38px;
  border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  display:grid; place-items:center; font-size:var(--yazi-15);
}
.sayac>div{ min-width:0; }
.sayac span{
  display:block; font-size:var(--yazi-11);
  line-height:var(--satir-govde); font-weight:var(--agirlik-govde);
  letter-spacing:var(--aralik-genis); color:var(--metin-ikincil);
}
.sayac b{
  display:block; font-size:var(--yazi-16-5);
  line-height:var(--satir-govde); font-weight:var(--agirlik-kalin);
  color:var(--murekkep);
}

/* Kırıntı bu bantta AÇIK zeminde durur — §17'nin kendisi KOYU zemin
   içindir. Kaynak da aynı ayrımı yapıyor (`fit-shell.css:4335-4339`:
   `.fp-profil .lib-crumb` kendi açık kipini yazıyor). */
.kimlik-bant .kirinti{
  color:var(--metin-ikincil); font-weight:var(--agirlik-govde);
  font-size:var(--yazi-13); gap:var(--bosluk-9);
  /* ⚠ ÜST=18 ALT=14+18: kaynak kırıntıya kendi dikey dolgusunu veriyor
     (`fit-shell.css:4335`), bandın dolgusuna EKLENİR. Header ile kırıntı
     ve kırıntı ile kapak arasındaki nefes bu üç sayıdan doğar. */
  padding:var(--bosluk-18) 0 var(--bosluk-14);
  margin-bottom:var(--bosluk-18);
}
.kimlik-bant .kirinti a{ color:var(--metin-ikincil); }
.kimlik-bant .kirinti a:hover{ color:var(--aksan-koyu); }
.kimlik-bant .kirinti>i{ color:var(--cizgi-vurgu); }
.kimlik-bant .kirinti-ev i{ color:var(--aksan-koyu); }
.kimlik-bant .kirinti-ev:hover i{ color:var(--aksan-koyu); }
.kimlik-bant .kirinti-simdi{ color:var(--murekkep); font-weight:var(--agirlik-kalin); }

/* ── DAR EKRAN ────────────────────────────────────────────────────────
   🔴 BU BLOK 2026-09-01'DE YENİDEN ÖLÇÜLDÜ (02 §35 · B39). Önceki hâli
   ÖLÇÜLMEDEN yazılmıştı ve dokuz değeri birden kaynaktan sapıyordu;
   390px ölçümü açığa çıkardı (üç destek ekranında 99 gerekçesiz fark,
   yığılma bu bileşende). Aşağıdaki değerlerin tamamı
   `fit-shell.css:4307-4325` ve `:4284-4286`den birebir alındı.       */
@media (max-width:1180px){ .sayac{ flex:1 1 30%; } }
@media (max-width:900px){  .sayac{ flex:1 1 140px; } }
/* Ara kademe — kaynak `:4307`. Kanonda HİÇ YOKTU: 1024↔640 arasında
   kart tam genişlikte kalıyor, kapağa binmesi bozuluyordu. */
@media (max-width:1024px){
  .kimlik{ margin:-70px var(--bosluk-16) 0; padding:var(--bosluk-22) var(--bosluk-22) var(--bosluk-24); }
}
/* ⚠ `.sayac-serit` BU BLOĞA GİRMEZ. Kaynağın `:4309`daki
   `.fp-sayac{margin:18px 16px 0}` kuralı BAŞKA bir kite aittir (plan
   profilinin `.fp-sayac`/`.pfs`i); kanonun `.sayac-serit`i `.pf-stats`
   karşılığıdır ve onun yan payı YOKTUR (`:4231` — yalnız `margin-top`).
   İlk yazımda karıştırıldı, 390px ölçümü yakaladı. */
@media (max-width:640px){
  /* Kapak ve mühür mobil dalda hiç bildirilmiyordu — bkz. token şerhi. */
  .kapak{ height:var(--banner-h-profil-dar); border-radius:var(--yuvarlak-lg); }
  .kapak-muhur{
    top:var(--bosluk-12); left:var(--bosluk-12);
    padding:var(--bosluk-7) var(--bosluk-11); font-size:var(--yazi-10);
  }
  .kimlik{
    flex-direction:column; align-items:center; text-align:center;
    margin:-52px var(--bosluk-4) 0;
    padding:var(--bosluk-20) var(--bosluk-18) var(--bosluk-22);
    gap:var(--bosluk-14);
  }
  .kimlik-avatar{ width:104px; height:104px; margin-top:-66px; }
  .kimlik-avatar.harf{ font-size:var(--yazi-34); }
  .kimlik-govde{ width:100%; }
  .kimlik-govde h1{ justify-content:center; font-size:var(--yazi-23); }
  .kimlik-meta{ justify-content:center; gap:var(--bosluk-6) var(--bosluk-16); font-size:var(--yazi-12-5); }
  /* B36'nın yan etkisi: bileşen kendi `text-align`ini bildirdiği için
     kaptan gelen `center` kalıtımını ALMAZ — mobilde açıkça tekrarlanır. */
  .kimlik-giris{ text-align:center; }
  .sayac-serit{ margin-top:var(--bosluk-12); }
  .sayac{ flex:1 1 44%; padding:var(--bosluk-13) var(--bosluk-14); }
}

/* =====================================================================
   26 · KABUK KENAR KALEMLERİ — sağ şerit · kenar sekmesi · yüzen düğmeler
   ---------------------------------------------------------------------
   Ölçüm: render edilmiş kaynak DOM (`dump/fit-render/destek-cozum.html`),
   1440×1000. CSS okunarak değil, EKRANDAN ölçüldü — kaynakta bu kalemleri
   basan şey kabuk JS'i ve birkaç geç-ezme kuralı; dosyayı okumak yanlış
   değer veriyordu (bkz. §25 kimlik bandı zemini).

   Ölçülen kutular:
     .fb-rail       8×100dvh @ sağ 0   · aksan   · z 71
     .feedback-tab  52×144   @ sağ 0   · aksan   · z 72 · dikey yazı
     .to-top        54×54    @ sağ 22  · kağıt   · z 55

   ⚠ BU BLOK KABUĞUN TAMAMI DEĞİL. Üst bant · header · footer hâlâ
     markanın kendi kabuk dosyasından geliyor. Buradakiler o dosyalarda
     KARŞILIĞI OLMAYAN ya da iki markada ayrışan kenar kalemleridir.
   ===================================================================== */

/* Sağ kenarda tam boy dikey şerit. Üst bandın ÜSTÜNDEN geçer (z 71 > 70):
   altında kalsaydı ekranın en üstünde kesilirdi — kardeş markada da
   ölçülmüş ve aynı gerekçeyle 71'e alınmış bir kusur. */
.kenar-serit{
  position:fixed; top:0; right:0;
  width:var(--kenar-serit-g); height:100dvh;
  background:var(--aksan);
  z-index:var(--kat-kenar-serit);
  pointer-events:none;
}

/* Dikey kenar sekmesi. Kaynak `writing-mode` kullanıyor, `rotate()` değil:
   döndürme kutunun akış içindeki ölçüsünü değiştirmediği için sekme
   kendi yüksekliğini bildiremiyordu. */
/* 🔴 `<button>`/`<a>` YAZI YÜZÜNÜ MİRAS ALMAZ — sekme ARIAL çiziliyordu
   ve bu HER EKRANDA görünüyordu (kabuk kalemi). `.rozet-karti`/`.basamak`
   ile aynı kusur; `fontFamily` OZ'ye girince üçü birden çıktı. */
.kenar-sekmesi{
  font-family:inherit;
  position:fixed; right:0;
  /* Kaynak JS ile yazıyor; kanon aynı kuralı CSS'te ifade eder:
     sabit 272px, pencereden taşarsa iki uçtan 140px pay bırakacak
     şekilde kırpılır. `clamp` bu kırpmanın birebir karşılığı. */
  top:clamp(140px, var(--kenar-sekmesi-ust), calc(100dvh - 140px));
  transform:translateY(-50%);
  z-index:var(--kat-geri-bildirim);
  display:inline-flex; flex-direction:row; align-items:center;
  gap:var(--bosluk-9);
  writing-mode:vertical-rl;
  background:var(--aksan); color:var(--kagit);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-vurgu);
  line-height:var(--satir-govde); text-align:left;
  padding:var(--bosluk-24) var(--bosluk-16);
  min-height:144px;
  border-radius:var(--yuvarlak-lg) 0 0 var(--yuvarlak-lg);
  box-shadow:var(--golge-md);
  white-space:nowrap; cursor:pointer; border:none;
}
/* İkon dikey akışta YATAY kalır — yoksa glif de döner ve kalem 9px uzar
   (ölçüldü: 153 → 144). */
.kenar-sekmesi i{ font-size:var(--yazi-13); writing-mode:horizontal-tb; }
.kenar-sekmesi:hover{ background:var(--aksan-koyu); padding-right:var(--bosluk-20); }
.kenar-sekmesi:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--odak-ofset);
}

/* "Başa dön" — kaydırma eşiğini JS geçer, kanon yalnız iki hâli tanımlar. */
.basa-don{
  /* 🔴 İSTİF ÖLÇÜLDÜ (render edilmiş kaynak DOM): sohbet düğmesi ALTTA
     (22px), "başa dön" ONUN ÜSTÜNDE (92px). Kaynakta `.to-top` tam olarak
     bu yükseklikte duruyor; ilk yazımda ikisini ters koymuştum. */
  position:fixed; right:var(--bosluk-22); bottom:92px;
  z-index:var(--kat-yuzen);
  width:54px; height:54px;
  border-radius:var(--yuvarlak-lg);
  background:var(--kagit); color:var(--aksan-koyu);
  border:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-16); cursor:pointer;
  display:inline-flex; align-items:center; justify-content:center;
  box-shadow:var(--golge-yuzen);
  opacity:0; visibility:hidden; transform:translateY(8px);
  transition:opacity var(--sure-yavas) var(--yumusama),
             transform var(--sure-yavas) var(--yumusama),
             visibility var(--sure-yavas),
             background var(--sure) var(--yumusama),
             color var(--sure) var(--yumusama),
             border-color var(--sure) var(--yumusama);
}
.basa-don.gorunur{ opacity:1; visibility:visible; transform:none; }
.basa-don:hover{ background:var(--aksan-koyu); color:var(--kagit); border-color:var(--aksan-koyu); transform:translateY(-2px); }
.basa-don:focus-visible{ outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset); }

/* Yüzen eylem düğmesi — sohbet/uzman kalemi. "Başa dön"ün ÜSTÜNDE durur
   (bottom 92 > 24) ki ikisi çakışmasın; iki markada da aynı istif. */
.yuzen-dugme{
  position:fixed; right:var(--bosluk-22); bottom:var(--bosluk-22);
  z-index:var(--kat-yuzen-dugme);
  width:56px; height:56px;
  display:inline-flex; align-items:center; justify-content:center;
  gap:var(--bosluk-10);
  font-family:inherit; font-size:var(--yazi-14-5);
  font-weight:var(--agirlik-kalin); line-height:var(--satir-sik);
  text-decoration:none; text-align:left;
  color:var(--kagit); background:var(--aksan-koyu);
  border:var(--cizgi-1) solid var(--aksan-koyu);
  border-radius:var(--yuvarlak-lg);
  box-shadow:var(--golge-yuzen);
  cursor:pointer;
  transition:background var(--sure) var(--yumusama), transform var(--sure) var(--yumusama);
}
.yuzen-dugme i{ font-size:var(--yazi-18); flex:none; }
.yuzen-dugme:hover{ background:var(--aksan-koyu-2); border-color:var(--aksan-koyu-2); transform:translateY(-2px); }
.yuzen-dugme:focus-visible{ outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset); }
/* Uzmanı olmayan üye: düğme yuvarlak bir rozet değil, DOĞRUYU SÖYLEYEN
   bir satırdır — "Sohbet" yazıp boş panel açmak yalan olurdu. */
.yuzen-dugme.bos{ width:auto; height:52px; padding:0 var(--bosluk-20); }
.yuzen-dugme.bos i{ font-size:var(--yazi-15); }

@media (max-width:640px){
  .kenar-serit,.kenar-sekmesi{ display:none; }
  /* 🔴 MOBİL İSTİF · ÖLÇÜLDÜ 2026-09-04 — 65 FIT public sayfası @390,
     düğmeler GÖRÜNÜR hâle gelene kadar kaydırıldıktan sonra.
         20 sayfada  .basa-don ↔ #msjFab  örtüşme 54×47 px
         .basa-don   54×54 · dip 92    ← masaüstü ölçüsü, mobilde de
         #msjFab     54×54 · dip 85
     KÖK KABUK ↔ KANON ÖZGÜLLÜK ÇARPIŞMASI. Kabuk mobil istifi ZATEN
     yazıyor (`fit-shell.css` · `@media(max-width:640px){.to-top{
     bottom:calc(148px + env(safe-area-inset-bottom,0px)); width:48px;
     height:48px}}`) ama kanonun `.basa-don` TABAN kuralı medya kapısı
     taşımıyor ve kanon kabuktan SONRA yükleniyor: eşit özgüllükte
     (0,1,0) sonraki kazanır, kabuğun mobil kuralı ölür.
     ⚠ KANIT KÜME FARKINDA: aynı düğme 42 yüzey sayfasında YALNIZ
       `to-top` sınıfını taşıyor (kanon sınıfı yok) ve orada 48×48 ·
       dip 148 ölçülüyor, çakışma SIFIR. Yani kusur düğmenin değil,
       kanon adının bulunduğu yerin kusuru.
     Yeni ölçü ÜRETİLMEDİ: üç değer de kaynağın kendi mobil bildirimi. */
  .basa-don{
    right:var(--bosluk-16);
    bottom:calc(148px + env(safe-area-inset-bottom,0px));
    width:48px; height:48px;
  }
  .yuzen-dugme{ right:var(--bosluk-16); width:52px; height:52px; }
}


/* =====================================================================
   27 · KABUK GÖVDESİ — üst bant · sayfa başı · dip
   ---------------------------------------------------------------------
   Ölçüm: render edilmiş kaynak DOM (`dump/fit-render/destek-cozum.html`),
   1440px. TİPOGRAFİ KAYNAĞIN, İÇERİK VE RENK MARKANIN.

   Kaynağın ölçülen değerleri:
     üst bant   h40 · 12.5px/500 · zemin --murekkep · metin --koyu-metin-ust
     sayfa başı h73 · top 40 · zemin --kagit · alt kenar --cizgi
     ana menü   15px/700 · dolgu 9/12 · yuvarlaklık md · gap 2
     dip        zemin --aksan-koyu · üst dolgu 70
       başlık   15px/700 · beyaz · alt boşluk 18
       bağlantı 14px/500 · dolgu 7/0
       yasal    12px/500 · dolgu 24/0/0
       alt      13px/500 · dolgu 16/0/26

   🔴 DİP METNİ ALFA, SABİT RENK DEĞİL. Kaynak beyazın alfasını kullanıyor
   (.88/.92/.84); markanın kendi kabuğu mavi-gri bir rampa
   kullanıyordu ve yeşil zeminde markanın dışına düşüyordu. Rampa
   `tokenlar.css §1`de.

   ⚠ BU BLOK KABUĞUN TİPOGRAFİ KATMANIDIR, TAMAMI DEĞİL. Süs kalemleri
     (marka değiştirici hapları, mağaza rozetleri, avatar menüsü, mega
     menü, çekmece) hâlâ markanın kendi kabuk dosyasından geliyor. Sıradaki
     dilim orası; bu blok yalnız YAZI farkını kapatır.
   ===================================================================== */

/* ---- üst bant ---- */
/* ── 27b · KELİME MARKASI — patron dosyasından, vektör ────────────────
   🔴 KANONA 2026-09-02'DE GİRDİ · Beyar kararı (seçenek A).
   Kaynak: `Revenge - Docs/DadaMentor-Logos.ai` (PDF-1.6) → pdftocairo -svg
           → yedi path (d·a·d·a·f·i·t) → `kanon/varlik/dadafit-kelime.svg`

   NEDEN DEĞİŞTİ — prototipin kelime markası üç yerde dokümanla çelişti,
   üçü de ÖLÇÜLDÜ:
     yazım    prototip "DadaFit" (büyük harfle)  ·  doküman "dadafit"
     renk     prototip İKİ renkli (#211E16 + aksan) · doküman TEK renk
     değer    prototip #009d4f  ·  doküman #0093D0 (Pantone 299 C)
   EKSİ İKİNCİ MADDE: dokümanla kaynak çelişirse doküman kazanır.

   ⚠ İŞARET (kare + şimşek) DOKUNULMADI. Patron dosyasında hiçbir
     karşılığı yok, ama o dosya bir RENK/KELİME sayfası; işaretin
     YOKLUĞU "işaret olmayacak" demek mi belirsiz. HANDOFF'ta açık
     kalem — karar Beyar'ın, kanon kendi kararıyla işaret SİLMEZ.

   ── ÖLÇÜ ─────────────────────────────────────────────────────────────
   Vektörün kendi oranı  3.9182 : 1   (tarayıcıda getBBox ile ölçüldü)
   Kaynağın kelime kutusu 81.4 × 24.0 px  ·  oranı 3.390 : 1
   İkisi AYNI DEĞİL çünkü kaynağınki bir METİN kutusu (satır boşluğu
   dahil), vektörünki İNK kutusu (`d` çıkanından taban çizgisine).
   Bu yüzden kutu yüksekliği DEĞİL, OPTİK boy eşitlendi:
     kaynağın küçük harf x-yüksekliği  ≈ 23px × 0.52  = 12.0px
     vektörün x/ink oranı              = 426/597      = 0.714
     → ink yüksekliği = 12.0 / 0.714   ≈ 16.8 → 17px

   🔴 BEYAR ÜSTÜNE KARAR VERDİ (K15, 2026-09-02): işaret kalktığı için
   optik eşitleme gerekçesi de düştü — kelime markası artık kabuktaki
   marka bloğunun TAMAMI. Ölçülen kutu yüksekliği KORUNUR: 24px.
   Genişlik oranla gelir: 24 × 3.9182 ≈ 94.0px. Uydurma yok.
   ⚠ İşaretin kutusu (40×40) ve aradaki boşluk KALKTI; kelime markası
     kabuk kabının sol kenarına oturur.
   ⚠ `width:auto` + `height` — oran vektörün, kanon ONU EZMEZ.

   🔵 ŞERH · OPTİK EŞİTLİK — İNEN HARF TAŞIYAN MARKALAR
      (2026-09-03, DadaGastro turunda ölçüldü · Beyar onayı)

      K15 "kutu yüksekliği KORUNUR: 24px" derken kıyas KELİME MARKASI ↔
      METİN KUTUSU idi ve markada işaret vardı. Kardeş ürünler arasında
      kıyas yapılınca o kural YETMİYOR:

        Aynı 24px kutuda   FIT "dada"    = kutunun %99,3'ü
                           GASTRO "dada" = kutunun %82,3'ü
        → Gastro'nun harfleri FIT'in %82,9'u; kutu eşit, HARF DEĞİL.

      Sebep geometrik: "dadafit"in mürekkep kutusu çıkandan taban
      çizgisine iner (inen harf yok). "dadagastro"da 'g' harfinin İNENİ
      kutuya girer, aynı yükseklikte harflere daha az yer kalır.

      KURAL: inen harf taşıyan bir kelime markası, inen taşımayan bir
      kardeşiyle aynı yüzeyde kullanılacaksa kutu yüksekliği OPTİK
      KATSAYIYLA bölünür:
          kutu(marka) = kutu(referans) ÷ (d_marka/kutu ÷ d_referans/kutu)
      Ölçüt iki markada da ORTAK olan glif — "dada" logotipi.
      İnen taşımayan markada katsayı 1,000'dir, yani kural onları
      etkilemez ve K15 onlarda aynen geçerli kalır.

      DadaGastro'da uygulanan: katsayı 0,829 →
          header 24→29px · dip 28→33,8px · çekmece 19→22,9px
      Doğrulandı: "dada" yüksekliği FIT 23,88px / GASTRO 23,88px (1,000).
      Uygulama: scripts/gastro-logo.mjs (kanon bileşenleri yüklenmiyor,
      kural oraya kopyalandı).

   🔵 ŞERH · KELİME MARKASININ RENGİ HEADER DURUMUNA BAĞLIDIR
      (2026-09-04, DadaDiet turunda yazıldı · Beyar kuralı · DÖRT MARKA)

      SAYDAM header (koyu hero üstünde)   → kelime markası BEYAZ
      SOLID beyaz header (kaydırınca)     → kelime markası MARKA RENGİ

      İSTİSNA — KİMLİK EKRANLARI: giriş ve kayıt ekranlarında kelime
      markası SAYDAM header'da BİLE marka rengindedir. Gerekçe: o
      ekranlarda marka kimliği sayfanın kendi konusudur; beyaza
      düşürmek onu kabuk süsüne indirir. FIT'te zaten böyleydi
      (giris.html#kayit'ta logo mavi); kural oradan genelleştirildi.

      Kaynak siteler bunu İKİ AYRI LOGO DOSYASIYLA yapıyordu:
          .header.at-top .brand .logo-color{display:none}
          .header.at-top .brand .logo-white{display:block}
      Kanonun kelime markası TEK vektördür ve rengi `currentColor`
      taşır — dosya değil RENK değişir.

      ⚠ KANCA GÖVDEDE OLMAZ. Diet turunda önce kimlik ekranlarının
        <body>'sine nitelik konuldu ve KANON EKRANLARINDA ÇALIŞMADI:
        o sayfaların kendi betiği açılışta <body> niteliklerini baştan
        yazıyor ve nitelik siliniyor (ölçüldü: dosyada var, çalışma
        anında yok). Kanca kelime markası ELEMANININ KENDİ SINIFINDA
        durmalı — hiçbir betiğe bağımlı olmaz.
        Diet'teki adı: `.diet-word-mark.marka-sabit`.

      Uygulama: scripts/diet-logo.mjs · sınama
      scripts/olcum/diet-logo-kural.mjs (beklenti sayfa adından değil,
      HEADER DURUMUNDAN türetilir — sayfa başına beklenti yazan ilk
      sürüm hero'suz sayfaları yanlış kırık gösterdi). */
.fit-word-mark{
  height:var(--marka-kelime-h);
  width:auto;
  display:block;
  flex:0 0 auto;
  /* 🔴 RENK YÜZEYDEN GELİR, SVG'YE SABİTLENMEZ — ölçüldü, 2026-09-02.
     İlk yazımda path'ler `fill="var(--marka)"` taşıyordu ve kelime
     markası HER yüzeyde marka mavisi basıyordu. Beyar footer'da gördü:
         dolgu  rgb(0,147,208)   --marka
         zemin  rgb(0,114,161)   --marka-koyu (dip zemini)
         KONTRAST 1.54:1  ← mavi üstüne mavi, OKUNMUYOR
     WCAG 1.4.11'in grafik nesne tabanı 3:1; 1.54 onun yarısı bile değil.

     Çözüm: path'ler `currentColor` taşır, rengi KAP verir. Böylece
     yüzey değişince marka da döner ve dört markada tek kural çalışır. */
  color:var(--marka);
}
/* Koyu marka zemininde — dip. Kaynağın kendi çözümü de buydu:
   footer kelime markası beyaz basılıyordu (`.fl-word .bd` #fff). */
.dip .fit-word-mark,
.footer .fit-word-mark{ color:var(--kagit); }

/* ── 27c · DİP BAŞLIKLARINDA ALT ÇİZGİ YOK ────────────────────────────
   🔴 K16 · Beyar kararı, 2026-09-02: *"footer'daki bu ana başlıkların
   altında çizgi olmayacak, gerek yok, kaldır."*

   ⚠ BU BİR KUSUR DÜZELTMESİ DEĞİL, KANON KARARIDIR. Kaynak çizgiyi
     bilerek çiziyor ve ölçüldü — İKİ tarafta da aynı:
         .foot-col h5 { border-bottom: 1px solid rgb(236,236,236) }
     Yani kanon kaynakla AYNIYDI; fark Beyar'ın kararıyla doğdu.
     KUSURU BİLDİR-DÜZELTME kuralı burada çiğnenmiyor: kural
     "ajan kendi kararıyla düzeltmez" der, bu karar ajanın değil.
   ⚠ `02-bilesenler.md §29`a kanon kararı olarak girer. */
.dip-kolon h5,
.dip-kolon .fc-head{ border-bottom:0; }

.ust-bant{
  position:fixed; top:0; left:0; right:0;
  z-index:var(--kat-ust-bant);
  background:var(--murekkep); color:var(--koyu-metin-ust);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
}
.ust-bant>.kap{ display:flex; align-items:center; justify-content:space-between; height:var(--ust-bant-h); }
.ust-bant a{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  color:var(--koyu-metin-ust);
  transition:color var(--sure) var(--yumusama);
}
.ust-bant a:hover{ color:var(--kagit); }
.ust-bant b{ font-weight:var(--agirlik-orta); color:var(--kagit); }

/* ---- sayfa başı (header) ---- */
.kabuk-basi{
  position:fixed; left:0; right:0; top:var(--ust-bant-h);
  z-index:var(--kat-header);
  background:var(--kagit);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
  box-shadow:var(--golge-kabuk);
  transition:background var(--sure-agir) var(--yumusama),
             border-color var(--sure-agir) var(--yumusama),
             box-shadow var(--sure-agir) var(--yumusama);
}

/* ── TEPEDE KİPİ (`.tepede`) — GÖRSELLİ BANDIN ÜSTÜNDE SAYDAM ─────────
   🔴 KANONDA HİÇ YOKTU. Kaynak `fit-shell.css:378` ve ailesi
   (`:401` `:419-422` `:429-430` `:2439`): sayfa görselli bir bandın
   üstündeyken ve kaydırma 0'dayken header ŞEFFAFLAŞIR, kenarı beyazın
   alfasına döner, gölgesi ve cam bulanıklığı KALKAR. Kabuk JS'i sınıfı
   kaydırmaya göre ekleyip kaldırıyor (kaynakta `.at-top`).

   Ölçüldü (`dump/fit-render/hata-404.html` ↔ `deneme/404.html`):
     FIT    background rgba(0,0,0,0) · border rgba(255,255,255,.14)
            backdrop-filter none · box-shadow none
     kanon  background #fff · border --cizgi
            backdrop-filter saturate(1.5) blur(10px) · gölge var
   Yani görselli bandın üstünde header SOLID BEYAZ duruyordu ve bandın
   üst şeridini kesiyordu (Beyar gözle yakaladı).

   ⚠ İçerik de beyaza döner — marka yazısı, menü, ikon düğmeleri. Renk
   tek tek yazılmaz: hepsi `--kagit`e bağlanır, çünkü koyu bandın üstünde
   okunur olan o. Alfa değerleri token katmanından (bant araç düğmeleri
   §34 ile aynı aile). */
.kabuk-basi.tepede{
  background:transparent;
  backdrop-filter:none;
  border-bottom-color:var(--bant-arac-kenar-2b);
  box-shadow:none;
}
.kabuk-basi.tepede .ana-menu>*>a{ color:var(--kagit); }
.kabuk-basi.tepede .ana-menu>*>a:hover{ background:var(--bant-arac-kenar); color:var(--kagit); }
.kabuk-basi.tepede .ana-menu>*>a.aktif{ color:var(--kagit); }
.kabuk-basi.tepede .ana-menu>*>a.aktif::after{ background:var(--kagit); }
.kabuk-basi.tepede .ikon-dugme{
  background:var(--bant-arac-zemin-3); border-color:var(--bant-arac-kenar-3); color:var(--kagit);
}
.kabuk-basi.tepede .ikon-dugme:hover{
  background:var(--bant-arac-zemin-2); border-color:var(--kagit); color:var(--kagit);
}
/* Odak halkası koyu zeminde beyaz olur — aksan orada görünmüyor. */
.kabuk-basi.tepede .ana-menu a:focus-visible{ outline-color:var(--kagit); }
/* 🔴 MARKA KİLİDİ DE DÖNER — logo ve kelime işareti. Kanonda eksikti ve
   slot-1 gözle yakaladı: "DadaDiet"in "Dada" hecesi koyu bandın üstünde
   KOYU kalıyor ve kayboluyordu. Bu eksik yüzünden slot-1 markup'a iki ad
   birden yazmak zorunda kaldı (`tepede` + kabuğun `at-top`u); bu üç kural
   girince `at-top`a gerek kalmaz.
   Kaynak: `dd-shell.css` `.header.at-top .brand .logo-color/.logo-white`
   ve `.header.at-top .dd-word b, … .dd-st`. */
.kabuk-basi.tepede .marka .logo-renkli{ display:none; }
.kabuk-basi.tepede .marka .logo-beyaz{ display:block; }
.kabuk-basi.tepede .marka-kelime b,
.kabuk-basi.tepede .marka-kelime .marka-son{ color:var(--kagit); }

.kabuk-basi>.kap{
  display:flex; align-items:center; gap:var(--bosluk-22);
  height:var(--header-h);
}

.ana-menu{ display:flex; gap:var(--bosluk-2); flex-wrap:nowrap; flex:1; justify-content:center; min-width:0; }
/* 🔴 YALNIZ ÜST DÜZEY KALEM — `.ana-menu a` yazılırsa açılır menünün
   kalemlerine de sızar ve onların kendi tipografisini (14px/500) ezer.
   ÖLÇÜLDÜ: sızıntı dropdown başlıklarını 15px/700 yapıyordu, kaynakta
   14px/500. Çocuk birleştiricisi kapsamı menü çubuğuyla sınırlar. */
.ana-menu>a,
.ana-menu>*>a{
  position:relative; white-space:nowrap;
  font-size:var(--yazi-15); font-weight:var(--agirlik-kalin);
  color:var(--murekkep);
  padding:var(--bosluk-9) var(--bosluk-12);
  border-radius:var(--yuvarlak-md);
  transition:color var(--sure) var(--yumusama), background var(--sure) var(--yumusama);
}
.ana-menu>a:hover,
.ana-menu>*>a:hover{ color:var(--aksan-koyu); background:var(--aksan-yikama); }
.ana-menu>a.aktif,
.ana-menu>*>a.aktif{ color:var(--aksan-koyu); }
/* Aktif kalemin altındaki çizgi kalemin İÇİNE hizalanır (12px), kutunun
   kenarına değil — dolgu değişirse çizgi metinle beraber kayar. */
.ana-menu>a.aktif::after,
.ana-menu>*>a.aktif::after{
  content:""; position:absolute; left:var(--bosluk-12); right:var(--bosluk-12); bottom:2px;
  height:var(--cizgi-2); background:var(--aksan-koyu); border-radius:var(--yuvarlak-sm);
}
.ana-menu>a i,
.ana-menu>*>a i{ font-size:var(--yazi-9); margin-left:var(--bosluk-4); opacity:.5; }

/* ---- dip (footer) ---- */
.dip{
  background:var(--aksan-koyu); color:var(--dip-metin);
  padding:var(--bosluk-64) 0 0;
}
.dip a{ color:var(--dip-link); transition:color var(--sure) var(--yumusama); }
.dip a:hover{ color:var(--kagit); }

.dip-izgara{
  display:grid; grid-template-columns:1.5fr 1fr 1fr 1fr 1.05fr;
  gap:var(--bosluk-44) var(--bosluk-28);
  padding-bottom:var(--bosluk-48);
  border-bottom:var(--cizgi-1) solid var(--dip-cizgi);
}
.dip-kolon h5,.dip-kolon h4{
  color:var(--kagit); font-size:var(--yazi-15); font-weight:var(--agirlik-kalin);
  /* Başlığın ALTINDA ayraç var — ölçüldü (render edilmiş kaynak DOM):
     `padding-bottom:18px` + `1px solid` açık nötr çizgi. CSS dosyasında
     `.foot-col h5` kuralı bunu yazmıyor; geç bir ezme getiriyor. Çizgi
     dipteki alfa ayracı (`--dip-cizgi`) DEĞİL, opak açık çizgi: yeşil
     zeminde alfa ayraç neredeyse görünmüyordu. */
  padding-bottom:var(--bosluk-18);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
  margin-bottom:var(--bosluk-18);
}
.dip-kolon a{
  display:block; font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  padding:var(--bosluk-7) 0;
}
.dip-kolon a:hover{ padding-left:var(--bosluk-4); }

.dip-yasal{
  display:flex; flex-wrap:wrap; align-items:center; justify-content:center;
  gap:var(--bosluk-8) var(--bosluk-10);
  padding:var(--bosluk-24) 0 0;
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
}
.dip-yasal a{ white-space:nowrap; }
.dip-yasal .ayrac{ width:var(--cizgi-1); height:11px; background:var(--dip-cizgi); flex:none; }

.dip-alt{
  display:flex; align-items:center; justify-content:space-between;
  padding:var(--bosluk-16) 0 var(--bosluk-26);
  font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  color:var(--dip-alt-metin);
}

@media (max-width:640px){
  .ust-bant{ display:none; }
  .kabuk-basi{ top:0; }
  .kabuk-basi>.kap{ height:var(--header-h-dar); }
  .dip-izgara{ grid-template-columns:1fr; gap:var(--bosluk-24); }
  .dip-alt{ flex-direction:column; gap:var(--bosluk-8); }
}


/* ---- PASİF ROTA ------------------------------------------------------
   `deneme/` karşılığı olmayan her bağlantı hem erişilebilirlikte hem
   GÖRÜNÜMDE pasif olur. İkisi birlikte olmazsa kullanıcı tıklar ve
   hiçbir şey olmaz — Diyet'in kendi şerhi de tam bunu yazıyor:
   "Hedefi olmayan bir bağlantı ekran okuyucuya 'bağlantı' diye
   duyurulur ve tıklanınca hiçbir şey olmaz." */
/* 🔴 SOLUKLUK AYRILDI — `aria-disabled` İKİ AYRI DURUMU işaretliyordu
   ve kural ikisini tek çizime indiriyordu (2026-09-02, slot-1 ölçtü):
     KİLİTLİ ROTA   Diyet'te henüz yok, ekranda "yakında" anlamında soluk
     HEDEFSİZ BAĞ.  çevrimdışı dosyada varış adresi olmayan gövde bağlantısı
   İkincisi KİLİTLİ DEĞİL, yalnız hedefsiz — ve kural onu da %45'e
   düşürüyordu: **13 ekranda 63 gövde bağlantısı yarı saydam çiziliyordu**
   (404'ün üç çıkış kartı ve altı çipi · bildirimlerin 13 satırı · …).
   Görsel bir YALAN: kaynakta o bağlantılar tam güçte.
   🔴 Erişilebilirlik bildirimi KALIR (`cursor` + `aria-disabled`), soluklukw
   yalnız KİLİTLİ kaleme gider. Kaynağın kendi şerhi de ikisini birlikte
   kullanmayı söylüyor (`.is-soon` + `aria-disabled`); kanon `.pasif`
   adıyla aynı ayrımı yapar. */
a[aria-disabled="true"]{ cursor:not-allowed; }
a[aria-disabled="true"].pasif{ opacity:.45; }


/* =====================================================================
   28 · DURUM HAPI — kaynak `.pstat` (+ `.od-pill` `.st-*` `.hs-pill`)
   ---------------------------------------------------------------------
   §ADAY listesindeki "durum hapı" bu turda ölçüldü ve kanona girdi
   (destek modülü · 16 kullanım tek ekranda).

   ROZETTEN (§5) AYRI BİR KALEM — ölçüm ayırdı, tercih değil:
       .rozet      dolgu 4/12 · yuvarlak-rozet · 1px kenar · aralık .02em
       .durum-hapi dolgu 4/10 · yuvarlak-sm   · kenar YOK  · aralık normal
                   + 6px nokta (`::before`)
   Nokta hapı rozetten ayıran asıl işaret: rozet bir ETİKET, hap bir
   DURUM — noktanın rengi metinden miras alınır (`currentColor`), yani
   dört durumda dört ayrı nokta rengi tek kuralla gelir.

   DÖRT DURUM DÖRT AYRI SINIF taşır; kaynağın kendi şerhi (destek-v1
   §Ö25) "iki durum aynı rozeti paylaşamaz" diyor. Anlam:
       .acik      top DESTEKTE   — talep açıldı, yanıt bekleniyor
       .bekleyen  top ÜYEDE      — destek yanıtladı, sıra üyede
       .cozulen   çözüldü
       .kapali    kapatıldı
   ===================================================================== */

.durum-hapi{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  padding:var(--bosluk-4) var(--bosluk-10);
  border-radius:var(--yuvarlak-sm);
  white-space:nowrap;
}
.durum-hapi::before{
  content:""; width:6px; height:6px; flex:none;
  border-radius:var(--yuvarlak-hap);
  background:currentColor;
}
.durum-hapi.acik    { background:var(--durum-acik-zemin);     color:var(--durum-acik-metin); }
.durum-hapi.bekleyen{ background:var(--durum-bekleyen-zemin); color:var(--durum-bekleyen-metin); }
.durum-hapi.cozulen { background:var(--aksan-yikama);         color:var(--aksan-koyu); }
.durum-hapi.kapali  { background:var(--durum-kapali-zemin);   color:var(--durum-kapali-metin); }

/* ── 28b · BEŞİNCİ DURUM · HATA — 2026-09-04 · ADMIN TURU ─────────────
   🔴 KANONDA KIRMIZI HAP YOKTU. Dört varyant destek modülünün kendi
      sözlüğünden doğmuştu (talep açık · üyede · çözüldü · kapatıldı) ve
      o dörtte BAŞARISIZLIK yok — destek talebi "başarısız olmaz",
      çözülür ya da kapanır.

   D2 ise BAŞARISIZLIĞI on bir modülde ayrı bir durum olarak sayıyor:
       §9  Ödemeler        "başarısız"
       §10 Faturalar       "iptal"·"gecikmiş"
       §19 İletişim        "başarısız"·"geri döndü"·"spam/şikayet"
       §29 Entegrasyonlar  "hatalı"
       §30 İçe/Dışa        "başarısız"
       §31 Sistem Bild.    "kritik"
       §32 Görevler        "başarısız"
       §33 Sistem Durumu   "kesinti"
       §6  Yönlendirmeler  "hatalı"·"döngü tespit edildi"
   Bunları `.kapali`ya (nötr gri) düşürmek anlamı siler: "iptal edildi"
   ile "ödeme başarısız" aynı şey değil ve ikincisi İŞLEM İSTER.

   Yeni renk UYDURULMADI — §A3 hata ailesi (`--hata*`) bugün zaten
   kanonda ve bu turda ilk gerçek tüketicisini buldu (bkz. `tokenlar.css`
   §3'ün kapanan kusuru). Hap o aileyi okur.
   ⚠ Nokta rengi `currentColor`dan geliyor, yani beşinci nokta da tek
     kuralla doğuyor — taban değişmedi. */
.durum-hapi.hata    { background:var(--hata-yikama);          color:var(--hata); }

/* ── 28c · DURUM SÖZLÜĞÜ → BEŞ GÖRSEL ROL ────────────────────────────
   D2 kırk iki modülde ~90 ayrı durum adı sayıyor. Kanon her ad için
   sınıf AÇMAZ (§0'ın sayım kuralı: aynı kutu N adla yazılmışsa tek
   bileşendir). Adlar beş ROLE düşer; eşleme burada, bir kez:

     .cozulen   OLUMLU/BİTTİ      aktif · yayında · ödenmiş · başarılı ·
                                  tamamlandı · onaylandı · bağlı · çalışıyor
     .acik      SÜRÜYOR/BİLGİ     incelemede · kuyrukta · işleniyor ·
                                  planlandı · deneme · gönderildi
     .bekleyen  DİKKAT İSTER      taslak · beklemede · gecikmiş · doğrulanmamış ·
                                  ödeme sorunu · yavaşlama · test bekliyor
     .hata      BAŞARISIZ         başarısız · hatalı · kesinti · reddedildi ·
                                  geri döndü · döngü tespit edildi · kritik
     .kapali    SONA ERDİ/NÖTR    pasif · arşivlendi · iptal edildi ·
                                  süresi doldu · askıya alınmış · engellenmiş ·
                                  devre dışı · yok sayıldı

   ⚠ AYRIM ANLAMLIDIR, RENK DEĞİL: "iptal edildi" nötr (kullanıcı
     istedi), "başarısız" kırmızı (sistem yapamadı). İkisini aynı hapa
     koymak D2'nin durum ayrımını siler.
   ⚠ RENK TEK BAŞINA TAŞIMAZ (WCAG 1.4.1): hapın METNİ durumu zaten
     söylüyor, nokta ve renk yalnız pekiştirir. */


/* =====================================================================
   33 · İPUCU KARTI — kaynak `.tips-card` / `.tips-head` / `.tips-links`
   ---------------------------------------------------------------------
   "Aradığın burada da olabilir" kartı: bir başlık, bir cümle ve YATAY bir
   yönlendirme ızgarası. Boş durumdan (§7) farkı, ekranın boş olmaması —
   kullanıcı zaten iş yapıyor, kart alternatif yolları hatırlatıyor.
   Kapanış bandından (§24) farkı, ORTALANMAMIŞ ve TEK eylem taşımıyor
   olması: bant ekranı kapatır, ipucu kartı yanına eklenir.
   ===================================================================== */

.ipucu-kap{ display:block; margin-top:var(--bosluk-22); }
.kart.ipucu{ padding:var(--bosluk-20) var(--bosluk-22); }
.ipucu-bas{
  font-size:var(--yazi-15); font-weight:var(--agirlik-kalin);
  display:flex; align-items:center; gap:var(--bosluk-10);
  margin-bottom:var(--bosluk-14);
}
.ipucu-bas i{ color:var(--aksan-koyu); font-size:var(--yazi-14); }
.ipucu-metin{
  font-size:var(--yazi-13); color:var(--metin-ikincil);
  font-weight:var(--agirlik-govde); line-height:var(--satir-genis);
  margin:0 0 var(--bosluk-14);
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}
.ipucu-baglantilar{
  display:grid; gap:var(--bosluk-10);
  grid-template-columns:repeat(3,minmax(0,1fr));
}
.ipucu-baglanti{
  display:flex; align-items:center; gap:var(--bosluk-9);
  min-height:44px;                            /* WCAG 2.5.5 */
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu);
  background:var(--aksan-yikama);
  border:var(--cizgi-1) solid var(--aksan-cizgi);
  border-radius:var(--yuvarlak-md);
  padding:var(--bosluk-12) var(--bosluk-14);
  text-decoration:none; transition:var(--sure) var(--yumusama);
}
.ipucu-baglanti:hover{
  background:var(--aksan-koyu); border-color:var(--aksan-koyu);
  color:var(--kagit);
}
.ipucu-baglanti:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--odak-ofset);
}
.ipucu-baglanti>i:first-child{ flex:none; }
/* Ok kalemi sağa yaslanır — kalemin genişliği metne göre değişse de
   oklar aynı hizada kalsın diye `margin-left:auto`. */
.ipucu-baglanti .ok{ margin-left:auto; font-size:var(--yazi-11); }

/* Üç kalem 860px kolonda ~265px'e düşüyor; daha darda alt alta.
   860 kırılımı kaynağın kendi değeri (`destek-v1.html:212`) — kolonun
   genişliğiyle aynı sayı, tesadüf değil: kalemler kolona sığmıyorsa iner. */
@media (max-width:860px){
  .ipucu-baglantilar{ grid-template-columns:minmax(0,1fr); }
}


/* =====================================================================
   DENETİM NOTU — bu dosyada ne token DEĞİL ve neden
   ---------------------------------------------------------------------
   Ham hex: 0 · rgb(): 0 · tanımsız token: 0 (ölçüldü)

   Tokenlanmamış ham px'lerin tamamı BOŞLUK DEĞİL, ve hiçbiri 4px
   ölçeğine ait değil:

     44px          dokunma hedefi (WCAG 2.5.5 / 2.5.8) — erişilebilirlik
                   sabiti, ölçekle oynatılamaz
     640 · 860 · 1024px  kırılım noktası — @media var() kabul etmez (bkz.
                   tokenlar.css §13)
     40 · 46 · 26 · 20 · 58 · 64 · 38 · 34 · 30 · 62 · 128 · 96px
                   eleman ÖLÇÜSÜ (ikon kutusu, anahtar rayı, topuz)
                   34/30  · akordeon ikon çipi (masaüstü/mobil, §21)
                   62     · kapanış bandı ikonu (§24)
                   128/96 · kimlik avatarı (masaüstü/mobil, §25)
                   38     · sayaç kutusu ikonu (§25)
     38px          form kartı başlık ikonu (§1 `.form-bas h2 i`)
     300px         gönderi şeridi notunun ölçüsü (§3 `.alan-gonder .not`)
     140px         uzun anlatım alanının taban yüksekliği (§3 `.alan-metin.uzun`)
     1px           hata özeti ikonunun optik hizalama payı (§3 `.alan-ozet i`)
     6px           durum hapının noktası (§28) — eleman ölçüsü; hapın
                   dolgusu (`--bosluk-4`/`--bosluk-10`) tokenlı
     4px           avatarın beyaz halkası (§25) — kenarlık kalınlığı,
                   boşluk değil; --cizgi-* merdiveni hairline içindir
     54 · 56 · 52 · 144px
                   kenar kalemlerinin ÖLÇÜSÜ (§26): başa-dön 54, yüzen
                   düğme 56 (mobil 52), kenar sekmesi min-yükseklik 144
     92px          yüzen düğmenin alt payı — "başa dön"ün (24px) ÜSTÜNDE
                   durması için; iki markada da aynı istif
     8px           .basa-don gizli hâlinin kayması (transform) — hareket
     -78 · -70 · -64 · -52 · -66px
                   BİNME geometrisi (§25): kart kapağa, avatar karta
                   biner. Negatif margin bir boşluk değil bir KONUMDUR;
                   4px ölçeğine sokulursa binme oranı bozulur ve avatar
                   kartın içine düşer.
                   -70 (≤1024) · -52 kart / -66 avatar (≤640) — üçü de
                   2026-09-01 mobil ölçümünde eklendi (02 §35)
     96 · 104px    kimlik avatarının dar ekran ölçüsü (§25) — 104 ≤640,
                   96 daha dar kademe yok; eleman ölçüsü
     44px          dokunma hedefi (§11 mobil · WCAG 2.5.8). Dolgu inerken
                   min-height ile korunur — kaynağın kendi çözümü
     104px         textarea taban yüksekliği (kit ölçümü)
     200 · 220 · 420 · 520px   min/max genişlik
                   420 · kapanış bandı açıklama satırı (§24)
                   520 · arama kutusu taban genişliği (§22)
     translateY(-2px)    hover kalkışı — hareket, boşluk değil
     text-underline-offset:2px · margin-top:2px
                   tipografik hizalama payı; 4px'e yuvarlanırsa ikon
                   satırdan kayar
     5 · 15 · 20px (yalnız .alan-secim'de)
                   ok işaretinin gradient geometrisi
     1px           .yalniz-okuyucu kırpma kutusu

   Yeni bir ham px eklenecekse: önce §6 merdiveninde karşılığı var mı
   diye bakılır; yoksa buraya bir satır eklenir.
   ===================================================================== */

/* =====================================================================
   36 · HESAP EKRANI KABI — kaynak `.hs-col` / `.pf-tabbar.hs-rail`
   ---------------------------------------------------------------------
   Ölçüm: slot-2, render edilmiş DOM @1440 (`hesabim-v1`).

   ÜÇ KAP TEK HİZAYA: kimlik kartı · sekme rayı · içerik sütunu üçü de
   AYNI yan payı taşır. Kaynak bunu kendi şerhinde ölçüm tablosuyla
   yazmış; kanonun `.kimlik`i zaten `--bosluk-28` kullanıyor, yani değer
   uydurulmadı — üçüncü kap ona hizalanıyor.
   Ölçülen: `.kap` 1240 − 2×32 = 1176 iç genişlik; 1176 − 2×28 = 1120 ✓
   ===================================================================== */

.hesap-kolonu{ margin:0 var(--bosluk-28); }
.sekme-ray.hesap{ margin:var(--bosluk-24) var(--bosluk-28) var(--bosluk-22); }
/* `safe center` — düz `center` sığmayınca rayın BAŞINI erişilemez yapar
   (taşan içerik sola kesilir ve kaydırılamaz). Kaynağın kendi çözümü. */
.sekme-ray.hesap .sekmeler{ justify-content:safe center; }
@media (max-width:1024px){
  .hesap-kolonu{ margin:0 var(--bosluk-16); }
  .sekme-ray.hesap{ margin:var(--bosluk-24) var(--bosluk-16) var(--bosluk-22); }
}
@media (max-width:640px){
  .hesap-kolonu{ margin:0 var(--bosluk-4); }
  .sekme-ray.hesap{ margin:var(--bosluk-24) var(--bosluk-4) var(--bosluk-22); }
}
/* 🔴 ÜST NEFESİ RAY VERİR, BANT DEĞİL (slot-2 K1). Kaynak
   `.hs-body{padding:0 0 74px}` — üst pay yok, çünkü rayın kendi
   `margin-top:24px`i onu zaten veriyor. Kanonun `.zebra>.bolum`u 32px
   daha ekliyordu: ölçülen `kimlik kartı → ray` FIT 24 ↔ kanon 56.
   §25'in "bant dolgusu iki kez binebilir" tuzağının aynısı. */
.zebra>.bolum.hesap-govde{ padding:0 0 var(--bolum-nefes); }

/* Sekme panelinin kendisi (slot-2 T1c). Odak halkası panelin TAMAMINI
   sarıyor; taban `--odak-ofset` (2px) halkayı kartın gölgesine sokuyordu,
   kaynak 6px veriyor — ölçülen değer yazıldı.
   ⚠ `scroll-margin-top` YAZILMADI ve bu bilinçli: kaynak onu sticky ray
   yüksekliğinden (`--hs-anchor-pad`) alıyor, bu ekranda ray STATIC
   (ölçüldü) ve kaynağın kendi şerhi de "tek panel görünürken gereksiz"
   diyor. Taşımak ölü kural olurdu. */
.hesap-bolme:focus{ outline:none; }
.hesap-bolme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk);
  outline-offset:var(--bosluk-6);
  border-radius:var(--yuvarlak-lg);
}


/* =====================================================================
   37 · KANAL MATRİSİ — kaynak `.ntf-matrix` / `.ntf-row`
   ---------------------------------------------------------------------
   "Hangi konu hangi kanaldan gelsin" ızgarası: konu adı + iki kanal
   sütunu. HANDOFF §ADAY listesindeki `.ntf-matrix` budur.
   Ölçüm: slot-2 (hesabim/bildirim · 7 konu × 2 kanal + başlık satırı).
   ===================================================================== */

.kanal-matris{ width:100%; }
.kanal-satir{
  display:grid; grid-template-columns:minmax(0,1fr) 92px 92px;
  gap:var(--bosluk-12); align-items:center; padding:var(--bosluk-14) 2px;
}
.kanal-satir+.kanal-satir{ border-top:var(--cizgi-1) solid var(--cizgi); }
/* Başlık satırı üst çizgi TAŞIMAZ — ilk veri satırının çizgisi zaten
   ayracı çiziyor, iki çizgi üst üste binerdi. */
.kanal-satir.bas{ padding:var(--bosluk-4) 2px var(--bosluk-12); border-top:none; }
.kanal-satir.bas span{
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-versal-2); text-transform:uppercase;   /* 🔴 .04 → .08 (B44) */
  color:var(--murekkep-yumusak); text-align:center;
}
.kanal-satir.bas span:first-child{ text-align:left; }
.kanal-metin b{
  display:block; font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  color:var(--murekkep);
}
.kanal-metin span{
  display:block; font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--metin-ikincil); margin-top:2px;
  text-align:left; text-align-last:auto;    /* B36 */
}
.kanal-hucre{ display:flex; justify-content:center; }
@media (max-width:640px){
  .kanal-satir{ grid-template-columns:minmax(0,1fr) 56px 56px; gap:var(--bosluk-8); }
}


/* =====================================================================
   38 · YÖNLENDİRME IZGARASI — kaynak `.hs-go` / `.go-ico` / `.go-txt`
   ---------------------------------------------------------------------
   "Buradan şuraya git" kartları. §35 `.durum-cikis`la AKRABA ama AYRI:
   orada `auto-fit` ile kolon sayısı kendi düşer ve kart ikonu çıplak;
   burada sabit iki kolon ve ikon ÇİPLİ. Ölçüm: slot-2 (hesabim/diger).
   ===================================================================== */

.yonlendirme{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--bosluk-12); }
.yonlendirme-kalem{
  display:flex; align-items:flex-start; gap:var(--bosluk-14);
  padding:var(--bosluk-16) var(--bosluk-18);
  border-radius:var(--yuvarlak-lg);
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  transition:var(--sure) var(--yumusama);
}
.yonlendirme-kalem:hover{
  border-color:var(--aksan); box-shadow:var(--golge-sm); transform:translateY(-2px);
}
.yonlendirme-ikon{
  flex:none; width:38px; height:38px; border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama-2); color:var(--aksan-koyu);
  display:grid; place-items:center; font-size:var(--yazi-15);
}
.yonlendirme-metin b{
  display:flex; align-items:center; gap:var(--bosluk-8);
  font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin); color:var(--murekkep);
}
.yonlendirme-metin b i{ font-size:var(--yazi-11); color:var(--aksan-koyu); }
.yonlendirme-metin span{
  display:block; font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-orta); color:var(--metin-ikincil); margin-top:3px;
  text-align:left; text-align-last:auto;    /* B36 */
}
@media (max-width:640px){ .yonlendirme{ grid-template-columns:1fr; } }


/* =====================================================================
   39 · ONAY KAPISI — kaynak `.hs-gate` / `.hs-check` / `.hs-gate-acts`
   ---------------------------------------------------------------------
   Yıkıcı işlemin önündeki kapı. İKİ SLOT BAĞIMSIZ ÖLÇTÜ ve değerler
   birebir aynı çıktı (slot-2 hesabim/veri · slot-3 odemelerim/iade) —
   tek bileşen, iki ekran. HANDOFF §ADAY listesindeki `.hs-gate` budur.

   🔴 SÖZLEŞME (JS'in elinde, kanon kapalı hâli yazar): onay kutusu
   işaretlenmeden gönder düğmesi `disabled` durur ve sebebi
   `.durum-satir.kapali` (§14) ile YAZIYLA söylenir. §21 akordeonun
   "tek açık kalem" sözleşmesiyle aynı desen.
   ===================================================================== */

.onay-kapisi{ display:flex; flex-direction:column; gap:var(--bosluk-14); margin-top:var(--bosluk-4); }
.onay-kutusu{
  display:flex; align-items:flex-start; gap:var(--bosluk-11);
  padding:var(--bosluk-14) var(--bosluk-16);
  border-radius:var(--yuvarlak-md);
  background:var(--zemin); border:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta);
  line-height:var(--satir-orta);
  text-align:left; text-align-last:auto;    /* B36 */
}
/* `accent-color` kutunun rengini KARTIN durumundan alır — uyarı kartında
   kehribar, tehlike kartında kırmızı. Tek yerde yazılır, ikisi de doğru. */
.onay-kutusu input{ width:19px; height:19px; margin-top:1px; accent-color:var(--aksan); }
.kart.uyari-kart .onay-kutusu input{ accent-color:var(--uyari); }
.kart.tehlike-kart .onay-kutusu input{ accent-color:var(--tehlike); }
.onay-eylemler{ display:flex; align-items:center; gap:var(--bosluk-14); flex-wrap:wrap; }
.onay-eylemler.ustlu{ margin-top:var(--bosluk-22); }


/* =====================================================================
   40 · MADDE LİSTESİ — kaynak `.hs-list`
   ---------------------------------------------------------------------
   İkonlu, işaretsiz madde dökümü. Ölçüm: slot-2 (hesabim/veri).
   🔴 B36 İSTİSNASI ZORUNLU ve kaynağın KENDİSİ de böyle yazmış — ölçümü
   şerhinde duruyor: 390px'te kutu 324px kalıyor, `fit-type.css`in 20rem
   container-query istisnası açılmıyor ve en geniş kelime arası 46.9px'e
   çıkıyor (normali 3.4px).
   ===================================================================== */

.madde-liste{
  display:flex; flex-direction:column; gap:var(--bosluk-9);
  margin-bottom:var(--bosluk-20); list-style:none; padding:0;
}
.madde-liste li{
  display:flex; align-items:flex-start; gap:var(--bosluk-10);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-orta); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;
}
.madde-liste li>span{ text-align:left; text-align-last:auto; }
.madde-liste li i{
  font-size:var(--yazi-11); margin-top:5px; color:var(--metin-ikincil); flex:none;
}


/* =====================================================================
   41 · ŞİFRE ALANI — kaynak `.fk-pass` / `.fk-eye`
   ---------------------------------------------------------------------
   §3 form kitinin varyantı: girdi + içine gömülü göster/gizle düğmesi.
   HANDOFF §ADAY listesindeki `.fk-pass` budur. Ölçüm: slot-2.
   Düğme 44×44 — dokunma hedefi, girdinin kendi yüksekliğinden bağımsız.
   ===================================================================== */

/* 🔴 K1 — YAZILAN ŞİFRE GÖZ DÜĞMESİNİN ALTINA GİRİYORDU. Kaynak
   `fit-shell.css:4865` `.fk-pass .fk-input{padding-right:56px}` yazıyor;
   kanonda hiç yoktu. Ölçüm: FIT `13px 56px 13px 15px` ↔ kanon `13px 15px`.
   Üç alanda birden (giris · kayit · yeni-sifre ×2) ve GÖZLE görülüyor.
   ⚠ 56px ham: dokunma hedefi + göz düğmesinin genişliği, boşluk ölçeği
   değil (§3'ün üçüncü kuralı). */
.alan-sifre{ position:relative; }
.alan-sifre .alan-girdi{ padding-right:56px; }
.alan-goz{
  position:absolute; right:var(--bosluk-4); top:50%; transform:translateY(-50%);
  width:44px; height:44px; border:0; background:transparent;
  border-radius:var(--yuvarlak-sm); display:grid; place-items:center;
  color:var(--metin-ikincil); font-size:var(--yazi-14); cursor:pointer;
}
.alan-goz i{ font-size:var(--yazi-14); }
.alan-goz:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}


/* =====================================================================
   42 · AYAR SATIRI EK PARÇALARI — `.as-acik` · `.satir-dugme` · `.kaydedildi`
   ---------------------------------------------------------------------
   Üçü de §9'un kalemleri ama ayrı adlandırıldılar çünkü §9 dışında da
   kullanılıyorlar. `.satir-dugme`yi İKİ SLOT bağımsız ölçtü (slot-2
   `hesabim/guvenlik` 7 kullanım · slot-3 `odemelerim` paket ve ödeme
   satırı eylemleri) ve değerler birebir aynı çıktı — tek ad, iki ekran.
   ===================================================================== */

/* Değiştirilemez durum etiketi — "her zaman açık". §28 `.durum-hapi`den
   AYRI: hapın zemini ve kenarlığı var, bunun yok. Düz ikon + metin. */
/* ── METİN İÇİ BAĞLANTILAR ────────────────────────────────────────────
   Kaynak bunları SATIR İÇİ stille yazmış; kanon kural yazar (`.alt-not a`
   ve `.kart-alt .not a` zaten öyle). slot-2 ölçtü: kanonda gri/normal,
   kaynakta yeşil/kalın çiziliyorlardı.
   ⚠ `.alan-yardim a` ve `.kimlik-giris a` KURAL İSTEMEZ — kaynakta da
   kalıtımla gri kalıyorlar; kural yazmak SAPMA olurdu. */
.kart-bas p a,
.as-metin a,
.durum-satir a{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }

/* Yıkıcı kartın içindeki bağlantı kartın DURUM rengini alır ve ALTI
   ÇİZİLİR — renk tek başına taşıyıcı olmasın diye (WCAG 1.4.1). Kaynak
   ikisini de satır içi yazmış; kanon kartın sınıfından türetiyor. */
.kart.uyari-kart .kart-bas p a{ color:var(--uyari); }
.kart.tehlike-kart .kart-bas p a{ color:var(--tehlike-koyu); }
.kart.uyari-kart .madde-liste a,
.kart.tehlike-kart .madde-liste a{
  font-weight:var(--agirlik-ekstra);
  text-decoration:underline; text-underline-offset:2px;
}
.kart.uyari-kart .madde-liste a{ color:var(--uyari); }
.kart.tehlike-kart .madde-liste a{ color:var(--tehlike-koyu); }

.as-acik{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  flex:none; white-space:nowrap;
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-govde); color:var(--aksan-koyu);
}
.as-acik i{ font-size:var(--yazi-12); }

/* Satır içi ikincil düğme — `.dugme` (14/26 · 14.5) ile `.dugme.kucuk`
   (12/20 · 13.5) arasında ÜÇÜNCÜ boy; ikisi de tutmuyor, ölçüldü. */
.satir-dugme{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  padding:var(--bosluk-10) var(--bosluk-16); min-height:44px;
  border-radius:var(--yuvarlak-md);
  font-family:inherit; font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  white-space:nowrap; cursor:pointer;
  transition:var(--sure) var(--yumusama);
}
.satir-dugme i{ font-size:var(--yazi-13); }   /* renk miras — kaynağın kipi */
.satir-dugme:hover{ border-color:var(--aksan); color:var(--aksan-koyu); }
.satir-dugme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}

/* Kaydedildi rozeti — kart ayağında, kaydetmeden sonra belirir.
   Kaynak `.hs-saved{display:none}` / `.hs-saved.show{…}` kipinde; kanon
   `[hidden]` ile de çalışır (dosya sonundaki tek yetkili kural). */
.kaydedildi{
  display:none; align-items:center; gap:var(--bosluk-7);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu);
}
.kaydedildi.gorunur{ display:inline-flex; }




/* =====================================================================
   58 · BELGE PENCERESİ — kaynak `.fd-*` (fatura belgesi)
   ---------------------------------------------------------------------
   ⚠ PENCERE KABUĞU KANONDA DEĞİL. `.fb-*` kiti markanın kendi kabuğundan
   geliyor (HANDOFF §12'nin "54 süs kuralı" kalemi); burada YALNIZ belgenin
   iç parçaları var. Ölçüm: slot-3, @1440.

   🔴 PENCERE ANA BÖLÜMÜN DIŞINDA BASILIR — yani `main.page-main`
   kapandıktan SONRA. `.page-main{position:relative;z-index:2}` bir YIĞIN
   BAĞLAMI açıyor; içeride kalan pencerenin `z-index`i o bağlamın 2'siyle
   sınırlanıyor ve kabuğun üst bandı (70) pencerenin ÜSTÜNDE kalıyor.
   slot-3 `elementFromPoint(12,12)` ile ölçtü — `.topbar` dönüyordu.
   Kaynak da pencereyi ana bölümden sonra basıyor.
   ⚠ BU ŞERH BİLEREK HTML ETİKETİ YAZMIYOR. Kanon `deneme/*.html`e GÖMÜLÜ
   gidiyor; şerhte geçen bir kapanış etiketi, o dosyaları işleyen her
   betiğin aramasına düşer. İlk yazımda burada gerçek bir kapanış etiketi
   vardı ve slot-3'ün üreticisi onu markup sanıp pencereyi gömülü CSS'in
   ORTASINA yazdı — üretici hata vermedi, sayfa açıldı, 189 ölçü birden
   bozuldu. Şerh metni de kod kadar dikkat ister.
   🔴 AÇMA/KAPAMA `.show` İLE, `[hidden]` İLE DEĞİL: kabuğun `.fb-modal`ı
   `display:grid` + `visibility/opacity` geçişiyle çalışıyor, `[hidden]`
   (0,0,1) onu yenemiyor. B37'nin modal hâli.
   ===================================================================== */

.belge-pencere{ width:min(760px,100%); }

/* Künye — §12 `.kunye`nin ÜÇ KOLONLU ve dar dolgulu kipi. */
.kunye.belge{ grid-template-columns:repeat(3,minmax(0,1fr)); margin-bottom:var(--bosluk-20); }
.kunye.belge dt,
.kunye.belge dd{ padding:var(--bosluk-13) var(--bosluk-15); }
.kunye.belge dd{ font-size:var(--yazi-14); font-weight:var(--agirlik-kalin); margin-top:var(--bosluk-5); word-break:break-word; }
.kunye.belge dd small{ display:block; margin-top:3px; font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde); letter-spacing:var(--aralik-genis); }

.belge-taraflar{ display:grid; grid-template-columns:1fr 1fr; gap:var(--bosluk-14); margin-bottom:var(--bosluk-20); }
.belge-taraflar section{
  padding:var(--bosluk-15) var(--bosluk-16); border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
}
.belge-taraflar h4{
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;
  margin-bottom:var(--bosluk-8);
}
.belge-taraflar b{ display:block; font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin); margin-bottom:var(--bosluk-5); }
.belge-taraflar p span{ display:block; }   /* üç bilgi üç ayrı satır */
.belge-taraflar p{
  margin:0; font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-genis); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;    /* B36 */
}

.belge-toplam{
  display:flex; flex-direction:column; gap:var(--bosluk-9);
  padding:var(--bosluk-16) var(--bosluk-18); margin-top:var(--bosluk-18);
  border-radius:var(--yuvarlak-md); border:var(--cizgi-1) solid var(--cizgi);
  background:var(--zemin); list-style:none;
}
.belge-toplam li{
  display:flex; justify-content:space-between; align-items:baseline; gap:var(--bosluk-16);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta); color:var(--metin-ikincil);
}
.belge-toplam li>span:last-child{ font-weight:var(--agirlik-kalin); color:var(--murekkep); }
.belge-toplam li.genel{
  border-top:var(--cizgi-1) solid var(--cizgi);
  padding-top:var(--bosluk-11); margin-top:2px;
  font-size:var(--yazi-15); font-weight:var(--agirlik-ekstra); color:var(--murekkep);
}
.belge-toplam li.genel>span:last-child{
  font-size:var(--yazi-19); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-baslik); font-variant-numeric:tabular-nums;
}

.belge-odeme{
  display:flex; align-items:center; gap:var(--bosluk-14); flex-wrap:wrap;
  padding:var(--bosluk-14) var(--bosluk-16); margin-top:var(--bosluk-18);
  border-radius:var(--yuvarlak-md); border:var(--cizgi-1) solid var(--cizgi);
  background:var(--kagit);
}
/* Kart markası kutusu §50 `.odeme-marka` ile BİREBİR aynı ölçü — tek
   bileşen, iki yer (slot-3 doğruladı). Ayrı kural yazılmadı. */
.belge-odeme-metin b{ font-size:var(--yazi-14); font-weight:var(--agirlik-kalin); letter-spacing:var(--aralik-vurgu); }
.belge-odeme-metin span{ display:block; margin-top:2px; font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil); }

/* Belgenin kendi tablosu — §4'ün DAR kipi (11/12 dolgu · 13px · 520px). */
.tablo.belge{ min-width:520px; }
.tablo.belge th,
.tablo.belge td{ padding:var(--bosluk-11) var(--bosluk-12); font-size:var(--yazi-13); }
.tablo.belge .sag{ text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }

.belge-ayak{
  display:flex; justify-content:flex-end; align-items:center; gap:var(--bosluk-12); flex-wrap:wrap;
  border-top:var(--cizgi-1) solid var(--cizgi);
  padding:var(--bosluk-20) 0 var(--bosluk-24); margin-top:var(--bosluk-24);
}
.belge-ayak .not{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;    /* B36 */
}


/* =====================================================================
   60 · ARAMA YÜZEYİ — kaynak `.fs-*` (hero · kutu · sekme · sonuç)
   ---------------------------------------------------------------------
   Ölçüm: slot-1, @1440 · dört durum (boş · sorgulu · öneri boş · öneri
   yazılmış). `.df-*` (50 seçici) ÖLÜ CSS'ti — hub'dan kopyalanmış artık,
   gövdede sıfır kullanım; kanona GİRMEDİ.

   🔴 `.arama-hero` §34 `.bant` DEĞİL. İkisi de koyu tam-bleed bant ama:
     .bant         yükseklik SABİT (token) · `overflow:hidden` · 3 perde
     .arama-hero   yükseklik SABİT (aynı token) · `overflow:VISIBLE` · 2 perde
   🔴 "yükseklik İÇERİK" YAZIYORDU VE YANLIŞTI (2026-09-02 · ölçüm).
   Kaynak bandın boyunu `.bant`la AYNI tokenden veriyor:
     `body[data-fit-hero-kind="liste"] .fs-top{height:var(--banner-h-liste)}`
     (`fit-shell.css:2590`) — 544 · @≤1024 607 · @≤640 587.
   Üç kırılımın üçü de `tokenlar.css`te ZATEN doğruydu; eksik olan tek şey
   kuralın `.arama-hero`ya bağlanmasıydı. İki bant arasındaki gerçek fark
   yükseklik değil KIRPMA (`hidden` ↔ `visible`) ve perde sayısı.
   ⚠ NEDEN ON TUR GÖRÜNMEDİ: `width`/`height` ölçüme alınmayanlar
   listesinde (§0b) ve durum `body`nin SINIFINDA değil `data-` özniteliğinde
   (`data-fit-hero-kind="liste"`), yani SINIF bloğu da göremiyor. Kusur
   ancak sorgulu durumda SIRA/aralık farkı olarak dolaylı göründü:
   −84 (@1440) · −244 (@390). `.giris-pano`nun R15 bulgusuyla aynı aile.
   `visible` zorunlu: öneri paneli kutunun DIŞINA taşıyor. Süslemeler
   ayrı bir kırpma katmanına (`.arama-susleme`) alınmış — kaynağın çözümü.
   ===================================================================== */

.arama-hero{
  position:relative; overflow:visible;
  /* Bandın boyu İÇERİKTEN DEĞİL tokenden gelir — `.bant`la aynı yuva
     (bkz. yukarıdaki şerh). Kırılımlar tokenin kendi kademelerinde. */
  height:var(--banner-h-liste);
  padding:calc(var(--kabuk-h) + var(--hero-ust)) 0 var(--hero-alt);
  background:
    var(--arama-perde),
    var(--bant-gorsel) var(--bant-gorsel-yeri)/cover no-repeat,
    var(--bant-zemin);
}
.arama-hero.oneri-acik{ z-index:45; }      /* panel açıkken bant üste çıkar */
.arama-susleme{
  position:absolute; inset:0; overflow:hidden; z-index:1; pointer-events:none;
}
.arama-susleme::before{
  content:""; position:absolute; inset:0; background:var(--arama-parilti);
}
.arama-susleme::after{
  content:""; position:absolute; right:-120px; bottom:-140px;
  width:420px; height:420px; border-radius:var(--yuvarlak-daire);
  background:var(--arama-parilti-2);
}
.arama-hero>.kap{
  position:relative; z-index:2;
  display:flex; flex-direction:column; align-items:stretch;
  row-gap:var(--banner-gap);
}
.arama-hero>.kap>*{ margin-top:0; margin-bottom:0; }
/* 🔴 KIRINTI AKIŞTA KALIR — §34'ün `absolute`u BURADA YOK. Bant yüksekliği
   içerikten geldiği için kırıntıyı akıştan çıkarmaya gerek yok. */
.arama-hero .kirinti{ position:static; margin-bottom:var(--bosluk-12); }
.arama-hero .ust-etiket{ color:var(--aksan-parlak); }
.arama-hero .ust-etiket::before{ background:var(--aksan-parlak); }
.arama-hero h1{
  font-size:var(--yazi-42); line-height:var(--satir-baslik);
  letter-spacing:var(--aralik-baslik-2); color:var(--kagit); margin:0;
}
.arama-hero h1 .vurgu{ color:var(--aksan-parlak); }
.arama-giris{
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-genis); max-width:600px;
  color:var(--koyu-metin); margin-bottom:var(--bosluk-26);
  text-align:left; text-align-last:auto;    /* B36 */
}
.arama-ozet{
  margin-top:var(--bosluk-18);
  font-size:var(--yazi-14-5); font-weight:var(--agirlik-govde);
  color:var(--koyu-metin-2);
  text-align:left; text-align-last:auto;    /* B36 */
}
.arama-ozet b{ color:var(--kagit); font-weight:var(--agirlik-kalin); }
.arama-ozet .sorgu{ color:var(--aksan-parlak); font-weight:var(--agirlik-kalin); }

/* ---- ARAMA KUTUSU --------------------------------------------------- */
.arama-kutu{
  position:relative; max-width:680px; padding:var(--bosluk-10);
  background:var(--kagit); border:var(--cizgi-1) solid var(--aksan-cizgi);
  border-radius:var(--yuvarlak-lg); box-shadow:var(--golge-lg);
}
.arama-satir{ display:flex; gap:var(--bosluk-8); padding:var(--bosluk-6); }
.arama-girdi-kap{
  flex:1; display:flex; align-items:center; gap:var(--bosluk-12);
  background:var(--zemin); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md); padding:0 var(--bosluk-18);
}
.arama-girdi-kap>i{ color:var(--aksan-koyu); font-size:var(--yazi-16); }
.arama-kutu input{
  flex:1; min-width:0; border:none; background:transparent; outline:none;
  font-family:inherit; font-size:var(--yazi-15-5); font-weight:var(--agirlik-govde);
  color:var(--murekkep); padding:var(--bosluk-16) 0;
}
/* 🔴 KAYNAKTA KUSUR — kaynak `#a7a7a7` yazıyor, `--zemin` üstünde 2.29:1.
   HANDOFF §5.3 o değeri ÖLÇÜMLE elemişti; kanon kendi tokenini kullanır
   (#6f6f6f · 4.77:1). slot-1 K4 olarak bildirdi, Beyar onayladı. */
.arama-kutu input::placeholder{ color:var(--yer-tutucu); font-weight:var(--agirlik-govde); }
.arama-satir .dugme{ flex:none; padding:0 var(--bosluk-26); }

/* ---- ÖNERİ KUTUSU --------------------------------------------------- */
.arama-oneri{
  position:absolute; left:-1px; right:-1px; top:calc(100% + var(--bosluk-4));
  z-index:60; padding:var(--bosluk-8);
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  box-shadow:var(--golge-sm), var(--golge-lg);
  max-height:min(440px,72vh); overflow-y:auto; overscroll-behavior:contain;
  opacity:0; visibility:hidden; transform:translateY(-8px);
  transition:opacity var(--sure-cabuk) var(--yumusama),
             transform var(--sure-cabuk) var(--yumusama),
             visibility var(--sure-cabuk) var(--yumusama);
  scrollbar-width:thin;
}
.arama-kutu.oneri-acik .arama-oneri{ opacity:1; visibility:visible; transform:translateY(0); }
.arama-oneri::-webkit-scrollbar{ width:8px; }
.arama-oneri::-webkit-scrollbar-thumb{
  background:var(--cizgi-vurgu); border-radius:var(--yuvarlak-hap);
  border:2px solid var(--kagit);
}
.oneri-grup{
  display:flex; align-items:center; gap:var(--bosluk-8);
  padding:var(--bosluk-6) var(--bosluk-12) var(--bosluk-7);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-vurgu); text-transform:uppercase;
  color:var(--murekkep-yumusak);
}
.oneri-grup:not(:first-child){
  margin-top:var(--bosluk-8); padding-top:var(--bosluk-15);
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.oneri-grup i{ font-size:var(--yazi-11); color:var(--aksan); }
.oneri-temizle{
  margin:-9px -8px -9px auto; display:inline-flex; align-items:center;
  min-height:38px; padding:0 var(--bosluk-8);
  font-family:inherit; font-size:var(--yazi-11-5); font-weight:var(--agirlik-orta);
  letter-spacing:normal; text-transform:none;
  color:var(--murekkep-yumusak); background:none; border:none;
  border-radius:var(--yuvarlak-sm); cursor:pointer;
}
.oneri-temizle:hover{ color:var(--aksan-koyu); background:var(--aksan-yikama-2); }
.oneri-temizle:focus-visible{ outline:2px solid var(--aksan-koyu); outline-offset:1px; }

.oneri-kalem{
  position:relative; display:flex; align-items:center; gap:var(--bosluk-13);
  padding:var(--bosluk-10) var(--bosluk-12);
  border-radius:var(--yuvarlak-md); color:inherit; text-decoration:none;
}
/* Sol vurgu çubuğu — seçili kalemi renkten BAĞIMSIZ olarak da işaretler. */
.oneri-kalem::before{
  content:""; position:absolute; left:0; top:6px; bottom:6px; width:3px;
  border-radius:var(--yuvarlak-hap); background:transparent;
}
.oneri-kalem:hover,
.oneri-kalem.etkin{ background:var(--aksan-yikama-2); }
.oneri-kalem:hover::before,
.oneri-kalem.etkin::before{ background:var(--aksan-koyu); }
.oneri-kalem:hover .oneri-baslik,
.oneri-kalem.etkin .oneri-baslik{ color:var(--aksan-koyu); }
.oneri-ikon{
  flex:none; width:38px; height:38px; border-radius:var(--yuvarlak-sm);
  background:var(--zemin); border:var(--cizgi-1) solid var(--cizgi);
  display:grid; place-items:center; color:var(--murekkep-yumusak);
  font-size:var(--yazi-15); background-size:cover; overflow:hidden;
}
.oneri-govde{ min-width:0; flex:1; }
.oneri-baslik{
  display:block; font-size:var(--yazi-15); font-weight:var(--agirlik-orta);
  line-height:var(--satir-sik-2); color:var(--murekkep);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.oneri-baslik mark{ background:none; color:var(--aksan); font-weight:var(--agirlik-kalin); padding:0; }
.oneri-alt{
  display:block; margin-top:1px;
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.oneri-rozet{
  flex:none; display:inline-flex; align-items:center; gap:var(--bosluk-5);
  padding:var(--bosluk-4) var(--bosluk-9); border-radius:var(--yuvarlak-hap);
  font-size:var(--yazi-11); font-weight:var(--agirlik-kalin);
  background:var(--aksan-yikama-2); color:var(--aksan-koyu);
  border:var(--cizgi-1) solid var(--aksan-cizgi);
}
.oneri-rozet i{ font-size:9.5px; }
/* Sorgu satırı — "<q> için ara". İkonu dolu aksan, çünkü bu bir EYLEM,
   bir sonuç değil. */
.oneri-kalem.sorgu .oneri-ikon{ background:var(--aksan); border-color:var(--aksan); color:var(--kagit); }
.oneri-bos{
  padding:var(--bosluk-18) var(--bosluk-14); text-align:center;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  text-align-last:auto;    /* B36 */
}

/* ---- YAPIŞKAN SEKME RAYI -------------------------------------------
   §11'in üçüncü kipi: yapışkan + cam zemin. Taban ray aynı; farkı
   konum ve zemin (slot-1 D). */
.sekme-ray.yapiskan{
  position:sticky; top:var(--kabuk-h); z-index:var(--kat-yapiskan-2);
  padding:var(--bosluk-12) 0; margin:0;
  background:var(--cam-zemin);
  backdrop-filter:blur(10px) saturate(150%);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
/* Taban `.sekmeler` `margin-inline:auto` ile ortalanır; yapışkan ray
   kendi kabında zaten tam genişlikte, ortalama onu kaydırıyor. */
.sekme-ray.yapiskan .sekmeler{ margin:0; }

/* ---- SONUÇ IZGARASI ------------------------------------------------- */
.sonuc-bant{ padding:var(--bosluk-34) 0 var(--bosluk-60); background:var(--kagit); }
.sonuc-not{
  margin:0 0 var(--bosluk-20);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}
.sonuc-not b{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }
.sonuc-izgara{ display:grid; grid-template-columns:repeat(4,1fr); gap:var(--bosluk-24); }
.sonuc-izgara.kisi{ grid-template-columns:repeat(5,1fr); gap:var(--bosluk-18); }
.sonuc-kart{
  position:relative; display:flex; flex-direction:column;
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg); overflow:hidden;
}
.sonuc-kart:hover{ box-shadow:var(--golge-md); }
.sonuc-gorsel{
  position:relative; height:158px; background-size:cover; background-position:center;
}
.sonuc-gorsel::after{ content:""; position:absolute; inset:0; background:var(--kart-perde); }
/* Görselsiz sonuç yüzeyi — ikon, fotoğraf değil. */
.sonuc-yuzey{
  position:relative; height:120px; display:grid; place-items:center;
  background:var(--aksan-yikama-2); color:var(--aksan); font-size:var(--yazi-34);
}
.sonuc-rozet{
  position:absolute; top:11px; left:11px; z-index:2;
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  padding:var(--bosluk-5) var(--bosluk-11); border-radius:var(--yuvarlak-hap);
  font-size:var(--yazi-11); font-weight:var(--agirlik-kalin);
  background:var(--cam-zemin-2); color:var(--aksan-koyu);
}
.sonuc-rozet i{ font-size:var(--yazi-10); }
.sonuc-yuzey .sonuc-rozet{ background:var(--kagit); box-shadow:var(--golge-sm); }
.sonuc-govde{ display:flex; flex-direction:column; flex:1; padding:var(--bosluk-15) var(--bosluk-16) var(--bosluk-17); }
.sonuc-govde h4{
  font-size:var(--yazi-16); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-sik); line-height:var(--satir-baslik-2);
  margin-bottom:var(--bosluk-6);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.sonuc-kart:hover .sonuc-govde h4{ color:var(--aksan-koyu); }
.sonuc-govde p{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-sik); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden;
}
.sonuc-git{
  margin-top:auto; padding-top:var(--bosluk-13);
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin); color:var(--aksan-koyu);
}
.sonuc-git i{ font-size:var(--yazi-10); }
.sonuc-kart:hover .sonuc-git{ transform:translateX(3px); }

/* Kişi kartı — ortalı, avatar üstte. */
.sonuc-kart.kisi{ align-items:center; text-align:center; padding:var(--bosluk-20) var(--bosluk-14) var(--bosluk-18); }
.sonuc-avatar{
  width:92px; height:92px; border-radius:var(--yuvarlak-daire);
  background-size:cover; background-position:center;
  border:var(--cizgi-3) solid var(--kagit); box-shadow:var(--golge-sm);
}
.sonuc-kart.kisi:hover .sonuc-avatar{ border-color:var(--aksan); transform:translateY(-3px); }
.sonuc-kart.kisi .sonuc-govde{ padding:0; align-items:center; flex:none; }
.sonuc-kart.kisi .sonuc-govde h4{ margin-top:var(--bosluk-13); font-size:var(--yazi-15-5); }
.sonuc-kart.kisi .sonuc-govde p{ -webkit-line-clamp:1; }
.sonuc-kart.kisi .sonuc-rozet{
  position:static; margin-top:var(--bosluk-9);
  background:var(--aksan-yikama-2); color:var(--aksan-koyu);
}

/* ---- POPÜLER / SON ARAMALAR ----------------------------------------- */
.arama-pop{ padding:var(--bolum-nefes) 0; background:var(--kagit); }
.arama-pop-izgara{ display:grid; grid-template-columns:1.25fr 1fr; gap:var(--bosluk-48); align-items:start; }
.arama-pop h3{
  display:inline-flex; align-items:center; gap:var(--bosluk-10);
  font-size:var(--yazi-18); font-weight:var(--agirlik-kalin); margin-bottom:var(--bosluk-18);
}
.arama-pop h3 i{ font-size:var(--yazi-15); color:var(--aksan); }
.son-arama{ display:flex; flex-direction:column; }
.son-arama-satir{
  display:flex; align-items:center; gap:var(--bosluk-12);
  padding:var(--bosluk-12) var(--bosluk-4);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-14); font-weight:var(--agirlik-govde); color:var(--murekkep-yumusak);
}
.son-arama-satir:last-child{ border-bottom:none; }
.son-arama-satir>i:first-child{ color:var(--metin-ikincil); font-size:var(--yazi-13); flex:none; width:18px; text-align:center; }
.son-arama-satir .terim{ min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.son-arama-satir .ok{ margin-left:auto; flex:none; font-size:var(--yazi-11); color:var(--metin-ucuncul); }
.son-arama-satir:hover{ color:var(--aksan-koyu); }
.son-arama-satir:hover .ok{ color:var(--aksan); transform:translateX(3px); }

/* ---- TIBBİ BİLGİLENDİRME ŞERİDİ (Beyar kararı C2 — korunur) ---------- */
.uyari-serit{ background:var(--aksan-yikama-2); border-top:var(--cizgi-1) solid var(--aksan-cizgi-3); }
.uyari-serit>.kap{
  display:flex; align-items:flex-start; gap:var(--bosluk-14);
  padding:var(--bosluk-22) var(--kap-yan);
}
.uyari-serit i{ font-size:var(--yazi-17); color:var(--aksan-koyu); margin-top:2px; flex:none; }
/* 🔴 KAYNAKTA YASLI (`justify`) — kabuğun `p` kuralının sızıntısı ve
   B36'nın tam örneği. Kanon SOLA çeker: bu bir yasal uyarı metni ve
   yaslama okuma akışını bozuyor (§21/§24 ile aynı istisna). */
.uyari-serit p{
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-genis-2); max-width:960px;
  text-align:left; text-align-last:auto;
}

@media (max-width:1024px){
  /* Kaynak `1fr 1fr` yazıyor; `repeat(2,1fr)` ile ÇİZİM aynı ama
     hesaplanmış değer farklı seri-leşiyor. Kaynağın yazımı alındı —
     eşdeğer gerekçesi yazmaktansa birebir yazmak ucuz. */
  .sonuc-izgara{ grid-template-columns:1fr 1fr; }
  .sonuc-izgara.kisi{ grid-template-columns:repeat(3,1fr); }
  .arama-pop-izgara{ grid-template-columns:1fr; gap:var(--bosluk-34); }
}
/* §60'ın DAR EKRAN dalı. Beşi de kaynağın render edilmiş DOM'undan
   @390 ölçüldü (slot-1); hiçbiri 4px merdiveninden türetilmedi. */
@media (max-width:900px){
  /* 🔴 §34'e yazılmıştı, `.arama-hero h1`e yazılmamıştı: bant başlığı
     dar ekranda dar aralığa (-.02em) düşüyor, arama başlığı -.03em'de
     kalıyordu. Ölçüldü @390: FIT -0.5px ↔ kanon -0.75px. */
  .arama-hero h1{ letter-spacing:var(--aralik-baslik); }
}
@media (max-width:640px){
  /* 🔴 ALT DOLGU `--hero-alt` DEĞİL. Kaynak bu bantta KENDİ alt dolgusunu
     yazıyor (24px) ve token kademesini (34px) kullanmıyor; üst dolgu
     birebir tutuyor. Ölçüldü: FIT `96px 0 24px` ↔ kanon `96px 0 34px`. */
  .arama-hero{ padding:calc(var(--kabuk-h-dar) + var(--hero-ust)) 0 var(--bosluk-24); }
  .arama-hero h1{ font-size:var(--yazi-25); }
  /* 🔴 KAYNAĞIN ÖLÇÜLMÜŞ DÜZELTMESİ: esnek kalemin `min-width:auto`su
     içeriğinden küçülmeyi engelliyor ve satır 360px'te kutuyu taşırıyordu.
     Kaynak bunu kendi şerhinde yazıyor; kanon aynı düzeltmeyi alır. */
  .arama-girdi-kap{ min-width:0; }
  /* 🔴 ARAMA RAYININ SEKMESİ KÜÇÜLMEZ. §11'in mobil dalı sekmeyi
     12.5/9-13'e çekiyor; kaynağın yapışkan arama rayı 13/9-16'da KALIYOR.
     İki ray iki ayrı ölçü — kural rayın KENDİ kabına yazılır. */
  .sekme-ray.yapiskan .sekme{ font-size:var(--yazi-13); padding:var(--bosluk-9) var(--bosluk-16); }
  /* 🔴 IZGARA DEĞİL, YATAY KAYDIRICI. Kaynak ≤640'ta sonuç ızgarasını
     `display:flex` + `overflow:auto` yapıyor ve kartları 280px'te
     sabitliyor — dar ekranda dikey liste yerine yandan kayan şerit.
     Ölçüldü (sorgulu durum, üç kart kipinde de aynı).
     ⚠ `grid-template-columns` BİLEREK yazılmıyor: kap artık esnek kutu,
     bildirim ölü kalıyor ve kaynak da onu ≤1024'ten devralıyor
     (2 kolon · kişi 3 kolon). Ölçüm ikisini de o hâliyle görüyor.
     ⚠ Alt dolgu 6px kaydırma çubuğunun payı — kaynağın kendi ölçüsü. */
  .sonuc-izgara,.sonuc-izgara.kisi{
    display:flex; gap:var(--bosluk-14);
    padding:0 0 var(--bosluk-6); overflow:auto;
  }
  /* Kart daralmaz ve 280px'i geçmez — şerit ancak böyle kayar.
     Eleman ölçüsü, boşluk değil (§3'ün üçüncü kuralı). */
  .sonuc-kart{ max-width:280px; flex-shrink:0; }
  /* Kişi kartı DAHA DAR: 200px. Aynı şeritte üç kart yerine daha çok
     kişi görünsün diye — kaynağın kendi ölçüsü (ölçüldü). */
  .sonuc-izgara.kisi .sonuc-kart{ max-width:200px; }
  .sekme-ray.yapiskan{ top:var(--kabuk-h-dar); }
}


/* =====================================================================
   26b · "İÇERİĞE ATLA" BAĞLANTISI — kaynak `.skip-link`
   ---------------------------------------------------------------------
   Klavyeyle gezen kullanıcının kabuğu atlayıp gövdeye inmesini sağlayan
   İLK sekme durağı. 16 ekranın 16'sında eksikti ve hiçbir kapı görmedi:
   kabuk kapsam dışıydı (§0-D10).
   🔴 GİZLEME BİÇİMİ KALEMİN İŞLEVİDİR. `display:none` YAZILMAZ — o zaman
   klavye odağı hiç almaz ve bağlantı işlevini kaybeder. Kaynak onu
   EKRAN DIŞINA İTİYOR (`left:-9999px`): ekran okuyucudan gizlenmez,
   sekme sırasında durağı korur, `:focus`ta içeri gelir.
   Ölçüm (slot-2, render'dan): kutu 109.4×45.7 · dolgu 12/18 · z 200.
   ===================================================================== */
.atlama-baglantisi{
  position:absolute; left:-9999px; top:0; z-index:var(--kat-atla);
  padding:var(--bosluk-12) var(--bosluk-18);
  background:var(--aksan); color:var(--kagit);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  text-decoration:none;
}
.atlama-baglantisi:focus{ left:0; }


/* =====================================================================
   60b · SAYFA KÖKÜ — YATAY TAŞMA VE `position:sticky`
   ---------------------------------------------------------------------
   🔴 KANON KAYNAĞIN *DEĞİŞTİRDİĞİ* HÂLİ KOPYALAMIŞ. Donör kabuğu
   `html,body{overflow-x:hidden}` basıyor; kaynak bunu 2026'da BİLEREK
   terk etmiş ve yerine `clip` koymuş — üstüne 20 satırlık gerekçe
   yazmış (`fit-shell.css:835-860`). Şerhin kendi cümlesi:

     "overflow-x:hidden kökü YATAY KAYDIRMA KONTEYNERİNE çevirir…
      Ayrıca overflow:hidden, içindeki position:sticky öğelerin
      yapışmasını bozar."

   Ölçülen sonuç (Beyar gözle bildirdi, kaydırma sınamasıyla doğrulandı):
     FIT    html/body overflow-x:clip   → y `visible` kalır
            .au-visual  369px YAPIŞIYOR
     kanon  html/body overflow-x:hidden → y `auto`ya döner, kök bir
            kaydırma konteyneri olur
            .giris-pano  HİÇ YAPIŞMIYOR   (§61'in R15 kuralı işlevsiz)

   🔴 Yani §61'e clamp yüksekliğini ve sticky'yi yazmak YETMEDİ: kural
   doğruydu, KÖK onu öldürüyordu. "Bir kural yazılmış olması uygulandığı
   anlamına gelmez"in üçüncü yüzü — burada kuralı ezen şey başka bir
   kural değil, KAPSAYICININ kaydırma bağlamı.

   `clip` kırpar ama kaydırma konteyneri YARATMAZ; dikey kaydırma normal
   kalır ve sticky çalışır. `scrollbar-gutter:stable` da kaynağın aynı
   şerhinden: modal açılıp gövde kilitlenince çubuk kaybolsa bile
   `clientWidth` değişmez, `.kap` yeniden ortalanmaz, sıçrama olmaz.
   ⚠ Kanon donör kabuğundan SONRA yüklendiği için bu kural onu ezer.
   ⚠ `@supports` yedeği kaynağın kendi yedeği: `clip` desteklemeyen eski
   tarayıcıda eski davranışa düşülür.
   ===================================================================== */
html{ overflow-x:clip; scrollbar-gutter:stable; }
body{ overflow-x:clip; }
@supports not (overflow-x:clip){ html,body{ overflow-x:hidden; } }


/* =====================================================================
   61 · KİMLİK AKIŞI — kaynak `.au-*` (giriş · kayıt · şifre · doğrulama)
   ---------------------------------------------------------------------
   Ölçüm: slot-1, @1440. BEŞ pano tek kartta: `giris · kayit · sifre ·
   yeni-sifre · dogrula`; ilk ikisi sekmeli, kalan üçü raysız.

   🔴 §34 `.bant` DEĞİL ve §60 `.arama-hero` DEĞİL — üçüncü hero kipi:
     .bant         yükseklik SABİT · overflow hidden · tek kolon dikey ortalı
     .arama-hero   yükseklik İÇERİK · overflow visible · tek kolon
     .giris-hero   yükseklik İÇERİK · İKİ KOLON (628 + 520) · h1 BANTTA DEĞİL
   Başlık kartın İÇİNDE yaşıyor; bant yalnız görsel kolonu ve kartı taşır.

   ⚠ Ad `.kimlik-*` DEĞİL: §25 `.kimlik` profil kartı, çakışırdı (slot-1
   sordu). `.giris-*` seçildi.
   ===================================================================== */

.giris-hero{
  position:relative;
  padding:calc(var(--kabuk-h) + var(--hero-ust)) 0 var(--bosluk-74);
  background:
    var(--giris-parilti),
    var(--giris-perde),
    var(--bant-gorsel) var(--bant-gorsel-yeri)/cover no-repeat,
    var(--bant-zemin);
}
/* Kırıntı AKIŞTA — bant yüksekliği içerikten geliyor (§60 ile aynı kip). */
/* 🔴 BU EKRANIN KIRINTISI §17 `.kirinti` DEĞİL — kaynağı `.rd-crumb`,
   ölçüsü ayrı: 13px/500 · lh 1.55 · alt pay YOK, yerine 18/14 dolgu.
   Ve `<b>` (şimdiki sayfa) 340px'te kırpılıyor; §17'nin 900 ağırlığı ve
   sınırsız genişliği burada başlığı taşırıyor (slot-1 ölçtü). */
.giris-hero .kirinti{
  position:static; margin-bottom:0;
  padding:var(--bosluk-18) 0 var(--bosluk-14);
  font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde);
}
.giris-hero .kirinti b,
.giris-hero .kirinti .kirinti-simdi{
  font-weight:var(--agirlik-kalin); max-width:340px;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
/* Kart görselin ÜSTÜNDE durmalı — hero'nun kendi süsleme katmanı (z 1)
   ve pano (z yok) arasında kalmasın diye ikisi de konumlu ve katmanlı. */
.giris-hero>.kap{ position:relative; z-index:5; }
.giris-kart{ position:relative; z-index:6; }
/* 🔴 SOL KOLON ESNEK, SAĞ KOLON SABİT. Kaynak `minmax(0,1fr) 520px` yazıyor;
   @1440 sonuç 628px olduğu için ölçüm iki yazımı ayırt edemiyor, ama sabit
   628 yazmak 1024-1180 arasında kabı taşırır (628+28+520 = 1176 sabit). */
.giris-duzen{
  display:grid; grid-template-columns:minmax(0,1fr) 520px; gap:var(--bosluk-28);
  margin-top:var(--bosluk-6);
  /* Kolonlar EŞİT BOY — kart görselle aynı yüksekliği alsın diye. */
  align-items:stretch;
}

/* ---- SOL KOLON: GÖRSEL PANO ---------------------------------------- */
/* 🔴 PANONUN YÜKSEKLİĞİ KARTA BAĞLI DEĞİL — kaynağın R15 kararı, şerhiyle
   birlikte ölçüldü (giris-v1.html:108-114). Ölçüt görüntü alanı: kabuk
   yüksekliği + 120px nefes çıkarılır; taban 624 (eski min-height), tavan
   1036 (giriş sekmesinin ölçülen boyu). Değer sekmeye değil yalnız pencereye
   bağlı, iki sekmede de aynı; uzun kayıt formu kaydırılırken görsel yerinde
   durur. `align-items:stretch` ızgarada KALIR (kart hâlâ satırı belirler),
   ama pano kendi boyunu yazdığı için esnemez — sticky ancak böyle çalışır. */
.giris-pano{
  display:flex; flex-direction:column; justify-content:flex-end;
  height:clamp(624px, calc(100vh - var(--kabuk-h) - 120px), 1036px);
  position:sticky; top:calc(var(--kabuk-h) + var(--bosluk-24));
  padding:var(--bosluk-38) var(--bosluk-40);
  border-radius:var(--yuvarlak-xl); overflow:hidden; box-shadow:var(--golge-md);
  background:var(--giris-pano-perde), var(--bant-gorsel) center/cover no-repeat, var(--bant-zemin);
}
/* 🔴 §18 `.ust-etiket`in ÜÇÜNCÜ rengi — `--aksan-parlak` DEĞİL, daha açık
   bir adım (slot-1 ölçtü). Koyu görsel üstünde okunurluk için. */
.giris-pano .ust-etiket{ color:var(--koyu-aksan-2); }
.giris-pano .ust-etiket::before{ background:var(--koyu-aksan-2); }
.giris-pano h2{
  font-size:var(--yazi-36); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik); letter-spacing:var(--aralik-baslik-2);
  max-width:420px; margin:var(--bosluk-14) 0 var(--bosluk-10); color:var(--kagit);
}
.giris-pano h2 .vurgu{ color:var(--koyu-aksan); }
.giris-pano .giris-metni{
  font-size:var(--yazi-15); font-weight:var(--agirlik-govde);
  line-height:var(--satir-genis); max-width:420px; color:var(--koyu-metin-3);
  text-align:left; text-align-last:auto;    /* B36 */
}
.giris-avantaj{ display:flex; flex-direction:column; gap:var(--bosluk-11); margin-top:var(--bosluk-22); }
.giris-avantaj span{
  display:inline-flex; align-items:center; gap:var(--bosluk-11);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta); color:var(--koyu-metin-4);
}
.giris-avantaj i{
  flex:none; width:26px; height:26px; border-radius:var(--yuvarlak-daire);
  display:grid; place-items:center; font-size:var(--yazi-11);
  background:var(--koyu-aksan-zemin); color:var(--kagit);
}
.giris-sayilar{
  display:flex; gap:var(--bosluk-34);
  padding-top:var(--bosluk-22); margin-top:var(--bosluk-26);
  border-top:var(--cizgi-1) solid var(--dip-cizgi);
}
.giris-sayilar b{
  display:block; font-size:var(--yazi-25); font-weight:var(--agirlik-kalin);
  line-height:1.1; letter-spacing:var(--aralik-baslik); color:var(--kagit);
}
.giris-sayilar span{
  display:inline; font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  color:var(--koyu-metin-2);
}

/* ---- SAĞ KOLON: KART ------------------------------------------------ */
.giris-kart{
  display:flex; flex-direction:column;
  padding:var(--bosluk-34) var(--bosluk-38) var(--bosluk-36);
  border-radius:var(--yuvarlak-xl);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  box-shadow:var(--golge-sm);
}
/* Sekme rayı kartın içinde ORTALI ve kalemler eşit bölünür. */
.giris-kart .sekmeler{ margin:0 auto var(--bosluk-24); }
.giris-kart .sekmeler .sekme{ flex:1; justify-content:center; }
.giris-bas{ margin-bottom:var(--bosluk-20); }
.giris-bas h1{
  font-size:var(--yazi-25); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik); letter-spacing:var(--aralik-baslik);
}
.giris-bas p{
  margin-top:var(--bosluk-5);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}

/* Sosyal giriş — iki kolonlu ızgara. */
.sosyal-kolon{ display:grid; grid-template-columns:1fr 1fr; gap:var(--bosluk-10); }
.sosyal-dugme{
  display:flex; align-items:center; justify-content:center; gap:var(--bosluk-11);
  /* 46px kaynakta DOLGUDAN gelir, `min-height` bildirilmez — kanon da
     yazmaz ki punto değişince kutu kilitli kalmasın (slot-1 ölçtü). */
  padding:var(--bosluk-13) var(--bosluk-16);
  line-height:normal; text-align:center;
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  font-family:inherit; font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); cursor:pointer;
}
.sosyal-ikon{ width:18px; height:18px; flex:none; overflow:hidden; }

/* Ayraç — "ya da". */
.giris-ayrac{
  display:flex; align-items:center; gap:var(--bosluk-14);
  margin:var(--bosluk-20) 0;
  font-size:var(--yazi-12); font-weight:var(--agirlik-orta);
  letter-spacing:var(--aralik-etiket-2); color:var(--metin-ikincil);
}
.giris-ayrac::before,.giris-ayrac::after{
  content:""; flex:1; height:1px; background:var(--cizgi);
}

/* Segment — "nasıl giriş yapmak istersin" (§29 md.18: Diyet'te telefonla
   giriş YOK ama kanon FIT'in yapısını taşır; yetenek ürün işi). */
.giris-segment{
  display:flex; gap:var(--bosluk-4);
  padding:var(--bosluk-4); margin-bottom:var(--bosluk-18);
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
}
.giris-segment button{
  flex:1; display:inline-flex; align-items:center; justify-content:center;
  gap:var(--bosluk-7); min-height:44px;
  padding:var(--bosluk-9) var(--bosluk-14); border:none;
  border-radius:var(--yuvarlak-sm); background:transparent;
  font-family:inherit; font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil); cursor:pointer;
}
/* ROL KİPİ — "ne olarak katılıyorsun / hangi hesaba giriyorsun" ikilisi.
   Taban segmentten üç yerde ayrılır: sarar, alt payı 22, ve kalemleri dar
   ekranda yarım-yarım tabana oturur (560'tan sonra eşit bölünmeye döner). */
.giris-segment.rol{ flex-wrap:wrap; margin-bottom:var(--bosluk-22); }
.giris-segment.rol button{
  flex:1 1 calc(50% - var(--bosluk-4));
  min-width:0;                      /* uzun etiket kabı taşırmasın */
}
@media (min-width:560px){ .giris-segment.rol button{ flex:1 1 0; } }
.giris-segment button i{ font-size:var(--yazi-12); }
.giris-segment button.aktif{ background:var(--aksan-koyu); color:var(--kagit); }
.giris-segment-giris{
  display:flex; align-items:center; gap:var(--bosluk-8);
  margin-bottom:var(--bosluk-16);
  font-size:var(--yazi-12); font-weight:var(--agirlik-orta); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* 🔴 B36 — bir <p>, yaslanıyordu */
}
.giris-segment-giris i{ font-size:var(--yazi-12); color:var(--aksan); }

.giris-satir{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--bosluk-14); margin:var(--bosluk-16) 0 var(--bosluk-20);
}
/* Satır içi onay KUTUSUZ — §39'un kutulu kipi buraya girmez (yukarıdaki
   şerh). Kanon kaynağın yaptığını yapar: kutuyu satır kapsamında söker. */
.giris-satir .onay-kutusu{
  align-items:center; min-height:44px;
  padding:0; border:none; border-radius:0; background:none;
  gap:var(--bosluk-9);
  font-size:var(--yazi-13); line-height:var(--satir-orta);
}
.giris-satir .onay-kutusu input{ margin-top:0; }
.giris-unuttum{
  display:inline-flex; align-items:center; min-height:44px;
  /* Bir button; tarayıcı zemini ve çerçevesi BİLDİRİLEREK silinir. */
  padding:0; background:none; border:none; cursor:pointer;
  font-family:inherit;
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin); color:var(--aksan);
}
/* 🔴 §2 `.dugme`den AYRI ÖLÇÜ: taban 14/26 · 14.5px, bu 15/26 · 15px.
   Kartın tek birincil eylemi, tam genişlikte. */
.giris-gonder{
  display:inline-flex; align-items:center; justify-content:center; gap:var(--bosluk-10);
  /* 48px DOLGUDAN gelir — kaynak `min-height` bildirmiyor (slot-1). */
  width:100%; padding:var(--bosluk-15) var(--bosluk-26);
  border:none; border-radius:var(--yuvarlak-md);
  font-family:inherit; font-size:var(--yazi-15); font-weight:var(--agirlik-kalin);
  background:var(--aksan-koyu); color:var(--kagit); cursor:pointer;
}
.giris-not{
  margin-top:var(--bosluk-16); padding:var(--bosluk-12) var(--bosluk-14);
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}
.giris-alt{
  padding-top:var(--bosluk-18); margin-top:var(--bosluk-20);
  border-top:var(--cizgi-1) solid var(--cizgi);
  text-align:center;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
}
.giris-alt button{
  display:inline-flex; align-items:center; min-height:44px;
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  color:var(--aksan); background:none; border:none; cursor:pointer;
}
/* 🔴 HATA RENGİ KART KAPSAMINDA YEREL. Kaynağın kendi şerhi gerekçeli:
   kabuğun aksanı YEŞİL ve hata mesajı yeşil çıkmasın diye kart kendi
   tehlike rengini tanımlıyor. Kanon aynı yolu izler ama uydurmaz —
   `--tehlike` ailesine bağlar. */
/* Kimlik formunun hata satırı — kaynağın `.fk-error`ı (`.fk-err` DEĞİL,
   bkz. §3'ün K3 şerhi). Ölçüldü: center · 700 · gizli doğar. */
.giris-hata{
  display:none; align-items:center; gap:var(--bosluk-7);
  margin-top:var(--bosluk-8);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin); color:var(--tehlike);
}
/* 🔴 B36 — `.giris-hata` bir `<p>` ve `text-align` bildirmiyor; kabuğun
   `p{text-align:justify}` kuralı sızıyor. Hata satırı iki satıra düştüğünde
   yaslanacaktı. B36 listesine yeni kalem (slot-1 çift ekleyince doğdu). */
.giris-hata{ text-align:left; text-align-last:auto; }
.giris-hata i{ font-size:var(--yazi-12); }
/* Form düzeyi hata alan hatasından DAHA DAR pay taşır (4 ↔ 8) —
   kaynağın `.au-form-error{margin:4px 0 0}` değiştiricisi. */
.giris-hata.form{ margin-top:var(--bosluk-4); }
.giris-hata.acik{ display:flex; }

/* =====================================================================
   61b · KİMLİK AKIŞININ EKSİK KALEMLERİ (slot-1, 2026-09-02)
   ---------------------------------------------------------------------
   Beş pano kaynağın DOM'undan yeniden kurulunca (EKSİ BİRİNCİ MADDE)
   markup'ta doğan ama kanonda kuralı OLMAYAN on kalem çıktı. Hepsi
   render edilmiş DOM'dan ölçüldü; hiçbiri türetilmedi.
   🔴 Bu kalemlerin hiçbiri daha önce görünmüyordu çünkü MARKUP'TA YOKTU —
   "olmayan elemanın çifti de yoktur". Yöntem değişikliğinin doğrudan
   getirisi: on bileşen bir turda ortaya çıktı.
   ===================================================================== */

/* T3 · Rol segmentinin İKİNCİ kalemi bir BAĞLANTI, seçim değil — antrenör/
   diyetisyen başvurusuna gider. §61 yalnız `button` yazıyordu, bağlantı
   raydan taşıyordu (Beyar ekran görüntüsünde gördü). */
.giris-segment .segment-baglanti{
  /* `flex:1`in `0%` tabanı uzun etiketi kabı taşırıyordu; kaynak
     `0` + `min-width:0` yazıyor. */
  flex:1 1 0; min-width:0;
  display:flex; align-items:center; justify-content:center;
  gap:var(--bosluk-7); min-height:44px;
  padding:var(--bosluk-9) var(--bosluk-14);
  border-radius:var(--yuvarlak-sm);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil); text-decoration:none;
}
.segment-ok{ font-size:var(--yazi-12); font-weight:var(--agirlik-siyah); line-height:1; opacity:.75; }

/* T4 · Kayıt onayları DÜZ SATIR — §39'un kutulu `.onay-kutusu`su BAŞKA bir
   bileşen. Kanonun kendi deseni: kutuyu KAPSAMDA sök (`.giris-satir`da
   slot-3'ün yaptığının aynısı), yeni bileşen üretme. */
.onay-satirlari{
  display:flex; flex-direction:column; gap:var(--bosluk-13);
  margin:var(--bosluk-18) 0 var(--bosluk-20);
}
.onay-satirlari .onay-kutusu{
  padding:var(--bosluk-4) 0; border:0; background:none; border-radius:0;
  gap:var(--bosluk-9); min-height:44px;
  font-size:var(--yazi-12-5); line-height:var(--satir-orta);
  /* §39'un 600'ü miras kalıyordu; kaynak 500. */
  font-weight:var(--agirlik-govde);
}
/* Onay kutusu ESNEMEZ — kaynakta sabit; esneyince küçülüyordu. */
.onay-satirlari .onay-kutusu input{ flex:none; }
/* 🔴 Zorunluluk yıldızı — çifti YOKTU, eklenince iki fark birden doğdu.
   `.ol-consents-min`in tek karşılıksız etkisi de buydu (slot-1 ölçtü:
   değiştirici KABA değil ÇOCUKLARA yazıyor, dört kuralı var; ikisi
   marka yuvasıyla zaten karşılanıyor, üçüncüsü bu 3px). */
.onay-satirlari .zorunlu{ margin-left:3px; font-weight:var(--agirlik-kalin); }
/* Yasal bağlantıların altı ÇİZİLİ — kaynakta çizili, kanonda değildi. */
.onay-satirlari a{
  /* Dokunma payı — kaynakta 5px; dikey hedefi büyütür, satırı bozmaz. */
  padding:var(--bosluk-5) 0;
  font-weight:var(--agirlik-kalin); color:var(--aksan-koyu);
  text-decoration:underline; text-underline-offset:2px;
}

/* T5 · reCAPTCHA / güvenlik notu. §15 `.alt-not`un AKRABASI ama beş yerde
   ayrışıyor (dolgu 16↔14 · pay 18↔16 · boşluk 9↔8 · 12↔12.5 punto ·
   renk `--metin-ikincil`↔`--murekkep-yumusak`) — ayrı ad. */
.guvenlik-notu{
  display:flex; align-items:center; gap:var(--bosluk-9);
  padding-top:var(--bosluk-16); margin-top:var(--bosluk-18);
  border-top:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--metin-ikincil);
}
.guvenlik-notu i{ font-size:var(--yazi-13); color:var(--aksan); }

/* T6 · 🔴 HATA SATIRI HER ZAMAN GÖRÜNÜYORDU — kural yukarıda, §61'in
   kendi bloğunda; kaynak `display:none` + `.show` yazıyor. Kayıt
   panosunda kırmızı ünlem hata yokken de ekranda duruyordu (B37 ailesi,
   GÖZLE görülüyor). */

/* T7 · "Girişe dön" — düğme kabuğu taşımaz, düz bir bağlantı gibi çizilir. */
.giris-geri{
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  min-height:44px; margin-bottom:var(--bosluk-16);
  padding:0; border:0; background:none;
  font-family:inherit; font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil); cursor:pointer;
}

/* T8 · Yeni şifrenin CANLI kural listesi — beş kalem. Kanon bunu tek
   cümleye indirmişti (slot-1'in kendi kaydı: "beş kalemlik bir bileşeni
   tek cümleye indirmişim").
   ⚠ `-10px` üst pay kaynağın kendi değeri: liste kendi alanına yapışıyor. */
.sifre-kural{
  display:flex; flex-direction:column; gap:var(--bosluk-7);
  margin:-10px 0 var(--bosluk-22); padding:0; list-style:none;
}
.sifre-kural li{
  display:flex; align-items:center; gap:var(--bosluk-9);
  font-size:var(--yazi-12-5); line-height:var(--satir-govde);
  color:var(--metin-ikincil);
}
/* Kalem yazıldı, İKONU yazılmadı: daralınca eziliyor, punto şişiyordu. */
.sifre-kural li i{ flex:none; font-size:var(--yazi-12); line-height:1; }

/* T9 · "Giriş yapılamadı" bandı — kaynağın `.sbanner.reddedildi`si. */
/* 🔴 DURUM KAPISI YOKTU — kırmızı "Giriş yapılamadı" bandı hata yokken
   de ekranda duruyordu. Kaynağın `.sbanner`ı CSS'te `display:none`
   doğuyor. `.giris-hata` ile aynı aile (B37). */
.giris-serit{ display:none; }
.giris-serit.acik{
  display:flex; align-items:flex-start; gap:var(--bosluk-14);
  padding:var(--bosluk-16) var(--bosluk-18); margin:0 0 var(--bosluk-22);
  border-radius:var(--yuvarlak-lg);
  border:var(--cizgi-1) solid var(--tehlike-cizgi-yumusak);
  background:var(--tehlike-yikama);
}
.serit-ikon{
  display:grid; place-items:center; flex:none;
  width:42px; height:42px; border-radius:var(--yuvarlak-md);
  font-size:var(--yazi-17);
  background:var(--tehlike-yikama-2); color:var(--tehlike);
}
.serit-govde h4{
  display:flex; align-items:center; gap:var(--bosluk-9);
  margin:0 0 var(--bosluk-4);
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik);
}
.serit-govde p{
  margin:0; font-size:var(--yazi-13-5); line-height:var(--satir-genis);
  text-align:left; text-align-last:auto;    /* B36 */
}

/* T10 · Doğrulama panosunun eylem satırı. `.dogrula-durum` kaynakta
   kuralsız (yalın `<div>`) — ad basıldı, kural YAZILMADI (uydurma yok). */
.dogrula-eylemler{
  display:flex; flex-wrap:wrap; gap:var(--bosluk-10); margin:0 0 var(--bosluk-16);
}

/* T2 · BAŞARI DURUMU — dört panoda birden (kayit · sifre · yeni-sifre ·
   dogrula) ve kanonda hiç yoktu.
   ⚠ §7 `.bos-durum`a bakıp geçilmedi, ÖLÇÜLDÜ: o 40/24 dolgulu ve h4'ü
   15.5px; bu değil. */
/* 🔴 DOLGU DÜZELTİLDİ: 18/10 → 34/14. İlk ölçüm `querySelector`ın
   SAYFADAKİ İLK eşleşmesinden alınmıştı ve o blok hiçbir panoya ait
   değildi (öksüz `#fbSuccess`). Panoların gerçek değeri 34/14.
   ⚠ `.fs-top` turundaki dersin aynısı: **tek eşleşme aldığında hangi
   ÖRNEĞİ aldığını doğrula.** İki turda iki kez aynı hata. */
.giris-basari{
  display:none; text-align:center;
  padding:var(--bosluk-34) 0 var(--bosluk-14);
}
.giris-basari.acik{ display:block; }
.basari-tik{
  display:grid; place-items:center;
  width:56px; height:56px; margin:0 auto var(--bosluk-16);
  border-radius:var(--yuvarlak-daire); font-size:var(--yazi-22);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
}
.giris-basari h4{
  margin:0 0 var(--bosluk-7);
  font-size:var(--yazi-18); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik);
}
.giris-basari p{
  margin:0 auto; max-width:374px;
  font-size:var(--yazi-13-5); line-height:var(--satir-genis);
  text-align:center; text-align-last:auto;
}
.giris-basari-notu{
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  margin-top:var(--bosluk-16);
  font-size:var(--yazi-12-5); line-height:var(--satir-govde);
  color:var(--metin-ikincil);
}
.giris-basari-notu i{ font-size:var(--yazi-12-5); color:var(--aksan); }


/* §61'in DAR EKRAN DALLARI — kaynağın İKİ medya bloğu birebir
   (`giris-v1.html:428-465`, render edilmiş DOM'la @390 doğrulandı).
   🔴 İlk yazımda yalnız ≤640 dalı vardı ve kırılma noktası 1180'di;
   kaynağınki 1024 ve tablet dalı bambaşka şeyler yapıyor. Ölçüm
   (slot-3) iki teşhisi birden çürüttü:
     · mobildeki iki dev aralık hatasının (−1286 · +1452) kökü
       `.giris-avantaj{display:none}` DEĞİL, `order` — kaynak dar
       ekranda KARTI ÖNE alıyor, kanonda pano üstte kalıyordu;
     · pano dar ekranda clamp yüksekliğini bırakıp içeriğine dönüyor.
   🔴 Blok §61'in bütün tanımlarından SONRA duruyor — `@media` özgüllük
   artırmaz, sıra belirler. */

/* ---- TABLET (≤1024) — tek kolon, KART ÖNDE, pano altta ------------- */
@media (max-width:1024px){
  .giris-duzen{ grid-template-columns:1fr; gap:var(--bosluk-20); }
  .giris-kart{ order:1; padding:var(--bosluk-28) var(--bosluk-26) var(--bosluk-30); }
  /* Pano sticky KALIR — kaynak onu static yapmıyor; sıra 2 olduğu için
     zaten kartın altında ve yapışması görünür bir yan etki üretmiyor.
     ⚠ Bu bir ÖLÜ BİLDİRİM ve kaynağın hâli basılıyor (bildirildi,
     düzeltilmedi) — `ray.top` kararının emsali. */
  .giris-pano{ order:2; height:auto; min-height:0; padding:var(--bosluk-30) var(--bosluk-28); }
  .giris-pano h2{ font-size:var(--yazi-29); }
  /* Dört avantaj maddesi dar ekranda GİZLENİR — kart öne çıksın diye. */
  .giris-avantaj{ display:none; }
}

/* ---- MOBİL (≤640) --------------------------------------------------- */
@media (max-width:640px){
  .giris-hero{ padding:var(--bosluk-74) 0 var(--bosluk-50); }
  .giris-hero .kirinti{ padding:var(--bosluk-14) 0 var(--bosluk-10); font-size:var(--yazi-12); }
  .giris-kart{ padding:var(--bosluk-22) var(--bosluk-18) var(--bosluk-26); border-radius:var(--yuvarlak-lg); }
  .giris-bas h1{ font-size:var(--yazi-22); }
  .sosyal-kolon{ grid-template-columns:1fr; }
  .giris-pano{ padding:var(--bosluk-24) var(--bosluk-20); border-radius:var(--yuvarlak-lg); }
  .giris-pano h2{ font-size:var(--yazi-24); }
  .giris-sayilar{ gap:var(--bosluk-22); margin-top:var(--bosluk-18); padding-top:var(--bosluk-16); }
  .giris-sayilar b{ font-size:var(--yazi-21); }
  .giris-satir{ flex-wrap:wrap; gap:var(--bosluk-10); }
}


/* ---- KABUĞUN DİL MENÜSÜ · KALEMLER ---------------------------------
   Kutu kabuğun gömülü dosyasından geliyor; kalem kuralları kanon menüyü
   düz bağlantıya indirdiğinde düşmüştü ve markup geri gelince ham tarayıcı
   düğmesi çizildi. Ölçüler kaynağın (`fit-shell.css`). */
.tb-lang-menu button{
  display:flex; align-items:center; gap:var(--bosluk-9);
  width:100%; text-align:left;
  padding:var(--bosluk-9) var(--bosluk-11);
  border:0; background:none; cursor:pointer; font-family:inherit;
  border-radius:var(--yuvarlak-sm);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta); color:var(--murekkep);
}
.tb-lang-menu button span{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
}
.tb-lang-menu button:hover{ background:var(--aksan-yikama); color:var(--aksan-koyu); }
.tb-lang-menu button.active,
.tb-lang-menu button.active span{ color:var(--aksan-koyu); }
/* Seçili dili ayırt eden şey RENK DEĞİL, sağdaki onay işareti — kaynağın
   kendi kuralı; kanonda hiç yoktu ve iki kalem ayırt edilemiyordu. */
.tb-lang-menu button.active::after{
  content:"\f00c"; font-family:"Font Awesome 6 Free"; font-weight:900;
  margin-left:auto; font-size:var(--yazi-11);
}


/* ---- MOBİL ALT ÇUBUK · İKİ DÜZELTME --------------------------------
   Kabuğun kendi dosyası çubuğu getiriyor; iki bildirimi eksik.
   🔴 Dokunma hedefi 40 -> 44: kaynağın ölçüsü ve WCAG 2.5.8'in tabanı;
      kanonun §29 md.15 kararıyla (`.dugme{min-height:44px}`) aynı sayı. */
/* 🔴 `:not(.bn-center)` ZORUNLU — §0c/3'ün tuzağı. Düz `.bn-item{width:44px}`
   yazıldığında kabuğun `.bn-center{width:auto;height:auto}` varyantı EŞİT
   özgüllükte kalıyor, kanon SONRA yüklendiği için kazanıyor ve ortadaki
   52px'lik yüzen düğme 44'e iniyordu: çubuk 64 -> 56 düşüyordu (ölçüldü,
   gözle de görüldü). Yeni taban kuralı yazarken sorulacak soru: "bu kalemin
   bir VARYANTI var mı ve onu kapsıyor muyum?" */
.bn-item:not(.bn-center){ width:44px; height:44px; }
/* "Programlarım" slotu giriş yapılınca doğar — kaynağın kendi kuralı. */
.bn-item.bn-plan{ visibility:hidden; pointer-events:none; }


/* =====================================================================
   65 · PRO KAPISI — kaynak `.pro-gate` · `.pg-*` (`fit-shell.css`)
   ---------------------------------------------------------------------
   Kilitli içeriğin üstüne açılan tam ekran katman. Kardeşi GİRİŞ KAPISI
   (`.lg-gate`) kabuğun kendi dosyasında zaten var; Pro kapısı hiç
   yazılmamıştı — Diyet'in canlı sayfasında da yok, kaynağınki basıldı.

   İki katman: perde (97) ve kapı (98) — `.sohbet-ortu`/`.cekmece-ortu`
   deseniyle aynı. Kapalı hâl `visibility:hidden` + `pointer-events:none`;
   `display:none` DEĞİL, yoksa geçiş ölür (§64'ün aynı şerhi).
   ===================================================================== */

.pg-ortu{
  position:fixed; inset:0; z-index:var(--kat-ortu);
  background:var(--perde);
  opacity:0; visibility:hidden;
  transition:opacity var(--sure-yavas) var(--yumusama), visibility var(--sure-yavas);
}
.pg-ortu.acik{ opacity:1; visibility:visible; }

.pro-kapi{
  position:fixed; inset:0; z-index:var(--kat-modal);
  display:grid; place-items:center; padding:var(--bosluk-20);
  opacity:0; visibility:hidden; pointer-events:none;
  transition:opacity var(--sure-yavas) var(--yumusama), visibility var(--sure-yavas);
}
.pro-kapi.acik{ opacity:1; visibility:visible; pointer-events:auto; }

.pg-pano{
  position:relative; width:min(420px, 100%);
  background:var(--kagit); border-radius:var(--yuvarlak-lg);
  box-shadow:var(--golge-lg);
  padding:var(--bosluk-32) var(--bosluk-26) var(--bosluk-26);
  text-align:center; transform:translateY(8px);
  transition:transform var(--sure-yavas) var(--yumusama);
}
.pro-kapi.acik .pg-pano{ transform:translateY(0); }

.pg-kapat{
  position:absolute; top:13px; right:13px;
  width:36px; height:36px; display:grid; place-items:center;
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--kagit); color:var(--murekkep-yumusak); cursor:pointer;
}
.pg-ikon{
  width:62px; height:62px; border-radius:var(--yuvarlak-daire);
  background:var(--aksan-yikama); color:var(--aksan);
  display:grid; place-items:center; font-size:var(--yazi-25);
  margin:0 auto var(--bosluk-14);
}
.pg-etiket{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;  /* Beyar: .08 → .06 */
  color:var(--aksan); background:var(--aksan-yikama);
  padding:var(--bosluk-4) var(--bosluk-10); border-radius:var(--yuvarlak-sm);
}
.pro-kapi h4{ font-size:var(--yazi-19); margin-bottom:var(--bosluk-8); }
.pro-kapi p{
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil); max-width:320px;
  margin:0 auto var(--bosluk-16); line-height:var(--satir-govde);
  text-align:center; text-align-last:auto;
}
.pg-ozellikler{
  list-style:none; max-width:300px; margin:0 auto var(--bosluk-20);
  text-align:left; display:flex; flex-direction:column; gap:var(--bosluk-9);
}
.pg-ozellikler li{
  display:flex; gap:var(--bosluk-9);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta); color:var(--murekkep-yumusak);
}
.pg-ozellikler li i{
  flex:none; margin-top:3px; font-size:var(--yazi-12); color:var(--aksan-koyu);
}
.pg-eylemler{ display:flex; gap:var(--bosluk-10); }
.pg-eylemler .dugme{ flex:1; }


/* =====================================================================
   64 · MOBİL ÇEKMECE — kaynak `.drawer` · `.d-*` (`fit-shell.css`)
   ---------------------------------------------------------------------
   Sağdan kayan mobil menü. Kabuğun `#hamburger` düğmesi açar; perde ve
   panel iki ayrı katman (95 · 96). Ölçüm: render edilmiş DOM @390,
   giriş yapılmış hâl. Kanonda hiç yoktu — düğme vardı, çekmece yoktu.

   🔴 AÇILMA `max-height` İLE — `display` ile DEĞİL. Kaynağın kapalı alt
   listesi `overflow:hidden` + `max-height:0`; geçiş `.15s`. `display:none`
   yazmak geçişi öldürür.
   ===================================================================== */

.cekmece-ortu{
  position:fixed; inset:0; z-index:var(--kat-cekmece-ortu);
  background:var(--perde);
  opacity:0; visibility:hidden;
  transition:opacity var(--sure-agir) var(--yumusama), visibility var(--sure-agir);
}
.cekmece-ortu.acik{ opacity:1; visibility:visible; }

.cekmece{
  position:fixed; inset:0 0 0 auto; z-index:var(--kat-cekmece);
  /* Ekranın tamamını KAPLAMAZ: solda perde şeridi kalır ki dokunup
     kapatılabilsin (kaynak @390'da 335px çiziyor). */
  width:min(335px, 86vw);
  display:flex; flex-direction:column;
  background:var(--kagit); box-shadow:-12px 0 44px rgba(20,18,12,.22);
  transform:translateX(100%);
  transition:transform var(--sure-agir) var(--yumusama);
}
.cekmece.acik{ transform:translateX(0); }

.cekmece-bas{
  display:flex; align-items:center; justify-content:space-between;
  padding:var(--bosluk-16) var(--bosluk-20);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.cekmece-marka{ display:flex; align-items:center; gap:var(--bosluk-10); }
.cekmece-kapat{
  flex:none; width:42px; height:42px; display:grid; place-items:center;
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--kagit); color:var(--murekkep);
  font-size:var(--yazi-18); cursor:pointer;
}

.cekmece-nav{ overflow-y:auto; flex:1; min-height:0; }
.c-kalem{ border-bottom:var(--cizgi-1) solid var(--cizgi); }
.c-satir{ display:flex; align-items:stretch; }
.c-link{
  flex:1; display:flex; align-items:center; gap:var(--bosluk-11);
  padding:var(--bosluk-16) var(--bosluk-22);
  font-size:var(--yazi-16); font-weight:var(--agirlik-kalin); color:var(--murekkep);
}
.c-link i{ width:20px; font-size:var(--yazi-15); color:var(--aksan); }
.c-ok{
  flex:none; width:56px; display:grid; place-items:center;
  /* 🔴 SOL KENAR HAİRLİNE — ok bağlantıdan bir çizgiyle ayrılır (kaynağın
     `border-left`i). Gözle yakalandı, sonra ölçüldü. */
  border:none; border-left:var(--cizgi-1) solid var(--cizgi);
  background:none; cursor:pointer;
  font-size:var(--yazi-12); color:var(--metin-ikincil);
  transition:color var(--sure-cabuk) var(--yumusama),
             background var(--sure-cabuk) var(--yumusama);
}
.c-ok i{ transition:transform var(--sure-yavas) var(--yumusama); }
.c-kalem.acik .c-ok i{ transform:rotate(180deg); }

/* 🔴 Kapalı hâl `max-height:0` — `display:none` DEĞİL (yukarıdaki şerh). */
.c-alt{
  background:var(--zemin); overflow:hidden;
  max-height:0; transition:max-height var(--sure-hizli) var(--yumusama);
}
.c-kalem.acik .c-alt{ max-height:600px; }
.c-alt a{
  display:flex; align-items:center; gap:var(--bosluk-11);
  padding:var(--bosluk-13) var(--bosluk-22) var(--bosluk-13) var(--bosluk-36);
  font-size:var(--yazi-14-5); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak);
}
.c-alt a i{ width:18px; font-size:var(--yazi-13); color:var(--aksan); }
.c-grup{
  padding:var(--bosluk-10) var(--bosluk-22) var(--bosluk-4) var(--bosluk-36);
  margin-top:var(--bosluk-6);
  border-top:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-10); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-etiket); text-transform:uppercase;
  color:var(--metin-ikincil);
}

.cekmece-ayak{
  display:flex; flex-direction:column; gap:var(--bosluk-11);
  padding:var(--bosluk-18) var(--bosluk-20);
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.cekmece-hesap{
  display:flex; align-items:center; gap:var(--bosluk-12);
  padding:var(--bosluk-2) var(--bosluk-2) var(--bosluk-12);
}
/* 🔴 §25 `.kimlik-avatar` BURAYA GİRMEZ. Denendi ve ölçüldü: o avatar
   profil kartının KAPAĞA BİNEN kalemi — `margin-top:-70px` · 4px kâğıt
   çerçeve · gölge taşıyor ve çekmecede kullanıcı kartını 66px yukarı
   çekip menü listesinin ÜSTÜNE bindiriyordu (gözle görüldü, sonra
   ölçüldü). Kaynağın `.da-ava`sı düz bir 46px daire; çekmece kendi
   kalemini alır. Ad benzerliği değil, KONUM devraldığı için tehlikeli —
   `.kunye` ↔ `.sohbet-kunye` karışıklığının aynısı. */
.cekmece-avatar{
  flex:none; width:46px; height:46px; border-radius:var(--yuvarlak-daire);
  display:grid; place-items:center;
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  font-size:var(--yazi-16); font-weight:var(--agirlik-ekstra);
  background-size:cover; background-position:center;
}
.cekmece-hesap b{ display:block; font-size:var(--yazi-15); font-weight:var(--agirlik-kalin); }
.cekmece-hesap-baglar{ display:flex; gap:var(--bosluk-12); }
.cekmece-hesap-baglar a{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin); color:var(--aksan);
}
/* İki bağlantı arasındaki NOKTA AYRAÇ — kaynağın kendi kuralı; olmadan
   "Bildirimler Çıkış" tek bir öbek gibi okunuyordu. */
.cekmece-hesap-baglar a:not(:last-child)::after{
  content:"·"; margin-left:var(--bosluk-8);
  color:var(--metin-ikincil); font-weight:var(--agirlik-govde);
}
.cekmece-dil{ display:flex; flex-direction:column; margin-top:3px; }
.cekmece-dil-dugme{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--bosluk-12); padding:var(--bosluk-4) 0;
  border:none; background:none; font-family:inherit; cursor:pointer;
}
.cekmece-dil-etiket{
  display:flex; align-items:center; gap:var(--bosluk-8);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta); color:var(--metin-ikincil);
}
.cekmece-dil-simdi{
  display:flex; align-items:center; gap:var(--bosluk-8);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-genis); color:var(--murekkep);
}


/* =====================================================================
   63 · ROZET VE KADEME KİTİ — kaynak `.badge-*` · `.rank-*` · `.pd-*` · `.ld-*`
   ---------------------------------------------------------------------
   Ölçüm: slot-2, render edilmiş DOM @1440 ve @390 (dört pane).

   🔴 `.ld-tablo` §4 `.tablo` DEĞİL — §4'ün kaynak listesindeki kayıt
   YANLIŞ. Ölçüldü: `<table>` hiç yok, `.ld-tablo` bir `<div>` ve kutusu
   tam olarak §1 `.kart` (radius 16 · 1px çizgi · kağıt · golge-sm ·
   overflow hidden). Sıralama tablosu için yeni bir tablo bileşeni
   GEREKMİYOR; `.kart.tasma-kapali` + satır kiti yetiyor.

   ⚠ `.badge-*` §5 `.rozet` DEĞİL: o küçük durum etiketi, bu MADALYON.
   ===================================================================== */

/* ---- SIRALAMA SATIRI (liderlik) ------------------------------------ */
.siralama-satir{
  display:flex; align-items:center; gap:var(--bosluk-14);
  padding:var(--bosluk-14) var(--bosluk-20);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
/* Kullanıcının kendi satırı — zemin DEĞİŞİR ve alt çizgi kalkar, ikisi
   birlikte: renk tek sinyal olmasın (§56'nın "var/yok" kuralıyla aynı). */
.siralama-satir.ben{ background:var(--aksan-yikama-2); border-bottom:none; }
.siralama-sira{
  flex:none; width:38px; height:38px; border-radius:var(--yuvarlak-daire);
  display:grid; place-items:center;
  font-size:var(--yazi-13); font-weight:var(--agirlik-ekstra);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
}
/* R10 · METİN ÇOCUKLARI — kap yazılmış, çocukları yazılmamıştı. Beş kitin
   hepsinde aynı desen ve aynı görünür kusur: ad ile alt satır YAN YANA
   akıyordu ("Zeynep Y.@zeynepy · 26 rozet"). Kaynakta ikisi de blok.
   🔴 Ölçüm bunu gösteriyordu ama asıl yakalayan GÖZ oldu (slot-2, 1440
   ekran görüntüsü) — §13'ün "ölç · ara · bak" dersinin bu turdaki üçüncü
   örneği. */
.siralama-kim{ flex:1; min-width:0; }
.siralama-kim b{
  display:block;
  font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-sik-2); color:var(--murekkep);
}
.siralama-kim small{
  display:block; margin-top:2px;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--metin-ikincil);
}
.siralama-puan{ flex:none; text-align:right; }
.siralama-puan b{
  display:block; text-align:right;
  font-size:var(--yazi-16); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-sik); color:var(--murekkep);
}
.siralama-puan small{
  display:block; margin-top:1px; text-align:right;
  font-size:var(--yazi-10-5); font-weight:var(--agirlik-orta);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;
  color:var(--metin-ikincil);
}

/* ---- PUAN KARTI — kademe VE puan pane'inde, tek bileşen ------------- */
.puan-izgara{ display:grid; grid-template-columns:repeat(5,1fr); gap:var(--bosluk-12); }
.puan-karti{
  padding:var(--bosluk-16) var(--bosluk-18);
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
}
.puan-bas{
  display:flex; align-items:center; gap:var(--bosluk-9);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin); color:var(--murekkep);
}
.puan-sayi{
  display:block;   /* R10 — ölçüler zaten tutuyordu, eksik olan tek bu */
  font-size:var(--yazi-22); font-weight:var(--agirlik-ekstra);
  line-height:var(--satir-govde); letter-spacing:var(--aralik-sik);
  margin-top:var(--bosluk-9);
}
.puan-alt{
  display:block;   /* R10 */
  margin-top:2px;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}

/* ---- KADEME MERDİVENİ ----------------------------------------------- */
.merdiven{ display:grid; grid-template-columns:repeat(8,1fr); gap:var(--bosluk-10); margin-top:var(--bosluk-12); }
/* R10 · basamağın ad ve özet satırı — ikisi de blok, ikisi de ortalı.
   Kaynakta "Başlangıç" ile "0 puan · 0 gün · 0 hedef" alt alta. */
.basamak b{
  display:block; text-align:center;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  line-height:1.2; color:var(--murekkep);
}
/* 🔴 `:not(.basamak-sec)` ŞART. `.basamak>span` (0,2,0) hapın kendi
   kuralını (`.basamak-sec`, 0,1,0) YENİYOR ve "Seçili" hapı eşik
   satırının tipografisine dönüşüyordu (9/800/--kagit → 10.5/600/gri).
   Bu turda üçüncü kez: `.kart.panel>.kart-govde` `.bosluksuz`u,
   `.ana-menu a` açılır menüyü (B28), şimdi bu. Çocuk birleştiricisi
   yazılırken KARDEŞ kalemler dışarıda bırakılır. */
.basamak>span:not(.basamak-sec):not(.basamak-sayi){
  display:block; text-align:center; margin-top:3px;
  font-size:var(--yazi-10-5); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil);
}
/* 🔴 `<button>` NE ZEMİNİNİ NE YAZI YÜZÜNÜ MİRAS ALIR. İkisi de
   bildirilmezse tarayıcının kendi paleti ve Arial'i geçer — kanonda
   38 düğme (30 rozet kartı + 8 basamak) Arial çiziliyordu ve zeminleri
   ButtonFace'ti. Kaynağın karşılıkları ikisini de açıkça yazıyor. */
.rozet-karti,
.basamak{ background:var(--kagit); font-family:inherit; }
.basamak{
  position:relative; text-align:center;
  padding:var(--bosluk-26) var(--bosluk-8) var(--bosluk-24);
  border-radius:var(--yuvarlak-md);
  /* 🔴 TABAN DÜZ ÇİZGİ (§63d) — `dashed` kaynakta `.rank-step.locked`ın
     kipidir. Zemin de kâğıt; saydamlık kilitli basamağın işareti. */
  border:var(--cizgi-1) solid var(--cizgi);
}
.basamak-ikon{
  width:46px; height:46px; margin:0 auto var(--bosluk-9);
  border-radius:var(--yuvarlak-daire); display:grid; place-items:center;
  font-size:var(--yazi-18);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
  color:var(--metin-pasif-2);
}
/* ⚠ `:not(.basamak-sayi)` kardeş kuralı dışarıda bıraktı ama bu kalem
   `display`ini kendisi bildirmiyordu — bir kural kapsamdan ÇIKARILDIĞINDA
   ondan miras alınan bildirimler de düşer. Kapsam daraltmanın bedeli:
   çıkarılan kalem kendi tabanını yazmak zorunda. */
.basamak-sayi{
  display:block;
  margin-top:var(--bosluk-4);
  font-size:9.5px; font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-genis); color:var(--kademe-notr-cip-metin);
}
.basamak-kilit{
  position:absolute; top:var(--bosluk-8); right:var(--bosluk-9);
  font-size:9px; font-weight:900; color:var(--metin-pasif-3);
}
/* Seçili basamağın hapı — görünmez doğar, seçimle belirir. */
.basamak-sec{
  position:absolute; left:50%; bottom:0; transform:translate(-50%,50%);
  padding:var(--bosluk-4) var(--bosluk-10); border-radius:var(--yuvarlak-hap);
  font-size:9px; font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-etiket-3); text-transform:uppercase;
  background:var(--aksan); color:var(--kagit);
  box-shadow:0 2px 6px var(--aksan-golge-2);
  opacity:0; transition:opacity var(--sure) var(--yumusama);
}
.basamak.secili .basamak-sec{ opacity:1; }
/* Hap mutlak konumlu ve basamak kenarına biniyor: satır boyu kilitli
   olmazsa dikey ortası kayar, katmanı olmazsa kesikli kenarın altında
   kalır (ölçüldü: lh 9px · z 2). */
.basamak-sec{ line-height:9px; z-index:var(--kat-icerik); }

/* ---- ROZET MADALYONU ------------------------------------------------ */
/* 🔴 AİLE KABI PAY TAŞIMAZ — nefesi İÇİNDEKİ not satırı veriyor
   (`.rozet-aile-not{margin-bottom:24}`). Kap da pay koyunca iki nefes
   üst üste biniyordu; `.fp-profil`in alt dolgu tuzağının (KOPYALAMA-KURALI
   §3) rozet ekranındaki tekrarı. Ölçüldü: FIT `0px`. */
/* 🔴 AİLE GRUPLARI ARASI NEFES — 8 aralık × 32px = 256px kayıp ritim.
   Eski kural `margin:0` idi ve şerhi "Ölçüldü: FIT 0px" diyordu —
   ölçüm FIT'in İLK grubundan alınmış ve kurala genellenmiş. FIT'te 0
   olan tek grup o; kaynak `.badge-cat{margin-top:var(--sec-pad-sm)}` +
   `:first-of-type{0}` yazıyor (slot-2 sekiz aralığı da ölçtü).
   🔴 "Tek örneği ölçüp kural yazmak" bu dalgada ÜÇÜNCÜ kez oldu
   (`--koyu-metin-5` balonun başlığından, `--cizgi-vurgu` frekanstan,
   bu ilk gruptan). Bir kural yazmadan önce ÖRNEĞİN TEMSİL EDİP
   ETMEDİĞİ sorulur.
   ⚠ Literal seçici çifti ancak sarmalayıcı `div` geri konduğu için
   çalışıyor; sarmalayıcı yokken `:first-of-type` `.bolum-bas`ı tutuyordu
   (slot-2 tarayıcıda ikisini de denedi).
   ⚠ `--bolum-nefes-sik` mobil dalı zaten taşıyor: 32/26/22, iki tarafta
   da birebir — ayrıca yazılmaz. */
.rozet-ailesi{ margin-top:var(--bolum-nefes-sik); }
.rozet-ailesi:first-of-type{ margin-top:0; }
.rozet-aile-bas{ display:flex; align-items:center; gap:var(--bosluk-10); margin-bottom:var(--bosluk-10); }
.rozet-aile-bas h3{
  display:flex; align-items:center; gap:var(--bosluk-9);
  font-size:var(--yazi-17); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik); letter-spacing:var(--aralik-baslik);
}
.rozet-aile-sayi{
  margin-left:auto;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta); color:var(--metin-ikincil);
}
.rozet-aile-not{
  margin-bottom:var(--bosluk-24);
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}
.rozet-izgara{ display:grid; grid-template-columns:repeat(5,1fr); gap:var(--bosluk-12); }

.rozet-karti{
  position:relative; display:flex; align-items:center; flex-wrap:wrap;
  gap:var(--bosluk-13); padding:var(--bosluk-24);
  border-radius:var(--yuvarlak-md);
  /* 🔴 TABAN = KAZANILMIŞ KART (§63d). Buraya eskiden kaynağın
     KİLİTLİ kartı yazılıydı (`dashed var(--cizgi-vurgu)` + saydam zemin);
     tohumsuz render'da 30 rozetin 30'u kilitli olduğu için ölçülebilen tek
     hâl oydu ve varyant TABAN sanıldı. Kaynağın tabanı düz çizgi + kâğıt:
       .badge-card { background:var(--paper); border:1px solid var(--line) } */
  border:var(--cizgi-1) solid var(--cizgi);
  /* 🔴 TARAYICI ZEMİNİ SİLİNİR. Kart bir `<button>` ve zemin bildirmiyordu:
     `rgb(239,239,239)` — ButtonFace, yani GRİ 3B TARAYICI DÜĞMESİ.
     Kaynak `rgba(0,0,0,0)` bırakıyor. `.giris-unuttum`la aynı kusur ve
     aynı gün bulundu; ikisini de motorun `renk` gerekçesi "marka farkı"
     sayıp gizliyordu (2026-09-02'de kapatıldı). */
  background:var(--kagit);
  /* 🔴 TEK KÖK, ALTI ÇOCUK. Kart bir `<button>` ve UA varsayılanı
     `text-align:center`; ikon · puan · not · çubuk · sol satır ve kartın
     kendisi ALTI ölçümde birden ortada duruyordu. Kaynakta hepsi solda.
     B36'nın düğme ailesindeki karşılığı — `.cip`te aynı satır duruyor.
     🔴 Altı 🔴'yı tek tek yamalamak yanlış olurdu: kök buydu (§0c/3). */
  text-align:left;
}
.rozet-ikon{
  /* Madalyon DARALMAZ — kart sarınca metin kolonu küçülür, ikon değil. */
  flex-shrink:0;
  width:42px; height:42px; border-radius:var(--yuvarlak-md);
  display:grid; place-items:center; font-size:var(--yazi-17);
  /* 🔴 TABAN MARKA RENGİNDEDİR (§63d) — eskiden burada kilitli kartın
     nötr çifti (`--zemin`/`--metin-pasif-4`) duruyordu. Kaynak:
       .badge-ico { background:var(--fit-wash); color:var(--fit) } */
  background:var(--aksan-yikama); color:var(--aksan);
}
.rozet-puan{
  position:absolute; top:var(--bosluk-12); right:var(--bosluk-14);
  display:flex; align-items:center; gap:var(--bosluk-5);
  font-size:var(--yazi-10); font-weight:var(--agirlik-ekstra);
  /* Kaynak satır boyunu KİLİTLİYOR (12px = 1.2), `normal` bırakmıyor:
     puan rozeti kartın köşesinde mutlak konumlu ve satır boyu oynarsa
     üst kenara göre kayıyor. Ölçüldü: FIT 12px ↔ kanon `normal`. */
  line-height:1.2;
  /* 🔴 TABAN `--aksan-koyu` (§63d) — `--metin-ikincil` kaynakta
     `.badge-card.locked .b-puan` / `.olcusuz .b-puan` değeridir. */
  letter-spacing:var(--aralik-genis); color:var(--aksan-koyu);
}
/* 🔴 PETROL AİLESİ — `--eko-akademi`nin açık adımı (§5.1'in "üretilmedi"
   dediği hover adımı DEĞİL; kaynakta ölçülmüş ayrı bir değer). */
.rozet-sol{
  flex:0 1 100%; margin-top:1px;
  font-size:var(--yazi-10); font-weight:var(--agirlik-orta);
  letter-spacing:var(--aralik-ince); color:var(--eko-akademi-2);
}
.rozet-not{
  /* 🔴 KENDİ SATIRINI KAPAR: `flex-basis:100%` olmadan not, ikonun ve
     başlığın yanına sıkışıyor ve ilerleme çubuğu 60px'in altına iniyordu.
     `align-items:center` çubuğu metinle aynı eksende tutar. */
  display:flex; flex-wrap:wrap; align-items:center; flex-basis:100%;
  gap:var(--bosluk-7); margin-top:var(--bosluk-10);
  font-size:var(--yazi-10-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-ince);   /* çubuk BURADAN miras alır */
  /* 🔴 TABAN RENK YAZMAZ (§63d). `--eko-akademi` kaynakta
     `.b-note.locked`ın rengidir; `.b-note` tabanı renk bildirmez ve
     karttan miras alır. Petrol artık `.rozet-not.kilitli`de. */
}
/* Çubuğun taban genişliği — kaynağın ölçtüğü 60px. Altına inince yüzde
   okunamıyor (kaynağın kendi şerhi). Boşluk değil ELEMAN ölçüsü, ham px
   serbest (§3'ün üçüncü kuralı). */
.rozet-cubuk{ flex:1; min-width:60px; height:5px; border-radius:var(--yuvarlak-hap); background:var(--cizgi); overflow:hidden; }
/* Çubuğun DOLGUSU — kaynak `.b-prog span`. Kanonda HİÇ YOKTU: çubuk
   zemini vardı, dolgusu yoktu; %60 dolu bir çubuk ekranda BOŞ çiziliyordu.
   Petrol rampası (parlak → koyu), ölçülen gradyanın kendisi. */
.rozet-cubuk span{
  display:block; height:100%; border-radius:var(--yuvarlak-hap);
  background:linear-gradient(90deg, var(--eko-akademi-3), var(--eko-akademi));
}

/* =====================================================================
   63d · ROZET VE KADEMENİN DURUM VARYANTLARI
   ---------------------------------------------------------------------
   🔴🔴 KANONUN ALTINCI KIRILMA NOKTASI — ÖLÇÜLDÜ, 2026-09-02

     kural yok · markup yok · ad tutmuyor · bağlam öldürüyor · ayrışmadı
     · **DURUM VARYANTI TABAN SANILDI**

   §63 kaynağın rozet kartını `fit-rozetlerim-kademe-auth.html`den ölçtü.
   O render TOHUMSUZDUR (K20): 30 rozetin 30'u, 8 basamağın 8'i KİLİTLİ.
   Ölçülebilen tek hâl kilitli hâldi ve kanona TABAN olarak yazıldı —
   altı bildirimde birden:

     kalem              kanonda (kilitli)        kaynağın TABANI
     .rozet-karti       dashed --cizgi-vurgu     solid --cizgi
                        background transparent   background --kagit
     .rozet-ikon        --zemin / --metin-pasif-4  --aksan-yikama / --aksan
     .rozet-puan        --metin-ikincil          --aksan-koyu
     .rozet-karti div b --metin-ikincil          --murekkep
     .rozet-not         --eko-akademi            (renk yazmaz)
     .basamak           dashed --cizgi           solid --cizgi

   Bedeli: rozet ikonu HİÇBİR koşulda marka rengine dönemiyordu — veri
   gelse de, tohum atılsa da. "Kazanıldı" durumunun kuralı YOKTU, yokluğu
   da görünmüyordu çünkü kilitli hâl ekranda doğru duruyordu.

   ⚠ AYNI KUSUR TOKEN KATMANINA DA SIZMIŞTI: `--cizgi-vurgu` (#dddddd) ve
     `--cizgi-vurgu-koyu` (#c9c9c9) kilitli kartın çiftidir; tabanın hover
     kenarı #dcdcdc'dir ve tokeni YOKTU (`--cizgi-vurgu-acik` eklendi).

   ÖLÇÜT: `rozetlerim-v1.html`in kendi `<style>`ı — dört kart durumu
   (taban · yeni · kilitli · ölçüsüz) ve dört basamak durumu (taban ·
   tamam · şimdiki · kilitli · seçili). Değerler ORADAN, uydurma yok.

   🔴 KAPI: `kapi-durum.mjs` — bir bileşenin kaynakta N durumu varsa
      kanonda da N kuralı olmalı. Durum sınıfı ENJEKTE EDİLİP hesaplanan
      değerin DEĞİŞTİĞİ ölçülür; "kural dosyada var" yetmez.
   ===================================================================== */

/* ---- ROZET KARTI · YENİ KAZANILAN -----------------------------------
   Kaynak: `.badge-card.yeni{border-color:var(--fit);box-shadow:0 0 0 3px
   rgba(0,157,79,.14)}` — "bir kez görülünce söner" (kaynağın şerhi). */
.rozet-karti.yeni{
  border-style:solid; border-color:var(--aksan);
  box-shadow:0 0 0 var(--cizgi-3) var(--aksan-halka-3);
}
.rozet-not.kazanildi{ color:var(--aksan-koyu); }

/* ---- ROZET KARTI · KİLİTLİ ------------------------------------------
   Kesikli kenar + saydam zemin: rozetin YERİ görünür, kendisi görünmez. */
.rozet-karti.kilitli{
  border-style:dashed; border-color:var(--cizgi-vurgu);
  background:transparent;
}
.rozet-karti.kilitli .rozet-ikon{ background:var(--zemin); color:var(--metin-pasif-4); }
.rozet-karti.kilitli div b{ color:var(--metin-ikincil); }
.rozet-karti.kilitli .rozet-puan{ color:var(--metin-ikincil); }
/* Petrol — kilitli rozetin "yolda" notu. Kaynak `.b-note.locked`. */
.rozet-not.kilitli{ color:var(--eko-akademi); flex-wrap:wrap; }

/* ---- ROZET KARTI · ÖLÇÜSÜZ ------------------------------------------
   Kaynağın kendi şerhi: "ölçüsü HENÜZ HİÇBİR EKRAN TARAFINDAN
   KAYDEDİLMİYOR. Üçüncüsünü 'yolda' göstermek ilerlediğini ima ederdi."
   Noktalı kenar kesikliden AYRI bir işaret — iki yokluk iki şey. */
.rozet-karti.olcusuz{
  border-style:dotted; border-color:var(--cizgi-vurgu-2);
  background:var(--zemin);
}
.rozet-karti.olcusuz .rozet-ikon{ background:var(--zemin-3); color:var(--metin-pasif-5); }
.rozet-karti.olcusuz div b{ color:var(--metin-ikincil); }
.rozet-karti.olcusuz .rozet-puan{ color:var(--metin-ikincil); }
.rozet-not.olcusuz{ color:var(--metin-ikincil); }

/* ---- ROZET KARTI · HOVER · ÜÇ DURUM AYRI ---------------------------- */
.rozet-karti:hover{
  border-color:var(--cizgi-vurgu-acik);
  transform:translateY(-2px); box-shadow:var(--golge-sm);
}
/* Kilitli ve ölçüsüz kart YÜKSELMEZ: kazanılmamış rozet dokunulabilir
   görünmemeli (kaynağın kendi kararı — `transform:none;box-shadow:none`). */
.rozet-karti.kilitli:hover,
.rozet-karti.olcusuz:hover{
  border-color:var(--cizgi-vurgu-koyu); transform:none; box-shadow:none;
}

/* ---- KADEME · TAMAMLANAN ------------------------------------------- */
.basamak.tamam .basamak-ikon{
  background:var(--aksan-yikama); color:var(--aksan);
  border-color:var(--aksan-cizgi-3);
}
/* ---- KADEME · ŞİMDİKİ ---------------------------------------------- */
.basamak.simdiki{
  border-color:var(--aksan); background:var(--kagit);
  box-shadow:0 6px 18px var(--aksan-golge-3);
}
.basamak.simdiki .basamak-ikon{
  background:var(--aksan-nisan-dolu); color:var(--kagit);
  border-color:var(--aksan);
}
.basamak.tamam .basamak-sayi,
.basamak.simdiki .basamak-sayi{ color:var(--aksan-koyu); }
/* ---- KADEME · KİLİTLİ ---------------------------------------------- */
.basamak.kilitli{ border-style:dashed; background:transparent; }
/* ---- KADEME · SEÇİLİ (hap kuralı yukarıda, kenar burada) ------------ */
.basamak.secili{
  border-style:solid; border-color:var(--aksan);
  box-shadow:0 0 0 var(--cizgi-3) var(--aksan-halka-3), 0 8px 20px var(--aksan-golge-3);
}

/* Kartın metin kolonu — ad ve durum. İkisi de `<div>` içinde satır
   kutusu olarak doğuyor; kaynak ikisini de BLOK yapıyor, yoksa ad ile
   durum aynı satıra düşüyor (ölçüldü: display `block` · 13.5/1.2 ve
   11.5/500 · üst pay 3). Kabuğun 13.3333px'i (0.8333rem) buraya kadar
   sızıyordu — kalem kendi ölçüsünü yazmadığı için. */
.rozet-karti div b{
  display:block;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  line-height:1.2;
  /* ✅ ŞÜPHE DOĞRULANDI (§63d). Bu şerh "kazanılmış kartta değişiyor
     olabilir — bildirildi, uydurulmadı" diyordu; kaynağın CSS'i okundu ve
     DEĞİŞİYOR: taban `.badge-card b{color:var(--slate)}`, soluk hâl
     `.badge-card.locked b{color:var(--muted)}`. Taban geri kondu. */
  color:var(--murekkep);
}
.rozet-karti div span{
  display:block; margin-top:3px;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil);
}

/* İpucu balonu — hover'da belirir, koyu zeminde. */
.rozet-ipucu{
  /* 🔴 KONUM BİLDİRİMİ HİÇ YOKTU. `position:absolute` yazılıydı ama
     `left`/`bottom`/`width`/`transform` yoktu — balon STATİK yerinde,
     yani KARTIN İÇİNDE duruyordu ve rozetin adını örtüyordu. Üstelik
     kapalıyken `pointer-events:auto` olduğu için tıklamayı yutuyordu.
     Kaynak balonu kartın ÜSTÜNDE, ortalanmış ve tıklama-geçirgen
     çiziyor (slot-2 ölçtü, tarayıcıda simüle edip FIT'le karşılaştırdı:
     left · width · transform · pointer-events dördü de birebir).
     ⚠ Görünürlük `opacity` DEĞİL `visibility` ile de kapanır — yoksa
     saydam balon tıklamayı yutmaya devam eder (§62'nin `transitionend`
     dersinin kardeşi). */
  position:absolute; z-index:var(--kat-ipucu);
  left:50%; bottom:calc(100% + 10px); width:100%;
  transform:translate(-50%, 6px);
  pointer-events:none; visibility:hidden;
  padding:var(--bosluk-12) var(--bosluk-14); border-radius:var(--yuvarlak-md);
  /* Balonun KENDİ rengi gövdesinden bir adım açık — ilk ölçüm ikisini
     ayırmamıştı ve tek yuvaya bağlanmıştı (slot-2 düzeltti). */
  background:var(--murekkep); color:var(--koyu-metin-5);
  box-shadow:var(--golge-lg);
  opacity:0;
  transition:opacity var(--sure) var(--yumusama),
             visibility var(--sure) var(--yumusama);
  text-align:left; text-align-last:auto;    /* B36 */
}
/* R8 · BALONUN İÇ TİPOGRAFİSİ — başlık ve gövde AYRI kalem.
   Ölçüldü (slot-2, @1440 ve @390 aynı): başlık blok, gövdeden bir adım
   parlak; gövde 11.5/500 · 1.5 satır. `text-align-last:auto` B36 —
   kabuğun `p{text-align:justify}`i balonun içine de sızıyordu ve
   30 ipucunun 30'u yaslanıyordu (slot-2 sızıntı taraması). */
.rozet-ipucu b{
  display:block; margin-bottom:var(--bosluk-4);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-ekstra);
  line-height:1.2; color:var(--kagit);
}
.rozet-ipucu p{
  margin:0; font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-orta); color:var(--koyu-metin-7);
  text-align:left; text-align-last:auto;    /* B36 */
}
/* 🔴 HOVER KANONDA HİÇ YOKTU — motor hover durumunu ölçmüyor
   (`getComputedStyle` varsayılan durumu okur), o yüzden görünmedi.
   Doğru kapı `s2-hover-olc.mjs`; `transform`ı OZ'ye eklemek İŞE YARAMAZ,
   çünkü varsayılan durumda iki taraf da `none` der.
   Ölçüldü (slot-2, 1440 ve 390'da birebir aynı):
     .badge-card:hover  kenar #dddddd → #c9c9c9, BAŞKA HİÇBİR ŞEY değişmiyor
     .rank-step:hover   translateY(-2px) + marka gölgesi + marka kenarı */
.rozet-karti:hover{ border-color:var(--cizgi-vurgu-koyu); }
.basamak:hover{
  transform:translateY(-2px);
  box-shadow:0 6px 16px var(--aksan-golge);
  border-color:var(--aksan);
}
.rozet-karti:hover .rozet-ipucu,
.rozet-karti:focus-within .rozet-ipucu,
.rozet-karti.ipucu-acik .rozet-ipucu{ opacity:1; visibility:visible; }
/* 🔴 MOBİLDE BALON KARTIN ALTINA DÖNER — ölçüldü, 390'da kaynak da öyle
   yapıyor (kart üstünde yer kalmıyor). Tek kural değil, İKİ DAL. */
@media (max-width:640px){
  .rozet-ipucu{ bottom:auto; top:calc(100% + 10px); transform:translate(-50%, -6px); }
}
.rozet-ipucu .nasil{
  /* İki satıra sarınca ikon ÜSTTE kalır, ortada değil (ölçüldü:
     FIT `flex-start`). "Nasıl kazanılır" metni uzun ve sık sarıyor. */
  display:flex; align-items:flex-start; gap:var(--bosluk-7);
  padding-top:var(--bosluk-8); margin-top:var(--bosluk-8);
  /* Üst çizgi `--dip-cizgi` (.20) DEĞİL `--koyu-cizgi` (.12) — ikisi
     aynı ailede ama alfaları ayrı, ölçüldü. */
  border-top:var(--cizgi-1) solid var(--koyu-cizgi);
  font-size:var(--yazi-11); font-weight:var(--agirlik-orta); color:var(--aksan-parlak);
}
/* 🔴 AD KANONUN ADI DEĞİLDİ. Kural `.kademe` yazıyordu, markup ve ölçüm
   çifti `.ipucu-kademe` kullanıyor — yani kural HİÇBİR ELEMANA DEĞMİYORDU
   ve balonun kademe etiketi tarayıcı varsayılanıyla (13.33px/400) çiziliyordu.
   §10 md.7'nin ("kanon adı ile kaynak adı karışır") kanon içi hâli:
   burada karışan kaynak adı değil, kanonun KENDİ iki adı.
   ⚠ Bu kural bir tur önce "bugün tüketicisiz ama bilerek duruyor" diye
   kaydedilmişti — tüketicisiz değilmiş, ADI YANLIŞMIŞ. "Ölü kural"
   teşhisi koymadan önce adın markup'takiyle aynı olduğu doğrulanmalı.
   Ölçüm (`.tip-rank`): inline-flex · gap 5 · üst pay 8 · 9.5/800 ·
   .05em · uppercase. */
/* 🔴 KANONDA HİÇ TANIMLI DEĞİLDİ (grep → 0). Bir tur önce `.kademe` adıyla
   yazılıydı ve markup `.ipucu-kademe` çağırıyordu; ad düzeltilince eksik
   bildirimler de görüldü. Ölçüm (FIT `.tip-rank`): 1440 ve 390'da
   BİREBİR AYNI — mobil dalı yok (slot-2 iki kipte de ölçtü). */
.ipucu-kademe{
  display:inline-flex; align-items:center; gap:var(--bosluk-5);
  margin-top:var(--bosluk-8);
  font-size:9.5px; font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-etiket-3); text-transform:uppercase;
  color:var(--aksan-parlak);
}

/* ---- KOYU ÖZET KARTI (R7) -------------------------------------------
   Kaynak `.fp-card.is-dark` + `.fp-head` · `.fp-badge` · `> b` · `p` ·
   `.fp-meta`. Puan panelinin tepesinde duran koyu kutu.

   🔴 §1 `.kart` DEĞİL ve bu ÖLÇÜMLE ÇÜRÜTÜLDÜ: slot-2 ilk yazımda
   `.kart.panel.ozet-koyu` diye sarmıştı, ölçüm sekiz bildirimde ayrıştı.
   Kart kağıt zemin · hairline · 24px yuvarlak yazıyor; bu kutu gradyan
   zemin · alfalı kenar · 16px yuvarlak ve kendi başlık ızgarasını
   taşıyor. Ortak ata yok, ayrı bileşen.

   ⚠ Gradyanın yeşil ucu `--koyu-zemin-yesil` — token katmanında
   gerekçesiyle duruyor; Diyet karşılığı DOĞRULA notlu.
   ===================================================================== */
.ozet-karti{
  padding:var(--bosluk-24) var(--bosluk-26);
  border-radius:var(--yuvarlak-lg);
  /* 🔴 KARTIN KENDİ KENARLIĞI ŞEFFAF. Kaynak (`.fp-card.is-dark`) kenar
     rengi bildirmiyor; beyaz alfa YALNIZ başlık şeridinin ALTINDA.
     Kanon `--koyu-cizgi`yi kartın DÖRT kenarına yazmıştı — koyu kutunun
     çevresine beyaz bir çerçeve çiziyordu. */
  border:var(--cizgi-1) solid transparent;
  background-image:linear-gradient(160deg, var(--koyu-zemin-yesil), var(--koyu-zemin));
  color:var(--kagit);
  box-shadow:var(--golge-sm);
}
/* 🔴🔴 §63d · TABAN AÇIK KART, KOYU HÂL VARYANT — ölçüldü 2026-09-03.
   Bu bloğun ilk yazımı `.ozet-bas`ı YALNIZ KOYU karttan ölçmüş ve koyu
   değerleri TABAN yazmıştı (kendi şerhi de öyle diyor: "Gözle bulundu").
   Bedeli iki yönlü ölçüldü:
     · harita `fp-head → ozet-bas` etkinken 23 AÇIK kartın başlığı
       BEYAZ ÜSTÜNE BEYAZ oldu (kontrast 1.00 ↔ donör 16.64)
     · eşlemeyi sökünce 23'ü düzeldi ama TEK KOYU kart KOYU ÜSTÜNE KOYU
       oldu (h3 rgb(33,30,22) ↔ donör rgb(255,255,255), kontrast ~1:1)
   İkisi de aynı kökten: taban yanlış katmanda. Eşlemeyi sökmek kusuru
   TAŞIR, çözmez — `.ozet-bas` bir daha kullanıldığı gün geri gelir.
   Artık taban AÇIK, koyu hâl `.ozet-karti` kapsamasıyla geliyor.
   ⚠ Kaynağın DÖRT koyu kuralı da `.fp-card.is-dark` BİLEŞİĞİNE bağlı
     (`fit-shell.css:2276·2280·2283·2285`); harita `is-dark → ozet-karti`
     çevirdiği için kapsama kanonda `.ozet-karti` üzerinden kurulur. */
.ozet-bas{
  display:flex; justify-content:space-between; align-items:flex-start;
  gap:var(--bosluk-14);
  padding-bottom:var(--bosluk-14); margin-bottom:var(--bosluk-16);
  border-bottom:var(--cizgi-1) solid var(--cizgi);      /* AÇIK taban */
}
.ozet-karti .ozet-bas{ border-bottom-color:var(--koyu-cizgi); }   /* KOYU varyant */
.ozet-karti .ozet-bas h3{ color:var(--kagit); }                   /* KOYU varyant */
/* Başlığın ikon karosu — kaynakta 34×34, açık kartta marka yıkaması,
   koyu kartta markanın alfalı hâli (`fit-shell.css:2283`). Kanonda
   `h3 i` kuralı HİÇ YOKTU: ikon karosunu kaybediyordu (34×34 → 13×18,
   zemin saydam, yuvarlak 0). */
.ozet-bas h3 i{
  flex:none; width:34px; height:34px; border-radius:var(--yuvarlak-md);
  display:grid; place-items:center; font-size:var(--yazi-14);
  background:var(--aksan-yikama); color:var(--aksan-murekkep);
}
.ozet-karti .ozet-bas h3 i{
  background:var(--aksan-cizgi-3); color:var(--aksan-parlak);
}
/* Koyu kartın torun metinleri — kanonun karşılığı ÇOCUK seçiciydi
   (`.ozet-karti>p`) ve kaynağın `.pp-onay p`si TORUN olduğu için
   eşleşmiyordu (`kapi-iskelet` K4'ün üç ekranda tekrarlayan
   `rgba(255,255,255,.74) ≠ .78` kırmızısının kökü buydu). */
.ozet-karti p,
.ozet-karti .kart-sayac{ color:var(--koyu-metin-6); }
.ozet-bas h3{
  display:flex; align-items:center; gap:var(--bosluk-10);
  font-size:var(--yazi-17-5); font-weight:var(--agirlik-kalin);
  line-height:1.12; letter-spacing:var(--aralik-baslik);
  /* 🔴 KOYU ZEMİNDE KOYU METİN — kontrast 1:1, başlık OKUNMUYORDU.
     Kartın kendisi `color:--kagit` yazıyor ama `h3` kabuğun kendi
     başlık rengini (`--murekkep`) alıyor ve mirası kesiyor.
     Geometri ve tipografi birebir tuttuğu için kural "yazıldı" görünüyordu;
     eksik olan tek satır buydu. Gözle bulundu (slot-2), ölçüm göremiyordu
     çünkü `.ozet-bas h3` çifti yeni eklendi. */
  color:var(--murekkep);
}
.ozet-karti>b{
  /* ⚠ `display:block` DENENDİ VE ÖLÇÜM ÇÜRÜTTÜ: kaynak `inline` bırakıyor
     ve satır kutusu içinde çiziliyor (bu yüzden 1.55 satır boyu görünür
     bir pay üretiyor — blok yapılınca o pay kayboluyordu). */
  font-size:var(--yazi-32); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-govde); letter-spacing:var(--aralik-baslik);
  color:var(--kagit);
}
.ozet-karti>p{
  margin-top:var(--bosluk-6);
  font-size:var(--yazi-16); font-weight:var(--agirlik-govde);
  color:var(--koyu-metin-6);
  text-align:left; text-align-last:auto;    /* B36 — 1 kalem yaslanıyordu */
}
/* 🔴 §63d'NİN ÜÇÜNCÜ ÖRNEĞİ — ölçüldü 2026-09-03 (slot-program bildirdi,
   lead kaynaktan doğruladı). Kanon buraya da KOYU kartın rengini TABAN
   yazmıştı; açık kartta beyaz-üstüne-beyaz oluyordu. Kaynak iki katmanı
   AÇIKÇA ayırıyor (`fit-shell.css`):
       .fp-meta   { color:var(--muted) }              ← TABAN
       .fp-meta b { color:var(--slate) }              ← TABAN
       (.is-dark) .fp-meta   { color:rgba(255,255,255,.74) }   ← KOYU
       (.is-dark) .fp-meta b { color:#fff }                    ← KOYU
   Üç örnek aynı kalıptan çıktı (`.ozet-bas` · `.ozet-bas h3` · `.ozet-kunye`):
   koyu özet kartı kanona TEK ÖLÇÜM olarak girmiş ve o ölçüm taban sayılmış.
   §63d'nin kaydı bu yüzden bir bileşen notu değil, bir YÖNTEM notudur:
   bir bileşen tek yüzeyde ölçüldüyse TABANI ölçülmüş sayılmaz. */
.ozet-kunye{
  display:flex; flex-wrap:wrap; gap:var(--bosluk-18); margin-top:var(--bosluk-12);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil);                                   /* AÇIK taban */
}
.ozet-kunye span b{ font-size:var(--yazi-12-5); font-weight:var(--agirlik-ekstra); color:var(--murekkep); }
.ozet-karti .ozet-kunye{ color:var(--koyu-metin-6); }           /* KOYU varyant */
.ozet-karti .ozet-kunye span b{ color:var(--kagit); }

/* ---- GALERİ SÜZGEÇ ŞERİDİ ------------------------------------------- */
.galeri-ozet{ display:flex; align-items:center; flex-wrap:wrap; gap:var(--bosluk-10); margin-bottom:var(--bosluk-12); }
.galeri-hap{
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  padding:var(--bosluk-8) var(--bosluk-15); border-radius:var(--yuvarlak-hap);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta); color:var(--murekkep-yumusak);
}
/* Hapın içindeki sayı ve üç durum ikonu. Ölçüldü (slot-2): sayı 800
   (kabuğun `b{font-weight:900}`i sızıyordu), ikonlar 12px ve satır boyu
   KİLİTLİ (12px = 1) — hapın yüksekliğini yazı değil dolgu belirlesin. */
.galeri-hap b{ font-size:var(--yazi-13); font-weight:var(--agirlik-ekstra); color:var(--murekkep); }
.galeri-hap i{ font-size:var(--yazi-12); line-height:1; }
/* 🔴 HAP İKONU DURUMU RENKLE AYIRIYOR — kanon üçünü de tek griye
   bağlamıştı. Kazanılan yeşil · yolda petrol · ölçüsüz gri.
   ⚠ `--eko-akademi`nin (#006072) İKİNCİ tüketicisi: §5.1'de "Açık talep"
   hapı için kanona alınmıştı, burada rozet galerisinde tekrar çıktı.
   Petrol rampasının sistemsel olduğunu doğruluyor (slot-2). */
.hap-kazanildi{ color:var(--aksan-koyu); }
.hap-yolda{     color:var(--eko-akademi); }
.hap-olcusuz{   color:var(--metin-ikincil); }

.galeri-not{
  /* Okuma genişliği — kaynağın ölçülen sınırı, iki kipte de aynı
     (551.25px @1440 ve @390). Türetilmiş bir birimden geliyor (kesirli
     piksel) ama hangi birim olduğu ölçümden okunamıyor; çizimi birebir
     veren uzunluk yazıldı. §23'ün 860px'i ve §59'un 880px'iyle aynı
     aile: okuma kolonu ölçüsü, boşluk değil. */
  max-width:551.25px;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}
.galeri-suzgec{
  /* 🔴 ZEMİN DÜZ DEĞİL, GRADYAN. Kaynak yıkamadan kâğıda %80'de geçen
     120°'lik bir gradyan basıyor; kanonda hiç yoktu ve ölçüm görmüyordu
     (`backgroundImage` OZ listesinde değildi — dördüncü kör nokta). */
  background-image:linear-gradient(120deg, var(--aksan-yikama-2), var(--kagit) 80%);
  display:flex; align-items:center; gap:var(--bosluk-12);
  padding:var(--bosluk-13) var(--bosluk-18); margin-bottom:var(--bosluk-22);
  border-radius:var(--yuvarlak-md); border:var(--cizgi-1) solid var(--aksan-cizgi-3);
}
/* R9 · şeridin üç parçası. Kap yazılıydı, çocukları değildi — 13 🔴.
   Ölçüm: slot-2, şerit AÇIKKEN @1440; mobil dalı YOK (iki kipte aynı). */
.suzgec-ikon{
  flex:none; width:34px; height:34px; border-radius:var(--yuvarlak-sm);
  display:grid; place-items:center;
  font-size:var(--yazi-14);
  background:var(--aksan); color:var(--kagit);
}
.suzgec-metin{
  /* `min-width:0` şart: esnek kalemin `auto` tabanı uzun aile adında
     şeridi taşırıyor (§60'ın `.arama-girdi-kap`ıyla aynı düzeltme). */
  /* Masaüstünde taban 0% (düz `flex:1`); DAR EKRANDA kaynak tabanı
     `calc(100% - 46px)`e çekiyor — 46 = ikonun 34'ü + şeridin 12px
     boşluğu — ve metin şeridi sarınca tam satırı kapıyor. İlk yazımda
     calc TABANA konmuştu, ölçüm masaüstünde çürüttü. Mobil dal aşağıda. */
  flex:1; min-width:0;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta);
  line-height:var(--satir-govde);
}
.suzgec-metin b{ font-size:var(--yazi-13-5); font-weight:var(--agirlik-ekstra); color:var(--aksan); }
.suzgec-metin small{
  display:block; margin-top:1px;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--murekkep-yumusak);
}

/* §48'İN DÖRDÜNCÜ BOYU DEĞİL, İKİNCİ KİPİ. Kaynak `.fpx-bos`ı çoğu
   ekranda `.fp-card` ile SARIYOR ve o zaman dolgu değişiyor:
     odemelerim-v1     .fpx-bos          44px 20px 38px   çıplak
     rozetlerim-v1     .fp-card.fpx-bos  38px 24px        kartlı
     egzersizlerim-v1  aynı · challengelarim-v1 aynı
   Üç ekranda kartlı, bir ekranda çıplak; ikon (56 · daire · 21px) ve
   `gap:10` ikisinde de aynı. slot-3'ün ölçümü YANLIŞ DEĞİL, EKSİKTİ —
   kendi ekranındaki hâli doğru ölçmüş, kardeş kip görülmemişti.
   `.sekmeler.ortali`/`.dt` ve `.pc-foot` block/flex ile aynı aile. */
.kart.bos-durum.plan-ici{ padding:var(--bosluk-38) var(--bosluk-24); }

.galeri-cipler{ display:flex; flex-wrap:wrap; gap:var(--bosluk-8); margin-bottom:var(--bosluk-22); }
.galeri-temizle{
  /* Şeridin sağ ucunda, DARALMAZ ve yazısı ortalı — geometrisi
     (12.5/700 · 8/14 · radius 8 · min-height 44) zaten tutuyordu,
     eksik olan bu iki bildirimdi (slot-2 R9). */
  flex:none; justify-content:center;
  display:inline-flex; align-items:center; gap:var(--bosluk-7); min-height:44px;
  padding:var(--bosluk-8) var(--bosluk-14); border-radius:var(--yuvarlak-sm);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  font-family:inherit; font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); cursor:pointer;
}

@media (max-width:640px){
  /* R7'nin TEK mobil farkı — dolgu daralır, gerisi aynı (slot-2 ölçtü). */
  .ozet-karti{ padding:var(--bosluk-20) var(--bosluk-18); }
  /* Süzgeç metni dar ekranda TAM SATIR kapar (kap `flex-wrap:wrap`). */
  .suzgec-metin{ flex-basis:calc(100% - 46px); }
  .siralama-satir{ padding:var(--bosluk-13) var(--bosluk-15); gap:var(--bosluk-11); }
  .puan-izgara,
  .rozet-izgara{ grid-template-columns:1fr; }
  .merdiven{ grid-template-columns:repeat(2,1fr); }
  .galeri-suzgec{ flex-wrap:wrap; }
  .galeri-temizle{ margin-left:46px; }
}


/* =====================================================================
   62 · SOHBET PANELİ — kaynak `.msj-*` (`fit-mesaj.css` · `fit-mesaj.js`)
   ---------------------------------------------------------------------
   Sağdan kayan yazışma paneli + onu açan yüzen düğme. Kaynak bunu KENDİ
   KENDİNE YETEN bir modül olarak yazmış: kabuğun dosyalarına dokunmuyor,
   kendi `<link>`ini ve DOM'unu enjekte ediyor, `.fb-*` modal kitiyle
   çakışacak tek bir ad kullanmıyor (hepsi tek önekli). Kanon aynı sınırı
   korur — §26'nın yüzen düğmeleriyle aynı köşede yaşar ama ayrı kalemdir.

   Ölçüm: render edilmiş DOM @1440 (`dump/fit-render/sohbet-panel.html`).
   Panel `hidden` doğduğu ve iki koşula bağlı olduğu için ölçüm ayrı bir
   betikle alındı (`scripts/olcum/sohbet-render.mjs`): kabuğun kendi
   `?auth=1` yolu + kabuğun kendi `state.write()`i ile randevu tohumu.
   ⚠ localStorage'a elle anahtar yazmak İŞE YARAMIYOR — kabuk `dm_user`
   içindeki `auth` bayrağına bakıyor; iki tur bu tuzağa gidildi.

   YAPI — sıra değişmez:
     .sohbet-ortu            arkadaki perde
     .sohbet-panel           sağdan kayan yüzey
       .sohbet-bas           monogram + kişi adı + durum + tam ekran + kapat
       .sohbet-kisiler       kişi seçici şeridi
       .sohbet-uyari         maket dürüstlük satırı
       .sohbet-akis          gün ayracı + baloncuklar
       .sohbet-yaz           ek + girdi + gönder
         .sohbet-kunye       dosya eki dürüstlük satırı
     .sohbet-dugme           yüzen açma düğmesi (+ sayaç rozeti)

   🔴 ÜÇ DÜRÜSTLÜK KURALI — kaynağın kendi sözleşmesi, kanon taşır:
     1 · KARŞI TARAF CEVAP ÜRETMEZ. "yazıyor…", gecikmeli otomatik yanıt,
         okundu tiki YOKTUR. Karşıda kimse yok ve ekran bunu söylüyor.
     2 · AÇILIŞ ÖRNEĞİ DEPOYA YAZILMAZ ve her balonu "Örnek" rozeti taşır.
     3 · DOSYA EKİ: ad · boyut · tür gerçekten okunur ve kaydedilir,
         DOSYANIN KENDİSİ hiçbir yere yüklenmez — `.sohbet-kunye` bunu
         yazıyla söyler. "Yükleniyormuş gibi yapan" çubuk YOKTUR.
   ===================================================================== */

.sohbet-ortu{
  position:fixed; inset:0; z-index:var(--kat-sohbet-ortu);
  background:var(--perde);
  opacity:0; visibility:hidden;
  transition:opacity var(--sure-yavas) var(--yumusama), visibility var(--sure-yavas);
}
.sohbet-ortu.acik{ opacity:1; visibility:visible; }

.sohbet-panel{
  position:fixed; top:0; right:0; bottom:0; z-index:var(--kat-sohbet);
  width:min(420px,100%);
  display:flex; flex-direction:column;
  background:var(--kagit); box-shadow:var(--golge-lg);
  transform:translateX(100%); visibility:hidden;
  transition:transform var(--sure-agir) var(--yumusama), visibility var(--sure-agir);
}
.sohbet-panel.acik{ transform:translateX(0); visibility:visible; }

/* ---- BAŞLIK — panelin adını değil KONUŞULAN KİŞİYİ taşır ------------ */
.sohbet-bas{
  display:flex; align-items:center; gap:var(--bosluk-10);
  padding:var(--bosluk-14) var(--bosluk-16);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.sohbet-bas-kimlik{ flex:1; min-width:0; }
.sohbet-bas-kimlik h2{
  font-size:var(--yazi-17-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-baslik);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.sohbet-bas-alt{
  margin-top:2px;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  text-align:left; text-align-last:auto;    /* B36 */
}
/* Monogram — antrenör avatarı UYDURULMAZ: randevu kaydında görsel alanı
   yok, o yüzden adın baş harfi basılır (kaynağın kendi kuralı). */
.sohbet-mono{
  flex:none; width:34px; height:34px; border-radius:var(--yuvarlak-daire);
  display:grid; place-items:center;
  font-size:var(--yazi-13); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-genis);
  /* Taban YIKAMA; SEÇİLİ çipte beyaza döner (çip zemini yıkama olduğu için
     monogram ondan ayrışsın diye). Kaynak ikisini de böyle basıyor. */
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  position:relative;                 /* onay rozetinin kabı */
}
.sohbet-kisi.secili .sohbet-mono{ background:var(--kagit); }
.sohbet-mono.buyuk{
  width:44px; height:44px; font-size:var(--yazi-15);
  background:var(--aksan-yikama);
}
/* Onay rozeti — randevu/görüşme ONAYLANDIĞINDA monogramın köşesinde
   yeşil nokta. Kaynağın kendi işareti (`.msj-mono.ok::after`); beyaz
   kenar rozeti monogramdan ayırır, ikisi de aynı yuvarlaklıkta. */
/* 🔴 DURUM NOKTASI DÖRT HÂLLİ, İKİ DEĞİL. Kanon `.onayli` diye tek
   boolean yazmıştı; kaynağın kiti dört durum taşıyor ve rozet HER
   monogramda basılıyor — hangi renkte olacağını durum belirliyor:
     .ok   onaylandı        --aksan-koyu
     .bekleme bekliyor      --altin-metin
     .pasif  kapalı         --metin-ikincil
     .durdu  iptal/durdu    --tehlike-koyu
   Ölçüldü (`fit-mesaj.css:206-214`, render doğrulamalı): kutu 11×11 ·
   2px kâğıt kenar · sağ/alt −2 · daire. Geometri kanonda zaten doğruydu,
   eksik olan DURUM AİLESİydi ve rozetin koşulsuz basılması.
   ⚠ Beyar gözle bildirdi: "FIT'te ikisinde de sağ altta durum noktası
   var." Kaynağın iki çipi de `.msj-mono.ok` taşıyor; kanon ikincisine
   `data-onayli="0"` verip rozeti hiç basmıyordu — yani "onaylı değil"i
   "durumu yok" diye çizmişti. Durum hep vardır, rengi değişir. */
.sohbet-mono::after{
  content:""; position:absolute; right:-2px; bottom:-2px;
  width:11px; height:11px; border-radius:var(--yuvarlak-daire);
  border:2px solid var(--kagit);
  background:var(--metin-ikincil);        /* durum verilmezse nötr */
}
.sohbet-mono.ok::after{       background:var(--aksan-koyu); }
.sohbet-mono.bekleme::after{  background:var(--altin-metin); }
.sohbet-mono.pasif::after{    background:var(--metin-ikincil); }
.sohbet-mono.durdu::after{    background:var(--tehlike-koyu); }
.sohbet-mono.buyuk::after{ right:-1px; bottom:-1px; width:13px; height:13px; }
/* 🔴 `.msj-tumu` AYRI BİR BİLEŞEN, `.btn`in varyantı DEĞİL — kanon onu
   §2'nin `.dugme.ikon`una bağlayınca metin düğmesinin kutusunu ve
   tipografisini miras aldı. Geometri (44x44 · yuvarlak · kenar · zemin)
   zaten doğruydu, ama sekiz bildirim ayrışıyordu (ölçüldü @1440):
     dolgu 14/26 ↔ 0 · gap 10 ↔ normal · min-height 44 ↔ auto
     yaslama center ↔ start · 14.5/700 ↔ 14/500 · satır 22.475 ↔ 21.7
   Görünür fark üretmiyordu (ikon `place-items:center` ile ortalanıyor)
   ama bileşen sınırı yanlıştı; `bildirimler`in `.dugme.cam.ikon`
   kaleminin aynısı. Kaynak: `fit-mesaj.css:145`. */
.sohbet-bas .dugme.ikon{
  padding:0; min-height:auto; gap:normal;
  justify-content:normal; text-align:start;
  font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde);
}
.sohbet-bas .dugme.ikon,
.sohbet-kapat{
  flex:none; width:44px; height:44px;
  display:grid; place-items:center;
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  color:var(--murekkep-yumusak); cursor:pointer; font-family:inherit;
}
.sohbet-kapat{ font-size:var(--yazi-16); }
.sohbet-kapat:hover{ border-color:var(--aksan); color:var(--aksan); }
.sohbet-kapat:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan-yikama); outline-offset:var(--odak-ofset);
}

/* ---- KİŞİ SEÇİCİ ---------------------------------------------------- */
.sohbet-kisiler{
  display:flex; gap:var(--bosluk-8);
  padding:var(--bosluk-12) var(--bosluk-20);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
  overflow-x:auto; scrollbar-width:none;
}
.sohbet-kisiler::-webkit-scrollbar{ display:none; }
.sohbet-kisi{
  flex:none; display:flex; align-items:center; gap:var(--bosluk-9);
  min-height:44px; padding:var(--bosluk-5) var(--bosluk-14) var(--bosluk-5) var(--bosluk-5);
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  /* Seçili DEĞİLKEN yumuşak mürekkep, seçiliyken aksan — kaynağın iki
     rengi de ölçüldü (86,81,74 ↔ 0,122,61). Kanon `--murekkep` basıyordu
     ve iki durum ayrışmıyordu. */
  color:var(--murekkep-yumusak); cursor:pointer; white-space:nowrap;
}
.sohbet-kisi.secili{
  background:var(--aksan-yikama); border-color:var(--aksan-koyu);
  color:var(--aksan-koyu);
}
/* Okunmamış noktası — kişinin yanında, sayı değil VARLIK bildirir. */
.sohbet-nokta{
  flex:none; width:8px; height:8px; border-radius:var(--yuvarlak-hap);
  background:var(--bildirim-sil);
}

/* ---- MAKET DÜRÜSTLÜK SATIRI ----------------------------------------
   🔴 YANLIŞ KAYNAK ELEMANI EŞLENMİŞTİ. Kanon bunu `.msj-uyari`ya
   bağlamıştı — o, panelin DİBİNDEKİ "depolama kapalı" uyarısı: düz
   kırmızı metin, kutusuz, ikonsuz (`fit-mesaj.css:370`).
   Panelin ÜSTÜNDEKİ maket dürüstlük satırı bambaşka bir kalem:
     <div class="hr-note"><i class="fa-solid fa-flask"></i><p>…</p></div>
   yani kaynağın `.hr-note`u = kanonun §16 `.bilgi-notu`su — aksan
   yıkamalı KUTU, solda deney şişesi ikonu. Beyar gözle bildirdi.
   ⚠ İki uyarı iki ayrı şey: biri "bu ekran maket" (üstte, bilgi kutusu),
   öbürü "depolama kapalı" (dibte, kırmızı satır). Kanon ikisini tek ada
   indirmişti — "iki kaynak sınıfı tek ada indi" dersinin YEDİNCİ örneği,
   ve bu seferki iki AYRI KİPİ birleştirmiş.
   Maket satırı artık §16'yı kullanır; aşağıdaki kural yalnız DİPTEKİ
   depolama uyarısında kalır. */
/* Maket dürüstlük notu §16 `.bilgi-notu`dur; panelin dar kolonunda kaynak
   onu yeniden ölçüyor: üst payı sıfır, köşe yok, yan kenar yok — kutu iki
   kenara dayanır. Yeni sınıf ÜRETİLMEZ (kaynağın kendi kararı). */
.sohbet-panel .bilgi-notu{
  flex:none; margin-top:0; border-radius:0;
  border-left:none; border-right:none;
  padding:var(--bosluk-14) var(--bosluk-20);
}
.sohbet-panel .bilgi-notu p{
  font-size:var(--yazi-13); line-height:var(--satir-govde);
}

.sohbet-depo-uyari{
  margin-top:var(--bosluk-9);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  line-height:var(--satir-orta); color:var(--bildirim-sil);
  text-align:left; text-align-last:auto;    /* B36 */
}

/* ---- MESAJ AKIŞI ---------------------------------------------------- */
.sohbet-akis{
  flex:1; min-height:0; overflow-y:auto;
  display:flex; flex-direction:column; gap:var(--bosluk-10);
  padding:var(--bosluk-20); background:var(--zemin);
}
/* 🔴 AZ MESAJ VARKEN YAZIŞMA DİBE YASLANIR, tepede asılı kalmaz.
   Kaynağın kendi şerhi gerekçesini de yazıyor (`fit-mesaj.css:245-250`):
   `justify-content:flex-end` taşan kabın TEPESİNİ kırpar; ilk kalemin
   `margin-top:auto`su boşluk varken iter, taşarken hiçbir şey yapmaz.
   Ölçüldü: FIT ilk gün ayracı `margin-top:389.578px` (auto çözülmüş),
   kanon 4px — yazışma tepede duruyordu.
   ⚠ Kural ilk kalemin AKIŞIN İÇİNDE olmasına bağlı: maket dürüstlük
   satırı `.sohbet-uyari` akışın DIŞINDA durmalı (§62'nin kendi yapı
   listesi zaten böyle diyor; markup bunu çiğniyordu, düzeltildi). */
.sohbet-akis > .sohbet-gun:first-child,
.sohbet-akis > .sohbet-balon:first-child{ margin-top:auto; }
.sohbet-gun{
  align-self:center;
  padding:var(--bosluk-4) var(--bosluk-10); margin:var(--bosluk-4) 0 2px;
  border-radius:var(--yuvarlak-sm);
  background:var(--zemin-2); border:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-genis); color:var(--murekkep-yumusak);
}
/* 🔴 HİZA VE RENK BİRLİKTE — kaynağın kendi şerhi: "tek başına hiza da
   tek başına renk de yeterli değil". Yön iki sinyalle okunur. */
.sohbet-balon{
  max-width:78%; padding:var(--bosluk-12) var(--bosluk-14);
  border:var(--cizgi-1) solid; border-radius:var(--yuvarlak-md);
  font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  line-height:var(--satir-genis); color:var(--murekkep);
  overflow-wrap:anywhere;
  text-align:left; text-align-last:auto;    /* B36 */
}
.sohbet-balon p{ margin:0; color:inherit; font-size:inherit; line-height:inherit; }
.sohbet-balon.uye{
  align-self:flex-end;
  background:var(--aksan-yikama); border-color:var(--aksan-cizgi);
  border-bottom-right-radius:var(--yuvarlak-sm);
}
.sohbet-balon.karsi{
  align-self:flex-start;
  background:var(--kagit); border-color:var(--cizgi);
  border-bottom-left-radius:var(--yuvarlak-sm);
}
/* Künyenin içindeki rozet KÜÇÜLÜR — kaynağın kendi kapsamlı kuralı
   (`fit-mesaj.css:282`). Balon dar, taban rozet orada büyük kalıyor. */
.sohbet-kunye .rozet{
  font-size:var(--yazi-10-5); padding:3px var(--bosluk-8);
}

.sohbet-ipucu{
  margin-top:var(--bosluk-8);
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;    /* B36 */
}
/* Balonun künyesi — saat ve "Örnek" rozeti. */
.sohbet-balon .kunye{
  display:flex; align-items:center; gap:var(--bosluk-8); flex-wrap:wrap;
  margin-top:var(--bosluk-7);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep-yumusak);
}
.sohbet-balon .kunye .rozet{ font-size:var(--yazi-10-5); padding:3px var(--bosluk-8); }

/* Dosya eki künyesi — GERÇEK ad ve GERÇEK boyut (dürüstlük kuralı 3). */
.sohbet-ek{
  display:inline-flex; align-items:center; gap:var(--bosluk-9);
  max-width:100%; margin-top:var(--bosluk-9);
  padding:var(--bosluk-9) var(--bosluk-12);
  border-radius:var(--yuvarlak-sm);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta); color:var(--murekkep-yumusak);
}
.sohbet-balon.karsi .sohbet-ek{ background:var(--zemin); }
.sohbet-ek i{ color:var(--aksan-koyu); font-size:var(--yazi-13); flex:none; }
.sohbet-ek b{ font-weight:var(--agirlik-kalin); color:var(--murekkep); overflow-wrap:anywhere; }
.sohbet-ek small{ font-weight:var(--agirlik-orta); color:var(--metin-ikincil); }

/* ---- YAZMA ALANI ---------------------------------------------------- */
.sohbet-yaz{
  padding:var(--bosluk-14) var(--bosluk-16);
  border-top:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
}
.sohbet-yaz-satir{ display:flex; align-items:flex-end; gap:var(--bosluk-8); }
.sohbet-yaz textarea{
  flex:1; min-width:0; resize:none;
  min-height:44px; max-height:120px; padding:var(--bosluk-12) var(--bosluk-14);
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
  font-family:inherit; font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  color:var(--murekkep); outline:none;
  text-align:left; text-align-last:auto;    /* B36 */
}
.sohbet-yaz textarea:focus{ border-color:var(--aksan-koyu); }
.sohbet-yaz textarea::placeholder{ color:var(--yer-tutucu); }
.sohbet-dugme-kucuk{
  flex:none; width:44px; height:44px;
  display:grid; place-items:center;
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  color:var(--murekkep-yumusak); font-size:var(--yazi-15);
  cursor:pointer; font-family:inherit;
}
/* Kaynak gönder düğmesine `border:none` yazıyor (`fit-mesaj.css:341`);
   kanon kenarı zemin rengine boyuyordu — çizim yakın, bildirim değil. */
.sohbet-dugme-kucuk.gonder{ background:var(--aksan-koyu); border:none; color:var(--kagit); }
.sohbet-dugme-kucuk:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan-yikama); outline-offset:var(--odak-ofset);
}
.sohbet-kunye{
  display:flex; align-items:center; gap:var(--bosluk-8); flex-wrap:wrap;
  margin-top:var(--bosluk-7);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;    /* B36 */
}

/* ---- YÜZEN AÇMA DÜĞMESİ --------------------------------------------
   §26'nın kenar kalemleriyle AYNI köşede yaşar; kaynağın şerhi istifi
   ölçmüş: `.basa-don` 92px'te başlıyor, bu 22'de — üst kenarı 78px,
   arada 14px. Kesişim yok.
   🔴 RANDEVUSU OLMAYAN ÜYEDE DÜĞME SOHBET AÇMAZ. Yuvarlak rozet yerine
   DOĞRUYU SÖYLEYEN bir satıra dönüşür ve antrenör listesine götürür —
   "Sohbet" yazıp boş panel açmak yalan olurdu (kaynağın kuralı). */
.sohbet-dugme{
  position:fixed; right:var(--bosluk-22); bottom:var(--bosluk-22);
  z-index:var(--kat-sohbet-dugme);
  width:56px; height:56px;
  display:inline-flex; align-items:center; justify-content:center; gap:var(--bosluk-10);
  border:none; border-radius:var(--yuvarlak-lg);
  background:var(--aksan-koyu); color:var(--kagit);
  font-family:inherit; font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-sik-2); text-align:left; text-decoration:none;
  box-shadow:var(--golge-yuzen); cursor:pointer;
  transition:background var(--sure-agir) var(--yumusama), transform var(--sure-agir) var(--yumusama);
}
.sohbet-dugme i{ font-size:var(--yazi-18); flex:none; }
.sohbet-dugme:hover{ background:var(--aksan-koyu-2); transform:translateY(-2px); }
.sohbet-dugme:focus-visible{ outline:var(--odak-kalinlik) solid var(--aksan-parlak); outline-offset:3px; }
.sohbet-dugme.bos{ width:auto; height:52px; padding:0 var(--bosluk-20); }
.sohbet-dugme.bos i{ font-size:var(--yazi-15); }
/* Okunmamış sayacı — §5 `.rozet.durdu` renkleriyle aynı, yeni renk yok. */
.sohbet-rozet{
  position:absolute; top:-6px; right:-6px;
  min-width:22px; height:22px; padding:0 var(--bosluk-6);
  display:inline-flex; align-items:center; justify-content:center;
  border-radius:var(--yuvarlak-sm);
  font-size:var(--yazi-11-5); font-weight:900; letter-spacing:var(--aralik-genis);
  background:var(--tehlike-yikama); color:var(--tehlike-koyu);
  border:var(--cizgi-1) solid var(--tehlike-cizgi-yumusak);
}
/* Alt şerit düğmenin üstüne bindiğinde çekilir — kabuğun "ekranda en
   fazla bir sabit alt şerit" kuralı. */
.sohbet-dugme.serit-altinda{ display:none; }

@media (max-width:640px){
  .sohbet-panel{ width:100%; }
  /* ≤640'ta bant DAR: alt bar 78px'te biter, `.basa-don` 148'te başlar →
     70px'lik boşluğa 56px'lik düğme oturur. 85 ikisine de EŞİT 7px pay
     bırakır (kaynak @390×844'te ölçmüş). */
  .sohbet-dugme{
    right:var(--bosluk-16);
    bottom:calc(85px + env(safe-area-inset-bottom,0px));
  }
  .sohbet-dugme.bos{
    max-width:calc(100vw - 32px); height:auto;
    padding:var(--bosluk-11) var(--bosluk-16);
    white-space:normal; line-height:var(--satir-sik);
  }
}
@media (prefers-reduced-motion:reduce){
  .sohbet-dugme{ transition:background var(--sure-hizli) linear; }
}


/* =====================================================================
   59 · BİLDİRİM AKIŞI — kaynak `.nt-*` / `.ntr-*`
   ---------------------------------------------------------------------
   Gün gruplarına bölünmüş bildirim listesi. Ölçüm: slot-1, @1440 ve @390.

   YAPI:
     .bildirim-kolonu          880px  ⚠ §23 `.okuma-kolonu` 860 — AYRI ölçü
       .gun-etiketi            versal gün başlığı, sağında hairline çizgi
       .bildirim-liste         kart kabuğu
         .bildirim-satir       ico|avatar + metin + [görsel] + [aksiyon]
                               + kalem işlemleri + okunmadı beneği
       .geri-al                silme/kapatma geri alma şeridi

   🔴 SATIR 390px'TE KIRILIYOR — KAYNAĞIN KUSURU, KANONUN DEĞİL.
   Kaynağın `@media(max-width:640px)` bloğu `.ntr-txt{flex:1 1 0}` tabanını
   YALNIZ aksiyonlu satıra veriyor (`:has(.ntr-act)`); aksiyonsuz satırda
   taban 0 kalıyor ve `flex-wrap:wrap` ile metin min-content'e çöküyor —
   ölçüldü: metin kolonu 35px, satır 84→399px. Kaynağın kendi şerhi
   kapsamı bilerek daralttığını yazıyor ("tüm satırlara verilince
   görselli satırlarda `.ntr-th` ve `.ntr-dot` alt satıra sarıp sola
   yığılıyordu") — yani yazar iki kusurdan birini seçmiş.
   KANON KAYNAĞIN HÂLİNİ BASAR (slot-1 K6, ekran görüntüsüyle bildirildi).
   ===================================================================== */

/* 🔴 GÖVDE NEFESİ ASİMETRİK — ne `.bolum` ne `.bolum.sik` uyuyor.
   Kaynak `.nt-body` üstte 32 · altta 74 basıyor (@390: 22 · 44) — yani
   üst `--bolum-nefes-sik`, alt `--bolum-nefes`. `.bolum` 74/74,
   `.bolum.sik` 32/32; ikisi de yanlış. İki token zaten kademeli olduğu
   için mobil dal AYRICA yazılmaz, kendiliğinden düşer. (slot-1 ④)
   ⚠ Sınıf dikişin ÜSTÜNE değil, aynı elemana verilir: `.dikis` yalnız
   köşe ve binme yazar, dolgu gövdenin kendi kalemidir. */
/* 🔴 DİKİŞ TAŞIYICISI BOYAMAK ZORUNDA — ölçüldü, 2026-09-03 (B6).
   Beyar gözle gördü: "fit-bildirimler'de beyaz panelin üst köşesi
   radiussuz". Kutu `--dikis-r` (22px) yuvarlağını ve `-22px` binmesini
   ZATEN taşıyordu; görünmüyordu çünkü SAYDAMDI — yuvarlatılan köşe
   boyanmayan bir kutuda çizilmez, arkadaki katman kare kalır.
   KAYNAKTAN ÖLÇÜLDÜ, uydurulmadı: `bildirimler-v1.html?auth=1`
   çalışma anında `.nt-body` = `background rgb(249,249,249)` · radius 22
   · margin-top -22. Yani kaynak boyuyor. Bizde kural adla koptu:
   gövde `nt-body → bildirim-govde` çevrildi, kaynağın `.nt-body{...}`
   kuralı artık hiçbir şeye tutunmuyor (§S19'un `.fp-head .fp-act`
   kusurunun kardeşi — ÇEVİRİ KOPARDI).
   Renk yeniden ölçülmedi: rgb(249,249,249) = `--zemin`. */
.bildirim-govde{
  padding:var(--bolum-nefes-sik) 0 var(--bolum-nefes);
  background:var(--zemin);
}

.bildirim-kolonu{ max-width:880px; margin:0 auto; }

.gun-etiketi{
  display:flex; align-items:center; gap:var(--bosluk-12);
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-muhur); text-transform:uppercase;
  color:var(--metin-ikincil); margin:var(--bosluk-26) 0 var(--bosluk-12);
}
.gun-etiketi::after{ content:""; flex:1; height:1px; background:var(--cizgi); }
.bildirim-kolonu>.gun-etiketi:first-child{ margin-top:0; }

.bildirim-liste{
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg); overflow:hidden; box-shadow:var(--golge-sm);
}

.bildirim-satir{
  position:relative; display:flex; align-items:center; gap:var(--bosluk-15);
  width:100%; text-align:left; font-family:inherit;
  background:var(--kagit); border:none;
  padding:var(--bosluk-16) var(--bosluk-20); cursor:pointer;
  transition:background var(--sure-agir) var(--yumusama);
}
.bildirim-satir+.bildirim-satir{ border-top:var(--cizgi-1) solid var(--cizgi); }
.bildirim-satir:hover{ background:var(--zemin); }
.bildirim-satir.okunmadi{ background:var(--bildirim-yeni); }
.bildirim-satir.okunmadi:hover{ background:var(--bildirim-yeni-2); }

.bs-ikon{
  flex:none; width:46px; height:46px; border-radius:var(--yuvarlak-md);
  display:grid; place-items:center; font-size:var(--yazi-17);
  background:var(--aksan-yikama); color:var(--aksan);
}
.bs-ikon.sistem{ background:var(--zemin); color:var(--murekkep-yumusak); }
.bs-avatar{
  flex:none; width:46px; height:46px; border-radius:var(--yuvarlak-daire);
  background-size:cover; background-position:center;
}
.bs-metin{ flex:1; min-width:0; }
/* 🔴 B36 — kaynak da bunu KENDİSİ yazıyor ve gerekçesini ölçmüş:
   "768/390'da yaslama 'Bu hafta 4 gün üst' gibi satırlarda kelime araları
   açıp nehir üretiyordu." Seçici (0,1,1), kabuğun `p{…justify}`sini
   (0,0,1) yükleme sırasından bağımsız yener. */
.bs-metin p{
  font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  line-height:var(--satir-orta); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto; hyphens:manual;
}
.bs-metin p b{ color:var(--murekkep); font-weight:var(--agirlik-kalin); }
.bs-meta{
  display:flex; align-items:center; gap:var(--bosluk-10);
  margin-top:var(--bosluk-4);
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
}
.bs-meta .tur{ display:inline-flex; align-items:center; gap:var(--bosluk-5); }
.bs-meta .tur i{ font-size:var(--yazi-10-5); color:var(--aksan); }
.bs-gorsel{
  flex:none; width:52px; height:52px; border-radius:var(--yuvarlak-md);
  background-size:cover; background-position:center;
}

/* Okunmadı beneği — halkası aksanın alfası, benek aksan. */
.bs-benek{
  flex:none; width:9px; height:9px; border-radius:var(--yuvarlak-daire);
  background:var(--aksan); box-shadow:0 0 0 3px var(--aksan-halka-2);
  opacity:0; transform:scale(.4);
  transition:var(--sure-yavas) var(--yumusama);
}
.bildirim-satir.okunmadi .bs-benek{ opacity:1; transform:scale(1); }

/* Satır aksiyonu (kaydet / kaydedildi) — kalem işlemlerinden AYRI. */
.bs-eylem{
  flex:none; font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-sm);
  padding:var(--bosluk-8) var(--bosluk-15);
  white-space:nowrap; cursor:pointer; font-family:inherit;
  transition:var(--sure) var(--yumusama);
}
.bs-eylem:hover{ border-color:var(--aksan); color:var(--aksan); background:var(--aksan-yikama); }
.bs-eylem.secili{ background:var(--aksan); border-color:var(--aksan); color:var(--kagit); }

/* ---- KALEM İŞLEMLERİ — satır başına dört ----------------------------
   Sessiz dururlar, satıra gelince ya da odaklanınca belirirler.
   🔴 DOKUNMATİKTE HER ZAMAN GÖRÜNÜR: `hover` yok, yoksa işlemler
   erişilemez kalırdı. Kaynağın kendi çözümü. */
.bs-islemler{
  flex:none; display:flex; align-items:center; gap:var(--bosluk-4);
  opacity:0; transition:opacity var(--sure-cabuk) var(--yumusama);
}
.bildirim-satir:hover .bs-islemler,
.bildirim-satir:focus-within .bs-islemler{ opacity:1; }
@media (hover:none),(pointer:coarse){ .bs-islemler{ opacity:1; } }
.bs-islem{
  display:grid; place-items:center; width:34px; height:34px; flex:none;
  border:var(--cizgi-1) solid transparent; border-radius:var(--yuvarlak-sm);
  background:none; color:var(--metin-ikincil); font-size:var(--yazi-13);
  font-family:inherit; text-decoration:none; cursor:pointer;
  transition:var(--sure-cabuk) var(--yumusama);
}
.bs-islem:hover{ background:var(--kagit); border-color:var(--cizgi); color:var(--murekkep); }
.bs-islem:focus-visible{
  opacity:1; outline:var(--odak-kalinlik) solid var(--aksan-yikama);
  outline-offset:1px; border-color:var(--aksan);
}
.bs-islem.sil:hover{ color:var(--bildirim-sil); border-color:var(--bildirim-sil-cizgi); }
.bildirim-satir.okunmadi .bs-islem.okundu{ color:var(--aksan); }
/* Okunmuş satırda "okundu işaretle" İŞLEVSİZ — gizlenir, yer tutmaz. */
.bildirim-satir:not(.okunmadi) .bs-islem.okundu{ display:none; }

/* ---- GERİ ALMA ŞERİDİ ----------------------------------------------
   Silme ve tür kapatma geri alınabilir; hiçbir şey sessizce kaybolmaz. */
.geri-al{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--bosluk-14); flex-wrap:wrap;
  margin:0 0 var(--bosluk-14); padding:var(--bosluk-13) var(--bosluk-18);
  border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama); border:var(--cizgi-1) solid var(--aksan-cizgi);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta); color:var(--murekkep);
  text-align:left; text-align-last:auto;    /* B36 */
}
.geri-al button{
  font-family:inherit; font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu); background:none; border:none; cursor:pointer;
  text-decoration:underline; padding:var(--bosluk-4) 2px;
}
.geri-al button:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan-yikama); outline-offset:var(--odak-ofset);
}

/* §15'in ÜÇÜNCÜ kipi — ÇIPLAK: çizgi YOK, dolgu YOK, üst payı 14.
   Ölçüldü (`odemelerim` fatura bilgilerim paneli, `.ntf-foot`):
     FIT   border none · margin 14px 0 0 · padding 0
     kanon border-top solid · margin 16 · padding-top 14
   §15'in tanımı "kartın ÜST ÇİZGİYLE ayrılmış kapanış notu" — bu panelde
   kaynak o çizgiyi basmıyor ve notu doğrudan içeriğe bitişik bırakıyor.
   `.ortali` kipiyle aynı aile (o da çizgisiz), farkı hizası ve payı.
   ⚠ slot-3 bunu `s3-sira.mjs`te bir ARALIK hatası olarak bulmuştu
   (+3px) ve `kanon-fark.mjs` göremiyordu — çünkü çifti yoktu. slot-2
   çifti ekleyince bildirim farkı olarak göründü: aralık hatası bir
   SONUÇTU, kök buydu. */
/* 🔴 SINIF MARKUP'TA VARDI, KURALI KANONDA HİÇ YAZILMAMIŞTI.
   `deneme/odemelerim.html` `.alt-not cizgisiz` basıyor ve `cizgisiz`
   diye bir kural yok — yani markup olmayan bir kuralı çağırıyor ve
   çizgi sessizce kalıyordu. Bu, "ölü varyant"ın (kural var, markup
   çağırmıyor) TAM AYNADAKİ hâli: markup çağırıyor, kural yok.
   İkisi de aynı denetimle yakalanır: markup'ın kullandığı sınıf
   listesi ile kanonun tanımladığı sınıf listesi yan yana konmalı. */
.alt-not.cizgisiz{
  margin-top:var(--bosluk-14); padding-top:0; border-top:0;
}

/* §15 `.alt-not`un ORTALI kipi — çizgisiz, ortalı, üst payı 24.
   Kaynak `.nt-foot`: üst çizgi YOK, `padding-top` YOK (slot-1 Ç3). */
/* Bandın altındaki tip şeridi kabı — alt payı bölüm nefesinin sıkı adımı. */
.bildirim-suzgec{ margin:0 auto var(--bolum-nefes-sik); }

.alt-not.ortali{
  justify-content:center; align-items:center;
  border-top:none; padding-top:0; margin-top:var(--bosluk-24);
  font-size:var(--yazi-12-5);
}
/* Ortalı kipte ikon satırla aynı hizada — §15'in `margin-top:3px` ve
   `flex:none`u burada geçerli değil (kaynak ikisini de bildirmiyor). */
.alt-not.ortali i{ margin-top:0; flex:0 1 auto; }

@media (max-width:640px){
  .bildirim-satir{ padding:var(--bosluk-13) var(--bosluk-14); gap:var(--bosluk-11); flex-wrap:wrap; }
  .bs-ikon,.bs-avatar{ width:40px; height:40px; font-size:var(--yazi-15); }
  .bs-gorsel{ width:42px; height:42px; }
  .bs-metin p{ font-size:var(--yazi-13); }
  /* Kaynağın `:has()` kapsamı — yukarıdaki şerhte anlatılan kusuru
     BİLEREK olduğu gibi taşıyoruz. */
  .bildirim-satir:has(.bs-eylem) .bs-metin{ flex:1 1 calc(100% - 51px); }
  .bs-eylem{ order:5; margin-left:51px; }
  .bs-benek{ order:6; }
  .bs-islemler{ gap:2px; }
  .bs-islem{ width:38px; height:38px; }
}


/* =====================================================================
   55 · KADEME KARTI — kaynak `.pro-*` (paketlerim-v1 · `pro-v1.html` kiti)
   ---------------------------------------------------------------------
   Fiyat/kademe karşılaştırma kartı. §49 `.paket-karti`den AYRI: o
   ÜYENİN MEVCUT paketini gösteren yatay bir kart, bu SATIN ALINABİLİR
   kademeleri yan yana dizen dikey bir kart. Ölçüm: slot-3, @1440.

   🔴 `align-items:stretch` + `.kademe-ozellikler{flex:1}` BİR BÜTÜNDÜR.
   Kaynağın kendi şerhi ölçümle gerekçelendiriyor: "`start` iken üç kart
   üç farklı boydaydı (Ücretsiz 15, Pro 23, Pro Max 4 kalem) ve düğmeler
   üç ayrı yükseklikte kalıyordu — fiyat kartlarında karşılaştırmayı
   bozan kusur." `flex:1` boşluğu yutar, düğmeler tek çizgide kalır.
   İkisinden biri düşerse kusur geri gelir.
   ===================================================================== */

.kademe-izgara{
  display:grid; grid-template-columns:repeat(3,minmax(0,1fr));
  gap:var(--bosluk-18); align-items:stretch; margin-top:var(--bosluk-26);
}
/* §55'in ONUNCU parçası — "ve N özellik daha" bağlantısı.
   Kaynak `.pro-daha` (`pk-kademeler`): görünür özellik listesi KIRPILDIĞINDA
   kartın altına düşen, karşılaştırma sekmesine giden bağlantı.
   Ölçüm (slot-3'ün panel denetimi + lead'in `kalem-olc.mjs` koşusu):
     inline-flex · gap 7 · min-height 44 · 12.5px/700 · --aksan-koyu
     ikon 10px · hover'da alt çizgi, ofset 3
   🔴 BUGÜN GÖRÜNMÜYOR VE BU DOĞRU: bağlantı VERİYE bağlı. Kaynak görünür
   listeyi 8 kalemde kırpıp kalanı buraya taşıyor; Diyet'in üç kademesinin
   listeleri 6 · 8 · 0 kalem, yani hiçbiri kırpılmıyor ve "ve 0 özellik
   daha" demek anlamsız olurdu.
   ⚠ Beyar bu bağlantının EKSİK olduğunu gözle bildirdi (2026-09-02) ve
   haklıydı — ama kökü yapı değil VERİ. Kip yine de kanona yazılır: Diyet'in
   listesi sekiz kalemi geçtiği gün bağlantı kendiliğinden doğar. Kuralı
   yazmamak, o günü sessiz bir eksiğe çevirirdi.
   🔴 İLK GEREKÇE ("eşik ≤8, bileşen kanona girmedi") YANLIŞTI — eşik bir
   desenin PAYLAŞILAN BİLEŞEN olup olmayacağını belirler, bir ekranın kendi
   kalemini basıp basmayacağını değil. Ama sonraki ölçüm daha iyisini
   getirdi ve BENİM "satırı bas" talimatımı da geri aldı:
     · kaynağın kuralı KOŞULLU, yapısal değil — `KART_LIMIT=8` ve
       `if (gizli > 0)` (`fit-paket.js:341-361`, 8 satırlık şerhiyle);
     · 🔴 KAYNAĞIN KENDİ ÜÇÜNCÜ KARTINDA DA BU SATIR YOK (5 açık kalem,
       eşiğin altında). Yani "her kartta iki açılır satır" diye bir yapı
       kuralı hiç yok.
     · Diyet'in üç kademesinde de gizli = 0.
   "ve 0 özellik daha" basmak satırı UYDURMAK ve gidecek kalemi olmayan
   ÖLÜ bir bağlantı doğurmak olurdu.
   ⚠ VE BU KALEM BİR KARARA BAĞLI: Diyet'in sayılarının düşük olmasının
   sebebi kademelerin AYRIK modellenmesi (her biri tam 14 kalem: 6+8 ·
   8+6 · 0+14); kaynak KÜMÜLATİF (üst kademe alttakinin tamamını içerir).
   Beyar kademeleri kümülatif yaparsa Pro 14 açık kaleme çıkar, gizli 6
   olur ve satır KENDİLİĞİNDEN doğar. Kural o gün için burada duruyor. */
.kademe-daha{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  min-height:44px;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu); text-decoration:none;
}
.kademe-daha i{ font-size:var(--yazi-10); }
.kademe-daha:hover{ text-decoration:underline; text-underline-offset:3px; }

@media (max-width:900px){ .kademe-izgara{ grid-template-columns:1fr; gap:var(--bosluk-26); } }

.kademe-karti{
  position:relative;                      /* bayrak buna asılır */
  display:flex; flex-direction:column;
  padding:var(--bosluk-22) var(--bosluk-20);
  border-radius:var(--yuvarlak-lg);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  transition:var(--sure-yavas) var(--yumusama);
}
.kademe-karti:hover{ transform:translateY(-5px); box-shadow:var(--golge-md); }
.kademe-karti.one-cikan{ border-color:var(--aksan-cizgi-4); box-shadow:var(--golge-md); }
.kademe-karti.aktif{ border-color:var(--aksan); box-shadow:var(--golge-md); }
.kademe-karti.notr{ background:var(--kademe-notr-zemin); border-color:var(--kademe-notr-cizgi); }
.kademe-karti.notr:hover{ transform:translateY(-5px); box-shadow:var(--golge-sm); }
/* "ve N özellik daha" — TAŞMA GÖSTERGESİ, kart süsü değil.
   Kaynağın kuralı: kart en fazla 8 kalem gösterir; kesilen kalem
   kaybolmaz, bu satır karşılaştırma tablosuna götürür ve tablo aynı
   veriden basılır (`fit-paket.js:341`). Satır yalnız gizli kalem
   VARKEN doğar — kaynağın kendi en üst kademe kartında da yoktur.
   Yeri: özellik listesi ile "kapalı" akordeonu ARASINDA; ikisi de kendi
   payını taşıdığı için bu satırın kendi payı yok.
   `min-height:44` kaynakta bildirili — §29 md.15 sapması gerekmiyor. */
.kademe-daha{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  min-height:44px; padding:0;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-govde); color:var(--aksan-koyu);
  text-decoration:none;
}
.kademe-daha i{ font-size:var(--yazi-10); }
.kademe-daha:hover{ text-decoration:underline; text-underline-offset:3px; }

.kademe-karti .dugme{ width:100%; justify-content:center; margin-top:var(--bosluk-4); }
.kademe-karti .dugme[disabled]{ opacity:.45; pointer-events:none; }

/* Kartın üstüne binen bayrak — "en çok tercih edilen" / "şu anki kademen". */
.kademe-bayrak{
  position:absolute; top:0; right:var(--bosluk-18); transform:translateY(-50%);
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  padding:var(--bosluk-6) var(--bosluk-12);
  border-radius:var(--yuvarlak-sm);
  font-size:var(--yazi-10-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-versal-2); text-transform:uppercase; white-space:nowrap;
  background:var(--aksan); color:var(--kagit);
  box-shadow:0 6px 16px var(--aksan-golge);
}
.kademe-bayrak.simdi{ background:var(--aksan-koyu-2); }
@media (max-width:900px){ .kademe-bayrak{ right:auto; left:var(--bosluk-20); } }

.kademe-bas{ display:flex; align-items:center; gap:var(--bosluk-11); margin-bottom:var(--bosluk-6); }
.kademe-bas i{
  flex:none; width:44px; height:44px; border-radius:var(--yuvarlak-md);
  display:grid; place-items:center; font-size:var(--yazi-18);
  background:var(--aksan-yikama-2); color:var(--aksan-koyu);
}
.kademe-karti.notr .kademe-bas i{ background:var(--kademe-notr-cip); color:var(--kademe-notr-cip-metin); }
.kademe-karti.ust  .kademe-bas i{ background:var(--kademe-altin-cip); color:var(--kademe-altin-cip-metin); }
.kademe-bas b{ font-size:var(--yazi-21); letter-spacing:var(--aralik-sik); color:var(--murekkep); }
/* Kademe özeti — kartın başlığı altındaki tek cümle.
   🔴 B36'nın "kaynak bile önlem almış" örneği: `paketlerim-v1.html:97`
   `text-align:left; text-align-last:auto` yazıyor, çünkü kabuğun
   `p{text-align:justify}`i doğrudan vuruyor. */
.kademe-ozet{
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--yer-tutucu);
  margin:var(--bosluk-4) 0 0;
  text-align:left; text-align-last:auto;
}

.kademe-fiyat{
  display:flex; align-items:baseline; flex-wrap:wrap; gap:var(--bosluk-6);
  padding:var(--bosluk-16) 0; margin-top:var(--bosluk-16);
  border-top:var(--cizgi-1) solid var(--cizgi);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.kademe-fiyat b{ font-size:var(--yazi-30); letter-spacing:var(--aralik-baslik); color:var(--murekkep); }
.kademe-fiyat span{ font-size:var(--yazi-13); font-weight:var(--agirlik-govde); color:var(--yer-tutucu); }

.kademe-ozellikler{
  list-style:none; display:flex; flex-direction:column; gap:var(--bosluk-10);
  padding:var(--bosluk-18) 0; margin:0; flex:1;      /* 🔴 flex:1 — yukarıdaki şerh */
}
.kademe-ozellikler li{
  display:flex; gap:var(--bosluk-9);
  font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak); line-height:var(--satir-sik);
  text-align:left; text-align-last:auto;    /* B36 — kaynak açıkça yazıyor */
}
.kademe-ozellikler li i{ flex:none; margin-top:3px; font-size:var(--yazi-11-5); color:var(--aksan-koyu); }
.kademe-ozellikler li b{ font-weight:var(--agirlik-kalin); color:var(--murekkep); }
.kademe-ozellikler li.nitelik i{ color:var(--yer-tutucu); }
/* 🔴 KAPALI ÖZELLİK — kaynak #8e8e8e (3.23:1) ve #bdbdbd (2.00:1) yazıyor,
   ikisi de AA altında. BEYAR KARARI 2026-09-01 (§29 md.17): `--yer-tutucu`
   (#6f6f6f · 4.77:1). Ekran okuyucuda kayıp zaten yoktu (`.yalniz-okuyucu`
   "var/yok" basıyor); kayıp yalnız görseldi. */
.kademe-ozellikler li.yok,
.kademe-ozellikler li.yok i{ color:var(--yer-tutucu); }

/* Çip şeridinin altındaki sayı satırı — kaynakta inline `margin-top:12px`
   ama KONUMA BAĞLI ve tekrarlanabilir (kartın kendi ritmi), tek örneklik
   bir süs değil. `.hs-warn`ın 22'sinden bu yüzden ayrı davranıldı. */
.paket-ozellikler+.durum-satir{ margin-top:var(--bosluk-12); }

.kademe-daha{
  display:inline-flex; align-items:center; gap:var(--bosluk-7); min-height:44px;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin); color:var(--aksan-koyu);
}
.kademe-daha i{ font-size:var(--yazi-10); }
.kademe-daha:hover{ text-decoration:underline; text-underline-offset:3px; }

/* ---- KAPALI ÖZELLİK DÖKÜMÜ -----------------------------------------
   🔴 §21 AKORDEON DEĞİL. Akordeonun "tek açık kalem" sözleşmesi burada
   GEÇERSİZ: üç kartın dökümü BAĞIMSIZ açılır (slot-3 davranış sınamasında
   doğruladı). Ayrı bileşen ki kural karışmasın.
   ⚠ `\f078` glifi MARKUP'TA GEÇMEZ, yalnız CSS `content`inde — glif
   listesi üreticileri `class="fa-*"` tarar ve bu glifi KAÇIRIR, ok boş
   çizilir. Üreticiye elle eklenmeli (`destek-taleplerim` turundaki
   "9 ikon sessizce boş" hatasının aynısı). */
.kademe-kapali{ border-top:var(--cizgi-1) solid var(--cizgi); padding-top:var(--bosluk-4); }
.kademe-kapali summary{
  list-style:none; cursor:pointer; min-height:44px;
  display:flex; align-items:center; gap:var(--bosluk-8);
  padding:var(--bosluk-10) 0;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin); color:var(--yer-tutucu);
}
.kademe-kapali summary::-webkit-details-marker{ display:none; }
.kademe-kapali summary::before{
  content:"\f078"; font-family:"Font Awesome 6 Free"; font-weight:900;
  font-size:var(--yazi-10);
  transition:transform var(--sure) var(--yumusama);
}
.kademe-kapali[open] summary::before{ transform:rotate(180deg); }
.kademe-kapali summary:hover{ color:var(--aksan-koyu); }
.kademe-kapali summary:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan-yikama);
  outline-offset:var(--odak-ofset); border-radius:var(--yuvarlak-sm);
}
.kademe-kapali .kademe-ozellikler{ padding-top:var(--bosluk-4); }


/* =====================================================================
   56 · KARŞILAŞTIRMA TABLOSU — kaynak `.cmp-*`
   ---------------------------------------------------------------------
   §4 `.tablo`nun varyantı ama ÜÇ yerde tabandan ayrılıyor ve üçü de
   ölçüldü: hücre dolgusu 12/16 (taban 13/16) · başlık 12/700 DÜZ
   (taban 11/800 VERSAL) · kap kendi kartı (taban çerçevesiz).

   🔴 SÖZLEŞME — RENK TEK SİNYAL DEĞİL: "var/yok" hücresi ikonun yanına
   `<span class="yalniz-okuyucu">var|yok</span>` basar. Kaynak da böyle
   yapıyor; §14'ün "ikon zorunlu" kuralının tablo karşılığı (WCAG 1.4.1).
   ===================================================================== */

.tablo-kap.cerceveli{
  border-radius:var(--yuvarlak-lg); overflow-x:auto;
  border:var(--cizgi-1) solid var(--cizgi); box-shadow:var(--golge-sm);
  background:var(--kagit); margin-top:var(--bosluk-26);
}
.tablo-kap.cerceveli:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan); outline-offset:var(--odak-ofset);
}
.tablo.karsilastirma{ min-width:640px; background:var(--kagit); }
.tablo.karsilastirma th,
.tablo.karsilastirma td{ padding:var(--bosluk-12) var(--bosluk-16); font-size:var(--yazi-13-5); }
/* Taban `thead th` VERSAL ve 11/800; bu tablo DÜZ ve 12/700 — ezilir. */
.tablo.karsilastirma thead th{
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  letter-spacing:normal; text-transform:none;
  color:var(--murekkep-yumusak); background:var(--tablo-bas-zemin);
  text-align:center; vertical-align:bottom;
}
.tablo.karsilastirma thead th:first-child{ text-align:left; }
.tablo.karsilastirma thead th.one-cikan{ color:var(--aksan-koyu); }
.kademe-ad{
  display:flex; align-items:center; justify-content:center; gap:var(--bosluk-7);
  font-size:var(--yazi-14); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-sik); color:var(--murekkep);
}
.tablo.karsilastirma thead th:first-child .kademe-ad{ justify-content:flex-start; }
.tablo.karsilastirma thead th.one-cikan .kademe-ad{ color:var(--aksan-koyu); }
/* 🔴 `display:block` ŞART — yoksa "ÜCRETSİZ₺0 / AY" tek satırda birleşiyor
   (slot-3, ekran görüntüsünde görüldü). */
.kademe-fiyat-not{
  display:block; margin-top:var(--bosluk-5);
  font-size:var(--yazi-12); font-weight:var(--agirlik-orta); color:var(--yer-tutucu);
}
.tablo.karsilastirma tbody td{
  text-align:center; font-weight:var(--agirlik-orta); color:var(--murekkep-yumusak);
}
.tablo.karsilastirma tbody th[scope="row"]{
  text-align:left; font-weight:var(--agirlik-govde); color:var(--murekkep);
}
.tablo.karsilastirma tbody tr:last-child td{ border-bottom:0; }
.tablo.karsilastirma td.one-cikan{ background:var(--aksan-yikama-5); }
.tablo.karsilastirma .var{ color:var(--aksan-koyu); }
.tablo.karsilastirma .yok{ color:var(--yer-tutucu); }   /* §29 md.17 — kontrast */
/* 🔴 `.tablo.karsilastirma` KAPSAMI ŞART. Çıplak `.tablo-grup th` (0,1,1)
   taban `.tablo.karsilastirma th` (0,2,1) kuralının içine düşüyor ve
   ÖLÜYOR. Bu, bu turun ÜÇÜNCÜ aynı hatası (`.kart-govde.ustsuz` ·
   `.yalniz-yan` · şimdi bu): bir varyant, kendisinden daha özgül bir
   TABAN kuralının kapsamına girdiğinde sessizce düşüyor.
   ⚠ Yeni varyant yazarken sorulacak soru: "bu kalem hangi kap kuralının
   İÇİNDE yaşıyor ve o kural benden daha mı özgül?" */
.tablo-grup th,
.tablo.karsilastirma .tablo-grup th{
  display:table-cell; background:var(--zemin); text-align:left;
  padding:var(--bosluk-11) var(--bosluk-16);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-versal-3); text-transform:uppercase; color:var(--murekkep);
}
.tablo-grup th i,
.tablo.karsilastirma .tablo-grup th i{ color:var(--aksan-koyu); margin-right:var(--bosluk-8); font-size:var(--yazi-11); }

.tablo-ipucu{
  display:flex; align-items:center; gap:var(--bosluk-8); margin-top:var(--bosluk-14);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;    /* B36 */
}
.tablo-ipucu i{ font-size:var(--yazi-11); color:var(--aksan-koyu); }


/* =====================================================================
   57 · AYRIM KUTUSU — kaynak `.pk-ayri`
   ---------------------------------------------------------------------
   "Bu iki şey karışmasın" kutusu. §16 `.bilgi-notu`ndan AYRI: o aksan
   yıkamasında yaşar, bu KREM zeminde — kaynak ikisini bilerek ayırıyor.
   `--krem-2` (#F7F1E6) kanonda ZATEN VAR ve ölçülenle birebir.
   ===================================================================== */

.ayrim-kutusu{
  display:flex; align-items:flex-start; gap:var(--bosluk-14);
  padding:var(--bosluk-18) var(--bosluk-20); margin-top:var(--bosluk-22);
  border-radius:var(--yuvarlak-lg);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--krem-2);
}
.ayrim-kutusu>i{
  flex:none; width:38px; height:38px; border-radius:var(--yuvarlak-md);
  display:grid; place-items:center; font-size:var(--yazi-15);
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi); color:var(--aksan-koyu);
}
.ayrim-kutusu b{
  display:block; font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin);
  margin-bottom:var(--bosluk-5);
}
.ayrim-kutusu p{
  margin:0; font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  line-height:var(--satir-genis); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;    /* B36 */
}
.ayrim-kutusu p.ikinci{ margin-top:var(--bosluk-8); }
.ayrim-kutusu p a{ color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }
.ayrim-kutusu p a:hover{ text-decoration:underline; text-underline-offset:2px; }
@media (max-width:640px){ .ayrim-kutusu{ flex-direction:column; gap:var(--bosluk-10); } }


/* =====================================================================
   51 · KAPAK VE AVATAR DÜZENLEME DÜĞMELERİ — kaynak `.fp-kapak-edit` / `.fp-ava-edit`
   ---------------------------------------------------------------------
   §25'in DÜZENLENEBİLİR kipinde doğarlar (`.fp-profil.is-editable`).
   Kaplar kanonda hazır: `.kapak{position:relative}` ✓ ·
   `.kimlik-avatar{position:relative}` ✓ — eksik olan yalnız iki düğme.

   🔴 `position:absolute` ŞART. `.kimlik-avatar.harf` `display:grid`
   olduğu için düğme akışta kalırsa ızgara hücresine düşüyor ve baş harfi
   ittiriyor (slot-2 ölçümü).
   ===================================================================== */

.kapak-duzenle{
  position:absolute; top:var(--bosluk-20); right:var(--bosluk-20); z-index:var(--kat-icerik);
  display:flex; align-items:center; gap:var(--bosluk-8);
  padding:var(--bosluk-9) var(--bosluk-16); min-height:44px;
  border:0; border-radius:var(--yuvarlak-hap);
  font-family:inherit; font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  background:var(--kapak-duzenle-zemin); color:var(--murekkep);
  cursor:pointer;
}
/* 🔴 `position:relative` YALNIZ DÜZENLENEBİLİR KİPTE. Kaynak da öyle
   yapıyor (`fit-shell.css:4484` — `.fp-profil.is-editable` altında).
   İlk yazımda koşulsuz verilmişti ve ölçüm yakaladı: destek ekranlarının
   avatarı `static` olmalı, `relative` değil. Düzenleme düğmesi bu kap
   olmadan KİMLİK KARTININ köşesine düşüyor (slot-2 gözle buldu). */
/* İki seçici birden: markup `.duzenlenebilir` taşıyorsa da, yalnız düğmeyi
   basıyorsa da çalışır. `:has()` markup koordinasyonu gerektirmiyor —
   düğme zaten YALNIZ düzenlenebilir kipte basılıyor, yani koşul aynı. */
.duzenlenebilir .kimlik-avatar,
.kimlik-avatar:has(.kimlik-avatar-duzenle){ position:relative; }

/* MD5 · §51'in DAR EKRAN dalı — kanonda hiç yoktu. Kapak düzenleme
   düğmesi @390'da küçülüyor; üçü de ölçüldü (slot-2, render edilmiş DOM):
     yazı    12.5 → 11        dolgu  9/16 → 8/13        gap  8 → 6
   🔴 Blok §51'in tanımından SONRA duruyor — `@media` özgüllük artırmaz,
   sıra belirler (bu dalganın en pahalı dersi). */
@media (max-width:640px){
  .kapak-duzenle{
    font-size:var(--yazi-11); gap:var(--bosluk-6);
    padding:var(--bosluk-8) var(--bosluk-13);
    /* Düğme kapağın köşesine YAKLAŞIR — 20 → 12 (ölçüldü). */
    top:var(--bosluk-12); right:var(--bosluk-12);
  }
}
.kimlik-avatar-duzenle{
  position:absolute; right:-3px; bottom:-3px; z-index:var(--kat-avatar-dugme);
  width:34px; height:34px; border-radius:var(--yuvarlak-daire);
  border:var(--cizgi-3) solid var(--kagit);
  background:var(--aksan-koyu); color:var(--kagit);
  font-size:var(--yazi-13); display:grid; place-items:center;
  box-shadow:var(--golge-md); cursor:pointer;
}


/* =====================================================================
   52 · ÜLKE KODLU TELEFON — kaynak `.fk-tel` / `.fk-cc*`
   ---------------------------------------------------------------------
   §3 form kitinin varyantı. HANDOFF §ADAY listesindeki `.fk-tel` budur.
   Açılır liste JS'in elinde; kanon kapalı hâli ve seçici kutusunu yazar.
   ===================================================================== */

.alan-telefon{ position:relative; }
/* 🔴 SOL DOLGU ŞART — girdi metni ülke düğmesinin ALTINDA kalıyordu
   (slot-2 gözle buldu, ölçüm görmedi). 104 = 96 (düğme) + 8. */
.alan-telefon .alan-girdi{ padding-left:104px; }
.alan-ulke{
  position:absolute; left:var(--cizgi-1); top:0; width:96px; height:45px;
  z-index:2;
  /* Düğme UA varsayılanında kalıyordu: siyah metin + 2px kenar (slot-2 M1). */
  border:0; border-right:var(--cizgi-1) solid var(--cizgi);
  color:var(--murekkep); font-family:inherit;
  display:flex; align-items:center; justify-content:center; gap:var(--bosluk-6);
  background:var(--zemin);
  border-right:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md) 0 0 var(--yuvarlak-md);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  cursor:pointer;
}
.alan-ulke-bayrak{ font-size:var(--yazi-16); line-height:16px; }
.alan-ulke-kod{ font-size:var(--yazi-13); font-weight:var(--agirlik-kalin); }


/* =====================================================================
   53 · TARİH ALANI — kaynak `.fk-tar` / `.fk-tar-btn`
   ---------------------------------------------------------------------
   §3'ün varyantı: girdi + sağ kenara gömülü takvim düğmesi.
   Açılır takvim JS'in elinde (§21 akordeon gibi sözleşme).
   ===================================================================== */

.alan-tarih{ position:relative; }
.alan-tarih .alan-girdi{ padding-right:52px; }
.alan-tarih-dugme{
  position:absolute; right:0; top:0; bottom:0; width:46px; z-index:var(--kat-icerik);
  background:transparent; border:0;
  border-radius:0 var(--yuvarlak-md) var(--yuvarlak-md) 0;
  color:var(--murekkep-yumusak); font-size:var(--yazi-15);
  display:grid; place-items:center; cursor:pointer;
}


/* ---- ÜLKE KATMANI (§52'nin açılır yüzeyi) --------------------------
   `hidden` doğar, JS açar. Normal ölçüm onu HİÇ GÖRMÜYOR — slot-2 ayrı
   bir araçla (`s2-olc-katman.mjs`) açtırıp ölçtü, 132 fark çıktı. */
.alan-ulke-katman{
  position:absolute; top:calc(100% + var(--bosluk-6)); left:0;
  width:min(360px,100%); z-index:60;
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md); box-shadow:var(--golge-lg);
  overflow:hidden;
}
.alan-ulke-arama{
  display:flex; align-items:center; gap:var(--bosluk-9);
  padding:var(--bosluk-10) var(--bosluk-12);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
/* UA girdisi 2px kenarlık + beyaz zemin basıyordu — kutu kabın kendisi. */
.alan-ulke-arama input{
  flex:1; border:0; background:transparent; padding:var(--bosluk-4) 0;
  font-family:inherit; font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  color:var(--murekkep); outline:none;
}
/* 🔴 KALEMİN KURALI HİÇ YAZILMAMIŞTI. Kit'in kabı, arama satırı ve boş
   durumu vardı; `li` ve üç span'i yoktu — liste `list-item` doğuyor ve
   bayrak · ad · kod yan yana yapışıyordu ("🇩🇪Almanya+49").
   Görünmemesinin sebebi listenin BOŞ olmasıydı: gövde tek kalem basıyordu
   ve şerhi *"kaynak listeyi ayrı bir modülden sürüyor, o dosya çevrimdışı,
   VERİ eksik"* diyordu. 🔴 O şerh DOĞRULANMADAN yazılmış: modül çevrimdışı
   olabilir ama liste kaynağın RENDER EDİLMİŞ DOM'unda hazır duruyor
   (`hesabim-profil.html` → 199 kalem). "CSS okuma, DOM'u ölç" kuralının
   markup karşılığı: modülü arama, basılmış hâli al. (slot-2)
   Ölçüm 1440 ve 390'da birebir — tek mobil dal hover'da. */
.alan-ulke-liste{ padding:var(--bosluk-6); list-style:none; overflow-y:auto; max-height:264px; }
.alan-ulke-liste li{
  display:flex; align-items:center; gap:var(--bosluk-11);
  padding:0 var(--bosluk-10); min-height:44px;
  border-radius:var(--yuvarlak-sm);
  font-size:var(--yazi-14); font-weight:var(--agirlik-orta);
  color:var(--murekkep); cursor:pointer;
}
.alan-ulke-liste li .bayrak{ flex:none; font-size:var(--yazi-17); line-height:1; }
.alan-ulke-liste li .ad{
  /* `0%` — `0` DEĞİL. `flex-basis:0` uzunluğa, `0%` yüzdeye çözülür ve
     hesaplanmış değer ayrışır (`0px` ↔ `0%`); çizim aynı ama ölçüm
     görüyor. Kaynağın yazımı `0%`. Eşdeğer yazım diye geçiştirmek
     yerine kaynağınkini almak ucuz. */
  flex:1 1 0%; min-width:0;
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.alan-ulke-liste li .kod{ flex:none; font-size:var(--yazi-13); color:var(--aksan-koyu); }
.alan-ulke-liste li.secili{ background:var(--aksan-yikama); font-weight:var(--agirlik-kalin); }
/* 🔴 MOBİL DALI ÖLÇÜLDÜ: 390'da hover ZEMİN BIRAKMIYOR. Kaynak bunu
   `@media (hover:hover)` ile ayırıyor — dokunmatikte "yapışan hover"
   olmasın diye. Kanonun ilk `@media (hover:none)` deseninin tersi. */
@media (hover:hover){ .alan-ulke-liste li:hover{ background:var(--aksan-yikama); } }
.alan-ulke-bos{
  padding:var(--bosluk-18) var(--bosluk-14);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); color:var(--murekkep-yumusak);
  text-align:center; text-align-last:auto;    /* B36 — yaslanıyordu */
}

/* ---- TAKVİM KATMANI (§53'ün açılır yüzeyi) ------------------------- */
.alan-tarih-katman{
  position:absolute; top:calc(100% + var(--bosluk-6)); left:0;
  width:min(320px,100%); z-index:60;
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md); box-shadow:var(--golge-lg);
  overflow:hidden;
}
@media (max-width:520px){ .alan-tarih-katman{ width:100%; } }
.alan-tarih-bas{
  display:flex; align-items:center; gap:var(--bosluk-8); padding:var(--bosluk-10);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.alan-tarih-ok{
  width:44px; height:44px; flex:none;
  border-radius:var(--yuvarlak-sm); border:var(--cizgi-1) solid var(--cizgi);
  background:var(--kagit); color:var(--murekkep); font-size:var(--yazi-12);
  display:grid; place-items:center; cursor:pointer;
}
.alan-tarih-ok:disabled{ opacity:.4; }
.alan-tarih-secim{
  flex:1; min-width:0; min-height:44px;
  padding:var(--bosluk-10) var(--bosluk-30) var(--bosluk-10) var(--bosluk-10);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
}
.alan-tarih-secim.yil{ flex:0 0 92px; }
.alan-tarih-gunler{
  display:grid; grid-template-columns:repeat(7,1fr); gap:2px;
  padding:var(--bosluk-10) var(--bosluk-10) 0;
}
.alan-tarih-gunler>span{
  display:block; text-align:center;
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-vurgu); color:var(--murekkep-yumusak);
}
.alan-tarih-izgara{
  display:grid; grid-template-columns:repeat(7,1fr); gap:2px;
  padding:var(--bosluk-6) var(--bosluk-10) var(--bosluk-10);
}
.alan-tarih-izgara>button{
  aspect-ratio:1; min-height:38px; border:0; background:transparent;
  border-radius:var(--yuvarlak-sm);
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta);
  color:var(--murekkep); cursor:pointer;
}
.alan-tarih-izgara>button:disabled{ color:var(--metin-pasif); }
.alan-tarih-izgara>button[aria-selected="true"]{
  background:var(--aksan); color:var(--kagit); font-weight:var(--agirlik-ekstra);
}
.alan-tarih-izgara>button.bugun{ box-shadow:inset 0 0 0 1px var(--aksan-cizgi); }
.alan-tarih-izgara>span{ aspect-ratio:1; }   /* ay başındaki boş hücreler */
.alan-tarih-ayak{
  display:flex; align-items:center; gap:var(--bosluk-10); flex-wrap:wrap;
  padding:0 var(--bosluk-10) var(--bosluk-10);
}
.alan-tarih-ayak>p{
  flex:1; min-width:0; margin:0;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-sik); color:var(--murekkep-yumusak);
  text-align:left; text-align-last:auto;    /* B36 — yaslanıyordu */
}
.alan-tarih-temizle{
  flex:none; min-height:44px; padding:var(--bosluk-10) var(--bosluk-14);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-sm);
  background:var(--kagit); font-family:inherit;
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); cursor:pointer;
}


/* =====================================================================
   54 · MODAL İÇ PARÇALARI — iki adımlı doğrulama · fotoğraf yükleyici
   ---------------------------------------------------------------------
   ⚠ MODAL KABUĞU KANONDA DEĞİL. `.fb-*` kiti markanın kendi kabuğundan
   geliyor (HANDOFF §12'nin "54 süs kuralı" kalemi); burada YALNIZ iç
   parçalar var. Ölçüm: slot-2, render edilmiş DOM.

   🔴 `[hidden]` MODALDA ÇALIŞMAZ: kabuğun `.fb-modal`ı `display:grid` +
   `visibility/opacity` geçişiyle açılıp kapanıyor, yani `[hidden]` (0,0,1)
   onu yenemiyor — açma/kapama `.show` sınıfıyla yapılır. B37'nin modal
   hâli (slot-3 ölçtü, slot-2 doğruladı).
   ===================================================================== */

/* ---- adım şeridi ---- */
.adim-serit{
  display:flex; align-items:center; gap:var(--bosluk-8);
  margin-bottom:var(--bosluk-20); list-style:none; padding:0;
}
.adim-serit li{
  flex:1; display:flex; align-items:center; gap:var(--bosluk-8);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-govde); padding-bottom:var(--bosluk-10);
  border-bottom:var(--cizgi-2) solid var(--cizgi); color:var(--metin-ikincil);
}
.adim-serit li.acik{ color:var(--aksan-koyu); border-bottom-color:var(--aksan); }
.adim-serit li span{
  width:22px; height:22px; border-radius:var(--yuvarlak-daire);
  display:grid; place-items:center;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  background:var(--zemin); color:var(--metin-ikincil);
}
.adim-serit li.acik span{ background:var(--aksan-yikama-2); color:var(--aksan-koyu); }
.adim-serit li.bitti span{ background:var(--aksan); color:var(--kagit); }

/* Seçim satırı — §9 `.ayar-satir`ın kipi (kaynak `.tfa-pick` = `.set-row`
   + `cursor:pointer`, ölçüldü: 17px 2px · gap 16 · birebir aynı).
   🔴 `accent-color` radyonun TEK renk kaynağı; olmadan tarayıcının MAVİ
   varsayılanı çiziliyor (slot-2 M8, ekran görüntüsünde görüldü). */
.secim-satir{ cursor:pointer; }
.secim-radyo{ width:20px; height:20px; flex:none; accent-color:var(--aksan); }

/* ---- sır kutusu · kod alanı · kurtarma kodları ---- */
.sir-kutu{
  display:flex; flex-direction:column; gap:var(--bosluk-7);
  margin-bottom:var(--bosluk-18); padding:var(--bosluk-16);
  border-radius:var(--yuvarlak-md);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
}
.sir-kutu code{
  font-family:var(--yuz-tek);
  font-size:var(--yazi-16); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-sir); color:var(--murekkep);
}
.kod-alani{ display:flex; gap:var(--bosluk-8); margin-bottom:var(--bosluk-10); }
.kod-hane{
  flex:1; min-width:0; text-align:center; font-family:inherit;
  font-size:var(--yazi-20); font-weight:var(--agirlik-kalin);
  padding:var(--bosluk-14) 0; border-radius:var(--yuvarlak-sm);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin); color:var(--murekkep);
}
.kod-hane:focus{ border-color:var(--aksan); box-shadow:0 0 0 3px var(--aksan-halka); }
.kurtarma-kodlari{
  display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--bosluk-8);
  margin:var(--bosluk-16) 0; list-style:none; padding:0;
}
.kurtarma-kodlari li{
  font-family:var(--yuz-tek);
  font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-versal); text-align:center;
  padding:var(--bosluk-11) var(--bosluk-12); border-radius:var(--yuvarlak-sm);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
}
.modal-eylemler{ display:flex; gap:var(--bosluk-10); flex-wrap:wrap; margin-bottom:var(--bosluk-16); }
.modal-eylemler .dugme{ padding:var(--bosluk-11) var(--bosluk-18); font-size:var(--yazi-13-5); }
.modal-ayak{
  display:flex; align-items:center; gap:var(--bosluk-14); flex-wrap:wrap;
  margin-top:var(--bosluk-20); padding:var(--bosluk-14) 0;
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.modal-ayak>.dugme{ padding:var(--bosluk-14) var(--bosluk-26); }
.modal-ayak>.dugme.birincil{ margin-left:auto; }
/* Fotoğraf modalının ayağı AYRI kip — 2FA'nınki 20px ve hizasız, bunun
   18px ve sağa yaslı (slot-2 M5). §11'in "iki ayrı kullanım" deseni. */
.modal-ayak.foto{ margin-top:var(--bosluk-18); justify-content:flex-end; }

/* MD3 · MD4 — hesabim'in iki modal/adım kaleminin DAR EKRAN dalı.
   Ölçüldü (slot-2, render edilmiş DOM @390); `kanon-fark.mjs` bu ikisini
   göremiyor (pencere içinde yaşıyorlar), slot-2'nin kendi ölçümü yakaladı.
   🔴 Blok ikisinin tanımından SONRA duruyor. */
@media (max-width:640px){
  /* Pencerenin ayağı sayfa kabıyla değil, kendi dar dolgusuyla nefes alır. */
  .modal-ayak{ padding-inline:var(--bosluk-16); }
  /* Adım şeridi dört adımı 390px'e sığdırmak için bir punto küçülür. */
  .adim-serit li{ font-size:var(--yazi-11-5); }
}
/* Durum satırının üst payı — kaynak bunu ÖLÇÜMLE gerekçelendiriyor:
   22 kitin alan alt boşluğu; 10/9/32 elenmiş (slot-2 M4). */
.durum-satir.ustlu{ margin-top:var(--bosluk-22); }

/* ---- fotoğraf yükleyici ---- */
.birak-alani{
  /* `position:relative` ŞART: içindeki `<input type="file">`
     `.yalniz-okuyucu` ile `position:absolute`a alınıyor; kap konumlu
     değilse girdi en yakın konumlu ataya kaçıyor (slot-2 G4). */
  position:relative;
  display:flex; flex-direction:column; align-items:center; gap:var(--bosluk-6);
  text-align:center; padding:var(--bosluk-34) var(--bosluk-22);
  /* 🔴 1.5px DASHED ve `--cizgi` rengi — `--kesikli-kenar` (2px
     `--cizgi-vurgu`) kaynaktan sapıyordu (slot-2 M2). */
  border:1.5px dashed var(--cizgi); border-radius:var(--yuvarlak-lg);
  background:var(--zemin);
}
/* M3 · bu düğme `.modal-eylemler`in İÇİNDE değil, kendi kabında. */
.birak-alani .dosya-sec{
  margin-top:var(--bosluk-12);
  padding:var(--bosluk-11) var(--bosluk-18); font-size:var(--yazi-13-5);
}
.birak-alani.uzerinde{ border-color:var(--aksan); background:var(--aksan-yikama-2); }
/* 🔴 İKON GRİ VE 12.5px ÇİZİLİYOR — kaynağın kendi bildirimi 18px/yeşil
   ama `.fy-drop>span` (0,1,1) onu yeniyor ve `.fy-drop-ico` (0,1,0)
   kaybediyor. KANON ÇİZİLENİ BASAR (`.btn-sm` emsali, 02 §29 dışı).
   Kusur raporda ölçüsüyle bildirildi; düzeltme kararı Beyar'da. */
.birak-ikon{
  width:46px; height:46px; border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama-2); display:grid; place-items:center;
  margin-bottom:var(--bosluk-6);
  font-size:var(--yazi-12-5); color:var(--metin-ikincil);
}
.birak-alani b{ font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin); color:var(--murekkep); }
.birak-alani>span{ font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil); }
.onizleme{ display:flex; flex-direction:column; gap:var(--bosluk-16); }
.cerceve{
  position:relative; overflow:hidden; border-radius:var(--yuvarlak-lg);
  border:var(--cizgi-1) solid var(--cizgi); background:var(--zemin);
  aspect-ratio:1/1; max-width:260px; margin:0 auto;
}
.cerceve.kapak{ aspect-ratio:1176/240; max-width:100%; }
.cerceve img{ width:100%; height:100%; object-fit:cover; transform-origin:center; }
.yakinlastir{ display:flex; flex-direction:column; gap:var(--bosluk-8); }
.aralik-girdi{ width:100%; accent-color:var(--aksan); }
.yikici-dugme{ color:var(--tehlike); margin-right:auto; }
.yikici-dugme:hover{
  border-color:var(--tehlike-cizgi); background:var(--tehlike-yikama); color:var(--tehlike-koyu);
}


/* =====================================================================
   43 · ÇİP AİLESİ — kaynak `.chip` · `.df-fchip` · `.fs-chips .chip`
   ---------------------------------------------------------------------
   🔴 ÜÇ SLOT ÜÇ AYRI ÇİP ÖLÇTÜ ve üçü de farklı çıktı. Kanonun tek `.cip`i
   üçünü de karşılamıyordu; taban kaynağa çekildi, ikisi varyant oldu.

     kaynak                ölçülen                       kanon
     .chip (taban)         13/500 · 8/15 · r8 · min-h yok  .cip
     .df-fchip (süzgeç)    13/600 · 9/16 · r8 · min-h 44   .cip.suzgec
     .fs-chips .chip (hap) 13/600 · 9/16 · r999            .cip.hap

   🔴 TABANIN `min-height:44px`i KALDIRILDI. Kanon onu
   `.fb-chiprow .chip::before`in dokunma hedefinden türetmişti ama kaynak
   hedefi `::before` ile AÇIYOR, kalemi büyütmüyor — yanlış genelleme
   (slot-1 Ç1). Hedef aşağıda kaynağın kendi yöntemiyle veriliyor:
   görünmez bir örtü, kalemin boyunu bozmadan 44px'e tamamlıyor.
   `radius` da 12 → 8'e çekildi (ölçüm).
   ===================================================================== */

.cip{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  position:relative;
  padding:var(--bosluk-8) var(--bosluk-15);
  border-radius:var(--yuvarlak-sm);
  font-family:inherit; font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak); background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  /* ⚠ `white-space:nowrap` TABANDA YAZILMAZ — kaynak `.df-fchip` onu
     bildirmiyor; `nowrap` yalnız TEK SATIR kabının çocuğuna veriliyor
     (`.cipler.tek-satir>*`, §6'da zaten var). Tabana çıkarılırsa uzun
     etiketli çip kırılamaz ve şeridi taşırır (slot-3 ölçtü). */
  cursor:pointer; text-decoration:none;
  /* 🔴 `<button>`ın UA varsayılanı `center`; kaynakta çizilen `left`.
     B36'nın düğme ailesindeki karşılığı — sarmalayan çipte metin ortalanırdı. */
  text-align:left;
  transition:var(--sure) var(--yumusama);
}
/* DOKUNMA HEDEFİ — kalemin boyunu DEĞİL, tıklanabilir alanı büyütür.
   Kaynağın kendi yöntemi (WCAG 2.5.8); kalem 33px kalır, hedef 44px olur. */
.cip::before{
  content:""; position:absolute; left:0; right:0; top:50%;
  transform:translateY(-50%); height:44px;
}
.cip:hover{ border-color:var(--aksan); color:var(--aksan-koyu); background:var(--aksan-yikama); }
.cip.aktif{
  background:var(--aksan-koyu); border-color:var(--aksan-koyu); color:var(--kagit);
  font-weight:var(--agirlik-kalin);   /* aktif çip KALINLAŞIR — kaynağın kuralı */
}
.cip:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}

/* Süzgeç kipi — biraz daha kalın ve geniş, ve hedefi KENDİ boyuyla
   karşılıyor (örtüye ihtiyacı yok). */
.cip.suzgec{
  font-weight:var(--agirlik-orta);
  padding:var(--bosluk-9) var(--bosluk-16);
  min-height:44px;
}
.cip.suzgec::before{ content:none; }

/* Hap kipi — arama ekranının popüler terim şeridi. */
/* Çip içi sayaç — `.sekme-sayi`den AYRI: o 700/.6, bu çipten miras alır
   ve .65 opaklıkta durur (slot-1 ①, iki ayrı ölçüm). */
/* Ağırlık MİRAS — aktif çipte 700'e, pasifte 500'e döner. Sabit yazılsaydı
   aktif çipin sayacı ince kalırdı (slot-1 ölçtü). */
.cip-sayi{ font-size:var(--yazi-11); font-weight:inherit; opacity:.65; }
.cip i{ font-size:var(--yazi-11); }          /* slot-1 ② */

/* 🔴 HAP KİPİ TABANIN KUTU DAVRANIŞINI ALMAZ. Kaynağın `.fs-chips .chip`i
   DÜZ bir `<button>` — `display`, `gap` ve `position` bildirmiyor, yalnız
   dolgu/punto/köşe veriyor. Taban `.cip` `inline-flex` + `gap:7` +
   `position:relative` (dokunma hedefi örtüsü için) taşıdığı için hap
   kipinde ÜÇÜ DE geri alınıyor.
   ⚠ Örtü de birlikte kalkar: bu kip kendi dolgusuyla zaten 44px'e yakın
   ve kaynak orada hedef açmıyor (slot-1 ölçtü). */
.cip.hap{
  /* ⚠ `white-space:nowrap` TABANDAN ÇIKARILDI — ölçüm çürüttü. İlk
     ölçüm mobil kipteydi ve "kaynak hapı sarmıyor" sonucuna varmıştım;
     masaüstünde kaynak `normal` bırakıyor. Sarmama kaynağın ≤640
     kuralından geliyor (`fit-shell.css:1283`, `.chip`e yazılı) ve
     mobil dala taşındı. Bir ölçümü tek kipte yapmak yarım ölçümdür. */
  display:inline-block; position:static; gap:normal;
  font-weight:var(--agirlik-orta);
  padding:var(--bosluk-9) var(--bosluk-16);
  border-radius:var(--yuvarlak-hap);
}
.cip.hap::before{ content:none; }

/* Çip şeridinin başlığı — `.cipler .etiket`ten AYRI kalem (slot-3 T8):
   versal, daha küçük, sabit genişlikte. Şeridin solunda durur. */
/* 🔴 §43'ÜN DAR EKRAN DALI — TABANA DEĞİL, KABA YAZILIR.
   Kaynak ≤640 kuralını `.chip`e yazıyor (`fit-shell.css:1283`): 12px ·
   7/12. Ama kanon İKİ kaynak sınıfını (`.chip` ve `.df-fchip`) tek
   `.cip`e indiriyor ve `.df-fchip`e o kural HİÇ değmiyor — tabana
   yazılırsa `odemelerim`in kart içi süzgeç çipi de küçülür ve kapanmış
   bir ekran bozulur. `.cipler.ortali` = `.chip` ailesinin kabı.
   ⚠ `:not(.hap)` şart: hap kipi kendi dolgusunu (9/16) taşıyor ve eşit
   özgüllükte sonra gelen bu blok onu ezerdi (§0c/1'in tersi yönü).
   Bu, "iki kaynak sınıfı tek ada inince mobil davranışları ayrışır"
   dersinin BEŞİNCİ örneği. (slot-1 ⑤) */
@media (max-width:640px){
  .cipler.ortali .cip:not(.hap),
  .cipler.ortali .cip:not(.hap).aktif{
    font-size:var(--yazi-12); padding:var(--bosluk-7) var(--bosluk-12);
  }
  /* Hap kipi dar ekranda SARMAZ — kaynağın ≤640 `.chip` kuralı. */
  .cipler .cip.hap{ white-space:nowrap; }
}

.cipler-basligi{
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;   /* 🔴 .04 → .06 (B44) */
  color:var(--metin-ikincil); min-width:60px;
}


/* =====================================================================
   44 · ÖDEME KARTI — kaynak `.od-card` / `.od-head` / `.od-in`
   ---------------------------------------------------------------------
   §1'in DÖRDÜNCÜ kart kiti (taban · `.panel` · `.form` · `.odeme`).
   Kaynağın kendi şerhi ayırıyor: "kabuğun `.fp-card`ı 38px 24px dolgu
   taşıyor; ödeme listeleri kenardan kenara aksın diye kendi kabı."
   B31'in aynı ailesi. Ölçüm: slot-3 (odemelerim · 5 sekmede 9 kart).

   🔴 BAŞLIK İKONU ÇİPLİ — taban `.kart-baslik i` çıplak ikon. Ayrı kip.
   ===================================================================== */

.kart.odeme+.kart.odeme,
.paket-karti+.kart.odeme{ margin-top:var(--bosluk-18); }
.kart.odeme>.kart-bas{
  padding:var(--bosluk-18) var(--bosluk-22); gap:var(--bosluk-16);
  align-items:flex-start; justify-content:space-between; flex-wrap:wrap;
}
.kart.odeme>.kart-bas .kart-baslik{
  font-size:var(--yazi-16); line-height:var(--satir-govde);
  letter-spacing:normal; gap:var(--bosluk-10);
}
.kart.odeme>.kart-bas .kart-baslik i{
  width:38px; height:38px; border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  font-size:var(--yazi-14); display:grid; place-items:center; flex:none;
}
.kart.odeme>.kart-bas p{
  font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); margin-top:var(--bosluk-6);
  max-width:58ch; text-align:left; text-align-last:auto;
}
.kart.odeme>.kart-bas .dugme{ padding:var(--bosluk-11) var(--bosluk-18); font-size:var(--yazi-13-5); flex:none; }
.kart.odeme>.kart-govde{ padding:var(--bosluk-20) var(--bosluk-22); }
.kart.odeme>.kart-govde.bosluksuz{ padding:0; }

/* Kart gövdesinin iki küçük kipi (slot-3 V1 · V2) — kaynakta inline
   stildeydiler, kanona adlı varyant olarak giriyorlar.
   🔴 `.kart.odeme>` KAPSAMI ŞART: taban `.kart.odeme>.kart-govde` (0,2,1)
   çıplak varyantı (0,2,0) yener ve ikisi de ÖLÜ kalır. Ölçümle yakalandı
   (slot-3: üç kutunun üçü de 20/22 basıyordu, panel aralığı −17px sapıyordu).
   `.bosluksuz` için aynı kapsam zaten yazılmıştı — bu ikisi atlanmıştı. */
.kart-govde.ustsuz,
.kart.odeme>.kart-govde.ustsuz{ padding-top:0; }
.kart-govde.yalniz-yan,
.kart.odeme>.kart-govde.yalniz-yan{ padding:0 var(--bosluk-22); }

/* Kart içi süzgeç şeridi ve sayaç satırı (slot-3 T7).
   §11 `.sekmeler.suzgec` bir SEKME rayıdır; bu bir ÇİP şeridi kabı.
   Yatay 22 — md.13'ün kart içi nefesiyle tutarlı. */
.kart-suzgec{ padding:var(--bosluk-16) var(--bosluk-22) var(--bosluk-6); }
/* Kart içi şerit kabın gap'ini DARALTIR — kaynak da kabı adlandırıp orada
   daraltıyor. Taban `.cipler` 9px (kabuğun değeri) doğru; bu 8.
   ⚠ slot-3 önce "taban 8 olsun" demiş, sonra RENDER ölçümüyle kendi
   isteğini geri almıştı — §10 md.3'ün ders örneği. */
.kart-suzgec .cipler{ gap:var(--bosluk-8); }
.kart-sayac{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil); padding:var(--bosluk-12) var(--bosluk-22) var(--bosluk-4);
  margin:0; text-align:left; text-align-last:auto;    /* B36 — bu da bir <p> */
}
.kart-sayac b{ font-weight:900; color:var(--murekkep); }

/* Kart içi tek düğme kabı (slot-3 V4) — dipnottaki bağlantı EYLEM olarak dursun. */
.kart-eylem{ margin-top:var(--bosluk-18); }


/* =====================================================================
   45 · DURUM HAPININ İKİ İKONLU KİPİ — kaynak `.od-pill` · `.hs-pill`
   ---------------------------------------------------------------------
   §28 `.durum-hapi` `.pstat`in geometrisini aldı: kenarlıksız, 700
   ağırlık, 6px NOKTA. Ölçüm iki ayrı hap daha buldu ve üçü de farklı:

     kalem        dolgu    kenar  ağırlık  aralık   işaret
     .pstat (§28) 4/10     yok    700      normal   6px nokta
     .od-pill     5/10     1px    800      .02em    İKON
     .hs-pill     3/10     1px    800      .03em    İKON

   B24/B31 deseni: ölçüm iki kalemin ayrı olduğunu söylüyorsa kanon
   onları birleştirmez. Ölçüm: slot-3.
   ===================================================================== */

/* Kenar DURUMDAN gelir; taban `.od-pill.off`un grisi (`odemelerim-v1.html:87`
   ham hex çifti: zemin #f1f1f1 · kenar #e2e2e2 — zemin alınmıştı, kenar
   atlanmıştı). Çözülen ve bekleyen kendi ailelerinin hairline'ını kullanır. */
.durum-hapi.ikonlu{
  padding:var(--bosluk-5) var(--bosluk-10);
  border:var(--cizgi-1) solid var(--durum-kapali-cizgi);
  font-weight:var(--agirlik-ekstra); letter-spacing:var(--aralik-genis);
  gap:var(--bosluk-6);
}
.durum-hapi.ikonlu::before{ content:none; }        /* nokta yok, ikon var */
.durum-hapi.ikonlu i{ font-size:var(--yazi-10-5); }
.durum-hapi.ikonlu.cozulen { border-color:var(--aksan-cizgi); }   /* .od-pill.ok   */
.durum-hapi.ikonlu.bekleyen{ border-color:var(--uyari-cizgi); }   /* .od-pill.wait */

.durum-hapi.kucuk-ikonlu{
  padding:3px var(--bosluk-10);
  /* `.hs-pill` ailesi — kenar TABANDA da görünür. Lead'in `.kapali`
     düzeltmesi bu kipin yalnız bir durumunu kapatıyordu; `.cozulen`
     kenarsız kalıyordu. */
  border:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-11); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-etiket-2); gap:var(--bosluk-6);
}
.durum-hapi.kucuk-ikonlu::before{ content:none; }
/* 🔴 KENARLIK GÖRÜNÜR, ŞEFFAF DEĞİL — Beyar gözle buldu, ölçüm doğruladı.
   Taban `kucuk-ikonlu` kenarı `transparent` bırakıyordu ve `kapali` durumu
   kendi zeminini getiriyordu; kaynağın `.hs-pill.off`u ikisini de yazıyor:
     FIT    kenar rgb(236,236,236) = --cizgi   zemin rgb(249,249,249) = --zemin
     kanon  kenar rgba(0,0,0,0)               zemin rgb(241,241,241)
   Dört bağlamda da ölçüldü (FIT pk-paketim · FIT od-kartlar · kanon
   paketlerim · kanon odemelerim); FIT'in dördü de aynı, kanonun ikisi de
   aynı biçimde yanlıştı — yani kaynak tutarlı, sapma bizimdi.
   ⚠ Kural BİRLEŞİK seçiciye yazılır: `.durum-hapi.kapali` başka kaynak
   sınıflarının da karşılığı ve onların zemini AYRI (§45). Sadece küçük
   ikonlu kip `.hs-pill`den geliyor.
   ⚠ ÖLÇÜM BUNU HİÇ GÖRMÜYORDU — hapın ölçüm çifti yoktu. Düzeltmekle
   bitmez; `paketlerim.mjs` ve `odemelerim.mjs`e çift eklenecek. */
.durum-hapi.kucuk-ikonlu.kapali{
  background:var(--zemin); border-color:var(--cizgi);
}
/* `.hs-pill.on` — kenar markanın %24'ü (`fit-shell.css:4970`). Zemin
   `--aksan-yikama` KALIR: kaynak alfalı yıkama basıyor, kanon opak
   yıkama — belgelenmiş marka kararı (🟡), kenar ise ölçülen değer. */
.durum-hapi.kucuk-ikonlu.cozulen { border-color:var(--aksan-cizgi-5); }
.durum-hapi.kucuk-ikonlu.bekleyen{ border-color:var(--uyari-cizgi); }


/* =====================================================================
   46 · ÖLÇER — kaynak `.od-bar`
   ---------------------------------------------------------------------
   Tek renkli doluluk çubuğu. Ölçüm: slot-3 (odemelerim).
   ===================================================================== */

.olcer{
  height:8px; border-radius:var(--yuvarlak-sm);
  background:var(--cizgi); overflow:hidden; margin-top:var(--bosluk-9);
}
.olcer>span{ display:block; height:100%; background:var(--aksan); border-radius:var(--yuvarlak-sm); }
/* R11 · HAP KİPİ — puan kartının çubuğu (`.fp-bar`). Geometri aynı,
   köşesi hap ve üst payı 11. Zemini de `--cizgi` DEĞİL, kaynağın
   yakın-ikizi `--olcer-zemin` (bkz. token şerhi). */
.olcer.hap{
  border-radius:var(--yuvarlak-hap); margin-top:var(--bosluk-11);
  background:var(--olcer-zemin);
}
.olcer.hap>span{ border-radius:var(--yuvarlak-hap); }


/* =====================================================================
   47 · DÜĞMENİN İKİ ARA BOYU — kaynak `.see-all` · `.od-git`
   ---------------------------------------------------------------------
   Taban `.dugme` 14/26 · 14.5px, `.dugme.kucuk` 12/20 · 13.5px. Ölçüm iki
   ara boy daha buldu ve ikisinin de kaynakta ADI var — uydurma değil:

     .dugme.orta   11/18 · 13.5   kaynak `.see-all` (fit-shell.css:233)
     .dugme.satir  10/14 · 12.5   kaynak `.od-git` — tablo içi belge düğmesi

   `.dugme.satir` `.satir-dugme`den (§42) AYRI: o kağıt zeminli nötr bir
   satır düğmesi, bu aksan kenarlıklı bir belge bağlantısı. İkisi de
   ölçüldü, ikisi de kullanımda (slot-3 T4 · V5).
   ===================================================================== */

.dugme.orta{ padding:var(--bosluk-11) var(--bosluk-18); font-size:var(--yazi-13-5); }
.dugme.satir{
  padding:var(--bosluk-10) var(--bosluk-14); gap:var(--bosluk-7);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin);
  border-radius:var(--yuvarlak-sm); min-height:44px;
  background:var(--kagit); color:var(--aksan-koyu);
  border:var(--cizgi-1) solid var(--aksan-cizgi-2);
  white-space:nowrap;
}
.dugme.satir:hover{ background:var(--aksan-yikama-2); }
.dugme.satir:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}
/* Paket kartının eylem kabı düğmeleri inceltir — kabın kendi kipi,
   yeni ölçü değil (`.dugme.kucuk`ün değerine eşit çıktı · slot-3 P12). */
.paket-eylemler .dugme{ padding:var(--bosluk-12) var(--bosluk-20); font-size:var(--yazi-13-5); }


/* =====================================================================
   48 · BOŞ DURUMUN ÜÇÜNCÜ BOYU — kaynak `.fpx-bos`
   ---------------------------------------------------------------------
   🔴 DÖRT AYRI BOY ÖLÇÜLDÜ. Kaynak `.lib-empty`yi KULLANMADIĞINI kendi
   şerhinde yazıyor; bu, plan yüzeylerinin kendi kiti.

     kalem                 dolgu         ikon              başlık  metin
     .bos-durum.buyuk      48/20/48      64 · r-md · 22px  20      14 / 50ch
     .bos-durum.kart-ici   44/24         58 · r-md · 22px  15.5    13 / 300px
     .bos-durum.plan-ici   44/20/38      56 · DAİRE · 21px 16.5    14 / 35ch
     .fs-empty (arama)     70/30         74 · r-lg · 29px  22      14.5 / 420px

   İlk üçü kanonda; dördüncüsü arama ekranıyla gelecek (§ ayrı).
   Ölçüm: slot-3 T9. Ayırt edici: ikon DAİRE ve boşluğu `gap` taşıyor,
   `margin-bottom` değil.
   ===================================================================== */

.bos-durum.plan-ici{
  padding:var(--bosluk-44) var(--bosluk-20) var(--bosluk-38);
  gap:var(--bosluk-10);
}
.bos-durum.plan-ici .bos-ikon{
  width:56px; height:56px; border-radius:var(--yuvarlak-daire);
  font-size:var(--yazi-21); margin-bottom:0;
}
/* 🔴 ÇOCUK MARJLARI SIFIRLANIR — bu kip boşluğu `gap:10px` ile taşıyor,
   `.kart-ici`nin margin'leri miras kalırsa ritim iki kez binerdi (B44). */
.bos-durum.plan-ici h4{
  font-size:var(--yazi-16-5); line-height:var(--satir-baslik);
  letter-spacing:var(--aralik-sik); margin:0;
}
.bos-durum.plan-ici p{
  font-size:var(--yazi-14); line-height:var(--satir-genis-2);
  /* `.kart-ici`nin 300px'iyle AYNI özgüllükte (0,2,1); bu blok dosyada
     SONRA geldiği için kazanıyor — `!important` gerekmiyor.
     🔴 56ch, 35 DEĞİL. İlk istekte 35 bildirilmişti; 1ch'in 14px sanılması
     aritmetik hataydı — Gilroy'da 14px'te 1ch ≈ 8.82px, 56×8.82 = 493.9px
     ve ölçüm tam bunu veriyor. Kaynak `.fpx-bos p{max-width:56ch}`.
     slot-3 kendi isteğini ölçümle düzeltti. */
  max-width:56ch; color:var(--yer-tutucu); margin:0;
}
.bos-durum.plan-ici .dugme{ margin-top:var(--bosluk-6); }


/* =====================================================================
   49 · PAKET KARTI — kaynak `.sub-tier-*`   (fit-shell.css:4944)
   ---------------------------------------------------------------------
   🔴 KABUKTA TANIMLI, SAYFADA DEĞİL — iki ekran (odemelerim/abonelik ve
   paketlerim/paketim) AYNI kiti paylaşıyor. odemelerim-v1'in şerhi
   "burada tanımlandı" diyor ama ölçüm ikisinde de aynı değerleri verdi
   (slot-3 BATCH-4/A). Tek bileşen, iki ekran.
   HANDOFF §ADAY listesindeki "paket kartı" budur.
   ===================================================================== */

.paket-karti{
  border-radius:var(--yuvarlak-lg); overflow:hidden;
  border:var(--cizgi-1) solid var(--cizgi); background:var(--kagit);
  /* gölge YOK — ölçüldü */
}
.paket-bas{
  display:flex; align-items:center; flex-wrap:wrap;
  gap:var(--bosluk-14); padding:var(--bosluk-18) var(--bosluk-20);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
/* Kademe rozeti — §28 hap ailesinin DÖRDÜNCÜ ölçüsü. */
.paket-rozet{
  display:inline-flex; align-items:center; gap:var(--bosluk-6); flex:none;
  padding:var(--bosluk-6) var(--bosluk-13);
  border-radius:var(--yuvarlak-hap); border:var(--cizgi-1) solid transparent;
  font-size:var(--yazi-12); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-vurgu); text-transform:uppercase;
  background:var(--paket-rozet-zemin); color:var(--kagit);
}
.paket-rozet.ucretsiz{ background:var(--zemin); color:var(--metin-ikincil); border-color:var(--cizgi); }
.paket-bilgi{ flex:1; min-width:0; }
.paket-bilgi b{
  display:flex; align-items:center; flex-wrap:wrap; gap:var(--bosluk-9);
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-govde);
}
.paket-yenileme{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  margin-top:var(--bosluk-5); color:var(--metin-ikincil);
}
.paket-fiyat{ text-align:right; flex:none; }
.paket-fiyat b{ font-size:var(--yazi-22); font-weight:var(--agirlik-ekstra); letter-spacing:var(--aralik-baslik-2); }
/* 🔴 `display:block` — "/ ay" fiyatın ALTINDA durur. Kanonda yoktu ve
   ikisi aynı satıra düşüyordu; ÇIPLAK GÖZLE görülüyordu, ölçüm görmüyordu
   (slot-3, 1440 ss). KOPYALAMA-KURALI §4'ün "yan yana koy" adımı bunun için. */
.paket-fiyat span{ display:block; font-size:var(--yazi-12); font-weight:var(--agirlik-govde); color:var(--metin-ikincil); }
.paket-govde{ padding:var(--bosluk-18) var(--bosluk-20); border-bottom:var(--cizgi-1) solid var(--cizgi); }
.paket-eylemler{
  display:flex; align-items:center; flex-wrap:wrap;
  gap:var(--bosluk-12); padding:var(--bosluk-16) var(--bosluk-20);
}
/* Özellik çipleri — kartın içinde, paketin neyi açtığını sayar. */
.paket-ozellikler{ display:flex; flex-wrap:wrap; gap:var(--bosluk-8); margin-top:var(--bosluk-16); }
.paket-ozellikler span{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  padding:var(--bosluk-7) var(--bosluk-12);
  border-radius:var(--yuvarlak-sm); background:var(--zemin);
  border:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil);
}
.paket-ozellikler span i{ font-size:var(--yazi-11); color:var(--aksan-koyu); }


/* =====================================================================
   50 · LİSTE SATIRLARI — paket satırı · ödeme satırı
   ---------------------------------------------------------------------
   İki ayrı satır kiti, aynı iskelet (görsel/marka + bilgi + fiyat +
   eylemler) ama farklı ölçüler — ikisi de ölçüldü (slot-3 T11 · T12).

   🔴 `.odeme-satiri` KAYNAKTA `.cc-*` ADINI TAŞIYOR ama kanona O ADLA
   GİREMEZ: §24 kapanış bandının `.cc-ico`/`.cc-btns`i ile çakışırdı.
   §10 md.7'nin (kanon adı ↔ kaynak adı karışır) doğrudan uygulaması.
   ===================================================================== */

.paket-satiri{
  display:flex; align-items:center; gap:var(--bosluk-16);
  padding:var(--bosluk-16) var(--bosluk-18);
  border-radius:var(--yuvarlak-lg); border:var(--cizgi-1) solid var(--cizgi);
  background:var(--kagit);
}
.paket-satiri+.paket-satiri{ margin-top:var(--bosluk-14); }
.paket-satiri .avatar{ width:52px; height:52px; border-radius:var(--yuvarlak-daire); flex:none; }
/* HARF KİPİ — kaynak buraya FOTOĞRAF basıyor, Diyet baş harf kullanıyor.
   §29 md.4'ün "içerik" gerekçesi (kardeş markada avatar fotoğraf, harf
   kipi hiç doğmuyor) — kimlik kartında zaten onaylı, aynı karar.
   Zemin `--aksan-koyu`: §29 md.11 (baş harf avatarı 3.54 → 5.45:1).
   Punto 52px kutuya göre; §25'in 34px'i 96px kutu için. */
.paket-satiri .avatar.harf{
  display:grid; place-items:center;
  background:var(--aksan-koyu); color:var(--kagit);
  font-size:var(--yazi-20); font-weight:var(--agirlik-kalin);
  text-transform:uppercase;
}
.paket-satiri .bilgi{ flex:1; min-width:0; }
.paket-satiri .bilgi b{
  display:flex; align-items:center; flex-wrap:wrap; gap:var(--bosluk-9);
  font-size:var(--yazi-14-5); font-weight:var(--agirlik-kalin);
}
.paket-satiri .plan{ display:block; font-size:var(--yazi-13); font-weight:var(--agirlik-govde); margin-top:3px; color:var(--metin-ikincil); }
/* Satırın ikincil notu (hak sayacı · yenileme). §49'un `.paket-yenileme`sinden
   AYRI: o 12.5px/mt5 (kart), bu 12px/mt6 (satır) — yarım punto ve 1px,
   B24 deseni; ölçüm ayırdı. */
.paket-satiri .not{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  margin-top:var(--bosluk-6);
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak);
}
.paket-satiri .not i{ font-size:var(--yazi-11); color:var(--aksan-koyu); }
.paket-satiri .fiyat{ text-align:right; flex:none; }
.paket-satiri .fiyat b{ font-size:var(--yazi-17); font-weight:var(--agirlik-ekstra); letter-spacing:var(--aralik-baslik); }
.paket-satiri .fiyat span{ display:block; font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde); }

.odeme-satiri{
  display:flex; align-items:center; gap:var(--bosluk-14);
  padding:var(--bosluk-16) var(--bosluk-18);
  border-radius:var(--yuvarlak-lg); border:var(--cizgi-1) solid var(--cizgi);
  background:var(--kagit);
  transition:var(--sure) var(--yumusama);
}
.odeme-satiri+.odeme-satiri{ margin-top:var(--bosluk-12); }
.odeme-satiri:hover{ border-color:var(--cizgi-vurgu-acik); box-shadow:var(--golge-sm); }
/* Kart şeması rozeti — Visa/Mastercard. Renkler MARKA DEĞİL, kart
   şemasının kendi kurumsal rengi; DadaDiet'e göre değişmez. */
.odeme-marka{
  width:48px; height:34px; flex:none;
  border-radius:var(--yuvarlak-sm); background:var(--zemin);
  border:var(--cizgi-1) solid var(--cizgi);
  display:grid; place-items:center; font-size:var(--yazi-26);
  color:var(--kart-semasi-visa);
}
.odeme-marka.mastercard{ color:var(--kart-semasi-mc); }
.odeme-satiri .bilgi{ flex:1; min-width:0; }
.odeme-satiri .bilgi b{
  display:block; font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-vurgu);
}
/* 🔴 `flex:none` ŞART — olmazsa eylem kutusu daralıp düğmeleri sıkıştırıyor.
   slot-3 ilk istekte atlamıştı, genişleyen OZ (`flexShrink`) yakaladı. */
.paket-satiri .eylemler,
.odeme-satiri .eylemler{
  flex:none; display:flex; align-items:center; gap:var(--bosluk-8); flex-wrap:wrap;
}
.odeme-satiri .skt{
  display:block; font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  margin-top:2px; color:var(--metin-ikincil);
}

/* 🔴 BU BLOK BİLEŞEN TANIMLARINDAN SONRA DURMAK ZORUNDA.
   İlk yazımda 1500 satır ÖNCEYE konmuştu ve HİÇ UYGULANMIYORDU:
   `@media` ÖZGÜLLÜK ARTIRMAZ, eşit özgüllükte SIRA belirler —
   sonra gelen taban kurallar (`.paket-satiri` · `.odeme-satiri` ·
   `.kart.odeme>.kart-bas`) medya bloğunu eziyordu.
   ⚠ slot-3 bunu ÜÇ KEZ bildirdi; ben üç kez `grep`le "var" diye
   yanıtladım. Dosyada bulunması UYGULANDIĞI anlamına gelmiyor —
   ölçüm haklıydı, arama değil. Bu turun en pahalı dersi.
   (`.ustsuz`/`.yalniz-yan`/`.tablo-grup th` ile aynı aile: bir kural
   yazılmış olabilir ama başka bir kural onu yeniyor olabilir.) */
/* ── DAR EKRAN · §44 · §49 · §50 ────────────────────────────────────
   🔴 BU BLOK OLMADAN §50 390px'te OKUNMUYOR. Ölçüldü ve GÖZLE doğrulandı
   (slot-3, `deneme/odemelerim-390-kanon.png`): `.paket-satiri` sarmadığı
   için bilgi kolonu tek kelimelik bir şeride çöküyor, fiyat ve eylemler
   kutunun dışına taşıyor. Kaynak `odemelerim-v1.html:200-210` ve
   `fit-shell.css:5069-5071` — hepsi birebir, uydurma yok.
   Bu bir "iyi olurdu" değil; satır dar ekranda kullanılamaz hâlde. */
@media (max-width:640px){
  /* §44 · ödeme kartı — dolgular daralır, başlık SATIR kipinde KALIR.
     🔴 `flex-direction:row` AÇIKÇA yazılır: §1'in tabanı dar ekranda
     kolona düşüyor ve ödeme kartını da düşürüyordu; kaynağın `.od-head`i
     düşmüyor (slot-3 ölçtü). */
  .kart.odeme>.kart-bas{ padding:var(--bosluk-16); flex-direction:row; }
  .kart.odeme>.kart-govde{ padding:var(--bosluk-16); }
  .kart-suzgec{ padding:var(--bosluk-14) var(--bosluk-16) var(--bosluk-4); }
  .kart-sayac{ padding:var(--bosluk-10) var(--bosluk-16) 2px; }

  /* §49 · paket kartı — fiyat alta iner ve SOLA yaslanır */
  .paket-bas{ gap:var(--bosluk-12); }
  .paket-fiyat{ order:3; margin-left:auto; text-align:left; }
  .paket-eylemler .dugme{ width:100%; }
  /* Eylem düğmeleri satırı doldurur ve ortalanır — dar ekranda yan yana
     sıkışmasınlar diye (kaynağın kendi kuralı). */
  .paket-satiri .eylemler .satir-dugme,
  .odeme-satiri .eylemler .satir-dugme{ flex:1; justify-content:center; }

  /* §50 · liste satırları — `order` ile alt alta iner.
     ⚠ `order` sırası KRİTİK: bilgi 2 · fiyat 3 · eylemler 4. Verilmezse
     avatar/marka kutusu ile fiyat aynı satırda kalıp sola yığılıyor
     (kaynağın kendi şerhi bunu bildirim satırında da yazıyor). */
  .paket-satiri{ flex-wrap:wrap; }
  .paket-satiri .bilgi{ flex:1 1 100%; order:2; }
  .paket-satiri .fiyat{ order:3; margin-left:auto; text-align:left; }
  .paket-satiri .eylemler{ order:4; flex:1 1 100%; }
  .paket-satiri .eylemler .satir-dugme{ flex:1; justify-content:center; }
  .odeme-satiri{ flex-wrap:wrap; }
  .odeme-satiri .bilgi{ flex:1 1 60%; }
  .odeme-satiri .eylemler{ flex:1 1 100%; }
  .odeme-satiri .eylemler .satir-dugme{ flex:1; justify-content:center; }
}



/* =====================================================================
   34 · BANT — kaynak `.lib-top` / `.lib-sub` (+ `.fit-seam` dikişi)
   ---------------------------------------------------------------------
   Ölçüm: render edilmiş DOM (`dump/fit-render/404.*`, yedi genişlik) —
   slot-1, 2026-09-01. CSS okunmadı (§10 md.3).

   🔴 §25 `.kapak` DEĞİL. İkisi de "üstteki koyu bant" ama ayrı kalemler:
     .kapak  profil kapağı · `--banner-h-profil` 280px · üstüne kimlik
             kartı biner · görsel ZORUNLU
     .bant   liste/duyuru banner'ı · `--banner-h-liste` 544px · içinde
             kırıntı + üst etiket + h1 + alt satır · görsel İSTEĞE BAĞLI
   Karıştırılırsa bant 280px'e düşer ve başlık dikey ortadan kayar.

   🔴 İKİ AYRI KIRILIM NOKTASI (bkz. `tokenlar.css` banner h1 şerhi):
     tipografi  min-width:901   → 42 / 31 / 25
     yükseklik  max-width:1024  → 544 / 607 / 587
   901–1024 arasında bant 607px yüksek ama başlık HÂLÂ 42px.

   YAPI — sıra değişmez:
     .bant                    koyu bant, katmanlı zemin
       .kap                   dikey ORTALI kolon
         .kirinti             ⚠ AKIŞTAN ÇIKAR (absolute) — dikey merkezi
                              kaydırmasın diye. Kaynağın kendi çözümü.
         .ust-etiket          §18'in koyu zemin varyantı
         h1
         .bant-alt            iki satıra kırpılan açıklama

   GÖRSEL İSTEĞE BAĞLI: `--bant-gorsel` boş bırakılırsa üç gradyan katmanı
   tek başına bandı çizer (ölçüldü: kaynağın 404'ü zaten öyle çiziliyor).
   Kanon dış kaynak gömmez; görseli canlı blade doldurur.
   ===================================================================== */

.bant{
  position:relative; overflow:hidden;
  /* 🔴 `height`, `min-height` DEĞİL — B25'in aynı deseni. `fit-shell.css:1881`
     `min-height` yazar ve şerhi "yer yetmezse banner büyür" der, ama `:2590`
     aynı elemanı tekrar bildirip `height:var(--banner-h-liste)` verir; SON
     bildirim geçerli ve `overflow:hidden` ile taşan `padding-bottom` KIRPILIR.
     Ölçüldü (slot-1, altı genişlik): fark her seferinde tam `--hero-alt`
     kadar — 1440/1024/901/900'de +46, 640/390'da +34. Yani kırpılan şey
     boş alt dolgu. `--banner-h-liste` üç dalda tanımlı olduğu için tek
     satır üç kırılımı birden kapatır. */
  /* ⚠ İKİSİ DE YAZILIR. `height` kutunun ölçüsünü belirler (kırpma bundan),
     ama kaynağın `:1881`deki `min-height` bildirimi ELEMANIN ÜSTÜNDE
     DURUYOR ve hesaplanmış değer olarak okunuyor. Yalnız `height` yazmak
     `min-height:0` veriyordu (slot-1 ölçtü). */
  min-height:var(--banner-h-liste);
  height:var(--banner-h-liste);
  padding:calc(var(--kabuk-h) + var(--hero-ust)) 0 var(--hero-alt);
  background:
    var(--bant-perde-aksan),
    var(--bant-perde-ana),
    var(--bant-perde-dip),
    var(--bant-gorsel) var(--bant-gorsel-yeri)/cover no-repeat,
    var(--bant-zemin);
}
.bant>.kap{
  position:relative; z-index:2;
  display:flex; flex-direction:column; align-items:stretch;
  justify-content:center; row-gap:var(--banner-gap);
  min-height:calc(var(--banner-h-liste) - var(--kabuk-h) - var(--hero-ust));
}
/* Kabın doğrudan çocukları kendi dikey marjlarını taşımaz — ritmi
   `row-gap` verir. Marj kalırsa `justify-content:center` kayar. */
.bant>.kap>*{ margin-top:0; margin-bottom:0; }

/* ⚠ KIRINTI AKIŞTAN ÇIKAR. Akışta kalsaydı kolonun dikey merkezini
   yukarı iterdi; kaynak onu bandın üstüne mutlak konumluyor. */
.bant .kirinti{ position:absolute; top:0; margin:0; }

/* §18 `.ust-etiket`in KOYU ZEMİN varyantı — geometri aynı, yalnız renk
   değişir (aksan koyu → aksan parlak; koyu zeminde okunur olan o). */
.bant .ust-etiket{ color:var(--aksan-parlak); }
.bant .ust-etiket::before{ background:var(--aksan-parlak); }

.bant h1{
  font-size:var(--yazi-42); line-height:var(--satir-baslik);
  letter-spacing:var(--aralik-baslik-2);
  max-width:none; margin:0; color:var(--kagit);
}
.bant-alt{
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); max-width:560px;
  color:var(--koyu-metin);
  text-align:left; text-align-last:auto;    /* B36 */
  /* İki satıra kırpılır — başlık uzadığında bant büyümesin diye. */
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical;
  overflow:hidden;
}

/* Tipografi kırılımı 901 — YÜKSEKLİK kırılımı 1024, aynı değil. */
@media (max-width:900px){
  /* `max-width:680px` TABAN kuraldır (`fit-shell.css:2002`); `min-width:901`
     onu yalnız masaüstünde `none`a çeker. 901'in altında geri gelir ve
     başlık 680px'te sarar. ≤640 dalı ayrıca yazmaz — buradan miras kalır. */
  .bant h1{ font-size:var(--yazi-31); letter-spacing:var(--aralik-baslik); max-width:680px; }
}
@media (max-width:640px){
  .bant{ padding:calc(var(--kabuk-h-dar) + var(--hero-ust)) 0 var(--hero-alt); }
  .bant h1{ font-size:var(--yazi-25); }
  .bant-alt{ font-size:var(--yazi-14); }
  /* Başlık satırı kendi ölçüsünü korur: h1 22 (bandın 25'i DEĞİL) ve alt
     metin 13.5'te kalır (bandın 14'üne inmez) — ikisi de ölçüldü. */
  .bant-bas h1{ font-size:var(--yazi-22); letter-spacing:var(--aralik-baslik); max-width:none; }
  .bant-bas .bant-alt{ font-size:var(--yazi-13-5); }
  /* Ortalı alt not dar ekranda ORTALANIR ve sarar — kaynağın şerhi
     ölçmüş: "390px'te yükseklik 39px, 1440'ta 19px; üç kolona bölünmüş
     gibi duruyordu." */
  .alt-not.ortali{ flex-wrap:wrap; justify-content:center; text-align:center; }
}

/* ---- DİKİŞ — bandı izleyen gövde bloğu ------------------------------
   Kaynak `fit-shell.css:3721`. Sınıfı kabuk JS'i çalışma anında basar
   (banttan sonraki ilk opak, yapışkan olmayan blok).
   🔴 GÖLGE YOKTUR. `:3722` `box-shadow:0 -12px 32px …` yazar ama `:3754`
   aynı seçiciyi tekrar bildirip `box-shadow:none` der (Beyar kararı
   2026-08-24: "dikiş yalnız 22px yuvarlak köşe + binmeyle okunacak").
   Render edilmiş DOM'da ölçülen: `none`. CSS okunup durulsaydı gölge
   basılacaktı — §10 md.3'ün ders kitabı örneği (slot-1 yakaladı). */
.dikis{
  position:relative; z-index:2;
  border-radius:var(--dikis-r) var(--dikis-r) 0 0;
}
.dikis.bant-ustunde{ margin-top:calc(-1 * var(--dikis-r)); }
/* Banda KOMŞU olmayan dikiş kendi üst çizgisini taşır — binme yok, ayrım
   çizgiyle okunur. */
.dikis:not(.bant-ustunde){ border-top:var(--cizgi-1) solid var(--cizgi); }


/* ---- BANDIN BAŞLIK SATIRI (slot-1 ⑤) --------------------------------
   Başlık bloğu ve araçlar YAN YANA. `.bant>.kap`ın dikey kolonuna giren
   TEK çocuk; içinde sol blok (h1 + alt metin) ve sağ blok (araçlar) var.

   🔴 h1'İN MARJI BURADA HAYATTA KALIR. `.bant>.kap>*{margin:0}` yalnız
   KABIN DOĞRUDAN çocuklarını sıfırlar; `.bant-bas` bir ARA KAP olduğu için
   içindeki h1 kendi marjını taşır. Ölçülen 10/8 — `--hero-gap` ve ondan
   2px eksiği. Doğrudan `.kap` çocuğu olan h1 ise 0 alır; ikisi AYRI. */
.bant-bas{ display:flex; align-items:center; gap:var(--bosluk-18); padding:2px 0 var(--bosluk-20); }
/* h1 İÇİNDE rozet taşıyabilir ("Bildirimler [3 okunmamış]") — blok
   olursa rozet alt satıra düşüyor (slot-1 ölçtü). */
.bant-bas h1{
  display:flex; align-items:center; gap:var(--bosluk-12); flex-wrap:wrap;
  margin:var(--hero-gap) 0 calc(var(--hero-gap) - 2px);
}
.bant-araclar{ margin-left:auto; flex:none; display:flex; align-items:center; gap:var(--bosluk-10); }
/* 🔴 BAŞLIK SATIRININ ALT METNİ AYRI KİP. Banner ailesinin İKİ alt-metin
   ölçüsü var ve ikisi de ölçüldü (slot-1):
     .bant-alt              bandın KENDİ alt satırı — 15.5 · 560px · 2 satır kırpma
     .bant-bas .bant-alt    başlık satırının alt metni — 13.5 · sınırsız · kırpma YOK
   Kırpma yok çünkü yanında araç düğmeleri var ve blok zaten dar.
   ⚠ §18'in `.giris-metni`si (15.5/520px) de uymuyor — üçüncü bir kalem. */
.bant-bas .bant-alt{
  font-size:var(--yazi-13-5); max-width:none;
  display:block; overflow:visible; -webkit-line-clamp:none;
}

/* Bandın araç düğmeleri — KOYU ZEMİNDE CAM KİPİ. Geometri §47
   `.dugme.orta`nın (11/18 · 13.5), üstüne yalnız renk katmanı geliyor.
   Alfa değerleri marka katmanından: `bilesenler.css` alfa yazamaz. */
/* 🔴 §63d'NİN DÖRDÜNCÜ ÖRNEĞİ — ölçüldü 2026-09-03 (slot-program, GÖZLE).
   Token adları kusuru zaten söylüyordu: `--bant-arac-*` = KİMLİK BANDININ
   araç düğmesi, yani koyu kapak görseli üstünde durması gereken kalem.
   Kanon onu `.dugme`nin KAPSAMSIZ varyantı olarak yazmış; açık kartta
   beyaz-üstüne-beyaz oluyor (ölçüldü: color rgb(255,255,255) ·
   background rgba(255,255,255,.12) · kart zemini #ffffff → ~1:1) ve
   DOKUZ düğme görünmez hâle geliyordu. `kapi-komsu` ve `kapi-standart`
   İKİSİ DE yeşildi.
   Artık taban AÇIK yüzey; cam kipi KOYU bağlamlarda geliyor.
   ⚠ Bileşenin şu an tüketicisi 0 (slot-program parçalarını `.hayalet` ve
     `.sayfa-dugme`ye çevirdi) — yani bu düzeltme bir gerileme riski
     taşımıyor, sözleşmeyi AÇIK hâle getiriyor. */
.dugme.cam{
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  color:var(--murekkep);
}
.kimlik-bant .dugme.cam,
.kapak .dugme.cam,
.ozet-karti .dugme.cam{
  background:var(--bant-arac-zemin); border-color:var(--bant-arac-kenar);
  color:var(--kagit);
}
.kimlik-bant .dugme.cam:hover,
.kapak .dugme.cam:hover,
.ozet-karti .dugme.cam:hover{
  background:var(--bant-arac-zemin-2); border-color:var(--bant-arac-kenar-2);
  color:var(--kagit);
}
/* 🔴 KAYNAKTA `.btn` AİLESİNDEN DEĞİL. `.see-all` ve `.icon-btn` kaynağın
   AYRI bileşenleri; §47 geometriyi doğru almış ama KUTU DAVRANIŞI §2'nin
   `.dugme` tabanından miras kalıyordu ve yedi bildirimde birden ayrışıyordu
   (ölçüldü @1440 · slot-1 ②③). Taban `.dugme` bir ızgara/esnek kutu
   kurar — ortalar, sarar, esner; kaynağın araç düğmesi bunların hiçbirini
   yapmıyor: soldan yazar, sarmaz, daralmaz. */
.dugme.cam{
  gap:var(--bosluk-9); justify-content:normal; text-align:left;
  flex-shrink:0; white-space:nowrap;
}
.dugme.cam:hover{ background:var(--bant-arac-zemin-2); border-color:var(--bant-arac-kenar-2); color:var(--kagit); }
/* Düğmenin içindeki ok/ikon kendi ölçüsünü yazar — §2'nin 13.5'i değil
   13px ve satır boyu KİLİTLİ (13px = 1), yoksa düğmenin dikey ortası
   metne göre kayıyor (ölçüldü). */
.dugme.cam i{ font-size:var(--yazi-13); line-height:1; }
/* ⚠ İKON DÜĞMESİNDE GEÇERSİZ: orada ikon düğmenin KENDİ punto'sunu alır
   (16px · @390 15px). Yukarıdaki kural metin düğmesinin küçük okuna aitti
   ve ikon düğmesine de sızdı — ölçüm yakaladı. */
.dugme.cam.ikon i{ font-size:inherit; line-height:1; }
/* 🔴 METİN DÜĞMESİNDE ÖRTÜ DENENDİ VE ÖLÇÜM ÇÜRÜTTÜ. §43'ün
   `.cip::before` örtüsü `position:relative` ister; kaynağın `.see-all`ı
   `static` ve örtü tek 🔴'yı ikiye çıkardı (`minHeight` + `position`).
   Metin düğmesi §29 md.15'in TABANINDA kalır (`min-height:44px`) ve
   ölçümde `sapma` sayılır — arama ekranının `kutuDugme.minHeight`iyle
   aynı kural, aynı gerekçe (md.21). Çizim 43 → 44, bir piksel.
   ⚠ İkon düğmesi AYRI: kaynağı zaten `position:relative` ve kutusu SABİT
   43×43 kare — md.15 orada çizimi bozar, örtü orada bedava. */
/* İkon düğmesi — kaynak `.icon-btn`. Kare, dolgusuz, ızgara ortalı ve
   kendi yazı kipini taşır (16/500/1.55) — §2'nin 13.5/700'ü DEĞİL.
   `grid-template-columns:none`: §47 tek sütun bildiriyor ve ikon o
   sütuna sıkışıyordu; kaynakta örtük sütun kutuyu dolduruyor (41px). */
.dugme.cam.ikon{
  width:43px; height:43px; min-height:auto; padding:0;
  display:grid; place-items:center; position:relative;
  grid-template-columns:none; gap:normal;
  /* 🔴 `.dugme.cam`ın kutu davranışı BURADA GEÇERSİZ: metin düğmesi
     daralmaz ve sarmaz, ikon düğmesi kaynakta ikisini de yapar
     (ölçüldü: flex-shrink 1 · white-space normal). Kardeş kalemler,
     ortak ata — ama davranışları ayrı. */
  flex-shrink:1; white-space:normal;
  font-size:var(--yazi-16); font-weight:var(--agirlik-govde);
  line-height:var(--satir-govde); text-align:start;
}
/* Dokunma hedefi — kutu 43×43 kalır, hedef 44×44 olur (§43'ün yöntemi).
   Kaynak zaten `position:relative`, örtü bedava. */
.dugme.cam.ikon::before{
  content:""; position:absolute; left:50%; top:50%;
  width:44px; height:44px; transform:translate(-50%,-50%);
}
@media (max-width:640px){
  /* Kabuğun ≤640 "kompakt see-all"ı düğme kabuğunu SÖKÜYOR (padding:0 ·
     border:none) — bölüm başlıklarında doğru, ama bu düğmeler KOYU BANT
     üzerinde duruyor ve kaybolyorlardı (390px'te yükseklik 15px / border 0
     ölçülmüş). Banttaki kopya kabuğunu bilerek geri alıyor. */
  /* 🔴 Kaynak metin düğmesini dar ekranda KONUMLU yapıyor (ölçüldü:
     masaüstü `static` → @390 `relative`). Kabuğun kompakt kipinin kendi
     bildirimi; kanon çizileni basar, gerekçesini sormaz. */
  .dugme.cam{ padding:0 var(--bosluk-14); height:38px; font-size:var(--yazi-13); position:relative; }
  /* İkon düğmesi dar ekranda BÜYÜR (43 → 44) ve yazısı küçülür (16 → 15).
     Ölçüldü @390: iç sütun 42px (= 44 − 2×1 kenar) · 15px/23.25.
     ⚠ Kutu 44'e çıkınca örtü kutuyla aynı boyda kalır, sorun değil. */
  .dugme.cam.ikon{ width:44px; height:44px; font-size:var(--yazi-15); }
}

/* Bant başlığının yanındaki sayaç rozeti (slot-1 ④).
   🔴 §5 `.rozet.olumlu` YAKIN ama ÜÇ yerde ayrışıyor — 11.5↔12 punto,
   4/12↔5/11 dolgu, `--aksan-cizgi`↔alfalı kenar. Ayrı varyant. */
.rozet.sayac{
  /* 🔴 KUTU KİPİ §5'İN DEĞİL. Rozet `h1`in İÇİNDE bir `<span>` ve kaynak
     ona display bildirmiyor — akış kutusu olarak, satır kutusunun
     içinde çiziliyor. §5'in `inline-flex`i buraya sızınca hem hiza hem
     harf aralığı ayrışıyordu (ölçüldü @1440: FIT `block` · `-1.26px`
     ↔ kanon `inline-flex` · `+0.24px`).
     `letter-spacing:inherit` şart: -1.26px uydurma bir değer değil,
     h1'in `--aralik-baslik-2`si (-.03em × 42px). Kanonun
     `--aralik-genis`i (+.02em) ters yöne gidiyordu. (slot-1 ①) */
  display:block; align-items:normal; gap:normal; min-width:auto;
  letter-spacing:inherit;
  flex:none; white-space:nowrap;
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  padding:var(--bosluk-5) var(--bosluk-11);
  border-radius:var(--yuvarlak-sm);
  color:var(--aksan); background:var(--aksan-yikama);
  border:var(--cizgi-1) solid var(--aksan-cizgi-3);
}

@media (max-width:640px){
  .bant-bas{ flex-wrap:wrap; gap:var(--bosluk-12); padding-bottom:var(--bosluk-16); }
  .bant-araclar{ margin-left:0; width:100%; }
}


/* =====================================================================
   35 · DURUM EKRANI — kaynak `.dr-*` (assets/css/fit-durum.css)
   ---------------------------------------------------------------------
   ALTI EKRAN TEK BİLEŞEN: 404 · 403 · 500 · bakım · oturum süresi doldu ·
   çevrimdışı. Kaynak bunları ayrı ayrı yazmamış, tek kit paylaşıyorlar;
   ekranlar yalnız hangi PARÇALARI kullandıklarıyla ayrışıyor.
   Ölçüm: slot-1, render edilmiş DOM @1440.

   YAPI:
     .durum-kolon              900px okuma kabı (§23'ün 860'ı DEĞİL)
       .durum-giris            ikon + başlık + açıklama
         .durum-ikon           62px daire · üç durum rengi
       .durum-arama            isteğe bağlı arama satırı
       .durum-blok             ikincil bölümler
       .durum-cikis            yönlendirme kartları ızgarası
       .durum-sik              sık bağlantı çipleri
       .durum-rozet            bağlantı durumu (çevrimdışı)
       .durum-alan             kesikli kenarlı alan adı (bakım)
   ===================================================================== */

.durum-kolon{ max-width:var(--durum-kolon); }

.durum-giris{ display:flex; gap:var(--bosluk-20); align-items:flex-start; }
.durum-ikon{
  flex:none; width:62px; height:62px;
  border-radius:var(--yuvarlak-daire);
  display:grid; place-items:center; font-size:var(--yazi-25);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
}
.durum-ikon.uyari{ background:var(--uyari-yikama); color:var(--uyari); }
.durum-ikon.dur{   background:var(--tehlike-yikama); color:var(--tehlike); }

.durum-giris h2{
  font-size:var(--yazi-23); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik-2); letter-spacing:var(--aralik-baslik);
  margin:0 0 var(--bosluk-8);
}
.durum-giris p{
  font-size:var(--yazi-15-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-bol); color:var(--murekkep-yumusak);
  max-width:var(--olcu);
  text-align:left; text-align-last:auto;    /* B36 */
}
.durum-giris p+p{ margin-top:var(--bosluk-11); }

.durum-arama{ display:flex; gap:var(--bosluk-10); margin-top:var(--bosluk-24); flex-wrap:wrap; }
.durum-arama input{
  flex:1 1 260px; min-width:0; height:48px; padding:0 var(--bosluk-16);
  font-family:inherit; font-size:var(--yazi-15); font-weight:var(--agirlik-govde);
  color:var(--murekkep); background:var(--zemin);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  outline:none;
}
.durum-arama input:focus{ border-color:var(--aksan-koyu); }
.durum-arama .dugme{ height:48px; flex:none; }

.durum-blok{ margin-top:var(--bosluk-34); }
.durum-blok h3{
  font-size:var(--yazi-17); font-weight:var(--agirlik-kalin);
  line-height:var(--satir-baslik); letter-spacing:var(--aralik-baslik);
  margin:0 0 var(--bosluk-10);
}

/* Yönlendirme kartları — "buradan nereye gidebilirsin". `auto-fit` ile
   ekran daraldıkça kolon sayısı kendi düşer, kırılım kuralı gerekmez. */
.durum-cikis{
  display:grid; grid-template-columns:repeat(auto-fit,minmax(230px,1fr));
  gap:var(--bosluk-14); margin-top:var(--bosluk-30);
  list-style:none; padding:0;
}
.durum-cikis a{
  display:flex; gap:var(--bosluk-14); align-items:flex-start; height:100%;
  background:var(--kagit); border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-lg); padding:var(--bosluk-18) var(--bosluk-20);
  box-shadow:var(--golge-sm);
  transition:var(--sure) var(--yumusama);
}
.durum-cikis a:hover{
  border-color:var(--aksan); box-shadow:var(--golge-md);
  transform:translateY(-2px);
}
.durum-cikis a>i{
  color:var(--aksan-koyu); font-size:var(--yazi-17);
  margin-top:2px; flex:none; width:20px; text-align:center;
}
.durum-cikis b{
  display:block; font-size:var(--yazi-15); font-weight:var(--agirlik-kalin);
  color:var(--murekkep); margin-bottom:3px;
}
.durum-cikis small{
  display:block; font-size:var(--yazi-13); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil); line-height:var(--satir-govde);   /* 🔴 1.5 → 1.55 (ölçüldü) */
  text-align:left; text-align-last:auto;    /* B36 */
}

/* 🔴 `list-style:none` ZORUNLU — bu bir `<ul>` ve kabuğun `*{padding:0}`ı
   yalnız dolguyu sıfırlıyor, madde imini değil. Kanonda eksikti: her çipin
   solunda siyah bir disk çiziliyordu (slot-1, 1440 ekran görüntüsü). */
.durum-sik{
  display:flex; flex-wrap:wrap; gap:var(--bosluk-9); margin-top:var(--bosluk-16);
  list-style:none; padding:0;
}
.durum-sik a{
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  min-height:38px; padding:0 var(--bosluk-14);
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-orta);
  color:var(--murekkep); background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-cip);
  transition:var(--sure) var(--yumusama);
}
.durum-sik a:hover{ border-color:var(--aksan); color:var(--aksan-koyu); }
.durum-sik a i{ font-size:var(--yazi-12); color:var(--aksan-koyu); }

/* Bağlantı durumu rozeti — çevrimdışı ekranı. Nokta `currentColor`dan
   boyanır, yani durum rengi TEK yerde yazılır. */
.durum-rozet{
  display:inline-flex; align-items:center; gap:var(--bosluk-10);
  margin-top:var(--bosluk-22); min-height:44px; padding:0 var(--bosluk-18);
  border-radius:var(--yuvarlak-cip);
  font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  background:var(--tehlike-yikama); color:var(--tehlike);
  border:var(--cizgi-1) solid var(--tehlike-cizgi);
  text-align:left; text-align-last:auto;    /* B36 */
}
.durum-rozet.cevrimici{
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  border-color:var(--aksan-cizgi);
}
.durum-rozet .nokta{
  width:9px; height:9px; border-radius:var(--yuvarlak-daire);
  background:currentColor; flex:none;
}

/* Alan adı — bakım ekranında "hangi adres bakımda" bilgisi. Kesikli kenar
   §7'nin boş durum kenarıyla aynı dili konuşur: "burada içerik yok". */
.durum-alan{
  display:inline-block; padding:3px var(--bosluk-10);
  border-radius:var(--yuvarlak-rozet);
  border:var(--cizgi-1) dashed var(--cizgi);
  background:var(--zemin); color:var(--metin-ikincil);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta);
  font-style:normal;
}

@media (max-width:640px){
  .durum-giris{ flex-direction:column; gap:var(--bosluk-14); }
  .durum-ikon{ width:54px; height:54px; font-size:var(--yazi-22); }
  .durum-giris h2{ font-size:var(--yazi-20); }
  .durum-giris p{ font-size:var(--yazi-15); }
  .durum-arama .dugme{ width:100%; justify-content:center; }
}


/* =====================================================================
   ⛔ [hidden] — TEK YETKİLİ KURAL                (2026-09-01 · 02 §36 · B42)
   ---------------------------------------------------------------------
   B37 "display bildiren HER bileşen `[hidden]` kuralını da yazmalı" demişti
   ama yalnız o turun altı kalemi kapanmıştı. Denetlendi: bu dosyada
   **display bildiren 72 sınıftan 68'i** `[hidden]` kuralı yazmıyordu.
   Ekranda görünür kusur da üretti — `.rozet{display:inline-flex}` yüzünden
   hesabim'in BOŞ ve `hidden` işaretli ikinci rozeti boş bir hap olarak
   çiziliyordu (slot-2 ölçümü, 1440 ekran görüntüsünde görülüyor).

   🔴 NEDEN 68 AYRI KURAL DEĞİL, TEK KURAL: `[hidden]` bir biçim tercihi
   değil, HTML'in ANLAMSAL sözleşmesidir — "bu eleman ekranda yok". Hiçbir
   bileşen kuralının onu ezmesi doğru değil. 68 satır yazmak aynı hatayı
   69. bileşende tekrar etmeye açık bırakırdı; bu kural kapıyı kapatır.

   🔴 NEDEN `!important`: `[hidden]` (0,0,1) özgüllükte ve kanonda ondan
   güçlü seçiciler var (`.kart.panel>.kart-govde:not(.bosluksuz)` (0,4,0)
   gibi). Dosya sonuna koymak yalnız EŞİT özgüllüktekileri yener, daha
   güçlü olanları yenmez. Dosyadaki İKİNCİ `!important` budur (diğeri
   `.dugme[disabled]`in `transform:none`u) ve gerekçesi anlamsaldır,
   estetik değil.

   ⚠ Yukarıdaki tekil `[hidden]` kuralları (`.alan-izgara` `.bos-durum`
   `.ayar-satir` `.bilgi-notu` `.akordeon-kalem` `.alan-dosya-sil`) BİLEREK
   duruyor: her biri kendi bulgusunun (B37 ailesi) kaydını taşıyor ve bu
   kural onları yalnız pekiştirir, çelişmez.
   ===================================================================== */
[hidden]{ display:none !important; }


/* =====================================================================
   66 · BANT YÜKSEKLİK AİLELERİ — kapı ölçütü
   ---------------------------------------------------------------------
   BEYAR KURALI, 2026-09-02. Marka bağımsız, dört markada geçerli:

     · Liste sayfaları kendi aralarında aynı yükseklik
     · Detay sayfaları kendi aralarında aynı yükseklik
     · Yasal sayfalar DETAY grubuna dahil
     · Görselli ve saydam header'lı banner'lar tutarlı

   ── ÖNCE ŞU: KANONDA DEĞER ZATEN VARDI ───────────────────────────────
   Bu blok yazılırken önce `01-tokenlar.md` TARANMADI ve üç token'ın
   kopyası üretildi (`--bant-h`, `--bant-h-derin`, `--kapak-h`). Hata
   ölçümle yakalandı ve geri alındı; kopyalar SİLİNDİ. Kanonun kendi
   kuralı: "token yazmadan önce 01-tokenlar.md taranır."

   Ölçüm o yüzden bir DOĞRULAMA turu oldu ve kanonu haklı çıkardı:

     token                 kanon      ölçülen (60 sayfa)   sonuç
     --------------------  ---------  -------------------  --------
     --banner-h-liste      544 / 587  544 / 587            ✅ tuttu
     --banner-h-detay      560 / 726  560 / 726            ✅ tuttu
     --banner-h-profil     280 / 170  280 / 280            🔴 ÇELİŞTİ

   ── ÖLÇÜM ────────────────────────────────────────────────────────────
   `dump/fit-prototip` · 60 arayüz sayfası (admin-* hariç) · Playwright ·
   1440×1000 ve 390×844 · `getBoundingClientRect` + `getComputedStyle`.
   Lead 12 sayfada BAĞIMSIZ İKİNCİ ÖLÇÜM yaptı, hepsi birebir tuttu.
   Rapor: `rapor/olcum-banner.md` · ham: `rapor/olcum/banner-ham.json`

   🔴 SEÇİCİ TUZAĞI — `#fitModulTop` ve `#fitPlanTop` kabuk JS'i tarafından
   `outerHTML` ile TAMAMEN değiştiriliyor; id'leri render sonrası DOM'da
   YOK. Statik HTML'de bu elemanların adı bile doğru değil. Kapak ailesi
   `.fp-kapak` ile sorgulanır, id ile DEĞİL.

   ── AİLELER ──────────────────────────────────────────────────────────
     AİLE 1 · LİSTE   `.bant`        --banner-h-liste   544/587
              LISTE(21) + DURUM(6) = 27/27 TAM TUTARLI, tek sapma yok.
     AİLE 2 · DETAY   `.bant.derin`  --banner-h-detay   560/726
              DETAY + YASAL. Çoğunluk 5/11 — sapmalar §66a'da.
     AİLE 3 · KAPAK   `.kapak`       --banner-h-profil  280
              11/11 TAM TUTARLI (MODUL 8 + hesabim + iki fitPlanTop).

   ⚠ GÖRSEL VARLIĞI YÜKSEKLİĞİ ETKİLEMİYOR — ölçüldü: DURUM'un 6 GÖRSELSİZ
     sayfası, LISTE'nin 20 GÖRSELLİ sayfasıyla BİREBİR aynı kutuda.
     Beyar'ın "görselli banner'lar tutarlı" kuralı ölçümle DOĞRULANDI;
     görsel bir yükseklik değişkeni değil.

   ⚠ KİMLİK AKIŞI (giris-v1) BU SÖZLEŞMENİN DIŞINDA. `.au-top` bir banner
     değil, kırıntı + iki kolonlu hero + form bölümünün TAMAMI (1296/1596).
     Kaynakta ayrı, dar bir kimlik bandı YOK — yani "KIMLIK banner
     yüksekliği" diye bir değer kanona YAZILAMAZ; olmayan bir bileşene
     değer vermek uydurma olurdu. §61 kimlik akışının kuralları geçerli.
   ===================================================================== */

/* AİLE 2 · DETAY BANDI — 🔴 `--banner-h-detay` ÖLÜ TOKEN'DI.
   `tokenlar.css`te üç dalda tanımlıydı (560 · 617 · 726) ama
   `bilesenler.css`te HİÇBİR TÜKETİCİSİ YOKTU — yani detay ailesi kanonda
   tanımlı ama BASILAMAZ durumdaydı. HANDOFF §5'in "ölü varyant: kural var
   tüketicisi yok" tuzağının birebir örneği; bu satır onu kapatır.
   `.bant`ın kendi `height` kuralını (B25 şerhi, §34) EZMEZ — yalnız
   değeri değiştirir, kip aynı kalır. */
.bant.derin{ height:var(--banner-h-detay); min-height:var(--banner-h-detay); }

/* ---------------------------------------------------------------------
   66a · 🔴 ÇELİŞKİ · KAPAK DAR EKRANDA KÜÇÜLÜYOR MU
   ---------------------------------------------------------------------
   Kanon `--banner-h-profil-dar:170px` diyor ve `.kapak` @≤640 onu
   kullanıyor (satır 1848). Ölçüm FIT'in kapak ailesinde 280 → **280**
   buldu: 11 sayfanın 11'i de dar ekranda KÜÇÜLMÜYOR.

   Ölçüm üç ayrı "profil kapağı" reçetesi olduğunu gösterdi:

     .fp-kapak   280 → 280   MODUL(8) + hesabim + 2 fitPlanTop = 11 sayfa
     .pf-banner  280 → 170   profil-v1 · 1 sayfa
     .cp-banner  150 → 120   antrenor-detay-v1 · 1 sayfa

   Yani kanonun `170`i `.pf-banner`ın değeridir ve TEK sayfadan gelir;
   yaygın olan (11 sayfa) `.fp-kapak` ve o küçülmüyor.

   ✅ ÇÖZÜLDÜ — BEYAR KARARI, 2026-09-02: "kanon yanlış, ölçüm doğru".
      `--banner-h-profil-dar` **170 → 280** çekildi (tokenlar.css).
      `.kapak`ın @≤640 kuralı DURUYOR çünkü yüksekliğin yanında
      `border-radius`u da düşürüyor; artık yalnız yuvarlaklık değişiyor,
      yükseklik iki genişlikte de 280.

   🔴 KALAN KUSUR — üç bileşen aynı tasarım niyetini paylaşıp üç ayrı
      reçete taşıyor (.fp-kapak · .pf-banner · .cp-banner). Kanon en
      yaygın olanı aldı; diğer ikisi kaynakta kusur olarak kayıtlı ve
      DÜZELTİLMEDİ.
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   66b · HEADER SAYDAMLIĞI — banner AİLESİNE bağlı, sayfaya değil
   ---------------------------------------------------------------------
   Ölçüldü: 60 sayfanın 48'inde header saydam, 12'sinde opak beyaz. Ayrım
   %100 tek şeye bağlı — sayfa KAPAK ailesini mi kullanıyor:

     .kapak taşıyan sayfa   →  header OPAK   (12 sayfa)
     diğer her aile         →  header SAYDAM (48 sayfa · `.tepede`)

   Gerekçe ölçümde: kapak bir FOTOĞRAF + üstüne binen kimlik kartıdır ve
   saydam header kartın üst şeridini keser (bu kusur v2'de bir kez
   yakalandı — KOPYALAMA-KURALI "JS'in eklediği durum sınıfları" maddesi).
   Düz/derin bantta perde zaten koyu, saydam header bandın parçası okunur.

   🔴 TEK KURAL DIŞI ÖRNEK — `antrenor-detay-v1` (`.cp-top`). Yapısal
      olarak `profil-v1`in birebir aynısı (kaynağın kendi yorumu da
      "referans `.pf-banner`" / "referans `.pf-head`" diyor) ama header
      SAYDAM, profil-v1'de OPAK. Kaynakta kusur — bildirildi, düzeltilmedi.
   --------------------------------------------------------------------- */
body:has(.kapak) .kabuk-basi.tepede{
  background:var(--kagit);
  box-shadow:var(--golge-sm);
}

/* ---------------------------------------------------------------------
   66c · ÖLÇÜLEN SAPMALAR — kaynakta kusur, DÜZELTİLMEDİ
   ---------------------------------------------------------------------
   | sayfa                   | ölçülen        | ailesi          | fark        |
   |-------------------------|----------------|-----------------|-------------|
   | fit-testi-sonuc-v1      | 544 / 587      | DETAY (560/726) | −16 / −139  |
   | yasal-v1                | 544 / 587      | DETAY (Beyar)   | −16 / −139  |
   | antrenor-detay-v1       | 577.78/736.31  | DETAY           | +17.8/+10.3 |
   | profil-v1               | 687.84/876.09  | KAPAK           | başka bileşen|
   | arama-fit-v1 (@390 pb)  | 24px           | 34px            | −10px       |
   | antrenor-ol-v1 (@390)   | pt 77 / pb 14  | pt 96 / pb 34   | −19 / −20   |

   🔴 `fit-testi-sonuc-v1` KARDEŞİYLE ÇELİŞİYOR: `fit-testi-detay-v1` aynı
      `.lib-top` seçicisini kullanıp 560/726 veriyor, sonuç sayfası 544/587.
      İki kardeş ekran, iki farklı aile.

   🔴 `antrenor-detay-v1` KENDİ NİYETİNE OTURMUYOR. Kaynağın kod yorumu:
      "Yüksekliği flex:1; kabuğun kilitlediği aile sabitinden (560/617/726)
      artan alanı yutuyor, böylece toplam her genişlikte sabite oturuyor."
      Ölçülen değer o sabite oturmuyor — kaynağın kendi hedefiyle çelişen,
      ölçülmüş kusur.

   ⚠ `yasal-v1` fiilen bir LİSTE bandı taşıyor. Beyar "yasal detay grubuna
     dahil" dediği için kanon onu DETAY sayar; kaynak sapması burada kayıtlı.
   --------------------------------------------------------------------- */

/* =====================================================================
   67 · MOBİL KABUK SÖZLEŞMESİ — kapı ölçütü
   ---------------------------------------------------------------------
   BEYAR KURALI, 2026-09-02. Marka bağımsız, DÖRT MARKADA geçerli:

     · Alt gezinti çubuğundaki ikonlar her ekranda AYNI SIRADA
     · Yan menü · üst çubuk · alt çubuk — markanın her ekranında birebir aynı
     · KABUK EKRANIN DEĞİL MARKANIN MALIDIR
     · Alt çubuğun YAPISI dört markada aynı: kaç kalem, hangi sırada,
       hangisi FAB. İçerik markaya göre değişir, POZİSYON ROLÜ SABİT.

   ── BU BLOK NEDEN VAR ────────────────────────────────────────────────
   Kanon kabuğun yalnız İKİ diliminianlatıyordu:
     §26  kenar kalemleri (sağ şerit · kenar sekmesi · yüzen düğmeler)
     §27  kabuk gövdesinin TİPOGRAFİ katmanı
   §27 kendi şerhinde eksiği zaten kaydetmişti:
     "Süs kalemleri (marka değiştirici hapları, mağaza rozetleri, avatar
      menüsü, mega menü, çekmece) hâlâ markanın kendi kabuk dosyasından
      geliyor. SIRADAKİ DİLİM ORASI."
   §67 o dilimdir. Yeni bir standart icat etmiyor; kanonun kendi kaydettiği
   boşluğu kapatıyor.

   ── ÖLÇÜM ────────────────────────────────────────────────────────────
   FIT : `dump/fit-prototip` · 61 sayfa · 390×844 · render edilmiş DOM
   DIET: `dump/diet-hesap/<marka>/sayfa.html` · render edilmiş dump · 3 sayfa
   🔴 YOL ŞERHTE GLOB İLE YAZILAMAZ. Özgün hâlinde <marka> yerine
      yıldız-eğik çizgi vardı ve o iki karakter CSS'te ŞERH KAPANIŞIDIR:
      şerh ORADA bitiyor, kalan düzyazı CSS diye ayrıştırılıyor ve
      ayrıştırıcı arkasındaki `:root{--alt-cubuk-h…}` bloğunu YUTUYORDU.
      Ölçüldü: 13 FIT ekranının 13'ünde `--alt-cubuk-h` sayfada
      ÇÖZÜLMÜYORDU; §67'nin kendi token bloğu ölü doğmuştu.
      Kapı: `scripts/olcum/kapi-yorum.mjs`.
   Rapor: `rapor/olcum-mobil-kabuk.md`
   ⚠ GASTRO ve GOURMET ÖLÇÜLEMEDİ — depoda dump'ları yok. Kural dört
     marka için yazıldı ama YALNIZ İKİSİNDE doğrulandı. Diğer ikisi
     geldiğinde bu blok yeniden sınanır.
   ===================================================================== */

/* ---------------------------------------------------------------------
   67.1 · ALT ÇUBUK — YAPI SÖZLEŞMESİ
   ---------------------------------------------------------------------
   ÖLÇÜLEN YAPI — iki markada da AYNI ve bu tesadüf değil, sözleşmedir:

     kalem sayısı   5
     FAB pozisyonu  3 (orta)
     yükseklik      64px
     dip payı       14px
     kalem kipi     <a> · ikon + etiket, dikey

   FIT'te 59/61 sayfada TEK dizi ölçüldü — sıra hiç bozulmuyor, çünkü
   kabuk tek bir `BOTTOM` dizisinden basılıyor. Yapısal olarak bozulamaz
   ve kanon bunu şart koşar: alt çubuk SAYFA MARKUP'INDAN basılmaz.

   🔴 ALT ÇUBUK GİZLENEBİLİR AMA DEĞİŞTİRİLEMEZ. Meşru OLMAYAN, çubuğu
      farklı kalemlerle basmaktır.

   ⚠ BİR ÖLÇÜM DÜZELTİLDİ. İlk turda `dadafit-hub-v1`in çubuğu
     `display:none` görünmüştü; bu bir ÖLÇÜM ARTIĞIYDI. Sayfa 40+ harici
     Unsplash görseli çekiyor ve `file://` altında `load` olayı hiç
     bitmiyor → Playwright zaman aşımına düşüp kabuk kurulmadan ölçüyordu.
     `domcontentloaded` + `.bottom-nav` beklemesiyle yeniden ölçüldü
     (lead bağımsız doğruladı): çubuk ORADA — `display:flex` · z90 · 64px
     · 5 kalem, diğer 59 sayfayla birebir aynı.
     🔴 DERS: `networkidle` beklemek harici varlık çeken sayfalarda YANLIŞ
        ÖLÇÜM üretir ve yokluk gibi görünür. Kabuk ölçümünde bekleme
        ölçütü `domcontentloaded` + hedef elemanın kendisidir.
     Kabuğu gerçekten olmayan tek sayfa `index.html` — o bir geliştirme
     dizini, ürün ekranı değil.
   --------------------------------------------------------------------- */

:root{
  --alt-cubuk-h:64px;          /* ölçüldü · FIT 59 sayfa */
  --alt-cubuk-dip:14px;        /* ölçüldü */
  --alt-cubuk-kalem:5;         /* SÖZLEŞME · dört markada aynı */
  --alt-cubuk-fab-poz:3;       /* SÖZLEŞME · orta kalem */
}

/* ---------------------------------------------------------------------
   67.2 · POZİSYON ROLLERİ — ✅ BEYAR KARARI, 2026-09-02
   ---------------------------------------------------------------------
   Beyar'ın kuralı: "pozisyon rolü sabit kalır, içerik markaya göre
   değişir." Ölçüm YAPIYI doğruladı (5 kalem · FAB 3) ama ROLLERİ
   doğrulamadı — iki marka yalnız TEK pozisyonda anlaşıyordu:

     poz  DIET (ölçüldü)                  FIT (ölçüldü)                 v2
     ---  ------------------------------  ----------------------------  ------
      1   Sağlık Araçları  fa-toolbox     Ana Sayfa      fa-house       FARKLI
      2   Beslenme         fa-seedling    Hareketler     fa-person-run  ✅ AYNI
      3   Diyetisyen       fa-user-doctor Programlar     fa-dumbbell    FARKLI ← FAB
      4   Programlar       fa-clipboard   Programlarım   fa-dumbbell    FARKLI
      5   Ana Site         fa-house       Profil         fa-user        FARKLI

   `fa-house` Diyet'te 5., FIT'te 1. pozisyondaydı; ortadaki FAB Diyet'te
   UZMANA, FIT'te İÇERİK MERKEZİNE gidiyordu. Beyar'ın gördüğü tutarsızlık
   buydu ("Diyet'in mobilinde ortada profil ikonu var" — ölçüm o ikonun
   `fa-user-doctor`, yani DİYETİSYEN olduğunu gösterdi).

   🔴 ROL TABLOSU ÖLÇÜMLE BELİRLENEMEZ. İki markanın çoğunluğu yok
      (2 marka, 1 kesişim). Kanon tabloyu UYDURMADI, Beyar'a sordu.

   ── KANON TABLOSU (onaylandı) ────────────────────────────────────────
   Her pozisyon, DÖRT markanın da SAYFASI OLAN bir role bağlandı — yani
   hiçbir marka için boş kalmıyor ve "yer tutucu kalem" doğmuyor.

     poz  ROL       ne demek                        diet          fit
     ---  --------  ------------------------------  ------------  --------------
      1   KEŞİF     markanın araç/kütüphane girişi  Sağlık Araç.  Hareketler
      2   ÖZ        markanın ana içerik ekseni      Beslenme      Programlar
      3   UZMAN     uzmanla buluşma          ⭐FAB   Diyetisyen    Antrenörler
      4   KİŞİSEL   kullanıcının kendi alanı        Planım        Programlarım
      5   HESAP     profil / hesap                  Hesabım       Profil

   Gastro'da 3. pozisyon Şef, Gourmet'te İşletme olur — ikisi de ölçülmedi
   (dump yok), tablo onlara UYGULANIR ama DOĞRULANMADI.

   ── 67.3 · ETİKET DE ORTAK · BEYAR KARARI, 2026-09-02 ────────────────
   "Rol tablosunda etiketler de ortak olacak, sadece pozisyon değil.
    Rol aynıysa ETİKET de aynı olmalı. Markaya göre değişen sadece o
    rolün İÇERİĞİ olacak, rolün ADI değil."

   Yani alt çubuk KABUK KELİME DAĞARCIĞI taşır, marka kelime dağarcığı
   değil. Gerekçe ekosistemde: sol marka rayı kullanıcıyı yedi marka
   arasında gezdiriyor; pozisyon sabit ama kelime değişirse kullanıcı her
   geçişte çubuğu yeniden okumak zorunda kalır.

     poz  ETİKET (dört markada AYNI)   İÇERİK (markaya göre değişir)
     ---  --------------------------   ---------------------------------
      1   Keşfet                       fit: hareket kütüphanesi
                                       diet: besin kütüphanesi
      2   Programlar                   fit: program merkezi
                                       diet: beslenme programları
      3   Uzmanlar          ⭐FAB       fit: antrenörler
                                       diet: diyetisyenler
      4   Planım                       fit: programlarım
                                       diet: planım
      5   Hesabım                      dört markada da hesap alanı

   ── ETİKETLERİN KAYNAĞI — hangisi ölçüldü, hangisi seçildi ───────────
   🔴 Bu ayrım önemli: ikisi ölçümle geldi, üçü seçim.

     poz 2 "Programlar"  ✅ ÖLÇÜLDÜ — İKİ MARKADA DA BU KELİME ZATEN VAR.
                            diet `/programlar` · fit `label:'Programlar'`
                            (fit-shell.js). Ortak kelime uydurulmadı,
                            bulundu.
     poz 4 "Planım"      ✅ ÖLÇÜLDÜ — İKİ MARKADA DA VAR. diet-hesap
                            dump'ında `planim` sayfası; fit'te header
                            düğmesi `.btn-plan` metni "Planım" (390px
                            kabuk ölçümünde okundu).
     poz 5 "Hesabım"     ✅ BEYAR SEÇTİ — "kullanıcının kendi alanı,
                            profil sayfasından daha geniş". Diyet zaten
                            "Hesabım" diyordu, FIT "Profil"; Beyar
                            Diyet'inkini dördüne birden verdi.
     poz 1 "Keşfet"      ⚠ SEÇİM — hiçbir markada bu kelime ölçülmedi.
                            Rol adı olarak seçildi çünkü iki markanın
                            kalemi de (Sağlık Araçları · Hareketler) bir
                            KÜTÜPHANE girişiydi ve ortak bir üst ad
                            gerekiyordu.
     poz 3 "Uzmanlar"    ⚠ SEÇİM — hiçbir markada bu kelime ölçülmedi.
                            "Diyetisyen" ve "Antrenörler" aynı rolün iki
                            marka adıdır; ortak ad seçildi.

   ⚠ İKİ SEÇİM KALEMİ (1 ve 3) BEYAR ONAYINA AÇIK. Ölçümle gelmedikleri
     için kanon onları KAYNAK GÖSTEREREK değil SEÇİM olarak kaydediyor;
     başka bir kelime denirse bu satırlar değişir, tablo değişmez.

   ⚠ ALAN ÖZGÜLLÜĞÜ MALİYETİ — lead'in şerhi, kayda geçsin: "Hareketler"
     kullanıcıya "Keşfet"ten daha çok şey söyler. Ortak etiket bu
     özgüllüğü kaybettirir. Beyar bunu bilerek seçti; kazanç markalar
     arası kabuk kararlılığı, bedel alan özgüllüğü.

   ── BU KARARIN İKİ MARKAYA MALİYETİ ──────────────────────────────────
   Ölçülen v2 çubukları ile kanon tablosunun farkı — her satır bir
   DEĞİŞİKLİK, hiçbiri yeni EKRAN değil (beşinin de sayfası zaten var):

     poz  FIT v2 (ölçüldü)   → kanon      DIET v2 (ölçüldü)  → kanon
     ---  ------------------   ---------   -----------------   ---------
      1   Ana Sayfa            Keşfet      Sağlık Araçları     Keşfet
      2   Hareketler           Programlar  Beslenme            Programlar
      3   Programlar     FAB   Uzmanlar    Diyetisyen    FAB   Uzmanlar
      4   Programlarım         Planım      Programlar          Planım
      5   Profil               Hesabım     Ana Site            Hesabım

   🔴 İKİ KAPI KAPANIYOR, İKİSİ DE BAŞKA YERDEN AÇIK KALIYOR:
     · FIT'te "Ana Sayfa" çubuktan düşer — hub'a erişim header'ın marka
       kilidinden ve çekmeceden sürüyor.
     · DIET'te "Ana Site" (dadagastro.com) çubuktan düşer — ekosistem
       geçişi sol marka rayının işi, alt çubuğun değil. Ray zaten her
       ekranda duruyor (§26 · `--kat-ray`).
   ⚠ İkisi de DOĞRULANMALI: kapının gerçekten açık kaldığı, kural
     uygulandıktan sonra ekranda sınanır. "Başka yerden erişilir" bir
     varsayımdır; ölçülmeden kapanmış sayılmaz.

   ✅ YAN KAZANÇ — ÇİFT GLİF KUSURU KENDİLİĞİNDEN KAPANIYOR. v2'de
      "Programlar" (FAB) ve "Programlarım" ikisi de `fa-solid fa-dumbbell`
      taşıyordu; yan yana iki nav kalemi aynı glifle duruyordu. Yeni
      tabloda FAB uzman rolüne geçtiği için glif de ayrışıyor.
      ⚠ Beyar "şimdilik dursun" dedi — glif DEĞİŞTİRİLMEDİ, kusur
        `02-bilesenler.md`de kayıtlı. Rol tablosu uygulandığında bu kalem
        yeniden bakılır; kanon glifi kendi kararıyla değiştirmez (İKON
        SEÇİMİ KANON KARARI DEĞİL).
   --------------------------------------------------------------------- */

/* 🔴 ALT ÇUBUK MOBİL KAPSAMDA BİLDİRİLİR — ölçüldü, 2026-09-02, FIT v3.
   Bu üç kural bir tur önce KAPSAMSIZ yazılmıştı ve 1440'ta da
   `display:flex` veriyordu. Kusur ÜÇ TUR GÖRÜNMEDİ çünkü ölü varyanttı:
   kanonun hiçbir ekranı `.alt-cubuk` adını TAŞIMIYORDU (Diyet ekranları
   kaynak adıyla `<nav class="bottom-nav">` basıyor). Kanonun kendi tuzak
   listesi bunu yazmış: "ölü varyant: kural var tüketicisi yok."

   FIT v3'te kabuk kapsayıcıları ikili ada geçince kural İLK KEZ bir
   tüketiciye kavuştu ve çubuk masaüstünde SAYFANIN TEPESİNE çizildi,
   header'ı örttü (Beyar'a giden ilk ekranda gözle görüldü).

   Ölçüt kaynağın kendi bildirimi — `fit-shell.css`:
       .bottom-nav{display:none}                       ← taban
       @media (max-width:640px){ .bottom-nav{display:flex} }
   Yani çubuk YALNIZ ≤640'ta vardır. Kanon artık aynı kapıyı kuruyor.
   ⚠ Bu değişiklik Diyet ekranlarında BAYT-NÖTR: orada `.alt-cubuk`
     adını taşıyan eleman yok, kural zaten hiç uygulanmıyordu. */
/* 🔴 ALT ÇUBUK BİLEŞENİ BURADAN ÇIKARILDI — 2026-09-04, BEYAR KARARI.
   Tek kaynak: `kanon/alt-cubuk.css` (+ şablon `kanon/alt-cubuk.html`).
   GEREKÇE ÖLÇÜLDÜ: FIT'in 42 yüzey sayfası bu dosyayı HİÇ yüklemiyor
   (yalnız `tokenlar.css` + `markalar/fit.css`), Gastro maket sayfaları da
   öyle. Bileşen burada kaldığı sürece o sayfalara inmiyor ve çubuk
   kabuğun "icon-only" kipinde etiketsiz kalıyordu.
   Bu dosya onu yukarıdaki `@import` ile geri alır; bileşene ihtiyacı olan
   sayfa ise `kanon/alt-cubuk.css`i DOĞRUDAN ve EN SON bağlar. */

/* =====================================================================
   68 · YÜZEN İSTİF SÖZLEŞMESİ — kapı ölçütü
   ---------------------------------------------------------------------
   BEYAR KURALI, 2026-09-02. Marka bağımsız, dört markada geçerli:

     · Fab'lar üst üste binmeyecek
     · Sohbet paneli açıkken arkasında başka fab görünmeyecek
     · İstif sırası ve z-index KANONDA tanımlı, ekran başına çözülmeyecek

   ── ÖLÇÜM ────────────────────────────────────────────────────────────
   `dump/fit-prototip` · 60 sayfa · 1440×900 ve 390×844 · misafir + oturum
   açık · `position:fixed|sticky` olan TÜM elemanlar taranıp dikdörtgenleri
   ikişerli kesiştirildi (kesişim viewport'a KIRPILARAK — kırpmasız ölçüm
   sahte pozitif veriyor: kapalı `.ff-sheet` `translateY(100%)` ile ekran
   dışında durur ama ham dikdörtgeni yine kesişir).
   Rapor: `rapor/olcum-istif.md`

   ── ✅ KANONUN DOĞRULANAN KISMI ──────────────────────────────────────
   Merdivenin 55/60/70/71/72/73/94/95/96/97/98 kademeleri render'da
   BİREBİR tuttu. §26'nın dip ofset iddiası da bağımsız doğrulandı:

     ölçülen boşluk        1440    390
     fab ↔ başa dön        14px    7px     ✅ kaynağın kendi yorumuyla birebir
     fab ↔ alt çubuk        —      7px     ✅
     44px dokunma hedefi   0 ihlal 0 ihlal ✅ (to-top 48 · fab 56 · nav 44–52)

   Yani "fab'lar üst üste binmeyecek" kuralı DİNLENME HÂLİNDE zaten
   sağlanıyor. İhlaller başka yerde çıktı — aşağıda.
   ===================================================================== */

/* ---------------------------------------------------------------------
   68.1 · 🔴 MERDİVEN YARIM — beş kademe kanonda YOK
   ---------------------------------------------------------------------
   Render'da GERÇEKTEN kullanılan ama `tokenlar.css`te bildirilmemiş
   z-index değerleri:

     z    kim kullanıyor                          durum
     ---  --------------------------------------  ---------------------
     42   `.ff-bar` filtre çubuğu · 6 sayfa       kanonda YOK
     85   `.sa-rail` sol marka rayı               kanonda YOK
     90   `.bottom-nav` mobil alt çubuk           ✅ v3'te bildirildi
     93   `.sheet-overlay` · 1 sayfa              kanonda YOK
     120  `#rpOverlay`  \ profil-v1'in kendi      kanonda YOK
     121  `#rpModal`    / hareket havuzu seçici   🔴 `--kat-modal`ı (98) AŞIYOR

   🔴 `rp-modal` EKRANA ÖZEL KURALIN TA KENDİSİ: bir sayfa kanonun tepe
      kademesini (98) aşan kendi numarasını icat etmiş. Beyar'ın "ekran
      başına çözülmeyecek" dediği şey birebir bu. İç içe modal gerçek bir
      ihtiyaçsa kanonda kendi kademesini alır; değilse 97/98'e iner.
      DÜZELTİLMEDİ — karar Beyar'ın.

   ⚠ BU BEŞİ TÜKETİCİSİYLE BİRLİKTE BİLDİRİLİR, ÖNCE DEĞİL. Kanon ölü
     token üretmez; `--kat-alt-bar` bu turda bildirildi çünkü §67 ona
     tüketici doğurdu. Kalan dördü kendi bileşenleri kanona girdiğinde.

   ⚠ AYRICA `01-tokenlar.md` merdiveni 17 kademe belgeliyor ama
     `tokenlar.css` yedisini hiç bildirmemiş (belge/CSS kayması,
     tokenlar.css `--kat-alt-bar` şerhinde kayıtlı).
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   68.2 · 🔴 z95'İ ÜÇ AYRI BİLEŞEN PAYLAŞIYOR
   ---------------------------------------------------------------------
   Ölçüldü — aynı sayıda üç farklı anlam:

     `#msjPanel`       sohbet panelinin KENDİSİ   (--kat-sohbet:95)
     `#drawerOverlay`  çekmece perdesi            (--kat-cekmece-ortu:95)
     `#cookieBanner`   çerez şeridi               (kanonda TOKENI YOK)

   Üçü aynı anda tetiklenmediği için bugün çakışmıyorlar — ama hangisinin
   üstte kalacağı z-index'le DEĞİL, DOM SIRASIYLA belirleniyor. Bu,
   deponun kendi şerhinin yasakladığı desen: "iki dosya aynı seçiciyi
   tanımlar, yükleme sırası davranışı belirler."

   ⚠ `01-tokenlar.md` bu çelişkiyi ZATEN kaydetmişti ("`.cookie-banner`
     (95) = `.drawer-overlay` (95)"). Ölçüm onu doğruladı ve ÜÇÜNCÜ bir
     kullanıcı ekledi. Çözüm önerisi: çerez şeridi kendi adını alsın;
     karar Beyar'ın, kanon kendi başına ayırmadı.

   ⚠ `--kat-yuzen-dugme:73` ve `--kat-sohbet-dugme:73` TEK bir gerçek
     düğmeyi (`#msjFab`) iki adla tanımlıyor. Çakışma değil, gereksiz
     ikilik; birleştirme ayrı tur işi (tüketici taraması gerektirir).
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   68.2b · 🔴🔴 SAYI YALAN SÖYLEYEBİLİR — YIĞIN BAĞLAMI TAVANI
   ---------------------------------------------------------------------
   Bu bulgu merdivenin ANLAMINI değiştiriyor ve kanonda hiç yazılı değildi.

   `.acct-menu` · `.dropdown` · `.mega` · `.tb-lang-menu` hepsi z **80**
   (`--kat-menu`). Ama dördü de `header`in İÇİNDE yaşıyor ve `header`
   z **60** ile KENDİ YIĞIN BAĞLAMINI kuruyor. Yığın bağlamı bir TAVANdır:
   içerideki hiçbir eleman, kaç numara alırsa alsın, dışarıdaki 60'tan
   büyük bir kardeşi geçemez.

   Sentetik sınamayla kanıtlandı (slot ölçümü): header'ın içine z 9999
   konsa bile `.kenar-sekmesi` (z72, header'ın DIŞINDA kardeş) onu yener.

   🔴 Yani `--kat-menu:80` sayısı YANILTICI. Menüler 71/72/73'ün üstüne
      ÇIKAMAZ; merdivende 80'de görünmeleri gerçeği yansıtmıyor.

   ⚠ BUGÜN GÖRÜNÜR KUSUR YOK — ölçüldü: `.acct-menu`nün sağ kenarı 1308px,
     `.kenar-serit` 1432'de başlıyor, arada 124px boşluk var. Kusur GİZLİ:
     menü genişlerse ya da kenar sekmesi büyürse anında ortaya çıkar.

   🔴 KANON DERSİ: bir kalemin z-index'ini yazmak, onun o kademede
      ÇİZİLECEĞİ anlamına GELMEZ. Kapsayan yığın bağlamı kuralı kalıtımı
      yener — §21 ve §24'ün "kapsayan bağlam öldürüyor" tuzağının
      z-index'teki karşılığı. Merdivene yeni kademe yazılırken kalemin
      KİMİN İÇİNDE olduğu da bakılır.
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   68.2c · ✅ ÇÖZÜLEN İKİ BELGELİ ÇELİŞKİ
   ---------------------------------------------------------------------
   `01-tokenlar.md` iki çelişki kaydetmişti; ikisi de ölçüldü:

   1 · "header (60) üst banttan (70) alçakta, ikisi de fixed ve bitişik"
       → ✅ ZARARSIZ. Ölçüldü (2 sayfa × 3 kaydırma konumu): topbar hep
         y 0–40, header hep y 40–113. ASLA piksel paylaşmıyorlar.
         Sıra ters ama geometri hiç dokunmadığı için görünür kusur YOK.
         ⚠ Kırılgan: biri büyürse çakışma anında doğar.

   2 · "`.cookie-banner` (95) = `.drawer-overlay` (95)"
       → 🔴 DOĞRULANDI. `elementFromPoint` ile doğrudan sınandı: DOM
         sırası [drawerOverlay, cookieBanner], eşit z'de SONRAKİ kazanır,
         yani çerez şeridi çekmece perdesinin ÜSTÜNDE boyanıyor.
         Davranış z-index sözleşmesinden değil DOM EKLEME SIRASINDAN
         geliyor — belgelenmemiş, kırılgan bir tesadüf.

   ⚠ ÇAPRAZ DOĞRULAMA: lead'in belge taramasıyla bulduğu yedi eksik kademe
     (1 · 42 · 80 · 85 · 90 · 93 · 94), slotun BAĞIMSIZ render ölçümüyle
     birebir eşleşti — `footer.orange`=1 · `.ff-bar`=42 · `.acct-menu`=80 ·
     `.sa-rail`=85 · `.bottom-nav`=90 · `.sheet-overlay`=93 ·
     `.lst-side`(kaydırmada sticky→fixed)=94. Belge doğru, yalnız
     `tokenlar.css`e geçmemiş.

   ⚠ `--kat-yuzen-dugme` ile `--kat-sohbet-dugme` İKİ AYRI ELEMAN DEĞİL —
     ölçüldü: tek bir `#msjFab` düğmesi iki adla anılıyor. Çakışma yok,
     gereksiz ikilik.
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   68.3 · 🔴 ÖLÇÜLEN ÇAKIŞMALAR — kaynakta kusur, DÜZELTİLMEDİ
   ---------------------------------------------------------------------
   A · KASITLI VE DOĞRU (60 sayfanın hepsinde, ✅ kanonla uyumlu)
       `.topbar`(70) ∩ `.fb-rail`(71) · `header`(60) ∩ `.fb-rail`(71) ·
       `.fb-rail`(71) ∩ `.feedback-tab`(72)
       §26'nın "kenar şerit üst bandın ÜSTÜNDEN geçer" kuralı ekranda
       doğrulandı.

   B · 🔴 ALT ÇUBUK SEKME RAYINI ÖRTÜYOR — @390, en ciddi bulgu
       `antrenor-detay-v1` · `nav.bottom-nav`(z90) ∩ `div.cp-tabbar`(z40)
       🔴 İKİ SLOT ÇELİŞTİ, LEAD HAKEMLİK ETTİ. Bir slot çakışmayı
       ölçtü, diğeri CSS'e bakıp ("`position:sticky; top:62px`, yani
       yukarı yapışır") reddetti. Lead dört kaydırma konumunda ölçtü:

         scrollY    cp-tabbar        bottom-nav      kesişim
         -------    --------------   -------------   -------
             0      766.3 – 833.3    766.0 – 830.0   **63.7px** 🔴
           200      566.3 – 633.3    766.0 – 830.0        0px
           600      166.3 – 233.3    766.0 – 830.0        0px
          1500       62.0 – 129.0    766.0 – 830.0        0px

       ÇAKIŞMA GERÇEK AMA YALNIZ AÇILIŞ ANINDA: sticky eleman scroll 0'da
       henüz `top:62px` çapasına ULAŞMAMIŞTIR, doğal akış konumundadır ve
       o konum ekranın dibine denk gelir. Kaydırma başlar başlamaz ray
       yukarı çıkar ve çakışma biter.

       🔴 SLOTUN HATASI ÖĞRETİCİ: `position:sticky; top:62px` bildirimini
          OKUYUP konumu türetmek yanlış sonuç verdi. Sticky bir elemanın
          nerede DURDUĞU kaydırma durumuna bağlıdır ve ancak RENDER
          EDİLEREK bilinir — "kaynağı render et, CSS okuma" kuralının
          konuma düşen hâli. Kural bu turda ilk kez KONUM için kırıldı.

       ⚠ AÇILIŞ ANI İHMAL EDİLEBİLİR DEĞİL: kullanıcının sayfayı ilk
         gördüğü hâl budur ve sekme rayı o an %95 örtülü.
       Kök sebep: `.cp-tabbar` sticky ve z40; alt çubuk fixed ve z90.
       §67'nin gövde alt dolgusu kuralı bunu ÇÖZMEZ — gövde dolgusu
       akıştaki son elemanı korur, akışın ORTASINDAKİ sticky rayı değil.

   C · 🔴 ÇEREZ ŞERİDİ SAYFANIN KENDİ İÇERİĞİNİ GİZLİYOR
       @1440 · 10 sayfada sticky yan panellerin alt 55–78px'i çerez
       şeridinin (z95) altında (`ab-side` `lst-side` `ed-track` `ft-side`
       `au-visual` `about-figs` `plan-sum` `lg-side` `ff-bar`).
       @390 · DAHA AĞIR — `egzersiz-kutuphane-v1` ve `program-liste-v1`de
       filtre çubuğunun **116px'inin 116'sı**, yani TAMAMI örtülü:
       ilk ziyarette süzgeç hiç erişilemiyor.
       ⚠ Bu iki fab'ın binmesi değil ama Beyar'ın istif kuralının ruhuna
         giriyor: geçici bir şerit kalıcı içeriği yutuyor.

   D · ✅ ÇEREZ/YÜZEN ÇÖZÜMÜ ÇALIŞIYOR ama İKİ AYRI STRATEJİ
       `to-top` çerez açıkken `--bc-lift` ile YUKARI KAYIYOR (390'da
       148 → 348px, çakışma sıfır ölçüldü). `#msjFab` ise KAYMIYOR,
       `.msj-cerez` ile tamamen GİZLENİYOR. İkisi de doğru sonuç veriyor
       ama kanon bu ikiliği hiçbir yerde açıklamıyor.
   --------------------------------------------------------------------- */

/* ---------------------------------------------------------------------
   68.4 · 🔴 SOHBET AÇIKKEN — GÖRSEL DEĞİL, ODAK SIZDIRIYOR
   ---------------------------------------------------------------------
   Beyar'ın kuralı: "Sohbet paneli açıkken arkasında başka fab
   görünmeyecek."

   ✅ GÖRSEL TARAFTA SORUN YOK. Panel açıkken `#msjOrtu` (z94, tam ekran,
      %50 karartma) header · topbar · fb-rail · feedback-tab · footer ·
      `#msjFab`ın kendisi · sayfaya özel sticky panelleri örtüyor; panel
      (z95) onun da üstünde. Fare kullanıcısı gizli hiçbir şeye erişemiyor.

   🔴 KLAVYE TARAFINDA SIZDIRIYOR. `fit-mesaj.js`in `ac()` fonksiyonu
      yalnız `Esc`i dinliyor (`fit-mesaj.js:726`); Tab döngüsü
      KİLİTLENMİYOR, sayfanın geri kalanına `inert`/`aria-hidden`
      uygulanmıyor. Ölçülen sıra (hesabim-v1, 1440, panel açık):

        0–5    panel içi   6 odaklanabilir öğe
        7      panel DIŞI  atlama bağlantısı        ← görünmüyor
        8–11   panel DIŞI  header bağlantıları      ← görünmüyor
        12–15  panel DIŞI  `.bs-item` MARKA GEÇİŞİ  ← görünmüyor
        16     panel DIŞI  dil düğmesi              ← görünmüyor
        22–24  panel DIŞI  zil · "Giriş Yap"        ← görünmüyor

      Yani klavye kullanıcısı "sohbetteyim" sanırken Enter'a basıp BAŞKA
      MARKAYA geçebilir ya da giriş akışını tetikleyebilir. Beyar'ın
      tarif ettiği ihlalin ta kendisi — görünürlük değil, ERİŞİLEBİLİRLİK
      düzeyinde.

   ⚠ LEAD BAĞIMSIZ DOĞRULAYAMADI. Panelin açılması antrenörü olan
     tohumlanmış bir oturum gerektiriyor (`dm_fit_mesaj_v1`); antrenörsüz
     üyede `#msjFab` BOŞ KİPTE (`.is-bos`) bir `<a>` olarak duruyor ve
     panel hiç açılmıyor (§26 `.yuzen-dugme.bos`). Bulgu slot ölçümüne
     dayanıyor, kanıt izi raporda satır satır kayıtlı; lead yalnız
     durumu kuramadığı için ikinci kez ölçemedi. TEKRAR ÖLÇÜLMELİ.

   ⚠ İKİNCİL SONUÇ: Tab kaçışı çekmece düğmesine de ulaşabiliyor. Çekmece
     açılırsa `.drawer-overlay`(95) ile `#msjPanel`(95) aynı sayıda kalır
     ve üstteki DOM sırasına düşer (68.2). Uç durum ama gerçek; kökü aynı.

   ── KANON SÖZLEŞMESİ ────────────────────────────────────────────────
   Aşağıdaki kural görsel katmanı bağlar. ODAK KİLİDİ JS işidir ve kanon
   onu bir SÖZLEŞME olarak yazar (§21 akordeonun JS mekanizmasında
   yapıldığı gibi): panel `.acik` olduğunda panel ve perdesi DIŞINDAKİ
   her kabuk kalemi `inert` olur. `inert` hem odağı hem fareyi keser,
   yani tek bildirimle iki kapı birden kapanır.
   --------------------------------------------------------------------- */

/* Perde açıkken kabuğun yüzen kalemleri görsel olarak da düşer —
   perdenin altında "hayalet" bir düğme bırakmamak için. */
body:has(.sohbet-panel.acik) .basa-don,
body:has(.sohbet-panel.acik) .kenar-sekmesi,
body:has(.sohbet-panel.acik) .kenar-serit,
body:has(.sohbet-panel.acik) .yuzen-dugme,
/* 🔴 `.sohbet-dugme` LİSTEDE UNUTULMUŞTU — paneli AÇAN düğmenin ta
   kendisi (§62, `position:fixed`, z `--kat-sohbet-dugme`). Panel açıkken
   perdenin altında kalıyor ve odak sızıntısıyla (68.4) klavyeye açık
   kalıyordu. §26'nın `.yuzen-dugme`si ile AYNI ŞEY DEĞİL: ikisi ayrı
   bileşen, ikisi de fixed, ikisi de 73'te. */
body:has(.sohbet-panel.acik) .sohbet-dugme{
  opacity:0; visibility:hidden; pointer-events:none;
}
/* Mobilde alt çubuk da düşer: perde onu örtüyor ama odak sızıntısı
   (68.4) onu klavyeye açık bırakıyordu. */
@media (max-width:640px){
  body:has(.sohbet-panel.acik) .alt-cubuk{ visibility:hidden; pointer-events:none; }
}


/* =====================================================================
   69 · KALEM SATIRI — kaynak `.fp-row`
   ---------------------------------------------------------------------
   v3 · 2026-09-02. Kanonun ÜÇÜNCÜ satır kiti. §6b'nin uygulanması:
   "kanonda karşılığı olmayan bir şey çıkarsa ÖLÇÜLÜP KANONA EKLENİR."

   Slot-1 iki ekranda 26 kullanım saydı ve kanonda karşılıksız olduğunu
   bildirdi. Lead RENDER EDEREK doğruladı (CSS okuyarak değil) — mevcut
   iki satır kitiyle SEKİZ değeri birden ayrışıyor:

     ölçülen           .fp-row (kaynak)      .ayar-satir (§9 kanon)
     ---------------   -------------------   ----------------------
     gap                14px                  16px
     dolgu              14px 0                17px 22px
     ayraç              border-BOTTOM         komşu seçici border-TOP
     ayraç rengi        #ececec               —
     satır yüksekliği   76.3px                96.1px
     ikon kutusu        38×38                 40×40
     ikon zemini        #eaf6ef  AKSAN        #f9f9f9  NÖTR
     ikon rengi         #007a3d  AKSAN        #56514a  NÖTR
     ikon yazısı        14px                  15px

   🔴 ASIL AYRIM ÖLÇÜ DEĞİL, ANLAM: `.ayar-satir` bir AYAR satırıdır ve
      ikonu NÖTR; `.fp-row` bir İÇERİK kalemidir (egzersiz · öğün ·
      aktivite kaydı) ve ikonu MARKA AKSANLIDIR. İkisini birleştirmek
      "aynı bileşen, dört ad" bulgusunun (02 §0) tersi olurdu: ölçüm iki
      kalemin AYRI olduğunu söylüyorsa birleştirilmez (§11'in kuralı).

   §50'nin `.paket-satiri`sı da karşılığı DEĞİL: orada 52px avatar ve
   fiyat kolonu var, iskelet başka.

   ⚠ ÖLÇÜLEN RENKLER FIT v2 YEŞİLİDİR (#eaf6ef · #007a3d) — kaynakta ham
     hex. Kanona TOKENLA girer (`--aksan-yikama` · `--aksan-koyu`), yani
     marka maviye dönünce satır da döner. Slot-1'in "altı kalemde sabit
     FIT v2 yeşili" bulgusunun bu kaleme düşen kısmı burada kapandı.
   ===================================================================== */

.kalem-satiri{
  display:flex; align-items:center;
  gap:var(--bosluk-14);
  padding:var(--bosluk-14) 0;
  /* 🔴 AYRAÇ `border-bottom` + `:last-child` — §9'un komşu seçici
     (`+`) kipinden BİLEREK farklı. Ölçüm öyle diyor; iki kip aynı işi
     görüyor ama kanon KAYNAĞIN kipini alır (KOPYALAMA-KURALI: "kip farkı
     bir içerik farkı değildir, kanon kaynağın kipini alır"). */
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.kalem-satiri:last-child{ border-bottom:none; }
.kalem-satiri[hidden]{ display:none; }

/* İkon çipi — NÖTR DEĞİL, AKSANLI. §9'dan ayrıldığı yer burası. */
.ks-ikon{
  flex:none; width:38px; height:38px;
  border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  display:grid; place-items:center;
  font-size:var(--yazi-14);
}
.ks-metin{ flex:1; min-width:0; }
/* 🔴 RENK KAYNAKTAN AYRIŞIYORDU — ölçüldü 2026-09-03, §69 bağlamlı
   çeviriyle CANLANDIĞI AN görüldü. Kural 14 kural boyunca ölü durduğu
   için değeri hiç sınanmamıştı:
       kaynak `.fp-row .txt b{color:var(--slate)}`  → rgb(33,30,22)
       kanon  `--murekkep-yumusak`                  → rgb(86,81,74)
   Okunabilirlik kusuru değil (ikisi de AA) ama ÖLÇÜT DONÖRDÜR.
   ⚠ Ders: ÖLÜ KURALIN DEĞERİ DE ÖLÜDÜR — kural canlanana kadar
     yanlışlığı görünmez. Vitrinin "§69 ölü (14 kural)" bulgusu bu yüzden
     yalnız bir kapsama sorunu değil, bir DOĞRULUK sorunuydu: kanonun
     ölçülmemiş yarısı, ölçülmüş görünen yarısının içinde saklıydı. */
.ks-metin b{
  display:block;
  font-size:var(--yazi-14-5);
  color:var(--murekkep);
}
.ks-metin small{
  font-size:var(--yazi-12-5);
  color:var(--metin-ikincil);
  font-weight:var(--agirlik-orta);
}
/* Sağ uç — sayı/süre/durum. Kaynak `.end`. */
.ks-uc{
  flex:none;
  font-size:var(--yazi-12-5);
  font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil);
  text-align:right;
}


/* =====================================================================
   71 · HAFTALIK ÇUBUK GRAFİĞİ — kaynak `.fp-chart` / `.fp-col` / `.bar`
   ---------------------------------------------------------------------
   🔴 BU BÖLÜM BİR KUSUR DÜZELTMESİYLE DOĞDU — KUSURU BİLDİR-DÜZELTME
      KURALINA BEYAR'IN AÇIK İSTİSNASI (K5, 2026-09-02):
      *"Grafik yalan söylüyorsa taşımanın anlamı yok. Kolon yüksekliğini
        çubuğa göre hesapla."*

   ── ÖLÇÜLEN KUSUR ───────────────────────────────────────────────────
   Kaynak çubuğu `height:<v/enb*96>%` ile boyutluyor
   (`programlarim-v1.html:4188`). `.fp-col` 150px'lik bir FLEX kolon ve
   yüzde KOLONUN 150'sine çözülüyor — ama çubuğa kalan yer
   `150 − .val 17.8 − .lbl 17.8 − iki boşluk 16 = 98.375px`.
   Flex fazlayı kırpıyor, yani **%65.6 üstü her değer AYNI yükseklikte**.

   Süpürme ölçümü (lead, gerçek CSS'e enjekte edilerek):
   ```
   %40 → 60.00   %55 → 82.50   %65 → 97.50
   %71 → 98.38   %85 → 98.38   %96 → 98.38   %100 → 98.38
   ```
   Slot-2 bağımsız ölçtü, aynı sayıları verdi. Kusur v2'de İKİ ekranda:
   `programlarim-v1` (İlerlemem) ve `egzersizlerim-v1` ("Bu haftanın
   hareket ritmi").

   ── DÜZELTME ────────────────────────────────────────────────────────
   Kolon FLEX'ten GRID'e geçer ve çubuğa KENDİ SATIRI verilir:
       grid-template-rows: auto 1fr auto      (val · çubuk · etiket)
   Grid'de yüzde yükseklik SATIRA çözülür, kolona değil. `1fr` satırı tam
   olarak boş alan (98.375px) olduğu için `height:X%` artık doğru tabanı
   görür.

   🔴 ELEMAN EKLENMEDİ. Sarmalayıcı bir "ray" elemanı yazmak daha kolay
      olurdu ama EKSİ BİRİNCİ MADDE eleman eklemeyi yasaklıyor. Grid
      çözümü kaynağın üç çocuğunu olduğu gibi bırakır.

   ÖLÇÜLEN SONUÇ — tavan kalktı, her değer orantılı:
   ```
   %40 → 39.34   %55 → 54.09   %65 → 63.94   %71 → 69.84
   %85 → 83.61   %96 → 94.44   %100 → 98.38
   ```
   Doğrulama: %40 × 98.375 = 39.35 ✓ · %85 × 98.375 = 83.62 ✓

   ⚠ ÇARPAN DEĞİŞMEDİ. Kaynağın `v/enb*96` çarpanı korundu — bozuk olan
     çarpan değil TABANDI. Çarpanı oynatmak kaynağın kendi ölçüsünü
     değiştirmek olurdu.

   ⚠ YAN ETKİ ÖLÇÜLDÜ VE KAPATILDI: kaynak `max(4, …)` ile bir görünürlük
     zemini koyuyor ve o zemin de yüzdeye bağlıydı — taban 150'den
     98.375'e inince 6.00px'ten 3.92px'e düşüyordu. Zemin bir GÖRÜNÜRLÜK
     tabanıdır ve tabana bağlı olmamalı; px'e sabitlendi.
     (Slot-2'nin önerisi; ölçüsü onun, karar kanonun.)
   ===================================================================== */

.grafik-hafta{ display:flex; align-items:flex-end; }

.grafik-kolon{
  /* 🔴 FLEX DEĞİL GRID — bölümün tamamının sebebi bu satır. */
  display:grid;
  grid-template-rows:auto 1fr auto;
  align-items:end;
  justify-items:center;
  flex:1; min-width:0;
}
.grafik-deger{ font-size:var(--yazi-12-5); font-weight:var(--agirlik-kalin); color:var(--metin-ikincil); }
.grafik-cubuk{
  width:100%;
  align-self:stretch;
  border-radius:var(--yuvarlak-sm) var(--yuvarlak-sm) 0 0;
  background:var(--aksan);
  /* Görünürlük zemini — YÜZDEYE DEĞİL PİKSELE bağlı (yukarıdaki şerh). */
  min-height:6px;
}
.grafik-cubuk.bu-hafta{ background:var(--aksan-koyu); }
.grafik-etiket{ font-size:var(--yazi-11); color:var(--metin-ikincil); }


/* =====================================================================
   72 · MODÜL GÖVDESİ VE PANO — kaynak `.modul-govde` / `.fit-pane`
   ---------------------------------------------------------------------
   §11 SEKME RAYI rayı tanımlıyordu ama **rayın AÇTIĞI panoyu
   tanımlamıyordu.** Slot-3 ölçtü: tek başına 24 kullanım, ve on üç
   gövdenin on üçü de bu kap için bir ad uydurmak zorunda kalıyordu —
   yani boşluk takımın ORTAK boşluğuydu.

   ⚠ BİLEŞEN KÜÇÜK, DEĞERİ ANLAMSAL. Ölçülen (1440, `rozetlerim-v1`):
   ```
   .modul-govde   block · tam genişlik · dolgu 0 · marj 0 · zemin #f9f9f9
   .fit-pane      block · tam genişlik · dolgu 0 · marj 0 · saydam
   gizli pano     `hidden` NİTELİĞİYLE gizleniyor → display:none
   ```
   Yani kap neredeyse kuralsız; kanona girmesinin sebebi ADININ olması.
   Adı olmayan kap her gövdede yeniden icat ediliyordu.

   🔴 GÖVDE OPAK OLMAK ZORUNDA. Kaynağın kendi şerhi bunu kaydetmiş
   (§67'nin "PLAN KABUĞU · dikişi rayın dibine çek" bloğu): rayın
   altındaki SAYDAM blokları gövdenin içine taşıyan bir kural var; gövde
   opak olduğu için o kural onu hedef sayıyor ve hiçbir şey taşımıyor.
   Saydam bırakılırsa panel kipi bozulur (kaynakta ölçülmüş).

   ⚠ GİZLEME KURALI YAZILMADI ve yazılmamalı: kanonun `[hidden]` kuralı
     (dosya sonu, TEK YETKİLİ) zaten `display:none !important` veriyor.
     Buraya ikinci bir gizleme kuralı yazmak o kuralın bütün gerekçesini
     çiğnerdi.
   ===================================================================== */

.modul-govde{
  /* Zemin ADI ile alınır — marka değişince kendiliğinden döner. */
  background:var(--zemin);
  position:relative;
}
/* Pano — ray bir kalemi açtığında görünen kap. Kuralı yok denecek kadar
   az; işi KAPSAMAK, biçimlemek değil. */
.pano{ display:block; }

/* =====================================================================
   73 · BEYAR'IN GÖZLE BULDUĞU DÖRT GENEL KURAL — 2026-09-02
   ---------------------------------------------------------------------
   Dördü de AYNI AİLEDEN: kaynağın kuralı VAR, kanonda karşılığı YOK.
   §63d'nin ("durum varyantı taban sanıldı") kardeşi: burada varyant
   değil ALT KALEM düşmüş. Beyar'ın sözü: "kopyalamaları ada akıllı yap."
   Hepsi GENEL kural — tek ekrana yama değil.
   ===================================================================== */

/* ── 73a · KATEGORİ/SEKME ŞERİDİ ORTALIDIR ────────────────────────────
   Beyar: "kategoriler merkezi olur". Ölçüldü (hesabim@1440):
       v2  .pf-tabs.is-center → justify-content: safe center
       v3  .sekmeler          → justify-content: normal   (sola yaslı)
   Kök: kaynağın `is-center` değiştiricisi haritada yok ve kanonun TABAN
   `.sekmeler`i ortalama yazmıyordu — ortalama yalnız `.ortali`da vardı.
   Şerit her hâlde ortalıdır; `safe` anahtar kelimesi kaynağın kendi
   değeri ve taşan şeridin BAŞINI kırpmayı önler (kaydırılabilir kalır). */
.sekmeler{ justify-content:safe center; }

/* ── 73b · KART AYAĞINDAKİ EYLEM SAĞA YASLANIR ────────────────────────
   Beyar: "butonlar sağdaysa güncel fitte de sağda olur". Ölçüldü
   (hesabim@1440 · "Değişiklikleri Kaydet"):
       v2  .pnl-card .pc-foot  display:flex  → düğme sağ kenardan 22px
       v3  .kart.panel>.kart-alt display:block → düğme SOLDA (sol 187px)
   Kanonda `.kart.panel>.kart-alt.eylem` kipi ZATEN VAR ve doğru yazılmış;
   `eylem` sınıfı gelmediği için ölü duruyordu (`pc-foot → kart-alt`
   çevirisi değiştiriciyi taşımıyor). Sınıf beklemek yerine YAPISAL:
   içinde düğme olan kart ayağı zaten eylem ayağıdır. */
.kart.panel>.kart-alt:has(.dugme){
  display:flex; align-items:center; gap:var(--bosluk-14); flex-wrap:wrap;
}
/* 🔴🔴 ÜÇÜNCÜ KALDIRAÇ — S1 ③'Ü YENİYORDU, DÜZELTİLDİ 2026-09-04.
   Bu satır `margin-left:auto`yu ayaktaki HER düğmeye veriyordu ve
   özgüllüğü (0,4,0) S1'in düzeltmesini (`.kart-alt>.dugme{margin-left:0}`,
   (0,2,0)) yeniyordu. S1 ③ tam olarak bu hâli tarif ediyor:
   *"ayak YALNIZ düğmelerden oluşunca her düğme kendi `auto`sunu alıyor
   ve boşluk ARALARINDA paylaşılıyor."*
   S1 iki kaldıraç bulup ikisini de devretmişti (taban + modal ayağı);
   bu ÜÇÜNCÜSÜ, ve S1'den SONRA yazıldığı için onun listesinde yoktu.

   ÖLÇÜLDÜ @1440 (`adm-op-a` bildirdi, burada doğrulandı):
       admin-sss-form   İptal 561..644 · Soruyu kaydet 828..1005
                        iki düğmede de margin-left 169.5px · ara 184px
       admin-uye-form   iki düğmede de margin-left 195.9px · ara 210px
   gap tokeni 14 — yani düğmeler arasında olması gereken 14px, ölçülen 184.

   `auto` GEREKMİYOR: ayak zaten `justify-content:flex-end` taşıyor
   (S1'in kendi kuralı) ve grup ona yaslanıyor. Boşluğun notun sağına
   toplanması da S1'de yazılı (`.kart-alt>:not(.dugme):first-child`).
   ⚠ Ders — kanonun kendi §73b şerhi "sınıf beklemek yerine YAPISAL"
     diyerek doğru bir karar veriyor ama YENİ bir kaldıraç doğuruyor;
     yapısal seçici yazmak, o seçicinin hangi sözleşmeyi ezdiğini
     kontrol etmekten muaf tutmuyor. */

/* ── 73c · BANDIN SONUNDAKİ BİLGİ NOTU PERDEYE YAPIŞMAZ ───────────────
   Beyar: "burdaki infolar genel olarak perdenin sonuyla arasında biraz
   boşluk olsun". Ölçüldü: bandın son kalemi bilgi notu olduğunda alt
   payı 0 kalıyor ve not doğrudan dip perdesine dayanıyor.
   Değer kaynağın kendi not aralığından (`.hr-note{margin:0 0 16px}`)
   bir kademe yukarısı — bandın kapanışı satır aralığı değildir. */
.kap>.bilgi-notu:last-child,
.bolum>.bilgi-notu:last-child,
.fit-pane>.bilgi-notu:last-child{ margin-bottom:var(--bosluk-24); }

/* ── 73d · AİLE BAŞLIĞININ İKONU MARKA RENGİNDEDİR ────────────────────
   Beyar: "kopyaladığımız donörde bu section'ların ikonları renkli".
   Ölçüldü — kaynak `.badge-head h3 i{color:var(--fit);font-size:14px}`;
   kanonun `.rozet-aile-bas h3` kuralı var, `h3 i` kuralı YOK → ikon
   `h1..h4{color:var(--slate)}` mirasına düşüp mürekkep rengi oluyor.
   §63d'nin aynı kalıbı: alt kalem çeviride ÖKSÜZ kaldı.
   ⚠ Bölüm başlığının ikonu (`.bolum-bas`) ve kart başlığının ikonu
     (`.kart-baslik i`) kanonda ZATEN marka renginde — bu kalem o
     sözleşmenin rozet ailesindeki eksik halkasıdır, yeni bir karar değil. */
.rozet-aile-bas h3 i{ color:var(--aksan); font-size:var(--yazi-14); }

/* =====================================================================
   74 · BANDIN ALT NEFESİ VE KART ARALIĞI — GENEL KURAL
   ---------------------------------------------------------------------
   🔴 BEYAR, 2026-09-02: *"Bir daha böyle hatalar istemiyorum, KURAL YAZ.
      Kartlar böyle bitişik olmayacak, sayfanın genel boşluk kurallarıyla
      tutarlı olacak."* · *"hepsinde bu var"*

   ÖLÇÜLDÜ (13 ekran · 1440 · `lead-bosluk-olc.mjs`) — sistematikti:
```
   her ekranda üç bandın ÜÇÜNDE de:
       padding-bottom = 0px · son kalemin alt boşluğu 0px (bazen -1px)
   kart aralıkları tek bir kaptan değil, rastgele:
       cozum-merkezi [64, 65, 533, 1245]
       programlarim  [582, 0, 83, 16, 264, 277, 413, 301]
```
   KÖK: `.zebra>.bolum` kendi ritmini (`--bolum-nefes-sik`) alıyor ama
   İÇERİK BANDI (`.modul-govde`) ve ŞERİT (`.pf-tabbar`) `.bolum` DEĞİL —
   hiçbir alt dolgu almıyorlar. Sonuç: panonun son kartı doğrudan dip
   perdesine dayanıyor. Bu bir ekran kusuru değil, EKSİK SÖZLEŞMEydi:
   kanon bandın ÜST telafisini (`kabuk-alti`) yazmış, ALT nefesini
   yazmamıştı.

   ⚠ DEĞER UYDURULMADI: `--bolum-nefes-sik`, `.zebra>.bolum`un kendi
     ritmi. "Sayfanın genel boşluk kurallarıyla tutarlı" şartı ancak
     aynı tokeni kullanmakla sağlanır — yeni bir boşluk değeri
     tanımlamak tutarlılığı BOZARDI.
   ===================================================================== */

/* ── 74a · İÇERİK BANDI ALTTAN NEFES ALIR ───────────────────────────── */
.modul-govde{ padding-bottom:var(--bolum-nefes-sik); }

/* ── 74b · BANDIN SON KALEMİ KENARA YAPIŞMAZ ─────────────────────────
   Pano kendi içinde de bandın son kalemi olabilir (A kararıyla derlenen
   ekranlarda sık): son bölümün alt payı sıfırlanmışsa nefes buradan gelir. */
/* ✅ KAPANDI · 2026-09-03 — ve cevap kapının kendindeydi.
   Kalem şöyle açık kalmıştı: "bandın son kartı 22px, kanon ritmi 32px;
   kapı kusuru mu ekran kusuru mu AYRILMADI." Ayrıldı:
     · §74a gerçek bir YOKLUĞU kapatmıştı — ölçümün başında üç bandın
       üçünde de `padding-bottom: 0px`tı, yani bandın alt nefesi HİÇ YOKTU.
     · Kalan 22px ise KAPININ KİPİNDEN geliyordu: kapı bütün panoları
       `hidden` sökerek açıyor ve kanonun KASITLI kuralı
       (`.modul-govde>.fit-pane:last-child>*:last-child{padding-bottom:0}`)
       o zaman BAŞKA panoya düşüyor; ölçüm 10px kayıyor.
   Kanıt (yalnız görünür pano açıkken, doğrudan ölçüm · rozetlerim@1440):
       bant 755→2176 padAlt=32 · pano 755→2144 · fark TAM 32px
   Kapı pano pano ölçmeye çevrildi (şeritten tıklayarak — bu aynı zamanda
   `hidden` sökmenin `animation:fadeUp`ı tetiklemediği tuzağını da kapatır)
   ve 13 ekranda 185 kalem · 🔴 0 verdi. Olumsuz sınama hâlâ geçiyor.
   🔴 DERS: bir kapı kırmızı verdiğinde ilk şüpheli EKRAN DEĞİL, KAPININ
      ÖLÇÜM KİPİdir. Bu turda dört kez böyle çıktı ve bu, "etkisi
      ölçülmemiş kural kanona yazılmaz" kuralının neden işe yaradığını
      da gösteriyor: yanlış ölçüme dayanan BFC kuralı yazılıp geri
      alınmıştı; ekran hiç bozulmadı.
   ⚠ Eski şerh, kaydın izlenebilmesi için aşağıda bırakıldı. */
/* ⚠ (KAPANDI, yukarı bak) AÇIK KALEM · BANDIN SON KARTI 22px — 2026-09-03.
   slot-egzersiz kapının şerhinin istediğini yaptı: elemanı bastı ve
   panoları TEK TEK açarak force-open artığı OLMADIĞINI gösterdi
   (egzersizlerim 4/6 pano · antrenorum 4/8 pano · 22px).
   Ölçtüğü zincir:
       bant .modul-govde  padÜst=0 padAlt=32   ·  pano .fit-pane marj 0/0
       form #fpxGunSonu   marÜst=14px
       hesap: 10px (üstte) + 1028 + 22px (altta) = 1060
   Teşhis "çocuğun payı panoyu çökererek bandın dolgusunu yiyor" idi ve
   `display:flow-root` ile pano BFC yapıldı — 🔴 ÖLÇÜM DEĞİŞMEDİ, 22px
   kaldı. Yani teşhis eksik: pay çökmesi tek başına açıklamıyor.
   İkinci olasılık ölçülmedi: kapı SON KARTI raporluyor, bandın son
   ELEMANI olmayabilir (araya §73c'nin `.bilgi-notu` alt payı gibi bir
   kalem girerse kart↔bant farkı 32-10=22 çıkar).
   🔴 ETKİSİ ÖLÇÜLMEMİŞ KURAL KANONA YAZILMAZ — bu yüzden BFC kuralı
      geri alındı. Kalem açık: önce kapı "son ELEMANI" da bassın, iki
      olasılık ayrılsın, sonra düzeltme yazılsın. */
.fit-pane>*:last-child{ margin-bottom:0; }
.modul-govde>.fit-pane:last-child>*:last-child{ padding-bottom:0; }

/* ── 74c · KART ARALIĞI TEK KAPTAN GELİR ─────────────────────────────
   Kart ızgaraları `gap`i kendileri yazar; alt alta dizilen kartlar
   (ızgara değil akış) aralığı BU kuraldan alır. İki kural bir arada
   "aynı sayfada iki farklı kart aralığı" hâlini imkânsız kılar. */
.kart + .kart,
.fp-card + .fp-card,
.ozet-karti + .ozet-karti{ margin-top:var(--bosluk-16); }

/* 🔴🔴 IZGARA İÇİNDE VURMUYOR — 2026-09-04, ADMIN TURU · ÖLÇÜLDÜ.
   Kuralın kendi şerhi *"kart ızgaraları `gap`i kendileri yazar"* diyor
   ama muhafazası YAZILMAMIŞTI: `.kart-izgara` çocuklarına da `margin-top`
   basıyordu. S3 ① bunun bir ucunu (`gap` + `margin` iki kez sayılıyor)
   dört ADI SAYILAN kapta kapatmıştı; `.kart-izgara`nın kendisi o listede
   yoktu, çünkü o kap S3'ten SONRA doğdu (§A2).

   ÖLÇÜLDÜ (admin-genel-bakis @1440 · `.kart-izgara.c4` · sekiz KPI kartı):
       kart 1   üst 308   yükseklik 146   margin-top 0px
       kart 2   üst 324   yükseklik 130   margin-top 16px
       kart 3   üst 324   yükseklik 130   margin-top 16px
       kart 4   üst 324   yükseklik 130   margin-top 16px
   Yani ilk kart 16px YUKARIDAN başlıyor ve `stretch` yüzünden 16px DAHA
   UZUN — bir KPI şeridinin dört kartı hizasız. Gözle görünüyor.
   Bulguyu `adm-genel` agent'ı ölçüp bildirdi; burada bağımsız doğrulandı.

   ⚠ Kural `:is()` ile YAZILAMAZ, kabın ADIYLA yazılır: aralığı yazan
     taraf kaptır (S3 ①'in kararı) ve `.kart-izgara` `gap` yazıyor. */
:is(.kart-izgara, .form-duzen) > :is(.kart, .fp-card, .ozet-karti)
  + :is(.kart, .fp-card, .ozet-karti){ margin-top:0; }

/* 🔴 KAPI: `kapi-bosluk.mjs` — bandın son kaleminin alt boşluğu eşiğin
   altına inerse ve aynı kap içindeki kart aralıkları BİRDEN ÇOK değer
   taşırsa kırmızı verir. "Bir daha istemiyorum" ancak ölçülürse tutar. */


/* ═══════════════════════════════════════════════════════════════════
   § EYLEM SATIRI · A1 · Beyar kararı 2026-09-03
   -------------------------------------------------------------------
   ÖLÇÜLDÜ: kanon AYNI düzeni İKİ KEZ bağlam adıyla yazmış —
       .modal-eylemler{ flex · gap-10 · wrap · margin-bottom-16 }
       .kart-eylem    { margin-top-18 }
   kaynağın `.fpx-acts`i üçünü birleştiriyor (flex · gap:10 · wrap ·
   margin-top:20). `.modal-eylemler`i modal DIŞINDA kullanmak kanonun
   kendi kırılma noktasına düşer ("ad tutmuyor"), bu yüzden genel ad
   açıldı ve iki bağlam adı buna DEVREDİLDİ: 3 kural → 1 bileşen.
   =================================================================== */
.eylem-satiri{
  display:flex; gap:var(--bosluk-10); flex-wrap:wrap;
}
.eylem-satiri.ust{ margin-top:var(--bosluk-20); }
.eylem-satiri.alt{ margin-bottom:var(--bosluk-16); }
/* Devir: eski adlar genel bileşene bağlanır, biçim TEK yerden gelir. */
.modal-eylemler,.kart-eylem{
  display:flex; gap:var(--bosluk-10); flex-wrap:wrap;
}
.modal-eylemler{ margin-bottom:var(--bosluk-16); }
.kart-eylem{ margin-top:var(--bosluk-18); }

/* ═══════════════════════════════════════════════════════════════════
   § KART IZGARASI · A2 + A5 · Beyar kararı: tek `.kart-izgara`
   -------------------------------------------------------------------
   ÖLÇÜLDÜ: `repeat(3,minmax(0,1fr))` kanonda İKİ KEZ vardı ama ikisi de
   başka rolde (`.kunye.belge` kimlik ızgarası · `.alan-izgara.c3` form
   alanı); kart ızgarası için genel ad YOKTU. `repeat(7` ise kanonda
   SIFIR seçiciydi — haftalık gün şeridi (kaynağın `.fp-days`i) hiçbir
   kanon kuralına tutunamıyordu.
   =================================================================== */
.kart-izgara{
  display:grid; grid-template-columns:minmax(0,1fr);
  gap:var(--bosluk-16);
}
.kart-izgara.c2{ grid-template-columns:repeat(2,minmax(0,1fr)); }
.kart-izgara.c3{ grid-template-columns:repeat(3,minmax(0,1fr)); }
/* 🔴 `.c4` · BEYAR KARARI 4 (`docs/admin-envanter.md §9`) — 2026-09-03.
   Admin KPI şeridi (17/37 ORTAK ekran) için açıldı. K8 ① sonucu:
   şerit MEVCUT `.kart` + `.kart-izgara` ile basılıyor, eksik olan tek şey
   dört kolonluk varyanttı. Ölçüldü (`admin-abonelikler-v1` @1440):
       `.adm-kpi`  grid · 249px ×4 · gap 16px   ↔  `.kart-izgara` gap 16px
   Yani gap BİREBİR tutuyor; yeni bileşen değil, KOLON VARYANTI. */
.kart-izgara.c4{ grid-template-columns:repeat(4,minmax(0,1fr)); }
.kart-izgara.c7{ grid-template-columns:repeat(7,minmax(0,1fr)); gap:var(--bosluk-8); }
@media (max-width:1100px){
  /* `.c4` ARA KIRILIM TAŞIR — `.c2`/`.c3` taşımıyor, çünkü dört kolon
     1100'ün altında 249px'in altına iniyor ve KPI sayısı (`--yazi-24`)
     etiketiyle aynı satıra sığmıyor. Ölçüldü: 4 kolon @1024 → 208px
     hücre, sayı+delta sarıyor. İkiye düşünce 432px, sarma bitiyor. */
  .kart-izgara.c4{ grid-template-columns:repeat(2,minmax(0,1fr)); }
}
@media (max-width:640px){
  /* 390 kuralı: çok kolonlu ızgaralar tek kolona döner, gün şeridi
     yedi kolonda KALIR (takvim ritmi bozulmaz, hücre küçülür). */
  .kart-izgara.c2,.kart-izgara.c3,.kart-izgara.c4{ grid-template-columns:minmax(0,1fr); }
  .kart-izgara.c7{ gap:var(--bosluk-4); }
}

/* ═══════════════════════════════════════════════════════════════════
   § A4 · DURUM HAPININ KÖŞE KİPİ
   -------------------------------------------------------------------
   ÖLÇÜLDÜ: perde kanonda VAR (`.kapak::after` · `.sonuc-gorsel::after`)
   ama köşeye çakılı çip YOK (`position:absolute` 4 seçici, hiçbiri çip).
   Yeni hap DEĞİL — mevcut §28/§45 hapının konum varyantı.
   =================================================================== */
.durum-hapi.kose{
  position:absolute; z-index:2;
  white-space:nowrap;
}
.durum-hapi.kose.sol-ust{ top:var(--bosluk-12); left:var(--bosluk-12); }
.durum-hapi.kose.sag-ust{ top:var(--bosluk-12); right:var(--bosluk-12); }

/* ═══════════════════════════════════════════════════════════════════
   § MADDE LİSTESİ · İKİ KOLONLU KİP · Beyar kararı: YÖN B
   -------------------------------------------------------------------
   Özellik listesi üç yön ölçüldü: A tek kolon (liste uzun kalıyor) ·
   B iki kolon (mevcut bileşenin varyantı) · C kart yüzeyli ızgara
   (ölçülmüş kapı bedeli: `gap:1px` komşu kümesine giriyor).
   B seçildi: kanon büyümüyor, kapı bedeli yok.
   =================================================================== */
.madde-liste.ikili{
  display:flex; flex-flow:row wrap;
  gap:var(--bosluk-9) var(--bosluk-24);
}
.madde-liste.ikili>li{ flex:0 0 calc(50% - (var(--bosluk-24) / 2)); min-width:0; }
@media (max-width:640px){
  .madde-liste.ikili>li{ flex:0 0 100%; }
}

/* ── A3 · HATA VARYANTI · §uyarı kutusunun kırmızı kipi ────────────── */
.uyari-kutu.hata{
  color:var(--hata);
  background:var(--hata-yikama);
  border-color:var(--hata-cizgi);
}
.uyari-kutu.hata>i{ color:var(--hata); }


/* ═══════════════════════════════════════════════════════════════════════
   § SÖZLEŞME · 2026-09-03 · Beyar kararı
   ═══════════════════════════════════════════════════════════════════════
   "Bu turdaki kalemler tek aileden — dağınık yazma, tek sözleşme kur."

   Dört kalem, tek yer, tek değer:
       S1 · EYLEM SATIRI   düğmeler kart ayağında, sağa yaslı, tek boy
       S2 · BİLGİ NOTU     alt komşusuyla bölüm nefesi, kolonda tam en
       S3 · KART ARALIĞI   kartlar bitişik değil, tek değer
       S4 · ÇİP ŞERİDİ     tek biçim, aktif durum dahil

   🔴 DÖRT MARKADA GEÇERLİ: bu bölümde tek hex, tek ham px yok. Her
      renk aksan yuvasından (`--aksan*`), her ölçü tokendan. Marka
      dosyası değişince sözleşme değişmez.

   🔴 HER MADDE ÖLÇÜLDÜ. Ölçüm kipi: 13 ekran @1440, her sekme
      TEK TEK TIKLANARAK açıldı (`hidden` sökülmedi — kanonun kendi
      dersi, §74b). Sayılar aşağıda madde madde yazılı.

   🔴 MARKUP'A DOKUNULMADI. Sözleşmenin dördü de yalnız CSS; hiçbir
      ekranda sınıf eklenmedi, eleman taşınmadı, sıra değiştirilmedi
      (KOPYALAMA-KURALI · eksi birinci madde).
   ═══════════════════════════════════════════════════════════════════════ */


/* ── S1 · EYLEM SATIRI ─────────────────────────────────────────────────
   Beyar: "düğmeler kart ayağında, sağa yaslı. Yıkıcı eylem (sil)
   ikincil/hayalet, ana eylem birincil. Tek boy, tek kural."

   ① TEK BOY. ÖLÇÜLDÜ (13 ekran · görünen 123 `.dugme`): AYNI sınıf,
      AYNI dolgu, AYNI punto DOKUZ ayrı yükseklik veriyordu —
          43 · 44 · 45 · 46 · 47 · 48 · 50 · 52 · 53 px
      ve 123'ün 73'ü 52px'ti. Sebep `.dugme`nin satır yüksekliği
      BİLDİRMEMESİ: gövdeden miras alıyor (`--satir-govde` 1.55 →
      14.5×1.55 = 22.475px), yani düğmenin boyunu İÇİNE KONDUĞU KAP
      belirliyordu. Beyar bunu "butonlar çok kötü" diye gördü:
      planlanan egzersizler 52px ↔ bugünkü egzersizler 45px, aynı sınıf.
      Kaynak da bildirmiyor (`fit-shell.css:242` `.btn`) — kaynağın
      ölçülmüş kusuru, kanon düzeltir.
      Değer uydurulmadı: `--satir-tek` tokenların "tek satır" kalemi.
      Düğme etiketi tek satırdır; boyu artık `min-height`in ilan ettiği
      44px'tir, miras aldığı kaptan değil.

      🔴 İDDİA YENİDEN ÖLÇÜLDÜ — 2026-09-03. Aile tutuyor: `.hayalet`
      83 örnek 44px, `.birincil` 60 örnek 44px. 44 DIŞINA düşen 15 örnek
      kaldı ve hiçbiri "miras" değil — her birinin BİLDİRİLMİŞ sebebi var:
          48px ×6   `.durum-arama .dugme{ height:48px }`   404 · 500 · çevrimdışı
          45px ×4   `.giris-gonder{ padding:15/26 · 15px }` giriş gönder
          53px ×2   `.arama-satir .dugme{ padding:0 26 }`   satır boyuna esner
          43px ×2   `.dugme.cam.ikon{ height:44px }`        🔴 44 yazıp 43 çiziyor
          45px ×1   fit-antrenor-ol `.btn-fit`              🔴 dolgu kanondan GELMİYOR
      İlk üçü bağlamın kendi kipi — S1 ① onları hiç reddetmedi, kural
      "kap belirlemesin" diyordu, bunlarda kabı değil KURALIN KENDİSİ
      belirliyor. Son ikisi gerçek kalem:
        · `.dugme.cam.ikon` bildirdiği boyu çizmiyor (1px). Ayrı ölçülecek.
        · `fit-antrenor-ol`un `.btn-fit`i dolgusunu 15/26 çiziyor ama
          kanon 14/26 yazıyor — yani biçim kanondan değil sayfanın kendi
          `<style>`ından geliyor. Bu bir S1 kalemi DEĞİL, Y2 kalemi:
          gölge kural (bkz. `docs/olcum-O-kanon-onarim.md` §4).

   ② KENARLI VARYANT KENARI DOLGUDAN DÜŞER. `*{box-sizing:border-box}`
      kutuyu sabitler ama içerik 44'ü aşınca kutu BÜYÜR:
          dolgu 28 + metin 14.5 + kenar 2 = 44.5 → 46px
      Ölçüldü: ilerlemem'in kart ayağında `.birincil` 44 ↔ `.hayalet` 46,
      yan yana. Kenarı dolgudan düşmek bu ailenin standart çözümü; yeni
      ölçü üretilmez, var olan iki token çıkarılır. Aile artık 44px.

   ③ GRUP SAĞA — TEK TEK DEĞİL. `.kart-alt>.dugme{margin-left:auto}`
      ayakta not + tek düğme varken doğru; ayak YALNIZ düğmelerden
      oluşunca her düğme kendi `auto`sunu alıyor ve boşluk ARALARINDA
      paylaşılıyor. ÖLÇÜLDÜ (ilerlemem · ölçüm formu @1440): kap 1122px,
      iki düğmenin İKİSİNDE de `margin-left:363.5px` — "Ölçümü kaydet"
      satırın ortasında, "Alanları temizle" ta sağ uçta. `auto` yalnız
      İLK düğmeye kalır: boşluk grubun soluna toplanır, düğmeler bitişik
      bir grup olarak sağa yaslanır.

   ④ BİRİNCİL EN SAĞDA — markup sırası ne olursa olsun. Ölçülen hâl
      (ilerlemem): birincil "Ölçümü kaydet" SOLDA, ikincil "Alanları
      temizle" sağda; okuma yönünde son duran kalem ikincil eylemdi.
      Sıra `order` ile kanondan verilir, 13 ekranın hiçbirinde markup'a
      dokunulmaz.
      KİP SEÇİMİ — Beyar'ın kuralı, kanonun kendi ailesiyle:
          onaylayan / kaydeden      → `.dugme.birincil`  dolgu aksan
          geri alan / temizleyen    → `.dugme.hayalet`   aksan kenarlı ikincil
          YIKICI (sil)              → `.dugme.hayalet`   ✅ ikincil kip
      Yıkıcı eylem dolgu kırmızıyla BAĞIRMAZ: kart ayağındaki "sil"
      bir seçenektir, sayfanın ana eylemi değil. `.dugme.tehlike`
      (§2) yerinde duruyor ama ayak sözleşmesinde kullanılmaz.

      🔴 "kenarlı, sessiz" → "aksan kenarlı ikincil" · O2 · 2026-09-03.
      Bu satır yazıldığında `.hayalet` GERÇEKTEN sessizdi — ölçüldü,
      kenarı kâğıttan 1.18:1 ayrılıyordu, yani kutu yoktu. Sözleşme o
      hâli "iyi seçenek" diye resmileştirmişti; kötü seçim değil, İYİ
      SEÇENEK YOKTU. O2 kipi düzeltti (§2 · `--aksan` 3.45:1) ve satır
      onunla birlikte yeniden yazıldı. Görev DEĞİŞMEDİ — geri alan eylem
      hâlâ ikincil kiptedir; değişen, o kipin ekranda görünür olması.

   ⑤ MARKA ADLARI DEVREDİLİR. Ölçüldü: 20 düğme `.btn-fit`, 3 düğme
      `.btn-food` — aynı işi gören birincil düğmenin iki marka adı, ve
      ikisi de rengini MARKA dosyasından değil donörün sayfa kabuğundan
      alıyor. Sözleşme "dört markada geçerli" diyorsa birincil düğme
      aksan yuvasından okumalıdır. Ad korunur, biçim tek yerden gelir. */

.dugme{ line-height:var(--satir-tek); }

.dugme.hayalet, .dugme.uyari, .dugme.cizgili{
  padding:calc(var(--bosluk-14) - var(--cizgi-1)) calc(var(--bosluk-26) - var(--cizgi-1));
}

.dugme.btn-fit, .dugme.btn-food{
  background:var(--aksan-koyu); color:var(--kagit);
}
.dugme.btn-fit:hover, .dugme.btn-food:hover{
  background:var(--aksan-koyu-2); transform:translateY(-2px);
}

/* ⚠ `margin-left:auto` KAYNAK SIRASINA göre yazılamaz: ④ görsel sırayı
   `order` ile çeviriyor ve `~` seçicisi KAYNAK sırasını okuyor. İlk
   yazımda `auto` görsel olarak SON düğmeye düştü ve boşluk grubun
   ORTASINDA kaldı — düğmeler yine iki uca dağıldı (ölçüldü: ilerlemem
   ölçüm formu, "Alanları temizle" solda, "Ölçümü kaydet" sağda).
   Doğru kaldıraç düğmede değil AYAKTA: boşluğu notun sağına verirsin,
   düğmelerin sırası ne olursa olsun grup bozulmaz. Not yoksa satırın
   kendi yaslaması yeter. Kaç düğme olduğu da fark etmez (hesabim'in
   üç kalemli modal ayağı ölçüldü). */
/* ⚠ İKİNCİ KALDIRAÇ: modal ayağı aynı işi KENDİ seçicisiyle de yazıyor
   (`.modal-ayak>.dugme.birincil{margin-left:auto}` · (0,3,0)) ve taban
   devrini ezip düğmeyi yine tek başına sağa fırlatıyordu — ölçüldü:
   hesabim'in fotoğraf modalı, iki düğme arası 250px. Aynı özgüllükte
   devredilir; ad korunur, biçim tek yerden gelir. */
.kart-alt{ justify-content:flex-end; }
.kart-alt>.dugme,
.modal-ayak>.dugme.birincil{ margin-left:0; }
.kart-alt>:not(.dugme):first-child{ margin-right:auto; }
.kart-alt>.dugme{ order:1; }
.kart-alt>.dugme.birincil{ order:2; }
/* ⑥ YALNIZ-METİN AYAK ORTALI · A4 · Beyar kararı 2026-09-03.
   Düğme ya da sayfalama taşıyan ayak ③④'te kalır (not solda, grup
   sağda); hiçbirini taşımayan ayak tek başına bir bilgi satırıdır ve
   ortalanır. ③'ün `margin-right:auto`su burada sıfırlanır, yoksa ilk
   çocuğu sola çeker.
   ⚠ TÜKETİCİSİ BUGÜN 0 — ölçüldü (13 ekran · DOM'daki 27 `.kart-alt`):
     metin gibi görünen ayakların HEPSİ bir düğme ya da sayfalama
     taşıyor ("Son güncelleme: 2 gün önce" + kaydet · "4 kayıttan 1-4" +
     sayfalama). Lead'in "10 düğmesiz ayak sağa yaslı" tespiti a4
     ölçümünün yalnız METNİ okumasından geldi; yanlıştı. Kural Beyar'ın
     kararıyla duruyor, ilk düğmesiz ayak geldiğinde çalışır. */
.kart-alt:not(:has(.dugme,.sayfalama,button)){ justify-content:center; text-align:center; }
.kart-alt:not(:has(.dugme,.sayfalama,button))>:first-child{ margin-right:0; }


/* ── S2 · BİLGİ NOTU ───────────────────────────────────────────────────
   Beyar: "alt komşusuyla bölüm nefesi kadar mesafe, 860 kolonunda tam
   genişlik. Bitişik durmayacak."

   ① ALT NEFES. §16 üst payı (34px) yazıyor, alt payı YAZMIYOR. Not bir
      tabloyu/kartı anlatıyorsa aralık 0px çıkıyor — ölçüldü:
      challengelarim `#puan` (not → `.kart` 0px) ve `#siralama`,
      enerji-defterim. Beyar: "burda info var, altındaki komponentle
      mesafe olacak". Değer `--bolum-nefes-sik` (32px) — S3'ün kart
      aralığı DEĞİL: not bir bileşen değil, bir bölüm başlangıcıdır ve
      §74d'nin blok ritmiyle aynı nefesi alır.
      Yalnız ARDINDAN kardeş geldiğinde uygulanır; son kalemse ölü
      boşluk üretmez.

   ② TAM GENİŞLİK. §23'ün joker kuralı notu dar okuma kolonuna
      (`--okuma-kolonu` 860px) sokuyor. Bu akan metnin YANINDAKİ not
      için doğru; kartın/tablonun ÜSTÜNDE duran not, anlattığı
      bileşenden dar kalınca ekranda kaymış görünüyor.
      ÖLÇÜLDÜ (13 ekran @1440 · görünen 16 not): notların TAMAMI 860px,
      kardeşleri 1176px (bir ekranda 1112). Beyar: "bu infolar
      yayılacak, genişliği".
      Yeni ölçü YAZILMADI — `max-width` kalkınca not kabın kendi içerik
      genişliğini alıyor, yani kardeşleriyle BİREBİR aynı.
      ⚠ `.okuma-kolonu` içindeki not etkilenmez: orada kabın kendisi
        zaten 860 ve kural yalnız `.kap` çocuğuna yazılı. */

.bilgi-notu:has(+ *){ margin-bottom:var(--bolum-nefes-sik); }
.modul-govde .kap > .bilgi-notu{ max-width:none; margin-inline:0; }

/* ③ PANO SONU NOTU · A4 · Beyar kararı 2026-09-03.
   "Ayraç altı bilgi satırı: ortalı, ayraçla nefes, sayfa sonu boşluğu."

   Aynı rolü İKİ ad oynuyor ve dördü de farklıydı — ÖLÇÜLDÜ (13 ekran ·
   her sekme tıklanmış · pano sonunda duran notlar):
                        `.alt-not` §15 ×18    `.bilgi-notu` §16 ×13
       hiza             sol                   sol
       ayraç → metin    18px (pt 14)          23px (pt 20)
       altında kalan    0 / 32                24 / 56
   "Sayfa sonu"nun kökü: `footer.dip` position:fixed (585px reveal),
   `main{margin-bottom:585px}` — içerik gövdenin dibinde biter, son not
   ile sayfa ucu arasında kaba göre DÖRT değer.

   Beyar: ayraç nefesi 23 (§16'nın kendi değeri, `--bosluk-20`), altına
   `--bolum-nefes-sik` (32 — S3'ün pano ritmi), ortalı. Yeni ad YOK: kip
   konumdan okunur (pano içinde, kabının son çocuğu, kart soyu yok).
   Kart İÇİ `.alt-not` (hesabim · odemelerim · paketlerim#paketim,
   `.kart-govde` çocuğu) §15'in asıl rolüdür, bu kip ona dokunmaz.
   ⚠ Üçüncü örnek 2026-09-04'te ADRES DEĞİŞTİRDİ: "Yükseltme / Düşürme"
     sekmesi Beyar kararıyla kalktı (Gastro'da da kaldırılmıştı) ve
     `#odIptalCard` "Mevcut Paketim" panosuna taşındı. Kural değişmedi,
     yalnız örneğin çapası. Gömülü kanon kopyaları bu satırda eski
     yazımı taşıyor (39 dosya, 17'si Diyet — kulvar dışı); fark ŞERHTE,
     kuralda değil (bkz. AÇIK KALEM · gömülü kanon sürüklenmesi).

   🔴 ALT NEFES YENİ DEĞER DEĞİL, BANDIN KENDİSİ. İlk yazım notun altına
      `margin-bottom:32` koydu; ölçünce 64 çıktı — bant (`.zebra>.bolum`
      ve `section.dikis`, ikisi de `padding-bottom:32`) o nefesi ZATEN
      veriyor. Doğrusu notun kendi alt payını SIFIRLAMAK: §16'nın 24'ü
      düşer, alt nefes tek kaynaktan (bandın `--bolum-nefes-sik`) gelir.
      Beklenen: 33 notun hepsinde 32. ⚠ Yeniden basım sonrası TEYİT
      ÖLÇÜLMEDİ (bağlam bitti) — açık borç, ilk iş.
   ⚠ `.alt-not`un ikonu §15'te 3px iniyor, §16'nınki 2px — ayraç→metin
     24 ↔ 23 çıkıyordu; ikon payı §16'ya eşitlendi, ikisi de 23.
   ⚠ Özgüllük (0,4,0) — `.modul-govde .kap > .bilgi-notu` (0,3,0) ve
     `.alt-not.ortali` (0,2,0) üstünde; bilerek. */
.fit-pane :is(.alt-not,.bilgi-notu):last-child:not(:is(.kart,.fp-card,.ozet-karti) *){
  justify-content:center; text-align:center;
  padding-top:var(--bosluk-20);
  margin-bottom:0;
}
.fit-pane .alt-not:last-child:not(:is(.kart,.fp-card,.ozet-karti) *) > i{ margin-top:2px; }


/* ── S3 · KART ARALIĞI ─────────────────────────────────────────────────
   Beyar: "kartlar bitişik olmayacak, tek değer."

   §74c bunu zaten iddia ediyordu ("aynı sayfada iki farklı kart aralığı
   imkânsız") — ÖLÇÜM ÜÇ AYRI DEĞER BULDU ve kuralın kendisi ikisinin
   sebebiydi.

   ① GAP YAZAN KAPTA PAY İKİ KEZ SAYILIYOR. Kap `gap` yazıyorsa aralık
      iki kaynaktan gelir:  gap(kap) + margin-top(§74c) = görünen.
      ÖLÇÜLDÜ, dört kap:
          .pp-gunler     16 + 16 = 32px   egzersizlerim · programlarim
          .fp-grid       22 + 16 = 38px   hesabim · hareket-profilim
          .fpx-kural     16 + 16 = 32px   challengelarim
          .ol-formcards  16 + 16 = 32px   antrenor-ol
      Beyar bunu "gün kartları çok ayrık" diye gördü — 32px, aynı
      panonun öteki kartları 16px. Kabın `gap`i KAZANIR: aralığı yazan
      taraf odur, §74c yalnız AKIŞ yığınlarının yedeğidir.
      ⚠ Özgüllük bilerek `:is()` — `:where()` sıfır verir ve §74c'yi
        (0,2,0) ezemezdi.

   ② OKUMA KOLONU BLOKLARI: 0px ile 148px arasında salınıyor. ÖLÇÜLDÜ:
          div.wrap.kap    dolgu 0/0     → bloklar arası    0px  YAPIŞIK
          div.bolum.kap   dolgu 74/74   → bloklar arası  148px  UÇURUM
      Beyar ikisini de gördü: "alttaki kartlar bitişik" (egzersizlerim ·
      antrenorum) ve "böyle çok boşluk olmasın" (ilerlemem ·
      programlarim · hareket-profilim).
      Değer uydurulmadı: `--bolum-nefes-sik` (32px) bu turda ölçülen
      ritimlerin ÇOĞUNLUĞU — pano çocuğu `section` olan beş ekranda
      (challengelarim · cozum-merkezi · enerji-defterim · hesabim ·
      rozetlerim) blok nefesi ZATEN 32px ve §74a `.modul-govde`nin alt
      nefesini de bu tokendan alıyor. Aykırı olan iki `.kap` kipiydi.
      🔴 `section` BANTLARINA DOKUNULMADI — onların dolgusu ZEMİN BOYAR
         (ölçüldü: `section.dikis` bg + 1px dikiş kenarı). Sıfırlamak
         bandı içeriğine yapıştırırdı. Kural yalnız SAYDAM okuma kabına
         (`.kap`) yazılı. */

:is(.pp-gunler, .fp-grid, .fpx-kural, .ol-formcards)
  > :is(.kart, .fp-card, .ozet-karti) + :is(.kart, .fp-card, .ozet-karti){
  margin-top:0;
}

.fit-pane > .kap{ padding-top:0; padding-bottom:0; }
.fit-pane > .kap + .kap{ margin-top:var(--bolum-nefes-sik); }


/* ── S4 · ÇİP ŞERİDİ ───────────────────────────────────────────────────
   Beyar: "tek biçim, aktif durum dahil."

   🔴 BİÇİM ZATEN TEKTİ — ÖLÇÜM BUNU DOĞRULADI, kalem BİÇİMDE DEĞİL
      DURUMDA. §43'ün üç kipi (`.cip` 8/15 · `.cip.suzgec` 9/16 min-h 44
      · `.cip.hap` r999) kaynaktan ölçülmüş KASITLI varyantlar; üçünü
      tek boya indirmek ölçümü geri almak olurdu.

   ÖLÇÜLDÜ (13 ekran · her sekme tıklanarak · görünen 8 şerit):
   ÜÇ ŞERİTTE AKTİF ÇİP PASİFTEN AYIRT EDİLEMİYOR — aktif kalem
   beyaz zemin, gri metin, yani hiçbir şey:

       şerit                   aktif kalemin sınıfı   çizilen
       .cipler (favori)        `cip suzgec on`        beyaz/gri  🔴
       .cipler (kayıt türü)    `cip suzgec on`        beyaz/gri  🔴
       .cipler.fpx-flat        `cip suzgec on`        beyaz/gri  🔴
       .cipler (süzgeç)        `cip suzgec aktif`     aksan/beyaz ✅

   Sebep: markup donörün durum adını (`on`) taşıyor, kanonun durumu
   `.aktif`. §43'ün kendi şerhi bu tuzağı zaten yazmış ("durum adı da
   tekti: `.secili` ↔ `.aktif`, tek ad kaldı") — ama devir YAPILMAMIŞ,
   yalnız kanon içi ikilik kapatılmış. Üçüncü ad dışarıda kaldı.

   İki ad birden devredilir ve durum ÜÇÜNCÜ bir yerden daha okunur:
   `aria-pressed="true"`. Ölçüldü — bu üç şeridin markup'ı zaten
   `aria-pressed`i doğru basıyor. Erişilebilirlik durumu ile görünen
   durum aynı kaynaktan gelince "işaret var ama görünmüyor" hâli
   kapanır; yeni sınıf, yeni renk, yeni ölçü üretilmedi.
   ⚠ `aria-pressed="false"` etkilenmez — yalnız `true`. */

.cip.on,
.cip[aria-pressed="true"]{
  background:var(--aksan-koyu); border-color:var(--aksan-koyu); color:var(--kagit);
  font-weight:var(--agirlik-kalin);
}


/* ── S5 · SEKME ŞERİDİ · TAŞARSA BAŞI KIRPILMAZ ────────────────────────
   🔴 §73a BU KURALI ZATEN YAZMIŞTI — ve KENDİ VARYANTI ONU EZİYORDU.
   §73a taban `.sekmeler`e `justify-content:safe center` verdi ve
   gerekçesini de yazdı ("`safe` … taşan şeridin BAŞINI kırpmayı önler").
   Ama `.sekmeler.ortali` (§6) düz `center` bildiriyor ve (0,2,0) ile
   tabanı (0,1,0) ÖZGÜLLÜKLE yeniyor — dosyadaki sıra değil, özgüllük.
   `width:fit-content` + `max-width:100%` ikilisi bunu önlemeye
   çalışıyor ama şerit kabından genişse `fit-content` zaten %100'e
   kırpılıyor ve düz `center` taşmayı İKİ YANA birden taşırıyor;
   sol taraf kaydırma ile bile erişilemiyor.

   ÖLÇÜLDÜ (fit-antrenorum @1440 · sekiz sekmeli şerit):
       kap 1176px · içerik 1246px · scrollLeft 0
       ilk sekme x=65, kap x=132  →  aktif sekmenin 67px'i KIRPIK
   Beyar: "buradaki default tab nasıl başlıyor, yarısı gözükmüyor bile".

   Aynı kelime kanonda ZATEN iki yerde kullanılıyor
   (`.cipler.ortali.tek-satir` · `.sekme-ray.hesap .sekmeler`) — yani
   düzeltme kanonun kendi çözümü, yeni bir şey değil. Varyant tabanla
   aynı sözü söyler. */
.sekmeler.ortali{ justify-content:safe center; }


/* ── S6 · KÜNYE ŞERİDİ · HÜCRE KİPİ İKİ TÜRLÜ YAZILIYOR ────────────────
   §22'nin `.kunye`si dört eşit hücreyi `gap:1px` + zemin numarasıyla
   çiziyor: ayraç aslında ARKA ZEMİNİN 1px'lik sızıntısı, hücreler
   `--kagit` ile o zemini örtüyor. Örtü kuralı yalnız `>div` için
   yazılmış:  `.kunye>div{ background:var(--kagit); padding:16 }`

   ÖLÇÜLDÜ (13 ekran · altı `.kunye`): ÜÇ ekranda hücreler `<span>`
   (`<span><b>11 hafta</b> arada geçen süre</span>`) —
   fit-ilerlemem · fit-programlarim(2) · fit-hareket-profilim.
   Orada örtü kuralı hiçbir şeye tutunmuyor:
       hücre bg=saydam · dolgu=0 · punto=16px (gövdeden miras)
   yani şerit dört hücreye bölünmüş bir künye değil, ÜSTÜNDE yazı olan
   DÜZ GRİ BİR BANT olarak çiziliyordu. Beyar: "şu component hiç hoş
   değil".

   Kural hücrenin ETİKETİNE değil ROLÜNE yazılır: künyenin çocuğu
   neyse hücredir. Tipografi UYDURULMADI — satır içi
   `<b>değer</b> etiket` kipinin ölçüsü kanonda ZATEN var
   (§`.ozet-kunye`, aynı kaynak kipi): etiket 12.5/orta/ikincil,
   değer 12.5/ekstra/mürekkep. Aynı iki değer buraya devredildi;
   `dt`/`dd` kipi kendi kuralında dokunulmadan duruyor. */
.kunye>div, .kunye>span{
  background:var(--kagit); padding:var(--bosluk-16); min-width:0;
}
.kunye>span{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil);
}
.kunye>span b{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-ekstra);
  color:var(--murekkep);
}


/* ── S7 · BOŞ DURUM YÜZEYİ BOYAMAZ ─────────────────────────────────────
   Canlı bölge (`role="status"` / `aria-live`) JS doldurana kadar BOŞTUR
   ama zeminini, dolgusunu ve köşesini o hâlde de çiziyor. ÖLÇÜLDÜ
   (egzersizlerim · Favori sekmesi @1440):
       p.fpx-durum  1122×26px · bg=aksan yıkaması · dolgu 12/15 · metin ""
   Ekranda boş durumun altında İÇİ BOŞ MAVİ BİR HAP duruyordu.
   Beyar: "altta gereksiz bir mavi pill var, kaldır, içi boş zaten".

   Kanon bu kararı ZATEN iki kez vermiş ama ikisi de tek kaleme yazılı
   (`.okuma-notu:empty` · `.ptk-durum:empty`) — yani kural bileşen bileşen
   keşfediliyor. Doğru dayanak SINIF değil ROL: bir bölge canlı duyuru
   yüzeyiyse ve içi boşsa görünmez. Böylece bugün olmayan yarınki durum
   yüzeyi de kendiliğinden doğru davranır.
   ⚠ Yalnız GERÇEKTEN boş olan (`:empty`) gizlenir — içinde boşluk bile
     olsa `:empty` tutmaz, yani JS bir kez yazdıysa bölge kalıcı olur. */
[role="status"]:empty,
[aria-live]:empty{ display:none; }


/* ── S8 · BÖLÜM GİRİŞ METNİ ALTINDAKİ KARTLA HİZALIDIR ─────────────────
   Beyar: "bu tarz açıklamaları yay, sayfa genişliğinde, altındaki kart
   ile hizalı."

   ÖLÇÜLDÜ (egzersizlerim · Favori sekmesi @1440), aynı sol kenardan
   başlayan üç kalem üç ayrı ende bitiyordu:
       h2 "Kaydettiklerin"     x=132  w=1152
       giriş metni             x=132  w= 520   ← `max-width:520px`
       altındaki kart          x=132  w=1176
   Paragraf başlığının yarısı kadar bile değil; okuyucu bölümün
   genişliğini üç kez yeniden öğreniyor.

   520px kanonda İKİ ayrı yerde yazılı ve ikisi AYNI ŞEY DEĞİL:
   `.arama`nın 520'si bir GİRDİ genişliği (kalması gerekir), §18'in
   giriş metnindeki 520 ise bir SATIR ÖLÇÜSÜ. Kaldırılan yalnız
   ikincisi; `.bolum-bas` ızgarası kaleme zaten `grid-column:1/-1`
   veriyor, yani kap ne kadarsa metin o kadar — yeni ölçü YAZILMADI,
   var olan bir kapak kaldırıldı.
   Donörden gelen `.lead` adı da aynı kalemin ikinci adı; ikisi birlikte
   devredilir ki 13 ekranda tek davranış kalsın. */
.bolum-bas .giris-metni,
.bolum-bas .lead,
.sec-head .lead{ max-width:none; }


/* ── S9 · YAPIŞMA KURALI KART'TA BİTMİYOR ──────────────────────────────
   Beyar: "sana kartlar böyle yapışık olmayacak dedim."
   Haklı — S3 kuralı üç ada yazılmıştı (`.kart` `.fp-card` `.ozet-karti`)
   ve okuma kolonundaki öteki bloklar kapsam DIŞINDA kalmıştı. Kural
   adları saydığı sürece her yeni komşuluk yeni bir kusurdur.

   ÖLÇÜLDÜ (29 ekran · her sekme tıklanarak · blok ailesinin TÜM
   komşulukları), yapışık kalan beş çift:
       .kart      + .uyari-kutu   0px   ×2  (hareket-profilim #hp-kisit …)
       .kart      + .tablo-kap    0px
       .tablo-kap + .bos-durum    0px
       .akordeon  + .kart         0px
       .kunye     + .olcer       11px
   Beyar'ın gördüğü kalem birincisi: uyarı kutusu kartın dibine
   yapışıyordu.

   Kural artık ADA değil AİLEYE yazılır: okuma akışında arka arkaya
   gelen iki BLOK bileşen arasında S3'ün tek değeri vardır. Değer aynı
   `--bosluk-16`; yeni ölçü üretilmedi, kapsam düzeltildi.

   ⚠ İKİ İSTİSNA KORUNUR:
     · `.bilgi-notu` kendi üst ritmini (§16 · 34px) taşır — o bir bölüm
       başlangıcıdır, kart komşusu değil. Aynı özgüllükte geri yazılır.
     · `gap` yazan kaplar S3'ün ① maddesindeki muafiyeti korur; çocuk
       listesi de aileye genişletildi, yoksa çift sayım geri gelirdi. */
/* 🔴 `.yonlendirme` AİLEYE KATILDI — 2026-09-04, FIT public revize turu.
   S9'un kendi şerhi bunu ÖNCEDEN yazmıştı: *"Kural adları saydığı sürece
   her yeni komşuluk yeni bir kusurdur."* Ölçüm o cümleyi doğruladı.
   ÖLÇÜLDÜ (`fit-cozum-merkezi#oneri` @1440, `.okuma-kolonu`nun çocukları):
       form.kart.form   x290 w860 y787  h904
       .yonlendirme     x290 w860 y1692        ← aradaki boşluk 0px
   §38 yönlendirme ızgarası bir BLOK bileşendir (kartın kardeşi, içeriği
   değil) ama S9'un ailesinde adı yoktu; "Genel iletişim konuları" kutusu
   formun dibine yapışıyordu (Beyar gözle gördü).
   Yeni ölçü ÜRETİLMEDİ — ailenin tek değeri `--bosluk-16` aynen geçerli.
   Izgara muafiyetine de eklendi, yoksa `gap` yazan kaplarda çift sayılır. */
:is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.bilgi-notu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer,.yonlendirme)
  + :is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer,.yonlendirme){
  margin-top:var(--bosluk-16);
}
:is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer,.yonlendirme)
  + .bilgi-notu{
  margin-top:var(--bosluk-34);
}
:is(.pp-gunler, .fp-grid, .fpx-kural, .ol-formcards)
  > :is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.bilgi-notu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer,.yonlendirme)
  + :is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.bilgi-notu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer,.yonlendirme){
  margin-top:0;
}


/* ── S10 · SÜZGEÇ ŞERİDİ DE BİR BLOKTUR ────────────────────────────────
   S9 aileyi genişletti ama `.cipler` dışarıda kalmıştı; şerit kendi
   7px'lik iç dolgusundan başka nefes almıyor.
   ÖLÇÜLDÜ (29 ekran · her sekme tıklanarak) — yedi ekranda dokuz çift:
       .cipler + .cipler     0px   egzersizlerim  ← iki süzgeç TEK blok
       .cipler + .kart       0px   egzersizlerim
       .cipler + .tablo-kap  0px   challengelarim · programlarim
       .cipler + .fp-list    0px   ilerlemem  (6px egzersizlerim)
       .cipler + .ba-count   0px   hesabim · hareket-profilim
       .cipler + .fpx-kiyas  4px   ilerlemem
   Yani süzgeç, süzdüğü şeyin üstüne yapışıyordu.

   İKİ AYRI ARALIK, ÇÜNKÜ İKİ AYRI İLİŞKİ — ve bu ayrım ölçülmüş bir
   ihtiyaç, süsleme değil:
     · ŞERİT ↔ ŞERİT (`DÖNEM` + `KANIT`): ikisi TEK kontrol kümesidir,
       aynı listeyi birlikte süzer. Blok aralığı verilirse üç eşit blok
       gibi okunur ve "hangisi hangi kümenin parçası" bilgisi kaybolur.
       `--bosluk-9` — kanonun `.cipler` şeridinin KENDİ gap'i, yani
       kümenin içindeki ritim dışına da aynı değerle çıkıyor.
     · ŞERİT ↔ SÜZÜLEN: iki ayrı bloktur, S9'un `--bosluk-16`'sı.
   Şeridin başlıkla arası (34px) zaten §18'in kuralı, dokunulmadı. */
.cipler + .cipler{ margin-top:var(--bosluk-9); }
.cipler + :is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.kunye,.tablo-kap,
              .bos-durum,.akordeon,.olcer,.fp-list,.ba-count,.fpx-kiyas){
  margin-top:var(--bosluk-16);
}


/* ── S11 · SAYFALAMA KART AYAĞINDA KENDİ MARJINI TAŞIMAZ ───────────────
   §8 `.sayfalama`ya `margin-top:40px` veriyor ve bu AKIŞ bağlamında
   doğru: tablo biter, kırk piksel boşluk, sayfalama başlar.
   Ama sayfalama bir KART AYAĞININ (`.kart-alt`) içindeyse bant zaten
   var — ayağın kendi 16px dolgusu ve üst kenar çizgisi.
   İki bant üst üste biniyor.

   ÖLÇÜLDÜ (egzersizlerim `#egz-gecmis` @1440):
       tablonun son satırı → sayfalama          57px
       .kart-alt yüksekliği                    158px
       (dolgu 32 + sayfalama 44+40 + not 19+6 + sarma 16)
   Tablonun altında yarım ekran boş bant kalıyordu; kartın en yoğun
   kalemi (kayıtlar) ile sayfası arasında bağ kopuyor.

   Yeni ölçü YAZILMADI, ikinci bant kaldırıldı: ayak zaten bandın
   kendisidir. Akıştaki sayfalama (`.kart > .sayfalama`, programlarim)
   40px'ini korur — orada ayak yok. */
.kart-alt > .sayfalama{ margin-top:0; }


/* ── S12 · İÇERİĞİ OLMAYAN BANT BASILMAZ ───────────────────────────────
   Beyar: "sayfa sonunda gereksiz gri şerit var, içi boş bir bant.
   Böyle bir şey olmayacak."

   ÖLÇÜLDÜ — ve şerit bir BÖLÜM DEĞİL, §74a'nın kendi dolgusuydu.
   `.modul-govde` hem kendi zeminini boyuyor (`--zemin` #f9f9f9) hem de
   `padding-bottom:--bolum-nefes-sik` yazıyor. Bandın SON çocuğu tam
   enli ve KENDİ zeminini boyayan bir bölümse (beyaz `section.bolum` /
   `.hs-sec`), o bölüm bittikten sonra bandın 32px'i altta BAŞKA RENKTE
   bir şerit olarak görünüyor — içinde hiçbir şey olmayan bir bant.

   29 ekran tarandı · 11 ekranda birebir aynı şerit:
       cozum-merkezi · destek-taleplerim · fit-cozum-merkezi ·
       fit-hesabim · fit-odemelerim · fit-paketlerim · fit-rozetlerim ·
       hesabim · odemelerim · paketlerim · destek-olustur
   Hepsinde: bant #f9f9f9 · son bölüm #fff · şerit tam 32px.
   Kalan ekranların sonu SAYDAM bir okuma kabıyla bitiyor; orada aynı
   32px zemin farkı DEĞİL, nefesin kendisidir ve kalmalıdır.

   🔴 §74a GERİ ALINMIYOR — SAHİBİ DEĞİŞİYOR. O kural gerçek bir
   yokluğu kapatmıştı (üç bantta alt nefes hiç yoktu) ve nefes hâlâ
   gerekli; yanlış olan nefesin KİMDE durduğu. Nefes bandın altına
   değil, bandın son çocuğunun içine yazılır: çocuk kendi zeminini
   boyuyorsa nefes o zeminin içinde kalır, boyamıyorsa görünüş
   birebir eskisi gibi olur. Değer aynı `--bolum-nefes-sik`; yeni ölçü
   üretilmedi, tek bir dolgu bir kademe aşağı taşındı.

   ⚠ Sekmeli ekranlarda bandın son çocuğu GİZLİ bir panodur; kural bu
     yüzden görünür panonun son çocuğunu da hedefler. Aksi hâlde nefes
     hiç kimseye düşmezdi. */
.modul-govde{ padding-bottom:0; }
.modul-govde > *:last-child:not(.fit-pane),
.modul-govde > .fit-pane:not([hidden]) > *:last-child{
  padding-bottom:var(--bolum-nefes-sik);
}


/* ── S13 · SEKME RAYI İLE PANOSU ARASINDA TEK MESAFE ───────────────────
   Beyar: "section'un üst etiketi ve üstündeki taba bak, mesafeye."

   ÖLÇÜLDÜ (29 ekran · her sekme tıklanarak · rayın dibi → panonun ilk
   görünür kalemi) — ON DOKUZ farklı değer, iki küme:
       22–25px × 25 pano   ·   54–58px × 28 pano
       (ve 35 · 44 · 47 · 64 · 98 · 109 · 110 · 129 · 209 tekleri)
   Yani aynı ray, tıklanan sekmeye göre içeriği bazen iki kat daha
   uzağa itiyordu.

   KÖK — ölçüldü, tahmin değil: pano HER ZAMAN rayın 22px altında
   başlıyor; fark panonun İLK BLOĞUNDA:
       `.fit-pane > section`  kendi zeminini boyar, `padding-top:32`  → 54px
       `.fit-pane > .kap`     saydam okuma kabı, S3 dolgusunu sıfırlar → 22px
   İki kip aynı işi görüyor ama nefesi bir tanesi taşıyor.

   DEĞER SEÇİLMEDİ, SAYILDI: 54–58 kümesi ÇOĞUNLUK (28 pano) ve o
   nefes zaten `--bolum-nefes-sik`in kendisi. Saydam kap da aynı
   tokenla aynı mesafeye çıkarılır. `section` bantlarına DOKUNULMADI —
   dolguları zemin boyuyor (S3'ün aynı gerekçesi).
   ⚠ Yalnız İLK blok; ardışık bloklar S3'ün 32px'ini kullanmaya devam
     eder, yani panonun içindeki ritim değişmez. */
.fit-pane > .kap:first-child{ padding-top:var(--bolum-nefes-sik); }
/* 🔴 İLK YAZIMIN KUSURU — Beyar yakaladı, 2026-09-03: "tab ile altındaki
   içerik arasında niye bu kadar boşluk var, standart olacak dedik."
   HAKLI. Kural nefesi EKLİYORDU ama panonun ilk bloğunun İÇİNDEKİ kalem
   çoğu ekranda kendi üst payını zaten taşıyor. Ölçüldü (egzersizlerim
   `#egz-tamamlanan` @1440):
       pano 22 + bu kuralın 32 + `.fpx-sec` marjı 44 = 98px  (mürekkebe 117)
   Yani S3'ün düzelttiği ÇİFT SAYIM hatasını bu kural yeniden üretti.
   Nefes TEK yerden gelir: panonun ilk bloğundan. İçerideki ilk kalemin
   kendi payı sıfırlanır — kaldırılan bir değer, eklenen yok. */
.fit-pane > *:first-child > *:first-child{ margin-top:0; }

/* 🔴 KURALIN DIŞINDA KALAN TEK PANO — ölçüldü 2026-09-03, Beyar
   "fit-hareket-profilim#hp-cihaz sekme şeridi ↔ pano boşluğu fazla".
   S13 TUTUYOR: dokuz panonun sekizinde şerit dibi → ilk MÜREKKEP
   54.0px, hepsi aynı. Aykırı olan tek pano:
       hp-cihaz   128px   (54 + 74)
   Fark kanondan gelmiyor — gövdede ELLE YAZILMIŞ bir satır var:
       <div class="sec-head" style="padding-top:74px">
   Yani kanonun ölçüsü değil, uydurma markup. Kural DEĞİŞMEDİ; düzeltme
   gövdededir (govde-fit-hareket-profilim.html · inline stil sökülür).
   ⚠ 74px tesadüf değil: S3'te ölçülen `.bolum.kap` dolgusunun (74/74)
     kopyası. Sökülen bir kapın değeri, çocuğa elle taşınmış. */


/* ── S14 · ARŞİV NESNESİ · SÜZGEÇ SÜZDÜĞÜ ŞEYLE AYNI KUTUDADIR ─────────
   Beyar: "arşivi redesign et."

   ÖLÇÜLDÜ — iki arşiv AYNI İŞİ İKİ AYRI YAPIYLA yapıyordu:
       #egz-gecmis   .kap > [başlık · çip · çip · KART[tablo · ayak]]
       #prg-gecmis   .bolum.kap > [başlık · KART[kart-başı · çip · tablo
                                                 · sayfalama · not]]
   Birincide süzgeç kartın DIŞINDA duruyor — kullanıcı iki ayrı nesne
   görüyor ve "bu çipler neyi süzüyor" sorusu ekranda yazılı değil.
   İkincide süzgeç kartın içinde ama kartın GİRİNTİSİ YOK: `.cipler`
   x=133, kartın kenarı da 133 — "DURUM" etiketi kart kenarına yapışık
   çıkıyordu (ölçüldü @1440).

   YAPI TEKLEŞTİ (markup TAŞINDI, yeniden yazılmadı — KOPYALAMA-KURALI
   eksi birinci madde; hiçbir eleman silinmedi, hiçbiri üretilmedi):
       .kart.tasma-kapali
         .kart-bas      ad + sayaç rozeti      ← sayaç, saydığı tablonun yanında
         .cipler ×N     süzgeçler
         .tablo-kap     kayıtlar
         .kart-alt      sayfalama + not         ← ayak, kenar çizgili
   `#egz-gecmis`in sayacı bölüm başlığının araç yuvasından kart başına
   indi: dört kaydı sayan rozet, dört kaydı gösteren tablonun üstünde
   durmalı — 900px yukarısında değil.

   BU KURAL O YAPIYI AYAKTA TUTAR: kartın içindeki süzgeç şeridi kartın
   kendi girintisini alır. Değer uydurulmadı — `--bosluk-24`, `.kart-bas`
   ve `.kart.dolgulu`nun ZATEN kullandığı kart girintisi. Böylece çip,
   üstündeki başlıkla ve altındaki tablo başlığıyla aynı hizadan başlar.
   ⚠ Kartın DIŞINDAKİ `.cipler` etkilenmez: orada girinti okuma
     kolonunun kendisidir. */
/* Beyar'ın seçimi (2026-09-03, iki alternatif ekran görüntüsüyle
   sunuldu): arşiv süzgeci ÇİP değil AÇILIR LİSTE — 9 ekranın kalıbı.
   Kart içindeki süzgeç yüzeyi, hangi kalıp olursa olsun kartın kendi
   girintisini alır; kural ada değil YUVAYA yazılı. */
.kart > .cipler{ padding-inline:var(--bosluk-24); }
.kart > .alan-izgara{ padding:var(--bosluk-16) var(--bosluk-24); }
.kart > .cipler:first-of-type{ padding-top:var(--bosluk-16); }
.kart > .cipler:last-of-type{ padding-bottom:var(--bosluk-16); }


/* ── S15 · KART BAŞI İKONU VE SAYFALAMA · İKİSİ DE DEVİR ───────────────
   Beyar: "kart ikonu: diğer kartlarda merkezde mi solda mı — ölç,
   tutarlı olsun. Pagination: §8 kuralı, ortalı."

   ① İKON KAROSU. ÖLÇÜLDÜ (29 ekran · her sekme tıklanarak · görünen
      her kart başı ikonu):
          34×34 · yuvarlak 12 · aksan yıkaması · 14px glif   × 58  ← kanon
          çıplak glif · zemin yok · 18.72px                   ×  1  ← `.kart-bas`
      Yani karo TEK ve YERLEŞİK bir kalıp; `.kart-bas` onu almıyordu
      çünkü §46'nın kuralı yalnız `.ozet-bas h3 i`ye yazılmış. Aynı rol,
      iki ad — §43'ün `.aktif`/`.on` ikiliğinin aynısı.
      Ad korunur, biçim tek yerden gelir. Yeni ölçü üretilmedi:
      34×34 · `--yuvarlak-md` · `--yazi-14` · `--aksan-yikama`,
      dördü de §46'nın kendi değerleri. Glif `place-items:center` ile
      karonun MERKEZİNDE — ölçümün cevabı bu.

   ② SAYFALAMA ORTALI. §8 zaten `justify-content:center` yazıyor ve
      akıştaki sayfalama ortalı çiziliyor. Kart ayağına girince ortalama
      KAYBOLUYOR: `.kart-alt` bir flex satırı, `nav.sayfalama` da onun
      esnek kalemi — kutu içeriği kadar büzülüyor (ölçüldü: x=157
      w=148, kap 1174) ve §8'in ortalaması 148px'lik kutunun içinde
      kalıyor. Ortalamanın çalışması için kutunun satırı KAPLAMASI
      gerekir. Yeni hizalama yazılmadı; §8'in kuralına genişlik verildi. */
.kart-bas h3 i{
  flex:none; width:34px; height:34px; border-radius:var(--yuvarlak-md);
  display:grid; place-items:center; font-size:var(--yazi-14);
  background:var(--aksan-yikama); color:var(--aksan-murekkep);
}
.kart-bas h3{ display:flex; align-items:center; gap:var(--bosluk-10); }
.kart-alt > .sayfalama{ flex:1 1 100%; }


/* ── S16 · YÜZEN DÜĞMELER TEK BOYDUR ───────────────────────────────────
   Beyar: "sağ alt antrenör FAB'ı böyle uzun olmasın; antrenör olmasa
   bile yazı koyma, başka bir şey koy; yukarısındaki 'yukarı çık' FAB'ı
   ile eş olsun, bu çok yer kaplıyor."

   ÖLÇÜLDÜ (fit-hesabim @1440, sağ alt köşe, iki yüzen düğme üst üste):
       #msjFab.is-bos   355×52   dolgu 0/20 · içinde 43 karakter metin
       .to-top           54×54   dolgu 0    · yalnız ikon
   Aynı köşede, 32px arayla, biri ötekinin ALTI KATI genişlikte. Sayfanın
   sağ alt kolonu bir düğme sütunu; iki farklı kutu orada bir sütun
   oluşturmuyor, biri ötekinin üstüne binmiş gibi duruyor.

   🔴 KAYNAĞIN GEREKÇESİ BİLİNİYOR VE DEVREDİLİYOR. `.is-bos` kipinin
   kendi şerhi şunu diyor: "randevusu olmayan üye: düğme yuvarlak rozet
   değil, DOĞRUYU SÖYLEYEN bir satırdır. 'Sohbet' yazıp boş panel açmak
   yalan olurdu." Gerekçe doğru — çözümü Beyar değiştiriyor, doğruluk
   şartını DEĞİL: cümle SİLİNMİYOR, `.yalniz-okuyucu`ya (§20) geçiyor.
   Ekran okuyucu hâlâ "Henüz antrenörün yok — antrenörlere göz at"
   duyuyor, `aria-label` de aynı cümleyi taşıyor; ekranda kalan, o
   cümlenin ikonu (`fa-user-tie` — sohbet değil, ANTRENÖR ikonu, yani
   düğme yine yalan söylemiyor).

   Ölçü uydurulmadı: 54×54 · `--yuvarlak-lg`, ikisi de `.to-top`un kendi
   değerleri. Taban `.msj-fab` de 56'dan 54'e çekildi — sütundaki üç
   kutu (sohbet · antrenör kipi · yukarı çık) artık tek boy. */
.msj-fab,
.msj-fab.is-bos{
  width:54px; height:54px; padding:0;
  border-radius:var(--yuvarlak-lg);
}
.msj-fab.is-bos > span{
  position:absolute; width:1px; height:1px; overflow:hidden;
  clip-path:inset(50%); white-space:nowrap;
}


/* ═══════════════════════════════════════════════════════════════════════
   § GÖMÜLÜ TABLO KABI · O1 · Beyar kararı 2026-09-03 · KALIP
   ═══════════════════════════════════════════════════════════════════════
   KALIP (Y1 kalıp tablosunun ilk maddesi — agent karar vermez, kalıbı alır):

       kart İÇİ tablo   →  .tablo-kap.gomulu > .tablo     köşe YOK
       kart DIŞI tablo  →  .tablo-kap > .tablo            köşe VAR

   ── NEDEN AD, NEDEN SOY DEĞİL ────────────────────────────────────────
   Kural soyağacına yazılamadı, çünkü soyağacı TEK DEĞİL. Ölçüldü
   (38 ekran · her sekme tıklanmış · dokuz kart içi kap), üç ayrı zincir:

       .kart.odeme            > .kart-govde.bosluksuz > .tablo-kap   ×7
       .kart.tasma-kapali     > .tablo-kap                           ×1
       .kart                  > .tablo-kap                           ×1

   `.kart > .tablo-kap` yazan bir kural dokuzun YALNIZ İKİSİNİ tutardı;
   `.kart .tablo-kap` ise soyu sayan bir kural olurdu ve S9'un dersine
   düşerdi ("kural adları saydığı sürece her yeni komşuluk yeni bir
   kusurdur"). Ad taşıyan kap kendi kipini kendi söyler — zincir ne
   olursa olsun.

   ── DİP DALI · KARTIN ALT KÖŞESİ SÜRDÜRÜLÜR ──────────────────────────
   Dokuz kabın İKİSİ kartın dibine tam değiyor (ölçüldü, kartın kenar
   kalınlığı düşülerek: `fit-odemelerim#iade` ve `odemelerim#iade`,
   ikisinde de dip payı 0.00px; kalan yedisinde 53–118px).

   🔴 DAL SÜS DEĞİL, ÖLÇÜLMÜŞ BİR REGRESYONU ÖNLÜYOR. Köşe bugün boş
   göründüğü için "fark etmez" sanılabilir — ama §4'ün KENDİ kuralı onu
   boyuyor: `.tablo tbody tr:hover{ background:var(--zemin) }`.
   Son satırın üstünde gerçek fare ile ölçüldü (sol-alt köşeden 9×9 px):
       bugünkü hâl            → boya kartın yayında duruyor      ✅
       gömülü, dal YOK        → boya kartın köşesini TAŞIYOR     🔴
       gömülü + dip dalı      → bugünküyle piksel piksel aynı    ✅
   Yani dalsız hâlde hover, kartın yuvarlak köşesini kare gösteriyor.

   Seçici DENENDİ, dokuz kapta da doğru karar verdi: dibe değen ikisini
   tuttu, kalan yedisini tutmadı (9/9). Ölçüt `:last-child` zinciri —
   kabın kartla arasındaki her düğüm son çocuk olmalı; araya bir kart
   ayağı girdiği anda kural kendiliğinden düşer, ki doğrusu odur.

   ── TEPE DALI · A1 · 2026-09-03 · ÖLÇÜLDÜ, SONRA YAZILDI ──────────────
   Bu blok yazıldığında dokuz kabın hiçbiri kartın tepesine değmiyordu
   (en yakını 97px) ve dal bilerek yazılmadı. Y2 (çok donörlü stil) sonrası
   yeniden basımda BİR kap tepeye indi: `fit-egzersizlerim#egz-gecmis`,
   kart tepesine 1px (kartın kenar kalınlığı). Kart `.tasma-kapali`.
   Piksel probu (lead-o1-tepe.mjs · kartın sol-üst köşegeni, +3/+4/+5):
       a · bugünkü hâl (kırpma açık)   248 · 245 · 248   kenar yayı VAR  ✅
       b · kırpma sökülmüş             249 · 249 · 249   yay SİLİNDİ     🔴
       c · b + tepe dalı               248 · 245 · 247   yay GERİ        ✅
   Başlık şeridinin zemini (`--zemin` 249) bandın zeminiyle aynı olduğu
   için kare köşenin KENDİSİ görünmez; silinen, kartın 1px kenar yayıdır.
   Kırpma bugün gizliyor ama taban `.kart` kırpmaz (168 visible ↔ 27
   hidden) — dal, dip dalıyla aynı gerekçeyle aynadan yazıldı.

   ── EKRANLAR ADI TAŞIYOR · 2026-09-03 ─────────────────────────────────
   Üretici `_gomulu_kap()` çeviriden SONRA soyu okuyup jetonu basıyor
   (fit-kur.py). 13 FIT ekranı ölçüldü: 6 gömülü (antrenorum · egzersizlerim
   · odemelerim ×3 · programlarim) · 3 düz (challengelarim ×2 kartsız ·
   paketlerim `.cerceveli`). Yukarıdaki "dokuz" 38 ekranı sayıyordu
   (DİYET `odemelerim` ×3 dahil). Dip dalı ekranda: `fit-odemelerim#iade`
   0 0 16 16.
   ═══════════════════════════════════════════════════════════════════════ */

.tablo-kap.gomulu{ border-radius:0; }

/* 🔴 DİPSİZ GÖVDE — 15 bağımsız tüketici. Kart gövdesinin alt dolgusu,
   ardından bir ayak (sayfalama · eylem satırı) geldiğinde iki kez
   sayılıyor. `.bosluksuz` dolgunun TAMAMINI siler; bu yalnız DİBİ siler
   ve yanlarını korur. 15 ekranda satır içi `padding-bottom:0` olarak
   yazılmıştı. */
.kart-govde.dipsiz{ padding-bottom:0; }

/* 🔴 TAM EN DÜĞME — 10 bağımsız tüketici. Yan kolonda ve dar kartta
   düğme kabın enini alır. §75i dar ekranda bunu zaten yapıyor
   (`.kart-alt.form-eylem > .dugme{flex:1 1 auto}`); geniş ekranda
   karşılığı yoktu ve satır içi `width:100%` olarak yazılıyordu. */
.dugme.tam-en{ width:100%; }

/* Kartın dibine değen gömülü kap, kartın alt köşesini SÜRDÜRÜR.
   Yeni ölçü yazılmadı — `--yuvarlak-lg` kartın kendi köşesi. */
:is(.kart,.fp-card,.ozet-karti) > .tablo-kap.gomulu:last-child,
:is(.kart,.fp-card,.ozet-karti) > .kart-govde:last-child > .tablo-kap.gomulu:last-child{
  border-bottom-left-radius:var(--yuvarlak-lg);
  border-bottom-right-radius:var(--yuvarlak-lg);
}
/* Kartın TEPESİNE değen gömülü kap, kartın üst köşesini SÜRDÜRÜR.
   Dip dalının aynası — ölçüsü yukarıda (a/b/c). */
:is(.kart,.fp-card,.ozet-karti) > .tablo-kap.gomulu:first-child,
:is(.kart,.fp-card,.ozet-karti) > .kart-govde:first-child > .tablo-kap.gomulu:first-child{
  border-top-left-radius:var(--yuvarlak-lg);
  border-top-right-radius:var(--yuvarlak-lg);
}


/* ── S17 · SÜZGEÇ ŞERİDİ BAŞLIĞI İKİ NOKTA İLE BİTER ───────────────────
   Beyar: "TÜR → TÜR:, TEST → TEST: — tüm ekranlarda tara."

   ÖLÇÜLDÜ (13 FIT + 29 Diyet ekranı · her sekme tıklanarak) — şeridin
   başlığı İKİ AYRI SINIFLA yazılıyor ve yalnız birinde iki nokta var:

       .cipler-basligi   9 kalem / 5 ekran   12px · versal · İKİ NOKTA YOK 🔴
         egzersizlerim  Tür · Dönem · Kanıt
         ilerlemem      Durum · Test
         odemelerim     Tür            programlarim  Durum
         hareket-profilim  "Bir tane seç" · "Birden fazla seçebilirsin"
       .lbl              1 kalem / 1 ekran   13px · düz     "Tür:"  ✅
         enerji-defterim
       (Diyet: `odemelerim` ×1 — "Tür", aynı 🔴)

   Yani DOĞRU BİÇİM ZATEN EKRANDAYDI, ama başka bir sınıfın altında:
   `.lbl` kaynağın adı, eşlemede karşılığı yok, kanonun 12px/versal
   sözleşmesine hiç girmemiş. İki nokta gövde metnine değil KURALA
   yazılır — tek yerden, iki markada birden.

   ⚠ `.lbl` EŞLEME DELİĞİ — KAPATILDI, ama ilk yazımın tarif ettiği
     yoldan DEĞİL. 🔴 İlk yazım "ekranlar/<ad>.mjs eşlemesine seçici
     yazılır" diyordu; ÖYLE BİR KANAL YOK (A2 uyguladığında ortaya
     çıktı, 2026-09-03). Üreticinin gerçek eşlemesi
     `scripts/olcum/fit-harita.json`:
         `harita`    334 kalem · JETON düzeyinde · kaynak→kanon · KÜRESEL
                     (`"lbl":"cipler-basligi"` yazmak gün etiketlerini de
                      vururdu — enerji-defterim'de 8 tanesi `.lbl`)
         `baglamli`  ATA sınıfıyla kapsanmış eşleme
                     (`"fp-row":{"end":"ks-uc"}` kipinde) — kapsam bu
                     kanaldan verilir, seçiciyle değil
     UYGULANAN: gövdedeki süzgeç başlığı kaynağın KENDİ doğru sınıfına
     taşındı (`lbl` → `fgroup-lbl`); `"fgroup-lbl":"cipler-basligi"`
     haritada ZATEN duruyordu (fit-harita.json L164) ve aynı ekranın
     egzersizlerim kardeşi bunu zaten böyle yazıyordu. Kapsam
     kendiliğinden dar: gün etiketleri `.lbl` kaldı (9 → 8).
     Ölçüldü: enerji-defterim «TÜR:» · hareket-profilim «DURUM:» ·
     hesabim «DURUM:» — üçü de 12px versal, tek iki nokta.
   ⚠ Çeviri yapılırken gövdedeki ELLE YAZILMIŞ ":" SÖKÜLÜR — yoksa bu
     kural onun üstüne bir ikinci iki nokta basar ("Tür::").
   ⚠ SIRALAMA ETİKETİ BU KURALIN DIŞINDA — ÖLÇÜLDÜ, KAPANDI.
     A2 «Sırala» (`.lib-sort > .lbl`) için "aynı çubukta TÜR: ile yan
     yana, iki ayrı dil" dedi; LEAD de şerhe önce öyle yazdı. 🔴 İKİSİ
     DE YANLIŞTI: o etiket EKRANDA YOK. Ölçüldü (enerji-defterim, altı
     panonun hepsi tıklanarak): `#agSortLbl` computed `display:none`,
     ataları görünür (`.lib-sort[flex]` · `.ff-bar[flex]`). Kaynağın
     kendi kuralı gizliyor: `fit-shell.css:3140`
     `.ff-bar .ff-sort .lbl{display:none}`.
     Yani etiket görsel değil ERİŞİLEBİLİRLİK ADI —
     `.sort-seg[aria-labelledby="agSortLbl"]` onu okuyor. S17'ye
     alınmaz: görünmeyen bir ada iki nokta eklemek ekranda hiçbir şey
     değiştirmez, ekran okuyucuda "Sırala:" dedirtir. Kalem yok.
   ⚠ Kural yalnız GÖRÜNEN metni değiştirir; ekran okuyucuda başlık
     zaten `aria-label`li grubun içinde duruyor. */
.cipler-basligi::after{ content:":"; }


/* ── S18 · KART SAYACI HÜCRELERİ AYRIKTIR ──────────────────────────────
   Beyar: "künye çakışması — 24 antrenmanPzt · Çrş".

   ÖLÇÜLDÜ (13 ekran · her sekme tıklanarak · altı `.kart-sayac`):
       çok hücreli  2   fit-programlarim (#prg-planlanan ×2)
       tek hücreli  4   —
   Çok hücreli ikisinde:
       display:block · gap:normal · iki `<span>` inline
       İKİ HÜCRE ARASI MESAFE = 0.0px, ikisi de aynı satırda
   yani "24 antrenman" ile "Pzt · Çrş · Cum" arasında ayıracı olmayan
   bir yapışma vardı; sayaç bir künye değil, tek bir cümle gibi
   okunuyordu.

   DEĞER UYDURULMADI — DEVREDİLDİ. Aynı rolün kanondaki ölçülmüş kipi
   `.ozet-kunye` (§63d): `display:flex · flex-wrap:wrap · gap:18px`,
   tipografisi de birebir aynı (12.5 / orta / ikincil, `b` ekstra +
   mürekkep). `.kart-sayac` o kalıbın SATIR İÇİ kardeşiydi ve yalnız
   yerleşim sözleşmesi eksikti. 18px kaynağın kendi `.fp-meta` gap'i.
   ⚠ Tek hücreli dördü etkilenmez: tek çocuklu flex kabı, blok kabıyla
     aynı çizer (dolgu ve hizası §44'te, dokunulmadı). */
.kart-sayac{
  display:flex; flex-wrap:wrap;
  column-gap:var(--bosluk-18); row-gap:var(--bosluk-4);
}


/* ── S19 · KART BAŞI EYLEM BAĞLANTISI ──────────────────────────────────
   Beyar: "fit-ilerlemem#ilr-testler 'Sonucun tamamı' bağlantısı çok
   büyük."

   Kalem tek bir bağlantı değil, ÇEVİRİNİN KOPARDIĞI BİR KURAL.

   KÖK — ölçüldü, tahmin değil. Kaynağın kuralı TORUN seçicisiyle
   yazılmış:
       fit-shell.css:2284
       .fp-head .fp-act{ font-size:13px; font-weight:700; color:--fit-deep }
   Gövdede `.fp-head` kanon adına çevriliyor (`.ozet-bas`, eşleme
   2026-09-03), `.fp-act` ise çevrilmiyor — kanonda karşılığı yok.
   Torun seçicisinin SOL YARISI gidince kural hiçbir şeye tutunmuyor
   ve bağlantı gövde tipografisine düşüyor.

   ÖLÇÜLDÜ (13 ekran · `.fp-act` 43 örnek / 5 ekran · üç küme):
       .ozet-bas .fp-act    11   16.0px / 500 / mürekkep   🔴 ÇIPLAK
       .ks-uc   .fp-act     12   12.5px / 700 / ikincil    ✅ (künye ucu)
       .fp-act.fp-actbtn     8   13.0px / 700 / #000       — ayrı kalem
   Emsal: `.see-all` → `.dugme.orta` (§47) 13.5 / 700 / h 44.9. Yani
   kart başındaki bağlantı, kartın kendi başlığıyla (17.5) neredeyse
   aynı boya çıkmış, düğme emsalinden 2.5px büyük duruyordu.

   DEĞER UYDURULMADI: kaynağın kendi üç değeri (13 / 700 / --fit-deep)
   kanon tokenlarına birebir çevrildi — ölçüldü, `--fit-deep` ile
   `--aksan-koyu` AYNI hesaplanmış renk
   (`color-mix(in srgb,#0093D0 77.5%,#000)`), yeni renk üretilmedi.
   ⚠ Kural kaynağın adına yazılı (`.fp-act`) — kanonda `.fp-grid`,
     `.fpx-kural`, `.pp-gunler` için aynı kip zaten var (S3). `.fp-act`
     bir gün kanon adı alırsa kural o ada taşınır.
   ⚠ `.ks-uc` kümesine DOKUNULMADI: o künye ucunun kendi ölçüsü
     tutuyor. `.fp-actbtn`in siyahı (#000 ≠ --murekkep) ölçüldü ama
     Beyar'ın kaleminde değil — şerhe yazıldı, kural yazılmadı. */
.ozet-bas .fp-act{
  flex:none; display:inline-flex; align-items:center; gap:var(--bosluk-6);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu);
}


/* ── S20 · KART RAYI · TEK SATIR YATAY KAYDIRMA ────────────────────────
   Beyar: "'Üç challenge tipi' ızgarası tek satır yatay slider olsun;
   dördüncü kart ('Seri ve telafi') altta tam genişlik dursun — o bir
   tip değil, kural."

   ÖLÇÜLDÜ (fit-challengelarim @1440 · `.fpx-kural`):
       grid 3 sütun · gap 16 · DÖRT çocuk
       satır 1  Süreli hedef · Egzersiz serisi · Alışkanlık   381×213
       satır 2  Seri ve telafi                                381×207
   Yani dördüncü kart ızgarada zaten TEK BAŞINA alt satırda, üçte bir
   genişlikte duruyordu: yapı da Beyar'ın okuduğunu söylüyor.

   BİLEŞEN UYDURULMADI — DEVREDİLDİ. Kaynağın kendi slider altyapısı
   var ve ölçülü (fit-shell.css:655-686 · "TÜMÜNÜ GÖR SLIDER"):
       .row-track  flex · gap 26 · overflow-x:auto · snap x proximity
                   scrollbar gizli · dolgu 6/2/10 · momentum · smooth
       .row-track>*  flex:none · 274px · snap-align:start
       @≤640       gap 14 · genişlik min(274px, 78vw)
       reduce-motion  smooth kapanır
   Değerler kanon tokenlarına çevrildi, hiçbiri yeniden ölçülmedi.
   🔴 KART GENİŞLİĞİ DEĞİŞİR: bugün 381px (3 sütun ızgara), rayda
      274px — kaynağın kendi ray ölçüsü. Beyar'a bildirildi.
   ⚠ Ray KIRPMAZ: S5'in "taşarsa başı kırpılmaz" kuralıyla aynı aile,
     kaydırma çubuğu gizli ama kaydırma açık.
   ⚠ Ok grubu (`.ray-oklar`) İSTEĞE BAĞLI — kaynakta uçta devre dışı
     görünen iki düğme var; içerik taşmıyorsa grup hiç basılmaz.
   ⚠ RAY ODAKLANABİLİR OLMALI (A1 sordu, LEAD onayladı 2026-09-03).
     Ok grubu basılmadığında kaydırmanın TEK klavye yolu rayın kendisidir:
     `tabindex="0"` + `role="group"` + `aria-label`. Kaynağın
     `.row-track`i bunu yazmıyor çünkü orada klavye erişimini OKLAR
     veriyor; oklar düşünce erişim de düşer. Kuralın kendisi bunu zaten
     varsaymıştı — aşağıdaki `:focus-visible` halkası odaklanamayan bir
     kapta hiç çizilmez. Ölçüldü: `el.focus()` sonrası
     `document.activeElement === ray` ✅ (challengelarim). */
.kart-rayi{
  display:flex; gap:var(--bosluk-26);
  overflow-x:auto; -webkit-overflow-scrolling:touch;
  scroll-snap-type:x proximity; scroll-behavior:smooth;
  overscroll-behavior-x:contain;
  scrollbar-width:none;
  padding:var(--bosluk-6) 2px var(--bosluk-10);
}
.kart-rayi::-webkit-scrollbar{ display:none; }
/* 🔴 `flex:none` DEĞİL — Beyar kararı, 2026-09-03, gözle yakalandı.
   Kaynağın rayı ÇOK kart taşıyor ve her zaman taşıyor; bizimki ÜÇ kart
   taşıyor ve @1440'ta hiç taşmıyor. Ölçüldü (challengelarim):
       flex:none/274   @1440  3×274 · içerik 1176 = kap · SAĞDA 300px BOŞ
                       @390   3×274 · içerik 854 > kap 358 · kayıyor ✅
       flex:1 0 274px  @1440  3×373 · kap dolu · boş 2px  ✅
                       @390   3×274 · içerik 854 · kayıyor  ✅ BİREBİR AYNI
   274 temel ölçü olarak DURUYOR (flex-basis); yalnız taşmanın olmadığı
   yerde büyüme izni var. Dar ekranda ray davranışı zerre değişmiyor —
   ölçüldü, iki kip aynı sayıyı veriyor. Yeni değer üretilmedi. */
.kart-rayi > *{ flex:1 0 274px; scroll-snap-align:start; }
.kart-rayi:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan); outline-offset:4px;
  border-radius:var(--yuvarlak-md);
}
/* Rayın altındaki tam genişlik notu — ray bir TİP listesi, o bir KURAL. */
.kart-rayi + .kart-rayi-notu{ margin-top:var(--bosluk-16); width:100%; }
@media (prefers-reduced-motion:reduce){ .kart-rayi{ scroll-behavior:auto; } }
@media (max-width:640px){
  .kart-rayi{ gap:var(--bosluk-14); scroll-padding-left:2px; }
  .kart-rayi > *{ flex:1 0 min(274px, 78vw); }
}


/* ── S21 · YAN YANA KART · TABAN HİZASI ────────────────────────────────
   A5'in kararı (Beyar, 2026-09-03): "stretch YAZILSIN, ama #bagli
   hariç. 240px boş yüzey kabul edilemez. Nasıl ayrılacağını ÖLÇ."

   ÖLÇÜLDÜ (13 ekran · her sekme tıklanarak) — `.fp-grid` ÜÇ yerde,
   ikisi değil:
       pano                     kap zinciri                 çocuk boyları
       hp-izin (hareket-prof.)  .wrap.kap > .bolum.kap       419 ↔ 469   fark  50
       bagli   (hesabim)        .wrap.kap > section.dikis    229 ↔ 469   fark 240
       veri    (hesabim)        .wrap.kap > .fit-pane        419 ↔ 419   fark   0

   `.fp-grid{align-items:start}` DONÖR SAYFA STİLİNDEN geliyordu; kanon
   `.fp-grid` yazmıyordu, kopya donörden SONRA yüklendiği için eşit
   özgüllükte kanon kazanır.

   AYIRT EDİCİ SEÇİLDİ, UYDURULMADI. Üç aday ölçüldü:
     ① kart sayısı — üçünde de 2. AYIRMAZ.
     ② kap zinciri (`.bolum.kap` ↔ `section.dikis`) — ayırır ama
        TESADÜFEN: bandın türü kartların boyuyla ilgili değil, yarın
        bant değişirse kural sessizce yanlış panoya geçer.
     ③ PANO — `[data-pane="bagli"]`. Kararın kendisi pano adına
        verilmişti; markup o adı zaten taşıyor ve kanonda emsali var
        (`[data-pane="cozum"]`, §1846).
   ③ seçildi: kuralın gerekçesi ile seçicisi aynı şeyi söylüyor.

   SINANDI (kanon basılmadan, tarayıcıya enjekte edilip ölçülerek):
       hp-izin  419↔469  →  469↔469   ✅ tabanlar hizalandı
       bagli    229↔469  →  229↔469   ✅ kısa kart kendi boyunda
       veri     419↔419  →  419↔419   ✅ etkisiz (zaten eşit)
   Yani istisna bugün TEK panoyu tutuyor ve `veri` panosunda kural
   ölçülebilir bir şey değiştirmiyor — sessiz kural değil, etkisiz kip.
   ⚠ `#bagli`nın 240px'lik boş yüzeyi KAPANMADI, yalnız hizalanmadı.
     Kısa karta içerik eklemek ya da ızgarayı bölmek AYRI KARAR
     (Beyar, açık). */
.fp-grid{ align-items:stretch; }
.fit-pane[data-pane="bagli"] .fp-grid{ align-items:start; }


/* ── S22 · IZGARA KABI DA BİR BLOKTUR ──────────────────────────────────
   S9 "yapışma kuralı kart'ta bitmiyor" deyip aileyi genişletmişti; ama
   aile yalnız TEKİL bloklardan kuruluydu. Yan yana kart taşıyan KAP
   (`.fp-grid` · `.pp-gunler` · `.fpx-kural` · `.ol-formcards` · S20'nin
   `.kart-rayi`si) ailenin dışında kaldı: bir kart satırı, üstündeki ve
   altındaki kartla arasında HİÇBİR nefes almıyor.

   Kalem ölçümle değil, UYDURMA MARKUP'la ortaya çıktı (A2 raporu,
   2026-09-03): govde-fit-hareket-profilim.html'de dört elle yazılmış
   `style="margin-top:22px"` vardı. Sökülüp ölçüldü (#hp-izin @1440):
       .fp-card + .fp-card    16px   ✅ S9 tutuyor
       .fp-card + .fp-grid     0px   🔴 ızgara aileye girmiyor
       .fp-grid + .fp-card     0px   🔴
   Yani birileri kanonun deliğini elle 22px yamamış. 22 nereden geliyor:
   donörün `.fp-grid{gap:22px}` değeri — kabın İÇ aralığı, blok
   nefesi değil. Yeni ölçü üretilmedi; S9'un kendi `--bosluk-16`sı.

   ETKİ ÖLÇÜLDÜ (13 ekran · her sekme tıklanarak · 11 komşuluk):
       hareket-profilim #hp-izin   22 → 16   (iki geçiş · inline sökülür)
       hesabim #bagli              34 → 34   (komşusu `.bilgi-notu`, §16
                                              kendi ritmini taşıyor)
       challengelarim `.fpx-kural` 34/16 → değişmez (komşuları `.sec-head`
                                              `.bolum-bas` — aileden değil)
       egzersizlerim · programlarim `.pp-gunler`  14 → değişmez (aynı)
   Tek gerçek değişim hp-izin'de ve orada ELLE YAZILMIŞ değeri kanonun
   ölçüsüyle değiştiriyor.
   ⚠ S3 ①'in muafiyeti DURUYOR: bu kural kabın KENDİSİNİ komşusundan
     ayırır, kabın İÇİNDEKİ kartlara dokunmaz (onlar `gap`ten beslenir).

   ⚠ `.fpx-mt` İLE ÇAKIŞMA — ARANDI, ÖLÇÜLDÜ, ÇAKIŞMA YOK (A2 sordu).
     Kaynağın kendi yardımcı sınıfı `.fpx-mt{margin-top:22px}`
     (fit-planim.css:235) ve şerhi "inline margin-top:22px yerine"
     diyor; özgüllüğü (0,1,0), S9/S22'ninki (0,2,0) — yani kanon onu
     ezer. Beş kullanımın hepsi ölçüldü (13 ekran, sekmeler tıklanarak):
         ilerlemem  .fp-card.fpx-mt        önceki .fp-card   → 16px
         ilerlemem  .fpx-alan-ikili.fpx-mt önceki .fpx-note  →  4px
         ilerlemem  .fp-list.fpx-mt        önceki .fpx-mt    → 22px
         antrenorum .fp-card.fpx-mt        önceki YOK        → 22px
     HİÇBİRİ ızgara kabına komşu değil → S22 hiçbirini ezmiyor.
     Ezilen tek kalem (ilerlemem'in ilk satırı) S22'nin değil S9'un
     işi ve o karar bu turdan ÖNCE verilmiş: kanon aynı boşluğa 16
     diyor, kaynağın 22'si orada zaten ölü.
     `.fpx-mt` bugün yalnız kanonun ULAŞMADIĞI yerde (önceki kardeşi
     olmayan ilk çocuk) yaşıyor — YARI ÖLÜ VARYANT. Emekliye ayrılması
     ya da 16'ya indirilmesi ayrı karar; bu tur DOKUNULMADI, çünkü
     değişim başka ekranlarda görünür bir kaymadır ve ölçüm onu kusur
     olarak göstermiyor.
     🔴 `.fpx-alan-ikili.fpx-mt`in 4px'i AÇIK KALEM: ne 22 ne 16 —
        üçüncü bir kural kazanıyor, kaynağı bulunmadı. */
:is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.bilgi-notu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer,
    .fp-grid,.pp-gunler,.fpx-kural,.ol-formcards,.kart-rayi)
  + :is(.fp-grid,.pp-gunler,.fpx-kural,.ol-formcards,.kart-rayi){
  margin-top:var(--bosluk-16);
}
:is(.fp-grid,.pp-gunler,.fpx-kural,.ol-formcards,.kart-rayi)
  + :is(.kart,.fp-card,.ozet-karti,.uyari-kutu,.kunye,.tablo-kap,.bos-durum,.akordeon,.olcer){
  margin-top:var(--bosluk-16);
}
:is(.fp-grid,.pp-gunler,.fpx-kural,.ol-formcards,.kart-rayi) + .bilgi-notu{
  margin-top:var(--bosluk-34);
}


/* ── S23 · MODAL BAŞLIĞI DA YAPIŞKANDIR (K1) ───────────────────────────
   Agent 3 gördü, lead ölçtü: panel kaydırılınca başlık ve KAPAT (×)
   ekrandan çıkıyor; kullanıcı formu doldururken kapatma düğmesini
   kaybediyor. İki modalda da aynı (`#ftModal` · `#fdModal`).

   ÖLÇÜLDÜ (fit-odemelerim#faturalar @1440, modal açık):
       .fb-panel  static · bg --kagit · padding 0 · scrollH 1259 / clientH 860
       .fb-head   static · bg SAYDAM  · padding 20/24 · border-bottom 1px --cizgi
       .ft-foot   STICKY · bg --kagit · bottom -24px · z-index 2
                          · border-top 1px --cizgi
       kaydırma sınavı: başlığın tepesi 20 → -379 (ekran dışı)
   Yani sözleşme ZATEN yazılmış — ama yalnız AYAK için. Başlık aynı
   panelde, aynı kaydırma kabında, karşılığı yazılmamış: asimetri.

   DEĞER UYDURULMADI, AYAKTAN DEVREDİLDİ: `position:sticky` + kendi
   zemini (`--kagit`, panelin ölçülen zemini) + `z-index:2` (ayağınki).
   ⚠ ZEMİN ŞART: yapışkan ama saydam bir başlığın ALTINDAN içerik geçer.
     Ayak zaten `--kagit` boyuyor; başlık bugün saydam.
   ⚠ `top:0` — ayağın `bottom:-24px`i KOPYALANMADI. O negatif değer
     ayağın kendi 24px alt dolgusunun panel kenarında ikilenmesini
     önlüyor; başlıkta öyle bir ikilenme yok (panel dolgusu 0) ve
     başlık TEK kapatma yüzeyini taşıyor — 20px'ini kaydırmanın kazancı
     yok, bedeli kapatma düğmesinin kırpılması olurdu. */
:is(#ftModal, #fdModal, [role="dialog"]) .fb-head{
  position:sticky; top:0; z-index:2;
  background:var(--kagit);
}


/* ── S24 · KOŞULLU BLOK DA BİR ALANDIR (K2'den devir) ──────────────────
   Beyar: "K2'ye devreden T.C. Kimlik / Telefon 0px kalemi".

   ÖLÇÜLDÜ (#ftModal, K4 çevirisinden SONRA — adlar artık kanonun):
       .alan("T.C. Kimlik No")  →  .alan-izgara.c2("Telefon")   0.0px  🔴
       öteki bütün geçişler                                      22.0px ✅
   Kök KARDEŞLİK: ikisi kardeş DEĞİL (`kardes:false`). "T.C. Kimlik No"
   koşullu kimlik bloğunun (`.ft-blok`) SON çocuğu, ızgara ise formun
   doğrudan çocuğu. §B35 ailesi (`.alan-izgara+.alan`, `.alan+.alan-izgara`)
   yalnız KARDEŞ çiftleri görüyor; araya giren `.ft-blok` aileye üye
   olmadığı için zincir kopuyor. Üstüne kaynağın
   `.fk-field:last-child{margin-bottom:0}` kuralı bloğun son alanının
   payını da siliyor → toplam 0.

   Kural ADA değil ROLE yazılır: koşullu blok da form akışında bir
   ALANDIR. Yeni ölçü üretilmedi — B35'in kendi `--bosluk-22`si.
   ⚠ `.ft-blok` kaynağın adı; kanonda karşılığı yok (haritada 0 kayıt).
     Kanon `.fp-grid`/`.fpx-kural`/`.ozet-bas .fp-act` kalıbıyla aynı:
     ad bir gün çevrilirse kural o ada taşınır. */
.ft-blok + :is(.alan, .alan-izgara),
:is(.alan, .alan-izgara) + .ft-blok{ margin-top:var(--bosluk-22); }


/* ── S25 · KAYAN TABLO KABI ODAK HALKASINI GÖSTERİR (K3) ───────────────
   Agent 3: "#fdModal @390 fatura kalemleri tablosunda tutar sütunları
   görünmüyor". ÖLÇÜLDÜ (@390, modal açık):
       .tablo-kap  overflow-x auto · clientW 302 · scrollW 398 · KAYAR ✅
       markup      tabindex="0" role="region" aria-label="Fatura kalemleri"
   Yani sütunlar ERİŞİLEBİLİR — kap kayıyor ve klavyeyle odaklanabiliyor.
   Kaynağın kendi affordance'ı da tam olarak budur (`odemelerim-v1.html`:
   `.od-scroll{overflow-x:auto}` + `:focus-visible{outline:3px solid}`).
   🔴 KANONDA EKSİK OLAN TEK ŞEY: odak halkası yalnız `.cerceveli`
      kipine yazılmış; kaynağın taban kipinde de var. Odaklanabilir ama
      odaklandığı görünmeyen bir kap, klavye kullanıcısı için kaybolur.
   Yeni değer üretilmedi: `--odak-kalinlik` + `--aksan`, kanonun kendi
   odak sözleşmesi (§`.tablo-kap.cerceveli:focus-visible` ile aynı).
   ⚠ GÖRSEL kaydırma ipucu (kenarda solma/gölge) EKLENMEDİ: kaynakta da
     yok, ölçümde de yok — uydurma olurdu. Beyar isterse ayrı kalem. */
.tablo-kap:focus-visible{
  outline:var(--odak-kalinlik) solid var(--aksan); outline-offset:2px;
}

/* ── S26 · SOHBET PANOSU · TAM EN + WHATSAPP KAYDIRMA KALIBI ───────────
   Beyar kararı, 2026-09-03. `fit-antrenorum#ant-mesaj` tam sohbet
   arayüzünü taşıyor; donör `fit-mesaj.css` ise onu HÂLÂ dar bir sayfa
   sanıyor. Üç kural o varsayımı kanon kabına göre düzeltir.

   ÖLÇÜLDÜ @1440 (pano etkin):
       pano kabı (.wrap içi)   1176px   ← sekme şeridiyle BİREBİR
       .msj-sayfa               860px   🔴 316px açık
       ızgara            260px + 580px
   Kaynak iki yerde kapıyor:
       fit-mesaj.css  .msj-kol {max-width:860px}
       fit-mesaj.css  .msj-sayfa{max-width:860px; grid:260px 1fr}
   🔴 DEĞER UYDURULMADI, KAP SÖZLEŞMESİNE DEVREDİLDİ. Yeni bir genişlik
      yazmıyoruz; kapağı KALDIRIYORUZ ve genişliği `.wrap`ın kendi
      sözleşmesi (max-width:1240 · padding-inline:32 → 1176) belirliyor.
      Bileşenin kabın enini ikinci kez tarif etmesi zaten kusurdu.
   ⚠ KAPSAM: bu dosya YALNIZ kanon ekranlarına yükleniyor; donör
     `mesajlarim-v1.html` `bilesenler.css` almıyor (ölçüldü: 7 stil
     bağlantısının hiçbiri kanon değil). Yani 860'lık dar kip orada
     AYNEN duruyor — o sayfanın kendi kararı bozulmadı.
   ⚠ @900 altı KAYNAKTA ZATEN TEK KOLON (`@media (max-width:900px)
     .msj-sayfa{grid-template-columns:1fr}`) — yeniden yazılmadı,
     yalnız genişlik kapağı orada da kalkıyor. */
.modul-govde .msj-kol,
.modul-govde .msj-sayfa{ max-width:none; }

/* 🔴 S26c · IZGARANIN KENDİSİ EKSİKTİ — ölçüldü 2026-09-04, DadaDiet
   profil hattı. S26 yazıldığında panoyu taşıyan ekran FIT'ti ve FIT
   ekranları kaynağın `fit-mesaj.css`ini DE yüklüyor; ızgara oradan
   geliyordu. Kanon yalnız KAPAĞI kaldırmıştı, ızgarayı hiç bildirmedi.
   Yalnız kanonu yükleyen bir hatta (deneme/diet-profil/) bu fark
   görünür oldu:

       ÖLÇÜLDÜ @1440, `diet-diyetisyenim#mesaj` (scripts/olcum/diet-profil-s26.mjs)
         .msj-sayfa  display:block · grid-template-columns:none
         sol kolon   1176px   sağ kolon 1176px   → ALT ALTA
         yapışkanlık ✅ · akış overflow:auto ✅ · kapak kalkmış ✅
       Yani S26'nın ÜÇ kuralı da tutuyordu; tutmayan şey onların
       varsaydığı İKİ KOLONDU. Yapışkan bir kolon, tek kolonlu
       yerleşimde hiçbir şey yapmaz — sözleşme sessizce boşa çıkıyordu.

   🔴 DEĞER UYDURULMADI. İkisi de S26'nın KENDİ şerhinde zaten yazılı:
       fit-mesaj.css  .msj-sayfa{… grid:260px 1fr}
       ölçüm @1440    "ızgara 260px + 580px"      → aradaki 20px boşluk
   `align-items:start` de S26'nın şerhinden geliyor ve orada gerekçesi
   yazılı: *"iki kolon da kendi boyunu yazdığı için sticky ancak böyle
   çalışır."* Kapsam `.modul-govde` ile sınırlı — panonun DIŞINDAKİ
   `.msj-sayfa` (donörün kendi dar sayfası) etkilenmez.
   ⚠ @900 altı TEK KOLON: kaynağın kendi kırılma noktası, S26 şerhinde
     alıntılanmış (`@media (max-width:900px){.msj-sayfa{grid-template-
     columns:1fr}}`). Aynı eşik burada da kullanılır; yeni bir kırılma
     noktası icat edilmedi. */
.modul-govde .msj-sayfa{
  display:grid; grid-template-columns:1fr; gap:var(--bosluk-20);
  align-items:start;
}
@media (min-width:901px){
  .modul-govde .msj-sayfa{ grid-template-columns:260px 1fr; }
}

/* 🔴 S26d · YAZIŞMA LİSTESİ PANODA DİKEY AKAR — ölçüldü 2026-09-04, gözle.
   §62'nin `.sohbet-kisiler`i YATAY bir raydır (`display:flex` +
   `overflow-x:auto`) ve o kip KENDİ bağlamında doğrudur: kayan panel
   sağdan gelir, geniştir, kişiler tek satırda yan yana sığar.
   S26c'nin açtığı 260px'lik SOL KOLONDA aynı kip kırılıyor:

       ÖLÇÜLDÜ @1440, `diet-diyetisyenim#mesaj`
         .sohbet-kisiler   içerik 3 kişi · kap 260px
         ikinci kişiden sonrası KIRPILIYOR — "Selin Korkmaz" yarım,
         "Mert Aydın" hiç görünmüyor; yatay kaydırma çubuğu da
         `scrollbar-width:none` ile gizli olduğu için kırpılma
         kullanıcıya HİÇBİR iz bırakmıyor.

   Kırpılan bir liste, gizli kaydırma çubuğuyla birlikte, yokluk gibi
   görünür — kullanıcı üçüncü diyetisyeni olduğunu bilemez.
   🔴 §62'NİN KENDİ KURALI DEĞİŞTİRİLMEDİ. Kayan panelin kipi aynen
      duruyor; kural YALNIZ `.modul-govde .msj-sayfa` kapsamında geçerli,
      yani panonun içindeki sol kolonda. Aynı bileşen iki bağlamda iki
      yön alır ve ikisi de kendi ölçümüne dayanır.
   ⚠ Yeni değer üretilmedi: `flex-direction` ve `overflow` dışında
     hiçbir şeye dokunulmuyor; boşluk, dolgu, kenar, yuvarlaklık §62'nin
     kendi değerlerinde kalıyor. `.sohbet-kisi`nin `flex:none`u da
     korunuyor — dikey akışta o "kendi boyunda kal" demektir. */
.modul-govde .msj-sayfa .sohbet-kisiler{
  flex-direction:column; overflow-x:visible;
}

/* Sol kolon YAPIŞKAN · sağ kolon KENDİ İÇİNDE kaydırılır (WhatsApp).
   🔴 SÖZLEŞME S-GİRİŞ-PANO'DAN DEVREDİLDİ, yeni değer üretilmedi:
       height:clamp(624px, calc(100vh - var(--kabuk-h) - 120px), 1036px)
       top:calc(var(--kabuk-h) + var(--bosluk-24))
   Orada da amaç aynıydı: "uzun kayıt formu kaydırılırken görsel yerinde
   durur". Burada uzun olan mesaj akışı, yerinde duran yazışma listesi.
   ⚠ `align-items:start` ızgarada KALIR; iki kolon da kendi boyunu
     yazdığı için sticky ancak böyle çalışır (emsalin kendi şerhi).
   ⚠ Sekme rayı bu ekranda STATİK (ölçüldü: position:static, h=54) —
     yapışkan ray olsaydı `top`a onun boyu da eklenirdi. */
@media (min-width:901px){
  .modul-govde .msj-sayfa > .msj-panel-kart:first-child{
    position:sticky; top:calc(var(--kabuk-h) + var(--bosluk-24));
  }
  .modul-govde .msj-sayfa > .msj-panel-kart:last-child{
    display:flex; flex-direction:column;
    height:clamp(624px, calc(100vh - var(--kabuk-h) - 120px), 1036px);
  }
  /* Akış esner ve TEK kaydırma kabı olur; başlık üstte, yazma altta
     sabit kalır. `min-height:0` şart — flex çocuğu yoksa taşar ve
     kaydırma kabın kendisine değil sayfaya geçerdi. */
  .modul-govde .msj-sayfa .msj-akis{
    flex:1 1 auto; min-height:0; max-height:none; overflow-y:auto;
  }
  .modul-govde .msj-sayfa .msj-kart-bas,
  .modul-govde .msj-sayfa .msj-yaz{ flex:none; }
}

/* ── S26b · TAM ARAYÜZÜN OLDUĞU PANODA FAB BASTIRILIR ─────────────────
   Kaynağın kendi kuralı (fit-mesaj.js:526) — şerhi "zaten oradayız":
       if (b.getAttribute('data-fit-page') === 'mesajlarim-v1') return;
   Gerekçesi aynen geçerli: tam yazışma arayüzü ekranda dururken yüzen
   düğme İKİNCİ bir giriş sunar. Fark, kanonda yüzeyin sayfa değil PANO
   olması — kural bu yüzden gövdeye değil PANONUN ETKİN olmasına bakar.
   Diğer panolarda (ant-hizmet · ant-seans …) FAB DURUR.
   ⚠ JS ile gizlemek yerine CSS: FAB'ın durumuna ikinci bir sürücü
     dokunursa ülke seçicisindeki çift-anahtar tuzağı geri gelir.
     `:has()` kanonda zaten kullanılan bir kip (25 geçiş). */
body:has(#antAlt-pane-ant-mesaj:not([hidden])) #msjFab,
body:has(#antAlt-pane-ant-mesaj:not([hidden])) .msj-ortu{ display:none; }


/* ═══════════════════════════════════════════════════════════════════════
   75 · YÖNETİM PANELİ — ORTAK ÇEKİRDEK
   ═══════════════════════════════════════════════════════════════════════
   Kaynak: `dump/fit-prototip/admin-*.html` · 56 ekran (37 ORTAK + 19 markaya özel)
   Sözleşme: `Revenge - Docs/Dada_Ortak_Yonetim_Paneli_Sistem_Dokumani.pdf` (D2)
             `Revenge - Docs/DADA PROJELERİ — NİHAİ ORTAK YÖNETİM PANELİ.pdf` (D1)
   Envanter: `docs/admin-envanter.md` (bileşen düzeyi) ·
             `docs/olcum-admin-ortak.md` (modül/ekran/sekme düzeyi)

   ── NEDEN VAR ────────────────────────────────────────────────────────
   D2 s.2: *"ortak bileşenler TEK ALTYAPIDA geliştirilmeli; proje, rol ve
   yetkiye göre görünürlük değişmelidir."* Dört markanın admin paneli
   BİREBİR AYNI olacak: aynı markup, aynı bileşen, aynı ölçü. Marka
   dosyası değişince yalnız RENK döner.

   🔴 ADMIN AYRI BİR RENK SİSTEMİ KULLANMAZ — Beyar kararı 1
      (`docs/admin-envanter.md §9`). Kaynağın `--acc` ailesi (#009d4f
      yeşil) kanona GİRMEZ; her aksan `--aksan*` yuvasından, yani
      `--marka`dan türer. FIT'te mavi, Gastro'da #DC3D17, Gourmet'te mor —
      tek satır değişmeden.
      ⚠ `#009d4f` bir eşleşme değil ARŞİV KAYDIDIR (`markalar/fit.css`:
        *"v2 DadaFit · ARTIK MARKA DEĞİL"*). Otomatik renk eşleyici onu
        `--kurumsal-yesil`e bağlayıp "kanonda zaten var" diyordu; yanlış
        okuma. **Ders: değer eşleşmesi anlam eşleşmesi değildir.**

   🔴 `.adm-src` KAYNAK ŞERİDİ BURAYA GİRMEDİ — Beyar kararı 3.
      Yayılımı 37/37 (istisnasız her ekran) olmasına rağmen kanona
      alınmadı: o şerit prototipin kendi künyesidir ("örnek veri" uyarısı),
      ürünün bileşeni değil. Envanterin en yüksek yayılımlı kalemlerinden
      biri bu gerekçeyle DÜŞTÜ. Donörden ekran çevirirken TAŞINMAZ.

   ── ÖLÇÜM KİPİ ───────────────────────────────────────────────────────
   Playwright · Chromium · 1440×1000 · **HTTP üstünden** (`file://` kaynağın
   üç CSS dosyasını gizliyor ve "kural yok" dedirtiyor) ·
   `*{transition:none!important;animation:none!important}` enjekte edilmiş
   (donörün `.btn`i `transition:.2s` taşıyor; iki rAF sonra okununca
   `fontWeight:507.5` · `fontSize:14.9238px` gibi ARA KARELER veriyor).
   Gizli kalemler `hidden` SÖKÜLMEDEN, tetikleyicisine tıklanarak açıldı.
   Üretim: `scripts/olcum/lead-adm-kanon-olc.mjs` · `lead-adm-bul.mjs` ·
           `lead-adm-acilir.mjs`

   🔴 "GÖRÜNÜR ÖRNEK YOK" = "AÇILMADI", "KANONDA KARŞILIĞI YOK" DEĞİL.
      İlk taramada 12 kalem "görünmez" çıktı. 56 ekran × her sekme
      tıklanarak arandığında **11'i başka ekranda görünür** oldu
      (`.st-card` → antrenor-form sekme 2 · `.ms-box` → anatomi-form
      "Bağlar" sekmesi · `.iu-drop` → antrenor-form · `.fpx-bos` → 18/56 …).
      Yalnız `.ms-menu` bir daha tıklama istedi. Envanter §0'ın 2. tuzağı
      bu turda da doğrulandı.

   ── K8 · ÜÇÜ MEVCUT KANONLA BASILDI, YENİ AD AÇILMADI ────────────────
       KPI şeridi        → `.kart` + `.kart-izgara.c4`   (kararı 4)
       içerik sekme rayı → `.sekmeler`                   (kutu BİREBİR)
       görsel yükleyici  → `.birak-alani`
       sayfa başı eylem  → `.eylem-satiri`  (flex · gap 10 · wrap — birebir)
   ═══════════════════════════════════════════════════════════════════════ */


/* ───────────────────────────────────────────────────────────────────────
   75a · KABUK · SOL MARKA RAYI VE MODÜL MENÜSÜ
   ---------------------------------------------------------------------
   Kaynak `.sa-rail` (ekosistem rayı) + `.sa-menu` (modül menüsü).
   İKİ AYRI KOLON, tek kabuk: ray markalar arası geçiş, menü modül seçimi.
   Ölçüldü: ray 76px · menü 264px · toplam 340px = `.adm-main`ın sol payı.
   ─────────────────────────────────────────────────────────────────────── */

.panel-ray{
  position:fixed; inset:0 auto 0 0; width:76px; z-index:var(--kat-ray);
  display:flex; flex-direction:column; align-items:center;
  gap:var(--bosluk-7); padding:var(--bosluk-18) 0;
  background:var(--panel-ray-zemin);
  border-right:var(--cizgi-1) solid var(--panel-ray-cizgi);
}
/* Ray kalemi — ekosistemin ÖTEKİ markası. Rengini `--eko-*` yuvasından
   satır içi `--eko` değişkeniyle alır; kanon rengi YAZMAZ, yalnız kutuyu.
   ⚠ 44px dokunma hedefi kutunun KENDİSİNDEN gelir (§43'ün `::before`
     örtüsü burada gerekmiyor — kalem zaten 44). */
.panel-ray-ikon{
  width:44px; height:44px; flex:none;
  display:grid; place-items:center;
  border-radius:var(--yuvarlak-md);
  background:var(--koyu-yikama); color:var(--eko, var(--kagit));
  font-size:var(--yazi-17); text-decoration:none;
  transition:var(--sure) var(--yumusama);
}
.panel-ray-ikon:hover{ background:var(--koyu-yikama-2); }
.panel-ray-ikon.aktif{ background:var(--eko, var(--aksan)); color:var(--kagit); }
/* Kilitli marka — erişimi olmayan proje. Rengini KAYBEDER, kutuyu korur. */
.panel-ray-ikon.kilitli{ color:var(--eko-kilitli); pointer-events:none; }
.panel-ray-ayrac{ width:28px; height:var(--cizgi-1); background:var(--koyu-cizgi); flex:none; }
.panel-ray-alt{ margin-top:auto; }

.panel-menu{
  position:fixed; inset:0 auto 0 76px; width:264px; z-index:var(--kat-ray);
  display:flex; flex-direction:column; overflow:hidden;
  background:var(--koyu-zemin);
  border-right:var(--cizgi-1) solid var(--panel-menu-cizgi);
}
.panel-menu-bas{
  display:flex; flex-direction:column; justify-content:center; gap:var(--bosluk-4);
  height:64px; flex:none; padding:0 var(--bosluk-20);
  border-bottom:var(--cizgi-1) solid var(--koyu-cizgi);
}
.panel-menu-bas b{
  font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  color:var(--koyu-metin-ust);
}
.panel-menu-bas span{
  font-size:var(--yazi-11); font-weight:var(--agirlik-govde);
  color:var(--koyu-metin-42);
}
/* Menünün kaydıran gövdesi — üç kategori burada yaşar. */
.panel-menu-govde{ flex:1; min-height:0; overflow-y:auto; padding:0 var(--bosluk-12) var(--bosluk-12); }
/* Kategori başlığı — D2'nin ÜÇ ana kategorisi (01 GENEL · 02 OPERASYON ·
   03 YAPILANDIRMA) ve Beyar'ın eklediği dördüncüsü (MARKA MODÜLLERİ).
   🔴 "ANA İÇERİK" DİYE BİR KATEGORİ YOK — kaynağın `fit-admin.js` MENU'sü
      onu icat etmiş, doküman tanımıyor. EKSİ İKİNCİ MADDE: doküman kazanır
      (`docs/admin-envanter.md §6.5`). */
.panel-menu-bolum{
  padding:var(--bosluk-16) var(--bosluk-12) var(--bosluk-7);
  font-size:var(--yazi-10-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-etiket); text-transform:uppercase;
  color:var(--koyu-metin-42);
}
.panel-menu-link{
  display:flex; align-items:center; gap:var(--bosluk-12);
  min-height:44px; padding:var(--bosluk-11) var(--bosluk-12);
  border-radius:var(--yuvarlak-md);
  font-size:var(--yazi-14); font-weight:var(--agirlik-govde);
  color:var(--koyu-metin-78); text-decoration:none;
  transition:var(--sure) var(--yumusama);
}
.panel-menu-link>i{ width:18px; flex:none; text-align:center; font-size:var(--yazi-14); }
.panel-menu-link:hover{ background:var(--koyu-yikama); }
.panel-menu-link.aktif{
  background:var(--aksan-koyu); color:var(--kagit);
  font-weight:var(--agirlik-kalin);
}
.panel-menu-link:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:calc(var(--odak-ofset) * -1);
}
/* Sayaç rozeti — bekleyen iş sayısı (destek kuyruğu · onay bekleyen).
   Menü kalemi içinde sağa yaslanır; kendi kutusu yoktur, mirası bozmaz. */
.panel-menu-link .sayac{
  margin-left:auto; flex:none;
  min-width:20px; padding:0 var(--bosluk-6);
  border-radius:var(--yuvarlak-hap);
  background:var(--aksan-koyu); color:var(--kagit);   /* metin zemini — §8 */
  font-size:var(--yazi-11); font-weight:var(--agirlik-kalin);
  line-height:20px; text-align:center;
}
.panel-menu-link.aktif .sayac{ background:var(--kagit); color:var(--aksan-koyu); }
.panel-menu-alt{
  flex:none; display:flex; flex-direction:column; gap:3px;
  padding:var(--bosluk-14);
  border-top:var(--cizgi-1) solid var(--koyu-cizgi-2);
}


/* ───────────────────────────────────────────────────────────────────────
   75b · KABUK · ÜST ÇUBUK
   ---------------------------------------------------------------------
   Kaynak `.pnl-top`. Ray+menünün SAĞINDA başlar, sayfayla birlikte kayar
   ama kendisi sabittir. Ölçüldü: 64px · dolgu 0/28 · gap 16 · alt kenar.
   ─────────────────────────────────────────────────────────────────────── */

.panel-ust{
  position:fixed; top:0; right:0; left:340px; height:64px; z-index:var(--kat-ust-bant);
  display:flex; align-items:center; gap:var(--bosluk-16);
  padding:0 var(--bosluk-28);
  background:var(--kagit);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
/* ── MENÜ AÇMA DÜĞMESİ — DAR EKRANIN TEK KAPISI ──────────────────────
   🔴 ≤1100px'TE MODÜL MENÜSÜ ULAŞILAMAZDI. §75i menüyü çekmeceye çeviriyor
   ve `body.panel-acik` sınıfını bekliyor, ama o sınıfı ekleyecek DÜĞME
   kanonda hiç yoktu. Ölçüldü:
       @1440   menü  76..340   görünür
       @1024   menü -264..0    gizli · açacak düğme YOK
       @390    menü -264..0    gizli · açacak düğme YOK
   Yani tablet ve telefonda 42 modülün hiçbirine gidilemiyordu.
   `adm-op-b` bildirdi ve kendi başına EKLEMEDİ — doğru davranış: kanonda
   görünürlük kipi olmadığı için düğme 1440'ta da görünür kalırdı.

   ⚠ §64 `.cekmece` BURAYA GİRMEZ: o public sitenin SAĞDAN açılan mobil
     menüsü; bu panelin SOLDAN açılan modül menüsü ve kendi kabuğu var.
   ⚠ Düğme geniş ekranda BASILMAZ — `display:none` tabanda, dar ekran
     dalında açılıyor. Menü zaten oradayken bir "menüyü aç" düğmesi
     yalancı bir denetimdir. */
/* ⚠ ÖZGÜLLÜK: düğme `.panel-ust-dugme` kutusunu da taşıyor ve o
   `display:flex` yazıyor (0,1,0). Eşit özgüllükte SIRA belirler ve
   `.panel-ac` kaybediyordu — ölçüldü: @1440 `display:flex`, yani düğme
   menü zaten oradayken de basılıyordu. Kap adıyla (0,2,0) yazılıyor. */
.panel-ust > .panel-ac{ display:none; }

/* ── PANEL ARAMA ALANI — ÜST ÇUBUK VE SÜZGEÇ ŞERİDİ ───────────────────
   🔴 §22 `.arama-kutu` BURAYA GİRMEZ — ilk yazımda girmişti ve ekran
      görüntüsünde yakalandı: kutu ikonun ALTINA düşüp 680px'lik gölgeli
      bir hero kutusu çizdi. §22 ARAMA SAYFASININ hero kutusudur
      (`max-width:680px` · `--golge-lg` · dolgu 10 · aksan kenarı); bu
      ise üst çubuğa gömülü 420×44'lük bir alan. Ad benziyor, kutu ters.
      §10 md.7'nin ("kanon adı ile kaynak adı karışır") bir örneği daha —
      bu kez karışan iki KANON adı değil, bir kanon adının iki bağlamı.

   Ölçüldü (`.pnl-search` · admin-uyeler-v1 @1440):
       kap    420×44 · position:relative
       girdi  420×44 · dolgu 0 14 0 38 · kenar 1px --cizgi · yuvarlak 12
              zemin --zemin · 13.5/500 · renk --murekkep
       ikon   absolute · sol 14 · --metin-ikincil · 13.5px
   Sol dolgunun 38'i ikonun yeri; ikon kabın içinde konumlu. */
/* 🔴 AD BAĞLAMDAN ARINDIRILDI — 2026-09-04, ikinci düzeltme.
   İlk yazımda bu kalem `.panel-ust-arama` / `.panel-ust-girdi` adını
   taşıyordu, yani ADI ÜST ÇUBUĞA BAĞLIYDI. Ama aynı alan SÜZGEÇ
   ŞERİDİNDE de yaşıyor (§75e, her liste ekranı) ve orada "üst çubuk"
   diye bir şey yok. Ad tutmayınca agent'lar §22 `.arama-kutu`ya
   uzandı — ölçüldü, 14 ekranda 320×**86**'lık gölgeli hero kutusu
   çizdi (§22 arama SAYFASININ kutusu: dolgu 10 · yuvarlak 16 ·
   `--golge-lg`). Kusur agent'ın değil ADINDI: kanon o bağlama bir ad
   vermemişti, brifingin bileşen tablosu da `.arama-kutu` gösteriyordu.
   Ders — §10 md.7'nin ("kanon adı ile kaynak adı karışır") üçüncü yüzü:
   **bağlama bağlı ad, ikinci bağlam doğduğunda yanlış yere gönderir.**
   Genişlik farkı KİPTE: üst çubukta 420, süzgeç şeridinde 320. */
.panel-arama{ position:relative; width:100%; max-width:420px; }
.suzgec-cubuk .panel-arama{ max-width:320px; flex:1 1 220px; }
.panel-arama > i{
  position:absolute; left:var(--bosluk-14); top:50%; transform:translateY(-50%);
  color:var(--metin-ikincil); font-size:var(--yazi-13-5); pointer-events:none;
}
.panel-arama-girdi{
  width:100%; height:44px;
  padding:0 var(--bosluk-14) 0 var(--bosluk-38);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--zemin); color:var(--murekkep);
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
}
.panel-arama-girdi::placeholder{ color:var(--yer-tutucu); }
.panel-arama-girdi:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}
/* Arama odaktayken ikon da aksana döner — odağın nerede olduğu tek
   bakışta görünsün. */
.panel-arama:focus-within > i{ color:var(--aksan-koyu); }
.panel-ust-sag{ margin-left:auto; display:flex; align-items:center; gap:var(--bosluk-12); }
/* Zil · yardım · ayar — ikon düğmesi kipinde, KENDİ kutusuyla (§75d'nin
   çerçevesiz `.ikon-dugme`si DEĞİL: bunlar kabuk kalemleridir ve
   çerçeveleri var). Ölçüldü: 44×44 · kenar 1px · yuvarlak 12. */
.panel-ust-dugme{
  position:relative; width:44px; height:44px; flex:none;
  display:flex; align-items:center; justify-content:center;
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--kagit); color:var(--murekkep);
  font-size:var(--yazi-15); text-decoration:none; cursor:pointer;
  transition:var(--sure) var(--yumusama);
}
.panel-ust-dugme:hover{ border-color:var(--aksan); color:var(--aksan-koyu); }
.panel-ust-dugme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}
/* Okunmamış beneği — §59'un `--aksan-halka-2`siyle aynı aile. */
.panel-ust-dugme .benek{
  position:absolute; top:9px; right:9px;
  width:8px; height:8px; border-radius:var(--yuvarlak-daire);
  background:var(--aksan); box-shadow:0 0 0 2px var(--kagit);
}
/* Hesap düğmesi — avatar + ad. Ölçüldü: minH 44 · dolgu 6/8/6/6 · gap 11. */
.panel-ust-ben{
  display:flex; align-items:center; gap:var(--bosluk-11);
  min-height:44px; padding:var(--bosluk-6) var(--bosluk-8) var(--bosluk-6) var(--bosluk-6);
  border:0; border-radius:var(--yuvarlak-md);
  background:none; color:var(--murekkep); cursor:pointer;
  font-family:inherit; transition:var(--sure) var(--yumusama);
}
.panel-ust-ben:hover{ background:var(--zemin); }
.panel-ust-ben .ad{
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin); line-height:1.3;
}
.panel-ust-ben .rol{
  display:block; font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil);
}

/* ── AÇILIR YÜZEY — DÖRT KAYNAK ADI, TEK BİLEŞEN ──────────────────────
   Kaynakta dört ayrı ad, dört ayrı yerde, aynı kutu. ÖLÇÜLDÜ:

     ad             kutu       dolgu  yuvarlak  gölge                       maxH
     `.ff-pop`      252×340    9px    12px      0 18px 50px rgba(33,30,22,.16)  420
     `.t-ara-pop`   420×420    6px    12px      aynı                            420
     `.ms-menu`     614×248    6px    12px      aynı                            248
     `.iu-*` menüsü  —          —      —         —                               —

   Gölge ÜÇÜNDE DE BİREBİR ve kanonda zaten var: `--golge-lg`
   (`0 18px 50px rgba(33,30,22,.16)` · tokenlar.css:749). Yuvarlaklık üçünde
   de 12. Dolgu 6/6/9 → **taban 6**, süzgeç kipi 9 (çoğunluk kuralı,
   `bilesenler.css §0`: aynı kutu N adla yazılmışsa tek bileşendir).

   🔴 z-index kaynağın 120'si DEĞİL — bkz. `tokenlar.css --kat-menu` şerhi.
   ⚠ `position:absolute` — kabı `position:relative` OLMAK ZORUNDA, yoksa
     açılır en yakın konumlu ataya kaçar (§53'ün `.birak-alani` tuzağı). */
/* ── AÇILIR KABI — 2026-09-04 · ÜÇ AGENT BAĞIMSIZ OLARAK İSTEDİ ──────
   `.acilir-yuzey` `position:absolute`; kabı KONUMLU olmak zorunda, yoksa
   yüzey en yakın konumlu ataya kaçar (§53'ün `.birak-alani` tuzağı).
   Kanonda o kabın ADI YOKTU ve üç agent üçü de aynı şeyi yaptı:
   `.coklu-secim`i (kanonun tek `position:relative` sarmalayıcısı) kap
   olarak ödünç aldı — yani ad bulunamayınca en yakın ada uzanıldı.
   Kabuğun kendisi de aynı boşluğa düştü ve `style="position:relative"`
   yazdı; kapı ölçümü onu 20 ekranda birden "satır içi style" diye
   bildirdi ve üç agent ayrı ayrı kaynağının BENİM dosyam olduğunu yazdı.
   ⚠ Üç bağımsız tüketicinin aynı adı istemesi kanon basıncıdır; tek
     bildirimlik bir ad açmak, üç ayrı geçici çözümden ucuz. */
.acilir-kap{ position:relative; }

.acilir-yuzey{
  position:absolute; z-index:var(--kat-menu);
  top:calc(100% + var(--bosluk-6)); left:0;
  min-width:100%; max-height:420px; overflow-y:auto;
  padding:var(--bosluk-6);
  background:var(--kagit);
  border:var(--cizgi-1) solid var(--cizgi);
  border-radius:var(--yuvarlak-md);
  box-shadow:var(--golge-lg);
}
.acilir-yuzey[hidden]{ display:none; }
.acilir-yuzey.saga{ left:auto; right:0; }
.acilir-yuzey.suzgec{ padding:var(--bosluk-9); }
/* Açılırın başlık satırı — ad solda, "Temizle" sağda.
   Ölçüldü (`.ff-pop` içi): temizle düğmesi 12px/700 · aksan koyu. */
.acilir-bas{
  display:flex; align-items:center; justify-content:space-between;
  gap:var(--bosluk-10); padding:var(--bosluk-6) var(--bosluk-8) var(--bosluk-9);
  font-size:var(--yazi-11); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;
  color:var(--metin-ikincil);
}
.acilir-bas button{
  border:0; background:none; cursor:pointer; font-family:inherit;
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu);
  /* Dokunma hedefi kalemin boyunu bozmadan 44px'e tamamlanır — §43'ün
     kendi yöntemi. Kaynak da aynısını yapıyor (ölçüldü: negatif pay). */
  padding:var(--bosluk-14) var(--bosluk-8); margin:calc(var(--bosluk-14) * -1) calc(var(--bosluk-8) * -1);
}
/* Açılır kalemi — seçilebilir satır. `.ms-opt` · `.t-ara-sat` aynı kutu:
   ölçüldü ikisi de minH 44 · yuvarlak 8; dolgu 9/11 ↔ 8/11 (gap 10 ↔ 11). */
.acilir-kalem{
  display:flex; align-items:center; gap:var(--bosluk-11); width:100%;
  min-height:44px; padding:var(--bosluk-8) var(--bosluk-11);
  border:0; border-radius:var(--yuvarlak-sm); background:none;
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak); text-align:left; text-decoration:none;
  cursor:pointer; transition:var(--sure) var(--yumusama);
}
.acilir-kalem:hover{ background:var(--zemin); color:var(--murekkep); }
.acilir-kalem.aktif{ background:var(--aksan-yikama); color:var(--aksan-koyu); font-weight:var(--agirlik-kalin); }
.acilir-kalem:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:calc(var(--odak-ofset) * -1);
}
.acilir-kalem .yan{ margin-left:auto; flex:none; font-size:var(--yazi-11-5); color:var(--metin-ikincil); }
/* Açılır içi arama — kendi kenarı yok, kabın dolgusunda yaşar. */
.acilir-arama{
  width:100%; padding:var(--bosluk-6) 2px;
  border:0; border-radius:var(--yuvarlak-sm); background:none;
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  color:var(--murekkep);
}
.acilir-arama:focus{ outline:0; }


/* ───────────────────────────────────────────────────────────────────────
   75c · SAYFA KABI VE SAYFA BAŞI
   ---------------------------------------------------------------------
   Ölçüldü: `.adm-main{margin-left:340px}` · `.adm-page{padding:92 28 48}`.
   92 = üst çubuk (64) + 28 nefes. Sabit çubuğun altına içerik kaçmasın.
   ─────────────────────────────────────────────────────────────────────── */

.panel-govde{ margin-left:340px; min-height:100vh; }
.panel-sayfa{ padding:92px var(--bosluk-28) var(--bosluk-48); }

/* Sayfa başı — §18 `.bolum-bas` DEĞİL. Ölçüm ayırdı (5/21 fark):
   §18 `display:grid` · gap 24 · alt pay 34; bu `flex · space-between ·
   align flex-end · gap 18 · alt pay 24` ve SAĞINDA eylem satırı taşıyor.
   §11'in "ölçüm iki kalemin ayrı olduğunu söylüyorsa birleştirme" kuralı. */
.panel-bas{
  display:flex; flex-wrap:wrap; align-items:flex-end; justify-content:space-between;
  gap:var(--bosluk-18); margin-bottom:var(--bosluk-24);
}
.panel-bas h1{
  font-size:var(--yazi-24); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-baslik); line-height:1.12;
  color:var(--murekkep);
}
.panel-bas p{
  margin-top:var(--bosluk-5); max-width:66ch;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  line-height:var(--satir-orta); color:var(--metin-ikincil);
  text-align:left; text-align-last:auto;      /* yaslama istisnası — B33 */
}
/* ⚠ Eylem kutusu için YENİ AD AÇILMADI — `.eylem-satiri` (§A1) birebir
   aynı kutuyu çiziyor: flex · gap 10 · wrap. Ölçüldü, 0 fark. K8. */

/* 🔴 SARAN EYLEM SATIRI SAĞ YASLAMASINI KAYBEDİYORDU — 2026-09-04,
   GÖZLE BULUNDU, SONRA ÖLÇÜLDÜ.
   `.panel-bas` `space-between` + `wrap` taşıyor. Başlık ile eylem satırı
   birlikte kaba sığdığı sürece eylemler sağda duruyor; sığmayınca eylem
   satırı ALT SATIRA iniyor ve orada TEK ÖĞE oluyor — `space-between` tek
   öğeyi satırın BAŞINA koyar. Yani düğme grubu sessizce sola kaçıyor.

   ÖLÇÜLDÜ (@1440 · `.panel-bas` sağ kenarına uzaklık):
       admin-uyeler          eylem satırı sağa yaslı   fark   0   ✅
       admin-duyurular       sağa yaslı                fark   0   ✅
       admin-raporlar        SOLA kaçmış               fark 435   🔴
       admin-gorevler        SOLA kaçmış               fark 444   🔴
       admin-sistem-durumu   SOLA kaçmış               fark 455   🔴
       admin-entegrasyonlar  SOLA kaçmış               fark 551   🔴
   Ayrım ekranın kararı değil, düğme metinlerinin UZUNLUĞU — yani aynı
   sözleşme aynı ekranda içerik değişince bozuluyor. S1 ③'ün ("grup sağa,
   tek tek değil") sayfa başındaki karşılığı.

   `margin-left:auto` sarma durumunda da çalışır: satırda tek öğeyse
   boşluğu solunda toplar. `space-between` tabanda KALIR — başlık ve
   eylemler aynı satırdayken doğru olan odur. */
.panel-bas > .eylem-satiri{ margin-left:auto; }

/* ── GERİ BAĞLANTISI — AÇIK ZEMİNLİ KIRINTI ───────────────────────────
   🔴 §17 `.kirinti` BURAYA GİRMEZ. Kanonun kırıntısı KOYU ZEMİN
   bileşenidir (§17'nin kendi şerhi: *"banner içinde yaşar"*, renk
   `--koyu-metin`). Admin'in geri bağlantısı AÇIK zeminde durur ve
   ölçümde 9/21 ayrışıyor. Kanonda açık zeminli kırıntı YOKTU. */
.geri-bag{
  display:inline-flex; align-items:center; gap:var(--bosluk-8);
  min-height:44px; margin-bottom:var(--bosluk-6);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil); text-decoration:none;
  transition:var(--sure) var(--yumusama);
}
.geri-bag:hover{ color:var(--aksan-koyu); }
.geri-bag:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}


/* ───────────────────────────────────────────────────────────────────────
   75d · KPI ŞERİDİ — K8 ①, YENİ BİLEŞEN YOK
   ---------------------------------------------------------------------
   Kap `.kart-izgara.c4`, kalem `.kart`. Ölçüldü, kenar/yuvarlaklık/zemin/
   gölge DÖRDÜ DE BİREBİR tutuyor (0 fark). Geriye tek kalem kaldı:
   dolgu donör 20 ↔ kanon `.kart-govde` 22. Kart varyantı olarak yazılıyor.

   ⚠ §63 `.ozet-karti` BU İŞ İÇİN KULLANILAMAZ: o KOYU bir kart
     (`linear-gradient(--koyu-zemin-yesil, --koyu-zemin)` · metin `--kagit`),
     admin KPI'ı BEYAZ. Ad benziyor, zemin ters.
   ─────────────────────────────────────────────────────────────────────── */

.kart.kpi{ display:flex; align-items:flex-start; gap:var(--bosluk-14); padding:var(--bosluk-20); }
.kart.kpi .ikon{
  width:44px; height:44px; flex:none; margin-top:var(--bosluk-4);
  display:grid; place-items:center;
  border-radius:var(--yuvarlak-md);
  /* 🔴 YARI SAYDAM ZEMİN, KONTRASTI BİLEŞENDEN ALIP ALTINDAKİNE VERİR.
     `--aksan-halka` `color-mix(… 12%, transparent)`; aynı seçici altına
     ne gelirse ona göre oran değiştiriyordu — ölçüldü @1440, `--aksan-koyu`
     metniyle: beyaz başlıkta 4.61 · sayfa zemininde 4.39 · %8 marka
     yıkamalı satırda 4.28. Üçü de AYNI bileşen. Ve en kötüsü iki yarı
     saydam katmanın üst üste binmesiydi: ikisi de tek başına doğru
     olduğu için kimse ölçmemişti.
     `--aksan-yikama` zaten OPAK (`… 9.3%, #fff`) ve şerhi zaten
     "ikon çipi zemini" diyor — avatar ile KPI ikonu tam olarak o.
     Opak zeminle oran artık bağlamdan bağımsız SABİT:
       fit 4.81 · gastro 4.88 · diet 4.83 · gourmet 8.65      ✅
     ⚠ Odak halkası (`§62 .kod-hane:focus` box-shadow) `--aksan-halka`da
     KALIR: halka altındakinin üstüne biner, saydamlığı gereğidir. */
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  font-size:var(--yazi-17);
}
.kart.kpi .govde{ min-width:0; }
.kart.kpi .etiket{
  display:block;
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;
  color:var(--metin-ikincil);
}
.kart.kpi .sayi{
  display:block; margin-top:var(--bosluk-6);
  font-size:var(--yazi-24); font-weight:var(--agirlik-ekstra);
  letter-spacing:var(--aralik-baslik); font-variant-numeric:tabular-nums;
  color:var(--murekkep);
}
/* Değişim satırı — yön ikonu + oran.
   🔴 YEŞİL UYDURULMADI. `tokenlar.css §3` kendi şerhinde yazıyor:
      *"BAŞARI RENGİ YOK. Kaynakta ayrı bir 'başarı' tokeni bulunamadı;
      olumlu durumlar marka yeşilini kullanıyor … kanon da uydurmuyor."*
      v2'de marka YEŞİLDİ ve olumlu durum onunla çiziliyordu; v3'te FIT
      maviye döndü, yani "olumlu = marka" bağı kaynakta zaten koptu.
      Beyar kararı 1 admin için bunu netleştiriyor: *"admin ayrı renk
      sistemi kullanmaz, marka rengiyle döner."* → olumlu yön AKSANDAN.

   ⚠ AÇIK KALEM · BEYAR'A: DadaGastro'nun markası #DC3D17, `--tehlike`
     ise #b3261e — ikisi aynı ton ailesinde. Gastro panelinde "iyi" ile
     "kötü" YAN YANA neredeyse aynı renge düşer. FIT'te (mavi) sorun yok.
     Kanon burada Beyar'ın verdiği kararı uyguluyor; ayrı bir nötr başarı
     yuvası açmak İKİNCİ bir karardır ve sorulmadan alınmadı.
     Kayıt: `docs/admin-kanon-kararlari.md` K-R1.

   ⚠ "Artış her zaman iyi" DEĞİLDİR — iptal oranının artışı kötüdür.
     Bu yüzden sınıf ANLAMLA verilir (`.iyi`/`.kotu`), yönle değil.
   ⚠ RENK TEK BAŞINA TAŞIMAZ (WCAG 1.4.1): yön OKUN kendisinden okunur,
     renk yalnız pekiştirir. Renksiz bir ekranda da anlam durur. */
.kpi-degisim{
  display:inline-flex; align-items:flex-start; gap:var(--bosluk-5);
  margin-top:var(--bosluk-6);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil);
}
.kpi-degisim.iyi{ color:var(--aksan-koyu); }
.kpi-degisim.kotu{ color:var(--tehlike); }


/* ───────────────────────────────────────────────────────────────────────
   75e · LİSTE EKRANI SÖZLEŞMESİ — D2 s.17
   ---------------------------------------------------------------------
   > *"Liste ekranları: arama; filtre; sıralama; sayfalama; kolon seçimi;
   >   toplu işlem; yetkili dışa aktarım."*

   ÖLÇÜLDÜ (`docs/admin-envanter.md §5.1` · 15 gerçek liste ekranı):

       kalem                 kaynakta   kanon ne yapıyor
       ------------------    --------   ---------------------------------
       arama                 15/15 ✅   §22 `.arama-kutu` · §75e şerit
       filtre                15/15 ✅   `.suzgec-cubuk` + `.acilir-yuzey`
       sayfalama             15/15 ✅   §8 `.sayfalama.kart-ayagi`
       sıralama               0/15 🔴   `.tablo th.sirali`      ← KANONDAN
       kolon seçimi           0/15 🔴   `.acilir-yuzey` + `.kolon-secim` ← KANONDAN
       toplu işlem            0/15 🔴   `.toplu-islem` + `.tablo .sec`  ← KANONDAN
       yetkili dışa aktarım   1/15 🔴   sözleşme (aşağıda) ← KANONDAN

   🔴 SIRALAMA İKİ AYRI SINAMAYLA ÖLÇÜLDÜ, İKİSİ DE SIFIR. İşaret araması
      (`th[data-sort]` · `aria-sort` · `.sortable` · `th button` ·
      `cursor:pointer`) 0/21 verdi; işaret aramak yetmezdi, çünkü sıralama
      sınıfsız da yazılabilirdi. Bu yüzden DAVRANIŞ sınandı: `th`ye
      tıklanıp ilk kolonun satır sırası yeniden okundu — **21 ekranın
      hiçbirinde sıra değişmedi.** Prototipte tablo sıralaması YOK.

   🔴 DÖRDÜ DE KANONA GELDİ. `docs/admin-envanter.md §9 karar 2` bunları
      *"ADAY'da kalsın, uygulama public site bitince"* diye ertelemişti;
      Beyar 2026-09-04 gece brifinginde erteleme kaldırdı: *"Envanterde
      4'ü hiç basılmıyor — kanona gelecek."* EKSİ İKİNCİ MADDE zaten
      dokümanı kazandırıyordu; bu tur onu uygulamaya çeviriyor.
      Kaynak yayılımı 0 olduğu için bu dördünün ölçüsü DONÖRDEN GELEMEZ;
      kanonun kendi bileşen dilinden türetildi ve her biri hangi mevcut
      kalemden türediğini aşağıda yazıyor.
   ─────────────────────────────────────────────────────────────────────── */

/* ── SÜZGEÇ ŞERİDİ ────────────────────────────────────────────────────
   Kaynak `.filter-bar` · 17/37. Kanonun `.kart-suzgec`i YALNIZ BİR DOLGU
   BİLDİRİMİ (`padding:16px 22px 6px`) — `display` · hizalama ·
   `border-bottom` · `gap` hiçbiri yok ve vitrinde basılı örneği de yok.
   Dolgunun ilk iki değeri (16/22) donörle BİREBİR; eksik olan DÜZEN
   SÖZLEŞMESİYDİ. Ölçüldü: flex · wrap · center · gap 12 · alt kenar 1px. */
.suzgec-cubuk{
  display:flex; flex-wrap:wrap; align-items:center;
  gap:var(--bosluk-12); padding:var(--bosluk-16) var(--bosluk-22);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
/* Şerit kart AYAĞINDA da yaşayabilir — o zaman kenarı ÜSTTE olur. */
.suzgec-cubuk.ayak{ border-bottom:0; border-top:var(--cizgi-1) solid var(--cizgi); }
/* 🔴 `.arama-kutu` BURAYA GİRMEZ — kural bir tur önce tam da onu
   yazıyordu ve 14 ekranı yanlış yöne gönderdi. Şeridin arama alanı
   `.panel-arama` + `.panel-arama-girdi`dir (§75b); genişlik kipi
   orada yazılı. §22 arama SAYFASININ hero kutusudur. */
/* Süzgeç grubunu SAĞA iter — S1'in "grup sağa, tek tek değil" kuralının
   şeritteki karşılığı: `auto` yalnız İLK kaleme kalır. */
.suzgec-cubuk .sag{ margin-left:auto; display:flex; align-items:center; gap:var(--bosluk-8); flex-wrap:wrap; }
/* Sonuç sayacı — "142 kayıt". Şeridin sonunda, sönük. */
.suzgec-sayac{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil); white-space:nowrap;
}
.suzgec-sayac b{ color:var(--murekkep); font-weight:var(--agirlik-ekstra); }
/* Yapışkan kip — uzun listede şerit tepede kalır. Kademe ölçüldü (42). */
.suzgec-cubuk.yapiskan{
  position:sticky; top:64px; z-index:var(--kat-yapiskan); background:var(--kagit);
}

/* ── YÜZLÜ SÜZGEÇ DÜĞMESİ — kaynak `.ff-btn` · 11/37 ──────────────────
   Kanonda AÇILIR SÜZGEÇ YÜZEYİ yoktu. Düğme ölçüldü: 65×44 · dolgu 0/14 ·
   gap 9 · yuvarlak 10 · kenar 1px `--cizgi` · zemin `--zemin` · 13.5/700.
   🔴 YUVARLAKLIK 10px — kanonda 10 yok (8 · 12 · 16 · 24 var) ve
      YUVARLANMADI. Kaynağın değeri; §8'in "12→13 yuvarlama hatası"
      dersi burada da geçerli. Tek kullanıcısı bu düğme, bu yüzden
      token açılmadı: ölçülen tek değer, yerinde yazılıyor. */
.suzgec-dugme{
  position:relative;
  display:inline-flex; align-items:center; gap:var(--bosluk-9);
  min-height:44px; padding:0 var(--bosluk-14);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:10px;
  background:var(--zemin); color:var(--murekkep);
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  cursor:pointer; transition:var(--sure) var(--yumusama);
}
.suzgec-dugme:hover{ border-color:var(--aksan); color:var(--aksan-koyu); }
.suzgec-dugme[aria-expanded="true"]{ border-color:var(--murekkep); background:var(--kagit); }
.suzgec-dugme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}
/* Seçili süzgeç sayısı — düğmenin kendi sayacı (ölçüldü: "Rol 0"). */
.suzgec-dugme .sayi{
  min-width:18px; padding:0 var(--bosluk-5);
  border-radius:var(--yuvarlak-hap);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  font-size:var(--yazi-11); line-height:18px; text-align:center;
}
.suzgec-dugme .sayi:empty,
.suzgec-dugme .sayi[data-sayi="0"]{ display:none; }
/* Süzgeç çipleri açılırın İÇİNDE yaşar — §43 `.cip.suzgec` zaten var ve
   ölçümde min-height 44 · gap 7 · yuvarlak 12 ile donörün `.df-fchip`iyle
   aynı aileden. Burada yalnız TAM GENİŞLİK kipi ekleniyor: açılır dar
   bir kolon, çipler alt alta dizilir. */
.acilir-yuzey .cip.suzgec{ width:100%; justify-content:flex-start; }

/* ── SIRALAMA · D2 KALEMİ 3 — kaynakta 0/15, kanondan geliyor ─────────
   Yeni ad AÇILMADI: sıralama `.tablo`nun başlık hücresinin bir KİPİDİR.
   Ölçü uydurulmadı — hücrenin kendi dolgusu/puntosu korunuyor, eklenen
   tek şey ok işareti ve tıklanabilirlik.
   ⚠ `aria-sort` ZORUNLU: ok yalnız görsel; ekran okuyucu sırayı ondan
     okur. `.sirali` sınıfı ile `aria-sort` BİRLİKTE güncellenir —
     §21 akordeonun `.acik`+`aria-expanded` sözleşmesiyle aynı kural. */
.tablo th.sirali{ padding:0; }
.tablo th.sirali > button{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  width:100%; min-height:44px;
  padding:var(--bosluk-12) var(--bosluk-16);
  border:0; background:none; cursor:pointer;
  font:inherit; color:inherit; letter-spacing:inherit; text-transform:inherit;
  text-align:inherit;
}
.tablo th.sirali > button::after{
  content:"\f0dc"; font-family:"Font Awesome 6 Free"; font-weight:900;
  font-size:var(--yazi-10); opacity:.45; margin-left:auto;
}
.tablo th.sirali > button:hover{ color:var(--murekkep); }
.tablo th.sirali > button:hover::after{ opacity:.75; }
.tablo th[aria-sort] > button{ color:var(--aksan-koyu); }
.tablo th[aria-sort="ascending"]  > button::after{ content:"\f0de"; opacity:1; }
.tablo th[aria-sort="descending"] > button::after{ content:"\f0dd"; opacity:1; }
.tablo th.sirali > button:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:calc(var(--odak-ofset) * -1);
}
/* Sağa yaslı kolonda (sayı · tutar) ok METNİN SOLUNA geçmez — `auto`
   payı yön değiştirir, yoksa ok kolonun ortasında kalır. */
.tablo th.sirali.sag > button{ justify-content:flex-end; }
.tablo th.sirali.sag > button::after{ margin-left:0; }

/* ── SEÇİM KOLONU VE TOPLU İŞLEM · D2 KALEMİ 6 ────────────────────────
   🔴 ÜÇ YÖNLÜ UYUMSUZLUK, ÖLÇÜLDÜ (`docs/admin-envanter.md §5.3`):
      · `.adm-bulk` YALNIZ `admin-moderasyon-v1`de (1/56)
      · ve o ekran `.adm-table` TAŞIMIYOR — yani toplu işlem çubuğu
        tablosu OLMAYAN bir ekranda duruyor
      · `.sel` seçim kolonu 0/56 — kural `fit-admin.css:541-550`de YAZILI
        ama hiçbir ekranda BASILMIYOR (`.row-acts` · `.fhata` ile aynı
        aile: kural yazılmış, kullanılmamış)
      Doküman toplu işlemi liste ekranının ortak sözleşmesi sayıyor.
      Kanon çubuğu TABLOYA bağlıyor — kaynağın yerleşimi düzeltilmedi,
      BİLDİRİLDİ (`docs/admin-kanon-kararlari.md` K-T1).

   Çubuğun ölçüsü donörün TEK örneğinden alındı (görünür kılınarak):
   flex · gap 14 · dolgu 12/22 · yuvarlak 12 · zemin `rgba(marka,.08)`. */
.tablo .sec{ width:44px; padding:0; }
.tablo .sec label{
  display:grid; place-items:center; width:44px; height:100%; min-height:44px;
  cursor:pointer;
}
.tablo .sec input[type=checkbox]{ width:18px; height:18px; accent-color:var(--aksan); cursor:pointer; }
.tablo .sec input:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset);
}
/* Seçili satır — zemin hover'la AYNI DEĞİL, bir adım aksanlı; yoksa
   seçim fareyle gezinmeden ayırt edilemez (ölçüldü: `tr:hover` `--zemin`). */
.tablo tbody tr.secili td{ background:var(--aksan-yikama-8); }
/* 🔴 SEÇİLİ SATIR ZEMİNİ `--metin-ikincil`İN VARSAYIMINI BOZUYOR.
   Tokenin kendi şerhi zemini adıyla söylüyor: "beyazda 4.88:1 (AA)" —
   yani ölçüsü BEYAZ içindir. Aksan yıkaması binince aynı metin @1440
   fit 4.47 · diet 4.44 · gastro 4.38 · gourmet 4.28 düşüyor; dördü de
   eşiğin altında. Kusur rengin değil, rengin BAŞKA BİR ZEMİNDE
   kullanılmasının — §8'de `--aksan`ın metin ilişkisine sokulmasıyla
   aynı biçim: şerhinde geçerlilik alanı yazılı bir token, alanının
   dışında kullanılmış.
   `--murekkep-yumusak` zaten "ikincil koyu metin" diye tanımlı ve aynı
   zeminde 6.89–7.20 veriyor; ikincil sırayı koruyor, eşiği geçiyor. */
.tablo tbody tr.secili :is(.kisi-alt,small){ color:var(--murekkep-yumusak); }

.toplu-islem{
  display:flex; flex-wrap:wrap; align-items:center;
  gap:var(--bosluk-14); margin-bottom:var(--bosluk-12);
  padding:var(--bosluk-12) var(--bosluk-22);
  border-radius:var(--yuvarlak-md);
  background:var(--aksan-yikama-8);
}
.toplu-islem[hidden]{ display:none; }
.toplu-islem b{
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--aksan-koyu);
}
/* Eylemler SAĞA — S1 ③'ün kuralı: boşluk grubun soluna toplanır,
   düğmeler bitişik bir grup olarak sağa yaslanır. */
.toplu-islem .eylem-satiri{ margin-left:auto; }
/* ⚠ Yıkıcı eylem burada DA hayalet kipte — S1 ④: *"kart ayağındaki 'sil'
   bir seçenektir, sayfanın ana eylemi değil."* Toplu silme daha da
   tehlikeli olduğu için BAĞIRMAZ, onay ister. */

/* ── KOLON SEÇİMİ · D2 KALEMİ 5 — kaynakta 0/15 ───────────────────────
   Yeni YÜZEY açılmadı: `.acilir-yuzey` + `.acilir-kalem` zaten var,
   kolon seçici onların bir içeriğidir. Eklenen tek şey onay kutusu
   hizası ve "en az bir kolon açık kalmalı" kilidinin görünür hâli. */
.kolon-secim .acilir-kalem{ gap:var(--bosluk-10); }
.kolon-secim input[type=checkbox]{ width:16px; height:16px; accent-color:var(--aksan); flex:none; }
/* Kapatılamayan kolon (kayıt numarası gibi) — kutusu kilitli, satır sönük.
   D2 "Ortak kayıt alanları"nda benzersiz kayıt numarası ZORUNLU alan. */
.kolon-secim .acilir-kalem.kilitli{ opacity:.55; pointer-events:none; }

/* ── YETKİLİ DIŞA AKTARIM · D2 KALEMİ 7 ───────────────────────────────
   🔴 BU BİR BİLEŞEN DEĞİL, BİR SÖZLEŞMEDİR — yeni ad açmak yanlış olurdu.
      Dışa aktarım bir `.dugme.hayalet`tir ve sayfa başının eylem
      satırında (`.eylem-satiri`) yaşar. Kanona giren tek şey GÖRÜNÜRLÜK
      KURALI: D2 s.17 *"Rol ve yetki: … dışa aktarma"* ve
      *"yetki bazlı maskeleme"* diyor, yani düğme rolü olmayanda
      GÖRÜNMEZ — devre dışı değil, YOK.
      ⚠ `disabled` YETMEZ: devre dışı bir düğme "bu veriyi indirebilirsin
        ama şu an olmaz" der; yetki yoksa doğru mesaj hiçbir mesaj değildir.
        Aynı kural KOPYALAMA-KURALI'nda zaten var: *"Doküman bir maddeyi
        '— … özel' diye şerhlemişse o kap ROL KAPILIDIR: rolü olmayan
        kullanıcıda menüde GÖRÜNMEZ."* */
[data-yetki]:not([data-yetki=""]){ display:none; }
.yetkili [data-yetki="disa-aktar"]{ display:inline-flex; }


/* ───────────────────────────────────────────────────────────────────────
   75f · TABLO · PANEL KİPİ
   ---------------------------------------------------------------------
   §4 `.tablo` ile donörün `.adm-table`ı TABLO DÜZEYİNDE 0/21 ayrışıyor —
   yani kap birebir. Fark HÜCREDE ve ölçüldü:

     özellik        donör                     kanon §4
     th dolgu       12/16/12/22               13/16
     th zemin       saydam                    --zemin
     th renk        --metin-ikincil           --murekkep-yumusak
     th punto       11.5                      11
     th ağırlık     700                       800
     td dolgu       14/16/14/22               13/16
     td renk        --murekkep-yumusak        --murekkep
     ilk/son hücre  22px girinti + son sağa   —

   İkisi de doğru, İKİ AYRI KULLANIM: §4 kart içi dar tablo (4 sayfa),
   bu geniş veri tablosu (21 ekran). §11'in kuralı — ölçüm ikisinin ayrı
   olduğunu söylüyorsa kanon birleştirmez. Varyant adı: `.tablo.panel`.
   ─────────────────────────────────────────────────────────────────────── */

.tablo.panel th,.tablo.panel td{ padding:var(--bosluk-14) var(--bosluk-16); }
.tablo.panel thead th{
  padding-top:var(--bosluk-12); padding-bottom:var(--bosluk-12);
  background:none; color:var(--metin-ikincil);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-kalin);
}
.tablo.panel td{ color:var(--murekkep-yumusak); }
/* Kenar girintisi — ilk kolon 22, son kolon 22 ve SAĞA yaslı.
   Son kolon eylem kolonudur; sağa yaslanması bir hizalama tercihi değil,
   satır eylemlerinin sabit bir kenara oturması. */
.tablo.panel th:first-child,.tablo.panel td:first-child{ padding-left:var(--bosluk-22); }
.tablo.panel th:last-child, .tablo.panel td:last-child { padding-right:var(--bosluk-22); text-align:right; }
/* ⚠ Seçim kolonu ilk hücre olduğunda girinti DÜŞER — kutu 44px'lik
   hedefin ortasında durmalı, 22px sola kaçmamalı. */
.tablo.panel th.sec:first-child,.tablo.panel td.sec:first-child{ padding-left:0; }
/* Sayı kolonu — sağa yaslı, tabular. Kaynağın `.num`u (ölçüldü). */
.tablo.panel .num{ text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
/* Eylem kolonu — sarmaz, satır eylemleri tek satırda kalır. */
.tablo.panel .eylem{ text-align:right; white-space:nowrap; }
/* Kod hücresi — kupon kodu · işlem numarası. Ölçüldü: 1/6 dolgu ·
   yuvarlak 5 · zemin `--zemin` · kenar 1px · 12/700.
   🔴 YUVARLAK 5px — kanonda yok, YUVARLANMADI (aynı ders, §8). */
.tablo.panel code{
  padding:1px var(--bosluk-6);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:5px;
  background:var(--zemin); color:var(--murekkep);
  font-size:var(--yazi-12); font-weight:var(--agirlik-kalin);
}
.tablo.panel td small{
  display:block; margin-top:2px;
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil);
}

/* ── SATIR EYLEMLERİ VE İKON DÜĞMESİ ──────────────────────────────────
   🔴 KANONDA İKON-YALNIZ DÜĞME YOKTU. §2 `.dugme.satir` METİNLİ bir tablo
      düğmesidir (83×44 · kenar · beyaz zemin · dolgu 10/14); donörünki
      ikon-yalnız, ÇERÇEVESİZ, 44×44 kare. Ölçümde 15/21 ayrışıyorlar —
      *"aynı şey değil"*. Kanondaki tek ikon düğmesi `.sohbet-bas
      .dugme.ikon`du ve sohbet başlığına bağlamlanmıştı, genel kalem değil.
      Yayılım 16/37 · **885 geçiş** — envanterin EN YOĞUN kalemi.

   BEŞ KAYNAK ADI TEK BİLEŞENE İNİYOR — hepsi 44×44 ikon hedefi, ölçüldü:
       `.adm-ico-btn`  44×44  satır eylemi        13/500  --metin-ikincil
       `.adm-ed-b`     44×44  düzenleyici düğmesi 13/400  --murekkep-yumusak
       `.ie-drag`      44×44  sürükleme tutamağı  13/400  --cizgi-vurgu-koyu
       `.ie-del`       44×44  satır silme        12.5/400 --metin-ikincil
       `.adm-pg`       44×44  sayfalama oku       13/700  --murekkep-yumusak
   Kutu BEŞİNDE DE aynı; ayrışan yalnız ağırlık ve renk, ve ikisi de
   ROLDEN geliyor. Taban dinlenme rengini `--metin-ikincil`den alır
   (üç adın çoğunluğu), kalanlar kip olarak yazılır. */
.satir-eylem{ display:flex; align-items:center; justify-content:flex-end; gap:2px; }

/* 🔴 K-İ3 · ÖZGÜLLÜK YARIŞI KAZANILMAZ, BİTİRİLİR — Beyar, 2026-09-04.
   Ölçülen kusur: `.ikon-dugme{display:inline-grid}` (0,1,0) ile kabuğun
   `.hamburger{display:none}` (0,1,0) EŞİT özgüllükte; kanon sonra
   yüklendiği için kanon kazanıyordu ve kabukta sınıfla gizlenen HER ikon
   düğmesi geri geliyordu. Ölçüldü (CDP `CSS.getMatchedStylesForNode`,
   1440px, Gastro): hamburger 6/6 hata ekranında sızıyor, zil çıkışlı
   ekranda sızıyor — toplam 7; FIT'te ikisi de gizli, çünkü FIT'in gömülü
   kanon anlık görüntüsü bu kuraldan ÖNCEsine ait. Masaüstünde görünen
   hamburger tıklanıyor ama çekmece açılmıyor: hiçbir şey yapmayan düğme.
   `:where()` özgüllüğü SIFIRA indirir; kabuğun gizleme kuralı yeniden
   kazanır, kuralın kendisi (varsayılan görünürlük) yerinde kalır.
   Yalnız `display` ayrıldı — kalan bildirimler kip/biçim, çakışmıyor. */
:where(.ikon-dugme){ display:inline-grid; }

.ikon-dugme{
  place-items:center;
  width:44px; height:44px; flex:none; padding:0;
  border:0; border-radius:var(--yuvarlak-sm); background:none;
  color:var(--metin-ikincil); font-size:var(--yazi-13);
  font-family:inherit; text-decoration:none; cursor:pointer;
  transition:var(--sure) var(--yumusama);
}
.ikon-dugme:hover{ background:var(--zemin); color:var(--aksan-koyu); }
.ikon-dugme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:calc(var(--odak-ofset) * -1);
}
.ikon-dugme[disabled]{ opacity:.4; pointer-events:none; }
/* Yıkıcı kip — hover'da kırmızıya döner. Dinlenmede NÖTR kalır: bir
   tablo satırında altı çöp kutusu kırmızı yansa satır okunmaz olur.
   S1 ④'ün "yıkıcı eylem BAĞIRMAZ" kuralının satır içi karşılığı. */
.ikon-dugme.yikici:hover{ background:var(--tehlike-yikama); color:var(--tehlike); }
/* Sürükleme tutamağı — imleç ve dinlenme rengi ayrı (ölçüldü). */
.ikon-dugme.tutamak{ cursor:grab; color:var(--cizgi-vurgu-koyu); }
.ikon-dugme.tutamak:active{ cursor:grabbing; }

/* ── SAYFALAMA · KART AYAĞI KİPİ ──────────────────────────────────────
   🔴 §8 `.sayfalama` KARTIN DIŞINDA ve ORTALIDIR (`justify-content:center`
      · `margin-top:40px`). Donörünki kartın İÇİNDE ve AYAĞINDA:
      `space-between` · gap 16 · dolgu 14/22 · üst kenar 1px · üst pay 0.
      7/21 ayrışıyor ve ayrım YAPISAL — solda "1–14 / 142" bilgisi, sağda
      düğme grubu. Ortalı kip bu bilgiyi taşıyamaz.
      Düğmesi de ayrı: donörde KENAR YOK, ZEMİN YOK, YUVARLAKLIK YOK
      (`0px none` · `rgba(0,0,0,0)` · `0px`); kanonda 1px kenar · beyaz ·
      12px. Dokunma hedefi İKİ TARAFTA DA 44×44 ✅ — orada ayrışmıyorlar. */
.sayfalama.kart-ayagi{
  justify-content:space-between; gap:var(--bosluk-16);
  margin-top:0; padding:var(--bosluk-14) var(--bosluk-22);
  border-top:var(--cizgi-1) solid var(--cizgi);
}
.sayfalama-bilgi{
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil);
}
.sayfalama-bilgi b{ color:var(--murekkep); font-weight:var(--agirlik-kalin); }
.sayfalama.kart-ayagi .dugmeler{ display:flex; align-items:center; gap:var(--bosluk-6); }
/* Sade düğme — kenarsız/zeminsiz kip. Aktif hâl KENDİ zeminini alır,
   yoksa hangi sayfada olduğun görünmez. */
/* 🔴 `.aktif` HARİÇ TUTULMALI — ölçüldü 2026-09-04.
   `.sayfa-dugme.aktif` (§8) zemini `--aksan`, metni `--kagit` yapıyor;
   `.sade` DAHA SONRA gelip `background:none` yazınca yalnız ZEMİN geri
   alınıyordu, metin beyaz kalıyordu:
       .sayfa-dugme.sade.aktif → zemin rgba(0,0,0,0) · renk rgb(255,255,255)
   Yani aktif sayfa numarası BEYAZ ZEMİNDE BEYAZ — hiç basılmıyor.
   §75f'in kendi şerhi *"aktif hâl KENDİ zeminini alır, yoksa hangi
   sayfada olduğun görünmez"* diyordu; kural yazılmış, SIRA yüzünden
   ölmüştü. Üç ekranda doğrulandı (uyeler · sayfalar · faturalar).
   Bir kuralın yazılmış olması uygulandığı anlamına gelmez. */
.sayfa-dugme.sade:not(.aktif){ border-color:transparent; background:none; }
.sayfa-dugme.sade:hover:not([disabled]):not(.aktif){ background:var(--zemin); border-color:transparent; }


/* ───────────────────────────────────────────────────────────────────────
   75g · BEŞ ZORUNLU EKRAN DURUMU — D2 s.17
   ---------------------------------------------------------------------
   > *"Teknik çıktı: TÜM liste ve detay ekranlarında yükleniyor, boş sonuç,
   >   yetkisiz erişim, doğrulama hatası ve servis hatası durumlarının
   >   tasarlanması."*

   ÖLÇÜLDÜ (`docs/admin-envanter.md §7` · 37 ORTAK ekran, `main.adm-main` içi):

     durum               kaynakta          kanonda (bu turdan ÖNCE)
     ----------------    --------------    -------------------------------
     boş sonuç           11/37 DOM ✅      §7 `.bos-durum` (16 kural) ✅
     doğrulama hatası    12/12 davranış✅  §3 `.alan-hata` + `.alan-ozet` ✅
     yükleniyor           0/37 🔴          🔴 HİÇ YOK — kanonun da boşluğu
     yetkisiz erişim      0/37 🔴          ⚠ §35 yalnız TAM SAYFA
     servis hatası        0/37 🔴          ⚠ §35 yalnız TAM SAYFA

   🔴 DOĞRULAMA HATASI "YOK" DEĞİL, 12/12 ÇALIŞIYOR. Dinlenmedeki DOM'da
      0 çıkıyor çünkü durum JS ile TIKLAMA ANINDA üretiliyor. İşaret
      aramak yetmedi; davranış sınandı — 12 form ekranında zorunlu alanlar
      boşaltılıp kaydete basıldı, 12'sinde de hata bastı.
      AMA KANONLANABİLİR DEĞİL, üç sebep ölçüldü: kutu `fit-admin.js:775`te
      SATIR İÇİ STİLLE üretiliyor (CSS katmanını atlıyor) · kullandığı
      sınıflar `fit-admin.css`te hiç tanımlı değil · CSS'in TANIMLADIĞI
      doğrulama kuralları (`.fhata` · `.is-err`) hiçbir ekranda
      KULLANILMIYOR. → Kanonun `.alan-hata`/`.alan-ozet`i geçerli;
      donörün satır içi kipi ÇEVRİLMEZ, kanona bağlanır.

   ⚠ §35 DURUM EKRANI BİR TAM-SAYFA BİLEŞENİDİR (404·403·500·bakım·oturum·
     çevrimdışı — altı ekran tek kit). Dokümanın istediği ise LİSTE/DETAY
     EKRANININ İÇİNDE bir durum. İkisi aynı şey değil; §35 varsayılıp
     "yetkisiz ✅" denemez. Panelin içinde kalan bir yetkisizlik, kullanıcıyı
     paneldan ATMADAN anlatılmalı — menü ve üst çubuk yerinde kalır.
   ─────────────────────────────────────────────────────────────────────── */

/* ── 1 · YÜKLENİYOR ───────────────────────────────────────────────────
   🔴 KANONUN DA BOŞLUĞU — `bilesenler.css`te iskelet/spinner/yükleniyor
      TEK KURAL yoktu (`iskelet`·`spinner`·`yukleniyor` = 0 seçici).
      Admin'e özgü değil; public tarafta da eksik (ayrı kalem, bu tur ölçmedi).

   KARAR · İSKELET AYRI BİR DÜZEN DEĞİL, BİLEŞENİN KENDİ KİPİDİR.
   Ayrı bir "yükleniyor ekranı" markup'ı yazmak iki düzenin birbirinden
   kaymasına açık kapı bırakır — tablo altı kolona çıkar, iskelet dörtte
   kalır. Bu yüzden iskelet GERÇEK bileşenin içine konur: iskelet bir
   `.tablo.panel` satırı, gerçek satırın ta kendisidir; yalnız hücrelerin
   içeriği `.iskelet` şeridiyle değişir. Düzen bir tane olduğu için
   kayamaz.

   ⚠ HAREKET İSTEĞE BAĞLI DEĞİL, KOŞULLU. `prefers-reduced-motion` açıkken
     parıltı durur ve iskelet düz bir yüzeye döner — bilgi kaybı yok,
     çünkü anlamı taşıyan şey hareket değil, YERİ TUTULMUŞ KUTU. */
.iskelet{
  display:block; border-radius:var(--yuvarlak-sm);
  background:linear-gradient(90deg,
    var(--zemin) 0%, var(--zemin-3) 50%, var(--zemin) 100%);
  background-size:200% 100%;
  animation:iskelet-parilti 1.2s var(--yumusama) infinite;
  /* Metin yerine geçtiği için kendi yüksekliğini taşır; satır yüksekliği
     mirasa bırakılırsa 0 çizer. */
  height:var(--yazi-13-5);
}
.iskelet.baslik{ height:var(--yazi-20); }
.iskelet.kisa{ width:38%; }
.iskelet.orta{ width:62%; }
.iskelet.tam{ width:100%; }
.iskelet.daire{ width:38px; height:38px; border-radius:var(--yuvarlak-daire); flex:none; }
.iskelet + .iskelet{ margin-top:var(--bosluk-8); }
@keyframes iskelet-parilti{ from{ background-position:200% 0 } to{ background-position:-200% 0 } }
@media (prefers-reduced-motion:reduce){
  .iskelet{ animation:none; background:var(--zemin-3); }
}
/* Yükleniyor satırı — iskeletin uygun düşmediği yerde (düğme içi, kart
   ayağı) dönen halka. Ölçü uydurulmadı: 18px, `--yazi-18`in kutusu. */
.yukleniyor{
  display:inline-flex; align-items:center; gap:var(--bosluk-9);
  font-size:var(--yazi-13); font-weight:var(--agirlik-orta);
  color:var(--metin-ikincil);
}
.yukleniyor::before{
  content:""; width:18px; height:18px; flex:none;
  border:2px solid var(--cizgi);
  border-top-color:var(--aksan);
  border-radius:var(--yuvarlak-daire);
  animation:yukleniyor-don .7s linear infinite;
}
@keyframes yukleniyor-don{ to{ transform:rotate(360deg) } }
@media (prefers-reduced-motion:reduce){
  .yukleniyor::before{ animation-duration:2.4s; }
}
/* ⚠ EKRAN OKUYUCU İÇİN GÖRSEL YETMEZ. Yükleniyor kabı `aria-busy="true"`
   taşır ve durum değişimi `role="status"` ile duyurulur; parıltı yalnız
   görene bir şey söyler. §20 `.yalniz-okuyucu` bu iş için zaten var. */
[aria-busy="true"] .iskelet{ cursor:progress; }

/* ── 2 · BOŞ SONUÇ — §7 ZATEN KARŞILIYOR, YENİ AD YOK ─────────────────
   `.bos-durum` (16 kural) + `.bos-durum.kart-ici` + §48 üçüncü boy.
   Ölçüldü: donörün `.fpx-bos`u 18/56 ekranda basılı ve `.bos-durum`la
   7/21 ayrışıyor — ayrışmanın tamamı §48'in ZATEN yazdığı kip.
   Admin'in eklediği tek şey aşağıdaki İKİ SEMANTİK VARYANT; ikisi de
   `.bos-durum`un kutusunu AYNEN kullanır, yalnız ikon çipini değiştirir.

   🔴 NEDEN AYRI VARYANT, NEDEN AYRI BİLEŞEN DEĞİL: üçünün de yapısı
      birebir aynı (ikon · başlık · açıklama · eylem) ve ayrışan tek şey
      ikon çipinin RENGİ. Ayrı bileşen açmak §0'ın sayım kuralını çiğnerdi
      ("aynı kutu N adla yazılmışsa tek bileşendir"). */

/* ── 3 · YETKİSİZ ERİŞİM ──────────────────────────────────────────────
   İkon çipi NÖTR — aksan değil, tehlike de değil. Gerekçe: yetkisizlik
   bir HATA DEĞİLDİR, bir sınırdır. Kırmızı "bir şey bozuldu" der ve
   kullanıcıyı destek talebine iter; aksan "burada iş var" der ve davet
   eder. İkisi de yanlış mesaj. Nötr çip doğru olanı söyler: burası var,
   sana kapalı. */
.bos-durum.yetkisiz .bos-ikon{ background:var(--durum-kapali-zemin); color:var(--durum-kapali-metin); }

/* ── 4 · SERVİS HATASI ────────────────────────────────────────────────
   İkon çipi TEHLİKE ailesinde — burada gerçekten bir şey bozuldu.
   ⚠ EYLEM ZORUNLU: servis hatası tek başına bir çıkmazdır; §7'nin
     "boş ekran bir davettir" kuralı burada "yeniden dene" düğmesi olur. */
.bos-durum.servis-hatasi .bos-ikon{ background:var(--tehlike-yikama); color:var(--tehlike); }
/* Teknik iz — destek talebine yapıştırılacak kod. Kullanıcıya HATA
   MESAJI gösterilmez (yığın izi, SQL, dosya yolu asla); yalnız
   ilişkilendirilebilir bir referans. D2 §15 "Log Kayıtları" o referansla
   eşleşir. */
.hata-izi{
  margin-top:var(--bosluk-12);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil); font-variant-numeric:tabular-nums;
}
.hata-izi code{
  padding:1px var(--bosluk-6);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:5px;
  background:var(--zemin); color:var(--murekkep-yumusak);
}

/* ── 5 · DOĞRULAMA HATASI — §3 ZATEN KARŞILIYOR ───────────────────────
   Alan düzeyi `.alan-hata` · form düzeyi `.alan-ozet`. Admin'in eklediği
   tek şey PANEL FORM KİTİNE bağlanmaları (§75i). Yeni ad açılmadı. */


/* ───────────────────────────────────────────────────────────────────────
   75h · FORM KALIBI — ASİMETRİK İKİ KOLON
   ---------------------------------------------------------------------
   🔴 KANONDA ASİMETRİK İKİ KOLON YOKTU. `.kart-izgara` EŞİT kolon üretiyor
      (`.c2` = `repeat(2,1fr)`); donörün `.form-layout`u `660px 360px`.
      Yayılım 14/37. `.adm-cols` (3/37 · `632/395`) aynı ailenin pano kipi.

   ÖLÇÜLDÜ: grid · `660px 360px` · gap 24 · `align-items:start`.
   🔴 `align-items:start` ÖNEMLİ VE S21'İN TERSİ: S21 yan yana kartların
      TABANINI hizalıyor (`stretch`), çünkü orada iki kart eş anlamlı.
      Burada değiller — sol kolon formun kendisi, sağ kolon yardımcı
      panel. Sağ kolonu sola uzatmak 300px boş yüzey üretir; S21'in
      `#bagli` istisnasında ölçülen 240px'lik kusurun aynısı.
   ─────────────────────────────────────────────────────────────────────── */

.form-duzen{
  display:grid; grid-template-columns:660px 360px;
  gap:var(--bosluk-24); align-items:start;
}
/* Pano kipi — kolonlar esner (ölçüldü: 632/395, yani oran 1.6:1). */
.form-duzen.pano{ grid-template-columns:minmax(0,1.6fr) minmax(0,1fr); gap:var(--bosluk-16); }
/* Sol kolon TAŞMAYI KESER — uzun tablo/kod formu genişletmesin. */
.form-duzen > *{ min-width:0; }

/* Yan kolon — KART DEĞİL, kart TAŞIYAN kolon. Ölçüldü: `.side-card`
   kenarsız · zeminsiz · gölgesiz, `flex-column` · gap 16 · `sticky`.
   🔴 Adı yanıltıcı olduğu için kanon adı değişti: `.form-yan`.
      §1 `.kart`in bir varyantı DEĞİL — kartları İÇİNDE taşır. */
.form-yan{
  display:flex; flex-direction:column; gap:var(--bosluk-16);
  position:sticky; top:92px;
  /* ⚠ `top` üst çubuğun (64) + nefesin (28) toplamı — `.panel-sayfa`nın
     üst dolgusuyla AYNI değer. İkisi ayrı yazılırsa biri değişince
     yan kolon çubuğun altına kayar. */
}
/* ⚠ `sticky` YALNIZ SIĞDIĞINDA yapışır. Yan kolon ekrandan uzunsa
   yapışma kullanıcıyı alt kalemlere ulaşamaz hâle getirir — bu yüzden
   uzun kolonda kip düşer. Kaynak bunu bildirmiyor; kanon bildiriyor. */
@media (max-height:820px){ .form-yan{ position:static; } }

/* ── FORM BÖLÜMÜ VE BÖLÜM BAŞLIĞI ─────────────────────────────────────
   §18 `.bolum-bas` DEĞİL — ölçüm 7/21 ayırdı: §18 16px/500 · alt pay 34;
   bu 13px/700 · harf aralığı -.02em · alt pay 16. §18 SAYFA bölümünü
   anlatır, bu FORM bölümünü; ikisi aynı ölçekte değil. */
.form-bolum{ padding:var(--bosluk-18) var(--bosluk-22); }
.form-bolum + .form-bolum{ border-top:var(--cizgi-1) solid var(--cizgi); }
.form-bolum-bas{
  display:flex; align-items:center; gap:var(--bosluk-9);
  margin-bottom:var(--bosluk-16);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-baslik); color:var(--murekkep);
}
.form-bolum-bas i{ color:var(--aksan); font-size:var(--yazi-13); }
/* Form kartının eylem ayağı — ölçüldü 18/22, üst kenar 1px, sağa yaslı.
   🔴 §1'in `.kart.panel > .kart-alt`ı 14/22 YAZIYOR ve bu 18/22.
      Dört piksel gerçek ve ayrı KULLANIM: 14/22 sayfalama ayağı (kısa,
      bilgi taşır), 18/22 eylem ayağı (düğme taşır, nefes ister).
      §11'in kuralı — ölçüm ayırıyorsa kanon birleştirmez. */
.kart.panel > .kart-alt.form-eylem{
  display:flex; align-items:center; flex-wrap:wrap;
  gap:var(--bosluk-14); padding:var(--bosluk-18) var(--bosluk-22);
  border-top:var(--cizgi-1) solid var(--cizgi);
}

/* ── FORM SEKME RAYI — ALT ÇİZGİLİ KİP ────────────────────────────────
   🔴 §11 SEKME RAYI'NIN İKİNCİ KİPİ, VARYANTI DEĞİL — ölçüm ayırdı:
      §11 `.sekmeler` HAPLI (yuvarlak 12 · dolgu 4 · kenar 1px · beyaz
      zemin · kalemler yuvarlak 8); bu ALT-ÇİZGİLİ (kap saydam · alt
      kenar 1px · aktif kalem 2px alt çizgi · yuvarlaklık YOK).
      İkisi aynı kutu değil. `.sekmeler.cizgili` diye varyant yazmak
      tabanın altı bildirimini birden ezmek olurdu; ayrı ad daha ucuz.
   Ölçüldü: ray 44px · gap 6 · alt pay 18; sekme dolgu 9/14 · 13/700 ·
   alt çizgi 2px · aktif renk `--aksan`. */
.form-sekmeler{
  display:flex; flex-wrap:wrap; gap:var(--bosluk-6);
  margin-bottom:var(--bosluk-18);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.form-sekme{
  /* -1px: sekmenin alt çizgisi rayın kendi çizgisinin ÜSTÜNE oturur,
     altına değil — yoksa aktif sekmede 3px'lik kalın bir çizgi doğar
     (ölçüldü: donör de aynı negatif payı yazıyor). */
  margin-bottom:calc(var(--cizgi-1) * -1);
  min-height:44px; padding:var(--bosluk-9) var(--bosluk-14);
  border:0; border-bottom:var(--cizgi-2) solid transparent;
  background:none; font-family:inherit;
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  color:var(--metin-ikincil); cursor:pointer;
  transition:var(--sure) var(--yumusama);
}
.form-sekme:hover{ color:var(--murekkep); }
.form-sekme[aria-selected="true"],.form-sekme.aktif{
  color:var(--aksan-koyu); border-bottom-color:var(--aksan);
}
.form-sekme:focus-visible{
  outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:calc(var(--odak-ofset) * -1);
}
/* Sekmede bekleyen hata sayısı — doğrulama hatası gizli sekmede olabilir
   ve kullanıcı onu göremez. D2'nin "doğrulama hatası" durumu form
   SEKMELİYSE bu olmadan eksik kalır: kaydet'e basınca hata başka
   sekmede yanar ve ekran "hiçbir şey olmadı" gibi görünür. */
.form-sekme .hata-sayi{
  margin-left:var(--bosluk-6);
  min-width:18px; padding:0 var(--bosluk-5);
  border-radius:var(--yuvarlak-hap);
  background:var(--hata); color:var(--kagit);
  font-size:var(--yazi-10); line-height:18px;
}

/* ── SLUG ALANI — kaynak `.slug-wrap` · 4/37 ──────────────────────────
   Önek + girdi TEK kutuda. Kenar KAPTA, girdi çıplak — §22'nin
   `.arama-kutu` anatomisiyle aynı karar. Ölçüldü: kap yuvarlak 12 ·
   kenar 1px · taşma gizli; önek dolgu 0/12 · zemin `--zemin` ·
   sağ kenar 1px · 12.5/600 · `--metin-ikincil`. */
.slug-alani{
  display:flex; align-items:stretch;
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--kagit); overflow:hidden;
}
.slug-onek{
  display:flex; align-items:center; flex:none;
  padding:0 var(--bosluk-12);
  border-right:var(--cizgi-1) solid var(--cizgi);
  background:var(--zemin); color:var(--metin-ikincil);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-orta);
  white-space:nowrap;
}
.slug-alani .alan-girdi{
  border:0; border-radius:0; background:none; min-height:44px; flex:1; min-width:0;
}
.slug-alani:focus-within{
  border-color:var(--aksan); box-shadow:0 0 0 var(--odak-kalinlik) var(--aksan-yikama);
}

/* ── SEO DENETİMİ — kaynak `.seo-checks` · 3/37 ───────────────────────
   Ölçüldü: liste flex-column · gap 10 · üst pay 14; kalem flex ·
   gap 9 · 12.5/500 · hizalama flex-start (ikon ilk satıra oturur).
   ⚠ DURUM RENGİ TEK BAŞINA TAŞIMAZ — geçen/kalan ayrımı İKONDAN okunur
     (WCAG 1.4.1). Renk yalnız pekiştirir. */
.seo-denetim{ display:flex; flex-direction:column; gap:var(--bosluk-10); margin-top:var(--bosluk-14); }
.seo-kalem{
  display:flex; align-items:flex-start; gap:var(--bosluk-9);
  font-size:var(--yazi-12-5); font-weight:var(--agirlik-govde);
  color:var(--murekkep-yumusak); line-height:1.4;
}
.seo-kalem > i{ flex:none; margin-top:2px; font-size:var(--yazi-12); color:var(--metin-ikincil); }
.seo-kalem.gecti > i{ color:var(--aksan-koyu); }
.seo-kalem.uyari > i{ color:var(--uyari); }
.seo-kalem.kaldi > i{ color:var(--hata); }
.seo-skor{ display:flex; align-items:center; gap:var(--bosluk-16); }
/* 🔴 METİN KOLONU YAZILMAMIŞTI — iki metin BİTİŞİK basıyordu.
   `.seo-skor` halka ile metin kolonunu yan yana diziyordu ama kolonun
   KENDİ çocuklarına hiçbir şey söylemiyordu. İkisi de `inline` kaldı ve
   markup'ta aralarında boşluk olmadığı için tek kelimeye yapıştılar:

       ölçüldü · admin-hareket-form · innerText
         "0 / 6 ölçüt geçtiAlanları doldurdukça yükselir"

   🔴 HİÇBİR YAPISAL ÖLÇÜM GÖREMEZDİ: sınıf kümesi doğru, düğüm sayısı
      doğru, davranış doğru; kusur yalnız ÇİZİLMİŞ hâlde var. Ekran
      görüntüsünde çıktı ve iki panelde birden duruyordu.
   ⚠ Yeni ad açılmadı ve yeni ölçü üretilmedi: desen §4'ün `.tablo td b` /
     `.tablo td small` ikilisinin aynısı — başlık blok, altındaki not bir
     adım küçük ve sönük. Değerler o ikiliden alındı. */
.seo-skor > div:not(.skor-halka) > b{
  display:block;
  font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep);
}
.seo-skor > div:not(.skor-halka) > span{
  display:block; margin-top:3px;
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil);
}
/* Skor halkası — `conic-gradient` ile, `--oran` satır içi yüzdeden gelir.
   Dairenin kendisi 60px (ölçüldü). Ortadaki delik kağıt renginde. */
.skor-halka{
  position:relative; width:60px; height:60px; flex:none;
  display:grid; place-items:center; border-radius:var(--yuvarlak-daire);
  background:conic-gradient(var(--aksan) calc(var(--oran,0) * 1%), var(--cizgi) 0);
}
.skor-halka::before{
  content:""; position:absolute; inset:6px;
  border-radius:var(--yuvarlak-daire); background:var(--kagit);
}
.skor-halka > b{
  position:relative;
  font-size:var(--yazi-15); font-weight:var(--agirlik-ekstra);
  color:var(--murekkep); font-variant-numeric:tabular-nums;
}

/* ── METİN DÜZENLEYİCİ — kaynak `.adm-ed` · 4/37 ──────────────────────
   Üç şerit: araç çubuğu · yüzey · ayak. Ölçüldü: kap kenar 1px ·
   yuvarlak 12 · taşma gizli; çubuk zemin `--zemin` · dolgu 6 · gap 2 ·
   alt kenar; yüzey dolgu 18/20 · 15px · satır 1.7 · minH 420 · kaydırır;
   ayak zemin `--zemin` · dolgu 8/14 · gap 14 · üst kenar · 11.5px. */
.metin-duzenleyici{
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--kagit); overflow:hidden;
}
.duzenleyici-cubuk{
  display:flex; flex-wrap:wrap; align-items:center; gap:2px;
  padding:var(--bosluk-6);
  background:var(--zemin);
  border-bottom:var(--cizgi-1) solid var(--cizgi);
}
.duzenleyici-ayrac{ width:var(--cizgi-1); height:22px; margin:0 var(--bosluk-4); background:var(--cizgi); flex:none; }
.duzenleyici-yuzey{
  padding:var(--bosluk-18) var(--bosluk-20);
  min-height:420px; max-height:60vh; overflow-y:auto;
  font-size:var(--yazi-15); line-height:var(--satir-bol); color:var(--murekkep);
}
.duzenleyici-yuzey:focus{ outline:0; }
.duzenleyici-yuzey:focus-visible{ outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:calc(var(--odak-ofset) * -1); }
.duzenleyici-ayak{
  display:flex; align-items:center; gap:var(--bosluk-14);
  padding:var(--bosluk-8) var(--bosluk-14);
  background:var(--zemin);
  border-top:var(--cizgi-1) solid var(--cizgi);
  font-size:var(--yazi-11-5); font-weight:var(--agirlik-govde); color:var(--metin-ikincil);
}
/* ⚠ ARAÇ ÇUBUĞU DÜĞMESİ `.ikon-dugme`DİR — yeni ad açılmadı (§75f'nin
   beş kaynak adından biri). Aktif kip zemin alır. */
.duzenleyici-cubuk .ikon-dugme.aktif{ background:var(--aksan-yikama); color:var(--aksan-koyu); }

/* ── ÇOKLU SEÇİM — kaynak `.ms-*` · 4/37 ──────────────────────────────
   Kutu + açılır menü. Menü `.acilir-yuzey`in ta kendisi (ölçüldü:
   yuvarlak 12 · gölge `--golge-lg` · dolgu 6 · taşma auto) — yeni yüzey
   AÇILMADI, mevcut bileşen kullanıldı.
   Kutu ölçüldü: flex · gap 8 · dolgu 9/11 · yuvarlak 12 · kenar 1px ·
   minH 44 · zemin `--kagit`. */
.coklu-secim{ position:relative; }
.coklu-kutu{
  display:flex; flex-wrap:wrap; align-items:center; gap:var(--bosluk-8);
  width:100%; min-height:44px; padding:var(--bosluk-9) var(--bosluk-11);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-md);
  background:var(--kagit); color:var(--murekkep);
  font-family:inherit; font-size:var(--yazi-13-5); font-weight:var(--agirlik-govde);
  text-align:left; cursor:pointer;
}
.coklu-kutu:hover{ border-color:var(--cizgi-vurgu-acik); }
.coklu-kutu[aria-expanded="true"]{ border-color:var(--aksan); }
.coklu-kutu:focus-visible{ outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset); }
.coklu-kutu .yer-tutucu{ color:var(--yer-tutucu); }
/* Seçilen kalem çipi — §43 `.cip`in KÜÇÜK kipi. Kutunun içinde yaşar,
   bu yüzden 44px hedefi burada UYGULANMAZ: hedef kutunun kendisidir,
   çipin `×` düğmesi ayrı bir hedeftir. */
.coklu-cip{
  display:inline-flex; align-items:center; gap:var(--bosluk-6);
  padding:var(--bosluk-4) var(--bosluk-8);
  border-radius:var(--yuvarlak-sm);
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  font-size:var(--yazi-12); font-weight:var(--agirlik-orta);
}
.coklu-cip button{
  border:0; background:none; cursor:pointer; padding:0; line-height:1;
  color:inherit; font-size:var(--yazi-11); opacity:.7;
}
.coklu-cip button:hover{ opacity:1; }

/* ── SIRALANABİLİR LİSTE VE ADIM KARTI — kaynak `.st-*` · 7/37 ────────
   Program aşaması · menü öğesi · form alanı — hepsi aynı kutu.
   Ölçüldü: kart flex · gap 14 · dolgu 16 · yuvarlak 16 · kenar 1px ·
   zemin `--zemin` (kâğıt DEĞİL — liste kart İÇİNDE yaşıyor, kâğıt
   üstünde kâğıt görünmez); numara 38px daire · aksan zemin · beyaz
   metin · 14/700; yan kolon flex-column · gap 7 · 44 geniş. */
.adim-liste{ display:flex; flex-direction:column; gap:var(--bosluk-10); }
.adim-karti{
  display:flex; align-items:flex-start; gap:var(--bosluk-14);
  padding:var(--bosluk-16);
  border:var(--cizgi-1) solid var(--cizgi); border-radius:var(--yuvarlak-lg);
  background:var(--zemin);
}
.adim-no{
  display:grid; place-items:center;
  width:38px; height:38px; flex:none;
  border-radius:var(--yuvarlak-daire);
  background:var(--aksan-koyu); color:var(--kagit);   /* metin zemini — §8 */
  font-size:var(--yazi-14); font-weight:var(--agirlik-kalin);
  font-variant-numeric:tabular-nums;
}
.adim-govde{ display:flex; flex-direction:column; gap:var(--bosluk-9); flex:1; min-width:0; }
.adim-yan{ display:flex; flex-direction:column; align-items:center; gap:var(--bosluk-7); flex:none; }
/* Satır ekle — kesikli kenarlı davet düğmesi. Ölçüldü: tam genişlik ·
   minH 44 · dolgu 13/22 · yuvarlak 12 · 1px DASHED · 13/700 ·
   `--metin-ikincil` · zeminsiz.
   ⚠ `--kesikli-kenar` (2px `--cizgi-vurgu`) KULLANILMADI: ölçülen 1px
     `--cizgi`. §53'ün `.birak-alani` şerhinde aynı ayrım var. */
.satir-ekle{
  display:flex; align-items:center; justify-content:center; gap:var(--bosluk-9);
  width:100%; min-height:44px; padding:var(--bosluk-13) var(--bosluk-22);
  border:var(--cizgi-1) dashed var(--cizgi); border-radius:var(--yuvarlak-md);
  background:none; color:var(--metin-ikincil);
  font-family:inherit; font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  cursor:pointer; transition:var(--sure) var(--yumusama);
}
.satir-ekle:hover{ border-color:var(--aksan); color:var(--aksan-koyu); background:var(--aksan-yikama); }
/* 🔴 LİSTEDEN SONRA GELEN NEFES — 2026-09-04 · 32 BAĞIMSIZ TÜKETİCİ.
   `.satir-ekle` her zaman bir listenin ARDINDAN gelir ve araya bir nefes
   ister. Kanon onu yazmıyordu; 32 ekranda agent'lar aynı satır içi
   bildirimi yazdı (`margin-top:10px`), yani otuz iki kez aynı boşluk
   kendi başına doğdu. Üç bağımsız tüketici kanon basıncıysa otuz iki
   kesindir. Değer uydurulmadı — ekranlarda ölçülen ortak değer. */
.adim-liste + .satir-ekle,
.alan-izgara + .satir-ekle,
.tablo-kap + .satir-ekle,
.satir-ekle:not(:first-child){ margin-top:var(--bosluk-10); }
.satir-ekle:focus-visible{ outline:var(--odak-kalinlik) solid var(--odak-renk); outline-offset:var(--odak-ofset); }

/* ── KİŞİ HÜCRESİ — kaynak `.u-cell` ──────────────────────────────────
   🔴 EŞİK KARARI · LEAD, BEYAR ONAYI BEKLİYOR.
   Envanter bunu ADAY'a koymuştu (2/37 ORTAK ekran, eşik 3) ve
   *"kanona GİRMEZ"* demişti. Kanona ALINDI; gerekçe ve karşı gerekçe:

     LEHTE · Yayılım 2/37 ama **222 geçiş** — envanterin en yoğun ADAY'ı.
       Eşik KAYNAĞIN 37 ekranını sayıyor; doküman 33 modül istiyor ve
       bunların 13'ü prototipte HİÇ YOK (Formlar & Başvurular · İçerik
       Onayları · E-posta Kayıtları · Sistem Bildirimleri · Duyurular …).
       Onların HEPSİ bir kişi referansı taşıyor ("atanan kişi", "başvuran",
       "gönderen", "son yanıtlayan", "oluşturan") — D2'nin "Ortak kayıt
       alanları" maddesi bunu zaten şart koşuyor.
     ALEYHTE · Kanonun kendi eşiği ölçülmüş bir kuraldır ve onu
       GELECEKTEKİ yayılıma dayanarak esnetmek, eşiği kuralsızlaştırır.

     KARAR · Alındı, çünkü almamanın bedeli ölçülebilir: dört agent
       kesişimsiz modül kümelerinde paralel çalışıyor ve kişi hücresi
       dördünde birden doğuyor. Kanon vermezse **dördü de kendi adını
       icat eder** — bu turun varlık sebebi tam olarak o dağınıklığı
       bitirmekti. Karar geri alınabilir: sınıf silinirse ekranlar
       kırılır ve nerede kullanıldığı tek `grep`le görünür.
     Kayıt: `docs/admin-kanon-kararlari.md` K-E1.

   ⚠ §25 `.kimlik-karti` BU DEĞİLDİR (ölçüm 10/21 ayırdı) ve §50
     `.paket-satiri` de değil: o 52px avatarlı, kenarlı, dolgulu bir
     KART SATIRI; bu 38px avatarlı, kenarsız, dolgusuz bir TABLO HÜCRESİ.
   Ölçüldü: flex · gap 12 · minH 44; avatar 38px daire · zemin
   `--aksan-halka` · renk `--aksan-koyu` · 13/700; ad 13.5/700
   `--murekkep`; e-posta 12/500 `--metin-ikincil` · üst pay 2. */
.kisi-hucre{
  display:flex; align-items:center; gap:var(--bosluk-12);
  min-height:44px; color:inherit; text-decoration:none;
}
.kisi-avatar{
  display:grid; place-items:center;
  width:38px; height:38px; flex:none;
  border-radius:var(--yuvarlak-daire);
  /* 🔴 YARI SAYDAM ZEMİN, KONTRASTI BİLEŞENDEN ALIP ALTINDAKİNE VERİR.
     `--aksan-halka` `color-mix(… 12%, transparent)`; aynı seçici altına
     ne gelirse ona göre oran değiştiriyordu — ölçüldü @1440, `--aksan-koyu`
     metniyle: beyaz başlıkta 4.61 · sayfa zemininde 4.39 · %8 marka
     yıkamalı satırda 4.28. Üçü de AYNI bileşen. Ve en kötüsü iki yarı
     saydam katmanın üst üste binmesiydi: ikisi de tek başına doğru
     olduğu için kimse ölçmemişti.
     `--aksan-yikama` zaten OPAK (`… 9.3%, #fff`) ve şerhi zaten
     "ikon çipi zemini" diyor — avatar ile KPI ikonu tam olarak o.
     Opak zeminle oran artık bağlamdan bağımsız SABİT:
       fit 4.81 · gastro 4.88 · diet 4.83 · gourmet 8.65      ✅
     ⚠ Odak halkası (`§62 .kod-hane:focus` box-shadow) `--aksan-halka`da
     KALIR: halka altındakinin üstüne biner, saydamlığı gereğidir. */
  background:var(--aksan-yikama); color:var(--aksan-koyu);
  font-size:var(--yazi-13); font-weight:var(--agirlik-kalin);
  text-transform:uppercase; overflow:hidden;
}
.kisi-avatar img{ width:100%; height:100%; object-fit:cover; }
.kisi-bilgi{ min-width:0; }
.kisi-ad{
  display:block; font-size:var(--yazi-13-5); font-weight:var(--agirlik-kalin);
  color:var(--murekkep);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
.kisi-alt{
  display:block; margin-top:2px;
  font-size:var(--yazi-12); font-weight:var(--agirlik-govde);
  color:var(--metin-ikincil);
  overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
}
a.kisi-hucre:hover .kisi-ad{ color:var(--aksan-koyu); }

/* ── İÇERİK TÜRÜ ROZETİ — kaynak `.cb-kind` · 11/56 ───────────────────
   §5 `.rozet`ten AYRI: o 11.5/800 · kenarlı · `--aralik-genis`; bu
   11/700 · KENARSIZ · VERSAL · `--aralik-versal`. Ölçüm ayırdı.
   Rol farkı da var: `.rozet` DURUM söyler ("Aktif"), bu TÜR söyler
   ("SAYFA" · "SSS" · "DUYURU") ve moderasyon/onay kuyruklarında
   satırın ne hakkında olduğunu tek bakışta verir. */
.tur-rozeti{
  display:inline-flex; align-items:center; gap:var(--bosluk-7);
  padding:var(--bosluk-5) var(--bosluk-10);
  border-radius:var(--yuvarlak-sm);
  /* 🔴 METİN OLARAK DA `--aksan` OLAMAZ — §8'deki kararın ayna yüzü.
     Orada aksan ZEMİNDİ, burada METİN; gerekçe aynı, çünkü token şerhi
     "vurgu, ikon, çip, odak halkası" diyor ve 11px büyük harfli tür
     adı bunların hiçbiri değil: kaydın kategorisini taşıyan METİN.
     WCAG'ın muafiyetleri büyük metin (≥18.66px kalın), süs metni ve
     logotiptir; 11px kalın hiçbirine girmez.
     ⚠ Yıkama YARI SAYDAM — tokeni tek başına ölçmek 1.00 verir. Ölçü
     ata zincirinde birleştirilmiş ÇİZİLMİŞ zemine göre, @1440:
       aksan      fit 3.07 · diet 3.26 · gastro 3.86 · gourmet 7.45
       koyu adım  fit 4.77 · diet 4.72 · gastro 5.09 · gourmet 9.21  ✅ */
  background:var(--aksan-yikama-10); color:var(--aksan-koyu);
  font-size:var(--yazi-11); font-weight:var(--agirlik-kalin);
  letter-spacing:var(--aralik-versal); text-transform:uppercase;
  white-space:nowrap;
}
/* Nötr kip — türün marka anlamı yoksa (sistem kayıtları). */
.tur-rozeti.notr{ background:var(--durum-kapali-zemin); color:var(--durum-kapali-metin); }

/* ── PANEL FORM GİRDİSİ · §3'ün ADMIN KİPİ ───────────────────────────
   Ölçüm §3 `.alan-girdi` ile 5/21 ayırdı ve ayrımın tamamı İKİ kalemde:
       zemin  donör BEYAZ      ↔  kanon `--zemin`
       dolgu  donör `0 14px`   ↔  kanon `13px 15px`
   Gerekçesi bağlam: public form KÂĞIT üstünde yaşıyor (girdi gri zeminle
   ayrışıyor), admin formu KART içinde yaşıyor ve kart zaten kâğıt —
   gri girdi orada kirli görünüyor, kenar ayrımı yapıyor.
   ⚠ `min-height:44px` KANONDAN KALIYOR. Donörün kutusu da 44px ama
     `height` ile geliyor, `min-height` ile değil; içerik büyüyünce
     donörünki taşar, kanonunki uzar. Kanon WCAG hedefini yazan tarafta
     kalır (envanter §2.2'nin kaydı). */
/* 🔴 `background` KISAYOLU → `background-color` · ÖLÇÜLDÜ 2026-09-05.
   Kısayol, kısaltmadığı her alt özelliği BAŞLANGIÇ DEĞERİNE döndürür.
   `.alan-secim`in taban kuralı açılır OKU `background-image` ile çiziyor
   (+ `background-repeat/position/size`); bu satır kısayolla yazıldığı
   için okun görselini SİLİYORDU. `padding:0 14px` de okun yeri için
   ayrılmış `padding-right:var(--bosluk-40)`ı eziyordu. Sonuç: seçim
   kutusu bir metin girdisinden ayırt edilemiyordu.
     ÖLÇÜM (1440 · ?auth=1 · hesaplanmış değer)
       Gastro g-hesabim   panel/form kapsamında 17 select · OKU YOK 17 🔴
       FIT    fit-hesabim AYNI 17 select        · OKU YOK  0  ✅
     FIT'te kusur YOK çünkü o sayfa kanon yaprağını yüklemiyor; kural
     yalnız kanonu yükleyen kulvarda ısırıyor. Yani bu bir DONÖR farkı
     değil, KANON KUSURU — ve kanon düzeltilir, sayfaya ezme kuralı
     yazılmaz (KOPYALAMA-KURALI, "KANONA DOKUNMA KURALI").
   ⚠ Kuralın KENDİ AMACI korundu: kart içindeki girdi KÂĞIT zeminli ve
     yatay dolgusu 14px. Değişen tek şey, amacın yanında istemeden
     silinen iki alt özelliğin ayakta kalması. */
.kart.panel .alan-girdi,.kart.panel .alan-secim,
.form-duzen .alan-girdi,.form-duzen .alan-secim{
  padding:0 var(--bosluk-14); background-color:var(--kagit);
}
/* Seçim kutusunda okun YERİ de korunur — yatay dolgu kuralı sağ tarafı
   14px'e indiriyor ve ok metnin üstüne biniyordu. */
.kart.panel .alan-secim,.form-duzen .alan-secim{
  padding-right:var(--bosluk-40);
}
.kart.panel .alan-metin,.form-duzen .alan-metin{
  padding:var(--bosluk-12) var(--bosluk-14); background:var(--kagit);
}


/* ───────────────────────────────────────────────────────────────────────
   75i · DAR EKRAN DALI
   ---------------------------------------------------------------------
   Kaynağın kendi kırılımları ölçüldü (`fit-admin.css:770-774`): tablo
   hücrelerinin yatay dolgusu 22→16, dikey 14→11.
   ⚠ Kanonun kendi kırılım noktaları `tokenlar.css §13`te belgeli ve
     `@media` koşulunda token okunamadığı için sabit yazılır — kaynak da
     böyle yapıyor.
   ─────────────────────────────────────────────────────────────────────── */

@media (max-width:1100px){
  /* Menü çekmeceye döner; ray kalır. Kabuk JS'i `.panel-acik` sınıfını
     `body`ye ekler — §64 mobil çekmecenin kendi deseni. */
  /* 🔴 ÖTELEME MENÜNÜN GENİŞLİĞİ DEĞİL, SOL KENARINDAN İTİBAREN OLMALI.
     `translateX(-100%)` menünün KENDİ genişliği kadar (−264px) öteliyor,
     ama menünün doğal `left`i 76px (rayın genişliği) — toplam −188, yani
     kapalı çekmecenin **76px'i ekranda kalıyor** ve içeriğin sol şeridini
     örtüyor. Yatay taşma vermiyor (`position:fixed`), o yüzden hiçbir
     taşma ölçümüne görünmedi.
     ÖLÇÜLDÜ @390: left 76 · transform matrix(…,−264,0) · sağ kenar +76.
     İKİ PANELDE DE: `adm-genel` FIT'te, revenge-56 Gastro'da bağımsız
     ölçtü, iki sayı birebir aynı. Doğrusu ray+menü kadar: −340px. */
  .panel-menu{ transform:translateX(calc(-100% - 76px)); transition:transform var(--sure) var(--yumusama); }
  body.panel-acik .panel-menu{ transform:none; }
  /* Çekmece perdesi — açıkken arkaya tıklayınca kapanır.
     ⚠ YENİ AD AÇILMADI: perde rengi kanonda ZATEN `--perde` (§64
     `.cekmece-ortu` onu kullanıyor). İlk yazımda `--koyu-ortu` diye
     ikinci bir ad uydurulmuştu ve denetim onu "fallback'li ama boş yuva"
     diye yakaladı — `--kat-alt-cubuk` ihlalinin bu turdaki üçüncü
     tekrarı. Kural yine aynı: token yazmadan önce kanon taranır. */
  body.panel-acik::after{
    content:""; position:fixed; inset:0; z-index:calc(var(--kat-ray) - 1);
    background:var(--perde);
  }
  .panel-govde{ margin-left:76px; }
  .panel-ust{ left:76px; }
  /* Menünün tek kapısı — çubuğun EN SOLUNDA, okuma yönünde ilk kalem. */
  .panel-ust > .panel-ac{ display:flex; order:-1; }
  .form-duzen,.form-duzen.pano{ grid-template-columns:minmax(0,1fr); }
  .form-yan{ position:static; }
}

@media (max-width:640px){
  .panel-ray{ display:none; }
  .panel-govde{ margin-left:0; }
  .panel-ust{ left:0; padding:0 var(--bosluk-16); }
  /* 🔴 AD DEĞİŞİKLİĞİNİN ARDI BIRAKILMIŞ. Bu satır `.panel-ust-arama`
     yazıyordu; kalem `.panel-arama`ya çevrilince (bağlamdan bağımsız ad,
     §75b) DAR EKRAN DALI GÜNCELLENMEDİ ve kural sessizce ölü kaldı.
     Ölçüldü @390: üst çubuk araması 90×44 — okunamayacak kadar dar ama
     hâlâ basılıyordu. Yeniden adlandırmanın klasik bedeli; kanonun kendi
     `--kurumsal-yesil` şerhiyle aynı aile.
     ⚠ Kapsam `.panel-ust` içine yazılı: süzgeç şeridindeki arama dar
       ekranda KALIR, orada tek arama yüzeyi odur. */
  .panel-ust .panel-arama{ display:none; }   /* arama açılır kipe düşer */
  /* 🔴 HESAP DÜĞMESİ 64px'LİK ÇUBUĞU TAŞIRIYORDU — ölçüldü @390:
     140×**72** (ad üç satıra sarıyor, rol alt satıra iniyor). Dar ekranda
     kimlik AVATARA iner; ad ve rol açılırın başlığında zaten yazılı,
     yani bilgi kaybolmuyor, yalnız yeri değişiyor. */
  .panel-ust-ben > span:not(.kisi-avatar),
  .panel-ust-ben > i{ display:none; }
  .panel-ust-ben{ padding:var(--bosluk-6); }
  .panel-sayfa{ padding:88px var(--bosluk-16) var(--bosluk-40); }
  .panel-bas h1{ font-size:var(--yazi-20); }
  /* Kaynağın kendi dar dolguları — ölçüldü, yuvarlanmadı. */
  .tablo.panel th,.tablo.panel td{ padding-top:var(--bosluk-11); padding-bottom:var(--bosluk-11); }
  .tablo.panel th:first-child,.tablo.panel td:first-child{ padding-left:var(--bosluk-16); }
  .tablo.panel th:last-child, .tablo.panel td:last-child { padding-right:var(--bosluk-16); }
  .suzgec-cubuk{ padding:var(--bosluk-14) var(--bosluk-16); gap:var(--bosluk-10); }
  .suzgec-cubuk .arama-kutu{ max-width:none; }
  .suzgec-cubuk .sag{ margin-left:0; width:100%; }
  .sayfalama.kart-ayagi{ padding:var(--bosluk-12) var(--bosluk-16); }
  /* Sayfalama dar ekranda ALT ALTA — `space-between` iki kalemi uçlara
     iter ve 390px'te bilgi satırı kırılır. */
  .sayfalama.kart-ayagi{ justify-content:center; }
  .sayfalama-bilgi{ width:100%; text-align:center; }
  .toplu-islem{ padding:var(--bosluk-12) var(--bosluk-16); }
  .toplu-islem .eylem-satiri{ margin-left:0; width:100%; }
  .form-bolum{ padding:var(--bosluk-16); }
  .kart.panel > .kart-alt.form-eylem{ padding:var(--bosluk-16); }
  .kart.panel > .kart-alt.form-eylem > .dugme{ flex:1 1 auto; }
  .duzenleyici-yuzey{ min-height:280px; }
  .acilir-yuzey{ max-height:60vh; }
}

/* 🔴 K-G3 · SAYDAM HEADER → BEYAZ KELİME MARKASI — Beyar izni, 2026-09-04.
   §27b sözleşmeyi PROZADA yazıyor ama CSS karşılığı YOKTU; `at-top`
   durumunu hedefleyen tek bir kural bile bulunmuyordu. Sonuç ölçüldü:
   dört markanın da saydam header'ında logo MARKA RENGİNDE basılıyor,
   oysa sözleşme beyaz diyor.
     SAYDAM header (koyu hero üstünde) → kelime markası BEYAZ
     SOLID header (kaydırınca)         → MARKA RENGİ  (taban kural)
     İSTİSNA — kimlik ekranı (giriş/kayıt): saydamda BİLE marka rengi
   ⚠ İstisnanın kancası GÖVDEDE DEĞİL sayfanın statik niteliğinde:
     §27b'nin şerhi gövdeye nitelik koymanın işe yaramadığını ölçmüş
     (sayfa betiği `<body>` niteliklerini baştan yazıyor). Burada
     kullanılan `data-*-page` niteliği statik markup'ta duruyor. */
.header.at-top .fit-word-mark,
.kabuk-basi.tepede .fit-word-mark{ color:var(--kagit); }
body[data-gastro-page="giris"] .header.at-top .fit-word-mark,
body[data-fit-page="giris"]    .header.at-top .fit-word-mark{ color:var(--marka); }
