:root {
  /* Tüm temalar (açık/koyu dahil) tamamen kendi sabit renkleriyle tanımlı — tarayıcının
     otomatik/zorlanmış koyu tema (Android Chrome "force dark" vb.) davranışına asla ihtiyaç
     yok, hatta zararlı: özellikle .navdrop-panel gibi mutlak konumlanmış, iç içe geçmiş
     panellerde tarayıcının renk tersine çevirme sezgiselliği zemin/yazı rengini aynı tona
     düşürüp okunmaz hale getirebiliyor (masaüstü modu isteyince görülen "beyaz üstüne beyaz"
     görünümünün kök nedeni budur). color-scheme: light, tarayıcıya bu sayfayı kendi haline
     bırakmasını söylüyor; hangi temanın seçili olduğundan bağımsız çalışır. */
  color-scheme: light;
  /* v1.64.0 — "Birleşik Tema" görsel yenilemesi: ana içerik alanının AÇIK mod renk kümesi, kullanıcının
     onayladığı Unified-Theme mockup'ındaki token'larla birebir (bkz. inc/themes.php::ui_dark_site_vars()/
     ui_sidebar_vars() koyu/sidebar karşılıkları için). Eski 9 temalı firma bazlı seçim tamamen kaldırıldı
     (kullanıcı kararı) — kalan tek "taban" renk kümesi bu, kişisel koyu/açık mod bunun üstüne biner.
     v1.97.0 — ikinci görsel yenileme (Selim'in onayladığı "Görsel Yenileme (Login + Pano)" tasarım
     kurgusu, EliteHost referansına göre): marka vurgu rengi turkuazdan maviye geçti, köşe/gölge ölçeği
     daha yuvarlak/yumuşak oldu. Kişisel "Marka rengi" ayarı (ui_accent) bu varsayılanın ÜSTÜNE biniyor,
     değişmedi — sadece HİÇ seçim yapmamış kullanıcının göreceği taban renk değişti.
     v1.161.0 — bu dosyadaki --primary (#2f5fdb) ile inc/themes.php::theme_base_vars()'daki --primary
     (#0f5d73, teal) BİRBİRİNDEN SAPMIŞ bulundu (üstteki uyarı yorumu tam da bunu engellemeye
     çalışıyordu) — PHP sayfalarında theme_style_block() her zaman kendi :root'unu BASTIĞI için fiilen
     teal görünüyordu, bu dosyadaki mavi hiç devreye girmiyordu (ölü kod). Selim'in yeni admin görsel
     yenileme kararıyla (EliteHost ilhamlı mockup, 13 seçenekli palet → "Çelik Mavi" seçildi) ikisi de
     TEK bir değere senkronlandı, sapma giderildi. */
  --ink: #1f2a2e;
  --steel: #5b6b6e;
  --paper: #f4f6f7;
  --panel: #ffffff;
  --line: #e2e8e9;
  --primary: #3B6EA5;
  --primary-dark: #2C5680;
  --alert: #b4232a;
  --alert-bg: #fbe9ea;
  --ok: #1b7a4b;
  --ok-bg: #e4f4ec;
  --warn-bg: #fff4d6;
  /* v1.122.0 — "görsel cila" turu: tabloda/araç çubuğunda/tooltip'te hover/pasif-hücre gibi "hafif
     ikincil zemin" için düzinelerce yerde birbirine çok yakın ama SABİT hex (ör. #e6edf2, #e8ecef,
     #eef1f3, #f3f6f8, #f7f9fa, #f0f3f5, #f2f2f2) kullanılmış — hiçbiri koyu modda ezilmiyordu, yani
     koyu mod açıkken tablo başlığı/araç çubuğu/pasif hücre gibi yerler aniden AÇIK gri bir leke gibi
     parlıyordu (--line gibi gerçekten tema-duyarlı komşu tonların arasında). Tek bir --surface-soft
     token'ında topluyoruz; açık moddaki görünüm neredeyse birebir aynı kalıyor (hepsi zaten aynı dar
     aralıkta), koyu modda ise ui_dark_site_vars() (inc/themes.php) bunu panelin biraz açığı bir
     tona çeviriyor — artık her yerde tutarlı ve okunur. */
  --surface-soft: #eef1f3;
  /* v1.97.0 — köşe yuvarlama / gölge ölçeği: butonlar artık hap (pill) şekilli, kartlar daha geniş
     köşeli ve hafif gölgeli — yeni mockup'ın "yumuşak" görsel diliyle birebir. Sabit değer yerine
     değişken kullanıyoruz ki ileride tek yerden ayarlanabilsin. */
  --radius-input: 12px;
  --radius-card: 20px;
  --radius-pill: 999px;
  --shadow-card: 0 4px 16px rgba(16, 24, 32, .07);
  --shadow-pop: 0 10px 28px rgba(16, 24, 32, .14);
  /* v1.64.0 — Space Grotesk (başlıklar/büyük rakamlar) + Manrope (gövde metni) — <link>'leri
     inc/layout.php::page_start()'ın <head>'inde yükleniyor (hem uygulama hem giriş ekranı, page_start
     ortak olduğu için). Google Fontlar yüklenemezse (ör. ağ kısıtlı) sistem fontlarına sorunsuz düşer. */
  --font: "Manrope", "Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;
  --font-heading: "Space Grotesk", "Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;
  /* v1.54.0 — sol menünün (sidebar) kendi renk kümesi, siteden bağımsız.
     v1.97.0 — varsayılan artık AÇIK (yeni mockup'ın beyaz sidebar'ı ile birebir; eski koyu varsayılan
     kullanıcı kararıydı ama yeni görsel yön açık sidebar istiyor). 'koyu' seçilirse
     inc/themes.php::ui_sidebar_vars() bunun üstüne bir override basar (bkz. orada ve
     ui_mode_style_block() — mantık ters çevrildi, aşağıdaki .sidebar{color-scheme} ile birlikte). */
  --side-bg: #ffffff;
  --side-panel: #f4f6f7;
  --side-border: #e2e8e9;
  --side-text: #1f2a2e;
  --side-muted: #5b6b6e;
}

* { box-sizing: border-box; }

html { -webkit-text-size-adjust: 100%; }
/* Tarayıcının "scroll anchoring" özelliği KAPALI: yapışkan üst menü küçülüp büyüdükçe altındaki
   içerik yukarı/aşağı kayıyor (menü akıştan tam çıkmadığı için); tarayıcı bunu "istenmeyen kayma"
   sanıp otomatik telafi etmeye çalışıyor, bu da özellikle yavaş/tek tek tekerlek kaydırmalarında
   sayfayı kendiliğinden en üste fırlatıyordu (hızlı kaydırmada bu telafiye fırsat kalmadığı için
   sorun görünmüyordu). overflow-anchor: none bu otomatik telafiyi devre dışı bırakıyor; kayma kararı
   artık tamamen assets/app.js'teki sabit "sentinel" noktalarına bağlı, tarayıcı araya girmiyor. */
html, body { overflow-anchor: none; }

body {
  margin: 0;
  background: var(--paper);
  color: var(--ink);
  font-family: var(--font);
  font-size: 16px;
  line-height: 1.5;
}

