/* ==========================================================================
   kabuk.css — ÜRÜNE ÖZGÜ EKLER

   🔴 NEDEN AYRI DOSYA, NEDEN app.css'e EKLENMİYOR:
   app.css prototipten SADIK BİR KOPYADIR ve öyle kalmalı —
   TasarimSistemiTestleri iki dosyayı karşılaştırıp marka sapmasını ölçüyor.
   Ürünün ihtiyaç duyduğu ama prototipte karşılığı olmayan sınıflar buraya
   yazılır; böylece "kopya mı yoksa yeni mi" sorusu dosya adından cevaplanır.

   ⚠️ BURAYA YAZILAN HER SINIF, PROTOTİPTE OLMAYAN BİR DURUMU ANLATIR.
   Prototip 33 sayfanın hepsi yazılmış hâlini gösteriyordu; ürün ise modül
   modül ilerliyor ve "bu ekran henüz yok" diye bir hâli var.
   ========================================================================== */

/* --------------------------------------------------------------------------
   K15 (kullanıcı talebi 2026-10-20, ekran görüntüsüyle) — TARAYICININ ÇİZDİĞİ
   DENETİMLER TEMAYA UYSUN

   color-scheme yoktu: koyu temada tarayıcı kaydırma çubuğunu (ve form
   denetimlerinin yerleşik parçalarını, açılır listeleri) AÇIK renkte, kalın
   çiziyordu. Şimdi tema tarayıcıya söyleniyor ve çubuk ince; tutamaç
   --metin-3, iz saydam. Tutamaç zeminle ve yüzeyle iki temada da ≥ 3:1
   (WCAG 1.4.11 — açık 3,01–3,21 · koyu 3,8–4,5; --cizgi-guclu koyu temada
   1,5'te kalıyordu). Ölçüt kaydirma-cubugu tarayıcı paketinde.

   scrollbar-color MİRAS alınır (kökte bir kez); scrollbar-width alınmaz,
   bu yüzden her öğeye (*) — kendi değerini veren sınıf kuralı (ör.
   .ig-kaydirici__serit { scrollbar-width: none }) özgüllüğüyle onu ezer.
   data-tema html'in kendisinde: [data-tema="koyu"] kökü de seçiyor, yani
   var(--metin-3) kökte koyu temanın değeriyle çözülüyor.
   -------------------------------------------------------------------------- */
:root { color-scheme: light; scrollbar-color: var(--metin-3) transparent; }
[data-tema="koyu"] { color-scheme: dark; }
* { scrollbar-width: thin; }

/* --------------------------------------------------------------------------
   HENÜZ YAZILMAMIŞ MENÜ MADDESİ

   Bağlantı DEĞİL <span> olarak çiziliyor (bkz. _Kenar.cshtml): tıklanamaz,
   sekmeyle odaklanılamaz, ekran okuyucuya bağlantı diye duyurulmaz.
   Görsel olarak da farklı olmalı — aynı görünüp tıklanmayan bir madde,
   kullanıcının bozuk sandığı bir arayüz üretir.
   -------------------------------------------------------------------------- */
.kenar__link--yakinda {
  /* K22 (2026-10-23): opacity .55 kalktı — soluk metin AA'nın altındaydı (2,16) ve bu bir kontrol değil, WCAG'nin "etkin olmayan
     kontrol" istisnası uymuyor. Durumu "Yakında" rozeti söylüyor; renk üçüncül metin (iki temada AA). */
  color: var(--metin-3);
  cursor: default;
}

.kenar__link--yakinda:hover {
  /* Vurgu YOK: hover tepkisi "tıklanabilir" sinyalidir ve burada yalan olur. */
  background: transparent;
  color: inherit;
}

.kenar__link--yakinda .kenar__rozet {
  /* Modül numarası rozeti: "yakında" demek yetmez, NE ZAMAN sorusunun
     cevabı da ekranda olmalı (Faz 4'ün "neden kapalı ve nerede açılıyor"
     kuralının menüdeki hâli). */
  margin-inline-start: auto;
  font-size: 10px;
  letter-spacing: .03em;
  font-family: var(--font-mono);
}

/* Kenar çubuğu kredi kutusu (.kenar__kredi) 2026-10-20'de KALDIRILDI — kullanıcı kararı (K16): yerine menüde "Kullanım"
   sayfası (Plan/paket-kullanim-tanitim.md). */

/* --------------------------------------------------------------------------
   AÇILIR MENÜNÜN BOŞ DURUMU

   Bildirim menüsü bugün boş (kayıtlar Modül 18). Boş bir kutu açmak
   "bozuk mu?" sorusunu doğurur; boş durum NE OLDUĞUNU ve NE ZAMAN
   dolacağını söylemeli — prototipin Faz 7'de kapattığı "sessiz boş durum"
   bulgusunun aynısı.
   -------------------------------------------------------------------------- */
.menu__bos {
  padding: var(--b-3) var(--b-4) var(--b-4);
  font-size: var(--ts-sm);
  color: var(--metin-2);
  line-height: 1.5;
  max-width: 260px;
}

.menu__bos .minik {
  display: block;
  margin-top: 4px;
}

/* PLAN 6.15 DİLİM 4 — zil menüsündeki işlem mesajı ("tümünü okundu say" sayfa yenilenmeden). Menü dar; kutu
   menünün başlığıyla aynı iç boşlukta ve boş durum metninin genişliğinde kalıyor. */
.menu__mesaj {
  padding: var(--b-1) var(--b-2) 0;
  max-width: 280px;
}

/* --------------------------------------------------------------------------
   ÜST BARDAKİ TEMA FORMU

   Tema düğmesi bir <form> içinde (JavaScript kapalıyken de çalışsın diye).
   Form varsayılan olarak blok öğedir ve üst bar hizasını bozar.
   -------------------------------------------------------------------------- */
.ust__sag form {
  display: inline-flex;
  margin: 0;
}

/* --------------------------------------------------------------------------
   TEMA İKONU

   İki ikon da çiziliyor, görüneni CSS seçiyor (bkz. _UstBar.cshtml).
   Böylece ikon temayla AYNI ANDA değişiyor; JavaScript'in SVG kurması
   gerekmiyor ve anti-flash bloğuyla çelişki doğmuyor.

   Koyu temadayken "güneş" (açığa geç), açık temadayken "ay" (koyuya geç).
   -------------------------------------------------------------------------- */
.tema-ikon { display: none; }

[data-tema="koyu"] .tema-ikon--gunes { display: inline-flex; }
[data-tema="acik"] .tema-ikon--ay    { display: inline-flex; }

/* data-tema hiç yoksa (JS ve çerez ikisi de devre dışı) bir ikon görünmeli;
   aksi hâlde düğme bomboş bir kare olur. */
html:not([data-tema]) .tema-ikon--gunes { display: inline-flex; }

/* Giriş ekranının dil seçicisi. Kartın ÜSTÜNDE ve sağa yaslı: formun
   akışını kesmiyor ama arayanın ilk baktığı yerde (sağ üst) duruyor —
   kabuktaki dil düğmesiyle aynı konum alışkanlığı. */
.auth__dil {
  display: flex;
  gap: var(--b-1);
  justify-content: flex-end;
  margin-bottom: var(--b-3);
}

.auth__dil [aria-current="true"] {
  color: var(--marka-metin);
  font-weight: 600;
}

/* ---------- MODUL 9: sunucu tarafinda cizilen sekmeler ----------
   app.css `.sekme[aria-selected="true"]` bekliyor cunku prototipte sekmeler
   JS ile yonetilen <button role="tab"> ogeleriydi. Uründe sekme bir
   BAGLANTI (?sekme=... ile derin baglantilanabiliyor ve geri tusu calisiyor)
   ve bir <a> uzerinde aria-selected GECERSIZ ARIA'dir; dogrusu
   aria-current="page".

   Kural bu dosyaya yazildi: app.css SADIK KOPYA'dir ve TasarimSistemiTestleri
   onu prototiple karsilastiriyor. Urune ozgu ekler daima buraya. */
.sekme[aria-current="page"] {
  color: var(--marka-metin);
  border-bottom-color: var(--marka);
}

/* ---------------------------------------------------------------------------
   <select> GENISLIGI — Modul 19 satir 4'te OLCULEREK bulundu.

   Tasarim sisteminde `.secim` bir KART/CIP stilidir (display:flex, .secili
   durumu, cursor:pointer) ve prototipte tiklanabilir secim kartlarina
   uygulaniyor. Urun onu <select> ogelerine de giydiriyor (Fatura, Paketim ve
   simdi /sistem/kullanicilar) ama `.secim` GENISLIK VERMIYOR — kardesi
   `.girdi` ise `width:100%` tasiyor.

   Bir <select>'in icsel genisligi EN UZUN <option>'una gore hesaplanir. Sabit
   secenekli sureclerde (yil, durum) bu gorunmez; VERIDEN TURETILEN
   seceneklerde (kiraci adlari) gorunur hale gelir.

   OLCULDU: /sistem/kullanicilar ekraninda kiraci suzgeci 1550px genisleyip
   belgeyi 1043px tasirdi. Izgara hucresi `min-width:0` tasidigi halde tasma
   olustu, cunku sorun hucrenin kuculememesi degil COCUGUN buyumesiydi.

   `app.css` SADIK KOPYA oldugu icin duzeltme buraya yazildi. Kural yeni degil:
   ayni ayrim `.sekme[aria-current]` icin de uygulandi (yukarida).
   --------------------------------------------------------------------------- */
select.secim {
  width: 100%;
  max-width: 100%;
}

/* ==========================================================================
   KAMUYA AÇIK BELGE KABUĞU — gizlilik politikası ve kullanım şartları

   🔴 BURAYA YAZILIYOR, app.css'e DEĞİL: app.css prototipin SADIK KOPYASI ve
   düzenlenmiyor (Modül 6'nın kuralı). Bu sınıflar ürüne özgü.

   ⚖️ Okuma genişliği 72ch: uzun hukuki metin tam genişlikte satırlarda
   okunmaz. Ölçüt tipografi kaynaklarının standart aralığı (60-80 karakter).
   ========================================================================== */
.belge { min-height: 100vh; display: flex; flex-direction: column; background: var(--zemin); }

.belge__tepe {
  display: flex; align-items: center; justify-content: space-between; gap: var(--b-4);
  padding: var(--b-4) var(--b-5); border-bottom: 1px solid var(--cizgi);
  background: var(--yuzey); flex-wrap: wrap;
}
.belge__marka { display: inline-flex; align-items: center; text-decoration: none; color: var(--metin); }
.belge__dil { display: flex; gap: 6px; }

.belge__govde {
  flex: 1 1 auto; width: 100%; max-width: 72ch;
  margin-inline: auto; padding: var(--b-8) var(--b-5) var(--b-8);
}
/* 🔴 BELGE TİPOGRAFİSİ YALNIZ DOĞRUDAN ÇOCUKLARA (`>`) — ölçülmüş bir kusurun kapatılması (2026-09-30).
   Önceki alt öğe seçicileri (`.belge__govde h2`) aynı kabuğu kullanan GİRİŞSİZ SAYFALARA da uygulanıyordu:
   onay sayfasında (M13'ten beri canlıda) ve kurulum linkinde her kart başlığı 32 px fazladan üst boşluk
   alıyor, karşılama paragrafı ise `.karsilama p`'nin açık rengi yerine gri (`--metin-2`) çiziliyordu —
   aynı özgüllük, kabuk.css sonra yüklendiği için belge kuralı kazanıyordu. Kusuru hiçbir tarayıcı kontrolü
   görmedi, EKRAN GÖRÜNTÜSÜ gördü. Belgelerin öğeleri <main>'in doğrudan çocukları; kartların ve karşılamanın
   öğeleri değil. Belgelerin hesaplanmış stilinin DEĞİŞMEDİĞİ iki dilde, öğe öğe ölçüldü. */
.belge__govde > h1 { margin: 0 0 var(--b-3); }
.belge__govde > h2 {
  margin: var(--b-8) 0 var(--b-3); font-size: var(--ts-lg); line-height: var(--lh-lg);
  padding-top: var(--b-4); border-top: 1px solid var(--cizgi);
}
.belge__govde > h2:first-of-type { border-top: 0; padding-top: 0; }
.belge__govde > p { margin: 0 0 var(--b-3); color: var(--metin-2); }
/* 🔴 list-style ACIKCA yaziliyor: app.css listeleri sifirliyor ve imsiz bir
   liste hukuki metinde SAYILABILIRLIGI kaybettirir ("asagidaki uc sarttan
   biri" diyen bir madde, imler olmadan dogrulanamaz). */
.belge__govde > ul { margin: 0 0 var(--b-3); padding-inline-start: var(--b-6); color: var(--metin-2); list-style: disc; }
.belge__govde > ul > li::marker { color: var(--metin-3); }
.belge__govde > ul > li { margin: var(--b-2) 0; }
/* Numaralı liste — sıranın anlam taşıdığı yerde (geliştirici sayfasında sahne isteminin parçaları, 2026-10-18). */
.belge__govde > ol { margin: 0 0 var(--b-3); padding-inline-start: var(--b-6); color: var(--metin-2); list-style: decimal; }
.belge__govde > ol > li::marker { color: var(--metin-3); }
.belge__govde > ol > li { margin: var(--b-2) 0; }
/* Plan 23.8 — geliştirici sayfası (/developer): adım başlıkları, bilgi kutusu, komut örnekleri ve değer tabloları da
   <main>'in doğrudan çocukları (yukarıdaki kural). Komut bloğu kendi içinde yatay kayar (.kod), sayfa taşmaz. */
.belge__govde > h3 { margin-block: var(--b-6) var(--b-2); font-size: var(--ts-md); line-height: var(--lh-md); }
.belge__govde > .gelistirici__kapsam,
.belge__govde > .gelistirici__claude,
.belge__govde > .tablo-sar,
.belge__govde > .gelistirici__ornek { margin-block: 0 var(--b-4); }
/* Konumlandırma D1 — Claude kutusunun iç paragrafları ve istem bloğu (kutu <main>'in çocuğu, içi belge tipografisinin dışında). */
.gelistirici__claude p { margin-block: 0 var(--b-3); }
.gelistirici__claude > .kutu__ic > .kod { margin: 0; }
/* Kutudaki bağımsız bağlantılar (llms-full · OpenAPI): dokunma hedefi en az 24 px (WCAG 2.5.8; a11y denetimi 307×17 ve 140×17 ölçtü). */
.gelistirici__claude li > a { display: inline-flex; align-items: center; min-height: 24px; }
.gelistirici__ornek > .kod { margin: 0; }
.gelistirici__kopyala { margin-block-start: var(--b-2); }
/* Değer tabloları alt alta: sütunlar her tabloda aynı genişlikte (göz sütunu izleyebilsin). */
.gelistirici__degerler { width: 100%; table-layout: fixed; }

/* Plan 23.9 — altbilgideki ClientPoster sosyal hesapları (_SosyalHesaplar): yalnız ikon; dokunma hedefi 32 px (WCAG 2.5.8 ≥ 24),
   renk metin tonunda (logolar currentColor), üzerine gelince öne çıkar. */
.sosyal-baglantilar { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--b-1); margin-block: var(--b-3); }
.sosyal-baglantilar a {
  display: inline-flex; align-items: center; justify-content: center; inline-size: 32px; block-size: 32px;
  border-radius: var(--r-md); color: var(--metin-3); text-decoration: none;
}
.sosyal-baglantilar a:hover,
.sosyal-baglantilar a:focus-visible { color: var(--metin); background: var(--yuzey-2); }

/* Künye — tanım listesi görünümü */
.belge__kunye {
  background: var(--yuzey); border: 1px solid var(--cizgi); border-radius: var(--r-lg);
  padding: var(--b-4); margin: var(--b-4) 0;
}
.belge__kunye div { display: flex; gap: var(--b-3); padding: 5px 0; flex-wrap: wrap; }
.belge__kunye dt { flex: 0 0 auto; min-width: 160px; color: var(--metin-3); font-size: var(--ts-sm); margin: 0; }
.belge__kunye dd { margin: 0; flex: 1 1 220px; min-width: 0; }

.belge__dip {
  border-top: 1px solid var(--cizgi); padding: var(--b-4) var(--b-5);
  text-align: center; color: var(--metin-3); font-size: var(--ts-sm);
}
.belge__dipAyrac { margin: 0 var(--b-2); color: var(--cizgi-guclu); }
/* Beş belge bağlantısı dar ekranda satıra sarıyor; bağlantının KENDİSİ bölünmesin ("Kullanım / Şartları" — 390 px
   ekran görüntüsü). */
.belge__dip a { white-space: nowrap; }

/* Ödeme logoları bandı — iyzico üye işyeri kriteri (_OdemeLogolari, Plan/iyzico-site-kriterleri.md). Koyu temada
   beyaz bant, açık temada renkli; data-tema yoksa koyu (tema ikonunun deseni). Genişlik sabit, yükseklik orandan;
   dar ekranda kabına sığar ve oran bozulmaz. */
.odeme-bandi { display: flex; justify-content: center; margin-block-start: var(--b-3); }
.odeme-bandi__gorsel { display: none; width: 21rem; max-width: 100%; height: auto; }
[data-tema="koyu"] .odeme-bandi__gorsel--koyu,
html:not([data-tema]) .odeme-bandi__gorsel--koyu,
[data-tema="acik"] .odeme-bandi__gorsel--acik { display: block; }

@media (max-width: 560px) {
  .belge__govde { padding: var(--b-5) var(--b-4) var(--b-8); }
  .belge__kunye dt { min-width: 0; flex: 1 1 100%; }
}

/* --------------------------------------------------------------------------
   WCAG 2.5.8 — BAĞIMSIZ KİMLİK BAĞLANTILARININ DOKUNMA HEDEFİ
   --------------------------------------------------------------------------
   Modül 21 satır 6'da ölçüldü: "Şifremi unuttum" 91×18, "Girişe dön" 58×16 —
   ikisi de 24px'lik asgari hedefin altında. Sebep `.kucuk` sınıfının yazıyı
   küçültmesi; genişlik zaten yeterliydi, eksik olan YÜKSEKLİKTİ.

   ⚖️ `.auth__kart a` gibi geniş bir seçici KULLANILMADI: o, cümle içine gömülü
   bağlantıları da blok hâline getirirdi. WCAG 2.5.8'in satır içi istisnası tam
   olarak onları muaf tutuyor — geniş seçici, kuralın muaf tuttuğu şeyi bozardı.

   ⚖️ Kural `kabuk.css`'te, `app.css`'te DEĞİL: app.css prototipin SADIK
   KOPYASI ve ürüne özgü ekler buraya yazılır (Modül 6'nın kuralı).
   -------------------------------------------------------------------------- */
.auth__baglanti {
  display: inline-flex;
  align-items: center;
  min-height: 24px;
}

/* --------------------------------------------------------------------------
   MODUL 12 — icerik uretim sihirbazi.

   Iki sinif da URUNE OZGU ve bu yuzden kabuk.css'te: app.css prototipin
   SADIK KOPYASI (Modul 6'nin kurali).

   KUNYE — sade tanim listesi (dt/dd), sarmalayici div ISTEMEZ.
   Kardesi `.belge__kunye` ONCEDEN VARDI ama yapisi FARKLI: orada dt/dd
   ciftleri birer <div> icinde. Ikisini birlestirmek Belge gorunumlerini
   (31 tarayici kontrolu) degistirmek demekti; ayri tutuldu ve gerekce
   burada yazili.
   -------------------------------------------------------------------------- */
/* --------------------------------------------------------------------------
   IZGARA--OTO — KOSULLU KARTLARI YAN YANA KOYMAK ICIN.

   `.izgara--2` SABIT iki sutundur: ikinci kart kosullu (@if) ve o kosul
   tutmuyorsa sag yari BOS kalir — yani duzeltmeye calistigimiz kusurun
   aynisini uretir. `auto-fit` tek karti tam genislige yayar, iki karti
   ikiye boler.

   340px esigi olculdu: altinda kart govdesindeki form alanlari (etiket +
   girdi + ipucu) sikisiyor. 1150px'lik icerik kabinda 2 sutun, 680px'te
   kendiliginden 1 sutun — medya sorgusu GEREKMIYOR.

   ⚠️ Izgaraya giren karttan `y-alt-5` KALDIRILIR: `.izgara` zaten `gap`
   veriyor, ikisi birlikte cift bosluk yapar. Bosluk sarmalayiciya tasinir.
   -------------------------------------------------------------------------- */
.izgara--oto {
  grid-template-columns: repeat(auto-fit, minmax(340px, 1fr));
}
/* ⚠️ `align-items` YAZILMIYOR — varsayilan `stretch` kartlari ayni yuksekliğe
   getiriyor. `start` denendi ve kisa kartin ALTINDA ~350px cıplak zemin
   birakti (ekran goruntusu gosterdi): duzeltilmeye calisilan bosluk
   sagdan SOL ALTA tasinmis olurdu. */

/* ANA + YAN SUTUN — sihirbazin 3. adimi icin.
   Solda kullanicinin YAZDIGI sey (brief, ek not, tipe ozel secimler),
   sagda BAGLAM (musterinin marka rehberi). Esit iki sutun olmaz: brief
   4000 karakterlik bir metin alani, rehber salt okunur bir liste.
   1100px alti tek sutun — tasarim sisteminin MEVCUT kirilma noktasi,
   yeni bir esik uydurulmadi. */
.izgara--ana-yan { grid-template-columns: 2fr 1fr; align-items: start; }
/* Izgara cocugunun varsayilani `min-width: auto`: genis bir tablo ya da
   uzun bir kelime sutunu asip BELGEYE yatay kaydirma ekler (kayitli tuzak). */
.izgara--ana-yan > div { min-width: 0; }
@media (max-width: 1100px) { .izgara--ana-yan { grid-template-columns: 1fr; } }

/* Izgaraya giren form alani KENDI alt boslugunu birakir: `.izgara` zaten
   `gap` veriyor, `.alan`'in `margin-bottom`'u ile birlikte cift bosluk
   yapardi. Yatay gap korunuyor, dikey tekrar kalkiyor. */
.izgara > .alan { margin-bottom: 0; }

/* IZGARA--SON-TAM — TEK KALAN SON KART IKI SUTUNU KAPLAR (olculdu 2026-09-24).
   app.css `.izgara--3`'u 1100px altinda IKI sutuna indiriyor. Uc varyant o
   bantta 2 + 1 diziliyor ve ucuncusu sol yarida TEK BASINA kaliyor: gercek
   bir AI iceriginde (claude-sonnet-5, 3 varyant) 1024px'te satirin yalniz
   %49'u dolu, sag yarida ~450px bos zemin. Kusur alan duzenlemesinden ONCE
   de vardi (app.css'ten miras), yani gerileme degil, duzeltilmemis bir ornek.

   ⚖️ GENEL `.izgara--3` KURALI DEGIL: sinif 15 yerde kullaniliyor, aralarinda
   formlar ve ilan galerisi var — galerideki son tek ilanin tam genislige
   yayilmasi yanlis olurdu. Isaret yalniz HER ZAMAN uc kart tasiyan iki varyant
   izgarasinda (icerik detayi + AI sonuc ekrani).

   🔴 MEDYA SORGUSU app.css'in ESIGIYLE AYNI ve zorunlu: uc sutunda ucuncu kart
   da "son ve tek" sayilir, kural orada gecerli olsaydi onu YENI BIR SATIRA
   itip tam genislige yayardi. 680px altinda tek sutun zaten tam genislik. */
@media (max-width: 1100px) {
  .izgara--son-tam > :last-child:nth-child(odd) { grid-column: 1 / -1; }
}

/* URETIM BEKLEME PENCERESI (kullanici talebi 2026-09-24).
   app.css'in `.modal` kutusu yerel <dialog> ile kullaniliyor: showModal() odagi
   pencereye hapsediyor ve arka plani etkisiz birakiyor — elle yazilmis bir
   perde bunu vermezdi.

   🔴 `:not([open])` ZORUNLU: `.modal` bir `display: flex` tasiyor ve yazar
   kurali tarayicinin kapali dialog gizlemesini EZER (kayitli "[hidden]'i ezer"
   tuzaginin <dialog> hali) — pencere sayfa acilir acilmaz gorunurdu.
   Tarayicinin dialog kenarligi, dolgusu ve rengi sifirlaniyor; perde rengi
   app.css'in `.modal-perde`siyle ayni.

   🔴 `margin: auto` ZORUNLU (olculdu 2026-09-24): app.css'in `* { margin: 0 }`
   sifirlamasi tarayicinin dialog'u ORTALAYAN margin'ini eziyor ve pencere sol
   uste yapisiyordu (kutu 0,0 · 520x582). 28 yesil kontrolun hicbiri gormedi,
   ekran goruntusu gordu — paket artik ortalamayi da olcuyor. */
dialog.modal { margin: auto; border: 0; padding: 0; color: var(--metin); }
dialog.modal:not([open]) { display: none; }
dialog.modal::backdrop { background: rgba(16, 24, 40, .55); }

/* DONEN GOSTERGE — tasarim sisteminde yoktu. Hareket azaltma tercihinde durur. */
.donen {
  flex: none;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 3px solid var(--cizgi);
  border-top-color: var(--marka);
  animation: donme 0.9s linear infinite;
}
@keyframes donme { to { transform: rotate(360deg); } }
@media (prefers-reduced-motion: reduce) { .donen { animation: none; } }

/* "Bu sirada" listesi — B1: ISARETSIZ, sunucu asama bildirmiyor. */
.bekleme-adimlar {
  margin: var(--b-2) 0 0;
  padding-inline-start: var(--b-5);
  display: grid;
  gap: var(--b-1);
  list-style: disc;
}

.kunye {
  margin: 0;
  padding: 0;

  /* COK SUTUN — SARMALAYICI <div> EKLEMEDEN (olculdu 2026-09-24).
     Kunye 7 gorunumde toplam 54 dt/dd cifti tasiyor ve HICBIRINDE sarmalayici
     yok (yukaridaki nota bak); grid'e gecmek o 54 yere <div> eklemek demekti.
     `columns` ayni kazanci gorunumlere HIC dokunmadan veriyor.

     OLCULDU (Chromium, Detay'in gercek 14 cifti):
       1440px  892 -> 300px  (%66)  4 sutun
       1100px  892 -> 300px  (%66)  4 sutun
        680px  892 -> 486px  (%46)  2 sutun
        390px  892 -> 892px  ( %0)  1 sutun  <- mobilde TABANA BIREBIR doner

     `210px 4` = "sutun en az 210px, en fazla 4 sutun". Dar ekranda kendiliginden
     tek sutuna dustugu icin MEDYA SORGUSU GEREKMIYOR. */
  columns: 210px 4;
  column-gap: var(--b-5);
}

/* dt/dd'deki `break-*: avoid` SUS DEGIL — KONTROL GRUBUYLA OLCULDU.
   O kural olmadan 14 ciftin 2'si BOLUNUYOR: etiket bir sutunun altinda kalir,
   degeri sonraki sutunun basinda cizilir ve kullanici yanlis degeri okur.
   Ekran goruntusunde de gorundu ("Amac" 1. sutunda, "Farkindalik" 2. sutunda).
   Yalniz modern sozdizimi yaziliyor: eski `page-break-*` alias'i Chromium'da
   AYNI sonucu veriyor (olculdu), ikisini birden yazmak olu kod olurdu.
   🔴 PLAN 12.37 — DEGERIN KENDISI DE BOLUNMUYOR (`break-inside: avoid`): ozetin
   ekran goruntusunde gorsel istemi "…1200x628 yatay" 3. sutunun altinda, "banner …"
   4. sutunun basinda kaliyordu (etiket/deger ayrimiyla ayni okuma kusuru, bu kez
   degerin icinde). Uzun serbest metin (brief, gorsel stili) ayrica tam genislikte
   (`kunye__tam`); bu kural geri kalan her degerin tek sutunda kalmasini sagliyor. */
.kunye dt {
  color: var(--metin-3);
  font-size: var(--ts-sm);
  margin: 0 0 2px;
  break-after: avoid;
}

.kunye dd {
  margin: 0 0 var(--b-3);
  min-width: 0;
  overflow-wrap: anywhere;
  break-before: avoid;
  break-inside: avoid;
}

/* Form dugmelerinin satiri. `gap` ile ayriliyor; margin yerine gap,
   dugme sayisi degistiginde bosluklarin bozulmamasi icin. */
.form__eylem {
  display: flex;
  gap: var(--b-3);
  align-items: center;
  flex-wrap: wrap;
  margin-top: var(--b-5);
}

/* ── 12.9 hashtag listesi ────────────────────────────────────────────
   Rozetler sarmalı. `app.css` SADIK KOPYA olduğu için ürüne özgü bu
   kural buraya yazılıyor (Modül 6'nın kuralı).
   ⚠️ `.rozetler` diye bir sınıf app.css'te YOKTU — uydurulan sınıf hata
   vermez, SESSİZCE stilsiz render eder; ölçülerek eklendi.            */
.rozetler {
  display: flex;
  flex-wrap: wrap;
  gap: var(--b-2);
}

/* Bulgu satırları alt alta: `<span>` varsayılan inline olduğu için
   üst üste binerlerdi. Kayıtlı `.ilerleme__dolu` tuzağının aynı sınıfı
   (display:inline kalan elemana kutu kuralları HİÇ uygulanmaz).        */
.yasakli-satir {
  display: block;
}

/* ══════════════════════════════════════════════════════════════════════
   ANASAYFA — kamuya açık tanıtım sayfası
   ══════════════════════════════════════════════════════════════════════
   `app.css` SADIK KOPYA olduğu için ürüne özgü bu kurallar buraya
   yazılıyor (Modül 6'nın kuralı). Prototipte tanıtım sayfası YOK, yani
   bu düzenin kopyalanacağı bir kaynak da yok.                          */

.tanitim__tepe {
  position: sticky;
  top: 0;
  z-index: 20;
  background: var(--yuzey-2);
  border-block-end: 1px solid var(--cizgi);
}

.tanitim__tepeIc,
.tanitim__dipIc,
.tanitim__ic {
  max-width: 68rem;
  margin-inline: auto;
  padding-inline: var(--b-5);
}

.tanitim__ic--dar { max-width: 46rem; }

.tanitim__tepeIc {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--b-4);
  min-height: 4rem;
  flex-wrap: wrap;
}

.tanitim__tepeSag {
  display: flex;
  align-items: center;
  gap: var(--b-3);
  flex-wrap: wrap;
}

/* Marka işareti anasayfada <span>: bağlantı değil, çünkü zaten buradayız. */
.tanitim__marka { display: inline-flex; align-items: center; }

.tanitim__kahraman {
  padding-block: clamp(var(--b-6), 8vw, var(--b-10));
  background: var(--marka-gradyan-yazi);
  color: #fff;
}

/* 🔴 Gradyan zeminde metin rengi TOKEN'DAN GELMİYOR, açıkça beyaz:
   token'lar temaya göre değişiyor ve açık temada koyu metne dönüp
   gradyanın üstünde okunamaz hâle gelirdi.                             */
.tanitim__kahraman h1,
.tanitim__kahraman p { color: #fff; }

.tanitim__slogan {
  font-size: clamp(1.9rem, 4.5vw, 3rem);
  line-height: 1.15;
  margin: 0 0 var(--b-4);
  max-width: 34ch;
}

.tanitim__sloganAlt {
  font-size: 1.05rem;
  max-width: 56ch;
  margin: 0 0 var(--b-5);
}

.tanitim__cta {
  display: flex;
  gap: var(--b-3);
  flex-wrap: wrap;
  margin-block-end: var(--b-3);
}

.tanitim__cta--dip { margin-block-start: var(--b-5); margin-block-end: 0; }

.tanitim__bolum { padding-block: var(--b-8); }
.tanitim__bolum--vurgu { background: var(--yuzey-2); }
.tanitim__bolum h2 { margin-block-end: var(--b-5); }

.tanitim__ikon { color: var(--marka); margin-block-end: var(--b-3); }
.tanitim__ozellikBaslik { margin: 0 0 var(--b-2); font-size: 1.05rem; }

/* Beş adım — sayı sütunu + gövde. `<ol>` olduğu için sıra ekran
   okuyucuya da geçiyor; sayı görsel olarak ayrıca basılıyor.           */
.tanitim__adimlar { list-style: none; margin: 0; padding: 0; }

.tanitim__adim {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: var(--b-4);
  padding-block: var(--b-4);
  border-block-end: 1px solid var(--cizgi);
  /* min-width:0 — kayıtlı ızgara tuzağı: gövde içeriğinin altına
     küçülemeyen bir hücre belgeye yatay kaydırma ekler.                */
  min-width: 0;
}

.tanitim__adim:last-child { border-block-end: 0; }

.tanitim__adimNo {
  display: grid;
  place-items: center;
  width: 2.25rem;
  height: 2.25rem;
  border-radius: 50%;
  background: var(--marka-zayif);
  /* --marka-koyu: --marka koyu temada kendi zayıf zemininde 4,44:1 ölçüldü (anasayfa paketi, D2) — bu ton iki temada AA. */
  color: var(--marka-koyu);
  font-weight: 700;
}

.tanitim__adimGovde { min-width: 0; }

.tanitim__adimBaslik {
  display: flex;
  align-items: center;
  gap: var(--b-3);
  flex-wrap: wrap;
  margin: 0 0 var(--b-2);
  font-size: 1.02rem;
}

/* ⚠️ `data-hazir` SOLGUNLASTIRMASI KALDIRILDI - kullanici karari
   (2026-09-03): modul durumu reklam sayfasinda gosterilmiyor.          */

.tanitim__bolum--kapanis { background: var(--yuzey-2); text-align: center; }
.tanitim__kapanisBaslik { margin-block-end: var(--b-3); }
.tanitim__bolum--kapanis .tanitim__cta { justify-content: center; }

.tanitim__dip {
  border-block-start: 1px solid var(--cizgi);
  padding-block: var(--b-5);
}

.tanitim__dipIc {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--b-4);
  flex-wrap: wrap;
}

.tanitim__dipBaglantilar {
  display: flex;
  gap: var(--b-4);
  flex-wrap: wrap;
}

/* 🔴 GRADYAN ÜSTÜNDE DÜĞME HİYERARŞİSİ TERSİNE DÖNÜYOR.
   Ölçüldü (ekran görüntüsüyle): `.btn--birincil` mor gradyanın üstünde
   mor kalıyor ve SOLGUN görünüyor; yanındaki koyu `.btn--ikincil` ondan
   daha çok öne çıkıyor. Yani sayfanın asıl eylem çağrısı, ikincil olanın
   gerisinde kalıyordu. Kusuru hiçbir kontrol göremezdi — düğme var,
   tıklanabilir, kontrastı da yeterli; yanlış olan YALNIZCA hiyerarşi.
   Çözüm gradyan üstünde ters çevirmek: beyaz zemin, marka rengi metin.
   🔴 Metin rengi TEMADAN BAĞIMSIZ `--marka-600` (#5A46E0; beyazda ~6,2:1,
   hover'ın %88 beyazında ~5,3:1) — prototipin `.karsilama .btn--birincil`
   kuralıyla aynı. Eskiden `--marka-koyu` idi: zemin her temada beyaz ama
   o token koyu temada (varsayılan tema) açık mora (#B0A2F8) dönüyor ve
   kontrast ~2,2:1'e düşüyordu (ölçüldü 2026-10-20, kullanıcı onayıyla).   */
.tanitim__kahraman .btn--birincil {
  background: #fff;
  border-color: #fff;
  color: var(--marka-600);
}

.tanitim__kahraman .btn--birincil:hover {
  background: rgba(255, 255, 255, .88);
  border-color: rgba(255, 255, 255, .88);
}

/* İkincil de gradyana göre ayarlanıyor: koyu bir kutu yerine
   şeffaf + beyaz kenarlık, böylece ikisi AYNI DÜZLEMDE okunuyor.        */
.tanitim__kahraman .btn--ikincil {
  background: transparent;
  border-color: rgba(255, 255, 255, .55);
  color: #fff;
}

.tanitim__kahraman .btn--ikincil:hover {
  background: rgba(255, 255, 255, .12);
  border-color: #fff;
}

/* ══════════════════════════════════════════════════════════════════════
   ANASAYFA — kahraman ızgarası, ürün önizlemesi, platformlar, SSS
   ══════════════════════════════════════════════════════════════════════ */

/* Header'daki logo işareti — kenar çubuğundakiyle aynı boyut dili.     */
.tanitim__marka { display: inline-flex; align-items: center; gap: var(--b-2); }
.tanitim__logo { display: inline-flex; color: var(--marka); }
/* Plan 16.12: anasayfa dışında marka bir bağlantı — kelime işareti bağlantı rengine (marka) dönmesin, çizgi almasın. */
a.tanitim__marka { color: var(--metin); }
a.tanitim__marka:hover { text-decoration: none; }
/* /fiyatlar: dar içerik (iki sütunlu bedel tablosu, uzun açıklama) — kap sola yaslı kalır, başlıklar öteki bölümlerle hizalı. */
.fiyat__dar { max-width: 46rem; }
/* Belge listesindeki bağımsız bağlantılar (cümle içinde değil): dokunma hedefi en az 24 px (WCAG 2.5.8; ölçüldü 19 px). */
.fiyat__belgeler a { display: inline-flex; align-items: center; min-height: 24px; }
.tanitim__logo svg { width: 26px; height: 26px; }

/* Kahraman: solda metin, sağda tanıtım videosu (2026-10-20).
   min-width:0 — kayıtlı ızgara tuzağı: içeriğinin altına küçülemeyen
   hücre belgeye yatay kaydırma ekler.                                  */
.tanitim__kahramanIzgara {
  display: grid;
  grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: var(--b-8);
  align-items: center;
}

.tanitim__kahramanMetin { min-width: 0; }

@media (max-width: 900px) {
  /* Dar ekranda video GİZLENMİYOR, metnin altına iniyor (belge sırası
     zaten öyle): gizlemek sayfanın tek görselini mobilde yok ederdi.  */
  .tanitim__kahramanIzgara { grid-template-columns: 1fr; }
}

/* ---- Platform ikonları: "sosyal medya" mesajının görsel karşılığı --- */
.tanitim__platformlar {
  display: flex;
  gap: var(--b-4);
  align-items: center;
  margin: var(--b-5) 0 0;
  padding: 0;
  list-style: none;
}

.tanitim__platform {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  background: rgba(255, 255, 255, .16);
  color: #fff;
}

.tanitim__platform svg { width: 20px; height: 20px; }

/* ---- Tanıtım videosu: tıklayınca yüklenen ön yüz -------------------
   Plan/anasayfa-tanitim-videosu.md. Kapak ve sonradan gelen çerçeve AYNI
   kutuyu paylaşır (16:9, aynı köşe ve gölge): oynat'a basınca sayfa
   zıplamaz. Renkler temadan BAĞIMSIZ — gradyan zeminin üstündeyiz ve
   `--marka-koyu` koyu temada açık mora döner (beyaz hap üstünde okunmaz). */
.tanitim__video { min-width: 0; }

.tanitim__videoOnYuz,
.tanitim__videoCerceve {
  position: relative;
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
  border: 1px solid rgba(255, 255, 255, .18);
  border-radius: var(--r-lg);
  overflow: hidden;
  background: #000;
  box-shadow: 0 24px 60px rgba(0, 0, 0, .35);
}

.tanitim__videoOnYuz:hover { text-decoration: none; }

.tanitim__videoOnYuz:focus-visible,
.tanitim__videoCerceve:focus-visible {
  outline: 3px solid #fff;
  outline-offset: 3px;
}

.tanitim__videoKapak {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform var(--gecis-orta);
}

.tanitim__videoOnYuz:hover .tanitim__videoKapak { transform: scale(1.02); }

/* Düğme sol altta, kadının koyu ceketinin üstünde: yüzü ve ekrandaki
   düzenleme panelini örtmüyor (kapak karesi buna göre seçildi).        */
.tanitim__videoDugme {
  position: absolute;
  inset-block-end: var(--b-4);
  inset-inline-start: var(--b-4);
  display: inline-flex;
  align-items: center;
  gap: var(--b-2);
  max-width: calc(100% - 2 * var(--b-4));
  padding-block: var(--b-1);
  padding-inline: var(--b-1) var(--b-4);
  border-radius: var(--r-tam);
  background: #fff;
  color: var(--marka-600);
  font-weight: 600;
  white-space: nowrap;
  box-shadow: 0 6px 20px rgba(0, 0, 0, .3);
}

.tanitim__videoOynat {
  display: grid;
  place-items: center;
  flex: none;
  width: 2.25rem;
  height: 2.25rem;
  border-radius: 50%;
  background: var(--marka-gradyan);
}

/* Oynat üçgeni CSS ile: ikon kütüphanesi donmuş prototiple aynı sayıda
   ikon taşımak zorunda (TasarimSistemiTestleri), yeni ikon eklenmedi.  */