a { color: var(--primary); }
a:hover { color: var(--primary-dark); }
:focus-visible { outline: 3px solid #f2b705; outline-offset: 2px; }

h1, h2, h3 { font-family: var(--font-heading); }
h1 { font-size: 1.6rem; line-height: 1.2; margin: 0 0 .5rem; font-weight: 600; letter-spacing: -.01em; }
h2 { font-size: 1.15rem; margin: 0 0 .75rem; font-weight: 600; }
h3 { font-size: 1rem; margin: 0 0 .5rem; font-weight: 600; }

code { background: #e3e9ee; padding: 1px 6px; border-radius: 4px; font-size: .9em; }
hr { border: 0; border-top: 1px solid var(--line); margin: 1.25rem 0; }

.muted { color: var(--steel); }
.small { font-size: .85rem; }
.hint { color: var(--steel); font-size: .88rem; margin: .5rem 0 0; }
.empty { background: var(--panel); border: 1px dashed var(--line); padding: 1.25rem; border-radius: 8px; color: var(--steel); }
.spacer { flex: 1; }
.inline { display: inline-flex; gap: .4rem; align-items: center; margin: 0; }

/* ---------- Üst bar ---------- */
.topbar { background: var(--ink); color: #fff; box-shadow: 0 2px 10px rgba(0,0,0,.14); position: relative; z-index: 40; }
/* Ayarlar > Görünüm'den açılan "Üst menü yapışkan olsun" seçeneği — firma bazlı, varsayılan KAPALI.
   Yazdırmada zaten .topbar tamamen gizli (bkz. @media print altındaki .noprint kuralı), o yüzden
   sticky konumlandırma çıktıyı etkilemiyor.
   Birçok sitede olduğu gibi: sticky AÇIKKEN sayfa biraz kaydırılınca menü sadece sabit kalmıyor,
   aynı zamanda incelip küçülüyor da (assets/app.js sayfa 8px'ten fazla kaydırılınca .topbar.sticky'e
   ".topbar-shrink" sınıfı ekliyor/kaldırıyor) — logo, menü linkleri ve dikey boşluk küçülüyor, alt
   satırdaki saat/hava/döviz bilgisi ise yer kazanmak için tamamen gizleniyor. Sticky KAPALIYKEN bu
   sınıf hiç eklenmiyor, üst bar hep normal boyutunda kalıyor. */
.topbar.sticky { position: sticky; top: 0; }
.topbar-in {
  max-width: 1400px; margin: 0 auto; padding: .5rem 1rem;
  display: flex; flex-wrap: wrap; gap: .25rem 1.25rem; align-items: center;
  transition: padding .18s ease;
}
.topbar.sticky.topbar-shrink .topbar-in { padding-top: .2rem; padding-bottom: .2rem; }
.topbar.sticky.topbar-shrink .topbar-info { display: none; }
.topbar.sticky .brandlogo, .topbar.sticky .brandicon { transition: max-height .18s ease, width .18s ease, height .18s ease; }
.topbar.sticky.topbar-shrink .brandlogo { max-height: 24px; }
.topbar.sticky.topbar-shrink .brandicon { width: 24px; height: 24px; }
.topbar.sticky.topbar-shrink .brand .brandtext small { display: none; }
.topbar.sticky.topbar-shrink .nav a, .topbar.sticky.topbar-shrink .navdrop > summary { padding: .35rem .7rem; transition: padding .18s ease; }
.brand { color: #fff; text-decoration: none; font-weight: 700; font-size: 1.15rem; display: flex; flex-direction: column; line-height: 1.15; }
.brand:hover { color: #fff; }
.brand .firm { font-weight: 400; font-size: .75rem; color: #a9b8c4; }
.nav { display: flex; flex-wrap: wrap; gap: .2rem; row-gap: .3rem; flex: 1; min-width: 0; }
.nav a { color: #cfdae3; text-decoration: none; padding: .5rem .8rem; border-radius: 999px; white-space: nowrap; transition: background .15s ease, color .15s ease; display: inline-flex; align-items: center; gap: .4rem; }
.nav a:hover { background: rgba(255,255,255,.1); color: #fff; }
.nav a.on { background: var(--primary); color: #fff; font-weight: 600; }
.navicon { display: inline-flex; flex: 0 0 auto; opacity: .9; }
.navicon svg { width: 16px; height: 16px; display: block; }
.nav a.on .navicon { opacity: 1; }

/* v1.132.0 — "Duotone Rozet" ikon paketi (bkz. inc/layout.php::nav_icon_html()/page_icon()): her
   ikonun kendi rengi, küçük yuvarlak bir rozet içinde. color-mix ile "transparent"e karışıyor (sabit
   beyaza değil) ki hem koyu üst menüde hem açık/koyu sidebar'da doğru görünsün. Aktif (.on) satırda
   zaten dolu renkli bir hap (pill) arka planı var — rozet rengi onunla çakışmasın diye nötr/beyaza çevriliyor. */
.navicon-badge {
  --icon-accent-bg: color-mix(in srgb, var(--icon-accent, var(--primary)) 18%, transparent);
  background: var(--icon-accent-bg); color: var(--icon-accent, var(--primary));
  border-radius: 7px; justify-content: center; opacity: 1 !important;
}
.nav .navicon-badge { width: 26px; height: 26px; }
.nav .navicon-badge svg { width: 15px; height: 15px; }
.nav a.on .navicon-badge, .sidenav-link.on .navicon-badge { background: rgba(255,255,255,.22) !important; color: #fff !important; }
.navhome { display: inline-flex; align-items: center; justify-content: center; width: 34px; height: 34px; flex: 0 0 auto; border-radius: 50%; color: #cfdae3; transition: background .15s ease, color .15s ease; }
.navhome:hover { background: rgba(255,255,255,.1); color: #fff; }
.navhome svg { width: 18px; height: 18px; display: block; }
.logout { margin: 0; }
.linkbtn { background: none; border: 0; color: #cfdae3; cursor: pointer; font: inherit; font-size: .9rem; padding: .4rem 0; }

/* ---------- Profil resmi (avatar) — üst çubuktaki kullanıcı menüsünde ad(ın yanın)da, v1.48.0 ---------- */
.useravatar { width: 1.6rem; height: 1.6rem; border-radius: 50%; object-fit: cover; flex: none; vertical-align: -.4rem; box-shadow: 0 0 0 1px rgba(255,255,255,.25); }
.useravatar-fallback { display: inline-flex; align-items: center; justify-content: center; background: var(--primary); color: #fff; font-weight: 700; font-size: .75rem; line-height: 1; }
.profilemenu summary .useravatar { margin-right: .15rem; }

/* ---------- Üst çubuk bilgi widget'ları (saat/tarih, hava durumu, döviz) ---------- */
/* Not: bu satır (saat + hava durumu + döviz kurları) menüyle AYNI satırda, "sığdığı kadar" yer
   kaplayan bir öğe olarak durursa, kaç tane döviz çifti ya da kaç şehir eklenirse eklensin menü
   (.nav) için kalan alan daralır ve .nav kendi içindeki linkleri 2-3 satıra bölmeye başlar — bu,
   kullanıcının bildirdiği "menü alt alta kaydı" sorununun kök nedeniydi. Kalıcı çözüm: bu bilgi
   satırını menüyle YARIŞTIRMAMAK — order:99 + flex-basis:100% ile HER ZAMAN kendi tam-genişlikte,
   ayrı (ikinci) satırına düşürüyoruz. Böylece üst satırda sadece marka+menü+dil+profil olur ve kaç
   döviz/şehir eklenirse eklensin menünün satır sayısı bundan etkilenmez; ikinci satır da kendi
   içinde taşarsa (çok fazla döviz çifti/şehir), kendi flex-wrap'ıyla gerektiğinde kendi içinde alt
   satıra döner — menüyü asla etkilemez. */
.topbar-info {
  display: flex; align-items: center; flex-wrap: wrap; gap: .25rem .8rem;
  order: 99; flex: 1 1 100%; justify-content: flex-end;
  padding-top: .2rem; margin-top: .1rem; border-top: 1px solid rgba(255,255,255,.08);
  font-size: .82rem; color: #a9b8c4;
}
.topbar-info .tbi-weather, .topbar-info .tbi-fx { padding: .15rem .55rem; border-radius: 999px; background: rgba(255,255,255,.07); white-space: nowrap; }
/* Para birimi sembolü (₺, $, €...) — bayrak EMOJİSİ yerine (bkz. inc/topbar_info.php::currency_symbol(),
   v1.49.1) her fontta güvenilir görünen düz metin karakteri, küçük yuvarlak bir "ikon" rozetinde. */
.tbi-cursym {
  display: inline-flex; align-items: center; justify-content: center; min-width: 1.3em; height: 1.3em;
  padding: 0 .15em; border-radius: 50%; background: rgba(255,255,255,.14); font-weight: 700; font-size: .92em;
}
.weather-switch-opt .tbi-cursym { background: rgba(16,24,32,.08); color: var(--ink); }
.topbar-info .weather-switch { white-space: nowrap; }
@media (max-width: 560px) {
  .topbar-info { display: none; }
}

/* ---------- Menü grupları (açılır alt menü) — hem üst bardaki .nav içinde hem tanıtım sitesinin
   .snav içinde kullanılır; nav_builder.php ile kullanıcı tarafından oluşturuluyor. ---------- */
.navdrop { position: relative; }
.navdrop > summary { list-style: none; cursor: pointer; color: #cfdae3; padding: .5rem .8rem; border-radius: 999px; display: inline-flex; align-items: center; gap: .35rem; white-space: nowrap; }
.navdrop > summary::-webkit-details-marker { display: none; }
.navdrop > summary:hover { background: rgba(255,255,255,.1); color: #fff; }
.navdrop.navdrop-active > summary { background: var(--primary); color: #fff; font-weight: 600; }
.navdrop .chev { font-size: .7em; }
.navdrop-panel {
  position: absolute; top: calc(100% + .4rem); left: 0; z-index: 60;
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); min-width: 190px; padding: .35rem; display: flex; flex-direction: column;
}
.nav .navdrop-panel a { display: flex; align-items: center; gap: .5rem; padding: .55rem .7rem; border-radius: 6px; color: var(--ink); text-decoration: none; font-size: .92rem; white-space: nowrap; }
.nav .navdrop-panel a:hover { background: var(--paper); }
.nav .navdrop-panel a.on { background: var(--paper); font-weight: 600; color: var(--primary); }
.navdrop-panel .navdrop { margin: .1rem 0; }
.nav .navdrop-panel .navdrop > summary { padding: .5rem .7rem; color: var(--ink); border-radius: 6px; }
.nav .navdrop-panel .navdrop > summary:hover { background: var(--paper); color: var(--ink); }
.nav .navdrop-panel .navdrop > summary.on, .nav .navdrop-panel .navdrop.navdrop-active > summary { background: var(--paper); color: var(--primary); font-weight: 600; }
.navdrop-panel .navdrop .navdrop-panel { position: static; box-shadow: none; border: none; margin-left: .75rem; padding: .2rem 0 .2rem .5rem; border-left: 2px solid var(--line); }
/* nav_render_app() açılır panel içindeki linkleri de aynı .navlabel span'ıyla üretiyor (bkz.
   inc/navtree.php), ama bu linklerin (depth>0) hiç ikonu yok — aşağıdaki @media (max-width:1100px)
   kuralı TÜM .navlabel'ları gizleyince (üst seviye ikon+etiket pillerini kompakta düşürmek için),
   761-1100px arası genişliklerde (ör. mobilde "Masaüstü sitesini görüntüle" modunun sanal viewport'u)
   panel içindeki linkler ne ikon ne etiket kalmadığı için tamamen boş/görünmez oluyordu — panel kutusu
   beyaz ve boş görünüyordu (yaşanmış bir bug). Bu satır, panel içindeki etiketlerin ekran genişliğinden
   bağımsız HER ZAMAN görünür kalmasını sağlıyor; sadece üst seviye .nav ikonlarının etiketi daralıyor. */
.nav .navdrop-panel .navlabel { display: inline; }
/* ---------- Menü düzenleyici (nav_builder.php) ---------- */
.navtree-level { margin-top: .6rem; }
.navnode-actions { display: flex; gap: .5rem; flex-wrap: wrap; align-items: center; margin-top: .4rem; }
.linkbtn:hover { color: #fff; text-decoration: underline; }

/* ---------- Profil menüsü (üst sağ) ---------- */
.profilemenu { position: relative; margin: 0; }
.profilemenu summary { list-style: none; }
.profilemenu summary::-webkit-details-marker { display: none; }
.profilemenu summary .chev { font-size: .7em; margin-left: .15em; }
/* Sadece dış menünün kendi başlığı ("Selim ▾") beyaz olsun — koyu üst bar üstünde duruyor. Bu kural
   yanlışlıkla ".profilemenu[open] summary" (torun seçici) olursa, içindeki "Ayarlar" alt menüsünün
   <summary>'si de beyaz olur ve beyaz panel zemininde görünmez hale gelir (yaşanmış bir bug) — bu
   yüzden ">" (doğrudan çocuk) seçici şart. */
.profilemenu[open] > summary { color: #fff; }
.profilemenu-panel {
  position: absolute; right: 0; top: calc(100% + .5rem); z-index: 50;
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); min-width: 170px; padding: .35rem; display: flex; flex-direction: column;
}
.profilemenu-panel a, .profilemenu-panel button {
  display: block; width: 100%; text-align: left; background: none; border: 0; color: var(--ink);
  text-decoration: none; font: inherit; font-size: .92rem; padding: .55rem .7rem; border-radius: 6px; cursor: pointer;
}
.profilemenu-panel a:hover, .profilemenu-panel button:hover { background: var(--paper); }
.profilemenu-panel form { margin: 0; }

/* ---------- İzin talebi bildirim zili (v1.70.0) — bkz. inc/layout.php, assets/app.js ---------- */
.notifbell { position: relative; margin: 0; }
.notifbell-btn {
  list-style: none; cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  width: 38px; height: 38px; border-radius: 10px; background: var(--paper); border: 1px solid var(--line);
  color: var(--ink); position: relative;
}
.notifbell-btn::-webkit-details-marker { display: none; }
.notifbell-badge {
  position: absolute; top: -5px; right: -5px; min-width: 17px; height: 17px; padding: 0 4px;
  border-radius: 999px; background: var(--alert); color: #fff; font-size: .68rem; font-weight: 700;
  line-height: 17px; text-align: center; transition: transform .2s ease;
}
.notifbell-badge[hidden] { display: none; }
.notifbell-badge.notifbell-pulse { animation: notifbellPulse .6s ease; }
@keyframes notifbellPulse { 0%, 100% { transform: scale(1); } 40% { transform: scale(1.35); } }
.notifbell-panel {
  position: absolute; right: 0; top: calc(100% + .5rem); z-index: 55; width: 280px;
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); padding: .5rem; display: flex; flex-direction: column; gap: .15rem;
}
/* v1.109.1 — iki ayrı zil tek zile birleşti, bölümler (izin / öneri-istek-şikayet) arasında ince bir
   ayraç çizgisi var; ilk bölümün üstüne ayraç/boşluk gerekmiyor. */
.notifbell-section + .notifbell-section { border-top: 1px solid var(--line); margin-top: .3rem; padding-top: .3rem; }
.notifbell-title { font-weight: 700; font-size: .85rem; padding: .3rem .4rem .5rem; }
.notifbell-empty { margin: 0; padding: .3rem .4rem .6rem; color: var(--steel); font-size: .85rem; }
.notifbell-item { display: flex; flex-direction: column; gap: .1rem; padding: .5rem .55rem; border-radius: 6px; text-decoration: none; color: var(--ink); font-size: .85rem; }
.notifbell-item:hover { background: var(--paper); }
.notifbell-item span { color: var(--steel); font-size: .78rem; }
.notifbell-all { display: block; text-align: center; margin-top: .2rem; padding: .5rem; border-radius: 6px; font-size: .82rem; color: var(--primary); text-decoration: none; border-top: 1px solid var(--line); }
.notifbell-all:hover { background: var(--paper); }
/* assets/app.js'in dinamik oluşturduğu kısa ömürlü "yeni talep" uyarı kutusu (gerçek bir "popup"
   hissi, sayfa yenilenmeden) — birden fazla sekme/ekran genişliğinde her zaman görünür kalsın diye
   sabit (fixed) konumlu, en üst katmanda. */
.notif-toast {
  position: fixed; top: 1rem; right: 1rem; z-index: 200; max-width: 280px;
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.2); padding: .7rem 1rem; font-size: .85rem;
  animation: notifToastIn .2s ease;
}
.notif-toast a { color: var(--primary); font-weight: 600; text-decoration: none; }
@keyframes notifToastIn { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } }

/* ---------- Öneri/İstek/Şikayet detay/cevapla penceresi (v1.109.0, feedback.php) ----------
   Bu codebase'de ilk native <dialog> kullanımı — Selim'in isteği: inline <details> açılımı yerine
   "bir pencere açılıp onun içinde işlem yapılsa daha iyi olur". Genel/yeniden kullanılabilir bir
   bileşen gerekmiyor (tek yerde kullanılıyor), bu yüzden kasıtlı olarak sade/özel tutuldu. */
.fbdialog {
  position: relative; background: var(--panel); color: var(--ink); border: 1px solid var(--line);
  border-radius: var(--radius-card, 14px); box-shadow: 0 16px 48px rgba(0,0,0,.28);
  padding: 1.25rem 1.4rem; width: min(560px, calc(100vw - 2rem)); max-height: calc(100vh - 3rem);
  overflow: auto;
}
.fbdialog::backdrop { background: rgba(10,14,18,.5); }
.fbdialog-close { position: absolute; top: .6rem; right: .6rem; margin: 0; }
.fbdialog-close button {
  background: none; border: 0; font-size: 1.3rem; line-height: 1; color: var(--steel); cursor: pointer;
  width: 2rem; height: 2rem; border-radius: 6px;
}
.fbdialog-close button:hover { background: var(--paper); color: var(--ink); }
.fbdialog-meta { display: grid; grid-template-columns: auto 1fr; gap: .25rem .8rem; margin: .8rem 0; font-size: .9rem; }
.fbdialog-meta dt { color: var(--steel); font-weight: 600; }
.fbdialog-meta dd { margin: 0; }
.fbdialog-message { background: var(--paper); border: 1px solid var(--line); border-radius: 8px; padding: .7rem .9rem; margin: .4rem 0 1rem; }

/* v1.59.2: Selim bildirdi — Pano'daki (.dash-grid) ve "Panoyu özelleştir"deki (.cards) widget'lar,
   ekranda bolca boş alan olsa bile her zaman sadece 2-3 sütunda kalıp aşağı doğru diziliyordu; genişlik
   arttıkça/azaldıkça sütun sayısı hiç değişmiyordu. Kök sebep burada, .dash-grid/.cards'ta değildi —
   `.page`, `.app-main` (display:flex; flex-direction:column) içinde DOĞRUDAN bir flex öğesi. Flexbox
   kuralına göre bir öğenin çapraz eksen (burada: yatay) kenar boşluğu `auto` ise, bu "stretch" hizalamasını
   DEVRE DIŞI bırakır — öğe mevcut genişliği doldurmak yerine İÇERİĞİNE göre büzülür (shrink-to-fit).
   `margin: 0 auto` ile ortalanan bu kutu, ekran ne kadar geniş olursa olsun içeriğinin istediği minimum
   genişliğe küzülüyordu, bu da içindeki grid'in asla gerçek boş alanı görememesi (sütun sayısının ekran
   genişliğine değil, içeriğin "doğal" genişliğine göre belirlenmesi) anlamına geliyordu. Çözüm: `width:
   100%` eklendi — artık genişlik `auto` değil, flex stretch devre dışı kalma durumu hiç oluşmuyor, kutu
   gerçekten mevcut alanı (max-width:1400px'e kadar) dolduruyor, `margin:auto` da onu bu dolu genişlikte
   normal şekilde ortalıyor. (Giriş sayfasındaki `body.loginpage main.page` zaten .app-main'in flex ağacı
   DIŞINDA — body'nin doğrudan çocuğu — o yüzden bu değişiklik orayı etkilemiyor.) */
.page { max-width: 1400px; width: 100%; margin: 0 auto; padding: 1.25rem 1rem 4rem; }

/* ---------- Sidebar (sol menü) + app-topbar — v1.54.0 görsel yenileme, eski yatay .topbar/.nav'ın
   yerini alıyor (o sınıflar hâlâ var ve değişmedi — personel portalı kendi yatay üst çubuğunda aynen
   kullanmaya devam ediyor, bkz. inc/staff_auth.php. Tanıtım sitesi kendi .sitebar sınıfını kullanıyor,
   o da v1.68.0'dan beri bu dosyadaki renk token'larından besleniyor, bkz. "tanıtım sitesi" bloğu). ---------- */
.app-shell { display: flex; align-items: stretch; min-height: 100vh; }
.sidebar {
  flex: 0 0 248px; width: 248px; background: var(--side-bg); border-right: 1px solid var(--side-border);
  padding: 1.4rem 1.1rem; display: flex; flex-direction: column; gap: 1.2rem;
  position: sticky; top: 0; align-self: flex-start; height: 100vh; overflow-y: auto; z-index: 46;
  /* v1.97.0 — sidebar artık varsayılan olarak AÇIK (bkz. :root, yukarısı), sayfanın genel
     color-scheme:light'ı ile zaten uyumlu, ayrıca bir şey yapmaya gerek yok. Kişisel olarak 'koyu'
     seçilirse (bkz. inc/themes.php::ui_mode_style_block()) bu .sidebar{color-scheme:dark} ile eziliyor
     — eskiden tersiydi (varsayılan koyuydu, 'açık' seçilince eziliyordu); mantık ters çevrildi ama
     "tarayıcının force-dark tersine çevirmesine karşı her zaman gerçek renk şemasını bildir" önlemi
     (v1.54.1'den beri) aynen duruyor. */
  color-scheme: light;
}
.sidebar-brand { display: flex; align-items: center; gap: .6rem; padding: 0 .25rem; text-decoration: none; color: var(--side-text); }
.sidebar-brand:hover { color: var(--side-text); }
.sidebar-brand .brandlogo { max-height: 30px; max-width: 150px; width: auto; border-radius: 4px; background: #fff; padding: 2px; }
.sidebar-brand .brandlogo.plain { background: transparent; padding: 0; }
.sidebar-brandtext { display: flex; flex-direction: column; line-height: 1.2; }
.sidebar-brandtext strong { font-size: 1rem; font-weight: 700; }
.sidebar-brandtext small { font-size: .68rem; font-weight: 400; color: var(--side-muted); max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.sidenav { display: flex; flex-direction: column; gap: .15rem; }
.sidenav-link, .sidenav-summary {
  display: flex; align-items: center; gap: .7rem; padding: .6rem .75rem; border-radius: 12px;
  color: var(--side-text); text-decoration: none; font-size: .91rem; cursor: pointer; list-style: none;
}
.sidenav-summary::-webkit-details-marker { display: none; }
/* v1.97.0 — hover rengi sabit "rgba(255,255,255,.07)" (sadece koyu sidebar için anlamlıydı) yerine
   var(--side-text) tabanlı color-mix: açık sidebar'da hafif gri, koyu sidebar'da hafif beyaz tonu
   veriyor — iki moda da otomatik uyuyor, ayrı kural yazmaya gerek yok. */
.sidenav-link:hover, .sidenav-summary:hover { background: color-mix(in srgb, var(--side-text) 8%, transparent); }
/* v1.166.0 — Selim'in mockup kıyaslaması: aktif menü satırı eskiden dolu/solid bir kutuydu (koyu mavi
   zemin + beyaz yazı), mockup'ta ise yumuşak/tonlu bir "hap" (açık zemin + koyu yazı) + yanında küçük
   bir nokta. Artık mevcut renk sistemiyle (var(--primary), color-mix — Pano'daki rozetlerle aynı dil)
   aynı yumuşak görünüm uygulanıyor; koyu temada da var(--primary) o temanın kendi (parlak) rengine
   döndüğü için otomatik uyuyor, ayrı bir koyu-tema kuralı gerekmedi. */
.sidenav-link.on { background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--primary); font-weight: 600; }
.sidenav-link .navicon svg, .sidenav-summary .navicon svg { width: 17px; height: 17px; }
.sidenav-link .navicon-badge, .sidenav-summary .navicon-badge { width: 28px; height: 28px; }
.sidenav-link .navicon-badge svg, .sidenav-summary .navicon-badge svg { width: 16px; height: 16px; }
.sidenav-group { margin-top: .05rem; }
.sidenav-chev { margin-left: auto; flex: 0 0 auto; opacity: .7; transition: transform .15s; }
.sidenav-group[open] > .sidenav-summary .sidenav-chev { transform: rotate(90deg); }
.sidenav-group-active > .sidenav-summary { color: var(--primary); font-weight: 600; }
.sidenav-children { display: flex; flex-direction: column; gap: .1rem; padding-left: 1.4rem; margin-top: .1rem; }
.sidenav-link.sub { font-size: .85rem; padding: .5rem .65rem; color: var(--side-muted); border-left: 2px solid var(--side-border); border-radius: 8px; }
.sidenav-link.sub.on { color: var(--primary); border-left-color: var(--primary); background: color-mix(in srgb, var(--primary) 14%, transparent); font-weight: 600; }
.sidenav-link.sub .navicon-badge { width: 24px; height: 24px; }
.sidenav-link.sub .navicon-badge svg { width: 14px; height: 14px; }
/* v1.166.0 — mockup'taki aktif satırın yanındaki küçük nokta (bkz. inc/navtree.php nav_render_sidebar()).
   Her linkte basılıyor ama varsayılan opacity:0 — aktif olmayan satırlarda GÖRÜNMEZ ama yer kaplamaya
   devam eder, böylece bir satır aktif olunca ikon/yazı sağa "zıplamaz". */
.sidenav-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; opacity: 0; flex: 0 0 auto; }
.sidenav-link.on .sidenav-dot { opacity: 1; }

/* v1.166.0 — "tümünü aç/kapat" düğmesi (bkz. inc/layout.php, assets/app.js [data-sidenav-toggleall]).
   Akordeon grupların varsayılan kapalı davranışı DEĞİŞMEDİ (bilerek, bkz. nav_render_sidebar() üstündeki
   not) — bu sadece isteyince hepsini birden açıp/kapatan küçük bir kısayol. */
.sidenav-toolbar { display: flex; justify-content: flex-end; padding: 0 .15rem .3rem; }
/* v1.167.0 — Selim'in isteği: salt ikon + tooltip yeterince açık değildi, küçük bir yazı eklendi
   ("Tümünü aç" / "Tümünü kapat", duruma göre JS ile değişiyor — bkz. assets/app.js). */
.sidenav-toggleall {
  display: inline-flex; align-items: center; gap: .3rem; height: 24px; padding: 0 .55rem;
  border-radius: 999px; border: 1px solid var(--side-border); background: transparent; color: var(--side-muted);
  cursor: pointer; font-family: inherit; font-size: .72rem; font-weight: 600; line-height: 1;
  transition: background .15s ease, color .15s ease;
}
.sidenav-toggleall:hover { background: color-mix(in srgb, var(--side-text) 8%, transparent); color: var(--side-text); }
.sidenav-toggleall svg { flex: 0 0 auto; transition: transform .18s ease; }
.sidenav-toggleall.is-open svg { transform: rotate(180deg); }
/* "Siteye git" — marka/logonun hemen altında, ana menünün ÜSTÜNDE (kullanıcı isteği, v1.54.0): altına
   ince bir ayraç çizgisi ve boşluk koyuyoruz ki ana menüden görsel olarak ayrışsın, ama hâlâ bir alt
   (sub) link gibi ince/soluk kalsın — ana menüdeki sayfalarla karışmasın. */
.sidenav-link-top { margin-bottom: .5rem; padding-bottom: .6rem; border-left: none; border-bottom: 1px solid var(--side-border); border-radius: 0; }

/* v1.97.0 — "margin-top:auto" artık .sidebar-trial'da değil, onu da yeni kullanıcı kartını da saran
   .sidebar-bottom'da (bkz. inc/layout.php) — deneme kutusu olsun olmasın, kullanıcı kartı her zaman
   sidebar'ın en altında kalsın istiyoruz; deneme kutusu varsa onun ÜSTÜNDE, aralarında normal akış. */
.sidebar-bottom { margin-top: auto; display: flex; flex-direction: column; gap: .7rem; }
.sidebar-trial { padding: .9rem; border-radius: 10px; background: var(--side-panel); border: 1px solid var(--side-border); font-size: .76rem; color: var(--side-muted); line-height: 1.5; }
.sidebar-trial strong { color: var(--side-text); }
.sidebar-trial-bar { margin-top: .5rem; height: 5px; border-radius: 4px; background: var(--side-border); overflow: hidden; }
.sidebar-trial-bar > span { display: block; height: 100%; background: var(--primary); }

/* v1.97.0 — sidebar'ın en altındaki kullanıcı kartı: avatar + ad + rol, mockup'ta Selim'in gördüğü
   "SÇ / Selim Çelik / Yönetici" bloğuyla birebir fikir — tıklanınca hesap ayarlarına gidiyor. */
.sidebar-user {
  display: flex; align-items: center; gap: .6rem; padding: .7rem .5rem 0; margin-top: .1rem;
  border-top: 1px solid var(--side-border); text-decoration: none; color: var(--side-text);
}
.sidebar-user:hover { color: var(--side-text); }
.sidebar-user:hover .sidebar-user-text strong { color: var(--primary); }
.sidebar-user-text { display: flex; flex-direction: column; line-height: 1.25; min-width: 0; overflow: hidden; }
.sidebar-user-text strong { font-size: .85rem; font-weight: 700; color: var(--side-text); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sidebar-user-text small { font-size: .74rem; color: var(--side-muted); }

.app-main { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; }
.app-topbar { background: var(--panel); border-bottom: 1px solid var(--line); position: relative; z-index: 40; }
.app-topbar.sticky { position: sticky; top: 0; }
.app-topbar-in { display: flex; align-items: center; gap: .6rem; padding: .55rem 1.25rem; flex-wrap: wrap; }
/* v1.55.1: tema/dil/profil menüsü artık tek grup (bkz. inc/layout.php'deki yorum) — masaüstünde
   normal bir flex satırı, mobilde @media (max-width: 980px) içinde tek parça olarak sağa yaslanıyor. */
.app-topbar-actions { display: flex; align-items: center; gap: .6rem; }
.sidebar-toggle {
  display: none; width: 38px; height: 38px; flex: 0 0 auto; border-radius: 10px; cursor: pointer;
  background: var(--paper); border: 1px solid var(--line); color: var(--ink); align-items: center; justify-content: center;
}
.app-topbar-brand { display: none; align-items: center; gap: .5rem; color: var(--ink); text-decoration: none; font-weight: 700; font-size: .95rem; }
.app-topbar-brand img { height: 22px; display: block; }
/* Eski yatay menünün (.nav) durduğu yer artık boş kalmasın diye (kullanıcı bildirdi) — o alanda
   sayfanın başlığını (page_start()'a verilen $title) gösteriyoruz. Masaüstünde sidebar zaten marka
   adını taşıdığı için .app-topbar-brand gizli (bkz. aşağısı), bu yüzden bu başlık ekranın sol
   tarafında doğal bir "nerede olduğunu" göstergesi oluyor. */
.app-topbar-title { font-weight: 700; font-size: 1.02rem; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.app-topbar-spacer { flex: 1 1 auto; }
/* app-topbar metin renkleri: .linkbtn/.profilemenu/.topbar-info gibi sınıflar daha önce SADECE koyu
   .topbar (arkaplanı her zaman var(--ink), yani her zaman koyu) üstünde kullanılıyordu, bu yüzden
   sabit AÇIK renkler (#cfdae3, beyaz) taşıyorlardı. .app-topbar'ın arkaplanı ise var(--panel) —
   açık sitede neredeyse beyaz, bu yüzden o sabit açık renkler görünmez oluyordu (kullanıcı bildirdi:
   "Selim" yazısı ve saat/hava/döviz griden beyaza, hover'da da beyaza dönüp kayboluyordu). Burada
   aynı sınıfları SADECE .app-topbar içinde temaya duyarlı renklerle (var(--ink)/var(--steel))
   eziyoruz; .topbar (tanıtım sitesi/personel portalı, her zaman koyu) bundan hiç etkilenmiyor. */
.app-topbar .linkbtn { color: var(--ink); }
.app-topbar .linkbtn:hover { color: var(--primary); }
.app-topbar .profilemenu[open] > summary { color: var(--primary); }
.app-topbar .topbar-info { color: var(--steel); border-top-color: var(--line); }
.app-topbar .tbi-weather, .app-topbar .tbi-fx { background: var(--paper); color: var(--ink); }
.app-topbar .tbi-cursym { background: rgba(16,24,32,.08); color: var(--ink); }
.themetoggle-form { margin: 0; }
.themetoggle-btn {
  width: 38px; height: 38px; flex: 0 0 auto; border-radius: 10px; cursor: pointer;
  background: var(--paper); border: 1px solid var(--line); color: var(--primary);
  display: inline-flex; align-items: center; justify-content: center;
}
.themetoggle-btn:hover { background: var(--line); }
.sidebar-scrim { display: none; }

@media (max-width: 980px) {
  .sidebar-toggle, .app-topbar-brand { display: inline-flex; }
  /* Mobilde marka adı zaten .app-topbar-brand olarak görünüyor; aynı satırda sayfa başlığı da
     gösterirsek hamburger+marka+başlık dar ekranda sıkışır — bu yüzden başlığı mobilde gizliyoruz. */
  .app-topbar-title { display: none; }
  .sidebar {
    position: fixed; left: 0; top: 0; bottom: 0; transform: translateX(-100%);
    transition: transform .2s ease; box-shadow: 0 0 40px rgba(0,0,0,0);
    z-index: 50;
  }
  .app-shell.sidebar-open .sidebar { transform: translateX(0); box-shadow: 0 0 40px rgba(0,0,0,.35); }
  .app-shell.sidebar-open .sidebar-scrim { display: block; position: fixed; inset: 0; background: rgba(10,14,18,.5); z-index: 45; }
  /* .app-topbar-in sığmayınca bu grup TEK PARÇA halinde ikinci satıra düşer ve sağa yaslanır — böylece
     .profilemenu her zaman gerçek sağ kenarda kalır ve panelinin "right:0" konumlandırması bozulmaz. */
  .app-topbar-actions { flex: 1 1 100%; justify-content: flex-end; }
}

/* ---------- Mesajlar ---------- */
.flash { padding: .7rem 1rem; border-radius: 8px; margin-bottom: 1rem; border: 1px solid transparent; }
.flash.ok { background: var(--ok-bg); border-color: #b9dfc9; color: #12583a; }
.flash.err { background: var(--alert-bg); border-color: #f0c0c3; color: #8a1a20; }
.flash.warn { background: #fff4d6; border-color: #f0dfa8; color: #7a5a00; }
.panel.warn { background: #fff4d6; border: 1px solid #f0dfa8; color: #7a5a00; }
.panel.warn p:last-child { margin-bottom: 0; }
.pagenotes { margin-bottom: 1rem; display: flex; flex-direction: column; gap: .5rem; }
.pagenote { padding: .6rem .9rem; border-radius: 8px; background: #eef5fb; border: 1px solid #cfe3f2; color: #1c3a52; font-size: .95rem; }
.pagenote strong { color: #0e2c44; }

/* ---------- Butonlar ---------- */
/* v1.97.0 — hap (pill, var(--radius-pill)) şekil yeni görsel yöne göre; "primary" butona hafif renkli
   gölge eklendi (mockup'taki CTA butonları gibi). .btn:hover'daki sabit "#e6f0f3" tonu SADECE varsayılan
   turkuaz vurgu rengine göre seçilmişti — kişisel vurgu rengi (ui_accent) mavi/mor/yeşil olunca
   uyumsuz kalıyordu; artık var(--primary) tabanlı color-mix ile hangi vurgu rengi seçiliyse ona uyuyor. */
.btn {
  display: inline-block; font: inherit; font-weight: 600; text-decoration: none; cursor: pointer;
  padding: .6rem 1.2rem; border-radius: var(--radius-pill, 10px); border: 1px solid var(--primary);
  background: var(--btn-ghost-bg, var(--panel)); color: var(--btn-ghost-fg, var(--primary)); text-align: center;
}
.btn:hover { background: color-mix(in srgb, var(--primary) 10%, var(--panel)); color: var(--primary-dark); }
.btn.primary { background: var(--primary); color: #fff; box-shadow: 0 6px 16px color-mix(in srgb, var(--primary) 35%, transparent); }
.btn.primary:hover { background: var(--primary-dark); color: #fff; }
/* v1.83.0: Selim'in isteği — "ghost" butonlar (önceki/sonraki ay, Yazdır/PDF, filtre sekmeleri, Word
   indir vb. — sitede EN ÇOK kullanılan buton türü) griydi/renksizdi, diğer renkli butonlarla (ör.
   "primary") tutarsız duruyordu. Önceden burada .btn'in (yukarıdaki, sınıfsız) zaten marka rengiyle
   gelen border/yazı rengi BİLEREK gri+siyaha eziliyordu — artık o override tamamen kaldırıldı (hover
   dahil, zaten .btn'in kendi hover'ıyla birebir aynıydı), ghost butonlar artık .btn'in kendi marka
   renkli (teal, dolu değil beyaz zeminli) halini kullanıyor; "primary" (dolu/solid) ile aralarında
   hâlâ net bir görsel fark var (birincil eylem vs ikincil eylem), sadece ikisi de artık renkli. */
.btn.danger { border-color: #e0a4a8; color: var(--alert); background: var(--panel); }
.btn.danger:hover { background: var(--alert-bg); }
.btn.small { padding: .35rem .7rem; font-size: .88rem; }

/* ---------- Formlar ---------- */
label { display: block; font-size: .9rem; color: var(--steel); }
/* v1.122.0 — "görsel cila" turu: bu kural tüm uygulamadaki HER text/email/şifre/sayı/tarih/saat
   alanı, select ve textarea'nın zeminiydi — background SABİT #fff, yazı rengi ise var(--ink) idi.
   Koyu mod açıkken var(--ink) AÇIK bir tona dönüyor (#e6edf3) ama zemin hep beyaz KALIYORDU — yani
   koyu moddaki HER form alanı, neredeyse okunmaz açık-yazı/beyaz-zemin bir kutuya dönüşüyordu
   (gerçek render ile doğrulandı: yazı görünmüyor denecek kadar düşük kontrastta çıktı). var(--panel)
   açık modda zaten #fff olduğu için görünüm değişmiyor, koyu modda ise panel rengine (#121a24)
   düşüyor — metin artık her iki modda da okunur. */
input[type=text], input[type=email], input[type=password], input[type=number],
input[type=date], input[type=time], select, textarea {
  display: block; width: 100%; margin-top: .25rem; padding: .55rem .65rem;
  font: inherit; color: var(--ink); background: var(--panel); border: 1px solid #b9c4cd; border-radius: var(--radius-input, 10px);
}
input[type=color] { display: block; margin-top: .25rem; height: 2.5rem; width: 100%; min-width: 3.2rem; padding: 2px; border: 1px solid #b9c4cd; border-radius: var(--radius-input, 10px); background: var(--panel); }
textarea { resize: vertical; }
.toolbar input[type=date], .inline input[type=date] { margin-top: 0; width: auto; padding: .35rem .5rem; }
/* form.inline bir flex kutusu olduğu için input[type=color]'un width:100% kuralı diğer öğelerle
   (butonlarla) birlikte sıkışıp ince bir çizgiye dönüşüyordu (v1.47.0'da fark edildi) — burada
   sabit bir genişlik/flex-basis vererek büzülmesini engelliyoruz. */
.inline input[type=color] { flex: 0 0 3.6rem; width: 3.6rem; margin-top: 0; }
label.check { display: flex; align-items: center; gap: .5rem; color: var(--ink); }
label.check input { width: auto; margin: 0; }

.stack { display: grid; gap: 1rem; }
.formgrid { display: grid; gap: .9rem 1rem; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); align-items: end; }
.formgrid .span-all { grid-column: 1 / -1; }
/* v1.82.0: documents.php (Açıklama/Ek metin) ve document_templates_admin.php (Şablon metni) kutuları
   "full" sınıfıyla işaretlenmişti ama .formgrid'in bildiği sınıf adı "span-all" idi — "full" hiç
   karşılığı olmayan bir sınıftı, bu yüzden bu etiketler de diğerleri gibi dar bir grid hücresine
   sıkışıp (210px) satırlar garip bölünüyordu (ör. "Önizle / Yazdır" butonu Açıklama/Ek metin
   kutularının bittiği yere değil, soldaki kısa alanların altına düşüyordu). "full" da tam genişlik
   kaplasın diye "span-all" ile aynı kurala eklendi — markup'ı (iki ayrı sayfa) değiştirmeye gerek
   kalmadı. */
.formgrid .full { grid-column: 1 / -1; }
.formactions { display: flex; gap: .5rem; flex-wrap: wrap; }
.repeatrow { border: 1px solid var(--line); border-radius: 8px; padding: .8rem .9rem; margin: 0 0 .6rem; background: var(--panel); }

/* v1.35.17: Roller ve Yetkiler ekranı — yetki kataloğu, grup başına bir kutu içinde checkbox listesi */
.permgrid { display: grid; gap: .9rem; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
.permgroup { border: 1px solid var(--line); border-radius: 8px; padding: .7rem .9rem; margin: 0; display: grid; gap: .4rem; background: var(--panel); }
.permgroup legend { font-weight: 600; padding: 0 .3rem; }

/* v1.181.0 — Selim'in ekran görüntüsüyle bildirdiği gözlem: akordiyon/panel bloklarının çerçeve
   çizgisi (var(--line)) ve beyaz zemini (var(--panel), çoğu temada sayfa zeminine --paper çok
   yakın) birlikte blokların sınırını zayıf gösteriyordu. İki seçenek vardı: zemine hafif bir renk
   vermek ya da çerçeveyi belirginleştirmek — zemin rengi, içinde zaten kendi renklendirmesi olan
   bloklarla (renkli statcard/chip içeren paneller gibi) çakışabileceği için ÇERÇEVE seçildi: var(--line)
   yerine color-mix ile var(--ink) (metin rengi) katılarak koyulaştırılmış, tema-duyarlı bir kenarlık,
   artı hafifçe güçlendirilmiş gölge — iç renklendirmeye hiç dokunmadan sınırı belirginleştiriyor.
   Bu, .panel kullanan HER yerde (tüm sayfalardaki akordiyonlar/kartlar) otomatik geçerli. */
.panel { background: var(--panel); border: 1px solid color-mix(in srgb, var(--ink) 16%, var(--line)); border-radius: var(--radius-card, 14px); padding: 1.1rem 1.25rem; margin: 1rem 0; box-shadow: var(--shadow-card, 0 2px 5px rgba(16,24,32,.08)); }
.panel > summary { cursor: pointer; font-weight: 600; }
details.panel[open] > summary { margin-bottom: .9rem; }
.panel form.inline { margin-top: .9rem; }

/* ---------- Giriş / kurulum ---------- */
.auth { max-width: 420px; margin: 8vh auto 0; background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 1.75rem; }

/* ---------- Tablolar ---------- */
.tablewrap { overflow-x: auto; background: var(--panel); border: 1px solid var(--line); border-radius: 14px; -webkit-overflow-scrolling: touch; }
table { border-collapse: collapse; width: 100%; }
table.list th, table.list td { text-align: left; padding: .6rem .8rem; border-bottom: 1px solid var(--line); vertical-align: middle; }
/* v1.168.0 — mockup'taki tablo başlıklarının (Personel listesi vb.) küçük harfli/boşluklu "etiket"
   görünümüne yaklaştırıldı: büyük harf + harf aralığı + biraz daha küçük punto. Sadece tipografi,
   renk/arka plan/boyut (padding) aynı kaldı. */
table.list th { font-size: .72rem; color: var(--steel); font-weight: 700; background: var(--surface-soft); text-transform: uppercase; letter-spacing: .04em; }
table.list tr.inactive td { color: #93a0aa; }
.rowactions { display: flex; gap: .4rem; align-items: center; justify-content: flex-end; flex-wrap: wrap; }
td.rowactions { display: table-cell; text-align: right; white-space: nowrap; }
td.rowactions form { display: inline-flex; }

.chip {
  display: inline-block; min-width: 1.9rem; padding: .12rem .45rem; border-radius: 5px;
  font-weight: 700; font-size: .85rem; text-align: center;
}
.chip.off { background: var(--surface-soft); color: var(--steel); }
.chip.primary { background: var(--primary); color: #fff; }
.chip.warn { background: #fff4d6; color: #7a5a00; }
/* v1.165.0 — görsel yenileme: liste tablolarındaki "Aktif/Pasif" gibi durum metinleri artık düz yazı
   değil, mockup'taki "status chip" görünümünde renkli rozet. var(--ok)/var(--ok-bg) zaten koyu tema
   dahil her temada tanımlı (bkz. inc/themes.php theme_base_vars()), bu yüzden ek bir renk eklemeden
   mevcut tema sistemine oturuyor. */
.chip.good { background: var(--ok-bg); color: var(--ok); }
/* v1.186.1 — Teklif & Proforma Fatura listesindeki "Tip" rozeti için: ikisi de aynı mavi ailesinden
   ama birbirinden ayırt edilebilir iki ton olsun diye (önceden biri mavi biri gri düz duruyordu,
   göze hoş gelmiyordu) — var(--primary-dark) zaten her temada/firma markasında tanımlı, böylece bu
   ikinci ton da --primary gibi otomatik olarak firmanın kendi marka rengine uyuyor. */
.chip.accent { background: var(--primary-dark); color: #fff; }
/* v1.168.0 — mockup'taki durum rozetlerinin önündeki küçük nokta ("● Aktif"). Sadece ".dot" sınıfı
   eklenen chip'lerde (Personel/Kullanıcılar/Ekip rehberi/Raporlar'daki Aktif/Pasif gibi) görünür —
   diğer chip kullanımlarını (tarih, taslak, sayaç vb.) etkilemiyor. */
.chip.dot::before { content: "●"; margin-right: 4px; font-size: .62em; vertical-align: 1px; }
.chips { display: flex; flex-wrap: wrap; gap: 3px; margin: .35rem 0 .5rem; }

/* v1.165.0 — görsel yenileme: fotoğrafı olmayan personel/kullanıcı satırlarında artık boş bırakmak
   yerine, Özgeçmiş modülündeki "cv-photo-fallback" ile aynı mantıkta (bkz. inc/candidates.php
   cand_initials()) baş harfli renkli bir daire gösteriliyor — tablo artık mockup'taki "avatar +
   isim" düzenine benziyor. Mevcut .staffthumb (gerçek fotoğraflı satırlar) ile aynı 26px boyutta.
   v1.168.0 — renk artık burada SABİT değil: inc/layout.php avatar_badge_html() ismi hash'leyip
   7 renkten birini inline style ile basıyor (mockup'taki gibi satır satır farklı renk), bu kural
   sadece şekli/boyutu veriyor. */
.row-avatar-fallback {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 50%; margin-right: 4px; vertical-align: middle;
  font-weight: 700; font-size: .62rem; letter-spacing: .02em;
}

.cards { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); margin-top: 1rem; }
.card { background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 1rem 1.1rem; box-shadow: 0 1px 3px rgba(16,24,32,.05); transition: box-shadow .15s ease, transform .15s ease; }
.card p { margin: .25rem 0 .75rem; }

/* ---------- Haftalık plan ---------- */
.weekbar { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin-bottom: .75rem; }
.weekbar h1 { margin: 0; text-align: center; flex: 1; font-size: 1.35rem; }
.toolbar { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-bottom: 1rem; }

table.grid { border-collapse: separate; border-spacing: 0; min-width: 900px; }
table.grid th, table.grid td { padding: 4px; border-bottom: 1px solid var(--line); text-align: center; }
table.grid thead th { background: var(--surface-soft); font-size: .85rem; font-weight: 600; padding: .5rem 4px; position: sticky; top: 0; }
table.grid thead th span { display: block; font-weight: 400; color: var(--steel); font-size: .78rem; }
table.grid th.day.today { background: #fff2c2; }
table.grid th.day.weekend { color: #7a4b00; }
/* v1.122.0 — sabit (sticky) personel adı sütunu, altında kayan diğer sütunları örtmesi için opak bir
   zemine ihtiyaç duyuyor ama bu zemin SABİT #fff'ti — koyu modda plan/ay ekranının en sık bakılan
   sütunu (isim sütunu) parlak beyaz bir şerit olarak kalıp üzerindeki yazı (var(--ink), koyu modda
   açık renk) neredeyse görünmez oluyordu. var(--panel) hem opak kalıyor (hâlâ altını örtüyor) hem de
   doğru temayı takip ediyor. */
table.grid th.name, table.grid td.name {
  text-align: left; padding: .4rem .7rem; min-width: 170px; position: sticky; left: 0; z-index: 2;
  background: var(--panel); font-weight: 600; border-right: 1px solid var(--line);
}
table.grid thead th.name { background: var(--surface-soft); z-index: 3; }
table.grid th.name small { display: block; font-weight: 400; color: var(--steel); font-size: .78rem; }
table.grid td.sum, table.grid th.sum { min-width: 78px; font-variant-numeric: tabular-nums; }
table.grid td.warn, table.grid th.warn { text-align: left; min-width: 180px; font-size: .8rem; color: #8a5a00; }
table.grid tr.over td.tot, table.grid tr.over td.ot { color: var(--alert); font-weight: 700; }
table.grid tr.over td.ot { background: var(--alert-bg); }
table.grid tfoot th, table.grid tfoot td { background: var(--surface-soft); font-size: .85rem; color: var(--steel); }
table.grid tfoot th.name { background: var(--surface-soft); font-weight: 500; }

/* Toplu seçim (satır/sütun başlıklarına tıklayarak Excel'deki gibi seçim + toplu temizleme) —
   bkz. assets/app.js. Başlıklar tıklanabilir olduğunu belli etsin diye imleç + hover rengi. */
table.grid thead th.day, table.grid th.rowhead, table.grid th#gridCorner {
  cursor: pointer; user-select: none;
}
table.grid thead th.day:hover, table.grid th.rowhead:hover, table.grid th#gridCorner:hover {
  background: #eef3f6;
}
table.grid thead th.day.head-selected, table.grid th.rowhead.head-selected {
  background: #cfe3ee;
}
table.grid td.cell-selected {
  box-shadow: inset 0 0 0 2px var(--primary);
}
/* NOT: bu sınıfın adı kasıtlı olarak "bulkbar" DEĞİL, "cellbulkbar" — staff.php'de zaten var olan
   ve tamamen farklı/çok daha büyük bir paneli ("Seçili kişilere ... uygula") saran ".panel.bulkbar"
   sınıfıyla isim çakışması yüzünden v1.35.11'de o panelin düzeni bozulmuştu (bkz. v1.35.13 notu). */
.cellbulkbar {
  display: flex; align-items: center; gap: .6rem; margin: .5rem 0; padding: .5rem .7rem;
  background: #eef3f6; border: 1px solid var(--line); border-radius: 8px;
}
.cellbulkbar .bulkcount { font-size: .85rem; color: var(--steel); font-weight: 600; }
.bulkhint { margin-bottom: .5rem; }

/* v1.122.0 — plan/ay tablosundaki vardiya seçim hücreleri (select.cell) de global form-alanı
   kuralıyla (yukarıda) AYNI sabit #fff zemin bugına sahipti — koyu modda plan/ay tablosunun TÜM
   hücreleri aynı şekilde okunmaz oluyordu. */
select.cell {
  width: 100%; min-width: 62px; margin: 0; padding: .45rem .2rem;
  text-align: center; text-align-last: center; font-weight: 700; font-size: .92rem;
  border: 1px solid transparent; border-radius: 6px; background: var(--panel); cursor: pointer;
  -webkit-appearance: none; appearance: none;
}
select.cell:hover { border-color: #93a0aa; }
select.cellm { min-width: 30px; padding: 2px 0; font-size: .76rem; border-radius: 4px; }
table.monthedit td.mc { padding: 1px; }
table.monthedit td.mc.viol { box-shadow: inset 0 0 0 2px var(--alert); border-radius: 4px; }
table.monthedit td.mc.viol select.cell { background: var(--alert-bg); }

.savebar {
  position: sticky; bottom: 0; background: rgba(238, 241, 244, .95); padding: .75rem 0;
  display: flex; gap: 1rem; align-items: center; flex-wrap: wrap; z-index: 5;
}
.savebar .hint { margin: 0; }
.legend { display: flex; flex-wrap: wrap; gap: .5rem 1.25rem; margin: 1rem 0; font-size: .88rem; color: var(--steel); }
.dangerzone { margin-top: 2rem; }

table.grid tr.grouprow th { text-align: left; background: var(--surface-soft); color: var(--ink); font-size: .85rem; letter-spacing: .03em; padding: .4rem .7rem; border-top: 1px solid #c9d4dc; }

/* ---------- Yazdırma görünümü ---------- */
body.printview { background: #fff; padding: 1rem; }
.printbar { display: flex; gap: .75rem; align-items: center; flex-wrap: wrap; margin-bottom: 1rem; }
.printweek { margin: 0 0 .75rem; color: var(--steel); }
.printgrid { min-width: 0; width: 100%; }
.printgrid th, .printgrid td { border: 1px solid #b9c4cd; }
.printgrid th.name { position: static; }
.printgrid td.pshift { padding: 3px; }
.printgrid td.pshift strong { display: block; font-size: 1rem; }
.printgrid td.pshift small { display: block; font-size: .72rem; opacity: .9; }
.printgrid tr.grouprow th { text-align: left; background: #dfe7ec; font-size: .9rem; padding: 4px 8px; }
.printgrid td.poff { background: #e8ecef; color: var(--steel); font-size: .85rem; }

/* Menü ilerledikçe (yeni sayfalar eklendikçe) etiket+ikon pilleri geniş ekranlarda bile tek satıra
   sığmayabiliyor. Önceki çözüm (yatay kaydıraç) kullanışsız olduğu için: 1) orta genişliklerde
   etiketler gizlenip sadece ikon + title tooltip'i kalıyor (menü tek satırda kalmaya devam ediyor,
   sadece daha kompakt), 2) o da yetmezse (çok dar ekran) menü ikinci satıra sarıyor — kaydıraç yok. */
@media (max-width: 1100px) {
  /* v1.54.2 — BİLEREK ".nav .navlabel" (sadece eski yatay menü), ".navlabel" DEĞİL: yeni sidebar
     (sol menü) de kendi linklerinde aynı ".navlabel" sınıfını kullanıyor (bkz. inc/navtree.php::
     nav_render_sidebar()), ve bu kural eskiden sınırsızdı — 761-1100px arası genişliklerde (ör.
     mobil Chrome'da "Masaüstü sitesi iste" seçilince ortaya çıkan ~980px sanal viewport) sidebar'ın
     TÜM menü yazılarını da (sadece ikon kalacak şekilde) gizliyordu; kullanıcı bunu "yazılar görünmüyor"
     diye bildirdi. Sidebar kendi genişlik mantığını (sabit 248px + <980px'te çekmece) zaten kendi
     başına yönetiyor, bu sıkıştırma/kompaktlaştırma mantığına hiç ihtiyacı yok. */
  .nav .navlabel { display: none; }
  .nav a { padding: .5rem .6rem; }
}

@media (max-width: 760px) {
  .topbar-in { gap: .35rem .75rem; }
  .brand { flex: 1 1 auto; }
  .logout { flex: 0 0 auto; }
  .nav { order: 3; flex: 1 1 100%; }
  .nav .navlabel { display: inline; }
  .nav a { padding: .5rem .8rem; }
}

@media (max-width: 640px) {
  body { font-size: 15px; }
  .weekbar h1 { font-size: 1.05rem; }
  .btn { padding: .55rem .8rem; }
  .auth { margin-top: 3vh; padding: 1.25rem; }
}

@media print {
  @page { size: A4 landscape; margin: 10mm; }
  body, body.printview { background: #fff; padding: 0; }
  .noprint, .topbar, .savebar, .sidebar, .app-topbar, .sidebar-scrim, .flash { display: none !important; }
  .app-shell, .app-main { display: block !important; }
  .printgrid, .printgrid * { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  h1 { font-size: 1.2rem; }
}

@media (prefers-reduced-motion: reduce) {
  * { transition: none !important; animation: none !important; }
}

.grouprowform { margin: .4rem 0; flex-wrap: wrap; }

.verline { margin-top: 2rem; text-align: center; }

table.grid tr.offrow td.offnames { font-size: .72rem; line-height: 1.25; vertical-align: top; text-align: left; padding: 4px 5px; }
table.grid tr.offrow td.offnames span { display: block; }
.printgrid tr.offrow td { font-size: .68rem; vertical-align: top; text-align: left; padding: 3px 4px; background: #f3f6f8; }
.printgrid tr.offrow td span { display: block; }
.printgrid tr.offrow th { background: #f3f6f8; }

.rulesbox { border: 1px dashed var(--line); border-radius: 8px; padding: .6rem .8rem; }
.rulesbox summary { cursor: pointer; font-weight: 600; margin-bottom: .5rem; }
.checkrow { display: flex; flex-wrap: wrap; gap: .4rem 1rem; margin-top: .3rem; }
.lbl { display: block; font-size: .85rem; color: var(--steel); }

/* v1.172.0 — çoklu şube seçimi: sabit genişlikte açılır bir kutu, içinde onay kutulu liste. Şube sayısı
   artsa da (Selim'in dediği gibi "çoğaldıkça büyüyecek" sorunu) formun genel görünümü büyümüyor — panel
   kendi içinde kayıyor. */
.msdrop { position: relative; display: inline-block; width: 100%; margin-top: .25rem; }
.msdrop-toggle {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  width: 100%; min-width: 180px; padding: .5rem .7rem; border: 1px solid var(--line);
  border-radius: var(--radius-input, 10px); background: var(--panel); color: var(--ink);
  font: inherit; font-size: .88rem; cursor: pointer; text-align: left;
}
.msdrop-toggle:hover { border-color: var(--primary); }
.msdrop-toggle svg { flex: none; transition: transform .12s; color: var(--steel); }
.msdrop.is-open .msdrop-toggle svg { transform: rotate(180deg); }
.msdrop-panel {
  position: absolute; z-index: 20; top: calc(100% + 4px); left: 0; min-width: 100%;
  max-height: 220px; overflow-y: auto; background: var(--panel); border: 1px solid var(--line);
  border-radius: 10px; box-shadow: var(--shadow-pop, 0 10px 28px rgba(16,24,32,.14));
  padding: .5rem .7rem; display: flex; flex-direction: column; gap: .35rem;
}
.msdrop-panel[hidden] { display: none; }
.msdrop-panel label.check { white-space: nowrap; }

table.demand td, table.demand th { text-align: center; padding: .3rem .25rem; }
.needbox { width: 3.4rem; padding: .35rem .3rem; text-align: center; }
.needcell { white-space: nowrap; text-align: center; padding: 4px !important; }
.needcell .needbox {
  display: inline-block; width: 2.6rem; margin: 0 1px; vertical-align: middle;
  -moz-appearance: textfield; appearance: textfield;
}
.needcell .needbox::-webkit-outer-spin-button, .needcell .needbox::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.needcell .needmax { border-style: dashed; color: var(--steel); }

table.monthgrid { min-width: 0; }
table.monthgrid th.day { min-width: 30px; padding: .35rem 2px; font-size: .72rem; }
table.monthgrid td.mc { min-width: 30px; padding: 3px 2px; font-size: .78rem; font-weight: 600; }
table.monthgrid td.moff { background: var(--surface-soft); color: #93a1ac; font-weight: 400; }
table.monthgrid th.name { min-width: 110px; font-size: .85rem; }
.nowrap { white-space: nowrap; }
tr.weekendrow td { background: #fff8e8; }

.plsum { font-weight: 600; margin: .75rem 0 .4rem; }
.plsum.plok { color: #1b6b3a; }
.plsum.plwarn { color: #8a5a00; }
.plnotes { margin: .2rem 0 .8rem 1.1rem; padding: 0; font-size: .88rem; color: var(--steel); }
.plweek { margin: 1rem 0 .3rem; font-size: 1rem; }
table.plgrid { min-width: 0; }
table.plgrid td.mc { min-width: 36px; font-weight: 600; font-size: .85rem; padding: 4px 3px; }
table.plgrid td.moff { background: var(--surface-soft); color: #93a1ac; font-weight: 400; }
table.plgrid td.gapcell { background: #fde3e1; color: #a12622; font-weight: 700; }
table.plgrid td.overcell { background: #fff2c2; }

/* ---------- Tek sayfalık kompakt yazdırma (v1.5) ---------- */
.printgrid { font-size: 9.5pt; }
.printgrid th, .printgrid td { padding: 2px 4px; line-height: 1.15; }
.printgrid thead th { padding: 3px 4px; }
.printgrid thead th span { display: inline; margin-left: .35em; font-weight: 400; }
.printgrid td.pshift { padding: 2px 3px; white-space: nowrap; }
.printgrid td.pshift strong { display: inline; font-size: 1em; }
.printgrid td.pshift small { display: inline; font-size: .78em; margin-left: .3em; }
.printgrid th.name { text-align: left; white-space: nowrap; }
.printgrid th.name small { display: inline; margin-left: .5em; font-weight: 400; color: #5b6b78; font-size: .78em; }
.printgrid tr.grouprow th { padding: 2px 8px; font-size: .85em; }
.printgrid td.poff { font-size: .8em; }
.printgrid tr.offrow td { font-size: .78em; line-height: 1.25; }
.printgrid tr.offrow td span { display: inline; }
.printgrid tr.offrow td span:not(:last-child)::after { content: ", "; }
.printgrid.dense { font-size: 8pt; }
.printgrid.dense th, .printgrid.dense td { padding: 1px 3px; line-height: 1.1; }
.printgrid.xdense { font-size: 6.8pt; }
.printgrid.xdense th, .printgrid.xdense td { padding: 0 2px; line-height: 1.05; }
.printview h1 { font-size: 1.15rem; margin: 0 0 .15rem; }
.printview .printweek { margin: 0 0 .4rem; }
.printview .legend { margin: .5rem 0 .2rem; font-size: .78rem; gap: .25rem 1rem; }
.printview .hint { margin: .2rem 0 0; font-size: .74rem; }
@media print {
  @page { size: A4 landscape; margin: 6mm 7mm; }
  body.printview { font-size: 10pt; }
  .printview h1 { font-size: 13pt; }
}

/* ---------- Sıralama (v1.5) ---------- */
.sortcell { white-space: nowrap; width: 1%; }
.sortcell .sortbtn, .sortcell .sorthandle {
  border: 1px solid #c9d4dc; background: var(--panel); border-radius: 8px; padding: .2rem .45rem; font-size: .8rem;
  line-height: 1; cursor: pointer; color: var(--steel, #4a5a66); margin-right: 2px;
}
/* v1.66.0: Selim bildirdi — tutamaç/▲▼ düğmeleri tam yakalamak için küçük geliyordu (özellikle
   Ayarlar'daki panel sıralamasında, dokunmatikte de mouse'da da). Dokunma hedefi önerilen ~40px'e
   yakın büyütüldü (min-width/min-height + daha büyük padding/font), aralarındaki boşluk da arttırıldı
   ki yanlışlıkla komşu düğmeye basılmasın. */
.sortcell .sortbtn, .sortcell .sorthandle {
  padding: .5rem .7rem; font-size: 1.05rem; min-width: 2.2rem; min-height: 2.2rem;
  display: inline-flex; align-items: center; justify-content: center; margin-right: 4px;
}
.sortcell .sorthandle { cursor: grab; touch-action: none; user-select: none; -webkit-user-select: none; }
.sortcell .sortbtn:active { background: var(--surface-soft); }
.dragging { background: #fff8e0 !important; outline: 2px solid #e0a526; position: relative; z-index: 3; transition: none !important; }
.card { position: relative; }
/* v1.59.3: Selim bildirdi — "Panoyu özelleştir" (.cards/.card ızgarası) sürüklerken hala titriyordu,
   oysa Ayarlar sayfasındaki <tr> tabanlı listeler (ör. Vardiyalar sıralaması) yağ gibi akıyordu. Kök sebep
   artık sıralama (swap) mantığında değildi (v1.59.2'de hallolmuştu) — .card kuralının kendisinde:
   `transition: ... transform .15s ease`. sortable.js her pointermove'da item.style.transform'u doğrudan
   imleç konumuna set ediyor, ama bu CSS geçişi her defasında eski değerden yeni değere YUMUŞAKÇA
   (.15 saniyede) kaymaya çalışıyor — yani kart hiçbir zaman gerçek imleç konumunda olmuyor, hep bir
   önceki karede "yetişmeye" çalışıyor. <tr> öğelerinde böyle bir transform geçişi hiç tanımlı olmadığı
   için orada bu sorun yaşanmıyordu. Çözüm: .dragging'e transition: none !important eklemek — sürüklenen
   öğe artık transform'u anında, karede karede birebir uyguluyor, tıpkı <tr> listelerindeki gibi. */
/* .sortcell'in "width: 1%" kuralı sadece <td> içinde (tablo düzeninde) doğru büzülüyor; kart görünümünde
   (.cardsort) bu, kutuyu neredeyse sıfır genişliğe indirip içindeki 3 düğmenin (tutamaç+yukarı+aşağı)
   sağa doğru kartın dışına taşmasına, bir sonraki kartın arkasında kaybolmasına yol açıyordu — width: auto
   ile kutu içeriğine göre boyutlanıp "right" ile kartın gerçek sağ kenarına sabitleniyor. */
.cardsort { position: absolute; top: .6rem; right: .6rem; width: auto; }
.cardcheck { position: absolute; top: .6rem; left: .8rem; margin: 0; }
.card h3 { padding-right: 7rem; padding-left: 1.6rem; }
.sorttoast {
  position: fixed; left: 50%; bottom: 1.2rem; transform: translateX(-50%); background: #16222c; color: #fff;
  padding: .5rem .9rem; border-radius: 8px; font-size: .88rem; opacity: 0; pointer-events: none; transition: opacity .2s; z-index: 50;
}
.sorttoast.show { opacity: 1; }
.sorttoast.bad { background: #a12622; }
.grouprowform .sortcell { width: auto; }

/* ---------- Ayarlar alanı panellerinin sürükle-bırak sırası (v1.49.0, bkz. assets/panelorder.js) ----------
   v1.58.1: Selim bildirdi — akordiyon oku (▾, h2'nin sağında) sürükle-bırak tutamacının (⠿▲▼) ALTINDA
   kalıyordu, üstte olması istendi. panelorder.js tutamaç hücresini (.panelsort) DOM'da h2'DEN ÖNCE
   (panelin ilk çocuğu olarak) ekliyor — eskiden bu da position:absolute ile panelin üst kenarına,
   h2'nin tam ÜSTÜNE yerleştiriliyordu (h2 de kendi üstüne padding-top ile itiliyordu), bu yüzden h2'nin
   sağındaki ok tutamaç satırının altında görünüyordu. Çözüm: panel artık dikey bir flex kapsayıcı,
   .panelsort'u DOM sırasını değiştirmeden (panelorder.js'e dokunmadan) CSS `order` ile h2'DEN SONRA
   görsel olarak ikinci satıra taşıyoruz — artık h2 (ve oku) üstte, tutamaç satırı onun altında. */
.panel.panel-sortable { position: relative; display: flex; flex-direction: column; }
.panel.panel-sortable > h2 { order: 1; }
.panel.panel-sortable > .panel-body { order: 3; }
.panel.panel-sortable > .panelsort {
  position: static; order: 2; align-self: flex-end; width: auto; margin: .5rem 0 0;
}
.panel.panel-sortable.dragging { background: #fff8e0; }

/* ---------- Ayarlar alanı panellerinin akordiyonu (v1.57.0, bkz. assets/panelaccordion.js) ----------
   Kullanıcı bildirdi: bazı Ayarlar sekmelerinde çok fazla panel üst üste durunca sayfa aşırı uzuyordu.
   Script her panelin <h2>'sini tıklanabilir bir sürgüye çeviriyor; burada sadece görünümü veriyoruz. */
.panel h2.panel-toggle {
  display: flex; align-items: center; justify-content: space-between; gap: .6rem;
  cursor: pointer; user-select: none; margin: 0;
}
.panel h2.panel-toggle:hover { color: var(--primary); }
.panel-chev { flex: 0 0 auto; font-size: .85em; color: var(--steel); transition: transform .15s ease; }
.panel.collapsed .panel-chev { transform: rotate(-90deg); }
.panel.collapsed .panel-body { display: none; }
.panel-body { margin-top: .9rem; }

table.grid td.tot small.net { display: block; font-weight: 400; font-size: .72rem; color: var(--steel); }

table.plgrid th.outmonth, table.plgrid td.outmonth { opacity: .45; }

/* ---------- Marka (v1.6): firmanın adı ve logosu ---------- */
.brand { flex-direction: row; align-items: center; gap: .6rem; }
.brand .brandlogo { max-height: 34px; max-width: 120px; width: auto; border-radius: 4px; background: #fff; padding: 2px; }
.brand .brandtext { display: flex; flex-direction: column; line-height: 1.15; }
.brand .brandtext strong { font-size: 1.05rem; font-weight: 700; }
.brand .brandtext small { font-size: .7rem; font-weight: 400; color: #a9b8c4; letter-spacing: .04em; }
.logopreview { max-height: 64px; max-width: 240px; border: 1px solid var(--line); border-radius: 6px; padding: 4px; background: #fff; }
.printonly { display: none; }
.printhead { align-items: center; gap: .6rem; margin-bottom: .4rem; font-size: 1rem; }
.printhead img.printlogo { max-height: 30px; max-width: 140px; width: auto; }
@media print { .printonly { display: flex; } }

.brand .brandlogo.plain { background: transparent; padding: 0; }
.prevbar { display: inline-flex; align-items: center; gap: .6rem; background: var(--ink); color: #fff; padding: .5rem .8rem; border-radius: 8px; margin: .3rem 0; }
.prevbar .brandlogo { max-height: 34px; max-width: 120px; width: auto; border-radius: 4px; background: #fff; padding: 2px; }
.prevbar .brandlogo.plain { background: transparent; padding: 0; }
.prevbar .brandtext { display: flex; flex-direction: column; line-height: 1.15; }
.prevbar .brandtext strong { font-size: 1.05rem; }
.prevbar .brandtext small { font-size: .7rem; color: #a9b8c4; letter-spacing: .04em; }

/* v1.6.2: marka = vardiyam.net (büyük), firma adı altında küçük */
.brand .brandtext strong, .prevbar .brandtext strong { font-size: 1.2rem; letter-spacing: .01em; }
.brand .brandtext small, .prevbar .brandtext small { font-size: .74rem; letter-spacing: 0; color: #c3cfd9; max-width: 46vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ---------- Şifre alanı: göz ikonu (v1.7) ---------- */
.pwwrap { position: relative; display: block; }
.pwwrap input { width: 100%; padding-right: 2.8rem; }
/* v1.122.0 — ikon rengi (#5b6b78) ve hover rengi (#16222c) --steel/--ink ile neredeyse birebir
   aynıydı ama temadan bağımsız sabit kalıyordu — koyu modda hover'da arkaplan (artık --surface-soft)
   koyulaşırken yazı da #16222c (neredeyse siyah) kalıp göz ikonu okunmaz hale geliyordu. var(--steel)/
   var(--ink)'e çevrildi, açık moddaki görünüm değişmedi. */
.pwtoggle { position: absolute; right: .3rem; top: 50%; transform: translateY(-50%); width: 2.2rem; height: 2.2rem; display: flex; align-items: center; justify-content: center; border: 0; background: transparent; color: var(--steel); cursor: pointer; border-radius: 6px; padding: 0; }
.pwtoggle:hover { background: var(--surface-soft); color: var(--ink); }
.pwtoggle .eyeoff { display: none; }
.pwtoggle.on .eye { display: none; }
.pwtoggle.on .eyeoff { display: block; }

/* ---------- Marka: .net vurgusu ve kadran ikonu ---------- */
.brand .tld { color: #2dd4bf; }
.brand .brandicon { display: block; flex: 0 0 auto; }
.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }

/* ---------- Giriş ekranı ---------- */
body.loginpage { min-height: 100vh; background-color: #eef3f6; background-attachment: fixed; }
body.loginpage main.page { min-height: 100vh; display: flex; flex-direction: column; justify-content: center; align-items: center; max-width: none; padding: 1.5rem 1rem; }
body.loginpage .loginbox { width: 100%; max-width: 420px; background: #fff; border-radius: var(--radius-card, 16px); padding: 1.8rem 1.6rem 1.6rem; box-shadow: var(--shadow-pop, 0 8px 30px rgba(22, 34, 44, .12)); border: 1px solid #dfe7ec; }
body.loginpage .loginlogo { display: block; max-width: 100%; height: auto; margin: 0 auto .6rem; }
body.loginpage .loginbox .muted { text-align: center; margin: 0 0 1rem; }
body.loginpage .verline { color: #5b6b78; }
body.bg-off { background-image: none; }
body.bg-cells { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='96' height='96' viewBox='0 0 96 96'><g fill-opacity='0.17'><rect x='6' y='8' width='30' height='10' rx='5' fill='%23e0a020'/><rect x='22' y='24' width='30' height='10' rx='5' fill='%233f7cc4'/><rect x='10' y='40' width='42' height='10' rx='5' fill='%233b3b78'/><rect x='58' y='58' width='30' height='10' rx='5' fill='%23e0a020'/><rect x='50' y='74' width='36' height='10' rx='5' fill='%233f7cc4'/><rect x='62' y='12' width='24' height='10' rx='5' fill='%233b3b78'/></g></svg>"); }
body.bg-dots { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='22'><circle cx='3' cy='3' r='1.5' fill='%23b9c6d0'/></svg>"); }
body.bg-lines { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='18' height='18'><path d='M-2 2L2 -2M0 18L18 0M16 20L20 16' stroke='%23c9d4dc' stroke-width='1'/></svg>"); }
body.bg-rings { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140' viewBox='0 0 140 140'><g opacity='0.14'><path d='M70.0 30.0A40 40 0 0 1 107.0 85.3' fill='none' stroke='%23e0a020' stroke-width='10'/><path d='M104.6 90.0A40 40 0 0 1 38.3 94.4' fill='none' stroke='%233f7cc4' stroke-width='10'/><path d='M35.4 90.0A40 40 0 0 1 64.8 30.3' fill='none' stroke='%233b3b78' stroke-width='10'/></g></svg>"); }
body.bg-custom { background-size: cover; background-position: center; background-repeat: no-repeat; }
.bgchoices { display: flex; flex-wrap: wrap; gap: .8rem; margin: .6rem 0; }
.bgchoice { width: 112px; text-align: center; font-size: .82rem; cursor: pointer; }
.bgchoice .sw { display: block; height: 64px; border: 1px solid #c9d4dc; border-radius: 8px; background-color: #eef3f6; margin-bottom: .3rem; }
.bgchoice input { margin-right: .25rem; }
.bgchoice .sw.bg-cells { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='96' height='96' viewBox='0 0 96 96'><g fill-opacity='0.17'><rect x='6' y='8' width='30' height='10' rx='5' fill='%23e0a020'/><rect x='22' y='24' width='30' height='10' rx='5' fill='%233f7cc4'/><rect x='10' y='40' width='42' height='10' rx='5' fill='%233b3b78'/><rect x='58' y='58' width='30' height='10' rx='5' fill='%23e0a020'/><rect x='50' y='74' width='36' height='10' rx='5' fill='%233f7cc4'/><rect x='62' y='12' width='24' height='10' rx='5' fill='%233b3b78'/></g></svg>"); }
.bgchoice .sw.bg-dots { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='22' height='22'><circle cx='3' cy='3' r='1.5' fill='%23b9c6d0'/></svg>"); }
.bgchoice .sw.bg-lines { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='18' height='18'><path d='M-2 2L2 -2M0 18L18 0M16 20L20 16' stroke='%23c9d4dc' stroke-width='1'/></svg>"); }
.bgchoice .sw.bg-rings { background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='140' height='140' viewBox='0 0 140 140'><g opacity='0.14'><path d='M70.0 30.0A40 40 0 0 1 107.0 85.3' fill='none' stroke='%23e0a020' stroke-width='10'/><path d='M104.6 90.0A40 40 0 0 1 38.3 94.4' fill='none' stroke='%233f7cc4' stroke-width='10'/><path d='M35.4 90.0A40 40 0 0 1 64.8 30.3' fill='none' stroke='%233b3b78' stroke-width='10'/></g></svg>"); }
.bgchoice .sw.bg-off { background-image: none; }
.bgchoice .sw.bg-custom { background-size: cover; background-position: center; display: flex; align-items: center; justify-content: center; color: #5b6b78; }

/* v1.115.0 — Site Ayarları > "Tanıtım sitesi görünümü" panelindeki önizleme kareleri (.bgchoice ile
   aynı iskeleti kullanıyor, sadece kendi "pub-decor-*" modifier sınıfları farklı). */
.bgchoice .sw.pub-decor-off { background-image: none; }
.bgchoice .sw.pub-decor-soft {
  background-image:
    radial-gradient(60% 55% at 15% 15%, rgba(47, 95, 219, .35), transparent 70%),
    radial-gradient(60% 55% at 85% 25%, rgba(224, 160, 32, .32), transparent 70%),
    radial-gradient(60% 55% at 20% 85%, rgba(34, 160, 120, .3), transparent 70%),
    radial-gradient(60% 55% at 85% 90%, rgba(224, 90, 120, .28), transparent 70%);
}
.bgchoice .sw.pub-decor-vivid {
  background-image:
    radial-gradient(60% 55% at 15% 15%, rgba(47, 95, 219, .55), transparent 70%),
    radial-gradient(60% 55% at 85% 25%, rgba(224, 160, 32, .5), transparent 70%),
    radial-gradient(60% 55% at 20% 85%, rgba(34, 160, 120, .46), transparent 70%),
    radial-gradient(60% 55% at 85% 90%, rgba(224, 70, 110, .42), transparent 70%);
}
.bgchoice .sw.pub-decor-geo { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='104'%3E%3Cg fill='none' stroke='%232f5fdb' stroke-opacity='.4' stroke-width='1.4'%3E%3Cpath d='M60 2 112 32 112 72 60 102 8 72 8 32Z'/%3E%3Cpath d='M60 2 60 36M8 32 60 36M112 32 60 36M8 72 60 68M112 72 60 68M60 102 60 68'/%3E%3C/g%3E%3C/svg%3E"); background-size: 60px 52px; }
.bgchoice .sw.pub-decor-dots { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='34' height='34'%3E%3Ccircle cx='5' cy='5' r='2.6' fill='%232f5fdb' fill-opacity='.5'/%3E%3C/svg%3E"); background-size: 17px 17px; }

/* ---------- v1.8: yerleşik editör ---------- */
.editorwrap { border: 1px solid var(--line); border-radius: 8px; overflow: hidden; }
.editortoolbar { display: flex; flex-wrap: wrap; gap: 2px; padding: .4rem; background: var(--surface-soft); border-bottom: 1px solid var(--line); }
.editorbtn { border: 1px solid transparent; background: transparent; border-radius: 6px; padding: .3rem .55rem; font-size: .88rem; cursor: pointer; color: var(--ink); min-width: 2rem; }
.editorbtn:hover { background: var(--surface-soft); border-color: var(--line); }
.editorsep { width: 1px; background: var(--line); margin: .2rem .3rem; }
.editorarea { min-height: 260px; padding: .8rem 1rem; outline: none; line-height: 1.6; }
.editorarea img { max-width: 100%; border-radius: 6px; }
.editorarea table { border-collapse: collapse; width: 100%; }
.editorarea table td, .editorarea table th { border: 1px solid var(--line); padding: .4rem .5rem; }
.editorarea blockquote { border-left: 3px solid var(--primary); margin: .6rem 0; padding: .2rem 0 .2rem 1rem; color: var(--steel); }

/* ---------- v1.8: içerik metni (richtext) ---------- */
.richtext { line-height: 1.7; font-size: 1.02rem; }
.richtext h2 { font-size: 1.3rem; margin: 1.6rem 0 .6rem; }
.richtext h3 { font-size: 1.1rem; margin: 1.3rem 0 .5rem; }
.richtext img { max-width: 100%; border-radius: 8px; }
.richtext table { border-collapse: collapse; width: 100%; margin: 1rem 0; }
.richtext table td, .richtext table th { border: 1px solid var(--line); padding: .5rem .7rem; }
.richtext blockquote { border-left: 3px solid var(--primary); margin: 1rem 0; padding: .3rem 0 .3rem 1.1rem; color: var(--steel); }
.v-gallery { display: flex; flex-wrap: wrap; gap: .6rem; margin: 1rem 0; }
.v-gallery img { width: 140px; height: 140px; object-fit: cover; border-radius: 8px; }
.v-video { position: relative; padding-top: 56.25%; margin: 1rem 0; }
.v-video iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; border-radius: 8px; }

/* ---------- v1.8: lightbox ---------- */
.v-lbOverlay { position: fixed; inset: 0; background: rgba(10, 16, 20, .92); display: none; align-items: center; justify-content: center; z-index: 999; }
.v-lbOverlay.open { display: flex; }
.v-lbImg { max-width: 92vw; max-height: 84vh; border-radius: 6px; }
.v-lbCap { position: absolute; bottom: 1.2rem; left: 0; right: 0; text-align: center; color: #fff; font-size: .9rem; }
.v-lbClose { position: absolute; top: 1rem; right: 1.2rem; background: transparent; border: 0; color: #fff; font-size: 1.6rem; cursor: pointer; }
.v-lbNav { position: absolute; top: 50%; transform: translateY(-50%); background: transparent; border: 0; color: #fff; font-size: 2.4rem; cursor: pointer; padding: .5rem 1rem; }
.v-lbPrev { left: .5rem; } .v-lbNext { right: .5rem; }

/* ---------- v1.8: tanıtım sitesi (site_layout.php) ---------- */
/* v1.68.0 — "Birleşik Tema" yenilemesi tanıtım sitesine de yayıldı: eskiden bu blok kendi sabit
   lacivert (#16222c) rengini taşıyordu, uygulamanın koyu/açık mod + serbest vurgu renginden tamamen
   bağımsızdı. Artık her şey :root token'larından (bkz. inc/themes.php) besleniyor — giriş yapmış bir
   kullanıcı siteye bakarken kendi kişisel temasını (koyu/açık/vurgu rengi) burada da görüyor, anonim
   ziyaretçi ise varsayılan açık (Sade Kurumsal) paleti görüyor. */
body.sitepage { margin: 0; background: var(--paper); color: var(--ink); font-family: var(--font); }
.sitebar { background: var(--panel); color: var(--ink); border-bottom: 1px solid var(--line); }
.sitebar-in { max-width: 1080px; margin: 0 auto; display: flex; align-items: center; gap: 1.4rem; padding: .8rem 1.2rem; }
.sbrand { display: flex; align-items: center; gap: .5rem; color: var(--ink); text-decoration: none; font-weight: 700; font-size: 1.05rem; }
.sbrand .tld { color: var(--primary); }
.snav { display: flex; flex-wrap: wrap; gap: 1.1rem; flex: 1 1 auto; }
.snav a { color: var(--steel); text-decoration: none; font-size: .92rem; }
.snav a:hover { color: var(--ink); }
.sitebar .navdrop > summary { color: var(--steel); }
.sitebar .navdrop > summary:hover { background: var(--paper); color: var(--ink); }
.sloginbtn { margin-left: auto; }
.sitelogin-menu { margin-left: auto; }
.sitelogin-menu summary { padding: .4rem 0; }
.sloginlink { color: var(--steel); text-decoration: none; font-size: .92rem; margin-left: auto; align-self: center; }
.sloginlink:hover { color: var(--ink); }
.sloginlink + .sloginbtn { margin-left: .9rem; }
.sloginlink + .sitelogin-menu { margin-left: .9rem; }
/* v1.109.0 — .linkbtn aynı AÇIK-renk-koyu-arkaplan sorunu burada da vardı (bkz. yukarısı,
   .app-topbar .linkbtn için aynı düzeltme): tanıtım sitesinin "Giriş" menüsü (.sitelogin-menu) de
   .linkbtn kullanıyor, bu sınıfın VARSAYILAN rengi (#cfdae3) koyu üst bar için — ama .sitebar her
   zaman AÇIK (var(--panel)) olduğu için "Giriş ▾" metni okunmuyordu (kullanıcı bildirdi). */
.sitebar .linkbtn { color: var(--ink); }
.sitebar .linkbtn:hover { color: var(--primary); }

/* v1.115.0 — Tanıtım sitesi için jenerik (fotoğrafsız) dekoratif görsel katmanı + bölüm "kart"ları.
   Site Ayarları (site.php) > "Tanıtım sitesi görünümü" panelinden süper admin seçer/değiştirir —
   bkz. inc/site_layout.php::site_pub_decor_style()/site_pub_decor_cards(). "off" eski (v1.114.0
   öncesi) sade görünümle birebir aynı kalır; .sitebar zaten kendi zemin rengini (var(--panel))
   taşıdığı için desen orada görünmez, sadece boşluklarda (bölümler arası, footer) belirir. */
body.pub-decor-off .pub-decor-bg { display: none; }

body.pub-decor-soft {
  background-image:
    radial-gradient(640px 520px at 8% 6%, rgba(47, 95, 219, .13), transparent 60%),
    radial-gradient(680px 560px at 94% 22%, rgba(224, 160, 32, .12), transparent 60%),
    radial-gradient(620px 560px at 12% 82%, rgba(34, 160, 120, .11), transparent 60%),
    radial-gradient(700px 600px at 92% 92%, rgba(224, 90, 120, .10), transparent 60%);
  background-repeat: no-repeat;
  background-attachment: fixed, fixed, fixed, fixed;
}

body.pub-decor-vivid {
  background-image:
    radial-gradient(680px 560px at 6% 4%, rgba(47, 95, 219, .22), transparent 58%),
    radial-gradient(720px 600px at 96% 18%, rgba(224, 160, 32, .20), transparent 58%),
    radial-gradient(660px 600px at 10% 84%, rgba(34, 160, 120, .19), transparent 58%),
    radial-gradient(740px 640px at 94% 94%, rgba(224, 70, 110, .18), transparent 58%);
  background-repeat: no-repeat;
  background-attachment: fixed, fixed, fixed, fixed;
}

body.pub-decor-geo {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='104'%3E%3Cg fill='none' stroke='%232f5fdb' stroke-opacity='.10' stroke-width='1.4'%3E%3Cpath d='M60 2 112 32 112 72 60 102 8 72 8 32Z'/%3E%3Cpath d='M60 2 60 36M8 32 60 36M112 32 60 36M8 72 60 68M112 72 60 68M60 102 60 68'/%3E%3C/g%3E%3C/svg%3E");
  background-size: 120px 104px;
}

body.pub-decor-dots {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='34' height='34'%3E%3Ccircle cx='5' cy='5' r='2.6' fill='%232f5fdb' fill-opacity='.14'/%3E%3C/svg%3E");
  background-size: 34px 34px;
}

/* Bölüm "kart"ları: istatistik/SSS/fiyatlandırma blokları zemin renginden ayrışan, hafif gölgeli
   panellere dönüşür — ana sayfanın "sade/basit" hissini kırmak için (kullanıcı geri bildirimi).
   Dekoratif arka plandan BAĞIMSIZ bir anahtar (pub_decor_cards) — "off" arka planla da birlikte
   kullanılabilir. */
body.pub-cards .homestats,
body.pub-cards .homefaq,
body.pub-cards .homepricing {
  background: var(--panel);
  border: 1px solid var(--line);
  border-radius: var(--radius-card, 20px);
  box-shadow: var(--shadow-pop, 0 10px 28px rgba(16, 24, 32, .14));
  margin-top: 2.2rem;
  margin-bottom: 2.2rem;
}

.siteMain { min-height: 60vh; }
.siteWrap { max-width: 880px; margin: 0 auto; padding: 2.2rem 1.2rem; }
/* v1.116.0 — .siteWrap (880px) düz metin sayfaları için tasarlanmıştı; 3'lü kart/grid bölümlerini
   (öne çıkanlar, istatistikler, fiyatlandırma, "nasıl çalışır") AYNI dar kutuya sıkıştırmak onları
   gereksiz yere dar/sıkışık gösteriyordu (kullanıcı geri bildirimi) — bu bölümler artık kendi daha
   geniş kutusunu (.siteWrapWide) kullanıyor. */
.siteWrapWide { max-width: 1180px; margin: 0 auto; padding: 2.2rem 1.4rem; }
.sitePageBody h1 { font-size: 1.7rem; margin-bottom: 1rem; }
.hero { background: linear-gradient(180deg, var(--panel) 0%, var(--paper) 100%); color: var(--ink); border-bottom: 1px solid var(--line); text-align: center; padding: 3rem 1.2rem 3.4rem; }
.herologo { max-width: 100%; height: auto; margin: 0 auto 1rem; display: block; }
.herolede { max-width: 560px; margin: 0 auto 1.6rem; color: var(--steel); font-size: 1.05rem; line-height: 1.6; }
.heroCta { display: flex; gap: .8rem; justify-content: center; flex-wrap: wrap; }
.btn.big { padding: .8rem 1.6rem; font-size: 1.02rem; }

/* v1.111.0 — Üst menünün hemen altındaki hero slayt gösterisi (home_admin.php'deki "Hero Slayt"
   paneli, en az bir slayt eklenince .hero'nun YERİNE basılıyor — bkz. index.php).
   v1.113.0 — Swiper denendi, yükseklik hatasını çözdü ama Selim'in istediği "her geçişte farklı
   rastgele efekt" ihtiyacını karşılamadı (Swiper tek slider içinde geçiş başına efekt
   değiştiremiyor) ve ok (prev/next) + video butonu gibi istenen ek özellikler için de elverişsizdi.
   v1.114.0 — Swiper tamamen kaldırıldı (gereksiz bağımlılık), yerine kendi yazdığımız, HER GEÇİŞTE
   bağımsız rastgele efekt seçebilen bir motor geldi (bkz. home_render_hero_slides()): 11 gerçek
   geçiş efekti (fade/zoom/kayma x4 yön/flip x2/çapraz/blur), ok ile ileri-geri gezinme, ve
   isteğe bağlı video oynatma düğmesi. Yükseklik hatası BİR DAHA yaşanmasın diye slaytlar HER ZAMAN
   position:absolute;inset:0 kalıyor (hiçbir zaman position:relative'e geçmiyor) — konteynerin
   yüksekliği sadece .heroslides'teki --hero-h'tan geliyor, slayt içeriğinden ASLA etkilenmiyor. */
.heroslides { position: relative; min-height: var(--hero-h, 420px); overflow: hidden; border-bottom: 1px solid var(--line); perspective: 1600px; }
.heroslide { position: absolute; inset: 0; background-color: var(--panel); background-size: cover; background-position: center; opacity: 0; z-index: 1; display: flex; align-items: center; backface-visibility: hidden; }
.heroslide.is-active { opacity: 1; z-index: 2; }
/* v1.117.0 — "koyu gölge resmi çok kapatıyor" geri bildirimi: gölge artık 3 seviyeden admin
   tarafından seçilebiliyor (bkz. home_admin.php "Resmin üstündeki koyu gölge"). Seviyeler
   .heroslides-ov-* sınıfıyla (bkz. home_render_hero_slides()) CSS değişkenlerini set ediyor,
   .heroslide-overlay bu değişkenleri kullanıyor — RTL'de sadece gradyan AÇISI değişiyor (aşağıda),
   seviye değerleri tekrar yazılmıyor. */
.heroslides-ov-light { --hero-ov-a: rgba(0,0,0,.38); --hero-ov-b: rgba(0,0,0,.20); --hero-ov-c: rgba(0,0,0,.04); }
.heroslides-ov-medium { --hero-ov-a: rgba(0,0,0,.50); --hero-ov-b: rgba(0,0,0,.28); --hero-ov-c: rgba(0,0,0,.06); }
.heroslides-ov-dark { --hero-ov-a: rgba(0,0,0,.64); --hero-ov-b: rgba(0,0,0,.40); --hero-ov-c: rgba(0,0,0,.12); }
.heroslide-overlay { width: 100%; background: linear-gradient(90deg, var(--hero-ov-a, rgba(0,0,0,.5)) 0%, var(--hero-ov-b, rgba(0,0,0,.28)) 55%, var(--hero-ov-c, rgba(0,0,0,.06)) 100%); padding: 3.4rem 0; }
.heroslide-copy { text-align: left; max-width: 640px; }
.heroslide-copy h1 { color: #fff; font-size: 2rem; margin: 0 0 .7rem; }
.heroslide-copy p { color: rgba(255,255,255,.92); font-size: 1.05rem; line-height: 1.6; margin: 0 0 1.4rem; max-width: 520px; }

/* v1.118.0 — Nokta göstergeleri artık ayrı bir (zemin renkli) şerit değil, fotoğrafın ÜZERİNE
   bindirilmiş, yarı saydam bir kapsül — Conalz'daki gibi. Eskiden .heroslides'tan SONRA basılan
   ayrı bir <div> idi; "resmin altında boş beyaz alan kalmış" geri bildirimi üzerine resmin kendi
   içine (absolute, alt-orta) taşındı — bkz. home_render_hero_slides(). */
.heroslides-dots { position: absolute; left: 50%; bottom: 1.1rem; transform: translateX(-50%); z-index: 5; display: flex; justify-content: center; gap: .5rem; padding: .5rem .7rem; background: rgba(0,0,0,.3); border-radius: 999px; backdrop-filter: blur(2px); }
.heroslides-dot { width: .55rem; height: .55rem; border-radius: 999px; border: 0; background: rgba(255,255,255,.5); cursor: pointer; padding: 0; transition: background .2s ease, transform .2s ease; }
.heroslides-dot:hover { background: rgba(255,255,255,.8); }
.heroslides-dot.is-active { background: #fff; transform: scale(1.15); }

/* Sağ/sol ok düğmeleri — Selim'in beğendiği şablondaki gibi, slayt alanının üstünde yarı saydam. */
/* v1.117.0 — "oklar çok küçük kalmış" geri bildirimi: 2.6rem/1.3rem'den 3.4rem/1.7rem'e büyütüldü,
   ayrıca hover'da hafif büyüyerek (scale) tıklanabilir olduğunu daha iyi belli ediyor. */
.heroslides-arrow { position: absolute; top: 50%; transform: translateY(-50%); z-index: 5; width: 3.4rem; height: 3.4rem; border-radius: 999px; border: 0; background: rgba(0,0,0,.4); color: #fff; font-size: 1.7rem; line-height: 1; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: background .2s ease, transform .2s ease; }
.heroslides-arrow:hover { background: rgba(0,0,0,.62); transform: translateY(-50%) scale(1.08); }
.heroslides-arrow.prev { left: 1.2rem; }
.heroslides-arrow.next { right: 1.2rem; }

/* Video oynatma düğmesi — slaytta video_url varsa görünür, ortada büyük bir "play" ikonu. */
.heroslide-video-btn { position: absolute; top: 50%; right: 14%; transform: translate(50%, -50%); z-index: 4; width: 4.2rem; height: 4.2rem; border-radius: 999px; border: 2px solid rgba(255,255,255,.85); background: rgba(0,0,0,.35); color: #fff; cursor: pointer; display: flex; align-items: center; justify-content: center; transition: transform .2s ease, background .2s ease; }
.heroslide-video-btn:hover { background: rgba(0,0,0,.55); transform: translate(50%, -50%) scale(1.07); }
.heroslide-video-btn svg { width: 1.3rem; height: 1.3rem; margin-left: .18rem; }

/* Video modalı — sayfada tek bir kopya, tüm slaytlar paylaşır (bkz. home_render_hero_slides()). */
.herovideo-modal { position: fixed; inset: 0; z-index: 2000; display: none; align-items: center; justify-content: center; background: rgba(10,14,18,.86); padding: 1.2rem; }
.herovideo-modal.open { display: flex; }
.herovideo-modal-box { position: relative; width: 100%; max-width: 980px; aspect-ratio: 16/9; background: #000; border-radius: 10px; overflow: hidden; }
.herovideo-modal-box iframe, .herovideo-modal-box video { width: 100%; height: 100%; border: 0; display: block; }
.herovideo-modal-close { position: absolute; top: -2.6rem; right: 0; width: 2.2rem; height: 2.2rem; border-radius: 999px; border: 0; background: rgba(255,255,255,.12); color: #fff; font-size: 1.1rem; cursor: pointer; }

/* Genişlik seçeneği: tam kaplama (varsayılan) yerine "kutulu" — kenarlarda boşluk, yuvarlak köşe. */
.heroslides.is-boxed { max-width: 1180px; margin: 1.4rem auto 0; border-radius: 16px; border: 1px solid var(--line); }
.heroslides.is-boxed .heroslide-overlay { border-radius: 16px; }

@media (max-width: 720px) {
  .heroslides { min-height: min(var(--hero-h, 420px), 320px); }
  .heroslides.is-boxed { max-width: calc(100% - 1.2rem); margin: .8rem auto 0; }
  .heroslide-overlay { padding: 2.2rem 0; }
  .heroslide-copy { text-align: center; max-width: none; }
  .heroslide-copy p { max-width: none; margin-left: auto; margin-right: auto; }
  .heroslides-arrow { width: 2.6rem; height: 2.6rem; font-size: 1.3rem; }
  .heroslide-video-btn { right: 50%; top: 32%; width: 3.4rem; height: 3.4rem; }
}
.is-rtl .heroslide-copy { text-align: right; }
.is-rtl .heroslide-overlay { background: linear-gradient(270deg, var(--hero-ov-a, rgba(0,0,0,.5)) 0%, var(--hero-ov-b, rgba(0,0,0,.28)) 55%, var(--hero-ov-c, rgba(0,0,0,.06)) 100%); }
.is-rtl .heroslide-video-btn { right: auto; left: 14%; transform: translate(-50%, -50%); }
.is-rtl .heroslide-video-btn:hover { transform: translate(-50%, -50%) scale(1.07); }

.features { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.2rem; padding-top: 2.6rem; }
.featcard { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 1.3rem 1.4rem; transition: transform .22s ease, box-shadow .22s ease, border-color .22s ease; }
.featcard h3 { margin: 0 0 .5rem; font-size: 1.05rem; }
.featcard p { margin: 0; color: var(--steel); font-size: .92rem; line-height: 1.55; }
/* v1.116.0 — "öne çıkanlar" kartlarına hover efekti: kart kalkar/gölgelenir, ikon rozeti vurgu
   rengine döner (kullanıcının seçtiği zenginleştirme maddelerinden biri). */
.featcard:hover { transform: translateY(-5px); box-shadow: var(--shadow-pop, 0 10px 28px rgba(16,24,32,.14)); border-color: var(--primary); }
.featcard:hover .featcard-icon { background: var(--primary); color: #fff; }

/* v1.110.0 — Ana sayfanın artık admin'den (home_admin.php) açılıp kapatılabilen bölümleri: güven
   şeridi / nasıl çalışır / özellik ızgarası (genişletilmiş) / fiyatlandırma / SSS. Renk/ölçü
   token'ları (var(--panel)/--ink/--steel/--primary/--line) ve genel kart kalıbı (.featcard ile aynı
   radius/padding mantığı) zaten var olan tanıtım sitesi stiliyle BİREBİR tutarlı tutuldu — ayrı bir
   "tema" eklenmedi, sadece yeni bölüm şekilleri. */
.homesec { padding-top: 2.6rem; }
.homesec h2 { text-align: center; font-size: 1.5rem; margin: 0 0 .4rem; }
.homesec-sub { text-align: center; color: var(--steel); margin: 0 0 1.6rem; }
.homesec > div:last-child:first-child { padding-top: 0; }
/* v1.120.0 — "panodaki widget'lar gibi renk seçeneği ver" geri bildirimi: home_section_style_attr()
   seçilen bölüme inline "--homesec-bg"/"--homesec-fg" basıyor (bkz. inc/home_content.php,
   dashboard'daki dash_widget_colors() ile AYNI desen). Dar (siteWrapWide SECTION'ın kendisi olan)
   bölümlerde (stats/how_it_works/faq/pricing) bu, dashboard'daki "kart rengi" gibi davranıp bölümü
   zeminden ayrışan yuvarlak köşeli bir panele çeviriyor — renk seçilmemişse hiçbir şey değişmiyor. */
.homesec[style*="--homesec-bg"]:not(.homefeatures):not(.hometestimonials) { background: var(--homesec-bg); border-radius: var(--radius-card, 20px); padding: 2rem 1.6rem; margin: 1.6rem 0; }
.homesec[style*="--homesec-bg"] h2,
.homesec[style*="--homesec-bg"] .homesec-sub { color: var(--homesec-fg, inherit); }

.homestats { padding-top: 1.8rem; }
/* v1.117.0 — "sayfa kayarken zemin değişsin, paralaks gibi" geri bildirimi: bazı bölümler (öne
   çıkanlar, müşteri yorumları) artık tam genişlikte, hafif farklı tonda bir "bant" üstünde duruyor.
   DIŞ <section> artık genişlik sınırlaması taşımıyor (tam genişlik + zemin rengi burada), İÇ <div
   class="siteWrapWide"> içeriği ortalıyor — bkz. home_render_features_section()/
   home_render_testimonials_section(). (İlk denemede box-shadow ile "sahte tam genişlik" yapılmıştı
   ama spread TÜM yönlere eşit uygulandığı için üstteki hero'nun üzerini kaplıyordu — o yüzden gerçek
   markup değişikliğine geçildi.) */
.homefeatures,
.hometestimonials { background: var(--homesec-bg, #eef3fb); padding-top: 3rem; padding-bottom: 3rem; }
.statsrow { display: flex; flex-wrap: wrap; justify-content: center; gap: 2.2rem 3rem; text-align: center; }
/* v1.118.0 — "iki tane koyunca küçücük kalıyorlar" geri bildirimi: eskiden her öğe SABİT bir
   max-width'e sahipti, yani az sayıda öğe eklenince satırda boş yer kalıyor ama öğeler büyümüyordu.
   Şimdi flex-grow (flex: 1 1 <taban>) ile öğeler boşluğu dolduruyor — az öğe varsa her biri kendi
   max-width tavanına kadar GENİŞLİYOR (ve container query ile rakam/çubuk da kendiliğinden
   büyüyor), çok öğe varsa taban genişliğe yakın kalıp sarıyor. "Küçük/Orta/Büyük" admin ayarı artık
   sadece taban boyutu değil, aynı zamanda bu büyüme TAVANINI da belirliyor. */
.statitem { flex: 1 1 150px; max-width: 230px; container-type: inline-size; }
.statitem strong { display: block; font-family: var(--font-heading, inherit); font-size: 1.8rem; color: var(--primary); line-height: 1.2; }
.statitem span { color: var(--steel); font-size: .88rem; }
.statsuffix { margin-left: .1em; }
/* v1.117.0 — "bayağı küçük kalmışlar" geri bildirimi: 3 boyut seviyesi (bkz. home_stats_size()),
   "lg" yeni VARSAYILAN — eskisinden belirgin şekilde daha büyük rakam + daha kalın çubuk. */
.statsrow.size-sm .statitem { flex-basis: 120px; max-width: 190px; }
.statsrow.size-sm .statitem strong { font-size: 1.6rem; }
.statsrow.size-sm .statbar { height: 5px; }
.statsrow.size-sm .statitem span { font-size: .84rem; }
.statsrow.size-md .statitem { flex-basis: 140px; max-width: 260px; }
.statsrow.size-md .statitem strong { font-size: 2.1rem; }
.statsrow.size-md .statbar { height: 6px; }
.statsrow.size-md .statitem span { font-size: .9rem; }
.statsrow.size-lg .statitem { flex-basis: 160px; max-width: 340px; }
.statsrow.size-lg .statitem strong { font-size: 2.8rem; }
.statsrow.size-lg .statbar { height: 8px; margin: .7rem 0 .8rem; }
.statsrow.size-lg .statitem span { font-size: 1rem; }
.statsrow.size-lg { gap: 2.6rem 3.6rem; }
/* v1.118.0 — öğe flex-grow ile genişleyince (az sayıda öğe eklendiğinde) rakam/etiket/çubuk da
   orantılı büyüsün diye container query — her boyut katmanı kendi tavanına kadar kademeli büyüyor. */
@container (min-width: 210px) {
  .statsrow.size-sm .statitem strong { font-size: 1.9rem; }
  .statsrow.size-md .statitem strong { font-size: 2.4rem; }
  .statsrow.size-lg .statitem strong { font-size: 3.2rem; }
  .statitem span { font-size: .98rem; }
  .statbar { height: 7px; }
}
@container (min-width: 280px) {
  .statsrow.size-md .statitem strong { font-size: 2.7rem; }
  .statsrow.size-lg .statitem strong { font-size: 3.6rem; }
  .statitem span { font-size: 1.05rem; }
  .statbar { height: 9px; }
}
/* v1.116.0 — sayaç animasyonu (bkz. home_render_stats_section() içindeki script) + dekoratif
   ilerleme çubuğu. Çubuk GERÇEK bir yüzde değil (zaten sayı yukarıda yazıyor), sadece
   görsel zenginlik için; bölüm görünür olunca .statsrow'a "in-view" sınıfı eklenince dolar. */
.statbar { display: block; height: 5px; border-radius: 999px; background: var(--line); margin: .5rem 0 .6rem; overflow: hidden; }
.statbar-fill { display: block; height: 100%; width: 0; border-radius: 999px; background: linear-gradient(90deg, var(--primary), var(--primary-dark)); transition: width 1.1s ease; }
.statsrow.in-view .statbar-fill { width: var(--bar-w, 85%); }

.stepsrow { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1.4rem; }
.stepitem { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 1.4rem 1.4rem 1.3rem; position: relative; transition: transform .22s ease, box-shadow .22s ease; }
.stepitem:hover { transform: translateY(-4px); box-shadow: var(--shadow-card, 0 4px 16px rgba(16,24,32,.07)); }
.stepno { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; border-radius: 999px; background: var(--primary); color: #fff; font-weight: 700; font-size: .95rem; margin-bottom: .7rem; position: relative; z-index: 1; }
.stepitem h3 { margin: 0 0 .4rem; font-size: 1.02rem; }
.stepitem p { margin: 0; color: var(--steel); font-size: .9rem; line-height: 1.55; }
/* v1.116.0 — adımlar arası bağlantı çizgisi (sadece masaüstü 3'lü grid sırasında; mobilde
   tek sütuna düşünce aşağıdaki media query ile gizleniyor). */
.stepitem:not(:first-child)::before { content: ''; position: absolute; top: 2.4rem; left: -1.4rem; width: 1.4rem; height: 2px; background: var(--line); z-index: 0; }

.featuresgrid { grid-template-columns: repeat(3, 1fr); }
.featcard-icon { display: inline-flex; align-items: center; justify-content: center; width: 2.4rem; height: 2.4rem; border-radius: 10px; background: var(--paper); color: var(--primary); margin-bottom: .6rem; }
.featcard-icon svg { width: 1.3rem; height: 1.3rem; }

/* v1.121.0 — "SSS maddeleri hala küçük/dar kalmış" geri bildirimi: dış bölüm (.homefaq) v1.120.0'da
   siteWrapWide (1180px) genişliğine getirilmişti ama bu iç liste eskiden kalma kendi 700px tavanını
   koruyordu, o yüzden sorular ortada dar bir şerit halinde kalmaya devam ediyordu. Artık ayrı bir
   tavanı yok — dış kutunun (siteWrapWide) tüm genişliğini dolduruyor, tıpkı üstündeki fiyatlandırma/
   nasıl çalışır bloklarının içeriği gibi. */
.faqlist { margin: 0 auto; display: flex; flex-direction: column; gap: .6rem; }
.faqitem { background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: .2rem .2rem; }
.faqitem summary { cursor: pointer; list-style: none; padding: .9rem 1.1rem; font-weight: 600; }
.faqitem summary::-webkit-details-marker { display: none; }
.faqitem summary::after { content: '+'; float: right; color: var(--steel); font-weight: 400; }
.faqitem[open] summary::after { content: '−'; }
.faqbody { padding: 0 1.1rem 1rem; color: var(--steel); font-size: .92rem; line-height: 1.6; }

.pricingrow { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 1.4rem; align-items: stretch; }
.priceplan { background: var(--panel); border: 1px solid var(--line); border-radius: 14px; padding: 1.6rem 1.4rem; position: relative; display: flex; flex-direction: column; transition: transform .22s ease, box-shadow .22s ease; }
.priceplan:hover { transform: translateY(-5px); box-shadow: var(--shadow-pop, 0 10px 28px rgba(16,24,32,.14)); }
.priceplan.popular { border-color: var(--primary); box-shadow: 0 0 0 1px var(--primary); }
.priceplan.popular:hover { box-shadow: 0 0 0 1px var(--primary), var(--shadow-pop, 0 10px 28px rgba(16,24,32,.14)); }
.priceplan-badge { position: absolute; top: -.7rem; right: 1.2rem; background: var(--primary); color: #fff; font-size: .72rem; font-weight: 700; padding: .25rem .6rem; border-radius: 999px; }
.priceplan h3 { margin: 0 0 .5rem; font-size: 1.05rem; }
.priceplan-amount { font-family: var(--font-heading, inherit); font-size: 1.8rem; font-weight: 700; color: var(--ink); margin-bottom: .9rem; }
.priceplan-period { font-family: var(--font, inherit); font-size: .85rem; font-weight: 400; color: var(--steel); margin-left: .25rem; }
.priceplan-feat { list-style: none; margin: 0 0 1.1rem; padding: 0; display: flex; flex-direction: column; gap: .45rem; color: var(--steel); font-size: .88rem; flex: 1 0 auto; }
.priceplan-feat li { padding-left: 1.2rem; position: relative; }
.priceplan-feat li::before { content: '✓'; position: absolute; left: 0; color: var(--primary); font-weight: 700; }
.priceplan-cta { text-align: center; margin-top: auto; }

@media (max-width: 720px) { .stepsrow { grid-template-columns: 1fr; } .stepitem::before { display: none; } }

/* v1.116.0 — Müşteri yorumu / alıntı kaydırmalısı ("testimonials" bölümü, bkz.
   home_render_testimonials_section()). Kartlar üst üste (position:absolute) duruyor, sadece
   .is-active olan görünür — hero slaytlarındaki YÜKSEKLİK HATASININ (bkz. .heroslide notu)
   AYNISINA düşülmesin diye burada da kart boyu İÇERİĞE göre değil, en uzun kartın yüksekliğine
   göre ayarlanıyor (min-height JS ile değil, basitçe "grid" ile aynı hücreye bindirerek). */
/* v1.118.0 — "yan yana iki tane gösterecek şekilde yaparsam sayfada doluluk olur" + "sürükleyerek
   de değiştirebileyim" geri bildirimi: eskiden tüm kartlar aynı grid hücresinde üst üste duran,
   sadece aktif olan görünen ("absolute stack") bir yapıydı — artık GERÇEK yatay kaydırmalı bir
   şerit (CSS scroll-snap). Masaüstünde 2 kart aynı anda görünüyor, mobilde 1 (aşağıdaki media
   query). Dokunmatikte native kaydırma zaten çalışıyor; masaüstü fare sürüklemesi JS'te
   (home_render_testimonials_section() script'i, pointerdown/move/up) ekleniyor — sürüklerken metin
   seçilmesin diye .is-dragging'de user-select kapatılıyor. */
.testiwrap { position: relative; max-width: 1180px; margin: 0 auto; padding: 0 2.8rem; }
.testitrack { display: flex; gap: 1.2rem; overflow-x: auto; scroll-snap-type: x mandatory; scroll-behavior: smooth; -webkit-overflow-scrolling: touch; scrollbar-width: none; padding: .3rem; cursor: grab; }
.testitrack::-webkit-scrollbar { display: none; }
.testitrack.is-dragging { cursor: grabbing; scroll-snap-type: none; user-select: none; }
.testicard { flex: 0 0 calc(50% - .6rem); scroll-snap-align: start; background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-card, 20px); padding: 2rem 1.8rem; text-align: center; }
.testistars { display: flex; justify-content: center; gap: .15rem; margin-bottom: .6rem; font-size: 1rem; line-height: 1; }
.testistar { color: var(--line); }
.testistar.is-filled { color: #f5a623; }
.testiquote { margin: 0 0 1.2rem; color: var(--ink); font-size: 1.05rem; line-height: 1.65; }
.testiquote::before { content: '“'; color: var(--primary); font-size: 1.6rem; font-weight: 700; }
.testiquote::after { content: '”'; color: var(--primary); font-size: 1.6rem; font-weight: 700; }
.testiauthor { display: flex; align-items: center; justify-content: center; gap: .6rem; }
.testiavatar { display: inline-flex; align-items: center; justify-content: center; width: 2.4rem; height: 2.4rem; border-radius: 999px; background: var(--primary); color: #fff; font-weight: 700; font-size: .85rem; flex: 0 0 auto; }
.testiavatar-img { width: 2.4rem; height: 2.4rem; border-radius: 999px; object-fit: cover; flex: 0 0 auto; }
.testiauthor-text { text-align: left; display: flex; flex-direction: column; }
.testiauthor-text strong { font-size: .92rem; }
.testiauthor-text span { color: var(--steel); font-size: .82rem; }
.testiarrow { position: absolute; top: 50%; transform: translateY(-50%); width: 2.2rem; height: 2.2rem; border-radius: 999px; border: 1px solid var(--line); background: var(--panel); color: var(--ink); font-size: 1.2rem; line-height: 1; cursor: pointer; z-index: 2; }
.testiarrow:hover { background: var(--primary); color: #fff; border-color: var(--primary); }
.testiarrow.prev { left: 0; }
.testiarrow.next { right: 0; }
.testidots { display: flex; justify-content: center; flex-wrap: wrap; gap: .4rem; margin-top: 1rem; }
.testidot { width: .5rem; height: .5rem; border-radius: 999px; border: 0; background: var(--line); cursor: pointer; padding: 0; }
.testidot.is-active { background: var(--primary); }
.is-rtl .testiarrow.prev { left: auto; right: 0; }
.is-rtl .testiarrow.next { right: auto; left: 0; }
.is-rtl .testiauthor-text { text-align: right; }
@media (max-width: 760px) {
  .testicard { flex: 0 0 100%; }
  .testiwrap { padding: 0 2.4rem; max-width: 460px; }
}

/* v1.117.0 — Çok sütunlu footer (bkz. inc/site_layout.php::site_foot()): üstte vurgu renkli bir
   CTA şeridi, ortada 3 sütun (marka+sosyal / sayfalar / hızlı bağlantılar), altta ince bir telif
   şeridi. Eski tek-satırlık footer tamamen yenilendi ("footer'ımız çok zayıf" geri bildirimi). */
.sitefoot { border-top: 1px solid var(--line); margin-top: 2rem; background: var(--panel); }
.sitefoot-cta { background: linear-gradient(135deg, var(--primary), var(--primary-dark)); color: #fff; }
.sitefoot-cta-in { max-width: 1080px; margin: 0 auto; padding: 2.2rem 1.2rem; display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1rem; }
.sitefoot-cta-in h2 { margin: 0 0 .3rem; font-size: 1.3rem; color: #fff; }
.sitefoot-cta-in p { margin: 0; color: rgba(255,255,255,.85); }
.sitefoot-cta-in .btn.primary { background: #fff; color: var(--primary-dark); border-color: #fff; }
.sitefoot-cta-in .btn.primary:hover { background: rgba(255,255,255,.9); }
.sitefoot-in { max-width: 1080px; margin: 0 auto; padding: 2.4rem 1.2rem; display: grid; grid-template-columns: 1.4fr 1fr 1fr; gap: 2rem; color: var(--steel); font-size: .88rem; }
.footer-col-title { margin: 0 0 .7rem; font-size: .85rem; font-weight: 700; color: var(--ink); text-transform: uppercase; letter-spacing: .04em; }
.sflogo { display: block; max-height: 2.4rem; max-width: 11rem; width: auto; height: auto; object-fit: contain; margin-bottom: .6rem; }
.sfbrand { font-weight: 700; color: var(--ink); margin-bottom: .5rem; }
.sftagline { margin: 0 0 .9rem; max-width: 320px; line-height: 1.5; }
.sfsocial { display: flex; gap: .6rem; }
.sfsocial a { display: inline-flex; align-items: center; justify-content: center; width: 2.1rem; height: 2.1rem; border-radius: 999px; border: 1px solid var(--line); color: var(--steel); transition: background .2s ease, color .2s ease, border-color .2s ease; }
.sfsocial a svg { width: 1.05rem; height: 1.05rem; }
.sfsocial a:hover { background: var(--primary); color: #fff; border-color: var(--primary); }
.sflinks { display: flex; flex-direction: column; gap: .55rem; }
.sflinks a { color: var(--steel); text-decoration: none; }
.sflinks a:hover { color: var(--primary); }
.sitefoot-bottom { border-top: 1px solid var(--line); display: flex; flex-wrap: wrap; gap: .5rem 1.4rem; align-items: center; max-width: 1080px; margin: 0 auto; padding: 1rem 1.2rem; color: var(--steel); font-size: .82rem; }
.sfcopy { margin: 0; flex: 1 1 auto; }
.sfcopy a { color: inherit; text-decoration: underline; }
.sfcopy a:hover { color: var(--ink); }
.sfver { margin-left: auto; }
@media (max-width: 800px) {
  .sitefoot-in { grid-template-columns: 1fr; gap: 1.6rem; }
  .sitefoot-cta-in { flex-direction: column; align-items: flex-start; text-align: left; }
}
@media (max-width: 720px) { .features { grid-template-columns: 1fr; } .sitebar-in { flex-wrap: wrap; } .snav { order: 3; flex-basis: 100%; } }
/* v1.109.0 — Mobilde "Giriş" panelinin ekran dışına taşması (kullanıcı ekran görüntüsüyle bildirdi):
   .profilemenu-panel'in "right:0"ı en yakın konumlanmış atası olan .sitelogin-menu'ye (.profilemenu
   details'ının kendisi, position:relative) göre hesaplanıyor — ama dar ekranda .sitebar-in
   flex-wrap ile satır değiştirdiğinde o kutunun kendisi gerçek sağ kenarda bitmiyor (uygulamanın
   kendi üst çubuğundaki AYNI sınıfın v1.55.1'de düzeltilen hatasıyla aynı kök sebep — bkz.
   inc/layout.php'deki yorum, ".app-topbar-actions" grubu). Tanıtım sitesinin kendi, daha basit
   .sitebar-in düzeni için en sağlam çözüm: panel dar ekranda konum bağlamını atasından (absolute)
   VİEWPORT'a (fixed) çevirir — ekran genişliğine göre hep sol/sağdan sabit payla kenetlenir, hangi
   satıra düştüğünden bağımsız asla ekran dışına taşamaz. Dikey konum (top) assets/app.js'de düğmenin
   GERÇEK konumuna göre JS ile ayarlanıyor (bkz. "sitelogin-menu" toggle dinleyicisi) çünkü position:
   fixed'de "top: calc(100% + ...)" artık atasına göre değil VIEWPORT'a göre anlamsız olurdu. */
@media (max-width: 720px) {
  .sitelogin-menu .profilemenu-panel {
    position: fixed;
    left: .6rem;
    right: .6rem;
    width: auto;
    min-width: 0;
    max-width: none;
  }
}

/* ---------- v1.8: ekip (Ekibimiz) ---------- */
.teamgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 1.2rem; margin-top: 1.4rem; }
.teamcard { background: var(--panel); border: 1px solid var(--line); border-radius: 12px; padding: 1.2rem; text-align: center; }
.teamcard img { width: 96px; height: 96px; border-radius: 50%; object-fit: cover; margin-bottom: .7rem; }
.teamph-empty { width: 96px; height: 96px; border-radius: 50%; background: var(--primary); color: #fff; display: flex; align-items: center; justify-content: center; font-size: 2rem; margin: 0 auto .7rem; }
.teamcard h3 { margin: 0 0 .2rem; font-size: 1.02rem; }
.teamtitle { color: var(--steel); font-size: .85rem; margin: 0 0 .5rem; }
.teambio { font-size: .88rem; color: var(--ink); line-height: 1.5; margin: 0 0 .5rem; }
.teamlink { font-size: .85rem; }
.teamphoto { max-width: 140px; border-radius: 8px; margin-top: .4rem; }
.teamthumb { width: 34px; height: 34px; border-radius: 50%; object-fit: cover; }

/* ---------- v1.8.2: yerel video ---------- */
.richtext video, .editorarea video { max-width: 100%; border-radius: 8px; display: block; margin: 1rem 0; background: #000; }
.v-video-local { margin: 1rem 0; }
.v-uploading { padding: .8rem 1rem; background: var(--surface-soft); border: 1px dashed var(--line); border-radius: 8px; color: var(--steel); font-size: .9rem; margin: .6rem 0; }

/* ---------- v1.8.3: editör medya kaldırma düğmesi, boş satır temizleme ---------- */
.editorarea p, .editorarea .v-mediaWrap { position: relative; }
.editorarea .v-mediaWrap { margin: 1rem 0; }
.v-mediaRemove {
  position: absolute; top: 4px; right: 4px; z-index: 2;
  background: #a12622; color: #fff; border: 0; border-radius: 6px;
  font-size: .78rem; padding: .25rem .55rem; cursor: pointer; opacity: 0;
  transition: opacity .12s;
}
.editorarea p:hover .v-mediaRemove, .editorarea p:focus-within .v-mediaRemove,
.editorarea .v-mediaWrap:hover .v-mediaRemove, .editorarea .v-mediaWrap:focus-within .v-mediaRemove { opacity: 1; }

/* ---------- v1.9: yardım ipuçları ---------- */
.tiphint {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.15rem; height: 1.15rem; border-radius: 50%; border: 1px solid var(--line);
  background: var(--surface-soft); color: var(--steel); font-size: .74rem; line-height: 1; cursor: help;
  padding: 0; vertical-align: middle; margin-left: .25rem;
}
.tiphint:hover, .tiphint:focus { background: var(--primary); color: #fff; border-color: var(--primary); }
.tipbubble {
  position: absolute; z-index: 60; max-width: 280px; background: #16222c; color: #fff;
  font-size: .82rem; line-height: 1.4; padding: .55rem .7rem; border-radius: 8px;
  box-shadow: 0 6px 20px rgba(0,0,0,.25); opacity: 0; pointer-events: none; transition: opacity .12s;
}
.tipbubble.show { opacity: 1; pointer-events: auto; }

.tiprow { display: flex; gap: .5rem; align-items: flex-start; }
.tiprow textarea { flex: 1 1 auto; min-width: 180px; font-size: .85rem; }
#tipsearch { display: block; width: 100%; max-width: 420px; margin: .8rem 0; padding: .5rem .7rem; border: 1px solid var(--line); border-radius: 8px; }
.helptopic { scroll-margin-top: 5rem; }
.helpcathead { scroll-margin-top: 5rem; margin: 2.2rem 0 .9rem; padding-top: 1.1rem; border-top: 2px solid var(--line); color: var(--primary); }
.helpcathead:first-of-type { border-top: none; padding-top: 0; margin-top: .5rem; }
.helplist-cat { font-weight: 700; margin: 1.1rem 0 .25rem; color: var(--steel); text-transform: uppercase; font-size: .76rem; letter-spacing: .04em; }
.helplist-cat:first-child { margin-top: 0; }
.helpnote {
  background: var(--stat-warn); border: 1px solid color-mix(in srgb, var(--stat-warn), #000 12%);
  border-radius: 8px; padding: .7rem 1rem; margin: .8rem 0; font-size: .92rem;
}
.helptopic ol, .helptopic ul { margin: .5rem 0; padding-left: 1.4rem; }
.helptopic li { margin: .25rem 0; }
#helpsearch { display: block; width: 100%; max-width: 480px; margin: .4rem 0 1.2rem; padding: .55rem .8rem; border: 1px solid var(--line); border-radius: 8px; font-size: 1rem; }
.helplist { display: grid; gap: .5rem; margin-bottom: 2rem; }
.helplist a { padding: .5rem .2rem; border-bottom: 1px solid var(--line); text-decoration: none; color: var(--ink); }
.helplist a small { display: block; color: var(--steel); font-weight: 400; }

/* ---------- v1.10: personel profili, özel alanlar, süre uyarıları ---------- */
.staffphoto { width: 96px; height: 96px; border-radius: 12px; object-fit: cover; display: block; }
.staffthumb { width: 26px; height: 26px; border-radius: 50%; object-fit: cover; vertical-align: middle; margin-right: 4px; }
.explevel { display: inline-block; padding: .15rem .55rem; border-radius: 999px; font-size: .82rem; font-weight: 600; }
.explevel.exp-soon { background: #fff4d6; color: #7a5a00; }
.explevel.exp-warn { background: #ffe3c2; color: #8a4b00; }
.explevel.exp-due { background: #fde3e1; color: #a12622; }
.explevel.exp-past { background: #a12622; color: #fff; }

/* v1.169.0 — "Süresi yaklaşanlar/dolanlar" artık sade bir tablo değil, widget gibi küçük kart ızgarası
   (Selim'in isteği: "ona belki bir chip kart görünümü verebiliriz ... hani widget gibi"). Her kartın sol
   kenarı aciliyet seviyesine göre renkleniyor, aynı exp-soon/exp-warn/exp-due/exp-past paletini kullanıyor
   ki tek bir renk kaynağı olsun. */
.expiry-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: .65rem; }
.expiry-card {
  border: 1px solid var(--line);
  border-left: 4px solid var(--steel);
  border-radius: 10px;
  padding: .6rem .8rem;
  background: var(--panel);
}
.expiry-card.exp-soon { border-left-color: #c99200; }
.expiry-card.exp-warn { border-left-color: #b86300; }
.expiry-card.exp-due { border-left-color: #c23a35; }
.expiry-card.exp-past { border-left-color: #a12622; background: color-mix(in srgb, #a12622 6%, var(--panel)); }
.expiry-card-top { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-bottom: .3rem; }
.expiry-card-name { font-weight: 700; font-size: .86rem; }
.expiry-card-meta { display: flex; justify-content: space-between; gap: .5rem; color: var(--steel); font-size: .78rem; }

/* v1.169.0 — Personel listesinin üstündeki Şube/Ünvan/Durum filtre çubuğu (mockup'taki "chip" filtre
   satırına karşılık geliyor; burada basit <select>'ler olarak, seçince otomatik gönderiliyor). */
.filterbar { display: flex; flex-wrap: wrap; align-items: end; gap: .7rem; margin: 0 0 .9rem; }
.filterbar label { display: flex; flex-direction: column; gap: .2rem; font-size: .8rem; color: var(--steel); }
.filterbar select { min-width: 150px; }
.filterbar-label { display: flex; align-items: center; font-size: .72rem; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--steel); align-self: center; margin-right: .2rem; }
.teambio.small { font-size: .78rem; color: var(--steel); }

.teamcardlink { display: block; text-decoration: none; color: inherit; cursor: pointer; }
/* v1.188.0 — Paket 28 devamı: kart artık sadece bir <a> değil (yanına "Özlük formu" yazdırma linki
   eklendi), bu yüzden hover kenarlığı/kalkma efekti dıştaki .teamcard'a taşındı. :has() olmayan çok
   eski tarayıcılarda sadece bu hover efekti kaybolur, kart yine normal çalışır. */
.teamcard { transition: border-color .12s, transform .12s; }
.teamcard:has(.teamcardlink:hover) { border-color: var(--primary); transform: translateY(-1px); }
.teamcard-print { display: inline-block; margin-top: .6rem; }

/* ---------- v1.13: raporlar (v1.47.0'da düz-altçizgili sekmeden gerçek "buton" görünümüne çevrildi) ---------- */
.tabs { display: flex; flex-wrap: wrap; gap: .4rem; margin: .8rem 0 1.2rem; }
.tabbtn { padding: .5rem 1rem; text-decoration: none; color: var(--steel); background: var(--panel); border: 1px solid var(--line); border-radius: 999px; font-size: .92rem; font-weight: 600; transition: background .15s ease, color .15s ease, border-color .15s ease; }
.tabbtn.active { color: #fff; background: var(--primary); border-color: var(--primary); }
.tabbtn:hover { color: var(--ink); border-color: var(--primary); }
.tabbtn.active:hover { color: #fff; }

/* ---------- Ayarlar sekmeleri artık tek sayfada akordiyon (v1.66.0, settings.php) ----------
   Eskiden 8 ayrı sayfa/tab'dı (her biri ?tab=X ile tam sayfa yenileme), kullanıcı "çok uzuyor,
   akordiyona çevrilsin" dedi — şimdi hepsi aynı sayfada, istediği kadarını aynı anda açık tutabiliyor.
   Dış kutu (.accordion-section) KASITLI hafif tutuldu (kendi arkaplanı/gölgesi yok, sadece alt çizgi
   ile ayrılan bir başlık satırı) — içindeki .panel kartları ZATEN kendi kutusunu çiziyor, dış kutuya da
   aynı stil verilse "kutu içinde kutu" görünümü (çift çerçeve) oluşurdu. */
.accordion-section { border-bottom: 1px solid var(--line); margin: 0; padding: 0; }
.accordion-section:last-of-type { border-bottom: none; }
.accordion-section > summary {
  list-style: none; cursor: pointer; user-select: none; padding: 1rem .2rem;
  font-size: 1.08rem; font-weight: 700; display: flex; align-items: center; justify-content: space-between;
  gap: .6rem; color: var(--ink);
}
.accordion-section > summary::-webkit-details-marker { display: none; }
.accordion-section > summary::after {
  content: '▾'; font-size: .8em; color: var(--steel); transition: transform .15s ease; flex: 0 0 auto;
}
.accordion-section[open] > summary::after { transform: rotate(180deg); }
.accordion-section > summary:hover { color: var(--primary); }
.accordion-body { padding: 0 .2rem 1.1rem; }
.accordion-body > .panel:first-child { margin-top: 0; }
.accordion-body > .panel:last-child { margin-bottom: 0; }
.condrow { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; margin-bottom: .5rem; }
.condrow select, .condrow input[type="text"], .condrow input[type="number"] { padding: .4rem .5rem; border: 1px solid var(--line); border-radius: 6px; }
.condDays { width: 5rem; }

/* ---------- Paket 9: ünvan kategorileri, part-time, kapsam kuralları ---------- */
.pttag { display: inline-block; padding: .1rem .5rem; border-radius: 999px; font-size: .74rem; font-weight: 600; background: #e6ecff; color: #2c4b9e; vertical-align: middle; }
.exptag { display: inline-block; padding: .1rem .5rem; border-radius: 999px; font-size: .74rem; font-weight: 600; vertical-align: middle; margin-left: .3rem; }
.exptag.exp-c0 { background: #fff4d6; color: #7a5a00; }
.exptag.exp-c1 { background: #e6f0ff; color: #2c539e; }
.exptag.exp-c2 { background: #e1f5ea; color: #157a44; }
.exptag.exp-c3 { background: #f5e6ff; color: #6a2c9e; }
.exptag.exp-c4 { background: #ffe6ec; color: #9e2c5a; }
td.quotagap, .quotagap { background: #fde3e1; color: #a12622; font-weight: 700; }

/* ---------- Paket 10: süre uyarısı pop-up (ÖGG kart vb. tarih alanları) ---------- */
.cardwarn-overlay {
  position: fixed; inset: 0; background: rgba(10, 16, 20, .55); display: flex;
  align-items: center; justify-content: center; z-index: 900; padding: 1rem;
}
.cardwarn-box {
  background: var(--panel); color: var(--ink); border-radius: 12px; padding: 1.4rem 1.5rem;
  max-width: 640px; width: 100%; max-height: 85vh; overflow-y: auto; box-shadow: 0 10px 40px rgba(0, 0, 0, .3);
}
.cardwarn-box h2 { margin-top: 0; font-size: 1.15rem; }
.cardwarn-actions { display: flex; flex-wrap: wrap; gap: .6rem; align-items: center; margin-top: 1.1rem; }
.cardwarn-snoozeform { display: flex; flex-wrap: wrap; gap: .6rem; margin: 0; }

/* ---------- v1.20: Özgeçmiş şablon galerisi (seçim ekranı) ---------- */
.cvgallery-filters { display: flex; flex-wrap: wrap; gap: .5rem; margin: .6rem 0 .9rem; }
.cvgallery-filters .btn.on { background: var(--primary); color: #fff; border-color: var(--primary); }
.cvgallery-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: .9rem; }
.cvgallery-card {
  position: relative; display: flex; flex-direction: column; align-items: center; gap: .4rem;
  border: 2px solid #dfe7ec; border-radius: 12px; padding: .7rem .6rem .9rem; cursor: pointer;
  background: #fff; text-align: center; transition: border-color .15s, box-shadow .15s;
}
.cvgallery-card:hover { border-color: #b7c4cd; }
.cvgallery-card input[type="radio"] { position: absolute; top: .5rem; left: .5rem; margin: 0; }
.cvgallery-card:has(input:checked) { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(31, 111, 92, .15); }
.cvgallery-name { font-size: .85rem; font-weight: 600; }
.cvgallery-preview { font-size: .74rem; padding: .25rem .7rem; }
.cvgallery-edit { font-size: .72rem; color: var(--steel); text-decoration: underline; }

/* ---------- v1.21: kendi CV şablonun (form ile, kod yazmadan) ---------- */
.cvgallery-add {
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: .4rem;
  border: 2px dashed #c3ced6; border-radius: 12px; padding: .7rem .6rem .9rem; text-decoration: none;
  color: var(--steel); min-height: 100%; aspect-ratio: 3/4;
}
.cvgallery-add:hover { border-color: var(--primary); color: var(--primary); }
.cvgallery-add-icon { font-size: 1.8rem; line-height: 1; }
.cvswatch-dot { display: inline-block; width: 12px; height: 12px; border-radius: 50%; vertical-align: middle; margin-right: .3rem; }

.cvswatch-shot { display: block; width: 100%; height: auto; aspect-ratio: 3/4; object-fit: cover; object-position: top; border: 1px solid #e3e9ed; border-radius: 6px; background: #fff; cursor: zoom-in; }

/* ---------- v1.21.1: şablon galerisi küçük resmine tıklayınca büyüterek gösteren lightbox ---------- */
.cvlightbox {
  position: fixed; inset: 0; background: rgba(15, 23, 30, .82); z-index: 999;
  display: flex; align-items: center; justify-content: center; padding: 4vh 4vw; cursor: zoom-out;
}
.cvlightbox[hidden] { display: none; }
.cvlightbox img { max-width: min(90vw, 640px); max-height: 92vh; border-radius: 8px; box-shadow: 0 20px 60px rgba(0,0,0,.5); cursor: default; }
.cvswatch { display: flex; flex-direction: column; gap: 4px; width: 100%; aspect-ratio: 3/4; border: 1px solid #e3e9ed; border-radius: 6px; padding: 8px; box-sizing: border-box; }
.cvswatch-bar { height: 10px; border-radius: 3px; width: 40%; }
.cvswatch-line { height: 5px; border-radius: 2px; }
.cvswatch-grid { flex-direction: row; padding: 0; overflow: hidden; }
.cvswatch-side { display: block; width: 34%; }
.cvswatch-main { display: flex; flex-direction: column; gap: 5px; flex: 1; padding: 8px; box-sizing: border-box; }
.cvswatch-main span { display: block; height: 5px; border-radius: 2px; }
.cvswatch-main span:first-child { height: 9px; width: 70%; }

/* ---------- v1.23: tema seçim kartları (Ayarlar > Görünüm) ---------- */
.themegrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: .8rem; }
.themecard {
  position: relative; display: flex; flex-direction: column; gap: .45rem;
  border: 2px solid var(--line); border-radius: 10px; padding: .55rem; cursor: pointer;
  background: var(--panel); transition: border-color .15s, box-shadow .15s;
}
.themecard:hover { border-color: #b7c4cd; }
.themecard input[type="radio"] { position: absolute; top: .5rem; left: .5rem; margin: 0; z-index: 1; }
.themecard:has(input:checked) { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(15, 93, 115, .18); }
.themecard-preview {
  display: flex; flex-direction: column; height: 76px; border-radius: 6px; overflow: hidden;
  border: 1px solid rgba(0,0,0,.08);
}
.themecard-topbar { height: 16px; }
.themecard-body { flex: 1; display: flex; flex-direction: column; gap: 5px; padding: 8px; }
.themecard-line { height: 6px; border-radius: 2px; width: 70%; opacity: .85; }
.themecard-line.short { width: 45%; opacity: .5; }
.themecard-btn { margin-top: auto; height: 12px; width: 40%; border-radius: 3px; }
.themecard-name { font-size: .82rem; font-weight: 600; text-align: center; color: var(--ink); }

/* ---------- v1.23: profil menüsündeki "Ayarlar" alt-flyout'u (hızlı bağlantılar + tema) ---------- */
.settingsflyout { position: relative; margin: 0; }
/* "Ayarlar" summary'si, kutu modeli olarak .profilemenu-panel'deki kardeşleriyle (Şifremi değiştir,
   Çıkış — bunlar <a>/<button>) BİREBİR aynı olmalı, yoksa <summary>'nin farklı varsayılan kutu
   modeli yüzünden hizası kayar (yaşanmış bir bug) — bu yüzden aynı display/padding/font-size. */
.settingsflyout > summary {
  list-style: none; display: block; width: 100%; padding: .55rem .7rem; border-radius: 6px;
  font-size: .92rem; cursor: pointer;
}
.settingsflyout > summary:hover { background: var(--paper); }
.settingsflyout > summary::-webkit-details-marker { display: none; }
.settingsflyout-panel {
  position: absolute; right: 100%; top: -.35rem; margin-right: .35rem; z-index: 60;
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); min-width: 230px; padding: .35rem; display: flex; flex-direction: column;
}
.settingsflyout-panel a {
  display: block; padding: .5rem .7rem; border-radius: 6px; text-decoration: none;
  color: var(--ink); font-size: .88rem;
}
.settingsflyout-panel a:hover { background: var(--paper); }
.settingsflyout-hint { font-size: .72rem; color: var(--steel); padding: .5rem .7rem 0; }
.settingsflyout-hr { border: 0; border-top: 1px solid var(--line); margin: .35rem 0; }
.themedots { display: flex; flex-wrap: wrap; gap: .35rem; padding: .3rem .7rem .5rem; }
.themedots form { margin: 0; }
.themedot {
  width: 20px; height: 20px; border-radius: 50%; border: 2px solid #fff; padding: 0; cursor: pointer;
  box-shadow: 0 0 0 1px var(--line);
}
.themedot.on { box-shadow: 0 0 0 2px var(--ink); }

/* Pano (dashboard) */
.dash-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
.dash-head h1 { margin-bottom: 0; }
/* v1.102.0-v1.104.0 — Pano kartları boyutlandırma (bkz. inc/dashboard.php::dash_widget_sizes): kart
   köşesindeki tutamaçla sürükleyince genişlik VE yükseklik SATIR İÇİ style="" olarak basılıyor
   (bkz. dashboard.php) — ikisi de sürüklediğin kadar serbest bir piksel değeri, hiç kademe yok.
   v1.103.0 — Selim bildirdi: bir kartı büyütünce AYNI SATIRDAKİ diğer tüm kartlar da büyüyormuş gibi
   görünüyordu — CSS Grid'in varsayılan `align-items:stretch`i satırdaki tüm öğeleri eşit yüksekliğe
   zorluyordu (düzeltme: align-items:start/flex-start).
   v1.104.0 — Selim bildirdi: dikeyde (h) sürükleme serbestti ama yatayda (w) hâlâ "1x, 2x gibi
   kademeli" kalmıştı. Kök sebep: genişlik o zaman CSS GRID sütun aralığına (grid-column:span N)
   bağlıydı — sütun genişliği sabit olduğundan ancak TAM sütun katlarında değişebiliyordu, piksel
   piksel değil. Çözüm: .dash-grid artık CSS GRID DEĞİL, FLEXBOX — kart genişliği de (flex-basis +
   width) yükseklik gibi tamamen serbest bir piksel değeri, hiçbir sütuna bağlı değil. Varsayılan
   (boyutlandırılmamış) kartlar `flex:1 1 320px` ile öncekiyle aynı "otomatik sığdır" görünümünü
   korur; sadece sürüklenen bir kart `flex:0 0 Npx` ile SABİT genişliğe geçer. */
.dash-grid { display: flex; flex-wrap: wrap; gap: 1rem; align-items: flex-start; margin-top: 1rem; }
.dash-card { position: relative; flex: 1 1 320px; max-width: 100%; }
/* Not: .dash-card'ın min-width:0'ı aşağıda (v1.58.2'den kalma, "canvas gibi geniş içerik sütunu
   küçülmekten alıkoymasın" düzeltmesi) ayrı bir kuralda duruyor — burada tekrar ETMİYORUZ, flexbox'ta
   da aynı mantıkla geçerli kalsın diye kasıtlı olarak dokunmadık. */
.dash-resize-handle {
  position: absolute; right: 6px; bottom: 6px; width: 16px; height: 16px;
  cursor: nwse-resize; opacity: .35; touch-action: none;
  border-right: 2px solid var(--steel); border-bottom: 2px solid var(--steel); border-bottom-right-radius: 4px;
}
.dash-resize-handle:hover, .dash-resize-handle.active { opacity: .85; }
.dash-card.resizing { box-shadow: 0 10px 28px rgba(16,24,32,.14); }
@media (max-width: 640px) {
  .dash-resize-handle { display: none; }
}
/* v1.58.2: Selim bildirdi — pano'da daha fazla yatay boşluk olmasına rağmen widget'lar hep 2 sütunda
   üst üste diziliyordu. Kök sebep klasik bir CSS Grid tuzağı: grid öğelerinin varsayılan `min-width`
   değeri `auto`dur, yani içeriğin DOĞAL minimum genişliğinden (ör. varsayılan genişliği 300px olan bir
   <canvas>, ya da içindeki uzun/bölünemez bir metin) KÜÇÜLEMEZ — `repeat(auto-fit, minmax(280px, 1fr))`
   tüm sütunlar İÇİN AYNI boyutlandırmayı paylaştığından, TEK BİR geniş-içerikli widget (ör. haftalık
   grafik kartı) tüm sütunları o genişliğe zorlayıp, müsait alan yeterliyken bile daha az sütun sığmasına
   yol açabiliyordu. `min-width: 0` ile grid öğesinin kendi içeriğinin (ve içindeki <canvas>'ın, zaten
   var olan `max-width:100%` kuralı sayesinde) gerçekten küçülebilmesi sağlanıyor. */
.dash-card { min-width: 0; background: var(--dashcard-bg, var(--panel)); color: var(--dashcard-fg, inherit); }
.dash-card h2 { margin: 0 0 .6rem; font-size: 1.05rem; color: inherit; }
.dash-stats { display: flex; gap: 1.4rem; flex-wrap: wrap; }
.dash-stat { display: flex; flex-direction: column; }
.dash-stat strong { font-size: 1.8rem; line-height: 1.1; font-family: var(--font-heading); font-weight: 700; }
.dash-stat span { color: var(--steel); font-size: .82rem; }
/* v1.92.0: özel kart rengi seçiliyse (bkz. .dash-card) etiket de --dashcard-fg'yi kullansın — --steel
   sabit tema tonu, dashcard-fg ise seçilen arkaplana göre hesaplanmış kontrast rengi (dash_card_fg_for_bg). */
.dash-card[style*="--dashcard-fg"] .dash-stat span { color: var(--dashcard-fg); opacity: .72; }
.dash-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .4rem; }
.dash-list li { display: flex; align-items: center; gap: .5rem; }
.dash-dot { width: 10px; height: 10px; border-radius: 50%; flex: 0 0 auto; display: inline-block; }
.dash-links { display: flex; flex-wrap: wrap; gap: .5rem; }

/* v1.174.0 — Pano görsel yenilemesi ("Pano (Dashboard)" ile devam, Selim'in onayladığı mockup):
   "Genel durum" ve "Hızlı erişim" widget'larına renkli ikon rozetleri eklendi (bkz. inc/layout.php::
   dash_chip_icon()). .dash-stats/.dash-stat/.dash-links eski haliyle DURUYOR — Widget Oluşturucu'nun
   kendi (serbest metinli) özel widget'ları hâlâ onları kullanıyor (bkz. inc/widget_builder.php),
   onlara sabit bir ikon anahtarı atamak riskli olurdu. Bunlar sadece built-in "stats"/"quick_links"
   widget'larının içeriği için ayrı, yeni sınıflar. */
.dash-chip-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.1rem; height: 2.1rem; border-radius: 10px; flex: 0 0 auto;
  background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--primary);
}
.dash-chip-icon svg { width: 1.15rem; height: 1.15rem; }
.dash-statgrid { display: flex; gap: 1rem; flex-wrap: wrap; }
.dash-statchip { display: flex; align-items: center; gap: .65rem; }
.dash-statchip-text { display: flex; flex-direction: column; }
.dash-statchip-text strong { font-size: 1.6rem; line-height: 1.1; font-family: var(--font-heading); font-weight: 700; }
.dash-statchip-label { color: var(--steel); font-size: .8rem; }
.dash-card[style*="--dashcard-fg"] .dash-statchip-label { color: var(--dashcard-fg); opacity: .72; }
.dash-linkgrid { display: flex; flex-wrap: wrap; gap: .55rem; }
.dash-linkcard {
  display: flex; align-items: center; gap: .6rem; padding: .5rem .8rem;
  border: 1px solid var(--line); border-radius: var(--radius-input, 10px);
  background: var(--panel); color: inherit; text-decoration: none; flex: 1 1 150px;
  transition: border-color .15s, box-shadow .15s, transform .15s;
}
.dash-linkcard:hover { border-color: var(--primary); box-shadow: var(--shadow-card, 0 1px 3px rgba(16,24,32,.05)); transform: translateY(-1px); }
.dash-linkcard-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.dash-linkcard-text strong { font-size: .86rem; font-weight: 600; }
.dash-linkcard-sub { color: var(--steel); font-size: .74rem; }
.dash-card[style*="--dashcard-fg"] .dash-linkcard { background: color-mix(in srgb, var(--dashcard-fg) 8%, transparent); border-color: color-mix(in srgb, var(--dashcard-fg) 20%, transparent); }
.dash-card[style*="--dashcard-fg"] .dash-linkcard-sub { color: var(--dashcard-fg); opacity: .72; }

/* v1.175.0 — Pano görsel yenilemesi (devam): "Yaklaşan izinler"/"Süresi yaklaşan bilgiler"/
   "Son eklenen özgeçmişler" widget'larındaki isim satırları artık Personel listesindeki (v1.168.0)
   aynı baş-harfli renkli avatar rozetiyle (avatar_badge_html(), inc/layout.php) başlıyor — düz
   madde imi yerine mockup'taki "Son Hareketler" listesine benzer bir görünüm. */
.dash-list-avatar li { align-items: flex-start; gap: .55rem; }
.dash-list-avatar .row-avatar-fallback { margin-right: 0; flex: 0 0 auto; margin-top: 1px; }

/* v1.55.0 — Şube dağılımı widget'ı (inc/dashboard.php::dash_render_branches): her il için basit bir
   yatay çubuk. Coğrafi haritanın ilk (liste tabanlı) adımı — bkz. dash_render_branches'teki yorum. */
/* v1.100.0 — Şubeler haritası: büyük ekranda harita solda (geniş) çubuklar sağda (dar), dar ekranda
   (ya da harita hiç basılmadıysa) alt alta. jvectormap kendi yüksekliğini otomatik almıyor, bir
   yükseklik vermek gerekiyor.
   v1.105.0 — Selim bildirdi: kart boyutlandırma (dash-resize tutamacı) diğer kartlarda iyi çalışıyor
   ama harita kartında "zayıf" kalıyordu — kartı büyütünce container (div) gerçekten büyüyordu (CSS
   tarafı DOĞRUYDU, Playwright ile ölçüldü) ama jvectormap'in kendi resize() fonksiyonu HER ZAMAN
   Türkiye şeklinin en-boy oranını koruyarak "sığdırma" (contain) yapıyor — fazladan yükseklik sadece
   boş alan/boşluk olarak kalıyordu, harita görsel olarak büyümüyordu. Çözüm: .branch-map'e haritanın
   KENDİ gerçek en-boy oranını (jquery-jvectormap-tr-il.js üretilirken kullanılan 980 / 413.6)
   `aspect-ratio` ile veriyoruz — bu modern tarayıcılarda flex "stretch" ile çakıştığında aspect-ratio
   öncelikli sayılıyor (Chromium'da doğrulandı), yani container'ın oranı HER ZAMAN haritanınkiyle
   birebir aynı kalıyor ve jvectormap'in "sığdırması" otomatik olarak tam dolduran bir sığdırmaya
   dönüşüyor — ekstra JS hesabı veya haritanın kendi iç ölçeklemesini taklit etmeye hiç gerek kalmadan.
   Genişlik sürüklemesi assets/dashresize.js'te artık bu kart için TEK girdi (yükseklik oradan türüyor,
   bkz. MAP_ASPECT). min-height sadece küçük ekranlarda/varsayılanda alt sınır. */
.dash-card:has(.branch-map-row) { display: flex; flex-direction: column; }
.branch-map-row { display: flex; gap: 1.2rem; flex-wrap: wrap; align-items: stretch; flex: 1 1 auto; }
.branch-map-row:has(.branch-map) .branch-bars { flex: 1 1 200px; max-width: 260px; min-width: 180px; }
/* v1.107.0 — harita artık ".branch-map-wrap" içinde: kart yeniden boyutlandırma/aspect-ratio mantığı
   (yukarıdaki uzun yorum) DEĞİŞMEDEN wrap'e taşındı, .branch-map kendisi wrap'i tam dolduruyor — böylece
   bir il tıklanınca açılan bilgi kartını (.branch-map-info) haritanın SAĞ ÜST köşesine, konum:absolute
   ile, haritanın kendi boyutundan bağımsız olarak bindirebiliyoruz. */
.branch-map-wrap { position: relative; flex: 4 1 520px; min-width: 320px; aspect-ratio: 980 / 413.6; min-height: 280px; }
.branch-map { width: 100%; height: 100%; }
/* v1.108.0 — İlçe kırılım haritası (.branch-ilce-map): il haritasının (.branch-map) TAM ÜSTÜNDE,
   aynı ".branch-map-wrap" içinde kardeş bir <div> — ikisi aynı anda var ama JS her seferinde
   sadece birini gösteriyor (display:none/block ile), bkz. dashboard.php'deki drillInto()/backToIl().
   İkisi de "width:100%;height:100%" olduğu için wrap'in aspect-ratio'suna (yukarıdaki uzun yorum)
   zaten uyuyor, ayrı bir oran tanımlamaya gerek yok — her ilin KENDİ en-boy oranı farklı olsa da
   (bkz. inc/il_ilce.php::ilce_projection_constants), jvectormap kendi içinde "sığdırma" (contain)
   yaptığı için wrap'in oranıyla eşleşmesi şart değil, sadece konteyneri doldurması yeterli. */
.branch-ilce-map { position: absolute; top: 0; left: 0; }
/* v1.177.0/v1.177.1'de denenen bölge ayraç katmanı (.branch-map-bolge) v1.177.2'de GERİ ALINDI —
   bkz. inc/dashboard.php'deki dash_render_branches() yorumu. */
/* "Türkiye'ye dön" düğmesi: SOL ALT köşede duruyor. v1.108.0'da sol ÜSTTEYDİ ama kütüphanenin
   kendi +/- yakınlaştırma kontrolleriyle (.jvectormap-zoomin/out, bkz. jquery-jvectormap-1.2.2.css
   — onlar da sol üstte, left:10px/top:10px-45px) aynı köşeye denk geliyordu: bu buton onlardan daha
   büyük olduğu için üzerlerine biniyor, hem görünüşte gizliyor hem de tıklamayı yakalayıp +/- kontrollerine
   ulaşılamaz hale getiriyordu (Selim'in bildirdiği hata). Sol alt köşe hem yakınlaştırma kontrolleriyle
   hem de sağ üstteki bilgi kartıyla çakışmıyor. */
.branch-map-back {
  position: absolute; bottom: .6rem; left: .6rem; z-index: 6; border: 1px solid var(--line);
  background: var(--panel); color: var(--ink); border-radius: 8px; padding: .3rem .65rem;
  font-size: .8rem; cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,.12);
}
.branch-map-back:hover { background: var(--line); }
.branch-map-info {
  position: absolute; top: .6rem; right: .6rem; z-index: 5; max-width: min(260px, 70%);
  max-height: calc(100% - 1.2rem); overflow-y: auto; background: var(--panel); border: 1px solid var(--line);
  border-radius: 10px; box-shadow: 0 6px 18px rgba(0,0,0,.14); font-size: .82rem;
}
.branch-map-info-head {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem;
  padding: .55rem .7rem; border-bottom: 1px solid var(--line); position: sticky; top: 0; background: var(--panel);
}
.branch-map-info-head strong { font-size: .88rem; }
.branch-map-info-close {
  border: 0; background: transparent; color: var(--steel); font-size: 1.1rem; line-height: 1; cursor: pointer;
  padding: .1rem .3rem; border-radius: 6px;
}
.branch-map-info-close:hover { background: var(--line); color: var(--ink); }
.branch-map-info-body { padding: .4rem .7rem .6rem; display: flex; flex-direction: column; gap: .5rem; }
.branch-map-info-row { display: flex; flex-direction: column; gap: .1rem; }
.branch-map-info-row strong { font-size: .83rem; color: var(--ink); }
.branch-map-info-row span { font-size: .76rem; color: var(--steel); }
/* v1.178.0 — İl künyesi (plaka/bölge/telefon alan kodu/ilçe+şube sayısı) ve ilçe dağılımı listesi,
   bkz. inc/dashboard.php'deki $ilInfo ve dashboard.php'deki showIlInfo()/showIlceDetail() yorumları. */
/* v1.179.0 — Selim bildirdi: plaka/bölge/alan kodu satırı kartın içinde zayıf/göze çarpmıyor
   kalıyordu — ağırlığı artırıldı (bold + daha koyu renk), ilçe/şube sayısı satırı normal kalıyor. */
.branch-map-info-meta {
  padding: .5rem .7rem 0; display: flex; flex-direction: column; gap: .2rem;
  font-size: .8rem; color: var(--steel);
}
.branch-map-info-meta div:first-child { font-weight: 700; color: var(--ink); }
.branch-map-info-sublabel {
  padding: .5rem .7rem 0; font-size: .74rem; font-weight: 600; color: var(--steel);
  text-transform: uppercase; letter-spacing: .02em;
}
.branch-map-info-ilce-list { display: flex; flex-direction: column; gap: .15rem; padding: .3rem .4rem .2rem; }
.branch-map-info-ilce-row {
  display: flex; align-items: center; justify-content: space-between; gap: .5rem; width: 100%;
  border: 0; background: transparent; cursor: pointer; text-align: left; padding: .35rem .3rem;
  border-radius: 6px; font-size: .8rem; color: var(--ink);
}
.branch-map-info-ilce-row:hover { background: var(--line); }
.branch-map-info-ilce-count { font-size: .74rem; color: var(--steel); white-space: nowrap; }
.branch-map-info-back {
  border: 0; background: transparent; color: var(--steel); font-size: .78rem; cursor: pointer;
  padding: .1rem .3rem; border-radius: 6px; white-space: nowrap;
}
.branch-map-info-back:hover { background: var(--line); color: var(--ink); }
.branch-bars { display: flex; flex-direction: column; gap: .4rem; }
.branch-bar-row { display: grid; grid-template-columns: 7rem 1fr 2rem; align-items: center; gap: .6rem; }
.branch-bar-label { font-size: .85rem; color: var(--ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.branch-bar-track { background: var(--line); border-radius: 5px; height: .55rem; overflow: hidden; }
.branch-bar-fill { display: block; height: 100%; background: var(--primary); border-radius: 5px; }
.branch-bar-count { font-size: .82rem; color: var(--steel); text-align: right; }
.dashw-card { display: flex; flex-direction: column; gap: .6rem; }
.dashw-card form { margin: 0; align-self: flex-start; }
.dash-card { animation: dashFadeUp .35s ease backwards; }
.dash-card:hover { box-shadow: 0 6px 18px rgba(16,24,32,.09); transform: translateY(-2px); }
.dash-grid .dash-card:nth-child(1) { animation-delay: .02s; }
.dash-grid .dash-card:nth-child(2) { animation-delay: .06s; }
.dash-grid .dash-card:nth-child(3) { animation-delay: .10s; }
.dash-grid .dash-card:nth-child(4) { animation-delay: .14s; }
.dash-grid .dash-card:nth-child(5) { animation-delay: .18s; }
.dash-grid .dash-card:nth-child(6) { animation-delay: .22s; }
.dash-grid .dash-card:nth-child(7) { animation-delay: .26s; }
@keyframes dashFadeUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
@media (prefers-reduced-motion: reduce) {
  .dash-card, .dash-card:hover { animation: none; transition: none; transform: none; }
}
.dash-chartcard canvas { max-width: 100%; }

/* v1.92.0: İzin Talepleri / Becayiş listelerindeki "Red açıklaması" kutusu rows="1" + width:140px
   (inline style) ile çok dar/kısaydı — placeholder metni sığmıyor, tarayıcının köşedeki sürükle-
   büyüt tutamacı da bu kadar küçük bir kutuda bozuk/garip görünüyordu (kullanıcı ekran görüntüsüyle
   bildirdi). rows="2" + makul bir min-width ile okunabilir hale getirildi; dikey dışında büyütmeyi
   kapattık (resize:vertical) ki yan yana duran "Reddet" butonunu yatayda itip bozmasın. */
.reject-note { width: 220px; min-width: 160px; max-width: 100%; font-size: .8rem; font-family: inherit; padding: 4px 6px; resize: vertical; box-sizing: border-box; }

/* ---------- Faz 2 (v1.27): sayfa başlığı ikonları, tablo satır vurgusu, KPI şeritleri ---------- */
.page-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 2.15rem; height: 2.15rem; border-radius: 10px; margin-right: .65rem;
  background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--primary); flex: 0 0 auto;
}
.page-icon svg { width: 1.2rem; height: 1.2rem; }
h1:has(.page-icon) { display: flex; align-items: center; }

table.list tbody tr:hover td { background: color-mix(in srgb, var(--primary) 5%, transparent); }
table.list tbody tr.inactive:hover td { background: var(--surface-soft); }

.statstrip { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); margin: 0 0 1.1rem; }
/* --stat-* değişkenleri varsayılan olarak buradaki renklerle başlar; bir firma Görünüm ayarlarından
   kendi renklerini seçerse inc/themes.php::stat_color_style_block() bu değişkenleri ezer (bkz.
   inc/layout.php ve payroll_export.php). Kenarlık ve vurgu rengi, seçilen arkaplandan otomatik türetilir. */
:root {
  --stat-default: #eef2f6; --stat-accent: #e3f3f1; --stat-warn: #fbf0da; --stat-alert: #fbe6e5; --stat-ok: #e6f4ea;
}
.statcard {
  background: var(--stat-default); border: 1px solid color-mix(in srgb, var(--stat-default), #000 12%);
  border-radius: var(--radius-card, 14px); padding: .85rem 1rem;
  box-shadow: var(--shadow-card, 0 1px 3px rgba(16,24,32,.05)); display: flex; flex-direction: column; gap: .15rem;
}
.statcard strong { font-family: var(--font-heading); }
.statcard strong { font-size: 1.55rem; line-height: 1.1; color: var(--ink); }
.statcard span { color: var(--steel); font-size: .82rem; }
.statcard.accent { background: var(--stat-accent); border-color: color-mix(in srgb, var(--stat-accent), #000 12%); }
.statcard.accent strong { color: var(--primary); }
.statcard.warn { background: var(--stat-warn); border-color: color-mix(in srgb, var(--stat-warn), #000 12%); }
.statcard.warn strong { color: #8a5a00; }
.statcard.alert { background: var(--stat-alert); border-color: color-mix(in srgb, var(--stat-alert), #000 12%); }
.statcard.alert strong { color: var(--alert); }
.statcard.ok { background: var(--stat-ok); border-color: color-mix(in srgb, var(--stat-ok), #000 12%); }
.statcard.ok strong { color: var(--ok); }

table.list tfoot td { border-bottom: none; }
table.list tfoot tr.totalrow td {
  background: var(--surface-soft); border-top: 2px solid var(--line); font-size: .95rem; padding-top: .7rem; padding-bottom: .7rem;
}
table.list tfoot tr.totalrow td strong { color: var(--ink); }

/* ---------- Çoklu dil (Paket 13) ---------- */
.langswitch { position: relative; margin: 0; }
.langswitch summary { list-style: none; }
.langswitch summary::-webkit-details-marker { display: none; }
.langswitch summary .chev { font-size: .7em; margin-left: .15em; }
.langswitch-panel {
  position: absolute; right: 0; top: calc(100% + .5rem); z-index: 50;
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); min-width: 140px; padding: .35rem; display: flex; flex-direction: column;
}
.langswitch-panel a {
  display: flex; align-items: center; gap: .5rem; width: 100%; text-align: left; color: var(--ink); text-decoration: none;
  font-size: .92rem; padding: .5rem .7rem; border-radius: 6px;
}
.langswitch-panel a:hover { background: var(--paper); }
.langswitch-panel a.on { font-weight: 700; color: var(--primary); }
.langflag { width: 20px; height: 14px; border-radius: 2px; object-fit: cover; flex: none; box-shadow: 0 0 0 1px rgba(0,0,0,.12); vertical-align: -2px; }
.langswitch summary .langflag { margin-right: .35rem; }
.is-rtl .langswitch summary .langflag { margin-right: 0; margin-left: .35rem; }
.is-rtl .langswitch-panel a { text-align: right; }
.sitebar .langswitch summary { color: var(--steel); padding: .4rem .3rem; cursor: pointer; }
.sitebar .langswitch summary:hover { color: var(--ink); }
.topbar .langswitch summary { color: #cfdae3; padding: .4rem .3rem; cursor: pointer; }
.topbar .langswitch summary:hover { color: #fff; }
/* v1.109.1 — artık sadece dil değiştirici değil, yanında "Anasayfaya dön" linki de var (bkz.
   inc/layout.php) — şerit tek bir pil yerine sağ üstte yan yana iki öğe oldu. */
.anon-langbar { position: absolute; top: .8rem; right: 1rem; z-index: 60; display: flex; align-items: center; gap: .7rem; }
.anon-langbar .anon-backhome { background: var(--panel); border: 1px solid var(--line); border-radius: 999px; padding: .4rem .8rem; }
.anon-langbar .langswitch summary { color: var(--steel); background: var(--panel); border: 1px solid var(--line); border-radius: 999px; padding: .4rem .8rem; cursor: pointer; }
.anon-langbar .langswitch summary:hover { color: var(--ink); }

/* v1.109.0 — staffportal'ın giriş-yapılmamış hali (staff_login.php, staff_password.php vb. — bkz.
   inc/staff_auth.php::staff_page_start()): eskiden burada hiç üst çubuk yoktu, sadece sağ üstte
   dil değiştirici (.anon-langbar, hâlâ yukarıda, inc/layout.php'nin kendi giriş sayfasında
   kullanılıyor). Burası bilerek SADE: tam uygulama üst çubuğu (.topbar) değil, sadece marka +
   "Anasayfaya dön" + dil değiştirici — gösterilecek bir kullanıcı/profil yok. */
.anon-topbar { background: var(--panel); border-bottom: 1px solid var(--line); }
.anon-topbar-in { max-width: 1080px; margin: 0 auto; display: flex; align-items: center; gap: 1.2rem; padding: .7rem 1.2rem; }
.anon-brand { display: flex; align-items: center; gap: .5rem; color: var(--ink); text-decoration: none; font-weight: 700; font-size: 1.02rem; }
/* v1.109.1 — Selim bildirdi: "Anasayfaya dön" linki çok ince/soluk kalıyordu (hover'da sadece
   maviye dönüyordu) — artık kalın + yanında bir home ikonu var. */
.anon-backhome { display: inline-flex; align-items: center; gap: .35rem; color: var(--ink); text-decoration: none; font-size: .9rem; font-weight: 700; }
.anon-backhome svg { flex: none; }
.anon-backhome:hover { color: var(--primary); text-decoration: underline; }
/* v1.109.1 — .linkbtn aynı AÇIK-renk-koyu-arkaplan sorunu (bkz. .app-topbar/.sitebar .linkbtn
   düzeltmeleri) burada da vardı: dil değiştirici .anon-topbar'ın (açık) panelinde #cfdae3 ile
   neredeyse görünmezdi, hover'da #fff ile tamamen kayboluyordu. */
.anon-topbar .linkbtn { color: var(--ink); }
.anon-topbar .linkbtn:hover { color: var(--primary); }

/* ---------- Hava durumu: birden fazla şehir arasında geçiş (v1.35.2) ---------- */
.weather-switch { position: relative; margin: 0; }
.weather-switch summary { list-style: none; cursor: pointer; }
.weather-switch summary::-webkit-details-marker { display: none; }
.weather-switch-panel {
  /* Not: langswitch/navdrop panelleri gibi "top: calc(100% + .5rem)" ile boşluklu değil — burada
     fare üstüne gelince (hover) açılıyor da olduğu için, özet (summary) ile panel arasında fare
     geçişinin BOŞ (hiçbir öğeye ait olmayan) bir alandan geçmesi, o boşlukta anlık "mouseleave"
     tetikleyip paneli daha fare ulaşamadan kapatıyordu (kullanıcı bildirdi: "üstüne gelince açılıyor
     ama tıklanmıyor"). Boşluk kaldırıldı (top: 100%, dolgu ile görsel boşluk .padding-top'a taşındı)
     ki fare summary'den panelin kendisine kesintisiz geçsin.
  */
  position: absolute; right: 0; top: 100%; padding-top: .5rem; z-index: 50;
}
.weather-switch-panel-inner {
  background: var(--panel); color: var(--ink); border: 1px solid var(--line); border-radius: 8px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); min-width: 170px; padding: .35rem; display: flex; flex-direction: column;
}
.weather-switch-opt {
  display: flex; align-items: center; gap: .5rem; width: 100%; text-align: left; color: var(--ink);
  background: none; border: none; font: inherit; cursor: pointer;
  font-size: .92rem; padding: .5rem .7rem; border-radius: 6px;
}
.weather-switch-opt:hover { background: var(--paper); }
.weather-switch-opt.on { font-weight: 700; color: var(--primary); }

/* ---------- Üst çubuk hızlı sayfa arama (v1.65.0) ---------- */
.topsearch { position: relative; flex: 0 1 240px; min-width: 140px; margin-right: .4rem; }
.topsearch-input {
  width: 100%; margin: 0; padding: .5rem .8rem; font-size: .9rem;
  border: 1px solid var(--line); border-radius: 10px; background: var(--paper); color: var(--ink);
}
.topsearch-panel {
  position: absolute; left: 0; right: 0; top: 100%; margin-top: .35rem; z-index: 50;
  background: var(--panel); border: 1px solid var(--line); border-radius: 10px;
  box-shadow: 0 8px 24px rgba(0,0,0,.18); padding: .3rem; max-height: 320px; overflow-y: auto;
}
.topsearch-item { display: block; padding: .5rem .7rem; border-radius: 8px; color: var(--ink); text-decoration: none; font-size: .9rem; }
.topsearch-item.active, .topsearch-item:hover { background: var(--paper); color: var(--primary); }
@media (max-width: 760px) {
  .topsearch { display: none; }
}
.weather-switch-opt .wso-name { flex: 1 1 auto; }
.is-rtl .weather-switch-panel { left: 0; right: auto; }
.is-rtl .weather-switch-opt { text-align: right; }

/* RTL (Arapça vb.): menü/kart akışını ve metin hizasını ters çeviriyoruz. Tablolar bilinçli olarak
   ters çevrilmiyor (sayı/tarih sütunlu tablolarda LTR okumak daha doğal kalıyor, gerçek RTL
   sitelerde de yaygın pratik budur). */
.is-rtl { direction: rtl; text-align: right; }
.is-rtl .topbar-in,
.is-rtl .sitebar-in,
.is-rtl .sitefoot-in,
.is-rtl .nav,
.is-rtl .snav,
.is-rtl .profilemenu-panel,
.is-rtl .settingsflyout-panel,
.is-rtl .langswitch-panel,
.is-rtl .heroCta,
.is-rtl .features { direction: rtl; }
.is-rtl .profilemenu-panel,
.is-rtl .langswitch-panel { left: 0; right: auto; }
.is-rtl table.list,
.is-rtl .richtext { direction: ltr; text-align: left; }
.is-rtl .richtext { unicode-bidi: plaintext; }

/* ---------- Çeviri merkezi ---------- */
.translist { min-width: 640px; }
.translist .translit-src { width: 26%; color: var(--steel); font-size: .9rem; }
.translist textarea { width: 100%; min-width: 200px; padding: .4rem .5rem; border: 1px solid var(--line); border-radius: 6px; font: inherit; font-size: .88rem; resize: vertical; }

/* ---------- Yardım merkezi içerik yönetimi (help_admin.php) ---------- */
.helpadmcat { margin-bottom: 1rem; }
.helpadmcat summary { cursor: pointer; padding: .3rem 0; }
.helpadmsub { margin: 1rem 0 .3rem; font-size: .95rem; color: var(--steel); border-bottom: 1px dashed var(--line); padding-bottom: .2rem; }
.helpadmrow { margin-bottom: .8rem; }

/* ---------- v1.150.0 — Personel öz-servis paneli (staff_portal.php) ve Eğitim Portalı
   (lms_portal.php) görsel canlandırma: panel başlıklarına renkli ikon rozetleri (page_icon()'un
   küçük kardeşi, bkz. inc/layout.php::panel_icon()) ve LMS kurs listesi artık düz bir tablo değil,
   kart ızgarası (bkz. .coursecard aşağıda). Selim: "personel girişi ve eğitim portalı sayfası
   biraz sade kalmış, canlandıralım" dedi. ---------- */
.panel-icon {
  display: inline-flex; align-items: center; justify-content: center;
  width: 1.7rem; height: 1.7rem; border-radius: 8px; margin-right: .5rem;
  background: color-mix(in srgb, var(--primary) 14%, transparent); color: var(--primary); flex: 0 0 auto;
  vertical-align: -.4rem;
}
.panel-icon svg { width: 1rem; height: 1rem; }
h2:has(.panel-icon), h3:has(.panel-icon) { display: flex; align-items: center; }

.coursegrid { display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); margin-top: .3rem; }
.coursecard {
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-card, 14px);
  padding: 1rem 1.1rem; display: flex; flex-direction: column; gap: .55rem;
  box-shadow: var(--shadow-card, 0 1px 3px rgba(16,24,32,.05));
  border-top: 3px solid color-mix(in srgb, var(--primary) 55%, transparent);
  transition: box-shadow .15s ease, transform .15s ease;
}
.coursecard:hover { box-shadow: 0 10px 24px rgba(16,24,32,.09); transform: translateY(-1px); }
.coursecard.is-completed { border-top-color: color-mix(in srgb, var(--ok, #2f9e52) 70%, transparent); }
.coursecard.is-progress { border-top-color: color-mix(in srgb, #e0922e 70%, transparent); }
.coursecard-title { font-weight: 700; font-size: 1rem; line-height: 1.3; }
.coursecard-desc { color: var(--steel); font-size: .85rem; flex: 1; }
.coursecard-foot { display: flex; align-items: center; justify-content: space-between; gap: .5rem; margin-top: .2rem; }
.coursecard-actions { display: flex; gap: .4rem; flex-wrap: wrap; }
.helpadmrow-label { margin-bottom: .2rem; }