.tanitim__videoOynat::before {
  content: "";
  width: .75rem;
  height: .85rem;
  margin-inline-start: 3px;
  background: #fff;
  clip-path: polygon(0 0, 100% 50%, 0 100%);
}

/* Saydamlık YOK: #5A46E0 beyaz üstünde 6,2:1 (ölçüldü); %75 saydamlık 4,5'in altına düşürürdü. */
.tanitim__videoSure { font-weight: 500; }
/* Ayırıcı nokta: soldaki boşluk hapın gap'i, sağdaki bu boşluk — "İzle · 0:41" simetrik. */
.tanitim__videoSure::before { content: "·"; margin-inline-end: var(--b-2); }

/* ---- İçerik tipi çipleri ------------------------------------------- */
.tanitim__ortala { text-align: center; }
.tanitim__ortala .rozetler { justify-content: center; margin-block-start: var(--b-5); }

/* ══════════════════════════════════════════════════════════════════════
   ANASAYFA D2 — yeniden kurgu (2026-10-20, Plan/konumlandirma-video-ve-claude.md §4a)
   Bölüm başı, iki sütun, rakamlar, sahne şeridi, önce/sonra, düzenleme
   eylemleri, tip kartları, Claude sohbeti, üst gezinme. Renkler token'dan;
   sabit beyaz zeminli kural yok (yalnız sabit marka-600 balonda sabit beyaz
   metin — iki temada 6,2:1). Çizimler aria-hidden, anlam metinde.
   ══════════════════════════════════════════════════════════════════════ */
.tanitim__bolumBasi { max-width: 46rem; margin-block-end: var(--b-6); }
.tanitim__bolumBasi h2,
.tanitim__sutunMetin h2 { margin-block-end: var(--b-3); }

.tanitim__giris {
  max-width: 60ch;
  margin: 0 0 var(--b-5);
  font-size: var(--ts-lg);
  line-height: var(--lh-lg);
}

.tanitim__bolumBasi .tanitim__giris { margin-block-end: 0; }

/* İki sütun — kahraman ızgarasıyla aynı kırılma (900 px). min-width:0: kayıtlı ızgara tuzağı. */
.tanitim__ikiSutun {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
  gap: var(--b-8);
  align-items: center;
}

.tanitim__ikiSutun--bas { align-items: start; }
.tanitim__sutunMetin { min-width: 0; }

@media (max-width: 900px) {
  .tanitim__ikiSutun { grid-template-columns: 1fr; }
}

/* Çizim kutuları (sahne şeridi, önce/sonra, sohbet) — aynı yüzey dili. */
.tanitim__panel {
  min-width: 0;
  padding: var(--b-5);
  background: var(--yuzey);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-xl);
  box-shadow: var(--golge-2);
}

/* ---- Üç rakam: .ist kartları (app.css), büyük rakam ---------------- */
.tanitim__rakamlar {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--b-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

.tanitim__rakamlar .ist { display: flex; flex-direction: column; }

/* Etiket ve açıklama --metin: renkli kartların "alt" renkleri (--mor-alt, --mavi-alt …) kendi zeminlerinde 4,30–4,46:1
   ölçüldü (AA 4,5 altı, iki temada; anasayfa paketi). Rakam kartın tonunu taşımaya devam ediyor. */
.tanitim__rakamlar .ist__etiket,
.tanitim__rakamlar .ist__alt { color: var(--metin); }

.tanitim__rakamlar .ist__deger {
  font-size: var(--ts-4xl);
  line-height: var(--lh-4xl);
  font-weight: 700;
  letter-spacing: var(--harf-sik);
}

@media (max-width: 480px) {
  .tanitim__rakamlar { gap: var(--b-2); }
  .tanitim__rakamlar .ist { padding: var(--b-3); }
  .tanitim__rakamlar .ist__deger { font-size: var(--ts-3xl); line-height: var(--lh-3xl); }
}

/* ---- Sahne şeridi: 4 sahne + "…" + son sahne, altında zaman çizgisi --
   Aynı iki karakter her karede — "karakterler her sahnede aynı"nın çizimi. */
.sahneSeridi__liste {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--b-2);
  margin: 0;
  padding: 0;
  list-style: none;
}

.sahneSeridi__sahne {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  gap: var(--b-2);
  min-width: 0;
  aspect-ratio: 16 / 10;
  padding: var(--b-2);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md);
}

.sahneSeridi__sahne[data-ton="mor"]     { background: var(--mor-zemin);     border-color: var(--mor-cizgi);     color: var(--mor-metin); }
.sahneSeridi__sahne[data-ton="mavi"]    { background: var(--mavi-zemin);    border-color: var(--mavi-cizgi);    color: var(--mavi-metin); }
.sahneSeridi__sahne[data-ton="yesil"]   { background: var(--yesil-zemin);   border-color: var(--yesil-cizgi);   color: var(--yesil-metin); }
.sahneSeridi__sahne[data-ton="turuncu"] { background: var(--turuncu-zemin); border-color: var(--turuncu-cizgi); color: var(--turuncu-metin); }

.sahneSeridi__no {
  overflow: hidden;
  font-size: var(--ts-xs);
  line-height: var(--lh-xs);
  font-weight: 600;
  white-space: nowrap;
  text-overflow: ellipsis;
}

.sahneSeridi__kisiler { display: flex; gap: var(--b-1); }

.sahneSeridi__kisi {
  display: inline-grid;
  place-items: center;
  width: 1.5rem;
  height: 1.5rem;
  border-radius: 50%;
  background: var(--marka-600);
  color: #fff;
}

.sahneSeridi__kisi--iki { background: var(--uyari-700); }

.sahneSeridi__sure {
  position: absolute;
  inset-block-end: var(--b-2);
  inset-inline-end: var(--b-2);
  font-size: var(--ts-xs);
  line-height: var(--lh-xs);
  font-weight: 600;
}

/* Dar ekranda kart ~100 px: süre etiketi karakterlerin üstüne biniyordu (ölçüldü, 390 px) — süreyi alttaki zaman çizgisi söylüyor. */
@media (max-width: 480px) {
  .sahneSeridi__sure { display: none; }
}

.sahneSeridi__ara {
  display: grid;
  place-items: center;
  color: var(--metin-3);
  font-size: var(--ts-2xl);
}

.sahneSeridi__zaman {
  display: flex;
  align-items: center;
  gap: var(--b-3);
  margin-block-start: var(--b-4);
  color: var(--metin-2);
  font-size: var(--ts-xs);
}

.sahneSeridi__cizgi {
  flex: 1;
  height: 6px;
  border-radius: var(--r-tam);
  background: linear-gradient(90deg, var(--marka) 0 22%, var(--cizgi-guclu) 22% 100%);
}

/* ---- Sahne düzenleme: önce/sonra çizimi + altı eylem ---------------- */
.duzenOrnek__kareler {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
  align-items: center;
  gap: var(--b-3);
}

.duzenOrnek__kare {
  position: relative;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: flex-start;
  min-width: 0;
  aspect-ratio: 16 / 10;
  padding: var(--b-2);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md);
  overflow: hidden;
}

.duzenOrnek__kare--once  { background: var(--mavi-zemin);    border-color: var(--mavi-cizgi);    color: var(--mavi-metin); }
.duzenOrnek__kare--sonra { background: var(--turuncu-zemin); border-color: var(--turuncu-cizgi); color: var(--turuncu-metin); }

/* Gün batımı: köşeden doğan yarım güneş — yalnız çizim. */
.duzenOrnek__kare--sonra::after {
  content: "";
  position: absolute;
  inset-inline-end: 12%;
  inset-block-end: -18%;
  width: 38%;
  aspect-ratio: 1;
  border-radius: 50%;
  background: var(--uyari);
  opacity: .55;
}

.duzenOrnek__etiket,
.duzenOrnek__kare .sahneSeridi__kisi { position: relative; z-index: 1; }

.duzenOrnek__etiket {
  font-size: var(--ts-xs);
  line-height: var(--lh-xs);
  font-weight: 600;
}

.duzenOrnek__ok { color: var(--metin-3); }
[dir="rtl"] .duzenOrnek__ok { transform: scaleX(-1); }

/* İstem — AI'a özgü öğe: AI vurgusu yalnız burada ve ilk eylemin çipinde. */
.duzenOrnek__istem {
  display: flex;
  align-items: flex-start;
  gap: var(--b-2);
  margin: var(--b-4) 0 0;
  padding: var(--b-3);
  border-radius: var(--r-md);
  background: var(--ai-zayif);
  color: var(--metin);
  font-size: var(--ts-sm);
  line-height: var(--lh-sm);
}

.duzenOrnek__istem .ikon { flex: none; color: var(--ai); }

.tanitim__eylemler {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--b-5) var(--b-4);
  margin: 0;
  padding: 0;
  list-style: none;
}

@media (max-width: 680px) {
  .tanitim__eylemler { grid-template-columns: 1fr; }
}

.tanitim__eylem {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--b-3);
  align-items: start;
}

.tanitim__eylem .ist__cip { margin-block-end: 0; }
.tanitim__cip--ai { background: var(--ai-gradyan); }
.tanitim__eylemBaslik { margin: 0 0 var(--b-1); font-size: 1.02rem; }
.tanitim__eylem p { margin: 0; }

/* ---- Her formatta içerik: on tip kartı (enum'dan) ------------------- */
.tanitim__tipler {
  display: grid;
  /* 12rem: 68rem kapta beş sütun — on tip iki tam satır (13rem dört sütun verip son satırda iki kart bırakıyordu). */
  grid-template-columns: repeat(auto-fill, minmax(12rem, 1fr));
  gap: var(--b-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

.tanitim__tip {
  min-width: 0;
  padding: var(--b-4);
  background: var(--yuzey);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-lg);
}

.tanitim__tipAd { margin: 0 0 var(--b-1); font-size: var(--ts-md); line-height: var(--lh-md); }
.tanitim__tipMetin { margin: 0; font-size: var(--ts-sm); line-height: var(--lh-sm); }

/* Tek sütunda on kart ~2700 px tutuyordu (ölçüldü, 390 px): dar ekranda ikon solda, metin sağda. */
@media (max-width: 680px) {
  .tanitim__tip {
    display: grid;
    grid-template-columns: auto minmax(0, 1fr);
    column-gap: var(--b-3);
    padding: var(--b-3);
  }

  .tanitim__tip .tanitim__ikon { grid-row: span 2; margin-block-end: 0; }
}

/* ---- API ve Claude: üç adım + sohbet örneği ------------------------- */
.tanitim__miniAdimlar {
  display: grid;
  gap: var(--b-4);
  margin: 0 0 var(--b-6);
  padding: 0;
  list-style: none;
}

.tanitim__miniAdim {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--b-3);
  align-items: start;
}

.tanitim__miniAdim .tanitim__adimBaslik { margin-block-end: var(--b-1); }
.tanitim__miniAdim p { margin: 0; }

.sohbet { display: grid; gap: var(--b-3); margin: 0; }

.sohbet__balon {
  max-width: 92%;
  padding: var(--b-3) var(--b-4);
  border-radius: var(--r-lg);
}

.sohbet__balon p { margin: 0; }

.sohbet__balon--siz {
  justify-self: end;
  border-end-end-radius: var(--r-sm);
  background: var(--marka-600);
  color: #fff;
}

.sohbet__balon--claude {
  justify-self: start;
  width: 100%;
  max-width: 100%;
  border: 1px solid var(--cizgi);
  border-end-start-radius: var(--r-sm);
  background: var(--yuzey-2);
  color: var(--metin);
}

.sohbet__kim {
  display: block;
  margin-block-end: var(--b-1);
  font-size: var(--ts-xs);
  line-height: var(--lh-xs);
  font-weight: 700;
}

.sohbet__balon--claude .sohbet__kim { color: var(--metin-2); }
.sohbet__kod { margin: var(--b-3) 0 0; font-size: var(--ts-xs); }

/* ---- Üst gezinme: geniş ekranda satır, dar ekranda <details> menü --- */
.tanitim__gezinme {
  display: flex;
  align-items: center;
  gap: var(--b-1);
  margin-inline: var(--b-4) auto;
}

.tanitim__gezinmeBag,
.tanitim__menuBag {
  display: inline-flex;
  align-items: center;
  min-height: 2.25rem;
  padding: 6px 10px;
  border-radius: var(--r-md);
  color: var(--metin-2);
  font-weight: 500;
  white-space: nowrap;
}

.tanitim__gezinmeBag:hover,
.tanitim__menuBag:hover { background: var(--yuzey-3); color: var(--metin); text-decoration: none; }

.tanitim__gezinmeBag[aria-current="page"],
.tanitim__menuBag[aria-current="page"] { color: var(--metin); font-weight: 600; }

.tanitim__menu { display: none; position: relative; margin-inline-start: auto; }

.tanitim__menuAcan {
  display: inline-flex;
  align-items: center;
  gap: var(--b-2);
  padding: 6px 10px;
  border-radius: var(--r-md);
  color: var(--metin-2);
  cursor: pointer;
  list-style: none;
  white-space: nowrap;
}

.tanitim__menuAcan::-webkit-details-marker { display: none; }

.tanitim__menuAcan:hover,
.tanitim__menu[open] .tanitim__menuAcan { background: var(--yuzey-3); color: var(--metin); }

.tanitim__menuPanel {
  position: absolute;
  inset-inline-end: 0;
  z-index: 30;
  display: grid;
  min-width: 13rem;
  margin-block-start: 6px;
  padding: 6px;
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md);
  background: var(--yuzey);
  box-shadow: 0 14px 36px rgba(0, 0, 0, .32);
}

/* ---- D3: /ozellikler/video — ürün ekranları ve "ne üretir" listesi ---- */
.tanitim__devam {
  display: inline-flex;
  align-items: center;
  gap: var(--b-2);
  min-height: 24px;
  margin-block-start: var(--b-5);
  /* --marka-koyu: bağlantı rengi (--marka) koyu temada vurgu zemininde 4,48:1 ölçüldü (anasayfa paketi) — bu ton iki temada AA. */
  color: var(--marka-koyu);
  font-weight: 600;
}

.ozellik__liste {
  display: grid;
  gap: var(--b-3);
  margin: 0;
  padding: 0;
  list-style: none;
}

.ozellik__liste li {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  gap: var(--b-3);
  align-items: start;
}

.ozellik__liste .ikon { margin-block-start: 3px; color: var(--marka); }

.rehber-izgara {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--b-6);
  align-items: start;
}

.rehber-izgara__sutun { display: grid; gap: var(--b-6); min-width: 0; }
.rehber-izgara--tek { grid-template-columns: minmax(0, 46rem); }

@media (max-width: 900px) {
  .rehber-izgara { grid-template-columns: 1fr; }
}

.rehber-ekran { min-width: 0; margin: 0; }

/* İki görsel (açık · koyu), görünen temanınki; ikisi de loading="lazy" — gizli olan indirilmez. */
.rehber-ekran__gorsel {
  display: block;
  width: 100%;
  height: auto;
  border: 1px solid var(--cizgi);
  border-radius: var(--r-lg);
  background: var(--yuzey);
  box-shadow: var(--golge-2);
}

.rehber-ekran__gorsel--koyu { display: none; }
[data-tema="koyu"] .rehber-ekran__gorsel--acik { display: none; }
[data-tema="koyu"] .rehber-ekran__gorsel--koyu { display: block; }

.rehber-ekran__aciklama {
  margin-block-start: var(--b-2);
  font-size: var(--ts-sm);
  line-height: var(--lh-sm);
}

/* 1100 px: tasarım sisteminin mevcut kırılması (izgara--3 → 2) — dört bağlantı + dil + iki düğme bunun altında sığmıyor. */
@media (max-width: 1100px) {
  .tanitim__gezinme { display: none; }
  .tanitim__menu { display: block; }
}

/* ---- SSS: <details> akordeon, JAVASCRIPT YOK ----------------------- */
.sss { border-block-start: 1px solid var(--cizgi); }

.sss__oge { border-block-end: 1px solid var(--cizgi); }

.sss__soru {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--b-4);
  padding-block: var(--b-4);
  cursor: pointer;
  font-weight: 600;
  /* Varsayılan ok işaretini kaldırıyoruz; kendi ikonumuz var.          */
  list-style: none;
}

.sss__soru::-webkit-details-marker { display: none; }

.sss__ok { color: var(--metin-3); flex: 0 0 auto; transition: transform .18s ease; }
.sss__oge[open] .sss__ok { transform: rotate(180deg); }

.sss__cevap { margin: 0 0 var(--b-4); max-width: 68ch; }
/* Plan 12.64 — "Tüm sorular" bağımsız bağlantı: dokunma hedefi en az 24 px (WCAG 2.5.8; toplu ölçümde 84×19 ölçüldü). */
.sss__tum { display: inline-flex; align-items: center; min-height: 24px; }

/* Sahne istemleri (S14) — rehberin bağımsız bağlantıları ("Nasıl çalışır? …" · "yeni sekmede açın"): dokunma hedefi en az 24 px
   (WCAG 2.5.8; tarayıcı ölçümünde 253×16 ve 378×17). 28 px: ortalanmış pencerenin içinde tam 24 px kesirli konumda 24'ün hemen
   altında ölçüldü (378×24 "küçük" sayıldı) — sınırda kalmasın. */
.sahne-rehber-bag { display: inline-flex; align-items: center; min-height: 28px; }

/* ---- Dil seçici: <details> açılır menü ----------------------------- */
.dilsec { position: relative; }

.dilsec__acan {
  display: inline-flex;
  align-items: center;
  gap: var(--b-2);
  padding: 6px 10px;
  border-radius: var(--r-md);
  cursor: pointer;
  color: var(--metin-2);
  list-style: none;
  white-space: nowrap;
}

.dilsec__acan::-webkit-details-marker { display: none; }
.dilsec__acan:hover { background: var(--yuzey-2); color: var(--metin); }
.dilsec[open] .dilsec__ok { transform: rotate(180deg); }
.dilsec__ok { transition: transform .18s ease; }

.dilsec__panel {
  position: absolute;
  inset-inline-end: 0;
  margin-block-start: 6px;
  min-width: 11rem;
  padding: 6px;
  border-radius: var(--r-md);
  background: var(--yuzey);
  border: 1px solid var(--cizgi);
  box-shadow: 0 14px 36px rgba(0, 0, 0, .32);
  z-index: 30;
}

.dilsec__oge {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--b-3);
  width: 100%;
  padding: 8px 10px;
  border: 0;
  border-radius: var(--r-sm);
  background: transparent;
  color: var(--metin);
  cursor: pointer;
  font: inherit;
  text-align: start;
}

.dilsec__oge:hover { background: var(--yuzey-2); }
.dilsec__oge[aria-current="true"] { color: var(--marka-metin); font-weight: 600; }
.dilsec__tik { color: var(--marka); }

/* ══════════════════════════════════════════════════════════════════════
   MODÜL 11 SATIR 4 — ÜRETİLEN GÖRSEL
   ══════════════════════════════════════════════════════════════════════
   🔴 app.css SADIK KOPYADIR ve düzenlenmez; ürüne özgü her sınıf buraya.

   img zaten global olarak `display:block; max-width:100%` alıyor
   (app.css), yani burada eklenen tek şey KÖŞE ve ZEMİN.

   ⚠️ En-boy oranı SABİTLENMİYOR: sağlayıcı ölçü döndürmüyor
   (Medya.Genislik/Yukseklik NULL) ve sabit bir oran, farklı oranda
   dönen bir görseli KIRPARDI. Kap `max-width` ile sınırlı, yükseklik
   içerikten geliyor.

   ⚠️ Zemin, saydam PNG'ler için: saydam bir görsel koyu temada
   görünmez hâle gelirdi. */
.medya-gorsel {
  border-radius: var(--r-md);
  background: var(--yuzey-2);
}

/* İçerik detayındaki tek bir medya öğesi (görsel/video + eylemleri + künyesi).

   ⚖️ GENİŞLİK SINIRI BURADA, KARTTA DEĞİL: Sonuc.cshtml görseli satır içi
   `max-width:32rem` ile sınırlıyor ve o değer orada tek kullanımlık. Detayda
   birden çok medya olabileceği için (11.5 çoklu medya) sınır ÖĞEYE ait.

   ⚠️ Öğeler arası boşluk `+` ile: tek öğede (bugünkü hâl) hiç boşluk
   eklenmiyor, yani kartın kendi dolgusu bozulmuyor. */
.medya-oge {
  max-width: 32rem;
}

.medya-oge + .medya-oge {
  margin-top: var(--b-5);
  padding-top: var(--b-5);
  border-top: 1px solid var(--cizgi);
}

/* ══════════════════════════════════════════════════════════════════════════
   MEDYA SAHNESİ — üretim sonucu ekranındaki "kahraman" sunum
   ══════════════════════════════════════════════════════════════════════════

   🔴 KULLANICI BİLDİRİMİNİN KARŞILIĞI: "görselin gösterildiği tasarım güzel
   değil, daha hoş şekilde sunulmalı". Ölçülen üç kusur:
     · ödenen çıktı "40 kredi düşüldü" künyesinin ALTINDA duruyordu,
     · kart max-width:32rem ile sola yaslıydı, sağında ~%40 ölü alan vardı,
     · görsel bir form alanı gibi kart gövdesinin içindeydi.

   ⚖️ BÖLÜNMÜŞ EKRAN (sol görsel / sağ içerik) KULLANILMADI — kayıtlı tasarım
   kuralı onu "en çok aşınmış kalıp" diye yasaklıyor. Yerine PASPARTU deseni:
   görsel kendi oranında, ortalanmış, çerçeve zemini üstünde. Dikey (4:5,
   9:16) ve yatay (16:9) çıktıların üçü de aynı çerçevede doğru duruyor;
   sabit bir en-boy DAYATILMIYOR (dayatmak farklı oranda gelen bir görseli
   KIRPARDI — .medya-gorsel'in aynı gerekçesi).

   ⚖️ Yeni renk/token ÜRETİLMEDİ: zemin --yuzey-2, çizgi --cizgi, yarıçap
   --r-lg — üçü de tasarım sisteminden. Mor marka rengi kullanıcı kararıyla
   onaylı ama buraya KATILMADI: sahnenin işi görseli öne çıkarmak, kendi
   dikkatini çekmek değil. */
.medya-sahne {
  margin-bottom: var(--b-5);
}

.medya-sahne__baslik {
  font-size: var(--ts-sm);
  color: var(--metin-2);
  margin: 0 0 var(--b-3);
}

/* Paspartu: görsel için nefes alan bir zemin.
   ⚠️ max-height VIEWPORT'A bağlı (min(70vh, 44rem)): dikey bir 9:16 görsel
   sabit piksel yükseklikte ekranı taşırır, yalnız vh ise küçük ekranda
   okunamayacak kadar küçülür. İkisinin en küçüğü doğru davranışı veriyor. */
.medya-sahne__cerceve {
  display: flex;
  justify-content: center;
  align-items: center;
  padding: var(--b-5);
  background: var(--yuzey-2);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-lg);
}

.medya-sahne__gorsel {
  max-height: min(70vh, 44rem);
  width: auto;
  max-width: 100%;
  border-radius: var(--r-md);
}

.medya-sahne__eylemler {
  margin-top: var(--b-3);
  gap: var(--b-2);
  align-items: center;
}

/* Not eylemlerin SONUNA itiliyor: düğmeler solda kalsın, açıklama sağda.
   ⚠️ Dar ekranda .satir--sar alta sardırıyor ve margin-inline-start:auto
   zararsız hâle geliyor — ayrı bir medya sorgusu gerekmiyor.
   🔴 Mantıksal özellik (RTL): 2026-09-05'te fiziksel `margin-left` olarak
   girmişti ve kör kalmış RTL nöbetçisinin arkasından sızmıştı (2026-09-18). */
.medya-sahne__not {
  margin-inline-start: auto;
}

/* ---------------------------------------------------------------------------
   ZİL ROZETİ — Modül 18 satır 4.

   🔴 app.css'e YAZILMADI: o dosya prototipin SADIK KOPYASI ve düzenlenmesi
   yasak (TasarimSistemiTestleri iki dosyayı karşılaştırıyor). Ürüne özgü her
   sınıf buraya.

   ⚠️ Sayı ".sayac" ile çizilemezdi: o sınıf sağa yaslı KÜÇÜK METİN
   (font-size/color/text-align), rozet değil — uydurulmuş bir sınıf hata
   vermez, sessizce stilsiz render eder.
--------------------------------------------------------------------------- */
.zil { position: relative; }

.zil-rozet {
    position: absolute;
    top: 2px;
    inset-inline-end: 2px;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: var(--r-tam);
    background: var(--hata-dolgu);
    color: #fff;
    font-size: 10px;
    font-weight: 700;
    line-height: 16px;
    text-align: center;
    font-variant-numeric: tabular-nums;
    pointer-events: none;
}

/* ---------------------------------------------------------------------------
   HEDEF PLATFORM SEÇİCİ + ÖNİZLEME — Faz 1 (plan 12.1 · 12.8).

   ⚖️ Seçim kartı tasarım sisteminin .secim'i; seçili görünüm .secili sınıfı
   yerine :has(input:checked) ile — sınıfı sunucu çizerdi ve JS olmadan
   tıklamayla DEĞİŞMEZDİ (kutu işaretli, kart seçilmemiş görünürdü).
   Onay kutusunun kendisi GÖRÜNÜR kalıyor: klavye ve ekran okuyucu için asıl
   kontrol o; kart yalnız dokunma hedefini büyütüyor (WCAG 2.5.8).
--------------------------------------------------------------------------- */
/* FAZ 5 — .secim-grubu / .secim-secenek aynı desenin GENEL adı (ses tipi ve alt yazı
   dilleri). Platform seçicinin kuralları kopyalanmadı, seçici listesine eklendi. */
.platform-secici,
.secim-grubu { border: 0; margin: 0; padding: 0; min-width: 0; }

.platform-secici__liste,
.secim-grubu__liste {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr));
    gap: var(--b-2);
}

.platform-secenek input,
.secim-secenek input {
    width: 16px;
    height: 16px;
    margin: 0;
    flex: 0 0 auto;
    accent-color: var(--marka);
    cursor: pointer;
}

.platform-secenek:has(input:checked),
.secim-secenek:has(input:checked) { border-color: var(--marka); background: var(--marka-zayif); }
.platform-secenek:has(input:focus-visible),
.secim-secenek:has(input:focus-visible) { box-shadow: var(--odak-halka); }

/* 🔴 .kutu display:flex taşıyor ve yazar kuralı tarayıcının [hidden] kuralını
   EZER: hidden nitelikli bir kutu yine görünürdü. Tasarım sisteminde genel bir
   [hidden] sıfırlaması yok (yalnız .sekme-panel ve .menu için var). */
.kutu[hidden] { display: none; }

/* 🔴 .btn de display:inline-flex taşıyor: "gizli doğar, JS açar" diye yazılmış kopyala ve malzeme düğmeleri HER ZAMAN
   görünüyordu — JS'siz ya da panosuz tarayıcıda tıklanınca hiçbir şey yapmayan ölü kontrol. Plan 6.15 Dilim 2'de kasten
   bozmayla ölçüldü: yerinde çizilen düğmeyi açan satır sökülünce düğme yine görünür kaldı. Tek kural bütün düğmeler için. */
.btn[hidden] { display: none; }

/* 🔴 Plan 12.74 — .secim de display:flex taşıyor: kabuk.js görünen karakterde "Sözlerini yapay zekâ yazsın" seçeneğini
   hidden ile gizliyordu ve seçenek yine görünüyordu (yalnız sesi olan karaktere özgü bir seçim görünen karakterde sunuluyordu).
   Ekran görüntüsü buldu (2026-10-15). */
.secim[hidden] { display: none; }

/* PLAN 6.14 (K11) — uyarı/bilgi kutusu üstündeki metne yapışmasın. app.css'te .kutu'nun dış boşluğu yok ve genel
   `* { margin: 0 }` paragrafın altındaki kutuyu ona yapıştırıyordu (ölçüldü: 60 ekranda 3 kutu 0 px — bağımsız
   üretimin marka rehberi uyarısı, pazar yeri uyarısı, platform yok bilgisi).
   ⚖️ Yalnız METİN AKIŞI öğelerinin ardındaki kutu: genel `* + .kutu` ızgarada bir kartın yanındaki kutuyu (#kuyruk-yok)
   12 px aşağı iterdi. Blok akışta dikey boşluklar birleşir, yani önceki öğe zaten daha büyük alt boşluk taşıyorsa
   (y-alt-*) değişen bir şey yok; :where() özgüllüğü 0 → y-ust-* yardımcıları (!important) kazanır. */
:where(p, ul, ol, dl, h1, h2, h3, h4, h5, h6, .alan, .kutu) + .kutu { margin-block-start: var(--b-3); }

/* Önizleme kartları: platform başına bir kart, sayaç sonda.
   ⚖️ auto-FIT, auto-fill değil: ilk yazımda kartlar 14rem'de kalıyor, sağda
   BOŞ sütunlar açılıyor ve sayaç iki satıra kırılıyordu ("1.308 / 2.200" ↵
   "karakter") — ekran görüntüsü gösterdi. auto-fit kartları kaba yayıyor. */
.platform-onizleme {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr));
    gap: var(--b-3);
}

.platform-onizleme__kart {
    border: 1px solid var(--cizgi);
    border-radius: var(--r-lg);
    padding: var(--b-3);
    min-width: 0;
}

.platform-onizleme__sayac {
    margin-inline-start: auto;
    font-variant-numeric: tabular-nums;
    white-space: nowrap;
}

.platform-onizleme__sayac--asim { color: var(--hata); font-weight: 600; }

/* ==========================================================================
   FAZ 2 (12.17 · 12.18) — ANKET VE BAĞLANTI KARTLARI (_IcerikEkleri)
   Şartname (icerik-detay.js:123-133): şıklar üst çizgili satırlar, süre
   altta ayrı satır. Mantıksal özellikler (RTL kuralı).
   ========================================================================== */
.anket-secenekler { list-style: none; margin: var(--b-3) 0 0; padding: 0; }

.anket-secenekler li { padding: var(--b-2) 0; border-top: 1px solid var(--cizgi); }

/* ==========================================================================
   2026-09-28 — VİDEO KALİTESİ AÇIKLAMALARI (_VideoKaliteAciklamalari)
   Sihirbazın kısa ve uzun video kartları. Anket şıklarının deseni: madde işareti
   yok, satırlar üst çizgiyle ayrılıyor; maliyet notu satırın altında.
   ========================================================================== */
.kalite-aciklamalari { list-style: none; margin: var(--b-3) 0 0; padding: 0; }

.kalite-aciklamalari li { padding: var(--b-2) 0; border-top: 1px solid var(--cizgi); }

.kalite-aciklamalari__maliyet { display: block; margin-top: var(--b-1); }

/* 🔴 2026-09-28 — TAMAMLANMIŞ ADIM TIKLANABİLİR GÖRÜNMEMELİ. app.css (sadık kopya)
   `.adim.tamam`'a `cursor: pointer` veriyor: prototipte tamamlanmış adıma tıklayıp geri
   dönülüyordu. Üründe adımlar düz <span> (sihirbaz JS'siz, geri dönüş "Geri" düğmesiyle)
   ve el imleci hiçbir şey yapmayan bir ipucuydu. Ortak erişilebilirlik ölçütü ("tıklanabilir
   ama odaklanamaz") 3. adımda koşturulunca bulundu. */
.adimlar .adim.tamam { cursor: default; }

/* PLAN 12.30 (K6) — GÖSTERGEDEN ADIMA GİDİŞ. Ulaşılmış adım artık bir DÜĞME (sihirbaz formunu o adıma gönderiyor);
   görünümü adımın kendisi (app.css .adim · .tamam), tarayıcının düğme süsü sıfırlanıyor. Yukarıdaki düz imleç kuralı
   düz <span> adımlar için kalıyor. Dokunma hedefi en az 24 px (WCAG 2.5.8). */
.adimlar .adim.adim--dugme {
    background: none;
    border: 0;
    padding: 0;
    margin: 0;
    font: inherit;
    color: var(--metin-2);
    cursor: pointer;
    min-height: 24px;
    border-radius: var(--r-sm);
}
.adimlar .adim.adim--dugme:hover .adim__ad { text-decoration: underline; }
.adimlar .adim.adim--dugme:focus-visible { outline: none; box-shadow: var(--odak-halka); }

/* Adım adları kalabalık göstergede (uzun video 8, kısa video 7 adım) bir satıra sığmıyor: kabın genişliğine göre
   yalnız bulunulan adımın adı görünür, ötekiler numara (ad ekran okuyucuda, düğmenin adında ve ipucunda duruyor —
   .gorsel-gizli ile aynı teknik). Dar kapta (telefon) her gösterge böyle; çizgiler kalkıyor ve aralık daralıyor (8
   numara + bulunulan adımın adı 390 px'te tek satır). Kap sorgusu: ölçüt sayfanın değil göstergenin genişliği; kap
   SARMALAYICI, çünkü kap sorgusu kabın kendisini biçimleyemez. */
.adimlar-kap { container-type: inline-size; margin-bottom: var(--b-6); }

/* ⚠️ Göstergenin alt boşluğu SARMALAYICIDA: kap sorgusu kabı (container-type) kendi biçimlendirme bağlamını kuruyor
   ve çocuğun boşluğu dışarı taşmıyor — kabın kutusu boşluğu içine alıyor ve altındaki mesaj kutusu ölçümde yapışık
   görünüyordu (6.14 ölçümü, 0 px). Görünen boşluk aynı (app.css .adimlar'ın değeri). */
.adimlar-kap > .adimlar { margin-bottom: 0; }

@container (max-width: 1240px) {
    .adimlar--kalabalik .adim:not(.aktif) .adim__ad {
        position: absolute; width: 1px; height: 1px; padding: 0;
        overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
    }
}

@container (max-width: 700px) {
    .adimlar { gap: var(--b-1); }
    .adimlar .adim__cizgi { display: none; }
    .adimlar .adim:not(.aktif) .adim__ad {
        position: absolute; width: 1px; height: 1px; padding: 0;
        overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
    }
}

/* PLAN 12.30 — Brief'ten sonraki adımlarda brief'in kısa hâli: iki satıra kırpılıyor (tamamı Brief adımında);
   satırın son çocuğu (Düzenle) daralmıyor, metin daralıyor. */
.brief-ozeti__metin {
    flex: 1 1 auto;
    min-width: 0;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}

/* 🔴 Uzun bağlantı adresi 390px'te belgeyi TAŞIRMAMALI (WCAG 1.4.10) —
   adresin boşluğu yok, kırılma noktası ancak burada tanımlanıyor. */
.baglanti-adres { overflow-wrap: anywhere; }

/* Elle girişte tipe bağlı alanlar (kabuk.js ilerleyici). `.kart` display
   taşıyor ve yazar kuralı tarayıcının [hidden] kuralını ezer (kayıtlı tuzak). */
[data-tip-ek][hidden] { display: none; }

.tip-ek { border: 0; margin: 0; padding: 0; min-width: 0; }

/* Ajansa yönelik beyan satırı içerikten ayrılsın (ekran görüntüsü: adrese yapışıktı). */
.ek-beyan { margin-block-start: var(--b-3); }

/* ==========================================================================
   FAZ 7 (12.22) — ÇOK SATIRLI KULLANICI METNİ
   🔴 ÖLÇÜLMÜŞ KUSUR (2026-09-20): gönderi metni, brief ve ek not `<p>`
   içinde ham yazılıyordu ve HTML satır sonlarını ÇÖKERTİYOR — yani AI'ın
   paragraflı yazdığı gönderi ekranda tek blok görünüyordu. Görünüşten daha
   kötüsü: "metni kopyala" düğmesi `innerText` okuyor, yani kullanıcı
   gönderiyi platforma PARAGRAFSIZ yapıştırıyordu. Şartname (icerik-detay.js
   ve icerik-sonuc.js) ve elle-yazıldı ekranı `pre-wrap` kullanıyordu;
   eksik olan bu iki ekrandı.
   ⚠️ `pre` DEĞİL `pre-wrap`: `pre` uzun satırı sarmaz ve dar ekranda belgeyi
   taşırır (kayıtlı WCAG 1.4.10 tuzağı).
   ========================================================================== */
.metin-akis {
  white-space: pre-wrap;

  /* OKUMA GENISLIGI (2026-09-24). `--okuma-maks` tokeni Modul 6'dan beri
     tanimliydi ve URUNDE HIC KULLANILMIYORDU; icerik detayinda en uzun metin
     satiri 1116px olculdu. Tipografi olcutu 45-75 karakter (~600-750px): daha
     uzun satirda goz satir basina donerken kayiyor.
     ⚠️ Yalniz UZUN METIN bloklarina (gonderi metni · brief · ek not) uygulaniyor;
     aciklama ve ipucu satirlari zaten kisa, onlari daraltmak gereksiz bir
     kirpma olurdu. */
  max-width: var(--okuma-maks);
}

/* Künye içindeki bağlantı (müşteri kartı — Faz 7). WCAG 2.5.8: dokunma
   hedefi en az 24 px. Ölçüldü (a11y taraması, 2026-09-20): düz bağlantı
   90×19 px çıkıyordu — `.auth__baglanti` ile aynı desen, aynı gerekçe.
   ⚠️ Cümle içi bağlantı istisnası BURADA UYGULANMAZ: künye bir tanım
   listesi, bağlantı tek başına bir satır (Faz 6'nın kaynak bağlantısıyla
   aynı sınıf). */
.kunye a { display: inline-flex; align-items: center; min-height: 24px; }

/* Tablo hücresinde sarılmaması gereken kısa değer (19.7 — sistem logları: zaman
   damgası ve "2.037 ms"). Ölçüldü (ekran görüntüsü, 2026-09-22): birim sayıdan
   ayrılıp alt satıra düşüyordu. Genel bir nowrap yardımcısı yoktu; `.rozet`'in
   kendi nowrap'ı yalnız yavaş satırları kapsıyordu. */
.tablo .tek-satir { white-space: nowrap; }

/* K31 (2026-10-21) — EYLEMLİ LİSTE TABLOSU DAR EKRANDA KART OLUR. Kullanıcı: "mobilden girdiğimde detay butonları sağda
   çıktığından yatay scroll yapmak zorunda kalıyorum, kalıcı çözüm". Tablo `.tablo-sar` içinde yana kayıyordu ve satırın eylemi
   (Detay, form) görünmüyordu; a11y denetimi kaydırabilen kabı bilerek muaf tuttuğu için hiçbir ölçüt görmüyordu — artık
   görüyor (urun-erisilebilirlik-denetimi: eylemli tablo 390 px'te kaydırma istemez).
   Satır iki sütunlu ızgara; hücre etiketi `data-etiket`'ten (::before, değerin üstünde). Etiketsiz hücre (başlık, eylem) tam
   genişlik. Başlık satırı gizlenir — her hücre kendi etiketini taşıyor. Sütunlar minmax(0, 1fr): uzun değer ya da form
   denetimi sütunu büyütüp kartı taşırmasın. Saf veri tabloları (eylemsiz) bu sınıfı almaz — yana kaymaları WCAG 1.4.10'un iki
   boyutlu veri istisnası. */
@media (max-width: 680px) {
  .tablo--kart, .tablo--kart tbody { display: block; }
  .tablo--kart thead { display: none; }
  .tablo--kart tr {
    display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
    gap: var(--b-2) var(--b-3); padding: var(--b-3) var(--b-4); border-bottom: 1px solid var(--cizgi);
  }
  .tablo--kart tbody tr:last-child { border-bottom: none; }
  .tablo--kart td { display: block; min-width: 0; padding: 0; border-bottom: none; overflow-wrap: anywhere; }
  /* Etiketsiz hücre (kartın başlığı, eylem) ve uzun değer (`data-tam`: açıklama, ayrıntı formu) tam genişlik. */
  .tablo--kart td:is(:not([data-etiket]), [data-tam]) { grid-column: 1 / -1; }
  .tablo--kart td[data-etiket]::before {
    content: attr(data-etiket); display: block; margin-block-end: 2px;
    font-size: var(--ts-xs); font-weight: 600; text-transform: uppercase; letter-spacing: .04em; color: var(--metin-3);
  }
  /* Sayı ve sağa yaslı sütun kartta etiketin altında, sola yaslı (etiket ile değer aynı hizada). */
  .tablo--kart td:is(.sayisal, .sag) { text-align: start; }
  .tablo--kart td :is(select, input, textarea) { max-width: 100%; }
}

/* ══════════════════════════════════════════════════════════════════════════
   M24 — HAZIR İÇERİKLER (pazar yeri): dikey video kartı ve izleme düzeni
   ══════════════════════════════════════════════════════════════════════════
   Talep "dikey oranda": kart videosu 9:16 kutuda, izleme ekranı video + künye. K13 (2026-10-21): yatay video da
   paylaşılıyor — .hazir-kart--yatay / .hazir-izle--yatay 16:9 (aşağıda).
   Kırpma yok (object-fit: contain) — dikey olmayan bir video kesilseydi ilan
   başka bir şey gösterirdi. Satır içi stil yerine sınıf (CSP 20.13 yönü). */
.hazir-kart { display: flex; flex-direction: column; overflow: hidden; position: relative; }
/* Kartın tamamı başlık bağlantısıyla tıklanır — tek bağlantı, tek erişilebilir ad. Etiket bağlantıları üstte kalır. */
.hazir-kart__baslik a { display: inline-flex; align-items: center; min-height: 24px; }
.hazir-kart__baslik a::after { content: ""; position: absolute; inset: 0; }
.hazir-kart__etiketler { position: relative; z-index: 1; }
.hazir-baglanti { display: inline-flex; align-items: center; min-height: 24px; }
.hazir-kart__onizleme { display: block; }
.hazir-kart__video {
  display: block; width: 100%; aspect-ratio: 9 / 16; object-fit: contain;
  background: var(--yuzey-3); border-bottom: 1px solid var(--cizgi);
}
.hazir-kart__baslik { font-size: var(--ts-md); line-height: var(--lh-md); margin: 0 0 var(--b-2); overflow-wrap: anywhere; }
.hazir-kart__kunye { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--b-2) var(--b-3); margin: 0 0 var(--b-3); }
.hazir-kart__kunye dt { color: var(--metin-3); font-size: var(--ts-xs); margin: 0; }
.hazir-kart__kunye dd { margin: 0; }
/* Etiket bağlantıları dokunma hedefi en az 24px (WCAG 2.5.8) — rozet kendi başına daha kısa. */
.hazir-kart__etiketler a { display: inline-flex; align-items: center; min-height: 24px; }

.hazir-izle { display: grid; grid-template-columns: minmax(0, 380px) minmax(0, 1fr); gap: var(--b-5); align-items: start; }
.hazir-izle__video {
  display: block; width: 100%; aspect-ratio: 9 / 16; max-height: 80vh; object-fit: contain;
  background: var(--yuzey-3); border-radius: var(--r-lg);
}
/* Kullanıcının yazdığı başlık boşluksuz uzun olabilir — dar ekranda belgeyi taşırmasın (WCAG 1.4.10). */
.hazir-izle__baslik { overflow-wrap: anywhere; }
/* K13 (kullanıcı kararı 2026-10-21) — yatay video da paylaşılıyor ve KENDİ oranında çiziliyor (16:9 kutu, kırpma yok): 9:16
   kutuda boyunun üçte birine sığardı. Liste ızgarası kartları üstten hizalar — dikey kartın yanındaki yatay kartın altı boş
   uzamasın. İzleme ekranında yatay video geniş sütunda. Dar ekran kuralı (aşağıda) bunlardan SONRA gelir ve ikisini de tek
   sütuna indirir. */
.hazir-kart--yatay .hazir-kart__video { aspect-ratio: 16 / 9; }
.hazir-izgara { align-items: start; }
.hazir-izle--yatay { grid-template-columns: minmax(0, 720px) minmax(0, 1fr); }
.hazir-izle--yatay .hazir-izle__video { aspect-ratio: 16 / 9; }
@media (max-width: 780px) { .hazir-izle { grid-template-columns: minmax(0, 1fr); } }
/* M24 Dilim 3 (24.3) — sonsuz kaydırma: hazir-icerik.js sayfalamayı `hidden` ile gizliyor, ama .sayfalama
   display:flex taşıyor ve yazar kuralı [hidden]'ı EZER (kayıtlı tuzak). Düğme ve durum satırı ortada. */
.sayfalama[hidden] { display: none; }
.hazir-daha { display: flex; flex-direction: column; align-items: center; gap: var(--b-2); margin-top: var(--b-5); }
.hazir-daha p { margin: 0; text-align: center; }

/* 24.10 — anasayfa vitrini: en çok 6 kart. Masaüstünde tek sıra, tablette 3, dar ekranda 2 sütun (tek sütunda
   dikey video ekranı boydan boya kaplardı). Kart pazar yeri kartının sınıflarını paylaşıyor (.hazir-kart__video 9:16,
   kırpma yok); gerçek <ul> olduğu için liste işaretleri sıfırlanıyor.
   ⚖️ IZGARA DEĞİL ORTALANAN ESNEK SATIR: vitrin çoğu zaman 6'dan AZ kart taşıyacak (izin isteğe bağlı) ve ızgarada tek
   kart ortalanmış başlığın altında sola yaslı kalıyordu (ekran görüntüsüyle görüldü). Kart genişliği sütun sayısından
   hesaplanıyor, eksik satır ortada duruyor. */
.vitrin { margin-block-start: var(--b-8); }
.vitrin__izgara {
  --vitrin-sutun: 6; --vitrin-aralik: var(--b-4);
  list-style: none; margin: var(--b-5) 0 0; padding: 0;
  display: flex; flex-wrap: wrap; justify-content: center; gap: var(--vitrin-aralik);
}
.vitrin__kart {
  flex: 0 0 calc((100% - (var(--vitrin-sutun) - 1) * var(--vitrin-aralik)) / var(--vitrin-sutun));
  min-width: 0;
}
/* K13 — yatay video iki sütun genişliğinde (dar ekranda 2 sütunlu düzende tam satır); kartlar üstten hizalı. */
.vitrin__izgara { align-items: flex-start; }
.vitrin__kart--yatay {
  flex-basis: calc(2 * (100% - (var(--vitrin-sutun) - 1) * var(--vitrin-aralik)) / var(--vitrin-sutun) + var(--vitrin-aralik));
}
.vitrin__baslik { font-size: var(--ts-sm); line-height: var(--lh-sm); }
.vitrin__sure { margin: 0 0 var(--b-2); }
.vitrin__dip { margin-block-start: var(--b-5); }
.vitrin__dip p { margin: 0 0 var(--b-2); }
.vitrin__tumu { display: inline-flex; align-items: center; min-height: 24px; }
@media (max-width: 1100px) { .vitrin__izgara { --vitrin-sutun: 3; } }
@media (max-width: 680px) { .vitrin__izgara { --vitrin-sutun: 2; --vitrin-aralik: var(--b-3); } }

/* ------------------------------------------------------------ Şifre gücü çubuğu
   🔴 NORMAL ÖNCELİKLİ, yardimci.css'te DEĞİL (plan 20.13): başlangıç genişliği
   sıfır, gerçek genişliği kimlik-dogrulama.js CSSOM ile yazıyor
   (cubuk.style.width). !important bir yardımcı o değeri EZER ve çubuk hiç
   dolmazdı. CSSOM stili CSP'nin style-src-attr kuralına takılmıyor (ölçüldü). */
.ilerleme__dolu[data-sifre-cubuk] { width: 0; }

/* ==========================================================================
   PLATFORM SUNUMU (kullanici talebi 2026-09-24 · L1-L4)
   _PlatformSunumu · _LinkedInOnizleme · _Bilesenler

   Sol sutun gonderinin LinkedIn akisindaki hali, sag sutun ayni verinin
   bilesenleri + karakter sinirlari. LinkedIn'in akis genisligi ~555px; onizleme
   o genislikte kaliyor (daha genis cizmek satir kirilmasini ve "...daha fazla"
   noktasini gercekten farkli gosterirdi). 1100px alti tek sutun - tasarim
   sisteminin MEVCUT esigi, yeni esik uydurulmadi.
   Mantiksal ozellikler (RTL kurali).
   ========================================================================== */
/* Platformlarin baglanti renkleri (etiketler, anket haplari). Koyu temada ayri ton:
   LinkedIn'in kendi koyu mavisi (#0A66C2 koyu yuzeyde ~3:1, WCAG 1.4.3'u gecmez) ·
   Facebook #0866FF de koyu yuzeyde okunmuyor, #4599FF #1C1C2B uzerinde ~5,8:1 ·
   Instagram'in etiket rengi acikta #00376B, koyuda #E0F1FF (Instagram'in kendi iki tonu) ·
   YouTube'un baglanti mavisi acikta #065FD4, koyuda #3EA6FF (YouTube'un kendi iki tonu).
   Iki temadaki oran tarayici paketinde OLCULUYOR (icerik-listesi 14f · 14g · 14h). */
:root { --li-mavi: #0A66C2; --fb-mavi: #0866FF; --ig-mavi: #00376B; --yt-mavi: #065FD4; }
[data-tema="koyu"] { --li-mavi: #71B7FB; --fb-mavi: #4599FF; --ig-mavi: #E0F1FF; --yt-mavi: #3EA6FF; }

.platform-sunumu {
  display: grid;
  grid-template-columns: minmax(0, 555px) minmax(0, 1fr);
  gap: var(--b-5);
  align-items: start;
}
.platform-sunumu__onizleme,
.platform-sunumu__yan { min-width: 0; }
.platform-sunumu__onizleme { max-width: 555px; }
@media (max-width: 1100px) { .platform-sunumu { grid-template-columns: minmax(0, 1fr); } }

/* ---- Platform sekmeleri (O1) — tasarim sisteminin .sekmeler/.sekme deseni ----
   🔴 .sekmeler `display: flex` tasiyor ve `hidden` niteligini EZER (kayitli tuzak):
   JS'siz ekranda hicbir sey yapmayan sekme dugmeleri gorunurdu. Acik kural sart. */
.onizleme-sekmeler { margin-bottom: var(--b-4); }
.onizleme-sekmeler[hidden] { display: none; }
.onizleme-sekmeler .sekme { display: inline-flex; align-items: center; gap: var(--b-2); min-height: 24px; }
.onizleme-panel:focus { outline: none; }
.onizleme-panel:focus-visible { box-shadow: var(--odak-halka); border-radius: var(--r-md); }
/* JS'siz (alt alta) hal: paneller arasinda bosluk. Iki taraf da GORUNUR olmali —
   yoksa sekmeli halde ikinci sekmenin paneli, gizli kardesinden bosluk devralirdi. */
.onizleme-panel:not([hidden]) + .onizleme-panel:not([hidden]) { margin-block-start: var(--b-5); }

/* ---- Gonderi karti ---- */
.li-gonderi,
.fb-gonderi,
.ig-gonderi,
.yt-video {
  background: var(--yuzey);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md);
  box-shadow: var(--golge-1);
  overflow: hidden;
}
.li-gonderi__bas,
.fb-gonderi__bas {
  display: flex; align-items: flex-start; gap: var(--b-2);
  padding: var(--b-3) var(--b-4) 0;
}
.li-gonderi__yazar,
.fb-gonderi__yazar,
.ig-gonderi__yazar { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; }
.li-gonderi__yazar .kalin,
.fb-gonderi__yazar .kalin,
.ig-gonderi__yazar .kalin { overflow-wrap: anywhere; }
/* Akan metin, esnek kutu DEGIL: dar ekranda satir sarinca inline-flex ikonu metnin
   yanindan koparip sagda bosta birakiyordu (390px ekran goruntusu).
   ⚠️ Ikon ACIKCA satir ici: app.css'in sifirlamasi `svg { display: block }` ve
   ilk duzeltmede ikon 1440px'te de AYRI SATIRA dustu (ekran goruntusu). */
.li-gonderi__meta { display: block; }
.li-gonderi__dunya { display: inline-block; width: 12px; height: 12px; vertical-align: -1px; }
.li-gonderi__platform { display: inline-flex; align-items: center; gap: var(--b-1); flex: 0 0 auto; }
/* Platform etiketi gercek akista YOK — sekmesiz (JS'siz) halde gonderinin platformunu
   soyleyen bizim ekimiz. Dar ekranda ad yer kaplayip meta satirini daraltiyor ve dunya
   ikonu tek basina alt satira dusuyordu (390px ekran goruntusu); logo kaliyor, platformun
   adi zaten gonderinin erisilebilir adinda (aria-label). */
@media (max-width: 560px) { .li-gonderi__platform-ad { display: none; } }
.li-gonderi__avatar--bos { background: var(--yuzey-3); color: var(--metin-2); }

/* LinkedIn akis metni 14/20 - kirpma noktasi (~3 satir) bu olcuyle anlamli. */
.li-gonderi__metin {
  padding: var(--b-3) var(--b-4) 0;
  font-size: 14px; line-height: 20px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.li-gonderi__metin:focus { outline: none; }
.li-gonderi__metin:focus-visible { box-shadow: var(--odak-halka); }
/* kabuk.js yalniz JS acikken ekliyor: JS'siz ekran metnin TAMAMINI gosterir.
   Sinif platformdan bagimsiz (metin--kirpik), satir sayisi platformun kuralinda. */
.li-gonderi__metin.metin--kirpik {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
}
.li-etiket { color: var(--li-mavi); font-weight: 600; }
.li-gonderi__daha {
  display: block; margin-inline-start: auto;
  min-height: 24px; padding: 0 var(--b-4);
  background: none; border: 0; color: var(--metin-2);
  font: inherit; font-size: 14px; cursor: pointer;
}
.li-gonderi__daha[hidden] { display: none; }
.li-gonderi__daha:hover { color: var(--li-mavi); text-decoration: underline; }

/* ---- Medya ---- */
.li-medya { margin-block-start: var(--b-3); }
/* Video KIRPILMIYOR (2026-09-28): LinkedIn akista dikey videoyu nasil kirptigini resmi olarak
   yayimlamiyor — dikey video yukseklik siniriyla kalir, kenarlar siyah (object-fit: contain). */
.li-medya__video { display: block; width: 100%; max-height: 640px; object-fit: contain; background: #000; }
/* Video henuz hazir degil (AI videosu arka planda): oynaticinin yerinde 16:9 durum kutusu. */
.li-medya__bos {
  display: grid; place-items: center; align-content: center; gap: var(--b-2);
  aspect-ratio: 16 / 9; padding: var(--b-5);
  background: #000; color: rgba(255, 255, 255, .85); text-align: center;
}

.li-izgara { display: grid; gap: 2px; }
.li-izgara__kare { position: relative; min-width: 0; background: var(--yuzey-3); overflow: hidden; }
.li-izgara__kare img { display: block; width: 100%; height: 100%; object-fit: cover; }
.li-medya--tek .li-izgara__kare img { height: auto; max-height: 640px; object-fit: contain; }
.li-medya--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.li-medya--3 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.li-medya--4 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.li-medya--2 .li-izgara__kare,
.li-medya--3 .li-izgara__kare,
.li-medya--4 .li-izgara__kare { aspect-ratio: 1; }
.li-medya--3 .li-izgara__kare:first-child,
.li-medya--4 .li-izgara__kare:first-child { grid-column: 1 / -1; aspect-ratio: 16 / 9; }
.li-izgara__fazla {
  position: absolute; inset: 0;
  display: grid; place-items: center;
  background: rgba(0, 0, 0, .55); color: #fff;
  font-size: var(--ts-2xl); font-weight: 600;
}

.li-belge {
  margin-inline: var(--b-4); padding: var(--b-3);
  border: 1px solid var(--cizgi); border-radius: var(--r-md); background: var(--yuzey-2);
}
.li-belge__bas { display: flex; align-items: center; gap: var(--b-2); }
.li-belge__ad { display: block; overflow-wrap: anywhere; }

.li-baglanti {
  display: flex; align-items: center; gap: var(--b-3);
  border-block: 1px solid var(--cizgi); background: var(--yuzey-2);
}
.li-baglanti__gorsel {
  flex: 0 0 auto; width: 96px; aspect-ratio: 1.91;
  display: grid; place-items: center;
  background: var(--yuzey-3); color: var(--metin-3);
}
.li-baglanti__govde { display: flex; flex-direction: column; min-width: 0; padding-block: var(--b-2); padding-inline: 0 var(--b-3); }
.li-baglanti__alan { overflow-wrap: anywhere; }

.li-anket {
  margin-inline: var(--b-4); padding: var(--b-3);
  border: 1px solid var(--cizgi); border-radius: var(--r-md);
}
.li-anket__secenekler { list-style: none; margin: var(--b-3) 0; padding: 0; display: grid; gap: var(--b-2); }
.li-anket__secenekler li {
  padding: var(--b-1) var(--b-3);
  border: 1px solid var(--li-mavi); border-radius: var(--r-tam);
  color: var(--li-mavi); font-size: var(--ts-sm); font-weight: 600; text-align: center;
  overflow-wrap: anywhere;
}

/* ---- Etkilesim satiri (etkisiz, sayisiz - L4) ---- */
.li-gonderi__eylemler,
.fb-gonderi__eylemler {
  display: flex; justify-content: space-around; gap: var(--b-1);
  margin-block-start: var(--b-3); padding: var(--b-1) var(--b-2);
  border-block-start: 1px solid var(--cizgi);
  color: var(--metin-2); font-size: var(--ts-sm); font-weight: 600;
}
.li-gonderi__eylemler > span,
.fb-gonderi__eylemler > span { display: inline-flex; align-items: center; gap: var(--b-1); padding: var(--b-2) var(--b-1); min-width: 0; }
/* Dar ekranda dort ad yan yana sigmiyor: LinkedIn mobil gibi ikon ustte, ad altta. */
@media (max-width: 560px) {
  .li-gonderi__eylemler > span,
  .fb-gonderi__eylemler > span { flex-direction: column; gap: 2px; font-size: var(--ts-xs); }
}

/* ==========================================================================
   FACEBOOK GONDERISI (O3 Dilim 1, 2026-09-24) — _FacebookOnizleme
   Kart, baslik ve etkilesim satiri LinkedIn'le ORTAK kurallarda (yukarida
   gruplu secicilerle). Burada yalniz platforma ozgu olan: metin olcusu, kirpma
   satiri, izgara, baglanti karti.
   🔴 Meta ne "Devamini gor" noktasini ne cok gorselli duzeni yayimliyor
   (arastirildi): ~5 satir ve izgara YAKLASIK, kartin altinda beyan.
   Baglanti rengi (--fb-mavi) bolumun basindaki platform renkleri blogunda.
   ========================================================================== */
.fb-gonderi__avatar { width: 40px; height: 40px; }

/* Facebook akis metni 15/20 — kirpma noktasi (~5 satir) bu olcuyle anlamli. */
.fb-gonderi__metin {
  padding: var(--b-3) var(--b-4) 0;
  font-size: 15px; line-height: 20px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.fb-gonderi__metin:focus { outline: none; }
.fb-gonderi__metin:focus-visible { box-shadow: var(--odak-halka); }
.fb-gonderi__metin.metin--kirpik {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 5;
  line-clamp: 5;
  overflow: hidden;
}
.fb-etiket { color: var(--fb-mavi); }
.fb-gonderi__daha {
  display: block;
  min-height: 24px; padding: 0 var(--b-4);
  background: none; border: 0; color: var(--metin);
  font: inherit; font-size: 15px; font-weight: 600; cursor: pointer;
}
.fb-gonderi__daha[hidden] { display: none; }
.fb-gonderi__daha:hover { text-decoration: underline; }

.fb-medya { margin-block-start: var(--b-3); }
.fb-izgara { display: grid; gap: 2px; }
.fb-izgara__kare { position: relative; min-width: 0; min-height: 0; background: var(--yuzey-3); overflow: hidden; }
.fb-izgara__kare img { display: block; width: 100%; height: 100%; object-fit: cover; }
.fb-medya--tek .fb-izgara__kare img { height: auto; max-height: 640px; object-fit: contain; }
.fb-medya--2,
.fb-medya--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
/* Uc gorsel: buyuk kare solda, iki kucuk kare sagda (2fr/1fr → yukseklikler esit). */
.fb-medya--3 { grid-template-columns: 2fr 1fr; }
.fb-medya--3 .fb-izgara__kare:first-child { grid-row: span 2; }
/* Bes ve fazlasi: ikisi ustte, ucu altta; sonuncuda "+N". */
.fb-medya--5 { grid-template-columns: repeat(6, minmax(0, 1fr)); }
.fb-medya--5 .fb-izgara__kare { grid-column: span 2; }
.fb-medya--5 .fb-izgara__kare:nth-child(-n + 2) { grid-column: span 3; }
.fb-medya--2 .fb-izgara__kare,
.fb-medya--3 .fb-izgara__kare,
.fb-medya--4 .fb-izgara__kare,
.fb-medya--5 .fb-izgara__kare { aspect-ratio: 1; }

/* Baglanti karti: Facebook'un RESMI kart gorsel orani 1.91:1 (Meta Sharing dokumani). */
.fb-baglanti { border-block: 1px solid var(--cizgi); background: var(--yuzey-2); }
.fb-baglanti__gorsel {
  aspect-ratio: 1.91;
  display: grid; place-items: center;
  background: var(--yuzey-3); color: var(--metin-3);
}
.fb-baglanti__govde { display: flex; flex-direction: column; gap: 2px; padding: var(--b-2) var(--b-4); min-width: 0; }
.fb-baglanti__alan { text-transform: uppercase; overflow-wrap: anywhere; }

/* ==========================================================================
   INSTAGRAM (O3 Dilim 2, 2026-09-24) — _InstagramOnizleme
   Akis: medya USTTE, metin ALTTA (kullanici adiyla baslar) · kaydirici · hikaye.
   🔴 Oran SINIFLA (CSP style-src-attr 'none', 20.13) — resmi aralik 4:5 … 1.91:1,
   araligin disi kirpiliyor (PlatformSunumuGorunumu.InstagramOranSinifi).
   Kirpma noktasi RESMI DEGIL (arastirildi) — ~2 satir, beyanli.
   ========================================================================== */
.ig-gonderi { padding-block-end: var(--b-3); }
.ig-gonderi__bas { display: flex; align-items: center; gap: var(--b-2); padding: var(--b-3) var(--b-4); }

.ig-medya { position: relative; background: var(--yuzey-3); overflow: hidden; }
.ig-medya img { display: block; width: 100%; height: auto; }
.ig-oran--4-5 { aspect-ratio: 4 / 5; }
.ig-oran--1-1 { aspect-ratio: 1; }
.ig-oran--191 { aspect-ratio: 1.91; }
.ig-medya.ig-oran--4-5 img,
.ig-medya.ig-oran--1-1 img,
.ig-medya.ig-oran--191 img,
.ig-kaydirici__kare img { width: 100%; height: 100%; object-fit: cover; }
.ig-medya--bos { display: grid; place-items: center; align-content: center; gap: var(--b-2); color: var(--metin-3); }

/* Kaydirici: JS'siz de kayar (scroll-snap); sayac, noktalar ve oklar kabuk.js ile. */
.ig-kaydirici { position: relative; }
.ig-kaydirici__serit {
  display: flex; overflow-x: auto; overscroll-behavior-x: contain;
  scroll-snap-type: x mandatory; scrollbar-width: none;
}
.ig-kaydirici__serit::-webkit-scrollbar { display: none; }
.ig-kaydirici__serit:focus { outline: none; }
.ig-kaydirici__serit:focus-visible { box-shadow: inset var(--odak-halka); }
.ig-kaydirici__kare { position: relative; flex: 0 0 100%; min-width: 0; scroll-snap-align: start; background: var(--yuzey-3); }
.ig-kaydirici__sayac {
  position: absolute; inset-block-start: var(--b-3); inset-inline-end: var(--b-3);
  padding: 2px var(--b-2); border-radius: var(--r-tam);
  background: rgba(0, 0, 0, .7); color: #fff; font-size: var(--ts-xs); font-weight: 600;
}
.ig-kaydirici__ok {
  position: absolute; inset-block-start: 50%; transform: translateY(-50%);
  display: grid; place-items: center; width: 32px; height: 32px; border-radius: 50%;
  background: rgba(255, 255, 255, .92); color: #262626; box-shadow: var(--golge-1); cursor: pointer;
}
.ig-kaydirici__ok--onceki { inset-inline-start: var(--b-2); }
.ig-kaydirici__ok--sonraki { inset-inline-end: var(--b-2); }
.ig-kaydirici__noktalar { display: flex; justify-content: center; gap: 4px; margin-block-start: var(--b-2); }
.ig-kaydirici__sayac[hidden],
.ig-kaydirici__ok[hidden],
.ig-kaydirici__noktalar[hidden] { display: none; }
.ig-kaydirici__nokta { width: 6px; height: 6px; border-radius: 50%; background: var(--cizgi-guclu); }
.ig-kaydirici__nokta--etkin { background: var(--ig-mavi); }

/* Etkilesim satiri: yalniz glif (Instagram'da ad yok), etkisiz ve sayisiz (L4). */
.ig-gonderi__eylemler { display: flex; align-items: center; gap: var(--b-3); padding: var(--b-3) var(--b-4) 0; color: var(--metin); }
.ig-gonderi__eylemler .ikon { width: 24px; height: 24px; }
.ig-gonderi__kaydet { display: inline-flex; margin-inline-start: auto; }

.ig-gonderi__metin {
  padding: var(--b-2) var(--b-4) 0;
  font-size: 14px; line-height: 18px;
  white-space: pre-wrap;
  overflow-wrap: anywhere;
}
.ig-gonderi__metin:focus { outline: none; }
.ig-gonderi__metin:focus-visible { box-shadow: var(--odak-halka); }
.ig-gonderi__metin.metin--kirpik {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
}
.ig-gonderi__ad { font-weight: 600; }
.ig-etiket { color: var(--ig-mavi); }
.ig-gonderi__daha {
  display: block; min-height: 24px; padding: 0 var(--b-4);
  background: none; border: 0; color: var(--metin-3);
  font: inherit; font-size: 14px; cursor: pointer;
}
.ig-gonderi__daha[hidden] { display: none; }
.ig-gonderi__daha:hover { color: var(--metin); }

/* Hikaye: 9:16, metin YOK (hikayede baslik alani yok — resmi). */
.ig-story { max-width: 360px; margin-inline: auto; }
.ig-story__cerceve { position: relative; aspect-ratio: 9 / 16; border-radius: var(--r-lg); overflow: hidden; background: #000; color: #fff; }
.ig-story__medya { display: block; width: 100%; height: 100%; object-fit: contain; background: #000; }
.ig-story__ust {
  position: absolute; inset-block-start: 0; inset-inline: 0;
  display: grid; gap: var(--b-2); padding: var(--b-2) var(--b-3) var(--b-5);
  background: linear-gradient(rgba(0, 0, 0, .5), transparent); pointer-events: none;
}
.ig-story__ilerleme { display: block; height: 2px; border-radius: 2px; background: rgba(255, 255, 255, .9); }
.ig-story__yazar { display: flex; align-items: center; gap: var(--b-2); font-size: var(--ts-sm); }
.ig-story__alt {
  position: absolute; inset-block-end: 0; inset-inline: 0;
  display: flex; align-items: center; gap: var(--b-3); padding: var(--b-3);
  pointer-events: none;
}
/* Videolu hikayede satir, oynaticinin denetim cubugunun USTUNDE. */
.ig-story__cerceve:has(video) .ig-story__alt { inset-block-end: 44px; }
.ig-story__mesaj {
  flex: 1 1 auto; min-width: 0; padding: var(--b-2) var(--b-3);
  border: 1px solid rgba(255, 255, 255, .7); border-radius: var(--r-tam); font-size: var(--ts-sm);
}

/* ==========================================================================
   DIKEY VIDEO KABUGU (O3 · O4, Dilim 2) — _DikeyVideo
   Instagram Reels · Facebook videosu (reels) — Dilim 3: TikTok · YouTube Shorts.
   Metin videonun USTUNDE, alttan, satirla kirpilmis (O4); karartma okunurluk icin.
   🔴 Ust katmanlar pointer-events:none — oynaticinin denetimleri altta calisiyor;
   metin katmani denetim cubugunun (44px) USTUNDE. Otomatik oynatma YOK (WCAG 2.2.2).
   ========================================================================== */
.dikey { max-width: 360px; margin-inline: auto; }
.dikey__cerceve { position: relative; aspect-ratio: 9 / 16; border-radius: var(--r-lg); overflow: hidden; background: #000; color: #fff; }
.dikey__video { display: block; width: 100%; height: 100%; object-fit: contain; background: #000; }
.dikey__bos {
  position: absolute; inset: 0;
  display: grid; place-items: center; align-content: center; gap: var(--b-2);
  padding: var(--b-5); text-align: center; color: rgba(255, 255, 255, .85);
}
.dikey__ust {
  position: absolute; inset-block-start: 0; inset-inline: 0;
  display: flex; align-items: center; justify-content: space-between; padding: var(--b-3);
  background: linear-gradient(rgba(0, 0, 0, .45), transparent); pointer-events: none;
}
.dikey__eylemler {
  position: absolute; inset-inline-end: var(--b-2); inset-block-end: 150px;
  display: grid; gap: var(--b-4); pointer-events: none;
}
.dikey__eylemler .ikon { width: 26px; height: 26px; filter: drop-shadow(0 1px 2px rgba(0, 0, 0, .6)); }
.dikey__alt {
  position: absolute; inset-inline: 0; inset-block-end: 44px;
  padding-block: var(--b-8) var(--b-3); padding-inline: var(--b-3) 56px;
  background: linear-gradient(transparent, rgba(0, 0, 0, .7)); pointer-events: none;
}
.dikey__yazar { display: flex; align-items: center; gap: var(--b-2); font-size: var(--ts-sm); }
.dikey__metin {
  margin-block-start: var(--b-2); max-height: 14em; overflow-y: auto;
  font-size: 14px; line-height: 18px; white-space: pre-wrap; overflow-wrap: anywhere;
  text-shadow: 0 1px 2px rgba(0, 0, 0, .6); pointer-events: auto;
}
.dikey__metin:focus { outline: none; }
.dikey__metin:focus-visible { box-shadow: var(--odak-halka); }
.dikey__metin.metin--kirpik {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  overflow: hidden;
}
.dikey-etiket { font-weight: 600; }
.dikey__daha {
  min-height: 24px; padding: 0; pointer-events: auto;
  background: none; border: 0; color: rgba(255, 255, 255, .9);
  font: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
}
.dikey__daha[hidden] { display: none; }
/* YouTube Shorts: videonun ustunde BASLIK - iki satira CSS ile kirpiliyor ve ACILMIYOR
   (tamami altindaki aciklama panelinde; iki ayri "daha fazla" dugmesi olmasin). Tiklanmiyor. */
.dikey__metin--baslik {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  max-height: none; overflow: hidden;
  font-weight: 600; pointer-events: none;
}
/* Etkisiz abone hapi (L4) - YouTube'un beyaz hapi. */
.dikey__abone {
  margin-inline-start: var(--b-1); padding: 2px var(--b-3);
  border-radius: var(--r-tam); background: #fff; color: #0F0F0F;
  font-size: var(--ts-xs); font-weight: 600;
}

/* ==========================================================================
   YOUTUBE (O3 Dilim 3, 2026-09-24) — _YouTubeOnizleme
   Uzun video: 16:9 oynatici · baslik · kanal satiri · etkisiz eylem haplari ·
   aciklama kutusu (uc satirdan sonra kirpilmis - YAKLASIK, YouTube olcuyu
   yayimlamiyor; beyan kartin altinda). Shorts: dikey kabuk + aciklama paneli.
   ========================================================================== */
.yt-video__oynatici { position: relative; aspect-ratio: 16 / 9; background: #000; color: #fff; }
.yt-video__medya { display: block; width: 100%; height: 100%; object-fit: contain; background: #000; }
.yt-video__govde { padding: var(--b-3) var(--b-4) var(--b-4); }
.yt-video__baslik { font-size: var(--ts-lg); line-height: 1.35; font-weight: 700; overflow-wrap: anywhere; }
.yt-video__kanal { display: flex; align-items: center; gap: var(--b-3); margin-block-start: var(--b-3); min-width: 0; }
.yt-video__yazar { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }
.yt-abone {
  flex: 0 0 auto; padding: var(--b-2) var(--b-4);
  border-radius: var(--r-tam); background: var(--metin); color: var(--yuzey);
  font-size: var(--ts-sm); font-weight: 600;
}
.yt-video__eylemler { display: flex; flex-wrap: wrap; gap: var(--b-2); margin-block-start: var(--b-3); }
.yt-hap {
  display: inline-flex; align-items: center; gap: var(--b-2);
  padding: var(--b-2) var(--b-3); border-radius: var(--r-tam);
  background: var(--yuzey-2); color: var(--metin); font-size: var(--ts-sm); font-weight: 600;
}
.yt-hap__ayrac { width: 1px; align-self: stretch; background: var(--cizgi); }
.yt-aciklama { padding: var(--b-3); border-radius: var(--r-md); background: var(--yuzey-2); min-width: 0; }
.yt-aciklama__baslik { margin-block-start: var(--b-2); font-weight: 700; overflow-wrap: anywhere; }
/* YouTube aciklama metni 14/20 - kirpma (~3 satir) bu olcuyle anlamli. */
.yt-aciklama__metin {
  margin-block-start: var(--b-2);
  font-size: 14px; line-height: 20px; white-space: pre-wrap; overflow-wrap: anywhere;
}
.yt-aciklama__metin:focus { outline: none; }
.yt-aciklama__metin:focus-visible { box-shadow: var(--odak-halka); }
.yt-aciklama__metin.metin--kirpik {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
}
.yt-etiket { color: var(--yt-mavi); }
.yt-aciklama__daha {
  display: block; min-height: 24px; padding: 0;
  background: none; border: 0; color: var(--metin);
  font: inherit; font-size: 14px; font-weight: 600; cursor: pointer;
}
.yt-aciklama__daha[hidden] { display: none; }
.yt-aciklama__daha:hover { text-decoration: underline; }

/* ---- Bilesenler paneli ---- */
.bilesenler { display: grid; gap: var(--b-3); margin-block-start: var(--b-3); }
.bilesen { border-block-start: 1px solid var(--cizgi); padding-block-start: var(--b-3); min-width: 0; }
.bilesen:first-child { border-block-start: 0; padding-block-start: 0; }
.bilesen__bas { display: flex; align-items: center; gap: var(--b-2); min-height: 32px; }
.bilesen__bas .btn { margin-inline-start: auto; }
.bilesen__ad { font-size: var(--ts-sm); font-weight: 600; color: var(--metin-2); }
.bilesen__deger { margin: var(--b-2) 0 0; overflow-wrap: anywhere; font-size: var(--ts-sm); }
/* Metin burada KISA gosteriliyor (4 satir) - tamami solda ve metin kartinda.
   Kopyala textContent okudugu icin kirpma panoya giden metni ETKILEMIYOR. */
.bilesen__deger--kisa {
  white-space: pre-wrap;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 4;
  line-clamp: 4;
  overflow: hidden;
}
.li-etiketler { color: var(--li-mavi); font-weight: 600; }
.bilesen-dosyalar { list-style: none; padding: 0; display: grid; gap: var(--b-2); }
.bilesen-dosya { display: flex; align-items: center; gap: var(--b-2); min-width: 0; }
.bilesen-dosya__ad { display: flex; flex-direction: column; flex: 1 1 auto; min-width: 0; }
.bilesen-dosya__isim { overflow-wrap: anywhere; }
.bilesen-anket { display: grid; gap: var(--b-2); }
.bilesen-anket__satir { display: flex; align-items: center; gap: var(--b-2); min-width: 0; }
.bilesen-anket__etiket { flex: 0 0 auto; }
.bilesen-anket__deger { flex: 1 1 auto; min-width: 0; overflow-wrap: anywhere; }

/* SAHNE PLANI VE AI PROMPT ONERISI (kullanici talebi 2026-09-28, V1-V4).
   Uzun videonun sahneleri sihirbazin 3. adiminda, onerinin penceresinde ve icerik
   detayinda AYNI yuva deseniyle ciziliyor.

   🔴 `[hidden]` KURALI ZORUNLU (kayitli "yazar display kurali [hidden]'i ezer" tuzagi):
   JS bos kalan fazla yuvayi `hidden` ile gizliyor ve bildirim cikisi `display: block`
   tasiyor — kural olmasa gizlenen yuva ve bos bildirim GORUNUR kalirdi.
   ⚖️ Suresine sigmayan yuva SOLUK DEGIL (opacity kontrasti dusurur, WCAG), kesikli
   kenar + ikinci yuzeyle ayriliyor; ne oldugunu metin soyluyor. */
.sahne-plani { list-style: none; margin: var(--b-4) 0 0; padding: 0; display: grid; gap: var(--b-3); }
.sahne-yuva { border: 1px solid var(--cizgi); border-radius: var(--r-md); padding: var(--b-4); min-width: 0; }
.sahne-yuva[hidden] { display: none; }
.sahne-yuva--disarida { border-style: dashed; background: var(--yuzey-2); }
.sahne-yuva__baslik { font-size: var(--ts-sm); margin-bottom: var(--b-2); }
/* ÇOK SAHNELİ VİDEO (Dilim 2, T4 · K7) — 8'in üstünde sahne kartı katlı: kart dolgusu sıkı (180 kart), özet satırı tam genişlik
   ve sarılıyor, başlık özetin içinde (alt boşluğu yok). "Sahneye git" onarlı grupların düğmeleri sarılıyor; sahne sayısı kutusu
   dar (üç hane). */
.sahne-yuva--katli { padding: var(--b-2) var(--b-4); }
.sahne-katman { margin-top: 0; }
.sahne-katman__baslik { display: flex; flex-wrap: wrap; width: 100%; }
.sahne-katman__baslik .sahne-yuva__baslik { margin-bottom: 0; }
.sahne-git__liste { list-style: none; margin: var(--b-2) 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--b-2); }
.sahne-sayisi { align-items: center; gap: var(--b-2); }
.sahne-sayisi__girdi { width: 6rem; flex: 0 0 auto; }
/* Plan 12.27 (S3) — sahnede seçilen görselin küçük resmi: seçim çipinin içinde, sığdırılmış (kırpılmaz — kullanıcı
   hangi ürünü seçtiğini görmeli); adı yanındaki metin veriyor (alt=""). */
.sahne-gorsel__resim {
  flex: none;
  width: 2.5rem;
  height: 2.5rem;
  object-fit: contain;
  border-radius: var(--r-sm);
  border: 1px solid var(--cizgi);
  background: var(--yuzey-2);
}

/* ==========================================================================
   PLAN 12.28 — SİHİRBAZIN 3. ADIMI SADELEŞTİRME (A1–A8)
   ⚖️ A0 (kullanıcı): video kalitesi azalmaz — burada yalnız açıklama metni katlanıyor ve aralıklar
   sıkılaşıyor; üretime giden alanlar (brief, sahne tarifi, görsel seçimi, çözünürlük) küçülmüyor.
   ========================================================================== */

/* A1 · A2 — "Nasıl çalışır?" ve isteğe bağlı ekler: <details>, JS'siz. SSS deseninin kart içi küçük hâli;
   başlık satırı en az 32 px (dokunma hedefi, WCAG 2.5.8). Katlı alanlar formla gitmeye DEVAM eder. */
.ayrinti { margin-top: var(--b-3); }
.ayrinti__baslik {
  display: inline-flex;
  align-items: center;
  gap: var(--b-2);
  min-height: 32px;
  cursor: pointer;
  list-style: none;
  color: var(--metin-2);
  font-size: var(--ts-sm);
  font-weight: 600;
  border-radius: var(--r-sm);
}
.ayrinti__baslik::-webkit-details-marker { display: none; }
.ayrinti__baslik:hover { color: var(--metin); }
.ayrinti__baslik:focus-visible { outline: none; box-shadow: var(--odak-halka); }
.ayrinti__ok { flex: 0 0 auto; transition: transform .18s ease; }
.ayrinti[open] > .ayrinti__baslik .ayrinti__ok { transform: rotate(180deg); }
.ayrinti__deger { font-weight: 400; color: var(--metin-3); overflow-wrap: anywhere; }
.ayrinti__icerik { padding-block: var(--b-2) var(--b-1); }
.ayrinti__icerik > * + * { margin-top: var(--b-2); }

/* A3 — sahne yuvası: konuşma alanı ses "yok" iken JS ile gizleniyor (`hidden`); `.alan` blok gösterimi
   [hidden]'ı ezmesin (kayıtlı "yazar display kuralı [hidden]'ı ezer" tuzağı). Görsel seçimi kompakt çip. */
.sahne-konusma[hidden] { display: none; }
.sahne-gorsel-secimi { display: flex; flex-wrap: wrap; gap: var(--b-2); }
.sahne-gorsel-secimi .secim-secenek { padding-block: var(--b-1); padding-inline: var(--b-2) var(--b-3); gap: var(--b-2); }

/* A7 — YAPIŞKAN EYLEM ÇUBUĞU: Geri · Taslak · Devam/Üret sayfanın her yerinde. Bedel yalnız 4. adımda
   (sunucunun hesapladığı rakam orada). 🔴 WCAG 2.4.11 — odaklanan alan çubuğun ALTINDA KALMASIN:
   klavyeyle gezinmede tarayıcı odağı görünür alana kaydırırken scroll-padding'i hesaba katıyor. */
.form__eylem--yapiskan {
  position: sticky;
  bottom: 0;
  z-index: 5;
  padding: var(--b-3) var(--b-4);
  background: var(--yuzey);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md) var(--r-md) 0 0;
  box-shadow: var(--golge-2);
}
.form__eylem-sag { display: flex; align-items: center; gap: var(--b-3); flex-wrap: wrap; margin-inline-start: auto; }
.form__eylem-bedel { font-weight: 600; }

/* PLAN 12.31 (K8) — taslak sayfa yenilemeden kaydediliyor; sonucu çubukta KENDİ satırında (son sırada, tam genişlik).
   Mesaj yokken gizli: yazar `display` kuralı [hidden]'ı ezdiği için gizleme açıkça yazılı (kayıtlı tuzak). İşlem
   sürerken düğme meşgul imleci gösteriyor (yerinde.js aria-busy koyuyor). */
.form__eylem-durum { order: 3; flex-basis: 100%; display: flex; align-items: center; gap: var(--b-2); margin: 0; color: var(--metin-2); }
.form__eylem-durum[hidden] { display: none; }
#sihirbaz-formu button[aria-busy="true"] { cursor: progress; }
/* PLAN 12.31 (K8) — üst yarısı: yapışkan üst bar (`.ust`) da odağı örtmesin; yerinde.js odağı taşıdığı öğeyi
   (kartın mesajı, yeni sahne) bu aralığa kaydırıyor. */
html:has(.form__eylem--yapiskan) { scroll-padding-bottom: 6rem; scroll-padding-top: calc(var(--ust-yukseklik) + var(--b-3)); }
/* Telefonda çubuk TEK satır kalsın (iki satır ~115 px, ekranın yedide biriydi — 390 px ekran görüntüsü). */
@media (max-width: 480px) {
  .form__eylem--yapiskan { gap: var(--b-2); padding: var(--b-2) var(--b-3); }
  .form__eylem--yapiskan .form__eylem-sag { gap: var(--b-2); }
  .form__eylem--yapiskan .btn { padding-inline: var(--b-3); }
}

/* Kısa etiketli seçenekler (anlatıcı sesi) ızgara yerine sarılan satır: telefonda alt alta üç satır yerine. */
.secim-grubu__liste--satir { display: flex; flex-wrap: wrap; }

/* Plan 12.44 — "Videoda kim konuşsun?": açıklamalı seçenekler tek sütunda; açıklama ikinci satırda, radyo ilk satırın
   hizasında (açıklama JS'siz de okunuyor — seçimin ne yaptığı seçmeden önce). */
.konusma-secenekleri { grid-template-columns: 1fr; }
.konusma-secenegi { align-items: flex-start; }
.konusma-secenegi input { margin-top: 3px; }
.konusma-secenegi__metin { display: flex; flex-direction: column; gap: 2px; }

/* A8 — marka rehberi kartı katlanır başlıkla (telefonda kapalı açılıyor; JS'siz açık). */
.rehber-katlanir__baslik { cursor: pointer; list-style: none; }
.rehber-katlanir__baslik::-webkit-details-marker { display: none; }
.rehber-katlanir__baslik:focus-visible { outline: none; box-shadow: var(--odak-halka); }
.rehber-katlanir[open] .ayrinti__ok { transform: rotate(180deg); }
.sahne-bildirim { display: block; margin-bottom: var(--b-4); }
.sahne-bildirim[hidden] { display: none; }
/* Oneri penceresinin alt cubugu uc dugme tasiyabiliyor (Kapat · Oneri al · Bu plani
   kullan); 390px'te tek satira sigmiyor ve kaydirma cubugu dogardi — satir kiriliyor. */
.modal__alt--sar { flex-wrap: wrap; }

/* ==========================================================================
   PLAN 10.14 · 10.15 — SOSYAL HESAP KURULUMU (2026-09-29)
   ⚖️ Yalniz TANIMLI tokenlar ve MANTIKSAL ozellikler (RTL nobetcisi): yeni bilesen
   yalniz yan sutunun adim listesi ve marka bilgileri kutusu; gerisi tasarim sisteminin
   mevcut parcalari (kart · kutu · alan · secim-grubu · izgara--ana-yan).
   ========================================================================== */

/* Sihirbazin yan sutunu: adimlar GERCEK BAGLANTI (her adim kendi GET adresinde), bu
   yuzden .adimlar bileseni kullanilmadi — orada tamamlanmis adima bilerek duz imlec
   veriliyor (tiklanamaz span). */
.kurulum-adimlari { list-style: none; margin: 0; padding: 0; }
.kurulum-adimlari li + li { border-top: 1px solid var(--cizgi); }
.kurulum-adimlari a {
  display: flex; align-items: center; gap: var(--b-2);
  min-height: 44px; padding: var(--b-2) var(--b-4);
  color: var(--metin-2); text-decoration: none;
}
.kurulum-adimlari a:hover { background: var(--yuzey-2); }
.kurulum-adimlari a[aria-current="step"] { color: var(--metin); font-weight: 600; background: var(--marka-zayif); }
.kurulum-adimlari__no {
  flex: none; display: inline-grid; place-items: center;
  width: 24px; height: 24px; border-radius: var(--r-tam);
  background: var(--yuzey-3); color: var(--metin-2); font-size: var(--ts-xs); font-weight: 600;
}
.kurulum-adimlari__oge--tamam .kurulum-adimlari__no { background: var(--basari-dolgu); color: #fff; }
.kurulum-adimlari__oge--aktif .kurulum-adimlari__no { background: var(--marka); color: var(--marka-uzeri); }
.kurulum-adimlari__tik { margin-inline-start: auto; color: var(--basari); }

/* Adim maddeleri ve rehberin adim listesi. ⚠️ list-style ACIKCA yaziliyor: sifirlama kurali
   ul isaretlerini kaldiriyor ve maddeler girintili paragraf gibi gorunuyordu (ekran goruntusu). */
.kurulum-maddeleri { margin: var(--b-3) 0 0; padding-inline-start: var(--b-5); list-style: disc; }
.kurulum-maddeleri li + li { margin-top: var(--b-2); }

/* Plan 12.43 — sihirbazın "Bu metin nerede kullanılıyor?" kutusu (genel video istemi). ⚠️ list-style AÇIKÇA: sıfırlama
   kuralıyla maddeler imsiz düz satır gibi okunuyor ve ardındaki uyarı maddelerin devamı sanılıyordu (ekran görüntüsü). */
.video-istemi-maddeleri { margin: var(--b-2) 0 0; padding-inline-start: var(--b-5); list-style: disc; }

/* Plan 12.51 — video düzeltme kartında sürümün biriken görüntü düzeltmeleri (sırayla). ⚠️ list-style AÇIKÇA: sıfırlama
   kuralı numarayı siler. */
.video-duzeltme__gecmis { margin: var(--b-1) 0 0; padding-inline-start: var(--b-5); list-style: decimal; }
.video-istemi-maddeleri li + li { margin-top: var(--b-1); }
.rehber-adimlari { list-style: none; margin: 0; padding: 0; }

/* Marka bilgileri kutusu: etiket · deger · kopyala. Uzun web adresi 390px'te belgeyi
   TASIRMAMALI (WCAG 1.4.10) — deger kirilabilir. */
.kurulum-malzeme { border: 1px solid var(--cizgi); border-radius: var(--r-md); padding: var(--b-4); background: var(--yuzey-2); }
.kurulum-malzeme__liste { margin: var(--b-3) 0 0; }
.kurulum-malzeme__satir { display: flex; flex-wrap: wrap; align-items: center; gap: var(--b-2) var(--b-3); padding: var(--b-2) 0; }
.kurulum-malzeme__satir + .kurulum-malzeme__satir { border-top: 1px solid var(--cizgi); }
.kurulum-malzeme__satir dt { flex: 0 0 9rem; color: var(--metin-3); font-size: var(--ts-sm); }
.kurulum-malzeme__satir dd { flex: 1 1 12rem; min-width: 0; margin: 0; display: flex; flex-wrap: wrap; align-items: center; gap: var(--b-2); }
.kurulum-malzeme__deger { overflow-wrap: anywhere; }

/* Plan 10.16 — AI kurulum paketi. Cok paragrafli metin (LinkedIn genel bakis, YouTube aciklamasi)
   satir sonlarini korur ve etiketin altina tam satira iner; oneriler cip listesi; kapak ve profil
   fotografi onizlemesi kap genisligini ASMAZ (390px, WCAG 1.4.10). */
.kurulum-malzeme__deger--uzun { white-space: pre-wrap; flex-basis: 100%; }
.kurulum-oneriler { list-style: none; margin: var(--b-2) 0 0; padding: 0; display: flex; flex-wrap: wrap; gap: var(--b-2); }
.kurulum-oneriler li { display: inline-flex; align-items: center; gap: var(--b-2); padding: var(--b-1) var(--b-3); border: 1px solid var(--cizgi); border-radius: var(--r-md); background: var(--yuzey); overflow-wrap: anywhere; }
.kurulum-gorsel { margin: var(--b-3) 0 0; }
.kurulum-gorsel img { display: block; max-width: 100%; height: auto; border: 1px solid var(--cizgi); border-radius: var(--r-md); background: var(--yuzey); }
.kurulum-gorsel--daire img { width: 7rem; height: 7rem; border-radius: var(--r-tam); }
.kurulum-gorsel figcaption { margin-top: var(--b-2); display: flex; flex-wrap: wrap; align-items: center; gap: var(--b-2); }
.kurulum-paket__liste { margin: var(--b-2) 0 0; padding-inline-start: var(--b-5); list-style: disc; }
.kurulum-paket__liste li + li { margin-top: var(--b-1); }

/* --------------------------------------------------------------------------
   12.26 — REFERANS GÖRSEL IZGARASI (sihirbazın 3. adımı · içerik detayı)
   Küçük resim kare çerçevede ve İÇİNE SIĞAR (kırpılmaz): kullanıcı ürününün
   tamamını görmeli. auto-fill + 9rem: 390 px'te iki sütun, sarma kendiliğinden.
   Izgara çocuğu min-width: 0 — uzun dosya adı/rol seçimi sütunu aşmasın.
   -------------------------------------------------------------------------- */
.referans-izgara {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(9rem, 1fr));
  gap: var(--b-3);
}
.referans-oge {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: var(--b-2);
}
.referans-oge__resim {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: contain;
  border-radius: var(--r-md);
  border: 1px solid var(--cizgi);
  background: var(--yuzey-2);
}
/* 12.32 — liste ve sayaç boşken de çiziliyor (yükleyici ekliyor): ızgaranın display kuralı [hidden]'ı ezerdi. */
.referans-izgara[hidden] { display: none; }

/* --------------------------------------------------------------------------
   PLAN 12.32 — GÖRSEL YÜKLEYİCİ (gorsel-yukleyici.js)
   Bırakma alanı yalnız JS ile görünür ([hidden] açıkça yazılı: yazar display
   kuralı onu ezerdi — kayıtlı tuzak). Kuyruk öğesi: önizleme (canvas — CSP
   img-src blob/data izin vermiyor) · ad · durum · ilerleme · Kaldır. Rol
   düğmeleri dar ızgara hücresinde alt alta ve kompakt; satır yüksekliği 24 px'in
   üstünde (WCAG 2.5.8).
   -------------------------------------------------------------------------- */
.referans-birak {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--b-3);
  padding: var(--b-6) var(--b-4);
  border: 2px dashed var(--cizgi-guclu);
  border-radius: var(--r-lg);
  background: var(--yuzey-2);
  text-align: center;
  transition: border-color var(--gecis-hizli), background var(--gecis-hizli);
}
.referans-birak[hidden] { display: none; }
.referans-birak--ustunde { border-color: var(--marka); background: var(--marka-zayif); }
.referans-birak__metin { color: var(--metin-2); }
.referans-kuyruk { list-style: none; padding: 0; display: grid; gap: var(--b-2); }
.referans-kuyruk[hidden] { display: none; }
.referans-kuyruk__oge {
  display: flex;
  align-items: center;
  gap: var(--b-3);
  min-width: 0;
  padding: var(--b-2) var(--b-3);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md);
  background: var(--yuzey);
}
.referans-kuyruk__oge--hata { border-color: var(--hata); background: var(--hata-zayif); }
.referans-kuyruk__onizleme {
  flex: 0 0 auto;
  width: var(--b-12);
  height: var(--b-12);
  border-radius: var(--r-sm);
  background: var(--yuzey-2);
  overflow: hidden;
}
.referans-kuyruk__onizleme canvas { display: block; width: 100%; height: 100%; }
.referans-kuyruk__bilgi { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: var(--b-1); }
.referans-kuyruk__ad { overflow-wrap: anywhere; }
.referans-kuyruk__ilerleme { width: 100%; height: var(--b-2); accent-color: var(--marka); }
.referans-kuyruk__ilerleme[hidden] { display: none; }
.referans-kuyruk__oge > .btn { flex: 0 0 auto; }
.referans-kuyruk__oge > .btn[hidden] { display: none; }
.referans-rol { display: grid; gap: var(--b-1); }
.referans-rol__secenek { padding: var(--b-1) var(--b-2); gap: var(--b-2); }

/* --------------------------------------------------------------------------
   PLAN 12.33 — GÖRSELLERİM (referans kartının içinde · gorsellerim.js)
   Kartta ayrı bölüm (üst çizgi): yüklenenlerden sonra "daha önce ürettiklerim / yüklediklerim". Izgara referans
   listesinin ölçüsünde (küçük resim kare, contain); içerik başlığı iki satırda kırpılıyor (uzun başlık kutucuğu
   uzatmasın); düğme kutucuk genişliğinde. Arama satırı dar ekranda sarıyor, kutu esneyerek genişliyor. Yükleme
   sürerken (aria-busy) sonuç bölgesi soluk — yanıt gelince değişiyor.
   -------------------------------------------------------------------------- */
.gorsellerim { border-block-start: 1px solid var(--cizgi); padding-block-start: var(--b-5); }
.gorsellerim__baslik { font-size: var(--ts-md); margin-block-end: var(--b-1); }
.gorsellerim__arama { align-items: center; gap: var(--b-2); }
.gorsellerim__arama .girdi { flex: 1 1 14rem; min-width: 0; width: auto; }
.gorsellerim__arama .btn { flex: 0 0 auto; }
/* Plan 12.35 (B4) — kullanım yeri süzgeci aramanın yanında; select.secim'in %100 genişliği satırı bölmesin. */
.gorsellerim__arama .gorsellerim__suzgec { flex: 0 1 12rem; width: auto; min-width: 0; }
.gorsellerim__sonuc[aria-busy="true"] { opacity: .6; transition: opacity var(--gecis-hizli); }
.gorsellerim-izgara {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(8rem, 1fr));
  gap: var(--b-3);
}
.gorsellerim-oge { min-width: 0; display: flex; flex-direction: column; gap: var(--b-2); }
.gorsellerim-oge__resim {
  width: 100%;
  height: auto;
  aspect-ratio: 1 / 1;
  object-fit: contain;
  border-radius: var(--r-md);
  border: 1px solid var(--cizgi);
  background: var(--yuzey-2);
}
.gorsellerim-oge__baslik {
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  overflow-wrap: anywhere;
  color: var(--metin-2);
}
.gorsellerim-oge > .btn { width: 100%; justify-content: center; }

/* --------------------------------------------------------------------------
   PLAN 12.36 — COKLU GORSEL LISTESI (Brief adimi) ve ozetteki satirlari.
   Satir sahne yuvasinin deseni (kenarlikli kutu); boyut ve ad iki sutun, dar ekranda alt alta (izgara--2).
   Izgara hucresi min-width: 0 — secicinin en uzun secenegi (ornegin "Instagram dikey gonderi — 1080 × 1350 px")
   hucreyi ve 390 px'te belgeyi genisletmesin. Ozel boyut alani JS ile `hidden` (secim-grubu display tasimiyor).
   -------------------------------------------------------------------------- */
.gorsel-listesi { list-style: none; margin: 0; padding: 0; display: grid; gap: var(--b-3); }
.gorsel-satiri { border: 1px solid var(--cizgi); border-radius: var(--r-md); padding: var(--b-4); min-width: 0; }
.gorsel-satiri__baslik { font-size: var(--ts-sm); margin-bottom: var(--b-2); }
.gorsel-satiri .izgara > * { min-width: 0; }
.gorsel-satiri .secim-grubu { margin-top: var(--b-3); }
/* Plan 12.38 — "bütün görseller için" bölümü satırlardan AYRI bir kutu (zemin tonuyla): kullanıcı üstteki ortak alanı bir
   görsel girişi sandı; ortak seçimler görsel satırlarına benzememeli. */
.gorsel-hepsi { border: 1px solid var(--cizgi); border-radius: var(--r-md); padding: var(--b-4); background: var(--yuzey-2); min-width: 0; }
.gorsel-hepsi > legend { padding-inline: var(--b-2); }
.gorsel-hepsi .izgara > * { min-width: 0; }
/* Özetin "Görseller" satırı künyenin sütunlarına BÖLÜNMÜYOR (ekran görüntüsüyle bulundu: bir görselin adı bir sütunda,
   ölçüsü sonrakinde kalıyordu): başlık ve liste tam genişlikte (column-span), liste kendi sütunlarında, öge bölünmeden —
   elli görsellik listede de kısa kalıyor. Seri durumunun görsel listesi (sonuç/detay) aynı sınıfı kullanıyor. */
.kunye .kunye__tam { column-span: all; }
/* Sunuculu video Dilim 1 — ekran görüntüsüyle bulundu: sütun kümesinin sonundaki dd'nin alt boşluğu sütun sınırında KESİLİYOR
   (çok sütunlu düzende kırılmaya bitişik boşluk atılır), tam genişlikteki etiket üstteki değere yapışıyordu. */
.kunye dd + dt.kunye__tam { margin-top: var(--b-3); }
.ozet-gorsel-listesi { margin: 0; padding-inline-start: var(--b-5); columns: 210px 4; column-gap: var(--b-5); }
.ozet-gorsel-listesi > li { break-inside: avoid; margin-bottom: var(--b-2); }

/* Plan 12.37 (E4) — /stiller: kayıtlı görsel stillerinin listesi. Kalemler arasında ince çizgi; metin satır sonlarını
   koruyor (stil metni çok satırlı yazılabiliyor) ve uzun kelimede taşmıyor. */
.stil-listesi { list-style: none; margin: 0; padding: 0; }
.stil-kalemi { padding-block: var(--b-4); border-top: 1px solid var(--cizgi); }
.stil-kalemi:first-child { padding-top: 0; border-top: 0; }
.stil-kalemi__ad { margin: 0 0 var(--b-1); font-size: var(--ts-md); line-height: var(--lh-md); }
.stil-kalemi__metin { margin: 0; white-space: pre-line; overflow-wrap: anywhere; }
.stil-kalemi__islem { align-items: flex-start; margin-top: var(--b-2); }
/* "Düzenle" (details) ile "Sil" aynı hizada: .ayrinti'nin genel üst boşluğu bu satırda düzenlemeyi aşağı itiyordu
   (ekran görüntüsüyle bulundu, ~12 px). */
.stil-kalemi__islem > .ayrinti { margin-top: 0; }

/* ==========================================================================
   PLAN 12.42 — GÖNDERİDEKİ GÖRSELLER (seçim ve sıra · sonuç ekranı + içerik detayı ortak kart)
   Çıkarılan görsel SOLUK DEĞİL (opacity kontrastı düşürür, WCAG): kesikli kenar + ikinci yüzey, ne olduğunu metin
   söylüyor (sahne yuvasının deseni). Dar ekranda eylemler alt satıra iniyor — satır sarar, belge yatay kaymaz.
   ========================================================================== */
.gonderi-gorselleri { list-style: none; margin: var(--b-4) 0 0; padding: 0; display: grid; gap: var(--b-2); }
.gonderi-gorseli {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--b-3);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-md);
  padding: var(--b-2) var(--b-3);
  min-width: 0;
}
.gonderi-gorseli--disarida { border-style: dashed; background: var(--yuzey-2); }
.gonderi-gorseli__resim {
  flex: none;
  width: 4rem;
  height: 4rem;
  object-fit: cover;
  border-radius: var(--r-sm);
  border: 1px solid var(--cizgi);
  background: var(--yuzey-2);
}
.gonderi-gorseli__bilgi { flex: 1 1 10rem; min-width: 0; display: grid; gap: var(--b-1); }
.gonderi-gorseli__eylemler { display: flex; flex-wrap: wrap; gap: var(--b-2); margin: 0; }

/* ==========================================================================
   PLAN 12.64 · 12.67 · 12.71 — VİDEO DÜZELTME KARTI: yardım rehberi, toplu düzeltme, sahne oynatıcısı
   ========================================================================== */

/* 12.64 — rehber başlıkları (pencerede ve /sss'te aynı parça). */
.video-yardim__konu + .video-yardim__konu { margin-top: var(--b-4); padding-top: var(--b-4); border-top: 1px solid var(--cizgi); }
.video-yardim__liste { margin: var(--b-2) 0 0; padding-inline-start: var(--b-5); }
.video-yardim__liste > li + li { margin-top: var(--b-1); }

/* S15 — sahne rehberinin örnek sahneleri: metin ve o sahnenin videosu yan yana; kap darsa (pencere, 390 px) alt alta.
   Kap sorgusu bölümde (pencere de /sss de aynı parça; ölçüt görünüm alanı değil bölümün kendi genişliği). */
.sahne-rehber-sahne { container-type: inline-size; }
.sahne-rehber-sahne__ic { display: grid; gap: var(--b-4); grid-template-columns: minmax(0, 1fr); }
@container (min-width: 600px) {
  .sahne-rehber-sahne__ic { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); align-items: start; }
}
.sahne-rehber-sahne__video { margin: 0; }
.sahne-rehber-sahne__oynatici { display: block; width: 100%; height: auto; aspect-ratio: 16 / 9; background: #000; border-radius: var(--r-sm); }

/* 12.67 — "bütün videoya uygula" bölümü sahne listesinden ayrılsın. */
.video-duzeltme__toplu { padding: var(--b-3) var(--b-4); border: 1px solid var(--cizgi); border-radius: var(--r-md); }

/* 12.71 — sahnenin kendi videosu: kartın içinde sınırlı boy (sekiz sahnede sayfayı kaplamasın), siyah zemin. */
.video-duzeltme__oynatici {
  display: block;
  width: 100%;
  max-width: 480px;
  max-height: 320px;
  background: #000;
  border-radius: var(--r-sm);
}

/* ══════════════════════════════════════════════════════════════════════════
   K32 + K33 — SÜRÜKLEMELİ KIRPMA ARACI (Plan/video-kirpma-araci.md; _VideoKirpmaAraci.cshtml + video-kirpma.js)
   ══════════════════════════════════════════════════════════════════════════
   Konum CSS özel değişkenleriyle: --bas, --son, --an (yüzde; betik CSSOM'dan yazar — CSP satır içi stili yasaklıyor). Tutamacın
   görünen eni 14 px, dokunma alanı ::before ile 44 px. Kare şeridi şeridin zemininde; dışarıda kalan kısım karartılır. */
.kirpma__video { display: block; width: 100%; max-height: 52vh; background: #000; border-radius: var(--r-sm); }
.kirpma__serit {
  --bas: 0%;
  --son: 100%;
  --an: 0%;
  position: relative;
  block-size: 52px;
  margin-inline: 8px;
  background: var(--yuzey-2);
  border-radius: var(--r-sm);
  touch-action: none;
  user-select: none;
}
.kirpma__kareler {
  position: absolute;
  inset: 0;
  display: grid;
  grid-template-columns: repeat(8, minmax(0, 1fr));
  overflow: hidden;
  border-radius: inherit;
}
.kirpma__kareler canvas { display: block; inline-size: 100%; block-size: 100%; object-fit: cover; }
.kirpma__dis { position: absolute; inset-block: 0; background: rgb(0 0 0 / .6); pointer-events: none; }
.kirpma__dis--bas { inset-inline-start: 0; inline-size: var(--bas); border-start-start-radius: var(--r-sm); border-end-start-radius: var(--r-sm); }
.kirpma__dis--son { inset-inline-end: 0; inline-size: calc(100% - var(--son)); border-start-end-radius: var(--r-sm); border-end-end-radius: var(--r-sm); }
.kirpma__secim {
  position: absolute;
  inset-block: 0;
  inset-inline-start: var(--bas);
  inline-size: calc(var(--son) - var(--bas));
  border-block: 3px solid var(--marka);
  pointer-events: none;
}
.kirpma__an { position: absolute; inset-block: -2px; inset-inline-start: var(--an); inline-size: 2px; background: #fff; box-shadow: 0 0 0 1px #000; pointer-events: none; }
.kirpma__tutamac {
  position: absolute;
  inset-block: -6px;
  inline-size: 14px;
  margin-inline-start: -7px;
  background: var(--marka);
  border-radius: 4px;
  box-shadow: 0 0 0 2px #fff;
  cursor: ew-resize;
  touch-action: none;
}
.kirpma__tutamac::before { content: ""; position: absolute; inset-block: -6px; inset-inline: -15px; }
.kirpma__tutamac--bas { inset-inline-start: var(--bas); }
.kirpma__tutamac--son { inset-inline-start: var(--son); }
.kirpma__tutamac:focus-visible { box-shadow: 0 0 0 2px #fff, var(--odak-halka); }
.kirpma__olcu { display: flex; justify-content: space-between; gap: var(--b-2); font-variant-numeric: tabular-nums; }
.kirpma__sayilar .alan { inline-size: 9rem; }
/* İzleme kipinde (birleşik videonun sahnesi) şerit ve kırpma denetimleri yok. */
.kirpma[data-kip="izle"] :is(#kirpma-zaman, #kirpma-ipucu, #kirpma-oynat, .kirpma__sayilar, #kirpma-not, #kirpma-ekle, #kirpma-kaldir) { display: none; }
/* Sahne listesindeki tek başına duran bağlantılar (videodaki hâli · ham klip): dokunma hedefi ≥ 24 px (`.kunye a` deseni). */
.kirpma-baglanti { display: inline-flex; align-items: center; min-height: 24px; }
.kirpma-bekleyen { padding: var(--b-3) var(--b-4); border: 1px solid var(--marka); border-radius: var(--r-md); background: var(--yuzey-2); }
.kirpma-bekleyen__liste { margin: var(--b-2) 0 0; padding: 0; list-style: none; display: grid; gap: var(--b-1); }
.kirpma-bekleyen__liste li { display: flex; align-items: center; justify-content: space-between; gap: var(--b-2); flex-wrap: wrap; }

/* Plan 12.69 — alt yazıyı elle düzeltme: satırlar listesi (madde işaretsiz; zaman etiketi satırın üstünde). */
.alt-yazi-duzelt__liste {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--b-3);
}

/* ==========================================================================
   PLAN 12.73 (K4) — "NE ÜRETİLECEK?" VE TÜR KARTLARI
   Kullanıcı (2026-10-13): seçeneklerin görüntüsü kötüydü; her seçenek ne işe yaradığını anlatmalı. Taban app.css'in
   .secim kartı (sadık kopya, düzenlenmiyor); burada yalnız düzen. Radyo gerçek form denetimi: kartın sağ üstünde,
   seçili kart marka kenarlığı ve zayıf marka zemini alıyor (.secim-secenek'in :has deseni).
   ========================================================================== */
.kapsam-secenekleri {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(17rem, 1fr));
  gap: var(--b-3);
}

.tur-secenekleri {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(14rem, 1fr));
  gap: var(--b-2);
}

.kapsam-secenegi,
.tur-secenegi {
  position: relative;
  align-items: flex-start;
  gap: var(--b-3);
  padding: var(--b-4);
  padding-inline-end: var(--b-10);
  min-width: 0;
}

.tur-secenegi { padding-block: var(--b-3); padding-inline: var(--b-3) var(--b-8); }

/* 🔴 .secim display:flex verir ve tarayıcının [hidden] kuralını EZER (kayıtlı tuzak) — gizlenen seçenek görünür kalırdı. */
.kapsam-secenegi[hidden],
.tur-secenegi[hidden] { display: none; }

.kapsam-secenegi input,
.tur-secenegi input {
  position: absolute;
  inset-block-start: var(--b-4);
  inset-inline-end: var(--b-4);
  width: 18px;
  height: 18px;
  margin: 0;
  accent-color: var(--marka);
  cursor: pointer;
}

.tur-secenegi input { inset-block-start: var(--b-3); inset-inline-end: var(--b-3); }

.kapsam-secenegi:has(input:checked),
.tur-secenegi:has(input:checked) { border-color: var(--marka); background: var(--marka-zayif); }
.kapsam-secenegi:has(input:focus-visible),
.tur-secenegi:has(input:focus-visible) { box-shadow: var(--odak-halka); }

.kapsam-secenegi__ikon,
.tur-secenegi__ikon {
  flex: 0 0 auto;
  display: inline-grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: var(--r-md);
  color: var(--marka);
  background: var(--marka-zayif);
}

.tur-secenegi__ikon { width: 32px; height: 32px; }

.kapsam-secenegi__govde,
.tur-secenegi__govde {
  display: flex;
  flex-direction: column;
  gap: var(--b-1);
  min-width: 0;
}

.kapsam-secenegi__bas {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--b-2);
}

.kapsam-secenegi__ad { font-weight: 700; font-size: var(--ts-md); color: var(--metin); }
.tur-secenegi__ad { font-weight: 600; color: var(--metin); }
.kapsam-secenegi__ozet { color: var(--metin-2); font-size: var(--ts-sm); }
.tur-secenegi__aciklama { color: var(--metin-2); font-size: var(--ts-xs); line-height: 1.45; }

.kapsam-secenegi__ayrinti {
  display: flex;
  flex-direction: column;
  gap: var(--b-1);
  margin-top: var(--b-2);
  padding-top: var(--b-2);
  border-top: 1px solid var(--cizgi);
  font-size: var(--ts-xs);
  line-height: 1.5;
  color: var(--metin-2);
}

.kapsam-secenegi__madde b { color: var(--metin); font-weight: 600; }

.kapsam-secenegi__bedel,
.tur-secenegi__bedel {
  margin-top: var(--b-2);
  font-size: var(--ts-xs);
  color: var(--metin-3);
}

.tur-secenegi__bedel { margin-top: var(--b-1); }

/* Dar ekranda (390 px ölçüldü) ayrıntı maddeleri simge sütununun yanında ~200 px'e sıkışıyordu: simge ve sağ boşluk küçülüyor. */
@media (max-width: 480px) {
  .kapsam-secenegi { gap: var(--b-2); padding: var(--b-3); padding-inline-end: var(--b-8); }
  .kapsam-secenegi input { inset-block-start: var(--b-3); inset-inline-end: var(--b-3); }
  .kapsam-secenegi__ikon { width: 32px; height: 32px; }
}

/* --------------------------------------------------------------------------
   KARAKTER GÖRSELİ (2026-10-16 · T2 · T3) — fotoğraf ekranı kaplamasın, sürükle-bırak
   Ölçüldü: karakter-karti* ve karakter-cip__resim için HİÇ kural yoktu; 1152×1536'lık fotoğraf kartta 956×1275, sahne
   kartının konuşan çipinde 888×1184, detaydaki düzeltme kartında 922×1229 px çiziliyordu (testler 48×64'lük fotoğrafla
   koştuğu için görünmedi). Kart iki sütun: solda kare küçük resim (SIĞAR, kırpılmaz — kullanıcı yüzü tam görmeli) ve
   yükleyici, sağda alanlar; dar ekranda alt alta. Çip resmi küçük yuvarlak avatar (kırpılır — yalnız tanımak için).
   Bırakma alanı Görseller kartınınkiyle aynı görünüm (.referans-birak), kartın dar sütununa göre sıkı.
   -------------------------------------------------------------------------- */
.karakter-listesi {
  list-style: none;
  margin: 0;
  margin-block-start: var(--b-4);
  padding: 0;
  display: grid;
  gap: var(--b-4);
}
.karakter-karti {
  min-width: 0;
  padding: var(--b-4);
  border: 1px solid var(--cizgi);
  border-radius: var(--r-lg);
  background: var(--yuzey);
}
.karakter-karti__govde {
  display: grid;
  grid-template-columns: 12rem minmax(0, 1fr);
  gap: var(--b-5);
  margin-block-start: var(--b-3);
}
.karakter-karti__gorsel { min-width: 0; display: flex; flex-direction: column; gap: var(--b-2); }
.karakter-karti__resim {
  display: block;
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: contain;
  border-radius: var(--r-md);
  border: 1px solid var(--cizgi);
  background: var(--yuzey-2);
}
.karakter-karti__alanlar { min-width: 0; display: grid; gap: var(--b-3); align-content: start; }
.karakter-karti__ikili {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
  gap: var(--b-3);
}
.referans-birak--kompakt { padding: var(--b-4) var(--b-3); gap: var(--b-2); }
/* Sahne istemleri (S9 · T6) — ortak görsel ekle parçası: kapın öğeleri alt alta; karakter/mekân kartındaki Görsellerim paneli
   kartın tam genişliğinde (gövdenin altında), üst çizgisi kartın çizgisinden. Kapalı panelin düğme kabı kartın dar sütununda. */
.gorsel-ekle { min-width: 0; }
.gorsel-ekle[hidden] { display: none; }
.gorsellerim--kartta { margin-block-start: var(--b-4); }
@media (max-width: 560px) {
  .karakter-karti__govde { grid-template-columns: minmax(0, 1fr); }
  .karakter-karti__resim { max-width: 12rem; }
}
.karakter-cip__resim {
  flex: 0 0 auto;
  width: var(--b-6);
  height: var(--b-6);
  border-radius: var(--r-tam);
  border: 1px solid var(--cizgi);
  object-fit: cover;
}

/* ALAN HATASI GÖRÜNÜRLÜĞÜ (2026-10-19 ölçümü): app.css alan hatasını .alan.hatali olmadan gizliyor (display: none) ama o sınıfı
   ekleyen kod ne üründe ne prototipte var — istemci (kısa TCKN) ve sunucu (ülkesiz yurt dışı) alan hataları metin olarak sayfada
   durup KULLANICIYA GÖRÜNMÜYORDU (11 ekran, 36 alan). Hata metni varken (unobtrusive de sunucu da span'a field-validation-error
   yazar; boş hâl field-validation-valid) kutu açılır ve girdi kenarı kırmızı — app.css'teki .hatali kurallarının aynısı. */
.alan__hata:has(.field-validation-error) { display: block; }
.alan:has(.alan__hata .field-validation-error) .girdi { border-color: var(--hata); }

/* ══════════════════════════════════════════════════════════════════════
   K16 — KULLANIM SAYFASI (Plan/paket-kullanim-tanitim.md)
   Grafik SVG: yükseklik/konum öznitelik (CSP style-src-attr 'none'), renk
   sınıftan. Renkler dataviz denetleyicisiyle doğrulandı (2026-10-20):
   açık #6D5BF5/#12A05F (ΔE normal 33,4 · deutan 27,1), koyu #8B78F6/#24A06A
   (28,5 · 21,6), ikisi de L bandında ve zemine ≥ 3:1. "Ayrılmamış" nötr gri
   ("diğer" niteliğinde — renkli seri değil). Mavi koyu temada morla
   ayrışmadı (ΔE 14,1 < 15), bu yüzden API yeşil.
   ══════════════════════════════════════════════════════════════════════ */
:root { --grafik-web: #6D5BF5; --grafik-api: #12A05F; --grafik-ayrilmamis: #8A8FA3; }
[data-tema="koyu"] { --grafik-web: #8B78F6; --grafik-api: #24A06A; --grafik-ayrilmamis: #7A7D93; }

.kullanim__seri--web { fill: var(--grafik-web); background: var(--grafik-web); }
.kullanim__seri--api { fill: var(--grafik-api); background: var(--grafik-api); }
.kullanim__seri--ayrilmamis { fill: var(--grafik-ayrilmamis); background: var(--grafik-ayrilmamis); }

/* Gösterge ve özet kartlarındaki renk işareti — kimlik yalnız renge kalmasın diye yanında daima metin var. */
.kullanim__isaret {
  display: inline-block;
  flex: none;
  width: 10px;
  height: 10px;
  border-radius: 3px;
}

.kullanim__gosterge {
  display: flex;
  flex-wrap: wrap;
  gap: var(--b-2) var(--b-4);
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: var(--ts-sm);
  color: var(--metin-2);
}

.kullanim__gosterge li { display: inline-flex; align-items: center; gap: var(--b-2); }

/* Eksen etiketleri solda (üst sınır · yarısı · 0), çizim alanı sağda, zaman ekseni altta. */
.kullanim__grafik {
  display: grid;
  grid-template-columns: auto minmax(0, 1fr);
  grid-template-rows: 200px auto;
  column-gap: var(--b-3);
  row-gap: var(--b-2);
}

.kullanim__eksen {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  align-items: flex-end;
  /* Etiket ortası çizgiye otursun: yarım satır yukarı/aşağı taşar. */
  margin-block: calc(var(--lh-xs) / -2);
}

.kullanim__svg { display: block; width: 100%; height: 200px; overflow: visible; }

.kullanim__izgara { stroke: var(--cizgi); stroke-width: 1; vector-effect: non-scaling-stroke; }
.kullanim__taban { stroke: var(--cizgi-guclu); stroke-width: 1; vector-effect: non-scaling-stroke; }

/* Üzerine gelme hedefi görünmez ama tıklanabilir alan; üzerine gelinen dilim hafifçe vurgulanır. */
.kullanim__hedef { fill: transparent; }
.kullanim__dilim:hover .kullanim__hedef { fill: var(--yuzey-2); }

.kullanim__zaman {
  grid-column: 2;
  display: flex;
  justify-content: space-between;
}


/* Satır başlığı (th scope="row") — erişilebilirlik için başlık, GÖRÜNÜŞTE hücre: app.css'in `.tablo th` kuralı sütun
   başlığı içindir (büyük harf, küçük punto, zemin, yapışkan). Ölçüldü: anahtar adı "TARAYICI ANAHTARI" diye ve koyu
   zeminli bir sütun olarak çiziliyordu. Son satırın alt çizgisi td'lerle aynı kalır. */
.kullanim__tablo tbody th {
  font-size: inherit;
  font-weight: 500;
  text-transform: none;
  letter-spacing: normal;
  color: var(--metin);
  background: none;
  position: static;
  white-space: normal;
}

.kullanim__tablo tbody tr:last-child th { border-bottom: none; }

/* ══════════════════════════════════════════════════════════════════════
   K22 (Plan/k22-kontrast.md, 2026-10-23) — METİN KONTRASTI WCAG AA, İKİ TEMA
   app.css SADIK KOPYA: yazı rengi ve yazılı gradyan kuralları burada ezilir (aynı seçici, sonra yüklenen dosya kazanır).
   Ölçüt urun-erisilebilirlik-denetimi'nin iki temalı kontrast ölçümü (arac/kontrast-olcutu.mjs).
   ══════════════════════════════════════════════════════════════════════ */
a { color: var(--marka-metin); }
.rozet--marka { color: var(--marka-metin); }
.sekme[aria-selected="true"] { color: var(--marka-metin); }
.takvim__hucre--bugun .takvim__gun { color: var(--marka-metin); }
.alan__etiket .zorunlu { color: var(--hata-metin); }

/* Koyu temada durum rozetleri temanın kendi (açık) durum renginde — app.css -500 tonu koyu zeminde 3,07–3,72 idi. */
[data-tema="koyu"] .rozet--basari { color: var(--basari); }
[data-tema="koyu"] .rozet--uyari  { color: var(--uyari); }
[data-tema="koyu"] .rozet--hata   { color: var(--hata); }
[data-tema="koyu"] .rozet--bilgi  { color: #56B6E9; }   /* --bilgi #4FB3E8 renkli kart üstünde 4,45 */

/* Üstünde beyaz yazı olan gradyan yüzeyler (kullanıcı kararı: yazılı yüzeyde koyu uç); soluk beyaz yazılar tam beyaz. */
.btn--birincil { background: var(--marka-gradyan-yazi); }
.kenar__link[aria-current="page"] { background: var(--marka-gradyan-yazi); }
.karsilama { background: var(--marka-gradyan-genis-yazi); }
.karsilama p { color: #fff; }
.auth__yan { background: var(--marka-gradyan-genis-yazi); }
.auth__yan p { color: #fff; }
.karsilama .rozet { background: transparent; box-shadow: inset 0 0 0 1px rgba(255,255,255,.6); }

/* Beyaz yazılı dolgular: düğmeler, tamamlanan adım, kenar sayaç rozeti ("Yakında" rozeti nötr kalır). */
.btn--tehlike { background: var(--hata-dolgu); }
.btn--basari { background: var(--basari-dolgu); }
.adim.tamam .adim__no { background: var(--basari-dolgu); }
.kenar__rozet:not(.rozet--notr) { background: var(--hata-dolgu); }

/* Müşteri avatarı: açık zeminli üç palet renginde baş harfler koyu (turkuaz 5,64 · turuncu 6,08 · camgöbeği 4,63; beyaz 2,80–3,68). */
.avatar.y-musteri-renk-1, .avatar.y-musteri-renk-3, .avatar.y-musteri-renk-5 { color: var(--notr-900); }
