/* ============================================================
   OrtakIK V2 — OTOMATIK URETILEN CSS PAKETI
   Kaynak: src/assets/css/ altindaki dosyalar. Bu dosyayi ELLE
   DUZENLEME; kaynagi degistir ve tools\build-data.ps1 calistir.
   ============================================================ */

/* ==== tokens.css ========================================================= */
/* ==========================================================================
   OrtakİK V2 — Tasarım Token'ları
   Tek doğruluk kaynağı. Hiçbir bileşen ham renk/ölçü yazmaz, buradan okur.
   Renk teması: açık (beyaz yüzey, çok açık gri-mavi zemin, canlı mavi aksan).
   ========================================================================== */

:root {
  /* ---- Marka mavisi -------------------------------------------------- */
  --ok-brand-900: #0D3968;
  --ok-brand-800: #10457E;
  --ok-brand-700: #14528F; /* bağlantı metni, aktif menü metni  (beyaz üzerinde ~7:1) */
  --ok-brand-600: #1B6FD6; /* BİRİNCİL — buton dolgusu, odak halkası (~4.6:1) */
  --ok-brand-500: #3B8AE8;
  --ok-brand-300: #8FBCF3;
  --ok-brand-200: #BEDAF8;
  --ok-brand-100: #D7E7FB;
  --ok-brand-50: #EFF6FE; /* aktif menü dolgusu, seçili satır */
  /* ---- Nötrler ------------------------------------------------------- */
  --ok-bg: #F6F8FC; /* sayfa zemini (giriş ekranı) */
  --ok-surface: #FFFFFF; /* kart, sidebar, üst bar */
  --ok-surface-alt: #FBFCFE; /* zebra satır, tablo başlık zemini */
  --ok-surface-sunk: #F1F4F9; /* girintili alan, devre dışı input */
  /* ---- Kabuk zemini --------------------------------------------------
     [K-49, 2026-08-18] Kabuğun ARKASI beyaz, kart gövdesi gri idi.
     [2026-08-19 — kullanıcı kararı] K-49 GERİ ALINDI, kurgu tersine döndü:
     "ana sayfa ve detay ekranlarda en arkadaki plan gri, ana ekran içeriği
     beyaz olsun". Artık kabuk zemini gri, kart/panel gövdesi beyaz.

     Değişen YALNIZ bu üç token'ın DEĞERİdir; token ADLARI ve onları okuyan
     bileşenler (layout.css `.ok-shell`, card.css `.ok-card`/`.ok-stat`/
     `.ok-card__foot`, buttons.css `.ok-form-actions`) aynı kaldı — böylece
     karar bir daha dönerse yine tek yerden çevrilir.

     Kapsam dışı bırakılanlar bilinçlidir: giriş ekranı `--ok-bg` okur
     (auth.css), yüzen katmanlar (modal, açılır menü, toast) `--ok-surface`
     okur — ikisi de bu karardan etkilenmez. */
  /* [2026-08-22 — kullanıcı kararı] Kurgu YENİDEN tersine döndü: kabuk zemini BEYAZ,
     kart/panel gövdesi GRİ. Bu, 2026-08-19'daki "en arkadaki plan gri, ana ekran içeriği
     beyaz olsun" kararını geri alıp K-49'un yönüne dönmektir. Kullanıcı değeri doğrudan
     `wwwroot` aynasında denedi; kalıcı olsun diye kaynağa taşındı. */
  --ok-page-bg: #FFFFFF; /* kabuk zemini — en arkadaki beyaz plan */
  --ok-panel: #E5E5E5; /* kart / panel gövdesi — gri içerik */
  --ok-panel-alt: #F4F7FB; /* panel içi alt şerit (kart ayağı, aksiyon çubuğu) */
  /* [2026-08-20 — kullanıcı kararı] Liste ekranlarının ÜST filtre/kriter paneli.
     Beyaz olduğunda altındaki sonuç ızgarasıyla tek bir yüzey gibi görünüyordu;
     hafif mavi zemin "burası girdi alanı, aşağısı sonuç" ayrımını veriyor.
     ⚠️ Yalnız `section.ok-card`'ın DÜZ gövdesine uygulanır — `--flush` gövdeler
     (ızgara panelleri) ve `form.ok-card` (detay ekranları) BEYAZ kalır; kural
     card.css'tedir. Kullanıcı "şimdilik" dedi: değer geçici, tek yer burası. */
  --ok-panel-filter: #EFF6FE; /* liste ekranı filtre paneli gövdesi */
  /* ---- Sol menü teması (K-51, 2026-08-18) ----------------------------
     Koyu lacivert zemin + açık metin. Aktif öğe canlı mavi dolgu alır —
     koyu zeminde `--ok-brand-50` gibi çok açık bir dolgu metni okunmaz
     hâle getiriyordu. Değerler burada tanımlı ki menü teması tek yerden
     değişsin ve layout.css'e ham renk sızmasın.

     [2026-08-19 — kullanıcı kararı] Menü zemini iki ton koyulaştırıldı:
     #0D3968 → #0A2B4D (aynı ton açısı, hsl 210° 78%; parlaklık %23 → %17).
     `--ok-brand-900` BİLEREK değiştirilmedi — o token menü dışında da (başlık,
     gölge, grafik) kullanılıyor; koyulaşma yalnız kabuğu ilgilendiriyor.
     Ön plan renkleri aynı kaldı, kontrast zaten arttı:
     `fg` #C6DBF4 ~8,8:1 → ~10,1:1 · `fg-dim` #8FB2D8 ~5,3:1 → ~6,5:1.
     Üst bar aşağıda bu değerden TÜRETİLDİĞİ için kendiliğinden koyulaşır. */
  --ok-sidebar-bg: #0A2B4D;
  --ok-sidebar-fg: #C6DBF4; /* menü metni      (koyu zemin üzerinde ~9:1) */
  --ok-sidebar-fg-strong: #FFFFFF; /* hover / açık grup metni */
  --ok-sidebar-fg-dim: #8FB2D8; /* ikon, ok işareti, ipucu (~4.8:1) */
  --ok-sidebar-hover: rgba(255, 255, 255, .09);
  --ok-sidebar-active: #1B6FD6; /* seçili öğe dolgusu */
  --ok-sidebar-accent: #8FBCF3; /* seçili öğe sol şeridi */
  --ok-sidebar-border: rgba(255, 255, 255, .14);
  --ok-sidebar-field: rgba(255, 255, 255, .10); /* menü arama kutusu */
  /* ---- Üst bar teması (kullanıcı kararı, 2026-08-18) -----------------
     Talep birebir: "üstteki bar background rengi de soldaki menü gibi
     olsun". Üst bar artık `--ok-surface` (beyaz) değil, sol menüyle AYNI
     koyu lacivert zemini kullanır.
     Değerler sol menüden KOPYALANMAZ, `--ok-sidebar-*`'tan TÜRETİLİR:
     böylece "üst bar sol menü gibi" kuralı kodda görünür kalır ve menü
     teması ileride değişirse üst bar kendiliğinden peşinden gelir.
     Ayrışma gerekirse yalnız buradaki satır değiştirilir, layout.css'e
     dokunulmaz. */
  --ok-topbar-bg: var(--ok-sidebar-bg);
  --ok-topbar-fg: var(--ok-sidebar-fg); /* ikon/metin  (~9:1)   */
  --ok-topbar-fg-strong: var(--ok-sidebar-fg-strong); /* marka, kullanıcı adı */
  --ok-topbar-fg-dim: var(--ok-sidebar-fg-dim); /* ikincil metin (~4.8:1) */
  --ok-topbar-hover: var(--ok-sidebar-hover);
  --ok-topbar-active: var(--ok-sidebar-active); /* bordro dönemi dolgusu */
  --ok-topbar-accent: var(--ok-sidebar-accent); /* odak halkası (~5.9:1) */
  --ok-topbar-border: var(--ok-sidebar-border);
  /* Açık dropdown durumu — sol menüde karşılığı yok (menüde açılır panel
     yerine akordeon var), bu yüzden türetilmeden tanımlandı. Hover'dan
     (.09) belirgin ayrılması için .18. */
  --ok-topbar-open: rgba(255, 255, 255, .18);
  /* Koyu üst barın içerik alanı üzerinde yükselmesi için gölge;
     `--ok-sh-top` açık zemine göre ayarlıydı ve ilk katmanı (`--ok-border`)
     koyu barın altında açık bir dikiş izi bırakıyordu.
     [2026-08-19 düzeltme] Bu yorum bloğu burada fazladan bir yorum-kapatma
     imiyle erken kapanıyordu; kalan üç satır CSS'e çöp olarak düşüyor ve
     ayrıştırıcı hata kurtarma sırasında bir SONRAKİ noktalı virgüle kadar
     yutuyordu — yani `--ok-topbar-shadow` HİÇ tanımlanmıyordu ve
     layout.css:40 boşta kalıyordu. Yalnız yorum sınırı düzeltildi, değer
     değişmedi. (Yorum içine düz yorum-kapatma imi YAZILMAZ; kök CLAUDE.md §6
     bu tuzağı SQL için anlatır, CSS'te de aynen geçerlidir.)
     Gölge rengi bar zeminiyle aynı aileden alınır; menü koyulaşınca (2026-08-19)
     eski rgba(13,57,104) barın kendisinden AÇIK kalıyor ve altında soluk bir hâle
     bırakıyordu. Yeni değer #0A2B4D'nin rgb karşılığıdır. */
  --ok-topbar-shadow: 0 1px 3px rgba(10, 43, 77, .28);
  --ok-border: #E2E8F1; /* varsayılan kenarlık */
  --ok-border-strong: #CBD5E3; /* input kenarlığı, ayraç */
  --ok-border-hard: #AFBECF; /* tablo hücre kenarlığı (yazdırma) */
  /* ---- Sekme şeridi zemini (K-71, 2026-08-20) ------------------------
     Kullanıcı: "Background rengi de 2,3 ton koyu olsun" (sarmalayan sekme
     şeridi, `emp-detail`). Şerit bugüne kadar zeminsizdi, yani panelin
     beyazını (`--ok-panel` #FFFFFF) gösteriyordu.
     Değer, tasarım sisteminin KENDİ nötr merdiveninden seçildi — yeni bir
     ton uydurulmadı. HSL parlaklığıyla merdiven:
       #FFFFFF (surface) 100%  →  #F1F4F9 (surface-sunk) 96,1%
       → #EDF1F7 (page-bg) 94,9%  →  #E2E8F1 91,6%  →  #CBD5E3 84,3%
     Beyazdan ÜÇÜNCÜ basamak #E2E8F1; istenen "2,3 ton" birebir bu.
     Bileşene özel token olarak tanımlandı — `--ok-sidebar-*` / `--ok-topbar-*`
     ile aynı kalıp. Doğrudan `var(--ok-border)` yazılmadı: o token dosya
     genelinde SAÇ ÇİZGİSİ kenarlık olarak okunuyor; ileride kenarlıklar
     koyulaşırsa şerit zemini onunla birlikte sıçramamalı.
     Legacy karşılığı `#BDBDBD` (emp-detail.aspx:20, parlaklık 74,1%) daha
     koyudur; birebir kopyalanmadı çünkü bu tasarım sisteminin nötrleri
     bütünüyle daha açık bir aralıkta duruyor — korunan şey MUTLAK ton değil,
     "şerit sekmelerden koyu, sekmeler şeritten açık, seçili sekme beyaz"
     sıralamasıdır. */
  --ok-tabbar-bg: #E2E8F1; /* sarmalayan sekme şeridi zemini */

  --ok-text: #16202E; /* gövde metni      (beyaz üzerinde ~14:1) */
  --ok-text-2: #4A5A6E; /* ikincil metin    (~7:1) */
  --ok-text-3: #7C8A9C; /* yer tutucu / ipucu (~3.6:1 — YALNIZ 16px+ veya dekoratif) */
  --ok-text-on-brand: #FFFFFF;
  /* ---- Anlamsal renkler ---------------------------------------------- */
  --ok-success: #2d8659;
  --ok-success-bg: #65C592;
  --ok-success-br: #4aa876;
  --ok-warning: #E0A93C;
  --ok-warning-bg: #EBE950;
  --ok-warning-br: #d4a400;
  --ok-danger: #d43a2a;
  --ok-danger-bg: #FDECEB;
  --ok-danger-br: #e85547;
  --ok-info: #2e7dd3;
  --ok-info-bg: #EFF6FE;
  --ok-info-br: #4b94e8;
  --ok-neutral-bg: #EEF1F6;
  --ok-neutral-br: #D8DFE9;
  /* Bordro/İK ekranlarında sık gereken durum renkleri */
  --ok-state-approved: #157F52; /* Onaylandı */
  --ok-state-pending: #A96A00; /* Süreç devam ediyor */
  --ok-state-rejected: #C62F26; /* Reddedildi */
  --ok-state-locked: #4A5A6E; /* Dönem kilitli */
  --ok-state-draft: #7C8A9C; /* Taslak / pasif */
  --ok-chart-1: #1B6FD6;
  --ok-chart-2: #eb6834;
  --ok-chart-3: #1baf7a;
  --ok-chart-4: #eda100;
  --ok-chart-5: #e87ba4;
  --ok-chart-6: #008300;
  --ok-chart-7: #4a3aa7;
  --ok-chart-8: #e34948;
  --ok-chart-ink: var(--ok-text-2);
  --ok-chart-axis: var(--ok-border);
  --ok-chart-grid: var(--ok-neutral-bg);
  --ok-tooltip-bg: #1F2C3D;
  --ok-tooltip-fg: #FFFFFF;
  /* Bölüm bandı (`.ok-band`) — form içindeki mantıksal grupların başlığı.
     Legacy karşılığı yoktur; kalıp `badge d-block fs-6` + satır içi
     `background-color:#588ec7` olarak 18 ekranda elle tekrarlanıyordu
     (`Settings\InsuranceInformationsDetail.cshtml:221` ve diğerleri).
     Zemin ve yazı BİRLİKTE token'landı: yalnız zemini token'lamak, yazıyı
     Bootstrap'in sabit `--bs-badge-color:#fff`ine bırakır ve karanlık temada
     zemin koyulaşırken yazı beyaz kalırdı — bugün ikisi de sabit olduğu için
     kalıp iki temada aynı görünüyor, bu davranış korunuyor. */
  --ok-band-bg: #588ec7;
  --ok-band-fg: #FFFFFF;
  /* ---- Tipografi ----------------------------------------------------- */
  --ok-font: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  --ok-font-mono: ui-monospace, "Cascadia Mono", Consolas, "Courier New", monospace;
  /* [K-57, 2026-08-19] Kullanıcı kararı: "giriş alanlarının fontları … hâlen fazla".
     `fs-base` 14→13, `fs-sm` 13→12. `fs-xs` 12'de BIRAKILDI — daha aşağısı
     okunabilirlik sınırının altına iner ve o token zaten yalnız rozet/ipucu gibi
     ikincil metinlerde kullanılıyor. Başlık ölçüleri (md/lg/xl) değişmedi: şikâyet
     form alanlarınaydı, başlık hiyerarşisi düzleşmemeli. */
  --ok-fs-xs: 10px;
  --ok-fs-xs: 11px;
  --ok-fs-sm: 12px;
  --ok-fs-base: 13px;
  --ok-fs-md: 16px;
  --ok-fs-lg: 20px;
  --ok-fs-xl: 24px;
  --ok-fs-2xl: 30px;
  --ok-lh-tight: 1.25;
  --ok-lh-base: 1.45;
  --ok-lh-loose: 1.6;
  --ok-fw-normal: 400;
  --ok-fw-medium: 500;
  --ok-fw-semibold: 600;
  --ok-fw-bold: 700;
  /* ---- Boşluk (4px tabanlı) ------------------------------------------ */
  --ok-sp-1: 4px;
  --ok-sp-2: 8px;
  --ok-sp-3: 12px;
  --ok-sp-4: 16px;
  --ok-sp-5: 20px;
  --ok-sp-6: 24px;
  --ok-sp-8: 32px;
  --ok-sp-10: 40px;
  --ok-sp-12: 48px;
  --ok-sp-16: 64px;
  /* ---- Yarıçap ------------------------------------------------------- */
  --ok-r-sm: 4px;
  --ok-r-md: 6px;
  --ok-r-lg: 10px;
  --ok-r-xl: 14px;
  --ok-r-pill: 999px;
  /* ---- Gölge — YALNIZCA yüzen katmanlar ------------------------------
     Kartlar gölgesizdir: yoğun veri ekranında gölge gürültü yapıyor.       */
  --ok-sh-sm: 0 1px 2px rgba(16, 32, 56, .06);
  --ok-sh-md: 0 4px 12px rgba(16, 32, 56, .10), 0 1px 3px rgba(16, 32, 56, .06);
  --ok-sh-lg: 0 12px 32px rgba(16, 32, 56, .14), 0 2px 8px rgba(16, 32, 56, .08);
  --ok-sh-top: 0 1px 0 var(--ok-border), 0 2px 6px rgba(16, 32, 56, .04);
  /* ---- Odak ---------------------------------------------------------- */
  /* ---- Buton dolgu renkleri (2026-09-16) -----------------------------
     Bu uc buton rengi tarihsel olarak kurallarin icine SABIT yaziliydi ve
     tema katmani onlara hic ulasmiyordu; koyu tema her birini elle ezmek
     zorunda kaliyordu. Jetona bagliyoruz ki tema kendi guvenli degerini
     verebilsin.
     ⚠️ Bunlar `--ok-brand-600` / `--ok-danger` / `--ok-success` OLAMAZ:
     o jetonlar koyu temada ACILIR ve uzerlerindeki beyaz metin esigin
     altina duser (olculdu: brand-600 4,21:1 · success 5CBE89 2,29:1).
     Dolgu jetonlari ayri tutulur, degerleri beyazla >=4,5 olacak sekilde
     secilir. ACIK TEMA DEGERLERI DEGISMEDI. */
  --ok-btn-primary-bg: #0D5BC0;
  --ok-btn-primary-bg-hover: #0a4599;
  --ok-btn-danger-bg: #C41C1C;
  --ok-btn-danger-bg-hover: #a01818;
  --ok-btn-success-bg: #0F7A1A;
  --ok-btn-success-bg-hover: #0d6517;
  --ok-focus-ring: 0 0 0 3px rgba(27, 111, 214, .28);
  --ok-focus-color: var(--ok-brand-600);
  /* ---- Kabuk ölçüleri ------------------------------------------------ */
  --ok-topbar-h: 56px;
  --ok-sidebar-w: 264px;
  --ok-sidebar-rail-w: 60px; /* daraltılmış (simge) mod */
  --ok-content-max: 1680px; /* çok geniş ekranda içerik sınırı */
  /* ---- Kontrol yoğunluğu (data-density ile değişir) ------------------ */
  /* [K-55, 2026-08-19] Kullanıcı kararı: dikey ölçüler GENELİNDE fazla genişti.
     Değişen: ctrl-h 34→30 · ctrl-px 10→8 · row-h 36→32 · cell-py 6→4 ·
     card-py yeni (16 yerine 10) · field-gap 12→6. Yatay ölçüler (cell-px,
     card-px) DEĞİŞMEDİ — şikâyet dikeydi ve yatayı daraltmak kolon
     sığdırmayı zorlaştırır.

     [K-57, 2026-08-19] İKİNCİ TUR — kullanıcı "hâlen fazla" dedi; bu kez
     yalnız yükseklik değil FONT ve İÇ DOLGU da küçüldü:
       ctrl-h 30→28 · ctrl-h-sm 26→24 · ctrl-px 8→7 · card-py 10→8
       fs-base 14→13 · fs-sm 13→12   (font blokta, aşağıda)
     `data-density="compact"` de orantılı düşürüldü, yoksa iki kip birbirine
     yapışır ve yoğunluk anahtarı anlamsızlaşırdı.
     ⚠️ 28px hâlâ dokunmatik hedef için kabul edilebilir alt sınıra yakındır;
     daha aşağısı istenirse tıklama alanı ayrıca büyütülmeli. */
  /* [K-59, 2026-08-19] ÜÇÜNCÜ TUR — kullanıcı: "ok-input, ok-select gibi alanlarda
     çok fazla iç padding var, özellikle vertical".
     ⚠️ Ölçüm: `.ok-input`/`.ok-native-select` DİKEY DOLGU TAŞIMIYOR (forms.css:99-104,
     yalnız `padding-inline`); algılanan boşluk sabit YÜKSEKLİK ile 13px font arasındaki
     farktan geliyordu (28px kutu ↔ ~19px satır). Bu yüzden çözüm dolguyu değil
     yüksekliği düşürmek: 28→26. Gerçek dikey dolgusu olan iki bileşen ayrıca kısıldı
     (textarea `padding-block` 5→3, select kontrolü 2→1 — kendi dosyalarında).
     26px + 13px font, satırın üstünde/altında ~3px bırakır: sıkı ama kırpmaz. */
  /* [K-60, 2026-08-19] DÖRDÜNCÜ TUR — kullanıcı: "ok-input'larda içteki üst/alt
     padding'i biraz daha azalt, ekranlar aşağı doğru çok kayıyor".
     K-59'daki ölçüm hâlâ geçerli: `.ok-input`/`.ok-native-select` dikey dolgu
     TAŞIMIYOR (forms.css, yalnız `padding-inline`), algılanan boşluk sabit
     YÜKSEKLİK ile font arasındaki farktır. Bu yüzden yine yükseklik düşürüldü:
     ctrl-h 26→24 · ctrl-h-sm 22→20.
     24px kutu = 22px içerik (1px+1px kenarlık). 13px fontun doğal içerik
     yüksekliği ~15,4px olduğu için satır her hâlükârda sığar; yine de miras
     alınan 1.45 satır yüksekliğine (≈18,9px) güvenilmedi ve `.ok-input`'a
     `--ok-lh-tight` (1.25 → ≈16,3px) AÇIKÇA verildi (forms.css) — böylece
     gövde satır yüksekliği ileride değişse de kutu kırpmaz.
     Dikey ölçü artık dokunmatik hedef alt sınırının belirgin altında; yalnız
     fare/klavye ile kullanılan yoğun veri ekranları için bilinçli bir seçim. */
  --ok-ctrl-h: 24px; /* input, select, buton yüksekliği */
  --ok-ctrl-h-sm: 20px;
  /* [2026-08-22 — kullanıcı kararı] Dördü birden sıkıldı: denetim yatay boşluğu 7→5,
     grid satırı 32→30, hücre yatay 10→8, hücre dikey 4→2.
     ⚠️ `--ok-cell-py` artık sıkışık kiple AYNI (ikisi de 2px) — o tek token'da yoğunluk
     anahtarı fark üretmiyor. Sıkışık kip 1px'e DÜŞÜRÜLMEDİ: 1px dolgu okunabilirliği
     bozar ve kipler arası fark zaten `--ok-row-h` (30 ↔ 26) üzerinden korunuyor.
     Bu, `--ok-card-px/py`deki durumdan farklıdır: orada sıkışık kip varsayılandan
     BÜYÜK kalacaktı, yani anahtar ters çalışacaktı; burada yalnız eşitlik var. */
  --ok-ctrl-px: 5px; /* yatay iç boşluk */
  --ok-row-h: 30px; /* grid satır yüksekliği */
  --ok-cell-px: 8px;
  --ok-cell-py: 2px;
  /* [2026-08-22 — kullanıcı kararı] Kart iç boşluğu yarıya indi: yatay 16→8, dikey 8→4. */
  --ok-card-px: 8px; /* kart YATAY iç boşluğu */
  --ok-card-py: 4px; /* kart DİKEY iç boşluğu — eskiden card-px ile aynıydı */
  --ok-card-py2: 16px; /* kart DİKEY iç boşluğu — eskiden card-px ile aynıydı */
  /* ---- Dar denetim ölçeği (2026-08-20, kullanıcı kararı) --------------------
     İçeriğin genişliği belliyse alanı boydan boya germek hem çirkin hem yanıltıcı
     (kullanıcı uzun değer beklendiğini sanıyor). Üç basamak yeterli görüldü:
       sm  saat/gün/adet, 2-4 hane        (TxtHour, TxtDay kalıpları)
       md  tarih gg.aa.yyyy, para, sayı   — ESKİ `--narrow` DEĞERİ, değişmedi
       lg  kısa metin: kod, IBAN parçası, telefon
     Kural `forms.css`'te; sınıflar `.ok-input--w-sm|md|lg`. `--narrow` md'nin
     takma adı olarak sürüyor (11 ekran / 59 kullanım). */
  --ok-w-sm: 120px;
  --ok-w-md: 190px; /* legacy Bootstrap col-md-2/3 karşılığı */
  --ok-w-lg: 320px;
  /* [K-61, 2026-08-19] Kullanıcı kararı: "veri alanları arasındaki boşluk azalsın".
     Ölçüm: alanlar arası dikey aralığı ÜRETEN tek yer `.ok-fields`'ın satır
     aralığıdır (forms.css `gap: var(--ok-field-gap) var(--ok-sp-4)`); `.ok-field`
     kendi içinde dikey dolgu taşımıyor. Bu yüzden 6→4. Yatay aralık (`--ok-sp-4`)
     DEĞİŞMEDİ — şikâyet dikeydi ve sütunları daraltmak etiketi denetime yapıştırır. */
  --ok-field-gap: 4px; /* form satırları arası */
  /* Yatay alan düzeninde etiket sütunu genişliği (forms.css `.ok-field`).
     [K-56, 2026-08-19] Etiket + denetim artık VARSAYILAN olarak yan yana;
     bu yüzden ölçü token'a taşındı. 220px yalnız tek sütunlu formlarda
     doğruydu, `.ok-fields--3` içinde denetimi eziyordu. */
  --ok-label-w: 150px;
  /* ---- Katman sırası ------------------------------------------------- */
  --ok-z-base: 0;
  --ok-z-sticky: 100; /* grid sabit başlık, sabit ilk kolon */
  --ok-z-topbar: 300;
  --ok-z-sidebar: 350;
  --ok-z-dropdown: 500;
  --ok-z-backdrop: 700;
  --ok-z-modal: 800;
  --ok-z-popover: 900;
  --ok-z-toast: 1000;
  /* ---- Hareket ------------------------------------------------------- */
  --ok-dur-fast: 120ms;
  --ok-dur-base: 180ms;
  --ok-dur-slow: 280ms;
  --ok-ease: cubic-bezier(.4, 0, .2, 1);
}

:root[data-theme="dark"] {
  --ok-chart-1: #3987e5;
  --ok-chart-2: #d95926;
  --ok-chart-3: #199e70;
  --ok-chart-4: #c98500;
  --ok-chart-5: #d55181;
  --ok-chart-6: #008300;
  --ok-chart-7: #9085e9;
  --ok-chart-8: #e66767;
}

/* Sıkışık mod — bordro, puantaj, geniş liste ekranları için.
   <body data-density="compact"> ile açılır, tercih localStorage'da saklanır. */
[data-density="compact"] {
  /* [K-57, 2026-08-19] Varsayılan kip küçüldüğü için sıkışık kip de orantılı
     düşürüldü; yoksa ikisi birbirine yapışır ve yoğunluk anahtarı anlamsızlaşırdı.
     `fs` 12'nin altına inilmedi (okunabilirlik sınırı). */
  /* [K-60 / K-61, 2026-08-19] Varsayılan kip yeniden küçüldüğü için sıkışık kip de
     orantılı düşürüldü (ctrl-h 23→21 · ctrl-h-sm 20→18 · field-gap 4→3); yoksa iki
     kip birbirine yapışır ve yoğunluk anahtarı anlamsızlaşır. 12px fontun doğal
     içerik yüksekliği ~14,2px olduğu için 21px kutu (19px içerik) hâlâ kırpmaz. */
  --ok-fs-base: 12px;
  --ok-fs-sm: 12px;
  --ok-ctrl-h: 21px;
  --ok-ctrl-h-sm: 18px;
  --ok-row-h: 26px;
  --ok-cell-py: 2px;
  --ok-cell-px: 7px;
  /* [2026-08-22] Varsayılan kip 8/4'e indiği için sıkışık kip de orantılı düşürüldü
     (12/6 → 6/3). Yoksa "sıkışık" kip varsayılandan GEVŞEK kalır ve yoğunluk anahtarı
     ters çalışırdı — K-57/K-60/K-61'de aynı gerekçeyle aynı şey yapılmıştı. */
  --ok-card-px: 6px;
  --ok-card-py: 3px;
  --ok-field-gap: 3px;
  --ok-label-w: 134px;
}

/* Hareket azaltma tercihi */
@media (prefers-reduced-motion: reduce) {
  :root {
    --ok-dur-fast: 0ms;
    --ok-dur-base: 0ms;
    --ok-dur-slow: 0ms;
  }
}

/* ==== bootstrap-bridge.css =============================================== */
/* ============================================================================
   bootstrap-bridge.css — Bootstrap 5 ile OrtakİK tasarım sistemi arasındaki köprü

   NEDEN VAR
   ---------
   [2026-08-22 — kullanıcı kararı] Ekranlar Bootstrap 5'in sınıf sözlüğüne
   geçiriliyor. Gerekçe okunabilirlik: legacy Bootstrap kullanıyordu ve ekip ona
   hakim. Ancak Bootstrap'in ÖLÇÜLERİ alınmıyor — yalnız SINIF SÖZLÜĞÜ ve
   IZGARASI alınıyor (K-B1, K-B4).

   Bootstrap 5.3.8 varsayılanları bu ürün için fazla gevşektir:
       gövde 16px · input ~38px · tablo satırı ~41px
   OrtakİK'in bugünkü ölçüleri (kullanıcının K-55…K-61'de beş turda kendisi
   küçülttüğü değerler):
       gövde 13px · input 24px · tablo satırı 32px
   Legacy ise 11px / 26px / 28px — yani V2 legacy'ye zaten yakın, uzak olan
   taraf Bootstrap'tir. Bu dosya Bootstrap'i V2'nin ölçülerine çeker.

   YÖNTEM — tek kaynak ilkesi
   --------------------------
   Hiçbir ölçü buraya SAYI olarak yazılmaz; hepsi `tokens.css`teki `--ok-*`
   token'larına bağlanır. İki kazanç:
     1. Ölçü değişince tek yer (`tokens.css`) güncellenir, burası kendiliğinden
        uyar — iki ayrı sayı listesi ayrışamaz.
     2. Yoğunluk anahtarı BEDAVA çalışır: `<body data-density="compact">`
        `--ok-*` değerlerini değiştirir, Bootstrap bileşenleri de onları okuduğu
        için birlikte sıkışır. Bootstrap'in kendi ölçeği bunu veremezdi.

   YÜKLEME SIRASI — kritik
   -----------------------
   _Layout.cshtml:  bootstrap.min.css  →  ortakik.css (bu dosya onun içinde)
   Bootstrap ÖNCE gelmezse buradaki ezmeler etkisiz kalır.
   Paket içindeki yeri: `tokens.css`ten hemen sonra (token'ları okur), bileşen
   dosyalarından önce (`.ok-*` kuralları bunu ezebilmeli).

   KAPSAM SINIRI — Bootstrap'in JS'i ALINMADI
   ------------------------------------------
   Bootstrap JS'i almak dört gerçek davranış çakışması üretiyordu: iki kaydırma
   kilidi, iki odak tuzağı, `data-ok-confirm`in 214 düğmede Bootstrap'in belge
   dinleyicisini bastırması. Bu yüzden yalnız CSS alındı ve davranışı JS'e bağlı
   Bootstrap bileşenlerinin SINIFLARI da kullanılmıyor:
       .modal · .dropdown · .collapse · .toast · .nav-tabs/.tab-pane
       .offcanvas · .tooltip · .accordion
   Bunlar `.ok-*` karşılıklarıyla kalır. `data-bs-*` bu kod tabanında hiç geçmez.
   ⚠️ Sınıfı "sadece görünüm için" kullanmak da olmaz: Bootstrap'in `.modal`
   kuralı `display:none` taşır, JS'i olmadan o modal bir daha açılmaz.
   ============================================================================ */

/* ---------------------------------------------------------------------------
   1. Kök değişkenler — Bootstrap'in tabanı OrtakİK token'larına bağlanır
   --------------------------------------------------------------------------- */
:root {
  /* Tipografi. `--bs-body-font-size` Bootstrap'te yalnız `body`ye uygulanır;
     bileşenler kendi `--bs-*-font-size` değişkenlerini okur, onlar aşağıda. */
  --bs-body-font-family: var(--ok-font);
  --bs-body-font-size: var(--ok-fs-base);
  --bs-body-line-height: var(--ok-lh-base);
  --bs-body-color: var(--ok-text);
  --bs-body-bg: var(--ok-surface);
  --bs-secondary-color: var(--ok-text-2);
  --bs-tertiary-color: var(--ok-text-3);
  --bs-emphasis-color: var(--ok-text);
  --bs-font-monospace: var(--ok-font-mono);
  /* Kenarlık ve yarıçap. Bootstrap'in 6px'i (`--bs-border-radius`) OrtakİK'in
     `--ok-r-md` değeriyle zaten aynı; kart 10px alır (aşağıda, §4). */
  --bs-border-color: var(--ok-border);
  --bs-border-radius: var(--ok-r-md);
  --bs-border-radius-sm: var(--ok-r-sm);
  --bs-border-radius-lg: var(--ok-r-lg);
  --bs-border-radius-xl: var(--ok-r-xl);
  /* Marka rengi. Bootstrap'in #0d6efd'si OrtakİK mavisiyle değiştirilir.
     `-rgb` biçimi Bootstrap'in saydamlık hesapları için zorunlu. */
  --bs-primary: var(--ok-brand-600);
  --bs-primary-rgb: 27, 111, 214;
  --bs-link-color: var(--ok-brand-700);
  --bs-link-hover-color: var(--ok-brand-800);
  /* Odak halkası — OrtakİK'in halkası 3px, Bootstrap'inki 4px (.25rem). */
  --bs-focus-ring-width: 3px;
  --bs-focus-ring-color: rgba(27, 111, 214, .28);
}

/* Izgara boşluğu. Bootstrap 24px, legacy 20px kullanıyordu; 20px hem legacy
   paritesini verir hem OrtakİK'in 4px tabanlı ölçeğinde zaten var (`--ok-sp-5`).

   ⚠️ Bu tanım `:root`ta İŞE YARAMAZ — ölçüldü, 24px kalıyordu. Bootstrap
   `--bs-gutter-x`i `.row` ve `.container-*` sınıflarının KENDİ gövdesinde
   tanımlıyor; eleman üzerindeki tanım her zaman `:root`tan gelen kalıtımı
   gölgeler. Aynı tuzak `.btn`, `.card`, `.table` için de geçerli — onlar zaten
   aşağıda kendi sınıfları üzerinden eziliyor. Yeni bir Bootstrap değişkeni
   eklerken önce onu kimin tanımladığına bak. */
.row,
.container {
  --bs-gutter-x: var(--ok-sp-5);
}

/* ---------------------------------------------------------------------------
   2. Form denetimleri
   Bootstrap bunlar için CSS değişkeni AÇMIYOR (`.form-control` ölçüleri Sass'ta
   sabitlenmiş), bu yüzden doğrudan kural yazmak zorunlu. Değerler `.ok-input`
   ile birebir aynı — iki denetim yan yana geldiğinde hizası kaymasın.
   --------------------------------------------------------------------------- */
.form-control,
.form-select {
  height: var(--ok-ctrl-h);
  padding-block: 0;
  padding-inline: var(--ok-ctrl-px);
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  font-size: var(--ok-fs-base);
  /* Satır yüksekliği AÇIKÇA veriliyor: gövdenin 1.45'i 13px'te ≈18,9px eder ve
     22px'lik iç yükseklikte pay bırakmaz. `.ok-input` da aynı sebeple böyle. */
  line-height: var(--ok-lh-tight);
  color: var(--ok-text);
  background-color: var(--ok-surface);
}

/* Çok satırlı alan sabit yükseklik almaz — yukarıdaki `height` onu 24px'e
   kilitlerdi. `.ok-textarea` de aynı istisnayı yapıyor. */
textarea.form-control {
  height: auto;
  min-height: calc(var(--ok-ctrl-h) * 2);
  padding-block: var(--ok-sp-1);
  line-height: var(--ok-lh-base);
}

.form-select {
  /* Bootstrap ok işaretine yer açmak için sağdan fazladan boşluk bırakır. */
  padding-inline-end: calc(var(--ok-ctrl-px) + 16px);
}

  .form-control:focus,
  .form-select:focus {
    border-color: var(--ok-focus-color);
    box-shadow: var(--ok-focus-ring);
  }

  .form-control:disabled,
  .form-select:disabled {
    background-color: var(--ok-surface-sunk);
    color: var(--ok-text-2);
  border-inline-start: 3px solid #8D9CAB;
  padding-inline-start: 3px;
  }

.form-control::placeholder {
  color: var(--ok-text-3);
}
.col-form-label {
  margin-bottom: 0;
  padding-block: 0;
  font-size: var(--ok-fs-base);
  font-weight: var(--ok-fw-medium);
  color: var(--ok-text-2);
  line-height: var(--ok-ctrl-h);
}

/* ---------------------------------------------------------------------------
   3. Butonlar — Bootstrap bunlar için değişken açıyor, doğrudan kural gerekmez
   --------------------------------------------------------------------------- */
.btn {
  --bs-btn-padding-x: var(--ok-sp-4);
  --bs-btn-padding-y: 0;
  --bs-btn-font-size: var(--ok-fs-sm);
  --bs-btn-font-weight: var(--ok-fw-medium);
  --bs-btn-line-height: var(--ok-lh-tight);
  --bs-btn-border-radius: var(--ok-r-md);
  --bs-btn-focus-box-shadow: var(--ok-focus-ring);
  /* Yükseklik değişkenle verilemiyor (Bootstrap dolgudan hesaplıyor); `.ok-btn`
     ile aynı hizada durması için açıkça sabitleniyor. */
  height: var(--ok-ctrl-h);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ok-sp-2);
}

.btn-primary {
  --bs-btn-bg: var(--ok-brand-600);
  --bs-btn-border-color: var(--ok-brand-600);
  --bs-btn-hover-bg: var(--ok-brand-700);
  --bs-btn-hover-border-color: var(--ok-brand-700);
  --bs-btn-active-bg: var(--ok-brand-800);
  --bs-btn-active-border-color: var(--ok-brand-800);
  --bs-btn-color: var(--ok-text-on-brand);
  --bs-btn-hover-color: var(--ok-text-on-brand);
}

/* Legacy'nin `.btn-default`u nötr, açık zeminli bir düğmeydi. Bootstrap 5'te
   karşılığı `.btn-light`tır — `.btn-secondary` DOLU GRİ verir ve legacy'ye
   benzemez. Çeviri sözlüğünde bu eşleme bağlayıcıdır. */
.btn-light {
  --bs-btn-bg: var(--ok-surface);
  --bs-btn-border-color: var(--ok-border-strong);
  --bs-btn-color: var(--ok-text);
  --bs-btn-hover-bg: var(--ok-surface-sunk);
  --bs-btn-hover-border-color: var(--ok-border-strong);
  --bs-btn-hover-color: var(--ok-text);
}

.btn-sm {
  --bs-btn-padding-x: var(--ok-sp-3);
  height: var(--ok-ctrl-h-sm);
}

/* ---------------------------------------------------------------------------
   4. Kart — legacy'nin `.portlet`u buna çevriliyor (K-B1)
   Metronic'in mavi başlık çubuğu BİLEREK taklit edilmiyor; kullanıcı kararı.
   --------------------------------------------------------------------------- */
.card {
  --bs-card-bg: var(--ok-panel);
  --bs-card-border-color: var(--ok-border);
  --bs-card-border-radius: var(--ok-r-lg);
  --bs-card-spacer-x: var(--ok-card-px);
  --bs-card-spacer-y: var(--ok-card-py);
  --bs-card-cap-padding-x: var(--ok-card-px);
  --bs-card-cap-padding-y: var(--ok-card-py);
  --bs-card-cap-bg: var(--ok-panel);
  /* Kartlar gölgesizdir — yoğun veri ekranında gölge kutuları öne çıkarıp
     veriyi geriye itiyor (00-tasarim-ilkeleri.md §2). */
  --bs-card-box-shadow: none;
}

/* ---------------------------------------------------------------------------
   5. Tablo
   Bootstrap hücre dolgusunu değişkenle açmıyor (`.5rem .5rem` sabit), bu yüzden
   doğrudan kural. Değerler `.ok-grid` ile aynı.
   ⚠️ Bu, JS ile üretilen `.ok-grid` ızgarasını ETKİLEMEZ — o kendi sınıfını
   kullanır. Buradaki kural yalnız `.table` yazan statik tablolar içindir.
   --------------------------------------------------------------------------- */
.table {
  --bs-table-color: var(--ok-text);
  --bs-table-bg: var(--ok-surface);
  --bs-table-border-color: var(--ok-border);
  --bs-table-striped-bg: var(--ok-surface-alt);
  --bs-table-hover-bg: var(--ok-brand-50);
  font-size: var(--ok-fs-base);
}

  .table > :not(caption) > * > * {
    padding: var(--ok-cell-py) var(--ok-cell-px);
  }

  .table > thead > tr > * {
    background-color: var(--ok-surface-alt);
    font-weight: var(--ok-fw-semibold);
    color: var(--ok-text-2);
  }

/* ---------------------------------------------------------------------------
   6. Doğrulama köprüsü — EN KRİTİK BÖLÜM
   OrtakİK doğrulama işaretini SARMALAYICIYA koyar, Bootstrap ise doğrudan
   denetime (`.form-control.is-invalid`). İkisi aynı sınıf adını farklı yerde
   kullanıyor; bu bölüm o köprüyü kurar.

   ⚠️ Bu kural olmadan hata SESSİZCE görünmez olur: `OK.form.validate` işareti
   sarmalayıcıya yazmaya devam eder, Bootstrap onu görmez, kullanıcı hatasız
   sanıp kaydeder.

   [2026-08-27] Sarmalayıcının İKİ biçimi var ve her seçici ikisini de saymalı:
   `[data-ok-field]` (yerleşimi Bootstrap'e devredilmiş 1.575 alan) ve
   `.ok-field` (henüz dönüştürülmemiş 466 çıplak alan + `.ok-fields` ızgarası
   içindekiler). Tek kaynak JS tarafında: `OK.form.FIELD_SEL`. Buraya yeni bir
   `is-invalid` kuralı eklerken **iki dalı birden** yaz — yalnız birini yazmak
   hatayı diğer popülasyonda görünmez kılar.
   --------------------------------------------------------------------------- */
.ok-field.is-invalid .form-control,
.ok-field.is-invalid .form-select,
[data-ok-field].is-invalid .form-control,
[data-ok-field].is-invalid .form-select {
  border-color: var(--ok-danger);
  background-color: var(--ok-danger-bg);
}

  .ok-field.is-invalid .form-control:focus,
  .ok-field.is-invalid .form-select:focus,
  [data-ok-field].is-invalid .form-control:focus,
  [data-ok-field].is-invalid .form-select:focus {
    border-color: var(--ok-danger);
    box-shadow: 0 0 0 3px rgba(198, 47, 38, .22);
  }

/* Bootstrap `.invalid-feedback`i yalnız `.is-invalid` KARDEŞİ olduğunda gösterir;
   OrtakİK'te işaret sarmalayıcıda olduğu için o seçici tutmaz. */
.ok-field.is-invalid .invalid-feedback,
[data-ok-field].is-invalid .invalid-feedback {
  display: block;
}

/* ---------------------------------------------------------------------------
   7. Pilot dalgasında ölçülen iki çakışma (2026-08-22)
   İkisi de bugün "çalışıyor" ama yalnız dosya yükleme sırası sayesinde: çakışan
   kuralların özgüllüğü EŞİT (0,1,0) ve `ortakik.css` Bootstrap'ten sonra geldiği
   için kazanıyor. Sıra bir gün değişirse ikisi de sessizce bozulurdu. Aşağıdaki
   kurallar sonucu sıradan bağımsız hâle getirir.
   --------------------------------------------------------------------------- */

/* 7z. ⛔ EN KRİTİK KURAL — kanonik form satırını AYAKTA TUTAN kural.

   `.ok-field` bir CSS **grid**tir: `display:grid` + `grid-template-columns:
   150px minmax(0,1fr)` (`ortakik.css:1718-1727`). Bootstrap `.row` ise
   `display:flex`. İkisi aynı elemanda buluştuğunda (ADR-T007 §5 kanonik satırı
   tam olarak bunu yapar) özgüllük EŞİTTİR (0,1,0) ve `ortakik.css` sonra
   yüklendiği için **grid kazanır**. Sonuç: `col-md-*` sınıfları hiçbir işe
   yaramaz, etiket sütunu 150px'e çakılır, legacy kolon hizası HİÇ oluşmaz.

   Ekran düzgün görünür — yalnız istenen genişliklerde değildir. Yani bu, gözle
   fark edilmesi zor bir sessiz kayıptır ve 350 ekranın tamamını ilgilendirir.

   `gap: 0` da şarttır: `.ok-field`ın grid boşluğu (`2px var(--ok-sp-3)` = 2px 12px)
   flex'e geçince kolonlar ARASINA girer ve Bootstrap'in kendi gutter'ına eklenir —
   her form satırında 12px fazla boşluk oluşurdu. */
.ok-field.row {
  display: flex;
  gap: 0;
}

/* Aynı çakışma KAPSAYICIDA da var: `.ok-fields` (çoğul) alan satırlarını yan yana
   dizen bir gridtir — `grid-template-columns: repeat(var(--ok-cols,3), 1fr)`
   (`ortakik.css:2298-2306`). Legacy'nin DIŞ sütun oranlarını (örn. 5/5/2 bölme)
   taşımak için ona da `row` eklenmesi gerekiyor ve o da aynı sessiz kaybı yaşıyordu.
   Üç iş kolu bu yüzden dış oranları taşıyamadan bıraktı (Portal, Others, Shared).

   ⚠️ Buradaki `gap` `.ok-field.row`dakinden FARKLI: `.ok-fields` çok satırlı olabilir
   (alanlar alta sarar), yani DİKEY aralık korunmalı. Yalnız yatay aralık sıfırlanır —
   onu artık Bootstrap'in gutter'ı veriyor; ikisi birden kalsaydı sütun arası iki kat
   açılırdı. */
.ok-fields.row {
  display: flex;
  gap: var(--ok-field-gap) 0;
}

/* 7y. ⛔ ETİKET SÜTUNU HİZASI — oranı aynı olan alanların AYNI yerde başlamasını
   sağlayan kural.

   Alan sarmalayıcısı hem `.row` hem `col-md-*`tır (ADR-T007 §5 kanonik satırı,
   `app\CLAUDE.md` §6 eşleme tablosu). Bu birleşimde etiket sütununun genişliği
   Bootstrap'te şöyle hesaplanır:

       etiket = (kap − 24px) × oran        24px = `.row > *` sol+sağ dolgusu
       denetim kolonunun başlangıcı = etiket + 12px

   `24px` SABİTTİR, kapla ölçeklenmez. Legacy'nin dar kaplarda oranı ikiye katlama
   kararı (örn. tam genişlik `col-md-2` ↔ yarım hücre `col-md-4`) YÜZDEYİ doğru
   eşitler — ikisi de %16,67 — ama bu sabit payı eşitlemez:

       yarım hücre  (0,5P, oran 1/3):  0,167P − 8 + 12 = 0,167P + 4
       tam genişlik (P,   oran 1/6):  0,167P − 4 + 12 = 0,167P + 8

   Sonuç: aynı formda aynı yüzdeye sahip iki alan 4px kaymış başlar. Ölçüm:
   `Corporate\Company.cshtml` — CCOMPANY_NAME (:157) ve CCOMPANY_WEB (:532) tam
   genişlik satırlar, komşuları (:143, :170) yarım hücre; ekranda gözle görülür.

   Gutter'ı sarmalayıcıda sıfırlamak sabit payı düşürür ve formül `kap × oran`a
   iner — yani hiza artık ölçekten bağımsızdır.

   ⚠️ Sarmalayıcının DIŞ konumu değişmez: `.row`un `-12px` margin'i ile `.row > *`ın
   `+12px` dolgusu zaten birbirini götürüyordu; ikisi birden sıfırlanıyor. Değişen
   yalnız iç ölçeğin tabanı.

   ⚠️ `.ok-field` sınıfını koruyan 466 çıplak alan bu kuraldan ETKİLENMEZ — onlarda
   `data-ok-field` yoktur, hizayı `.ok-field` grid'i (`--ok-label-w`) üretir. */
[data-ok-field] {
  --bs-gutter-x: 0;
}

  /* Gutter gidince kaybolan etiket ↔ denetim boşluğunu geri verir. Değer Bootstrap
     gutter'ının yarısıyla birebir aynıdır (12px), yani boşluk ölçüsü değişmez.
     `padding-right` `border-box`ta kutu GENİŞLİĞİNİ değiştirmez, yalnız sağa hizalı
     metni içeri iter — hizayı bozmadan aralığı üretir. */
  [data-ok-field] > .ok-field__label {
    padding-right: var(--ok-sp-3);
  }

  [data-ok-field] > .ok-field__label {
    align-self: flex-start;
    min-height: var(--ok-ctrl-h);
  }

/* 7a. Dolgusuz kart gövdesi. `.ok-card__body--flush` ızgara panellerinde dolguyu
   sıfırlar; `.card-body` ise 16px verir. İki sınıf aynı elemanda buluşuyor
   (156 liste ekranının tamamında). Birleşik seçici özgüllüğü 0,2,0 yapar. */
.ok-card__body--flush.card-body {
  padding: 0;
}

/* 7c. Kart ayağı. `.ok-card__foot` gövdeden bir ton koyu bir şeritle ayrılır
   (`--ok-panel-alt`) ve alt köşeleri yuvarlar; Bootstrap `.card-footer` ise kart
   başlığıyla aynı zemini (`--bs-card-cap-bg`, bizde beyaz) verir. Özgüllükleri eşit
   (0,1,0) olduğu için bugün yalnız dosya sırası sayesinde doğru görünüyor —
   58 ekranı ilgilendiren bu farkı sıradan bağımsız hâle getiriyoruz. */
.ok-card__foot.card-footer {
  padding: var(--ok-sp-2) var(--ok-card-px);
  background: var(--ok-panel-alt);
  border-top: 1px solid var(--ok-border);
}

/* 7b. Bootstrap `.card` kuralı `word-wrap:break-word` taşır ve bu KALITILIR.
   `.ok-grid` hücreleri varsayılan olarak `nowrap` değildir (nowrap yalnız
   `.is-nowrap` ile gelir), yani kart içindeki ızgarada IBAN, e-posta, uzun kod
   gibi boşluksuz değerler kolonu genişletmek yerine KELİME İÇİNDEN bölünmeye
   başlıyordu. Izgaranın Bootstrap öncesi davranışı geri veriliyor. */
.ok-grid,
.ok-grid th,
.ok-grid td {
  word-wrap: normal;
  overflow-wrap: normal;
}

/* ---------------------------------------------------------------------------
   8. Bordro sayıları — Bootstrap'te karşılığı olmayan, vazgeçilmez davranış
   Tablo hücrelerindeki sayılar sabit genişlikli rakamla dizilmezse binler
   basamağı satırdan satıra kayar ve tutar karşılaştırması gözle yapılamaz.
   Bootstrap'in böyle bir yardımcı sınıfı yok.
   --------------------------------------------------------------------------- */
.table .ok-num,
.table [data-ok-type="number"],
.table [data-ok-type="money"] {
  font-variant-numeric: tabular-nums;
  text-align: right;
}

/* ==== base.css =========================================================== */
/* ==========================================================================
   OrtakİK V2 — Temel katman
   Sıfırlama, tipografi, temel öğeler, odak yönetimi.
   tokens.css'ten SONRA yüklenir.
   ========================================================================== */

*, *::before, *::after {
  box-sizing: border-box;
}

/* [hidden] tarayıcı varsayılanı display:none'dur ama bileşen sınıflarımız
   display:flex/grid verdiği için eziliyor. Bileşenlerin görünürlüğü bu
   öznitelikle yönetildiği için kural burada güçlendirilir. */
[hidden] {
  display: none !important;
}

html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
  scrollbar-gutter: stable;
}

body {
  margin: 0;
  font-family: var(--ok-font);
  font-size: var(--ok-fs-base);
  line-height: var(--ok-lh-base);
  color: var(--ok-text);
  background: var(--ok-bg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd {
  margin: 0;
}

ul, ol {
  margin: 0;
  padding: 0;
}

li {
  list-style: none;
}

h1 {
  font-size: var(--ok-fs-2xl);
  line-height: var(--ok-lh-tight);
  font-weight: var(--ok-fw-semibold);
}

h2 {
  font-size: var(--ok-fs-xl);
  line-height: var(--ok-lh-tight);
  font-weight: var(--ok-fw-semibold);
}

h3 {
  font-size: var(--ok-fs-lg);
  line-height: var(--ok-lh-tight);
  font-weight: var(--ok-fw-semibold);
}

h4 {
  font-size: var(--ok-fs-md);
  line-height: var(--ok-lh-tight);
  font-weight: var(--ok-fw-semibold);
}

h5, h6 {
  font-size: var(--ok-fs-base);
  font-weight: var(--ok-fw-semibold);
}

a {
  color: var(--ok-brand-700);
  text-decoration: none;
}

  a:hover {
    text-decoration: underline;
  }

strong, b {
  font-weight: var(--ok-fw-semibold);
}

small {
  font-size: var(--ok-fs-xs);
}

/* [K-62, 2026-08-19] Kullanıcı kararı: "<hr> üst/alt boşluğu azalsın".
   Dikey kenar boşluğu `--ok-sp-4` (16px) idi; bir ayraç 32px dikey yer kaplıyor ve
   yoğun veri ekranlarında bölüm arası boşluğun (`.ok-form` 8px) dört katına çıkıyordu.
   `--ok-sp-2` (8px) ayracın hâlâ nefes almasını sağlar, ölçüyü token'da tutar.
   Yatay kenar boşluğu 0 kaldı. Uygulama geneli — `hr` her ekranda aynı öğedir. */
hr {
  border: 0;
  border-top: 1px solid var(--ok-border);
  margin: var(--ok-sp-1) 0;
}

.ok-divider {
  border: none;
  height: 2px;
  background: #b0b0b0;
  margin: var(--ok-sp-1) 0;
  border-radius: 2px;
}

/* ---- Ayracın çevresindeki boşluk: TEK DEĞER -------------------------------
   [2026-09-02 — kullanıcı kararı: 4px] Aynı `<hr class="ok-divider">` üç farklı
   boşluk üretiyordu; fark ayracın kendisinden DEĞİL, kapsayıcısından geliyordu.
   Ölçüm (Corporate\Company.cshtml ve Corporate\WorkplaceDetail.cshtml):

     · `.ok-form` (FLEX) içinde   → gap 4px + margin 4px  = 8px / 8px
     · `.ok-card__body` (BLOK)    → yalnız margin         = 4px / **0px**

   Alt boşluğun sıfırlanması Bootstrap'tendir: `.row` negatif üst kenar boşluğu
   taşır (`margin-top: calc(-1 * var(--bs-gutter-y))`), ayraçtan sonra bir `.row`
   geliyorsa 4px'i tam olarak yer. Kullanıcının gördüğü "hiç boşluk yok" budur.

   ⚠️ Legacy `.div-line` 10px/10px veriyordu (`src\OrtakIK\assets\admin\pages\css\
   ortakik.css:170-178`); port sırasında 4px'e düşmüş. Kullanıcı 4px'te karar kıldı,
   yani bu [SAPMA] bilerek korunuyor — ama artık HER KAPSAYICIDA 4px.

   Aşağıdaki iki kural farkı kapatır: blokta yenen alt boşluk geri gelir, flexte
   `gap` zaten 4px verdiği için ayracın kendi kenar boşluğu sıfırlanır.
   Kapsam ölçümü: 94 dosya ayraç kullanıyor, 30'unda hiç `.ok-form` yok. */
.ok-divider + .row {
  margin-top: 0;
}

.ok-form > .ok-divider {
  margin: 0;
}

img, svg, video {
  max-width: 100%;
  height: auto;
  display: block;
}

code, kbd, pre, samp {
  font-family: var(--ok-font-mono);
  font-size: .92em;
}

/* Form öğeleri font mirası almaz — zorluyoruz */
button, input, select, textarea, optgroup {
  font-family: inherit;
  font-size: inherit;
  line-height: inherit;
  color: inherit;
  margin: 0;
}

button {
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
}

textarea {
  resize: vertical;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
  width: 100%;
}

th {
  text-align: start;
  font-weight: var(--ok-fw-semibold);
}

/* --- Odak: fare ile tıklamada halka yok, klavye ile var ------------------ */
:focus {
  outline: none;
}

:focus-visible {
  outline: 2px solid var(--ok-focus-color);
  outline-offset: 2px;
  border-radius: var(--ok-r-sm);
}

::selection {
  background: var(--ok-brand-500);
  color: #FFFFFF;
}

/* --- İnce kaydırma çubuğu (yoğun tablolarda görsel gürültüyü azaltır) --- */
* {
  scrollbar-width: thin;
  scrollbar-color: var(--ok-border-strong) transparent;
}

  *::-webkit-scrollbar {
    width: 10px;
    height: 10px;
  }

  *::-webkit-scrollbar-track {
    background: transparent;
  }

  *::-webkit-scrollbar-thumb {
    background: var(--ok-border-strong);
    border: 3px solid transparent;
    background-clip: content-box;
    border-radius: var(--ok-r-pill);
  }

    *::-webkit-scrollbar-thumb:hover {
      background-color: #9FB0C4;
      background-clip: content-box;
    }

/* --- Ekran okuyucuya özel ---------------------------------------------- */
.ok-sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}
select.ok-sr-only,
input.ok-sr-only,
textarea.ok-sr-only {
  width: 1px;
  min-width: 0;
  height: 1px;
}
/* Klavyeyle odaklanınca görünür hale gelen "içeriğe atla" bağlantısı */
.ok-skip-link {
  position: absolute;
  left: var(--ok-sp-4);
  top: -100px;
  z-index: var(--ok-z-toast);
  padding: var(--ok-sp-2) var(--ok-sp-4);
  background: var(--ok-surface);
  border: 1px solid var(--ok-brand-600);
  border-radius: var(--ok-r-md);
  box-shadow: var(--ok-sh-md);
  font-weight: var(--ok-fw-medium);
  transition: top var(--ok-dur-base) var(--ok-ease);
}

  .ok-skip-link:focus-visible {
    top: var(--ok-sp-3);
    text-decoration: none;
  }

/* --- Başa dön ------------------------------------------------------------ */
.ok-totop {
  position: fixed;
  inset-inline-end: var(--ok-sp-4);
  inset-block-end: var(--ok-sp-4);
  z-index: var(--ok-z-toast);
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  padding: 0;
  border: 1px solid #27323F;
  border-radius: 50%;
  background: #1A2530;
  color: #B4C0CD;
  box-shadow: 0 4px 12px rgba(0, 0, 0, .5), 0 1px 3px rgba(0, 0, 0, .4);
  cursor: pointer;
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--ok-dur-slow) var(--ok-ease),
              visibility var(--ok-dur-slow) var(--ok-ease),
              color var(--ok-dur-base) var(--ok-ease);
}

  .ok-totop.is-visible {
    opacity: .7;
    visibility: visible;
  }

  .ok-totop:hover {
    opacity: 1;
    color: #2E7DD3;
  }

:root[data-theme="dark"] .ok-totop {
  border-color: #E2E8F1;
  background: #FFFFFF;
  color: #4A5A6E;
  box-shadow: 0 4px 12px rgba(16, 32, 56, .10), 0 1px 3px rgba(16, 32, 56, .06);
}

  :root[data-theme="dark"] .ok-totop:hover {
    color: #1B6FD6;
  }

  .ok-totop .ok-icon {
    width: 20px;
    height: 20px;
    stroke-width: 2;
    vertical-align: 0;
  }

/* --- İkon ---------------------------------------------------------------- */
.ok-icon {
  width: 18px;
  height: 18px;
  flex: 0 0 auto;
  fill: none;
  stroke: currentColor;
  stroke-width: 1.6;
  stroke-linecap: round;
  stroke-linejoin: round;
  display: inline-block;
  vertical-align: -.2em;
}

.ok-icon--sm {
  width: 14px;
  height: 14px;
}

.ok-icon--lg {
  width: 22px;
  height: 22px;
}

.ok-icon--xl {
  width: 28px;
  height: 28px;
  stroke-width: 1.5;
}
/* Dolgu gerektiren semboller (ör. uyarı üçgeni) bu sınıfla işaretlenir */
.ok-icon--solid {
  fill: currentColor;
  stroke: none;
}

/* --- Sayısal hizalama ---------------------------------------------------- */
.ok-num {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
  text-align: end;
}

/* --- Metin yardımcıları (sık kullanıldıkları için base'te) --------------- */
.ok-muted {
  color: var(--ok-text-2);
}

.ok-faint {
  color: var(--ok-text-3);
}

.ok-truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

.ok-nowrap {
  white-space: nowrap;
}

.ok-required::after {
  content: "*";
  color: var(--ok-danger);
  margin-inline-start: 2px;
  font-weight: var(--ok-fw-bold);
}

/* ==== layout.css ========================================================= */
/* ==========================================================================
   OrtakİK V2 — Kabuk düzeni
   Üst bar + sol menü + içerik. Eski sistemdeki iframe yapısı YOK.
   Belge doğal olarak kayar; üst bar sabit, sol menü sticky.
   ========================================================================== */

/* ---------- İskelet ------------------------------------------------------ */
.ok-shell {
  display: grid;
  grid-template-columns: auto 1fr;
  grid-template-areas: "sidebar main";
  min-height: 100vh;
  /* Kabuğun arkası (en arkadaki plan) `--ok-page-bg` okur; `body` base.css'te
     `--ok-bg` okuyor ve o değer giriş ekranı içindir. Kabuk ayrı token
     kullanır ki bu satırdaki karar auth.css'i etkilemesin.
     [2026-08-19 — kullanıcı kararı] Zemin GRİ, içerik beyaz. (K-49'da tersiydi;
     değer tokens.css'te çevrildi, bu satır değişmedi.) */
  background: var(--ok-page-bg);
}

/* ==========================================================================
   ÜST BAR
   [2026-08-18] Kullanıcı kararı: "üstteki bar background rengi de soldaki
   menü gibi olsun". Zemin beyazdan koyu lacivere döndüğü için barın İÇİNDEKİ
   her ön plan öğesi yeniden renklendirildi — aksi hâlde `--ok-text-2` /
   `--ok-brand-700` gibi açık zemine ayarlı renkler koyu barda okunmaz olur.
   Renkler `--ok-topbar-*` token'larından okunur; o token'lar da tokens.css'te
   `--ok-sidebar-*`'tan türetilir. Buraya ham renk yazılmaz.
   ========================================================================== */
.ok-topbar {
  position: fixed;
  inset: 0 0 auto 0;
  height: var(--ok-topbar-h);
  z-index: var(--ok-z-topbar);
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding-inline: var(--ok-sp-3);
  background: var(--ok-topbar-bg);
  /* Koyu zeminde `--ok-border` (#E2E8F1) görünmez/parlak bir çizgi olurdu */
  border-bottom: 1px solid var(--ok-topbar-border);
  box-shadow: var(--ok-topbar-shadow);
  color: var(--ok-topbar-fg);
  /* Odak halkası `--ok-brand-600` idi; koyu lacivert üzerinde ~2.4:1 ile
     görünmez kalıyordu. Bar bağlamında açık mavi aksana çevrilir (~5.9:1). */
  --ok-focus-color: var(--ok-topbar-accent);
}

  /* Üst barın İÇİNDE duran ama BEYAZ yüzeyde açılan katmanlar (kullanıcı
   menüsü, dil menüsü) barın koyu renk bağlamını miras almamalı: `.ok-menu`
   kendi zeminini `--ok-surface` ile kurar, metin rengini ise büyük ölçüde
   miras alır. Bu kural o bağlamı açık temaya geri döndürür. */
  .ok-topbar .ok-menu {
    color: var(--ok-text);
    --ok-focus-color: var(--ok-brand-600);
  }

.ok-topbar__brand {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  min-width: 0;
  flex: 0 0 auto;
  text-decoration: none;
  color: var(--ok-topbar-fg-strong);
}

  .ok-topbar__brand:hover {
    text-decoration: none;
  }
/* Legacy `logo.png` (doğal ölçü 160x40). Bar yüksekliği 56px; 40px'lik doğal
   yükseklik üstte/altta yalnız 8px bırakıp barı sıkıştırıyordu. 32px, oranı
   bozmadan (width:auto → 128px) üstte-altta 12px nefes bırakır ve KÜÇÜLTME
   yönünde ölçeklediği için bulanıklaşmaz. */
.ok-topbar__logo-img {
  display: block;
  height: 32px;
  width: auto;
  max-width: 100%;
  object-fit: contain;
}

/* Menü aç/kapa düğmesi */
.ok-topbar__toggle {
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: var(--ok-r-md);
  color: var(--ok-topbar-fg);
  flex: 0 0 auto;
}

  .ok-topbar__toggle:hover {
    background: var(--ok-topbar-hover);
    color: var(--ok-topbar-fg-strong);
  }

/* Şirket adı / logosu — çok kiracılı sistemde hangi şirkette olduğun kritik */
.ok-topbar__company {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  padding: var(--ok-sp-1) var(--ok-sp-3);
  border-inline-start: 1px solid var(--ok-topbar-border);
  min-width: 0;
  color: var(--ok-topbar-fg-dim);
  text-decoration: none;
}

  .ok-topbar__company:hover {
    text-decoration: none;
    color: var(--ok-topbar-fg-strong);
  }

.ok-topbar__company-name {
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-topbar-fg-strong);
  font-size: var(--ok-fs-sm);
}

.ok-topbar__company-logo {
  display: block;
  max-height: 28px;
  max-width: 160px;
  width: auto;
  height: auto;
  object-fit: contain;
}

.ok-topbar__company-code {
  font-size: var(--ok-fs-xs);
  color: var(--ok-topbar-fg-dim);
  font-variant-numeric: tabular-nums;
}

.ok-topbar__spacer {
  flex: 1 1 auto;
  min-width: 0;
}

.ok-topbar__actions {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-1);
  flex: 0 0 auto;
}

/* Bordro dönemi seçici — eski sistemde de üst barda duran mavi "pill".
   G1712 + D1353 yetkisi olmayan kullanıcıda gizlenir (data-aut).
   [2026-08-18] Koyu bara geçişte `--ok-brand-50` dolgu + `--ok-brand-700`
   metin (açık zemin kurgusu) barda parlayan bir "delik" yapıyordu. Legacy'de
   bu düğme zaten koyu mavi zemin üzerinde beyazdı
   (`src\OrtakIK\Default.aspx:169` — `color:#fff; background-color:#1486ff`),
   yani dolu mavi + beyaz metin hem parite hem okunabilirlik açısından doğru
   (beyaz / #1B6FD6 ≈ 4.9:1). */
.ok-period {
  display: inline-flex;
  align-items: center;
  gap: var(--ok-sp-2);
  height: var(--ok-ctrl-h);
  padding-inline: var(--ok-sp-3);
  border: 1px solid var(--ok-topbar-active);
  border-radius: var(--ok-r-pill);
  background: var(--ok-topbar-active);
  color: var(--ok-text-on-brand);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-semibold);
  white-space: nowrap;
  cursor: pointer;
  transition: background var(--ok-dur-fast) var(--ok-ease), border-color var(--ok-dur-fast) var(--ok-ease);
}

  .ok-period:hover {
    background: var(--ok-brand-500);
    border-color: var(--ok-brand-500);
  }

/* İkon düğmesi (dil, bildirim, yardım) */
.ok-topbar__icon-btn {
  position: relative;
  display: grid;
  place-items: center;
  width: 34px;
  height: 34px;
  border-radius: var(--ok-r-md);
  color: var(--ok-topbar-fg);
}

  .ok-topbar__icon-btn:hover {
    background: var(--ok-topbar-hover);
    color: var(--ok-topbar-fg-strong);
  }

  .ok-topbar__icon-btn[aria-expanded="true"] {
    background: var(--ok-topbar-open);
    color: var(--ok-topbar-fg-strong);
  }
/* [2026-08-18] A iş kolu bildirim düğmesini üst bardan kaldırıyor; bu sınıfın
   tek kullanıcısı o düğmeydi (shell.js:134). ADAY ÖLÜ KURAL — silinmedi,
   silme kararı orkestratörün. Kırmızı rozet zeminini kendisi bastığı için
   koyu barda da okunur (beyaz / #C62F26 ≈ 5.9:1). */
.ok-topbar__badge {
  position: absolute;
  top: 3px;
  inset-inline-end: 3px;
  min-width: 16px;
  height: 16px;
  padding-inline: 4px;
  border-radius: var(--ok-r-pill);
  background: var(--ok-danger);
  color: #fff;
  font-size: 10px;
  font-weight: var(--ok-fw-bold);
  line-height: 16px;
  text-align: center;
  font-variant-numeric: tabular-nums;
}

/* Kullanıcı düğmesi — yalnız üst barda kullanılır (shell.js:148) */
.ok-user-btn {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  height: 40px;
  padding: 0 var(--ok-sp-2);
  border-radius: var(--ok-r-md);
  color: var(--ok-topbar-fg-strong);
  max-width: 220px;
}

  .ok-user-btn:hover {
    background: var(--ok-topbar-hover);
  }

  .ok-user-btn[aria-expanded="true"] {
    background: var(--ok-topbar-open);
  }

@media (max-width: 480px) {
  .ok-topbar__actions:has(.ok-period) .ok-user-btn {
    padding-inline: 4px;
  }

  .ok-topbar__actions:has(.ok-period) .ok-user-btn > svg {
    display: none;
  }
}

.ok-avatar {
  width: 30px;
  height: 30px;
  border-radius: var(--ok-r-pill);
  background: var(--ok-brand-100);
  color: var(--ok-brand-700);
  display: grid;
  place-items: center;
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-bold);
  flex: 0 0 auto;
  overflow: hidden;
  border: 1px solid var(--ok-brand-200);
}

  .ok-avatar img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
/* Üst bardaki avatar. Kapsam bilerek `.ok-user-btn >` ile daraltıldı: aynı
   `.ok-avatar` sınıfı kullanıcı menüsünün kimlik bloğunda da (ok-avatar--lg,
   BEYAZ panel üzerinde) kullanılıyor ve o DOM olarak `.ok-topbar` içinde
   duruyor — `.ok-topbar .ok-avatar` yazmak onu da bozardı. */
.ok-user-btn > .ok-avatar {
  background: var(--ok-topbar-hover);
  color: var(--ok-topbar-fg-strong);
  border-color: var(--ok-topbar-border);
}

.ok-user-btn__text {
  min-width: 0;
  flex: 1 1 auto;
  display: block;
  text-align: start;
  line-height: 1.2;
  overflow: hidden;
}

.ok-user-btn__name {
  display: block;
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-semibold);
}

.ok-user-btn__role {
  display: block;
  font-size: var(--ok-fs-xs);
  /* `--ok-text-3` (#7C8A9C) koyu barda ~2.5:1 idi; `--ok-topbar-fg-dim` ~4.8:1 */
  color: var(--ok-topbar-fg-dim);
}

/* ==========================================================================
   SOL MENÜ
   ========================================================================== */
/* [K-51] Koyu tema. Renkler tokens.css'teki `--ok-sidebar-*` değişkenlerinden
   okunur; buraya ham renk yazılmaz. Menü kendi renk bağlamını kurduğu için
   içindeki bileşenler (`.ok-input`, `.ok-btn--ghost`) de burada uyarlanır —
   aksi hâlde beyaz zeminli varsayılanlarıyla koyu menüde parlarlar. */
.ok-sidebar {
  grid-area: sidebar;
  width: var(--ok-sidebar-w);
  margin-top: var(--ok-topbar-h);
  position: sticky;
  top: var(--ok-topbar-h);
  height: calc(100vh - var(--ok-topbar-h));
  display: flex;
  flex-direction: column;
  background: var(--ok-sidebar-bg);
  border-inline-end: 1px solid var(--ok-sidebar-bg);
  color: var(--ok-sidebar-fg);
  z-index: var(--ok-z-sidebar);
  transition: width var(--ok-dur-base) var(--ok-ease);
  /* İnce kaydırma çubuğu base.css'te açık zemine göre ayarlı; koyu menüde
     görünmez oluyordu. */
  scrollbar-color: rgba(255, 255, 255, .28) transparent;
}

  .ok-sidebar *::-webkit-scrollbar-thumb {
    background: rgba(255, 255, 255, .28);
  }

/* Menü arama — eski sistemde yok, 150 menü öğesi için eklendi */
.ok-sidebar__search {
  padding: var(--ok-sp-3) var(--ok-sp-3) var(--ok-sp-2);
  border-bottom: 1px solid var(--ok-sidebar-border);
  flex: 0 0 auto;
}

  .ok-sidebar__search .ok-input {
    background: var(--ok-sidebar-field);
    border-color: var(--ok-sidebar-border);
    color: var(--ok-sidebar-fg-strong);
  }

    .ok-sidebar__search .ok-input::placeholder {
      color: var(--ok-sidebar-fg-dim);
    }

    .ok-sidebar__search .ok-input:focus {
      background: rgba(255, 255, 255, .16);
      border-color: var(--ok-sidebar-accent);
    }

  .ok-sidebar__search .ok-icon {
    color: var(--ok-sidebar-fg-dim);
  }

.ok-sidebar__nav {
  flex: 1 1 auto;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: var(--ok-sp-2) var(--ok-sp-2) var(--ok-sp-6);
}
/* ⚠️ ÖLÜ KURAL (2026-08-19). `ok-sidebar__foot` işaretlemesini üreten tek yer
   shell.js `renderSidebar()` idi; "Menüyü daralt" satırı kullanıcı kararıyla
   kaldırıldı (işlev üst bardaki hamburger düğmesinde). Kural, bir sayfa kendi
   menü ayağını eklerse diye ve ölü kod kaldırma kararı orkestratöre ait olduğu
   için silinmedi — bkz. shell.js'teki aynı gerekçeli notlar. */
.ok-sidebar__foot {
  flex: 0 0 auto;
  padding: var(--ok-sp-2);
  border-top: 1px solid var(--ok-sidebar-border);
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
}

  .ok-sidebar__foot .ok-btn {
    color: var(--ok-sidebar-fg);
  }

    .ok-sidebar__foot .ok-btn:hover {
      background: var(--ok-sidebar-hover);
      color: var(--ok-sidebar-fg-strong);
    }

/* -- Menü öğeleri --
   [2026-08-19] Satır arası dikey boşluk ölçülü biçimde azaltıldı (kullanıcı kararı):
   14 üst + 136 alt menüde tarama mesafesi kısalsın diye. Değişenler yalnız DİKEY
   ölçüler — yatay dolgu, ikon boşluğu ve tıklama alanının genişliği aynı kaldı:
     .ok-nav__group  alt boşluk  2px → 1px
     .ok-nav__link   dikey dolgu 8px → 6px  (satır yüksekliği ~34px → ~30px)
     .ok-nav__sublink dikey dolgu 6px → 4px
     .ok-nav__sub    alt boşluk  16px → 8px  (grup arası ayrım korunuyor) */
.ok-nav__group {
  margin-bottom: 1px;
}

.ok-nav__link {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  width: 100%;
  padding: 6px var(--ok-sp-3);
  border-radius: var(--ok-r-md);
  color: var(--ok-sidebar-fg);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  text-align: start;
  text-decoration: none;
  position: relative;
  transition: background var(--ok-dur-fast) var(--ok-ease), color var(--ok-dur-fast) var(--ok-ease);
}

  .ok-nav__link:hover {
    background: var(--ok-sidebar-hover);
    color: var(--ok-sidebar-fg-strong);
    text-decoration: none;
  }

  .ok-nav__link > .ok-icon {
    color: var(--ok-sidebar-fg-dim);
    transition: color var(--ok-dur-fast) var(--ok-ease);
  }

  .ok-nav__link:hover > .ok-icon {
    color: var(--ok-sidebar-fg-strong);
  }

.ok-nav__text {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ok-nav__arrow {
  flex: 0 0 auto;
  color: var(--ok-sidebar-fg-dim);
  transition: transform var(--ok-dur-base) var(--ok-ease);
}

.ok-nav__link[aria-expanded="true"] {
  color: var(--ok-sidebar-fg-strong);
}

  .ok-nav__link[aria-expanded="true"] > .ok-nav__arrow {
    transform: rotate(180deg);
  }

  .ok-nav__link[aria-expanded="true"] > .ok-icon {
    color: var(--ok-sidebar-fg-strong);
  }

/* Alt menü — TA_RESOURCES'ta alt menülerin CICON değeri boş, bu yüzden ikonsuz */
.ok-nav__sub {
  overflow: hidden;
  margin: 2px 0 var(--ok-sp-1);
  padding-inline-start: calc(var(--ok-sp-3) + 9px);
  border-inline-start: 1px solid var(--ok-sidebar-border);
  margin-inline-start: calc(var(--ok-sp-3) + 9px);
}

  .ok-nav__sub[hidden] {
    display: none;
  }

.ok-nav__sublink {
  display: block;
  padding: 4px var(--ok-sp-3);
  border-radius: var(--ok-r-sm);
  color: var(--ok-sidebar-fg);
  font-size: var(--ok-fs-sm);
  text-decoration: none;
  position: relative;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

  .ok-nav__sublink:hover {
    background: var(--ok-sidebar-hover);
    color: var(--ok-sidebar-fg-strong);
    text-decoration: none;
  }

  /* Aktif durum: canlı mavi dolgu + açık mavi sol şerit.
   [K-51] Eskiden `--ok-brand-50` (neredeyse beyaz) dolgu + koyu mavi metindi;
   koyu zeminde bu bir "delik" gibi duruyor ve metni okunmaz yapıyordu. */
  .ok-nav__sublink.is-active,
  .ok-nav__link.is-active {
    background: var(--ok-sidebar-active);
    color: var(--ok-sidebar-fg-strong);
    font-weight: var(--ok-fw-semibold);
  }

    .ok-nav__sublink.is-active:hover,
    .ok-nav__link.is-active:hover {
      background: var(--ok-brand-500);
      color: var(--ok-sidebar-fg-strong);
    }

    .ok-nav__sublink.is-active::before,
    .ok-nav__link.is-active::before {
      content: "";
      position: absolute;
      inset-inline-start: 0;
      top: 50%;
      translate: 0 -50%;
      width: 3px;
      height: 60%;
      border-radius: 0 var(--ok-r-pill) var(--ok-r-pill) 0;
      background: var(--ok-sidebar-accent);
    }

    .ok-nav__link.is-active > .ok-icon {
      color: var(--ok-sidebar-fg-strong);
    }

/* Arama eşleşmesi vurgusu */
.ok-nav mark {
  background: #FFF1A8;
  color: #16202E; /* koyu menüde `inherit` açık metni sarı üzerine koyardı */
  border-radius: 2px;
  padding: 0;
}

.ok-nav__empty {
  padding: var(--ok-sp-4) var(--ok-sp-3);
  color: var(--ok-sidebar-fg-dim);
  font-size: var(--ok-fs-sm);
  text-align: center;
}

/* -- Daraltılmış (rail) mod: yalnız ikonlar, üzerine gelince uçan alt menü -- */
[data-sidebar="rail"] {
  --ok-sidebar-w: var(--ok-sidebar-rail-w);
}

  [data-sidebar="rail"] .ok-sidebar__search,
  [data-sidebar="rail"] .ok-nav__text,
  [data-sidebar="rail"] .ok-nav__arrow {
    display: none;
  }

  [data-sidebar="rail"] .ok-nav__link {
    justify-content: center;
    padding-inline: 0;
  }

  [data-sidebar="rail"] .ok-nav__sub {
    display: none;
  }

  [data-sidebar="rail"] .ok-nav__group:hover > .ok-nav__sub {
    display: block;
    position: fixed;
    inset-inline-start: var(--ok-sidebar-rail-w);
    min-width: 240px;
    margin: 0;
    padding: var(--ok-sp-2);
    /* Rail modunda uçan alt menü de menünün parçası — koyu kalır (K-51). */
    background: var(--ok-sidebar-bg);
    border: 1px solid var(--ok-sidebar-border);
    border-radius: var(--ok-r-lg);
    box-shadow: var(--ok-sh-lg);
    z-index: var(--ok-z-dropdown);
    max-height: 70vh;
    overflow-y: auto;
  }

/* -- Mobil: kayar panel (drawer) -- */
.ok-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(16, 32, 56, .42);
  z-index: var(--ok-z-backdrop);
  opacity: 0;
  animation: ok-fade-in var(--ok-dur-base) var(--ok-ease) forwards;
}

@keyframes ok-fade-in {
  to {
    opacity: 1;
  }
}

/* ==========================================================================
   ANA ALAN
   ========================================================================== */
.ok-main {
  grid-area: main;
  margin-top: var(--ok-topbar-h);
  min-width: 0;
  display: flex;
  flex-direction: column;
}

.ok-gomulu {
  background: var(--ok-page-bg);
}

.ok-gomulu .ok-main {
  margin-top: 0;
}

.ok-gomulu .ok-page-head__actions {
  justify-content: flex-end;
}

.ok-modal--hizli-tanim .ok-modal__body {
  padding: 0;
  overflow: hidden;
}

.ok-modal--secim .ok-modal__body {
  min-height: 400px;
}

.ok-hizli-tanim__cerceve {
  display: block;
  width: 100%;
  height: min(72vh, 680px);
  border: 0;
}

/* [K-50] İçerik alanı dört yandan da genişletildi: dış dolgu küçüldükçe
   panel büyür. Eski değerler 16/20/40px idi ve özellikle yanlarda 20px'lik
   şerit, geniş listelerde kolon sığdırmayı zorlaştırıyordu. */
.ok-content {
  flex: 1 1 auto;
  width: 100%;
  max-width: var(--ok-content-max);
  margin-inline: auto;
  /* [K-55, 2026-08-19] Sayfa dikey iç boşluğu 12/24 → 8/20. Yatay 12px KALDI. */
  /* [2026-08-22 — kullanıcı kararı] Dört yan da 8px'e eşitlendi (eski 8/12/20).
     Kullanıcı değeri `wwwroot` aynasında denedi; kalıcı olsun diye kaynağa taşındı. */
  padding: var(--ok-sp-1) var(--ok-sp-1) var(--ok-sp-1);
  min-width: 0;
}
/* Tam genişlik gereken ekranlar (puantaj matrisi, geniş raporlar) */
.ok-content--wide {
  max-width: none;
}

/* -- Sayfa başlığı: breadcrumb + başlık + aksiyonlar -- */
.ok-page-head {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--ok-sp-4);
  flex-wrap: wrap;
  margin-bottom: var(--ok-sp-3); /* K-55: 16 → 12 */
  margin-left: var(--ok-sp-2);
}

.ok-page-head__text {
  min-width: 0;
}
/* Aksiyonlar HER ZAMAN sağda. `space-between` yalnız iki çocuk varken sağa yaslar;
   başlık bloğu basılmayan ekranlarda (K-36) tek çocuk kalıyor ve düğmeler sola
   düşüyordu. `margin-inline-start: auto` iki durumda da doğru sonucu verir. */
.ok-page-head__actions {
  margin-inline-start: auto;
}

/* Kırıntı yolu bu bloğa taşındığında (K-40, admin-shell.js) hizalama tabandan
   ortaya alınır: kırıntı tek satırlık ince bir metin, düğmeler ise yüksek —
   `flex-end` kırıntıyı düğmelerin altına yapıştırırdı. Alt boşluk da küçülür,
   çünkü artık iki satır değil tek satır var. */
.ok-page-head--with-crumbs {
  align-items: center;
}

  .ok-page-head--with-crumbs > .ok-crumbs {
    margin-bottom: 0;
  }

.ok-page-title {
  font-size: var(--ok-fs-xl);
  font-weight: var(--ok-fw-semibold);
  line-height: var(--ok-lh-tight);
  letter-spacing: -.01em;
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
}

.ok-page-desc {
  margin-top: var(--ok-sp-1);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
}

.ok-page-head__actions {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

/* -- Breadcrumb: eski sistemde yok, CPARENT_CODE zincirinden üretiliyor -- */
.ok-crumbs {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--ok-sp-1);
  margin-bottom: var(--ok-sp-3);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
  background: var(--ok-surface-sunk);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
  padding: 6px 12px;
}
  /* Boş kırıntı yer kaplamaz. Ana sayfada `renderCrumbs()` artık hiçbir öğe basmıyor
   (kullanıcı kararı 2026-08-19); `display: flex` + `margin-bottom` yüzünden boş
   `<nav>` yine de "Merhaba …" başlığının üstünde 8px'lik bir boşluk bırakıyordu.
   `display: none` aynı zamanda öğeyi flex akışından çıkarır — göç tarafında kırıntı
   `.ok-page-head` içine taşındığında (admin-shell.js) `gap` da uygulanmaz. */
  .ok-crumbs:empty {
    display: none;
  }

  .ok-crumbs a {
    color: var(--ok-text-2);
  }

    .ok-crumbs a:hover {
      color: var(--ok-brand-700);
    }

.ok-crumbs__sep {
  color: var(--ok-text);
}

.ok-crumbs [aria-current="page"] {
  color: var(--ok-text);
  font-weight: var(--ok-fw-medium);
}

/* ==========================================================================
   IZGARA YARDIMCILARI — form ve pano düzenleri
   Bootstrap col-md-* yerine anlamsal kolon sayısı.
   ========================================================================== */
.ok-grid {
  display: grid;
  gap: var(--ok-sp-4);
}

.ok-grid--2 {
  grid-template-columns: repeat(2, minmax(0, 1fr));
}
/* [K-74, 2026-08-20] 2:3 — solda form, sağda veri tablosu olan sekmeler için.
   `emp-detail` sekmelerinin çoğu solda `.ok-fields` formu, sağda `table.ok-grid`
   taşıyor; `--2`'nin 1:1 oranında tablo dar kalıyordu (kullanıcı isteği 2026-08-20).
   `repeat(5, minmax(0, 1fr))` + `grid-column: span n` yerine doğrudan iki izli
   `2fr 3fr`: sonuç piksel piksel aynı, ama işaretleme tarafında TEK sınıf değişimi
   yetiyor — çocuklara ayrıca `grid-column` vermek gerekmiyor.
   `minmax(0, …)` ŞART, `--2…--4` ile aynı gerekçe: ızgara çocuğunun varsayılan
   `min-width: auto` değeri, sağdaki geniş tablonun kendi izini 3fr'nin ötesine
   itmesine ve sol formu ezmesine yol açar. */
.ok-grid--2-3 {
  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);
}

@media (max-width: 1200px) {
  /* [K-74] 2:3 burada 1:1'e döner — iki sütun 860'a kadar korunur, yalnız oran eşitlenir.
     Ölçüm (2026-08-20; sol sütunda `.ok-fields--1`, 150px etiket izi, içerik genişliği
     `viewport − 288`): 1201px'te sol iz 359px ve tarih denetimi tasarım tabanı olan
     190px'i (forms.css "dar denetimler") tam tutuyor. 1200'ün altında 2fr payı 352px
     eşiğinin altına iner ve tarih/seçim denetimleri eziliyor — ölçülen: 1100px'te 156px,
     920px'te 169px, 1025px'te 126px. Bu blok zaten `--3/--4`'ün sütun düşürdüğü ve
     `.ok-split`'in daraldığı kırılım; `--2-3` de aynı yere bağlandı. */
  .ok-grid--2-3 {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

@media (max-width: 1024px) {
  :root {
    --ok-sidebar-w: var(--ok-sidebar-rail-w);
  }
  /* K-50 sonrası taban dolgu zaten 12px; dar ekranda daha da daralır. */
  .ok-content {
    padding-inline: var(--ok-sp-2);
  }

  .ok-topbar__company-code {
    display: none;
  }
}

@media (max-width: 860px) {
  .ok-shell {
    grid-template-columns: 1fr;
    grid-template-areas: "main";
  }

  .ok-sidebar {
    position: fixed;
    inset-block: var(--ok-topbar-h) 0;
    inset-inline-start: 0;
    width: min(300px, 84vw);
    margin-top: 0;
    height: auto;
    z-index: calc(var(--ok-z-backdrop) + 1);
    transform: translateX(-102%);
    box-shadow: var(--ok-sh-lg);
    transition: transform var(--ok-dur-base) var(--ok-ease);
  }

  [dir="rtl"] .ok-sidebar {
    transform: translateX(102%);
  }

  [data-sidebar="open"] .ok-sidebar {
    transform: none;
  }
  /* Mobilde rail modu anlamsız — tam menü göster */
  [data-sidebar] .ok-sidebar {
    --ok-sidebar-w: min(300px, 84vw);
  }

  [data-sidebar="rail"] .ok-sidebar__search,
  [data-sidebar="rail"] .ok-nav__text,
  [data-sidebar="rail"] .ok-nav__arrow {
    display: revert;
  }

  [data-sidebar="rail"] .ok-nav__link {
    justify-content: flex-start;
    padding-inline: var(--ok-sp-3);
  }

  [data-sidebar="rail"] .ok-nav__group:hover > .ok-nav__sub {
    position: static;
    box-shadow: none;
    border: 0;
    min-width: 0;
  }

  .ok-grid--2, .ok-grid--2-3 {
    grid-template-columns: 1fr;
  }

  .ok-topbar__company {
    display: none;
  }

  .ok-user-btn__text {
    display: none;
  }

  .ok-page-head {
    align-items: stretch;
  }

  .ok-page-head__actions {
    width: 100%;
  }
}

@media (max-width: 640px) {
  .ok-content {
    padding: var(--ok-sp-2) var(--ok-sp-2) var(--ok-sp-6);
  }

  .ok-page-title {
    font-size: var(--ok-fs-lg);
  }
}

/* ── Ara ekran (başlatıcı) düğme listesi ────────────────────────────────────
   Bazı ekranlar hiç veri göstermez, yalnız başka ekranlara giden bir düğme
   listesi taşır: `budget-operations`, `emp-integrations`, `law-settings`
   (hem Settings hem Budget), `leave-integrations`. Legacy'de bunlar
   `.form-actions.text-center` içinde alt alta `LinkButton`'lardı.

   İlk portta `.ok-grid--2` kullanıldı (iki sütun); kullanıcı 2026-08-21'de
   reddetti: *"bu butonları ekranı ortalayacak şekilde yukardan aşağı her
   satıra bir buton gelicek şekilde koy"*.

   `.ok-launcher` = tek sütun + ortalanmış + okunabilir genişlikte kap.
   ⚠️ `max-width` olmadan `.ok-btn--block` düğmeleri ekran genişliğinde uzar ve
   1600px'lik bir monitörde tıklanabilir alan saçma boyuta çıkar.
   ⚠️ Dar ekranda `max-width` zaten `100%`'e iner; ayrı bir kırılım gerekmiyor. */
.ok-launcher {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--ok-sp-2);
  max-width: 420px;
  margin-inline: auto;
}

@media (max-width: 640px) {
  .ok-launcher {
    grid-template-columns: minmax(0, 1fr);
  }

  .ok-launcher > .ok-btn {
    white-space: normal;
    height: auto;
    min-height: 42px;
    padding-block: 8px;
    line-height: 1.25;
    text-align: center;
  }
}

/* ==== components/buttons.css ============================================= */
/* ==========================================================================
   Butonlar
   Legacy'deki aksiyon çubuğu sözlüğünü karşılar:
   Geri Dön · Yardım · Sil · Kaydet · Güncelle · Yeni Kayıt · Excel · Görüntüle ·
   Ara · Kopyala · Entegrasyon · Rapor Al · Seçilenleri Sil
   ========================================================================== */

.ok-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--ok-sp-2);
  height: var(--ok-ctrl-h);
  padding-inline: var(--ok-sp-4);
  border: 2px solid;
  border-radius: 4px;
  background: var(--ok-surface);
  color: var(--ok-text);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  line-height: 1;
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
  text-decoration: none;
  transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}

  .ok-btn:hover {
    text-decoration: none;
  }

  .ok-btn:active {
    transform: translateY(1px);
  }

  .ok-btn:disabled,
  .ok-btn.is-disabled {
    opacity: .5;
    cursor: not-allowed;
    pointer-events: none;
  }

  .ok-btn > .ok-icon {
    margin-block: -2px;
  }

/* -- Birincil: sayfada tek bir tane olmalı -- */
.ok-btn--primary {
  background: var(--ok-btn-primary-bg);
  border-color: var(--ok-btn-primary-bg);
  color: #ffffff;
  box-shadow: 0 4px 12px rgba(13, 91, 192, 0.3);
}

  .ok-btn--primary:hover {
    background: var(--ok-btn-primary-bg-hover);
    border-color: var(--ok-btn-primary-bg-hover);
    box-shadow: 0 6px 16px rgba(13, 91, 192, 0.4);
    filter: brightness(1.1);
  }

  .ok-btn--primary:active {
    box-shadow: 0 2px 8px rgba(13, 91, 192, 0.3);
  }

/* -- İkincil: kenarlıklı, en yaygın kullanım -- */
.ok-btn--secondary {
  background: #f5f5f5;
  border-color: #0D5BC0;
  color: #0D5BC0;
  box-shadow: 0 2px 8px rgba(13, 91, 192, 0.15);
}

  .ok-btn--secondary:hover {
    background: #e8f1ff;
    border-color: #0a4599;
    color: #0a4599;
    box-shadow: 0 4px 12px rgba(13, 91, 192, 0.25);
  }

/* -- Sessiz: araç çubuklarında, kart başlıklarında -- */
.ok-btn--ghost {
  background: transparent;
  border-color: #0D5BC0;
  color: #0D5BC0;
  box-shadow: none;
}

  .ok-btn--ghost:hover {
    background: #e8f1ff;
    box-shadow: 0 2px 8px rgba(13, 91, 192, 0.2);
  }

/* -- Yumuşak mavi: ikincil ama dikkat çekmesi gereken (Rapor Al, Hesapla) -- */
.ok-btn--soft {
  background: #e8f1ff;
  border-color: #c5dffe;
  color: #0D5BC0;
  box-shadow: 0 2px 6px rgba(13, 91, 192, 0.12);
}

  .ok-btn--soft:hover {
    background: #d1e7ff;
    border-color: #0D5BC0;
    box-shadow: 0 3px 10px rgba(13, 91, 192, 0.2);
  }

/* -- Aç/kapa: filtre çipi, görünüm seçici. Basılı durum `aria-pressed` ile -- */
.ok-btn--toggle[aria-pressed="true"] {
  background: #12941F;
  border-color: #12941F;
  color: #ffffff;
}

.ok-btn__count {
  font-family: var(--ok-font-mono);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
}

  .ok-btn--toggle[aria-pressed="true"] .ok-btn__count {
    color: rgba(255, 255, 255, .82);
  }

/* -- Yatay kaydırılan düğme şeridi: dar ekranda taşmaz, kaydırılır -- */
.ok-chipbar {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  min-width: 0;
  overflow-x: auto;
  padding-bottom: var(--ok-sp-2);
  margin-bottom: var(--ok-sp-2);
  border-bottom: 1px solid var(--ok-border);
}

  .ok-chipbar > .ok-btn {
    flex: 0 0 auto;
  }


/* -- Yıkıcı: Sil, Seçilenleri Sil -- */
.ok-btn--danger {
  background: var(--ok-btn-danger-bg);
  border-color: var(--ok-btn-danger-bg);
  color: #ffffff;
  box-shadow: 0 4px 12px rgba(196, 28, 28, 0.3);
}

  .ok-btn--danger:hover {
    background: var(--ok-btn-danger-bg-hover);
    border-color: var(--ok-btn-danger-bg-hover);
    box-shadow: 0 6px 16px rgba(196, 28, 28, 0.4);
    filter: brightness(1.1);
  }

  .ok-btn--danger:active {
    box-shadow: 0 2px 8px rgba(196, 28, 28, 0.3);
  }

.ok-btn--danger-solid {
  background: var(--ok-btn-danger-bg);
  border-color: var(--ok-btn-danger-bg);
  color: #fff;
  box-shadow: 0 4px 12px rgba(196, 28, 28, 0.3);
}

  .ok-btn--danger-solid:hover {
    background: var(--ok-btn-danger-bg-hover);
    box-shadow: 0 6px 16px rgba(196, 28, 28, 0.4);
    filter: brightness(1.1);
  }

.btn-warning {
  --bs-btn-bg: #E8871E;
  --bs-btn-border-color: #E8871E;
  --bs-btn-color: #fff;
  --bs-btn-hover-bg: #D0741A;
  --bs-btn-hover-border-color: #D0741A;
  --bs-btn-hover-color: #fff;
  --bs-btn-active-bg: #B8651A;
  --bs-btn-active-border-color: #B8651A;
  --bs-btn-active-color: #fff;
  --bs-btn-disabled-bg: #E8871E;
  --bs-btn-disabled-border-color: #E8871E;
  --bs-btn-disabled-color: #fff;
  background: #E8871E;
  border-color: #E8871E;
  color: #fff;
  box-shadow: 0 4px 12px rgba(232, 135, 30, 0.3);
}

  .btn-warning:hover {
    background: #D0741A;
    border-color: #D0741A;
    color: #fff;
    filter: brightness(1.05);
  }

/* -- Onay: Onayla, Kaydet ve Devam -- */
.ok-btn--success {
  background: var(--ok-btn-success-bg);
  border-color: var(--ok-btn-success-bg);
  color: #ffffff;
  box-shadow: 0 4px 12px rgba(15, 122, 26, 0.3);
}

  .ok-btn--success:hover {
    background: var(--ok-btn-success-bg-hover);
    border-color: var(--ok-btn-success-bg-hover);
    box-shadow: 0 6px 16px rgba(15, 122, 26, 0.4);
    filter: brightness(1.1);
  }

  .ok-btn--success:active {
    box-shadow: 0 2px 8px rgba(15, 122, 26, 0.3);
  }

/* -- Boyutlar -- */
.ok-btn--sm {
  height: 28px;
  padding-inline: 12px;
  font-size: 12px;
}

.ok-btn--lg {
  height: 42px;
  padding-inline: 24px;
  font-size: 16px;
  font-weight: 600;
}

.ok-btn--block {
  width: 100%;
}

/* -- Yalnız ikon -- */
.ok-btn--icon {
  width: var(--ok-ctrl-h);
  padding-inline: 0;
}

  .ok-btn--icon.ok-btn--sm {
    width: var(--ok-ctrl-h-sm);
  }

/* -- Satır içi aksiyon: grid satır sonundaki 30px ikonların karşılığı -- */
.ok-act {
  display: inline-grid;
  place-items: center;
  width: 26px;
  height: 26px;
  border-radius: var(--ok-r-sm);
  color: var(--ok-text-2);
  background: transparent;
  border: 1px solid transparent;
  transition: background var(--ok-dur-fast) var(--ok-ease), color var(--ok-dur-fast) var(--ok-ease);
}

  .ok-act:hover {
    background: var(--ok-brand-50);
    color: var(--ok-brand-700);
    border-color: var(--ok-brand-100);
  }

.ok-act--danger:hover {
  background: var(--ok-danger-bg);
  color: var(--ok-danger);
  border-color: var(--ok-danger-br);
}

.ok-act > .ok-icon {
  width: 15px;
  height: 15px;
}

/* -- Buton grubu: birleşik kenarlıklar -- */
.ok-btn-group {
  display: inline-flex;
}

  .ok-btn-group > .ok-btn {
    border-radius: 0;
    margin-inline-start: -1px;
  }

    .ok-btn-group > .ok-btn:first-child {
      border-start-start-radius: var(--ok-r-md);
      border-end-start-radius: var(--ok-r-md);
      margin-inline-start: 0;
    }

    .ok-btn-group > .ok-btn:last-child {
      border-start-end-radius: var(--ok-r-md);
      border-end-end-radius: var(--ok-r-md);
    }

    .ok-btn-group > .ok-btn:hover,
    .ok-btn-group > .ok-btn.is-active {
      z-index: 1;
      position: relative;
    }

    .ok-btn-group > .ok-btn.is-active {
      background: var(--ok-brand-50);
      border-color: var(--ok-brand-300);
      color: var(--ok-brand-700);
    }

/* -- Araç çubuğu: kart başlığındaki ve form altındaki aksiyon şeridi -- */
.ok-toolbar {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

.ok-toolbar--end {
  justify-content: flex-end;
}

.ok-toolbar__sep {
  width: 1px;
  align-self: stretch;
  min-height: 20px;
  background: #959698;
  margin-inline: var(--ok-sp-1);
}

/* -- Form alt aksiyon çubuğu (legacy .form-actions.right karşılığı) --------
   Uzun formlarda ekranın altına yapışır ki Kaydet her zaman erişilebilir olsun. */
.ok-form-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
  padding: 0 var(--ok-card-px) var(--ok-sp-2);
  /*margin-top: 6px;*/
}

.ok-form-actions--sticky {
  position: sticky;
  bottom: 0;
  z-index: var(--ok-z-sticky);
  border-top: 1px solid var(--ok-border);
  background: var(--ok-panel-alt);
  border-end-start-radius: var(--ok-r-lg);
  border-end-end-radius: var(--ok-r-lg);
  box-shadow: 0 -1px 0 var(--ok-border), 0 -4px 12px rgba(16, 32, 56, .05);
}

.ok-form-actions__info {
  margin-inline-end: auto;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
}

/* -- Kayıt gezinme çubuğu (legacy tally-info-detail 11 butonu) ------------- */
.ok-recnav {
  display: inline-flex;
  align-items: center;
  gap: var(--ok-sp-1);
  padding: 2px;
  background: var(--ok-surface-sunk);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
}

@media (max-width: 640px) {
  .ok-form-actions {
    padding-inline: var(--ok-sp-3);
  }

    .ok-form-actions > .ok-btn {
      flex: 1 1 auto;
    }
}

/* ==== components/forms.css =============================================== */
/* ==========================================================================
   Form denetimleri

   [K-56, 2026-08-19 — kullanıcı kararı] VARSAYILAN DÜZEN ARTIK YATAY:
   etiket solda, denetim hemen YANINDA. Önceki varsayılan dikeydi (etiket üstte)
   ve yatay düzen `.ok-form--horizontal` ile OPT-IN alınıyordu; sonuç olarak
   sarmalayıcıya o sınıfı koymayan her ekran — modal formları, filtre panelleri,
   yeni yazılan ekranlar — etiketi alt satıra düşürüyordu. Kullanıcının
   şikâyeti tam buydu: "genelde label yazıp, alt satırda alanı koyuyorsun".

   Varsayılanı çevirmek, sınıfı UNUTMAK durumunu da doğru tarafa düşürür.
   Dikey düzen hâlâ mümkün: `.ok-field--stack` (uzun metin alanları, tek sütuna
   sıkışmış kartlar). `.ok-form--horizontal` geriye dönük uyumluluk için
   duruyor — artık yalnız satır aralığını daraltıyor, düzeni o kurmuyor.

   Etiket sütunu genişliği `--ok-label-w` (tokens.css, varsayılan 150px);
   uzun etiketli formlar ekran bazında `style="--ok-label-w:200px"` ile açabilir.
   Gerekçe geçmişi: 07-kararlar\ADR-T002 ve K-43.
   ========================================================================== */

/* ---------- Alan sarmalayıcı --------------------------------------------- */
.ok-field {
  display: grid;
  grid-template-columns: var(--ok-label-w) minmax(0, 1fr);
  align-items: center;
  /* [K-61, 2026-08-19] Satır aralığı 3→2px. Bu değer alanlar ARASINI değil, alanın
     KENDİ içindeki denetim ↔ ipucu/hata satırı aralığını üretir (ızgaranın ikinci
     satırı); alanlar arası aralık `--ok-fields`'ın `--ok-field-gap`'idir.
     Sütun aralığı (`--ok-sp-3`) değişmedi — etiketi denetime yapıştırmamak için. */
  gap: 2px var(--ok-sp-3);
  min-width: 0;
}
  /* Etiketi olmayan alan (tek başına onay kutusu, düğme, salt değer) iki sütuna
   bölünmez — yoksa içerik sol sütuna oturup denetim hizasını kaybederdi. */
  .ok-field:not(:has(> .ok-field__label)) {
    grid-template-columns: minmax(0, 1fr);
  }

/* Dikey kaçış: etiket üstte. Uzun serbest metin ya da çok dar sütunlarda. */
.ok-field--stack {
  display: flex;
  flex-direction: column;
  /* [K-61] Etiket ↔ denetim aralığı 5→3px. Dikey kaçışta bu aralık her alanda
     bir kez daha sayılır; yatay varsayılanda karşılığı olmayan ek bir dikey
     maliyettir ve alan başına 2px kazanç doğrudan sayfa boyuna yansır. */
  gap: 3px;
}

/* Çok satırlı denetimlerde etiket dikey ortada değil ÜSTTE durmalı. */
.ok-field:has(textarea),
.ok-field:has(select[multiple]) {
  align-items: start;
}
  /* [K-60] Dolgu 6→4px: textarea'nın kendi `padding-block`'u 3→2'ye indiği için
   etiketin ilk satırla hizası bu kadar payla korunur. */
  .ok-field:has(textarea) > .ok-field__label,
  .ok-field:has(select[multiple]) > .ok-field__label {
    padding-top: 4px;
  }

.ok-field__label {
  justify-content: flex-end;
  text-align: end;
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text-2);
  line-height: 1.3;
  display: flex;
  align-items: center;
  gap: var(--ok-sp-1);
}

  .ok-field__label .ok-icon {
    width: 13px;
    height: 13px;
    color: var(--ok-text-3);
  }

.ok-field__hint {
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  line-height: 1.35;
}
/* Alan altı hata mesajı — legacy'de hiç yoktu, yalnız kırmızı arka plan vardı */
.ok-field__error {
  display: none;
  align-items: center;
  gap: 5px;
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-medium);
  color: var(--ok-danger);
  line-height: 1.35;
}

.ok-field.is-invalid .ok-field__error,
[data-ok-field].is-invalid .ok-field__error {
  display: flex;
}

.ok-field.is-invalid .ok-field__hint,
[data-ok-field].is-invalid .ok-field__hint {
  display: none;
}

/* Hata ve ipucu satırları etiket sütununu ATLAYIP denetimin altına hizalanır.
   Aksi hâlde ızgaranın bir sonraki hücresine düşüp etiket sütununa yazarlardı. */
.ok-field > .ok-field__error,
.ok-field > .ok-field__hint {
  grid-column: 2;
}

/* Dikey kaçışta etiket sola yaslı ve tam genişlik. */
.ok-field--stack > .ok-field__label {
  justify-content: flex-start;
  text-align: start;
  padding-top: 0;
}

.ok-field--stack > .ok-field__error,
.ok-field--stack > .ok-field__hint {
  grid-column: auto;
}

/* Salt-okunur görüntüleme değeri (rType=Display / DisableControls karşılığı) */
.ok-field__value {
  min-height: var(--ok-ctrl-h);
  display: flex;
  align-items: center;
  padding-inline: 0;
  font-size: var(--ok-fs-base);
  color: var(--ok-text);
  border-bottom: 1px dashed var(--ok-border);
}

  .ok-field__value:empty::before {
    content: "—";
    color: var(--ok-text-3);
  }

/* ---------- Metin girişleri --------------------------------------------- */
.ok-input,
.ok-textarea,
.ok-native-select {
  width: 100%;
  min-width: 0;
  height: var(--ok-ctrl-h);
  padding-inline: var(--ok-ctrl-px);
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  background: var(--ok-surface);
  color: var(--ok-text);
  font-size: var(--ok-fs-base);
  /* [K-60, 2026-08-19] Satır yüksekliği artık MİRAS ALINMIYOR, açıkça veriliyor.
     `--ok-ctrl-h` 24px'e indi; kutunun içerik yüksekliği 22px (1px+1px kenarlık).
     Gövdeden gelen `--ok-lh-base` (1.45 → 13px'te ≈18,9px) hâlâ sığıyordu ama pay
     ~1,5px'e düşüyordu ve gövde satır yüksekliği ileride artarsa metin kırpılırdı.
     `--ok-lh-tight` (1.25 → ≈16,3px) payı ~3px'e çıkarır; 13px fontun doğal içerik
     yüksekliği ~15,4px olduğu için bu değer inişin ALTINA da inmez (kırpma olmaz).
     ⚠️ `.ok-textarea` bu değeri AŞAĞIDA `--ok-lh-base` ile geri alır — çok satırlı
     metinde sıkı satır aralığı okunabilirliği bozar. */
  line-height: var(--ok-lh-tight);
  transition: border-color var(--ok-dur-fast) var(--ok-ease), box-shadow var(--ok-dur-fast) var(--ok-ease), background var(--ok-dur-fast) var(--ok-ease);
}
/* [K-55] 76px üç satırlıktı ve çoğu alanda boş duruyordu → 62px (~2,5 satır).
   İç dikey boşluk 7→5px; input'un 30px'e inen yüksekliğiyle aynı yoğunluk.
   [K-59, 2026-08-19] Dikey dolgu 5→3px, yükseklik 62→54px — input 26px'e indiği için
   aynı yoğunluk korundu. `line-height` `base` kaldı: çok satırlı metinde `tight`
   satırları birbirine yapıştırır, tek satırlık denetimlerden farklı olarak burada
   okunabilirlik dolgudan daha önemli.
   [K-60, 2026-08-19] Dikey dolgu 3→2px, yükseklik 54→50px — input 26→24px'e indiği
   için aynı yoğunluk korundu (54 × 24/26 ≈ 50). Görünen satır sayısı pratikte
   değişmiyor: (50 − 4 dolgu − 2 kenarlık) / 18,9 ≈ 2,3 satır (önce 2,4).
   `line-height` BİLEREK `base` kalıyor; yukarıdaki ortak kuralın `tight` değerini
   burada geri alır. */
.ok-textarea {
  height: auto;
  min-height: 50px;
  padding-block: 2px;
  line-height: var(--ok-lh-base);
}

  .ok-input::placeholder,
  .ok-textarea::placeholder {
    color: var(--ok-text-3);
  }

  .ok-input:hover:not(:disabled),
  .ok-textarea:hover:not(:disabled),
  .ok-native-select:hover:not(:disabled) {
    border-color: var(--ok-text-3);
  }

  .ok-input:focus,
  .ok-textarea:focus,
  .ok-native-select:focus {
    outline: none;
    border-color: var(--ok-brand-600);
    box-shadow: var(--ok-focus-ring);
  }

  .ok-input:disabled,
  .ok-textarea:disabled,
  .ok-native-select:disabled,
  /* [2026-08-21] .ok-textarea[readonly] EKLENDİ. Kural .ok-input[readonly] için vardı ama
   textarea karşılığı unutulmuştu: salt okunur bir textarea DÜZENLENEBİLİR görünüyordu
   (beyaz zemin, normal imleç) — kullanıcı CompanyParameterDetail'de fark etti.
   Gözden kaçma olduğu belli: aynı bloktaki üç :disabled seçicisi ve .ok-input[readonly]
   zaten burada. Etki alanı dar — ağaçta salt okunur textarea 2 yerde. */
  .ok-textarea[readonly],
  .ok-input[readonly] {
    background: var(--ok-surface-sunk);
    color: var(--ok-text-2);
    cursor: not-allowed;
    border-color: var(--ok-border);
  border-inline-start: 3px solid #8D9CAB;
  padding-inline-start: 3px;
  }

  .ok-input[readonly], .ok-textarea[readonly] {
    cursor: default;
  }

    .ok-input[readonly][data-mask="date"] {
      text-align: left !important;
      padding-left: var(--ok-ctrl-px) !important;
      text-indent: 0 !important;
      pointer-events: none !important; /* Tıklamayı tamamen engeller */
    }

      /* Placeholder'ı tamamen gizle */
      .ok-input[readonly][data-mask="date"]::placeholder {
        opacity: 0;
      }

/* Hata durumu */
.ok-field.is-invalid .ok-input,
.ok-field.is-invalid .ok-textarea,
.ok-field.is-invalid .ok-native-select,
[data-ok-field].is-invalid .ok-input,
[data-ok-field].is-invalid .ok-textarea,
[data-ok-field].is-invalid .ok-native-select,
.ok-input.is-invalid {
  border-color: var(--ok-danger);
  background: var(--ok-danger-bg);
}

  .ok-field.is-invalid .ok-input:focus,
  [data-ok-field].is-invalid .ok-input:focus {
    box-shadow: 0 0 0 3px rgba(198, 47, 38, .22);
  }

/* Sayısal / para alanları sağa yaslı ve tabular */
.ok-input--num {
  text-align: end;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
}

.ok-input--sm {
  height: var(--ok-ctrl-h-sm);
  font-size: var(--ok-fs-sm);
}

.ok-input--mono {
  font-family: var(--ok-font-mono);
  letter-spacing: .04em;
}

/* Yerleşik açılır liste (yalnız kısa, sabit listelerde; uzunlar için ok-select) */
.ok-native-select:not([multiple]),
select.ok-input:not([multiple]) {
  appearance: none;
  padding-inline-end: 30px;
  background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%234A5A6E' stroke-width='1.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9.5l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 8px center;
  background-size: 16px 16px;
  cursor: pointer;
}

[dir="rtl"] .ok-native-select:not([multiple]),
[dir="rtl"] select.ok-input:not([multiple]) {
  background-position: left 8px center;
}

/* Liste kutusu: `size` kadar satır göstermeli, 24px'e ezilmemeli.
   [2026-09-16] Ölçüldü: 16 `select[multiple]` alanın hepsi `size="4"…"20"` taşıdığı
   hâlde 24px yüksekliğinde çiziliyordu — altı satırlık seçim kutusu tek satır görünüp
   kaydırma çubuğuyla kullanılıyordu (14 ekran). Sebep: `[size]`/`[multiple]` için
   hiçbir yükseklik kuralı yoktu ve iki taban kural birden `height: var(--ok-ctrl-h)`
   veriyor — `.form-control, .form-select` (:499) ve
   `.ok-input, .ok-textarea, .ok-native-select` (:2739). İkisi de (0,1,0);
   `select[multiple]` (0,1,1) olduğu için sıradan bağımsız kazanır.
   `[size]:not([size="1"])` şu an 0 elemana uyuyor, ileriye dönük koruma.

   ⚠️ `:not(.ok-sr-only)` ŞART. `OK.select.enhance()` (ortakik.js:2287) gerçek
   <select>i `.ok-sr-only` ile gizleyip yanına özel bileşeni kuruyor; o yardımcı
   `height: 1px` ile gizliyor ve özgüllüğü (0,1,0). Bu kural (0,1,1) olduğu için
   gizli select'i açardı. Görsel sonuç `clip-path: inset(50%)` sayesinde yine de
   görünmezdi, ama gizleme yardımcısını kazara ezmek kırılgan bir bağımlılık.
   Ölçüm: ağaçtaki 55 `select[multiple]`ın 54'ü `data-ok-select` taşıyor, yani
   normalde HİÇBİRİ ham liste kutusu olarak çizilmiyor — bu kural fiilen tek
   ekranı ilgilendiriyor (Budget/BudgetOperationDetailMulti, size=4). */
select[multiple]:not(.ok-sr-only),
select[size]:not([size="1"]):not(.ok-sr-only) {
  height: auto;
}

/* ---------- Girdi grubu: ön/arka ek, aralık, arama düğmesi -------------- */
.ok-input-group {
  display: flex;
  align-items: stretch;
  min-width: 0;
}

  .ok-input-group > .ok-input,
  .ok-input-group > .ok-native-select,
  .ok-input-group > .ok-select {
    border-radius: 0;
    margin-inline-start: -1px;
    flex: 1 1 auto;
  }

  .ok-input-group > :first-child {
    border-start-start-radius: var(--ok-r-md);
    border-end-start-radius: var(--ok-r-md);
    margin-inline-start: 0;
  }

  .ok-input-group > :last-child {
    border-start-end-radius: var(--ok-r-md);
    border-end-end-radius: var(--ok-r-md);
  }

  .ok-input-group > .ok-input:focus,
  .ok-input-group > .ok-native-select:focus {
    z-index: 2;
    position: relative;
  }

.ok-addon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding-inline: var(--ok-sp-3);
  min-width: 34px;
  border: 1px solid var(--ok-border-strong);
  background: var(--ok-surface-sunk);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
  white-space: nowrap;
  margin-inline-start: -1px;
  flex: 0 0 auto;
}

.ok-addon--tight {
  padding-inline: var(--ok-sp-2);
  min-width: 26px;
  background: transparent;
  border-color: transparent;
}
/* Girdi grubu içindeki düğme */
.ok-input-group > .ok-btn {
  border-radius: 0;
  margin-inline-start: -1px;
  border-color: var(--ok-border-strong);
  flex: 0 0 auto;
}

/* Tarih/sayı aralığı: 3 parça, ortada tire */
.ok-range {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: stretch;
}

  .ok-range > .ok-addon {
    border-inline: 0;
  }

/* İkon gömülü giriş (arama kutuları) */
.ok-input-icon {
  position: relative;
  display: flex;
  min-width: 0;
}

  .ok-input-icon > .ok-icon {
    position: absolute;
    inset-inline-start: 9px;
    top: 50%;
    translate: 0 -50%;
    color: var(--ok-text-3);
    pointer-events: none;
    width: 16px;
    height: 16px;
  }

  .ok-input-icon > .ok-input {
    padding-inline-start: 31px;
  }

  .ok-input-icon:has(> .ok-input:is(:disabled, [readonly])) > .ok-icon {
    display: none;
  }

  .ok-input-icon > .ok-input:is(:disabled, [readonly])[data-mask="date"],
  .ok-dp .ok-input-icon > .ok-input:is(:disabled, [readonly]) {
    padding-inline-start: 3px !important;
    padding-left: 3px !important;
    text-align: start !important;
    text-indent: 0 !important;
  }

/* Esneyen arama kutusu — sabit genişlik yerine kabına göre büyür */
.ok-input-icon--grow {
  flex: 1 1 190px;
  max-width: 300px;
}

/* ---------- Onay kutusu ve radyo ---------------------------------------- */
.ok-check {
  display: inline-flex;
  align-items: flex-start;
  gap: var(--ok-sp-2);
  cursor: pointer;
  font-size: var(--ok-fs-sm);
  line-height: 18px;
  min-height: 18px;
  user-select: none;
}

  .ok-check > input {
    appearance: none;
    flex: 0 0 auto;
    width: 17px;
    height: 17px;
    margin: 0;
    border: 1.5px solid var(--ok-border-strong);
    border-radius: var(--ok-r-sm);
    background: var(--ok-surface);
    cursor: pointer;
    position: relative;
    transition: background var(--ok-dur-fast) var(--ok-ease), border-color var(--ok-dur-fast) var(--ok-ease);
  }

    .ok-check > input[type="radio"] {
      border-radius: 50%;
    }

    .ok-check > input:hover:not(:disabled) {
      border-color: var(--ok-brand-500);
    }

    .ok-check > input:checked {
      background: var(--ok-brand-600);
      border-color: var(--ok-brand-600);
    }

    .ok-check > input[type="checkbox"]:checked::after {
      content: "";
      position: absolute;
      inset: 0;
      background: no-repeat center/11px 11px url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 12.5l5 5 10-11'/%3E%3C/svg%3E");
    }

    .ok-check > input[type="checkbox"]:indeterminate {
      background: var(--ok-brand-600);
      border-color: var(--ok-brand-600);
    }

      .ok-check > input[type="checkbox"]:indeterminate::after {
        content: "";
        position: absolute;
        inset-inline: 3px;
        top: 50%;
        translate: 0 -50%;
        height: 2px;
        border-radius: 1px;
        background: #fff;
      }

    .ok-check > input[type="radio"]:checked::after {
      content: "";
      position: absolute;
      inset: 4px;
      border-radius: 50%;
      background: #fff;
    }

/* ---- Kapalı + işaretli: TİK KOYULAŞIR, dolgu değil ------------------------
   [2026-09-16 — kullanıcı kararı] Devre dışı işaretli kutu `--ok-brand-500`
   dolgusu alıyor (`:3096`). Açık temada bu DOĞRU yön: 500, 600'den açık ve
   beyaz zeminde açık = daha az kontrast = geri çekilme (3,51 ↔ etkin 4,89).
   Kusur prominansta değil OKUNURLUKTA: beyaz tik o dolgunun üstünde 3,51:1,
   yani AA'nın (4,5) altında.

   Dolguyu koyulaştırmak çözüm DEĞİL — dolu bir karede 'beyaz tik kontrastı' ile
   'beyaz zeminden ayrışma' aynı sayıdır; tiki 4,5'e çıkarmak kutuyu etkin
   olanın (4,89) seviyesine taşır, yani geri çekilme kaybolur. Pencere 4,5-4,89,
   fark algılanamaz. Bu yüzden dolgu korunup TİK koyulaştırıldı: 5,00:1.

   ⚠️ Koyu temada GERİ ALINIR (theme-karanlik.css): orada dolgu #24548E ve koyu
   tik 2,28:1 verirdi; beyaz tik 7,68:1. */
  .ok-check > input[type="checkbox"]:disabled:checked::after {
    background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%230B1A2B' stroke-width='3.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4.5 12.5l5 5 10-11'/%3E%3C/svg%3E");
  }

  .ok-check > input[type="radio"]:disabled:checked::after {
    background: #0B1A2B;
  }

    .ok-check > input:focus-visible {
      outline: 2px solid var(--ok-focus-color);
      outline-offset: 2px;
    }

    .ok-check > input:disabled {
      background: var(--ok-surface-sunk);
      border-color: var(--ok-border);
      cursor: not-allowed;
    }

/* ---- Kapalı alanın SOL KENAR ŞERİDİ ---------------------------------------
   [2026-09-16 — kullanıcı kararı] Koyu temada kurulan dil açık temaya da
   taşındı: kapalı denetim, zemin/metin farkına ek olarak sol kenarında nötr
   gri bir şerit taşır. Şerit yüzeye yayılmadığı için desen gibi gürültü yapmaz;
   bir formun tamamı kapalıyken göz sol kenarda hizalanmış bir dizi görür.

   Ton `#8D9CAB` — koyu temadaki algılanan kontrastı tutturur:
     açık tema  zeminden 2,55 · karttan 2,81
     koyu tema  zeminden 2,67 · panelden 2,17

   ⚠️ Hiza: `--ok-ctrl-px` 5px, açık alanda metin `1px kenarlık + 5px dolgu =
   6px` içeride başlar. Şerit 3px olduğu için dolgu da 3px'e iner → yine 6px.
   Dolgu 5px bırakılsaydı kapalı alanların metni komşularından 3px kayardı.
   ⚠️ `border-left` değil `border-inline-start` — RTL'de kendiliğinden sağa geçer.
   ⚠️ Onay kutusunda dolgu telafisi YOK: o bir metin kutusu değil, kaydıracak
   içeriği yok. Kutu `border-box` olduğu için dış ölçü 17px'te kalır.
   ⚠️ RADYO HARİÇ (`[type="checkbox"]`): daireye asimetrik kenar yumurta yapar.
   Koyu tema bu üç kuralı `theme-karanlik.css`te kendi tonlarıyla eziyor. */
    .ok-check > input[type="checkbox"]:disabled {
      border-inline-start: 3px solid #8D9CAB;
    }

      /* İşaretli dolgu (`--ok-brand-500`, #3B8AE8) üzerinde #8D9CAB yalnız 1,25:1
         verir, yani kaybolur. Koyu ton 2,21:1 — koyu temadaki 2,11 ile aynı denge. */
      .ok-check > input[type="checkbox"]:disabled:checked,
      .ok-check > input[type="checkbox"]:disabled:indeterminate {
        border-inline-start-color: #41546B;
      }

      /* Disabled ama checked ise daha koyu göster */
      .ok-check > input:disabled:checked {
        background: var(--ok-brand-500);
        /*border-color: var(--ok-brand-600);*/
      }

  .ok-check.is-disabled {
    opacity: .6;
    cursor: not-allowed;
  }

.ok-check__text {
  min-width: 0;
}

/* Onay kutusu / radyo listesi */
.ok-check-list {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-2);
}

.ok-check-list--inline {
  flex-direction: row;
  flex-wrap: wrap;
  gap: var(--ok-sp-2) var(--ok-sp-5);
}

/* ---------- Aç/kapa anahtarı (legacy .make-switch karşılığı) ------------ */
.ok-switch {
  /* [K-70, 2026-08-20] Kullanıcı kararı: kapalı (Pasif) hâlin zemini KIRMIZI olacak.
     Ton doğrudan yazılmadı, bileşen kapsamında bir ara değişkene bağlandı: böylece
     ileride kırmızının "hata" anlamıyla çakıştığı yerlerde (bkz. SAPMA notu) tek bir
     değiştirici sınıf yalnız bu satırı ezer, bileşenin tamamı yeniden yazılmaz.
     tokens.css'e yeni token EKLENMEDİ — değişiklik bilerek bu dosyada tutuldu. */
  --ok-switch-off: var(--ok-danger);
  display: inline-flex;
  align-items: center;
  gap: var(--ok-sp-2);
  cursor: pointer;
  font-size: var(--ok-fs-sm);
  user-select: none;
}

  .ok-switch > input {
    appearance: none;
    flex: 0 0 auto;
    width: 38px;
    height: 21px;
    margin: 0;
    border-radius: var(--ok-r-pill);
    /* [K-70] Kapalı zemin nötr griden (--ok-border-strong #CBD5E3) --ok-danger'a
     (#C62F26) geçti. Ton seçimi ölçümle: beyaz topuza (::after) karşı gri yalnız
     1.48:1 veriyordu ve topuz fiilen gölgeye bağlı görünüyordu; #C62F26 5.47:1
     veriyor — WCAG 1.4.11'in arayüz bileşeni için istediği 3:1'in çok üstünde,
     bu yüzden topuz gölgesi güçlendirilmedi. Ailenin diğer iki tonu ELENDİ:
     --ok-danger-bg (#FDECEB) beyaz topuzu ~1.1:1'e, --ok-danger-br (#F2B6B2)
     ~1.75:1'e düşürüyor; ikisinde de anahtarın hangi yönde olduğu okunmuyor. */
    background: var(--ok-switch-off);
    position: relative;
    cursor: pointer;
    transition: background var(--ok-dur-base) var(--ok-ease);
  }

    .ok-switch > input::after {
      content: "";
      position: absolute;
      top: 2.5px;
      inset-inline-start: 2.5px;
      width: 16px;
      height: 16px;
      border-radius: 50%;
      background: #fff;
      box-shadow: 0 1px 2px rgba(16, 32, 56, .28);
      transition: translate var(--ok-dur-base) var(--ok-ease);
    }

    .ok-switch > input:checked {
      background: var(--ok-brand-600);
    }

      .ok-switch > input:checked::after {
        translate: 17px 0;
      }

[dir="rtl"] .ok-switch > input:checked::after {
  translate: -17px 0;
}

.ok-switch > input:focus-visible {
  outline: 2px solid var(--ok-focus-color);
  outline-offset: 2px;
}
/* [K-70] `opacity:.55` DEĞİŞTİRİLMEDİ, ölçülüp bırakıldı: kırmızı zemin beyaz sayfa
   üzerinde %55'te ~#E08D88'e düşüyor (beyaza karşı 5.47:1 → 2.52:1). Bu, eski gride
   elde edilenden daha belirgin bir "sönme" farkıdır; 3:1 eşiğinin altına inmesi
   sorun değil, WCAG 1.4.11 devre dışı bileşenleri kapsam dışı bırakır. */
.ok-switch > input:disabled {
  opacity: .55;
  cursor: not-allowed;
}

/* [K-70b, 2026-08-20] Nötr anahtar — kapalı hâli KIRMIZI OLMAMASI gereken yerler.
   K-70 kırmızıyı "Pasif" için getirdi (kullanıcı kararı). Ama `.ok-switch` yalnız
   Aktif/Pasif'te kullanılmıyor ve iki sınıf yerde kırmızı YANLIŞ anlam veriyor:

     · `CLOCKED` (hesap kilidi) — kapalı = "kilitli DEĞİL" = İYİ durum. Kırmızı burada
       iyi durumu alarm gibi, açık/mavi hâl ise gerçek sorunu (kilitli hesap) sakin
       gösterirdi. Anlam TAM TERS.
     · `CPORTAL`, `lblYes/lblNo` gibi sıradan yapılandırma anahtarları — kapalı hâl bir
       olumsuzluk değil, yalnız bir seçim. Kırmızı gereksiz aciliyet üretir.

   Kullanıcının isteği "Aktif / Pasif checkbox alanları" idi; bu üçü o kapsamda değil.
   Varsayılan kırmızı BIRAKILDI (istek buydu), istisnalar bu değiştiriciyle nötrleniyor. */
.ok-switch--neutral {
  --ok-switch-off: var(--ok-border-strong);
}

/* ---------- Segmentli seçim (2-4 seçenek, radyo yerine) ----------------- */
.ok-segment {
  display: inline-flex;
  padding: 2px;
  background: var(--ok-surface-sunk);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
  gap: 2px;
}

.ok-segment__item {
  padding: 0 var(--ok-sp-3);
  height: calc(var(--ok-ctrl-h) - 6px);
  display: inline-flex;
  align-items: center;
  gap: 6px;
  border-radius: var(--ok-r-sm);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  color: var(--ok-text-2);
  white-space: nowrap;
}

  .ok-segment__item:hover {
    color: var(--ok-text);
  }

  .ok-segment__item.is-active {
    background: var(--ok-surface);
    color: var(--ok-brand-700);
    box-shadow: var(--ok-sh-sm);
  }

/* ---------- Form bölümleri --------------------------------------------- */
/* [K-55] Bölümler arası 20px fazla bulundu → 12px. */
/* ---- Yatay dolgu ızgaraya bağlı: iç `.row` kabı TAŞMASIN -----------------
   [2026-09-16 — kullanıcı kararı] Ölçüm: `--bs-gutter-x` bu projede 20px'e
   çekilmiş (`:488`, legacy paritesi), yani Bootstrap `.row` yanlardan −10px
   marj alıyor. `.ok-form`un yatay dolgusu 8px, `.ok-form--horizontal`ınki 4px
   idi — aradaki fark kadar (2px ve 6px) içteki satır kabın DIŞINA taşıyordu ve
   en sağdaki alan kart kenarına doğru sarkıyordu.
   Dolgu yarım gutter'a bağlandı: negatif marj tam kenara oturur, taşma biter.
   Sabit 10px değil `calc(var(--ok-sp-5) * .5)` — gutter jetonu değişirse dolgu
   da takip etsin (`:488` ile tek kaynak).
   ⚠️ Yalnız YATAY dolgu değişti; dikey dolgu ve `gap` değerleri korundu —
   onlar ayrı ayrı ölçülmüş kararlar (bu dosyada :3283 ve :3316). */
.ok-form {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-2);
  padding-inline: calc(var(--ok-sp-5) * .5);
}

/* ---- `.ok-form--horizontal` — GERİYE DÖNÜK ---------------------------------
   K-43'te (2026-08-18) eklenmişti ve yatay düzeni O kuruyordu. K-56'dan
   (2026-08-19) sonra yatay düzen `.ok-field`'ın VARSAYILANI; bu sınıf artık
   yalnız satır aralığını daraltıyor. Mevcut 17 ekran onu işaretlemesinde
   taşıyor, kaldırmak 17 dosyaya dokunmak demekti — bırakıldı, davranışı
   `--ok-field-gap`'ten bağımsız ek bir sıkıştırma olarak sürüyor. */
.ok-form--horizontal {
  gap: var(--ok-sp-2);
  /* [2026-08-30 — kullanıcı kararı] `var(--ok-sp)` → `var(--ok-sp-1)`.
     `--ok-sp` diye bir token YOKTU (ölçek `--ok-sp-1 … --ok-sp-16`, `:186-195`).
     ⚠️ Tanımsız custom property'li bildirim cascade'de KAZANIR, sonra "guaranteed-invalid"
     olarak `initial`e düşer — yani `.ok-form`un 8px'ine geri düşmez, **0** olur. Bu yüzden
     kusur "biraz dar" değil "hiç dolgu yok" biçiminde görünüyordu.
     Değer `--ok-sp-1` (4px) seçildi: bu sınıfın işi `.ok-form`u SIKIŞTIRMAK (üstteki
     `gap` de 12px → 8px daraltıyor), o yüzden dolgu da 8px → 4px daralır. */
  padding: var(--ok-sp-1);
  padding-inline: calc(var(--ok-sp-5) * .5);
}

/* ---- Alan satırı taşıyan form akışı: aralık TEK KAYNAKTAN ------------------
   [2026-08-30 — kullanıcı kararı] Aynı işaretlemeye sahip iki ekran farklı
   dikey aralık gösteriyordu; fark satırın kendisinden DEĞİL, satırı saran
   kapsayıcıdan geliyordu:

     · Corporate\Company.cshtml:388 — kapsayıcı düz `.row`. Yukarıdaki
       `.row:has(> [data-ok-field])` kuralı (bu dosyada :3145) devreye girip
       `--bs-gutter-y: var(--ok-field-gap)` veriyor → 4px.
     · Corporate\WorkplaceDetail.cshtml:591 — kapsayıcı `.ok-form
       ok-form--horizontal`. `.row` OLMADIĞI için o kural HİÇ eşleşmiyor;
       aralığı `.ok-form`un flex `gap`i üretiyor → 8px, yani iki katı.

   Aşağıdaki kural ikinci yolu birincisine bağlar: alan satırlarını DOĞRUDAN
   taşıyan form akışının `gap`i de `--ok-field-gap`ten okunur, böylece yoğun
   kipte (`--ok-field-gap: 3px`, :329) ikisi birlikte daralır.

   ⚠️ `:has(> …)` DOĞRUDAN çocuk arar — bilerek. Bölüm/kart/`.row` taşıyan
   `.ok-form` kapsayıcıları (WorkplaceDetail'in dış sarmalayıcısı dahil)
   eşleşmez ve bloklar arası nefes payı 12/8px olarak KALIR.

   Özgüllük 0,2,0; `.ok-form--horizontal` (0,1,0) ezilir — bu sayede sınıfı
   taşıyan 195 dosyaya dokunmak gerekmedi. */
.ok-form:has(> [data-ok-field]) {
  gap: var(--ok-field-gap);
}

/* ---- Aynı akış, ARA SÜTUN KATMANIYLA ---------------------------------------
   [2026-09-02 — kullanıcı kararı: "genel çözüm"] Yukarıdaki kural `:has(> …)` ile
   DOĞRUDAN çocuk arıyor. Ama ekranların çoğunda alan satırı legacy'nin kendi
   `row > col-md-*` katmanının İÇİNDEDİR — o katman bir "bölüm" değil, yalnız
   sütun genişliğini kuran sarmalayıcıdır:

     .ok-form > .row > .col-md-6 > [data-ok-field]      ← Security\SecurityUser.cshtml:202-209

   Bu yüzden kural eşleşmiyor ve `.ok-form`un 12px'lik varsayılanı kalıyordu;
   aynı ekranın doğrudan çocuk taşıyan ilk bloğu (`:155`) ise 4px alıyordu — yani
   TEK EKRAN İÇİNDE üç kat fark. Ölçüm (2026-09-02): user-definitions 12px,
   InsuranceInformationsDetail 8px, doğrudan çocuklu bloklar 4px.

   ⚠️ `:not(:has(.ok-form))` ZORUNLU — kuralın tehlikeli yarısı budur. İç içe
   `.ok-form` kullanan ekranlarda DIŞTAKİ blokları ayırır, alan satırlarını değil:

     Corporate\WorkplaceDetail.cshtml:587  .ok-form            ← BÖLÜM (iki sütunu ayırır)
                                    :592    └ .col-md-6.ok-form ← alan satırları burada

   Dıştakine `--ok-field-gap` verilseydi iki sütun bloğu birbirine yapışırdı;
   içteki zaten yukarıdaki kuralla 4px alıyor. Bu koşul dıştakini eleyip
   nefes payını (8/12px) korur. Ölçüm: 33 dosyada birden çok `.ok-form` var.

   Özgüllük 0,4,0 — `.ok-form--horizontal` (0,1,0) ve yukarıdaki kural (0,2,0)
   ezilir; işaretlemeye dokunmadan 100+ ekran tek satırdan hizalanır. */
.ok-form:has(> .row [data-ok-field]):not(:has(.ok-form)) {
  gap: var(--ok-field-gap);
}

/* ==========================================================================
   DAR DENETİM ÖLÇEĞİ — `.ok-input--w-sm | --w-md | --w-lg`
   [2026-08-20, kullanıcı kararı] Tek bir 190px kuralı üç basamaklı bir ölçeğe
   çevrildi. Ölçüler `tokens.css`'te (`--ok-w-sm/md/lg`); ham piksel buraya yazılmaz.

   İçeriğin genişliği belliyse alanı boydan boya germek hem çirkin hem yanıltıcı
   (kullanıcı uzun değer beklendiğini sanıyor). Legacy karşılığı Bootstrap
   `col-md-2/3` sütun genişlikleriydi.

   ⚠️ SINIF HEM DENETİME HEM SARMALAYICISINA KONABİLİR. Eski kural yalnız
   `.ok-field`'ın DOĞRUDAN çocuğu olan `.ok-input`'u daraltıyordu; denetim bir
   sarmalayıcı içindeyse (ikonlu kutu, özel açılır liste, ön/son ekli grup)
   sarmalayıcı tam genişlikte kalıyor, yalnız içindeki input daralıyordu — yani
   kenarlık ve zemin boydan boya uzuyordu. Artık iki yerleşim de çalışır:

     <input class="ok-input ok-input--w-sm">                     ← denetimin kendisinde
     <div class="ok-input-icon ok-input--w-sm"> … </div>         ← sarmalayıcıda
     <div class="ok-input-icon"><input class="ok-input ok-input--w-sm"></div>
                                                                 ← içeride: sarmalayıcı da daralır

   Kapsanan sarmalayıcılar: `.ok-dp` (tarih), `.ok-input-icon`, `.ok-select`,
   `.ok-input-group`. `:has()` DESCENDANT'tır: `.ok-input-group` içinde bir
   `--w-*` varsa GRUBUN TAMAMI o genişliğe iner — grup tek bir mantıksal
   denetim olduğu için istenen davranış budur.

   ⚠️ Ölçek kuralları VARSAYILANLARDAN SONRA gelmek zorunda: `.ok-dp` ile
   `.ok-input--w-sm` aynı elemandaysa özgüllük eşittir (0,2,0) ve kazananı
   KAYNAK SIRASI belirler.
   ========================================================================== */

/* 1) Varsayılanlar — ölçek sınıfı YOKKEN geçerli. Davranış değişmedi. */
.ok-field > .ok-dp,
.ok-field > .ok-input[data-mask="num"],
.ok-field > .ok-input[data-mask="dec"] {
  max-width: var(--ok-w-md);
}

/* 2) Ölçek. `--narrow` = `--w-md` TAKMA ADI; 11 ekran / 59 kullanım onu taşıyor,
      kaldırmak o dosyalara dokunmak demekti. Yeni işaretlemede `--w-md` kullanılır. */
.ok-field > .ok-input--w-sm,
.ok-field > :is(.ok-dp, .ok-input-icon, .ok-select, .ok-input-group):has(.ok-input--w-sm) {
  max-width: var(--ok-w-sm);
}

.ok-field > .ok-input--w-md,
.ok-field > .ok-input--narrow,
.ok-field > :is(.ok-dp, .ok-input-icon, .ok-select, .ok-input-group):has(:is(.ok-input--w-md, .ok-input--narrow)) {
  max-width: var(--ok-w-md);
}

.ok-field > .ok-input--w-lg,
.ok-field > :is(.ok-dp, .ok-input-icon, .ok-select, .ok-input-group):has(.ok-input--w-lg) {
  max-width: var(--ok-w-lg);
}

/* ===========================================================================
   B/C DÖNÜŞÜMÜ KÖPRÜSÜ — [data-ok-field] (2026-08-27)
   ---------------------------------------------------------------------------
   Yerleşim Bootstrap'e devredildi: alan sarmalayıcısı artık `.ok-field` grid'i
   değil, `class="row" data-ok-field` taşıyan bir Bootstrap satırı; etiket ve
   denetim `col-md-*` sütunlarında. Kapsayıcı `.ok-fields--n` ızgarası da düz
   `.row` oldu.

   Aşağıdaki dört kural, dönüşümde SESSİZCE kaybolan davranışları geri verir.
   Hiçbiri yeni tasarım değildir — hepsi dönüşüm öncesi durumu korur.

   ⚠️ `.ok-field` HÂLÂ YAŞIYOR: legacy'sinde `col-md-*` bulunmayan 136 alan
   bilerek dönüştürülmedi (yerleşimleri `<table>` tabanlı). Bu dosyadaki
   `.ok-field` kuralları o alanlar için gereklidir, silinmez.
   =========================================================================== */

/* 1) Alanlar arası DİKEY aralık. `.ok-fields` `gap: var(--ok-field-gap)` (4px,
      yoğun kipte 3px) veriyordu; Bootstrap `.row`da `--bs-gutter-y` varsayılanı
      **0**. Çocukları alta saran her dönüşmüş kapsayıcı bu nefes payını
      kaybediyordu. Gutter'ı satırın kendisine veriyoruz — `:has()` ile yalnız
      gerçekten alan barındıran satırlara, kart/araç çubuğu satırlarına değil. */
.row:has(> [data-ok-field]) {
  --bs-gutter-y: var(--ok-field-gap);
}

.row:not([data-ok-field]):has(> [data-ok-field]) > .row[data-ok-field] {
  margin-top: var(--ok-field-gap);
}

.row:not([data-ok-field]):has(> [data-ok-field]) > .ok-divider + .row[data-ok-field] {
  margin-top: 0;
}

/* 2) Denetim genişlik ölçeği. Kurallar `.ok-field > .ok-input--w-*` biçiminde
      **doğrudan çocuk** arıyordu; denetim artık `col-md-*` sütununun içinde,
      yani bir kat derinde. Seçici olmadan `--w-sm/md/lg/narrow` sınıflarının
      tamamı sessizce ölüydü (ağaç genelinde birkaç yüz kullanım). */
[data-ok-field] .ok-input--w-sm,
[data-ok-field] :is(.ok-dp, .ok-input-icon, .ok-select, .ok-input-group):has(.ok-input--w-sm) {
  max-width: var(--ok-w-sm);
}

[data-ok-field] .ok-input--w-md,
[data-ok-field] .ok-input--narrow,
[data-ok-field] :is(.ok-dp, .ok-input-icon, .ok-select, .ok-input-group):has(:is(.ok-input--w-md, .ok-input--narrow)) {
  max-width: var(--ok-w-md);
}

[data-ok-field] .ok-input--w-lg,
[data-ok-field] :is(.ok-dp, .ok-input-icon, .ok-select, .ok-input-group):has(.ok-input--w-lg) {
  max-width: var(--ok-w-lg);
}

/* 3) Tam genişlik etiket SOLA yaslanır. `.ok-field--stack > .ok-field__label`
      `flex-start`/`start` veriyordu; sınıf dönüşümde silinince `.ok-field__label`
      taban kuralının `flex-end`/`end`i devralıyor ve üstte duran etiket sağa
      kaçıyordu. `col-md-12` etiket zaten kendi satırındadır — sağa yaslanması
      hiçbir durumda doğru değil. */
[data-ok-field] > .ok-field__label.col-md-12 {
  justify-content: flex-start;
  text-align: start;
  padding-top: 0;
}

/* Dar ekranda yatay düzen okunmaz — alt alta düşer.
   [K-56] Seçiciler `.ok-form--horizontal` bağımlılığından çıkarıldı; yatay düzen
   artık varsayılan olduğu için kırılma noktası da varsayılana uygulanmalı. */
@media (max-width: 760px) {
  .ok-field {
    grid-template-columns: minmax(0, 1fr);
  }

  /* [2026-08-27] Dönüşmüş alanlar da dar ekranda sola yaslanır: Bootstrap
     `col-md-*`'ı 768px altında zaten tam genişliğe çöküyor, ama etiketin
     `flex-end` hizası kalıyordu — etiket kendi satırının sağına kaçardı. */
  [data-ok-field] > .ok-field__label {
    justify-content: flex-start;
    text-align: start;
  }

  .ok-field__label {
    justify-content: flex-start;
    text-align: start;
  }

  .ok-field:has(textarea) > .ok-field__label,
  .ok-field:has(select[multiple]) > .ok-field__label {
    padding-top: 0;
  }

  .ok-field > .ok-field__error,
  .ok-field > .ok-field__hint {
    grid-column: 1;
  }
}

/* Bölüm başlığı — legacy <hr class="div-line"> yerine adlandırılmış bölüm */
/* [K-55] Bölüm içi aralık 12→8. */
.ok-form-section {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-2);
}

.ok-form-section__head {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  padding-bottom: var(--ok-sp-2);
  border-bottom: 1px solid var(--ok-border);
}

.ok-form-section__title {
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-brand-700);
  text-transform: uppercase;
  letter-spacing: .04em;
}

  .ok-form-section__title .ok-icon {
    color: var(--ok-brand-500);
  }

/* Alan ızgarası: 1/2/3/4 kolon; her alan gerektiği kadar yer kaplar */
.ok-fields {
  display: grid;
  gap: var(--ok-field-gap) var(--ok-sp-2);
  grid-template-columns: repeat(var(--ok-cols, 3), minmax(0, 1fr));
}

.ok-fields--1 {
  --ok-cols: 1;
}

.ok-fields--2 {
  --ok-cols: 2;
}

.ok-fields--3 {
  --ok-cols: 3;
}

.ok-fields--4 {
  --ok-cols: 4;
}

/* [K-56] Etiket sütunu ızgara yoğunluğuna göre daralır. 150px tek/iki sütunda
   doğru, üç-dört sütunda hücreye sığmıyor ve denetimi eziyor — yatay düzenin
   sütunlu ızgarada kullanılabilir kalması bu ayara bağlı. */
.ok-fields--3 {
  --ok-label-w: 118px;
}

.ok-fields--4,
.ok-fields--5 {
  --ok-label-w: 100px;
}
/* [2026-08-18] 6 sütun — "Listeleme Ayarlarım" (D1354) gibi matris ekranları için:
   6 kolon seçici üstte, 6 sıralama seçici tam altlarında hizalı durur. Sınıf olarak
   tanımlanması ŞART: satır içi `style="--ok-cols:6"` aşağıdaki medya sorgularından
   daha güçlüdür ve dar ekranda sütun sayısı düşmez. */
/* [2026-08-19] 5 sütun — bordro özeti şeridi (tally-info-detail: puantaj toplamı, brüt,
   yasal kesinti, kesinti, net). `--6` ile aynı gerekçe: satır içi `style="--ok-cols:5"`
   aşağıdaki medya sorgularından DAHA GÜÇLÜdür ve dar ekranda sütun sayısı düşmez —
   beş sayısal alan telefonda yan yana sıkışır. Sınıf olarak tanımlanması ŞART. */
.ok-fields--5 {
  --ok-cols: 5;
}

.ok-field--w2 {
  grid-column: span 2;
}

.ok-field--full {
  grid-column: 1 / -1;
}

/* Hata özeti — legacy'de ValidationSummary hiç yoktu */
.ok-form-summary {
  display: none;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-3) var(--ok-sp-4);
  border: 1px solid var(--ok-danger-br);
  border-inline-start: 3px solid var(--ok-danger);
  border-radius: var(--ok-r-md);
  background: var(--ok-danger-bg);
  color: #7E1E18;
  font-size: var(--ok-fs-sm);
}

  .ok-form-summary.is-visible {
    display: flex;
  }

.ok-form-summary li {
  list-style: disc;
  margin-inline-start: var(--ok-sp-4);
}

.ok-form-summary a {
  color: #7E1E18;
  text-decoration: underline;
}

@media (max-width: 1200px) {
  .ok-fields--4 {
    --ok-cols: 3;
  }

  .ok-fields--5 {
    --ok-cols: 3;
  }
}

@media (max-width: 1024px) {
  .ok-fields--3, .ok-fields--4, .ok-fields--5 {
    --ok-cols: 2;
  }
}

@media (max-width: 720px) {
  .ok-fields {
    --ok-cols: 1 !important;
  }

  .ok-field--w2 {
    grid-column: span 1;
  }
}

/* ==== components/select.css ============================================== */
/* ==========================================================================
   Aranabilir seçim listesi (legacy select2 + jquery.multiselect karşılığı)
   İşyeri çoklu seçimi, sicil listesi, ~650 select2me alanı bunu kullanır.
   ========================================================================== */

.ok-select {
  position: relative;
  min-width: 0;
  width: 100%;
}

/* ---------- Kapalı hâli: denetim ---------------------------------------- */
.ok-select__control {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  width: 100%;
  min-height: var(--ok-ctrl-h);
  /* [K-60, 2026-08-19] Dikey dolgu 1→0. Kutu yüksekliğini artık YALNIZ
     `min-height: var(--ok-ctrl-h)` (24px) belirliyor; içerik (13px font,
     miras 1.45 satır ≈18,9px) + 2px kenarlık = ~20,9px < 24px olduğu için
     min-height bağlayıcı kalır ve kutu `.ok-input` ile aynı boyda durur.
     Yatay dolgu değişmedi. */
  padding: 0 var(--ok-sp-2) 0 var(--ok-ctrl-px); /* K-55: 3→2 · K-59: 2→1 · K-60: 1→0 */
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  background: var(--ok-surface);
  color: var(--ok-text);
  font-size: var(--ok-fs-base);
  text-align: start;
  cursor: pointer;
  transition: border-color var(--ok-dur-fast) var(--ok-ease), box-shadow var(--ok-dur-fast) var(--ok-ease);
}

  .ok-select__control:hover:not(:disabled) {
    border-color: var(--ok-text-3);
  }

  .ok-select__control[aria-expanded="true"] {
    border-color: var(--ok-brand-600);
    box-shadow: var(--ok-focus-ring);
  }

  .ok-select__control:disabled {
    background: var(--ok-surface-sunk);
    color: var(--ok-text-2);
    cursor: not-allowed;
    border-color: var(--ok-border);
  border-inline-start: 3px solid #8D9CAB;
  padding-inline-start: 3px;
  }

.ok-field.is-invalid .ok-select__control {
  border-color: var(--ok-danger);
  background: var(--ok-danger-bg);
}

.ok-select__value {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

  .ok-select__value.is-placeholder {
    color: var(--ok-text-3);
  }

.ok-select__caret {
  flex: 0 0 auto;
  color: var(--ok-text-2);
  transition: transform var(--ok-dur-fast) var(--ok-ease);
}

.ok-select__control[aria-expanded="true"] .ok-select__caret {
  transform: rotate(180deg);
}

.ok-select__clear {
  flex: 0 0 auto;
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: var(--ok-r-sm);
  color: var(--ok-text-3);
}

  .ok-select__clear:hover {
    background: var(--ok-surface-sunk);
    color: var(--ok-danger);
  }

/* Çoklu seçimde kutu genişliği seçim sayısından BAĞIMSIZ olmalı (2026-08-19).
   Seçim yapıldığında `.ok-select__value` içine tek satırlık "Seçilen : N adet"
   özeti yazılır; aşağıdaki kurallar kutunun içeriğe göre sağa doğru büyümesini
   ve satır kaydırmasını engeller. `.ok-select__value` zaten nowrap + ellipsis
   taşıyor; burası çoklu seçim için garantiyi açık hâle getiriyor. */
.ok-select--multi {
  max-width: 100%;
}

  .ok-select--multi .ok-select__control {
    max-width: 100%;
    flex-wrap: nowrap;
  }

  .ok-select--multi .ok-select__value {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

/* Çoklu seçimde etiket çipleri — 2026-08-19'dan itibaren ÇİZİLMİYOR.
   `select.js` artık etiket yerine "Seçilen : N adet" özeti basıyor (kullanıcı
   isteği: kutu derli toplu kalsın, sağa doğru açılmasın). Kurallar silinmedi;
   etiketli sunuma dönülmesi istenirse CSS'i yeniden yazmak gerekmesin diye
   duruyor. Ölü kural oldukları burada kayıtlıdır. */
.ok-select__tags {
  display: flex;
  flex-wrap: wrap;
  gap: 4px;
  flex: 1 1 auto;
  min-width: 0;
}

.ok-select__tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  max-width: 190px;
  padding: 1px 3px 1px 7px;
  border: 1px solid var(--ok-brand-200);
  border-radius: var(--ok-r-sm);
  background: var(--ok-brand-50);
  color: var(--ok-brand-800);
  font-size: var(--ok-fs-xs);
  line-height: 18px;
}

.ok-select__tag-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ok-select__tag-x {
  display: grid;
  place-items: center;
  width: 15px;
  height: 15px;
  border-radius: 3px;
  color: var(--ok-brand-600);
  flex: 0 0 auto;
}

  .ok-select__tag-x:hover {
    background: var(--ok-brand-200);
  }

  .ok-select__tag-x > .ok-icon {
    width: 10px;
    height: 10px;
    stroke-width: 2.6;
  }
/* Çok fazla seçim varsa "+N" ile topla */
.ok-select__tag--more {
  background: var(--ok-neutral-bg);
  border-color: var(--ok-neutral-br);
  color: var(--ok-text-2);
  padding-inline: 7px;
}

/* ---------- Açılır liste ------------------------------------------------ */
.ok-select__panel {
  position: absolute;
  z-index: var(--ok-z-dropdown);
  inset-inline: 0;
  top: calc(100% + 4px);
  display: flex;
  flex-direction: column;
  max-height: 320px;
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  box-shadow: var(--ok-sh-lg);
  overflow: hidden;
  animation: ok-menu-in var(--ok-dur-fast) var(--ok-ease);
}

  .ok-select__panel[hidden] {
    display: none;
  }

.ok-select__panel--up {
  top: auto;
  bottom: calc(100% + 4px);
}

.ok-select__search {
  padding: 6px var(--ok-sp-2); /* K-55: dikey 8 → 6 */
  border-bottom: 1px solid var(--ok-border);
  flex: 0 0 auto;
}

.ok-select__bulk {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: 4px var(--ok-sp-3); /* K-55 */
  border-bottom: 1px solid var(--ok-border);
  background: var(--ok-surface-alt);
  font-size: var(--ok-fs-xs);
  flex: 0 0 auto;
}

  .ok-select__bulk button {
    color: var(--ok-brand-700);
    font-weight: var(--ok-fw-medium);
  }

    .ok-select__bulk button:hover {
      text-decoration: underline;
    }

.ok-select__bulk-count {
  margin-inline-start: auto;
  color: var(--ok-text-3);
  font-variant-numeric: tabular-nums;
}

.ok-select__list {
  flex: 1 1 auto;
  overflow-y: auto;
  overscroll-behavior: contain;
  padding: var(--ok-sp-1);
}

.ok-select__opt {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  width: 100%;
  padding: 4px var(--ok-sp-2); /* K-55: satır 6 → 4 */
  border-radius: var(--ok-r-sm);
  font-size: var(--ok-fs-sm);
  color: var(--ok-text);
  text-align: start;
  cursor: pointer;
  min-width: 0;
}

  .ok-select__opt:hover,
  .ok-select__opt.is-focused {
    background: var(--ok-surface-sunk);
  }

  .ok-select__opt[aria-selected="true"] {
    background: var(--ok-brand-50);
    color: var(--ok-brand-800);
    font-weight: var(--ok-fw-medium);
  }

    .ok-select__opt[aria-selected="true"].is-focused {
      background: var(--ok-brand-100);
    }

.ok-select__opt-text {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ok-select__opt-meta {
  flex: 0 0 auto;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  font-variant-numeric: tabular-nums;
}

.ok-select__opt-pasif {
  flex: 0 0 auto;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
  font-style: italic;
}

.ok-select__opt-check {
  flex: 0 0 auto;
  color: var(--ok-brand-600);
  visibility: hidden;
}

.ok-select__opt[aria-selected="true"] .ok-select__opt-check {
  visibility: visible;
}

.ok-select__opt.is-disabled {
  opacity: .45;
  pointer-events: none;
}

.ok-select__opt mark {
  background: #FFF1A8;
  color: inherit;
  border-radius: 2px;
  padding: 0;
}

.ok-select__group-label {
  padding: 6px var(--ok-sp-2) 2px; /* K-55 */
  font-size: 10px;
  font-weight: var(--ok-fw-bold);
  color: var(--ok-text-3);
  text-transform: uppercase;
  letter-spacing: .06em;
}

.ok-select__empty {
  padding: var(--ok-sp-3) var(--ok-sp-3); /* K-55: 20 → 12 */
  text-align: center;
  color: var(--ok-text-3);
  font-size: var(--ok-fs-sm);
}
/* Panel altındaki klavye ipucu şeridi — 2026-08-19'dan itibaren ÇİZİLMİYOR.
   `select.js` bu `<div>`'i artık üretmiyor (kullanıcı ipucu satırını istemedi);
   klavye davranışının kendisi duruyor. Kural silinmedi, ölü olduğu kayıtlıdır.
   NOT: içindeki `.ok-kbd` GENEL bir sınıftır — `badge.css:158`'de tanımlı ve
   `pages\puantaj-matris.html:77` hâlâ kullanıyor; o sınıfa dokunulmadı. */
.ok-select__foot {
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border-top: 1px solid var(--ok-border);
  background: var(--ok-surface-alt);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  display: flex;
  gap: var(--ok-sp-3);
  align-items: center;
  flex: 0 0 auto;
}

/* Çoklu seçimde onay kutulu satırlar */
.ok-select--multi .ok-select__opt {
  padding-inline-start: var(--ok-sp-1);
}

.ok-select__opt-box {
  flex: 0 0 auto;
  width: 15px;
  height: 15px;
  border: 1.5px solid var(--ok-border-strong);
  border-radius: 3px;
  display: grid;
  place-items: center;
  background: var(--ok-surface);
}

.ok-select__opt[aria-selected="true"] .ok-select__opt-box {
  background: var(--ok-brand-600);
  border-color: var(--ok-brand-600);
  color: #fff;
}

.ok-select__opt-box > .ok-icon {
  width: 10px;
  height: 10px;
  stroke-width: 3.2;
  visibility: hidden;
}

.ok-select__opt[aria-selected="true"] .ok-select__opt-box > .ok-icon {
  visibility: visible;
}

/* ==== components/datepicker.css ========================================== */
/* ==========================================================================
   Tarih seçici (legacy Calendar.ascx + CalendarExtender + inputmask karşılığı)
   Biçim dd.MM.yyyy · hafta pazartesi başlar · Türkçe ay/gün adları ·
   ay-yıl modu bordro dönemi seçimi için.
   ========================================================================== */

.ok-dp {
  position: relative;
  min-width: 0;
}

/* ---------- Açılır takvim ----------------------------------------------- */
.ok-dp__panel {
  position: absolute;
  z-index: var(--ok-z-dropdown);
  top: calc(100% + 4px);
  inset-inline-start: 0;
  width: 268px;
  padding: var(--ok-sp-2);
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  box-shadow: var(--ok-sh-lg);
  animation: ok-menu-in var(--ok-dur-fast) var(--ok-ease);
  user-select: none;
}

  .ok-dp__panel[hidden] {
    display: none;
  }

.ok-dp__panel--up {
  top: auto;
  bottom: calc(100% + 4px);
}
/* Aralık seçiminde iki ay yan yana */
.ok-dp__panel--range {
  width: 528px;
}

.ok-dp__head {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-1);
  margin-bottom: var(--ok-sp-2);
}

.ok-dp__nav {
  display: grid;
  place-items: center;
  width: 28px;
  height: 28px;
  border-radius: var(--ok-r-md);
  color: var(--ok-text-2);
  flex: 0 0 auto;
}

  .ok-dp__nav:hover {
    background: var(--ok-surface-sunk);
    color: var(--ok-text);
  }

  .ok-dp__nav:disabled {
    opacity: .35;
    cursor: default;
  }

.ok-dp__title {
  flex: 1 1 auto;
  text-align: center;
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-semibold);
  padding: 5px var(--ok-sp-2);
  border-radius: var(--ok-r-md);
  color: var(--ok-text);
}

  .ok-dp__title:hover {
    background: var(--ok-surface-sunk);
  }

/* ---------- Gün ızgarası ------------------------------------------------ */
.ok-dp__grid {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 1px;
}

.ok-dp__dow {
  text-align: center;
  padding-block: 4px;
  font-size: 10px;
  font-weight: var(--ok-fw-bold);
  color: var(--ok-text-3);
  text-transform: uppercase;
  letter-spacing: .04em;
}

.ok-dp__dow--we {
  color: var(--ok-danger);
}

.ok-dp__day {
  position: relative;
  height: 32px;
  display: grid;
  place-items: center;
  border: 1px solid transparent;
  border-radius: var(--ok-r-sm);
  font-size: var(--ok-fs-sm);
  color: var(--ok-text);
  font-variant-numeric: tabular-nums;
  cursor: pointer;
  transition: background var(--ok-dur-fast) var(--ok-ease);
}

  .ok-dp__day:hover {
    background: var(--ok-brand-50);
  }

  .ok-dp__day.is-outside {
    color: var(--ok-text-3);
  }

  .ok-dp__day.is-weekend {
    color: var(--ok-danger);
  }
  /* Resmî tatil — TH_WORK_CAL'dan gelir */
  .ok-dp__day.is-holiday {
    background: var(--ok-danger-bg);
    color: var(--ok-danger);
  }

    .ok-dp__day.is-holiday::after {
      content: "";
      position: absolute;
      bottom: 3px;
      width: 4px;
      height: 4px;
      border-radius: 50%;
      background: var(--ok-danger);
    }

  .ok-dp__day.is-today {
    border-color: var(--ok-brand-300);
    font-weight: var(--ok-fw-bold);
  }

  .ok-dp__day.is-selected {
    background: var(--ok-brand-600);
    color: #fff;
    font-weight: var(--ok-fw-semibold);
    border-color: var(--ok-brand-600);
  }

    .ok-dp__day.is-selected.is-holiday,
    .ok-dp__day.is-selected.is-weekend {
      color: #fff;
    }

  .ok-dp__day:disabled,
  .ok-dp__day.is-disabled {
    opacity: .35;
    cursor: not-allowed;
    background: transparent;
  }

/* ---------- Ay / yıl seçimi (bordro dönemi) ---------------------------- */
.ok-dp__grid--months {
  grid-template-columns: repeat(3, 1fr);
  gap: var(--ok-sp-1);
}

.ok-dp__grid--years {
  grid-template-columns: repeat(4, 1fr);
  gap: var(--ok-sp-1);
}

.ok-dp__cell {
  height: 36px;
  display: grid;
  place-items: center;
  border: 1px solid transparent;
  border-radius: var(--ok-r-md);
  font-size: var(--ok-fs-sm);
  color: var(--ok-text);
  cursor: pointer;
  font-variant-numeric: tabular-nums;
}

  .ok-dp__cell:hover {
    background: var(--ok-brand-50);
  }

  .ok-dp__cell.is-selected {
    background: var(--ok-brand-600);
    color: #fff;
    font-weight: var(--ok-fw-semibold);
  }

/* ---------- Alt bar: bugün / temizle / hazır aralıklar ----------------- */
.ok-dp__foot {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  margin-top: var(--ok-sp-2);
  padding-top: var(--ok-sp-2);
  border-top: 1px solid var(--ok-border);
  flex-wrap: wrap;
}

.ok-dp__quick {
  padding: 3px 8px;
  border-radius: var(--ok-r-pill);
  background: var(--ok-surface-sunk);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-xs);
  white-space: nowrap;
}

  .ok-dp__quick:hover {
    background: var(--ok-brand-50);
    color: var(--ok-brand-700);
  }

.ok-dp__foot-end {
  margin-inline-start: auto;
  display: flex;
  gap: var(--ok-sp-2);
}

@media (max-width: 640px) {
  .ok-dp__panel--range {
    width: 268px;
  }
}

/* ==== components/card.css ================================================ */
/* ==========================================================================
   Kart (legacy .portlet.box.blue-hoki karşılığı)
   Gölge YOK — yoğun veri ekranında gürültü yapıyor; 1px kenarlık yeterli.
   ========================================================================== */

/* [2026-08-19 — kullanıcı kararı; K-49 geri alındı] Kart gövdesi BEYAZ,
   kabuk zemini gri. Kart artık gri plandan kendi beyazıyla ayrışıyor; 1px
   kenarlık kenar çizgisini verir, gölge yine gerekmiyor. Renk tokens.css'ten
   gelir (`--ok-panel`), bu dosyaya ham renk yazılmaz. */
.ok-card {
  background: var(--ok-panel);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  min-width: 0;
  max-width: 100%;
}

  .ok-card + .ok-card,
  section.ok-card.ok-mt-4 {
    margin-top: var(--ok-sp-2);
  }

/* -- Başlık: sol tarafta ad, sağ tarafta aksiyonlar -- */
.ok-card__head {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  min-height: 42px; /* K-55: 48 → 42 */
  padding: 4px var(--ok-card-px); /* K-55: dikey 8 → 6 */
  border-bottom: 1px solid var(--ok-border);
  flex-wrap: wrap;
}

.ok-card__title {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
  font-size: var(--ok-fs-base);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text);
  min-width: 0;
}

  .ok-card__title > .ok-icon {
    color: var(--ok-brand-600);
  }

.ok-card__subtitle {
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-normal);
  color: var(--ok-text-3);
}

.ok-card__actions {
  margin-inline-start: auto;
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

/* Kart başlığındaki araç alanı: arama kutusu, filtre, görünüm düğmesi */
.ok-card__tools {
  margin-inline-start: auto;
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  flex-wrap: wrap;
  min-width: 0;
}

/* Başlığın yanındaki kayıt sayısı notu — sayı `<b>` içinde, mono */
.ok-card__count {
  margin-inline-start: var(--ok-sp-2);
}

  .ok-card__count b {
    font-family: var(--ok-font-mono);
    font-weight: var(--ok-fw-semibold);
    color: var(--ok-text-2);
  }

/* [K-55, 2026-08-19] Kart gövdesinin DİKEY iç boşluğu artık ayrı token:
   yatay 16px korunuyor, dikey 16 → 10. Şikâyet dikeydi. */
.ok-card__body {
  padding: var(--ok-card-py) var(--ok-card-px) var(--ok-card-px) var(--ok-card-px);
  min-width: 0;
  max-width: 100%;
}

.ok-card__body--flush {
  padding: 0;
}

/* [2026-08-20 — kullanıcı kararı] Liste ekranlarının üst FİLTRE panelinin gövdesi
   beyaz değil, hafif mavi (`--ok-panel-filter`, tokens.css — ham renk buraya yazılmaz).

   Seçici üç şeyi birden ayırt ediyor; üçü de kod tabanında doğrulandı:
     · `section.ok-card`  → liste ekranı kartı (30 kullanım). Detay ekranları
       `form.ok-card` kullanır (29 kullanım) ve BU KURALIN DIŞINDADIR — orada
       gövde formun kendisidir, mavi yapmak tüm detay ekranını boyardı.
     · `:not(.ok-card__body--flush)` → `--flush` gövde ızgara panelidir
       (16 yer: `data-*-grid` kabı). Beyaz kalmalı, yoksa tablonun arkasında
       mavi bir bant oluşur.
     · `> ` doğrudan çocuk → iç içe kartların gövdesi etkilenmez.

   Sonuç: 14 filtre paneli mavi, 16 ızgara paneli beyaz.

   [2026-08-20 — ikinci daraltma, kullanıcı isteği] Kapsam `:has(.ok-field)` ile daraltıldı:
   yalnız **form alanı taşıyan** kart gövdeleri mavi olur. Gerekçe — ilk hâl `Index`
   gösterge paneli kutucuklarını ve `ReportShow` gibi salt-gösterim panellerini de
   boyuyordu; onlar filtre değil.
   ⚠️ "Altında Ara düğmesi olan" ölçütü DENENDİ ve ELENDİ: 14 panelin yalnız 5'inde
   `lblBtnSearch` var. `Security/PortalUsers`, `Security/CompanyResources`,
   `Security/UserGroupUsers` gibi ekranlar gerçek filtre paneli taşıyor ama etiketli bir
   arama düğmeleri yok; o ölçüt 9 meşru paneli beyaza döndürürdü.
   ========================================================================== */
section.ok-card > .ok-card__body:not(.ok-card__body--flush):has(.ok-field) {
  background: var(--ok-panel-filter);
}

  /* Köşe uyumu. Kart yuvarlak (`--ok-r-lg`), gövde karedir; zemin beyazken bu
   görünmüyordu, mavi olunca köşelerde BEYAZ ÜÇGENLER kalır. `overflow: hidden`
   ile çözülmedi: kart içindeki açılır liste ve tarih seçici kartın dışına
   taşabiliyor, kırpmak onları keserdi. Bunun yerine gövde, kenarda olduğu
   kenarların yarıçapını devralır — başlığı olan kartta üst köşeler zaten
   başlığa komşudur, `:first-child` orada eşleşmez. */
  section.ok-card > .ok-card__body:not(.ok-card__body--flush):has(.ok-field):first-child {
    border-start-start-radius: inherit;
    border-start-end-radius: inherit;
  }

  section.ok-card > .ok-card__body:not(.ok-card__body--flush):has(.ok-field):last-child {
    border-end-start-radius: inherit;
    border-end-end-radius: inherit;
  }

.ok-card__foot {
  padding: var(--ok-sp-2) var(--ok-card-px); /* K-55: dikey 12 → 8 */
  border-top: 1px solid var(--ok-border);
  /* Ayak, beyaz gövdeden bir ton koyu bir şeritle ayrılır (2026-08-19: gövde
     beyazlaşınca `--ok-panel-alt` de bir ton açıldı — token'da yapıldı). */
  background: var(--ok-panel-alt);
  border-end-start-radius: var(--ok-r-lg);
  border-end-end-radius: var(--ok-r-lg);
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  flex-wrap: wrap;
  font-size: var(--ok-fs-sm);
}

/* -- Katlanır kart (legacy .portlet .tools > a.expand karşılığı) -- */
.ok-card--collapsible > .ok-card__head {
  cursor: pointer;
  user-select: none;
}

.ok-card.is-collapsed > .ok-card__body,
.ok-card.is-collapsed > .ok-card__foot {
  display: none;
}

.ok-card.is-collapsed > .ok-card__head {
  border-bottom: 0;
}


/* ==========================================================================
   İstatistik kutusu (dashboard sayaç kartları)
   Portal anasayfasındaki "Bekleyen Onaylar", "Geciken Görevler" vb. karşılığı.
   ========================================================================== */
.ok-stat {
  display: flex;
  align-items: flex-start;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-4);
  background: var(--ok-panel); /* kart gövdesiyle aynı yüzey (2026-08-19: beyaz) */
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  text-decoration: none;
  color: inherit;
  position: relative;
  overflow: hidden;
  transition: border-color var(--ok-dur-fast) var(--ok-ease), box-shadow var(--ok-dur-fast) var(--ok-ease);
}

a.ok-stat:hover {
  text-decoration: none;
  border-color: var(--ok-brand-300);
  box-shadow: var(--ok-sh-sm);
}

.ok-stat__icon {
  display: grid;
  place-items: center;
  width: 38px;
  height: 38px;
  border-radius: var(--ok-r-md);
  background: var(--ok-brand-50);
  color: var(--ok-brand-600);
  flex: 0 0 auto;
}

.ok-stat__text {
  min-width: 0;
  flex: 1 1 auto;
  display: block;
}

.ok-stat__value {
  display: block;
  font-size: var(--ok-fs-xl);
  font-weight: var(--ok-fw-bold);
  line-height: 1.1;
  font-variant-numeric: tabular-nums;
  letter-spacing: -.02em;
}

.ok-stat__label {
  display: block;
  margin-top: 3px;
  font-size: var(--ok-fs-sm);
  color: var(--ok-text-2);
  line-height: 1.3;
}

.ok-stat__meta {
  margin-top: var(--ok-sp-2);
  display: flex;
  align-items: center;
  gap: var(--ok-sp-1);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
}

.ok-stat__delta {
  font-weight: var(--ok-fw-semibold);
}

.ok-stat__delta--up {
  color: var(--ok-success);
}

.ok-stat--warning {
  border-color: var(--ok-warning-br);
}

  .ok-stat--warning .ok-stat__icon {
    background: var(--ok-warning-bg);
    color: var(--ok-warning);
  }

/* ==========================================================================
   Anahtar-değer listesi (özet paneller, salt-okunur kartlar)
   ========================================================================== */
.ok-kv {
  display: grid;
  grid-template-columns: minmax(120px, auto) 1fr;
  gap: var(--ok-sp-2) var(--ok-sp-4);
  font-size: var(--ok-fs-sm);
}

.ok-kv__k {
  color: var(--ok-text-3);
}

.ok-kv__v {
  color: var(--ok-text);
  font-weight: var(--ok-fw-medium);
  min-width: 0;
}

.ok-kv--rows {
  grid-template-columns: 1fr;
  gap: var(--ok-sp-1);
}

.ok-kv--lined {
  row-gap: 0;
  column-gap: var(--ok-sp-4);
}

  .ok-kv--lined > .ok-kv__k,
  .ok-kv--lined > .ok-kv__v {
    padding-block: 7px;
    border-bottom: 1px solid var(--ok-border);
  }

/* ==========================================================================
   Toplam bandı (bordro kazanç/kesinti toplamları, rapor alt toplamları)
   ========================================================================== */
.ok-totals {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ok-sp-1);
  padding: var(--ok-sp-3) var(--ok-card-px);
  background: var(--ok-brand-50);
  border: 1px solid var(--ok-brand-100);
  border-radius: var(--ok-r-md);
}

.ok-totals__item {
  flex: 1 1 150px;
  padding-inline: var(--ok-sp-3);
  border-inline-start: 1px solid var(--ok-brand-200);
}

  .ok-totals__item:first-child {
    border-inline-start: 0;
    padding-inline-start: 0;
  }

.ok-totals__label {
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
  white-space: nowrap;
}

.ok-totals__value {
  font-size: var(--ok-fs-md);
  font-weight: var(--ok-fw-bold);
  color: var(--ok-brand-800);
  font-variant-numeric: tabular-nums;
}

.ok-totals__value--neg {
  color: var(--ok-danger);
}

.ok-totals__item--net {
  background: var(--ok-surface);
  border-radius: var(--ok-r-sm);
}

@media (max-width: 640px) {
  .ok-card__head {
    min-height: 0;
    padding-block: var(--ok-sp-3);
  }

  .ok-card__actions {
    margin-inline-start: 0;
    width: 100%;
  }

  .ok-kv {
    grid-template-columns: 1fr;
    gap: 2px var(--ok-sp-4);
  }

  .ok-kv__k {
    font-size: var(--ok-fs-xs);
  }

  .ok-kv__v {
    margin-bottom: var(--ok-sp-2);
  }

  .ok-totals__item {
    border-inline-start: 0;
    padding-inline: 0;
    flex-basis: 45%;
  }
}

/* ── Bölüm kutusu — legacy `.withshadow` karşılığı ───────────────────────────
   [2026-08-22 — kullanıcı isteği] Legacy'de form içindeki mantıksal grupları
   (personel özeti, dönem bandı, tutar bloğu) gölgeli bir kutuyla ayıran bir
   sınıf var ve **104 `.aspx` ekranında** kullanılıyor:
       src\OrtakIK\assets\admin\pages\css\ortakik.css:283

   Değerler legacy'den BİREBİR alındı, token'a bağlanmadı — kullanıcı önce
   gerçek legacy görünümünü değerlendirecek. Beğenilirse ölçüler token'a
   çekilir ve tüm ekranlara yayılır.

   ⚠️ Legacy kuralında `box-shadow` İKİ KEZ yazılı: önce `… inset`, hemen
   ardından insetsiz aynı değer. İkincisi birincisini ezer, yani yürürlükteki
   gölge DIŞ gölgedir. Buraya yalnız kazanan bildirim alındı.

   ⚠️ Bu, `00-tasarim-ilkeleri.md` §2'deki "kartlar gölgesizdir" ilkesine
   bilinçli bir istisnadır: orada gerekçe "yirmi kartın yan yana durduğu
   dashboard"du; burada ise tek formun içindeki 2-3 grup ayrılıyor.

   ⚠️ Legacy'de YATAY dolgu yoktur (yalnız üst/alt 10px) — birebir korundu.  */
.ok-withshadow {
  display: block;
  margin: 5px;
  border: 1px solid var(--ok-border-hard, #AFBECF);
  border-radius: var(--ok-r-md);
  box-shadow: 0 2px 4px rgba(15, 23, 42, .12), 0 8px 18px -8px rgba(15, 23, 42, .22);
  padding-top: 10px;
  padding-bottom: 10px;
  overflow: hidden;
}

.ok-withshadow:has(.ok-select__panel:not([hidden])),
.ok-withshadow:has(.ok-dp__panel:not([hidden])) {
  overflow: visible;
}

/* ==========================================================================
   KART KİTAPLIĞI — kapak, kart ızgarası, gruplu bant, belge kartı
   Üç parça bağımsızdır: `.ok-cardgrid` herhangi bir kart kümesini dizer,
   `.ok-group` herhangi bir bölümü bantlar, `.ok-doccard` dosya kartıdır.
   ========================================================================== */

/* -- Kart genişliğinde kapak görseli -- */
.ok-cover {
  display: block;
  width: 100%;
  max-height: 150px;
  object-fit: cover;
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  margin-bottom: var(--ok-sp-4);
}

/* -- Kart ızgarası -- */
.ok-cardgrid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(min(248px, 100%), 1fr));
  gap: var(--ok-sp-1);
}

.ok-cardgrid--rows {
  grid-template-columns: 1fr;
}

/* -- Gruplu bant: yatay dolguyu negatifiyle taşırır, kart kenarına dayanır -- */
.ok-group {
  padding: var(--ok-sp-2) var(--ok-card-px);
  margin-inline: calc(var(--ok-card-px) * -1);
  border-radius: var(--ok-r-md);
}

  .ok-group--zebra {
    background: var(--ok-panel-alt);
  }

.ok-group__head {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  margin-bottom: var(--ok-sp-3);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  min-width: 0;
  background: var(--ok-brand-50);
  border: 1px solid var(--ok-brand-100);
  border-radius: var(--ok-r-md);
}

.ok-group__icon {
  flex: 0 0 auto;
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: var(--ok-r-md);
  background: var(--ok-brand-600);
  color: var(--ok-text-on-brand);
}

.ok-group__title {
  min-width: 0;
  font-size: var(--ok-fs-lg);
  font-weight: var(--ok-fw-bold);
  letter-spacing: -.01em;
  color: var(--ok-text);
  overflow-wrap: anywhere;
}

/* -- Belge kartı -- */
.ok-doccard {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-4);
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  transition: border-color var(--ok-dur-base) var(--ok-ease);
}

  .ok-doccard:hover,
  .ok-doccard:focus-within {
    border-color: var(--ok-brand-300);
  }

.ok-doccard__top {
  display: flex;
  align-items: flex-start;
  gap: var(--ok-sp-3);
  min-width: 0;
}

.ok-doccard__type {
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: var(--ok-r-md);
  background: var(--ok-brand-50);
  color: var(--ok-brand-700);
}

.ok-doccard--missing .ok-doccard__type {
  background: var(--ok-surface-sunk);
  color: var(--ok-text-3);
}

.ok-doccard__id {
  min-width: 0;
}

.ok-doccard__name {
  margin: 0;
  font-size: var(--ok-fs-base);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text);
  overflow-wrap: anywhere;
}

.ok-doccard__meta {
  display: flex;
  flex-wrap: wrap;
  gap: 2px var(--ok-sp-3);
  margin-top: 3px;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  overflow-wrap: anywhere;
}

  .ok-doccard__meta > span {
    display: inline-flex;
    align-items: center;
    gap: 4px;
    min-width: 0;
  }

.ok-doccard__tags {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ok-sp-2);
}

.ok-doccard__foot {
  margin-top: auto;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--ok-sp-2);
  padding-top: var(--ok-sp-3);
  border-top: 1px solid var(--ok-border);
}

  .ok-doccard__foot > .ok-btn {
    min-width: 0;
  }

    .ok-doccard__foot > .ok-btn > span {
      overflow: hidden;
      text-overflow: ellipsis;
    }

.ok-doccard__acts {
  margin-inline-start: auto;
  display: flex;
  flex: none;
  gap: 4px;
}

@media (max-width: 860px) {
  .ok-card__tools {
    width: 100%;
    margin-inline-start: 0;
  }

  .ok-input-icon--grow {
    max-width: none;
  }

  .ok-card__count {
    margin-inline-start: 0;
  }
}

@media (max-width: 480px) {
  .ok-cover {
    max-height: 110px;
  }

  .ok-group {
    padding-block: var(--ok-sp-3);
  }

  .ok-group__title {
    font-size: var(--ok-fs-md);
  }

  .ok-doccard {
    padding: var(--ok-sp-3);
    gap: var(--ok-sp-2);
  }
}

/* ==== components/badge.css =============================================== */
/* ==========================================================================
   Etiketler, durum göstergeleri, çipler
   Legacy karşılıkları: .badge.lstCount (kayıt sayısı), grid içi Onaylandı /
   Süreç Devam Ediyor / Onaylanmadı metinleri, .blob_* animasyonlu noktalar.
   ========================================================================== */

/* ---------- Etiket (badge) ---------------------------------------------- */
.ok-badge {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 8px;
  border: 1px solid var(--ok-neutral-br);
  border-radius: var(--ok-r-pill);
  background: var(--ok-neutral-bg);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  line-height: 18px;
  white-space: normal;
  overflow-wrap: anywhere;
  max-width: 100%;
}

  .ok-badge > .ok-icon {
    width: 13px;
    height: 13px;
    flex: 0 0 auto;
  }

.ok-badge__text {
  min-width: 0;
}

.ok-badge--brand {
  background: var(--ok-brand-50);
  border-color: var(--ok-brand-200);
  color: var(--ok-brand-700);
}

.ok-badge--success {
  background: var(--ok-success-bg);
  border-color: var(--ok-success-br);
  color: var(--ok-success);
}

.ok-badge--warning {
  background: var(--ok-warning-bg);
  border-color: var(--ok-warning-br);
  color: var(--ok-warning);
}

.ok-badge--danger {
  background: var(--ok-danger-bg);
  border-color: var(--ok-danger-br);
  color: var(--ok-danger);
}

.ok-badge--info {
  background: var(--ok-info-bg);
  border-color: var(--ok-info-br);
  color: var(--ok-info);
}

:root:not([data-theme="dark"]) .ok-badge--success:not(.ok-badge--solid) {
  color: color-mix(in srgb, var(--ok-success) 50%, #000);
}

:root:not([data-theme="dark"]) .ok-badge--warning:not(.ok-badge--solid) {
  color: color-mix(in srgb, var(--ok-warning) 50%, #000);
}

:root:not([data-theme="dark"]) .ok-badge--info:not(.ok-badge--solid) {
  color: color-mix(in srgb, var(--ok-info) 75%, #000);
}

/* Dolgulu varyant — dikkat çekmesi gereken sayaçlar */
.ok-badge--solid {
  border-color: transparent;
  background: var(--ok-brand-600);
  color: #fff;
}

  .ok-badge--solid.ok-badge--danger {
    background: var(--ok-danger);
    color: #fff;
  }

  .ok-badge--solid.ok-badge--success {
    background: var(--ok-success);
    color: #fff;
  }

  .ok-badge--solid.ok-badge--warning {
    background: var(--ok-warning);
    color: #fff;
  }

/* Sakin varyant — rozetin metnini gövde kalınlığına indirir [K-73, 2026-08-20].
   Taban `.ok-badge` bilerek `--ok-fw-medium` (500) taşır: rozetlerin çoğu sayaç,
   durum ya da kod gibi VURGULANMASI gereken değerlerdir. Ama bir rozet yalnızca
   "bu satırda özel bir durum yok" demek için varsa, kalın metin gereksiz bir
   dikkat çağrısıdır ve tabloyu gürültülü gösterir. Bu modifier tabana DOKUNMADAN
   yalnız o rozetleri sakinleştirir — taban değiştirilseydi 166 kullanım yerinin
   hepsi (sayaçlar, `--code` sicil numaraları, uyarı rozetleri) etkilenirdi.
   Aynı satır içinde sakin ve normal rozetler yan yana durabilir; kalınlık farkı
   o durumda bilginin kendisidir. Renkten bağımsızdır, her varyantla birleşir. */
.ok-badge--quiet {
  font-weight: var(--ok-fw-normal);
}

/* Köşeli varyant — kod, sicil no gibi teknik değerler */
.ok-badge--code {
  border-radius: var(--ok-r-sm);
  font-family: var(--ok-font-mono);
  font-variant-numeric: tabular-nums;
  letter-spacing: .02em;
}

/* Sayı balonu (sekme başlığındaki doküman sayacı gibi) */
.ok-count {
  display: inline-grid;
  place-items: center;
  min-width: 19px;
  height: 19px;
  padding-inline: 5px;
  border-radius: var(--ok-r-pill);
  background: var(--ok-neutral-bg);
  color: var(--ok-text-2);
  font-size: 11px;
  font-weight: var(--ok-fw-bold);
  font-variant-numeric: tabular-nums;
  line-height: 1;
}

.ok-count--brand {
  background: var(--ok-brand-100);
  color: var(--ok-brand-700);
}

/* Kayıt sayısı göstergesi (legacy .badge.lstCount) */
.ok-reccount {
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
  white-space: nowrap;
}

.ok-reccount__n {
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-bold);
  color: var(--ok-brand-700);
  font-variant-numeric: tabular-nums;
}

/* ---------- Durum göstergesi (nokta + metin) ---------------------------- */
.ok-status {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  white-space: nowrap;
}

  .ok-status::before {
    content: "";
    width: 11px;
    height: 11px;
    margin: 0 4px;
    border-radius: 50%;
    background: currentColor;
    flex: 0 0 auto;
    box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 22%, transparent),
                0 0 0 0 color-mix(in srgb, currentColor 55%, transparent);
    transform: scale(0.85);
    animation: ok-status-nabiz 2.4s ease-in-out infinite;
  }

@keyframes ok-status-nabiz {
  0% {
    transform: scale(0.85);
    box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 22%, transparent),
                0 0 0 0 color-mix(in srgb, currentColor 55%, transparent);
  }

  50% {
    transform: scale(1.1);
    box-shadow: 0 0 0 4px color-mix(in srgb, currentColor 18%, transparent),
                0 0 0 9px color-mix(in srgb, currentColor 0%, transparent);
  }

  100% {
    transform: scale(0.85);
    box-shadow: 0 0 0 2px color-mix(in srgb, currentColor 22%, transparent),
                0 0 0 0 color-mix(in srgb, currentColor 0%, transparent);
  }
}

@media (prefers-reduced-motion: reduce) {
  .ok-status::before {
    animation: none;
  }
}

.row > .ok-status {
  flex: 0 0 auto;
  width: auto;
  max-width: none;
  align-self: flex-start;
  min-height: var(--ok-ctrl-h);
  padding-inline: 4px;
}

.ok-status--approved {
  color: color-mix(in srgb, var(--ok-state-approved) 90%, #fff);
}

.ok-status--pending {
  color: color-mix(in srgb, var(--ok-brand-700) 90%, #fff);
}

.ok-status--rejected {
  color: var(--ok-state-rejected);
}

.ok-status--locked {
  color: #E8871E;
}

  .ok-status--locked::before {
    color: #FFCC00;
    border: 1.5px solid #D98300;
    box-sizing: border-box;
    box-shadow: 0 0 0 2px rgba(217, 131, 0, 0.35),
                0 0 0 0 rgba(217, 131, 0, 0.75);
    animation-name: ok-status-nabiz-kilit;
  }

@keyframes ok-status-nabiz-kilit {
  0% {
    transform: scale(0.85);
    box-shadow: 0 0 0 2px rgba(217, 131, 0, 0.35),
                0 0 0 0 rgba(217, 131, 0, 0.75);
  }

  50% {
    transform: scale(1.15);
    box-shadow: 0 0 0 4px rgba(217, 131, 0, 0.3),
                0 0 0 11px rgba(217, 131, 0, 0);
  }

  100% {
    transform: scale(0.85);
    box-shadow: 0 0 0 2px rgba(217, 131, 0, 0.35),
                0 0 0 0 rgba(217, 131, 0, 0);
  }
}

.ok-status--draft {
  color: var(--ok-state-draft);
}

@keyframes ok-pulse {
  0%, 100% {
    box-shadow: 0 0 0 3px color-mix(in srgb, currentColor 16%, transparent);
  }

  50% {
    box-shadow: 0 0 0 6px color-mix(in srgb, currentColor 4%, transparent);
  }
}

/* ---------- Çip (aktif filtre göstergeleri) ----------------------------- */
.ok-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 6px 3px 9px;
  border: 1px solid var(--ok-brand-200);
  border-radius: var(--ok-r-pill);
  background: var(--ok-brand-50);
  color: var(--ok-brand-800);
  font-size: var(--ok-fs-xs);
  max-width: 280px;
}

.ok-chip__label {
  color: var(--ok-brand-600);
  font-weight: var(--ok-fw-semibold);
}

.ok-chip__value {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ok-chip__x {
  display: grid;
  place-items: center;
  width: 17px;
  height: 17px;
  border-radius: 50%;
  color: var(--ok-brand-600);
  flex: 0 0 auto;
}

  .ok-chip__x:hover {
    background: var(--ok-brand-200);
    color: var(--ok-brand-900);
  }

  .ok-chip__x > .ok-icon {
    width: 11px;
    height: 11px;
    stroke-width: 2.4;
  }

.ok-chips {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ok-sp-2);
  align-items: center;
}

/* ---------- Ayraç etiketi ---------------------------------------------- */
.ok-divider-label {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  color: var(--ok-text-3);
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-semibold);
  text-transform: uppercase;
  letter-spacing: .06em;
}

  .ok-divider-label::before,
  .ok-divider-label::after {
    content: "";
    flex: 1 1 auto;
    height: 1px;
    background: var(--ok-border);
  }

/* ---------- Klavye tuşu (kısayol ipuçları) ----------------------------- */
.ok-kbd {
  display: inline-block;
  min-width: 20px;
  padding: 1px 5px;
  border: 1px solid var(--ok-border-strong);
  border-bottom-width: 2px;
  border-radius: var(--ok-r-sm);
  background: var(--ok-surface);
  color: var(--ok-text-2);
  font-family: var(--ok-font-mono);
  font-size: 11px;
  line-height: 16px;
  text-align: center;
}

/* --------------------------------------------------------------------------
   BÖLÜM BANDI — `.ok-band`

   Form içindeki mantıksal grupların başlığı: tam genişlikte, ortalanmış,
   dolu mavi şerit. K-64 ile yasaklanan `.ok-form-section`in (ikonlu, BÜYÜK
   HARF, alt çizgili başlık) yerine geçmez — o bir BAŞLIK BLOĞUYDU, bu bir
   ETİKET ŞERİDİDİR ve kullanıcı tarafından açıkça istendi (2026-09-06).

   Ölçüler `badge d-block fs-6` kalıbından birebir alındı: dolgu Bootstrap
   `.badge`in `0.35em 0.65em`i, punto `fs-6` = 16px = `--ok-fs-md`.

   ⚠️ `white-space` BİLEREK `normal`. Bootstrap `.badge` `nowrap` verir;
   etiket metinleri `{{br}}` ile iki satır olabildiği için (örn.
   `CWF_AINFO_EMAIL_2`) `nowrap` uzun satırı kabın dışına taşırıyordu.

   ⚠️ Mevcut 18 kullanım satır içi `style="background-color:#588ec7"` ile
   yazılmıştır ve bu sınıfa ÇEVRİLMEDİ; satır içi stil sınıfı ezdiği için
   ikisi bir arada sorunsuz yaşar. Çevirme ayrı bir iş kalemidir.
   -------------------------------------------------------------------------- */
.ok-band {
  display: block;
  padding: 0.35em 0.65em;
  font-size: var(--ok-fs-md);
  font-weight: var(--ok-fw-normal);
  line-height: var(--ok-lh-tight);
  color: var(--ok-band-fg);
  background: var(--ok-band-bg);
  text-align: center;
  white-space: normal;
  border-radius: var(--ok-r-md);
}

/* ==== components/feedback.css ============================================ */
/* ==========================================================================
   Geri bildirim: uyarı kutusu · bildirim (toast) · boş durum · ipucu ·
   ilerleme · iskelet · yükleniyor perdesi
   Legacy karşılıkları: toastr (MessageBox.ascx), AlertMessage.ascx, blockUI.
   ========================================================================== */

/* ---------- Uyarı kutusu (sayfa içi kalıcı mesaj) ----------------------- */
.ok-alert {
  --ok-alert-t: var(--ok-info);
  display: flex;
  align-items: stretch;
  padding: 0;
  overflow: hidden;
  border: 1px solid var(--ok-info-br);
  border-radius: var(--ok-r-md);
  background: var(--ok-info-bg);
  color: var(--ok-text);
  font-size: var(--ok-fs-base);
}

.ok-alert:not(:has(.ok-alert__body)) {
  padding: var(--ok-sp-3) var(--ok-sp-4);
  gap: var(--ok-sp-3);
}

.ok-alert__icon {
  flex: 0 0 auto;
  align-self: stretch;
  width: 42px;
  display: grid;
  place-items: center;
  background: var(--ok-alert-t);
  color: var(--ok-surface);
}

  .ok-alert__icon .ok-icon {
    width: 20px;
    height: 20px;
  }

.ok-alert__body {
  min-width: 0;
  flex: 1 1 auto;
  padding: var(--ok-sp-3) var(--ok-sp-4);
}

.ok-alert__title {
  font-weight: var(--ok-fw-semibold);
  margin-bottom: 4px;
  color: var(--ok-text);
  font-size: 15px;
}

.ok-alert__actions {
  margin-top: var(--ok-sp-3);
  display: flex;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

.ok-alert--success {
  --ok-alert-t: var(--ok-success);
  background: color-mix(in srgb, var(--ok-success) 13%, var(--ok-surface));
  border-color: var(--ok-success-br);
}

.ok-alert--warning {
  --ok-alert-t: var(--ok-warning);
  background: var(--ok-warning-bg);
  border-color: var(--ok-warning-br);
}

.ok-alert--danger {
  --ok-alert-t: var(--ok-danger);
  background: var(--ok-danger-bg);
  border-color: var(--ok-danger-br);
}

.ok-alert--neutral {
  --ok-alert-t: var(--ok-text-3);
  background: var(--ok-surface-alt);
  border-color: var(--ok-border);
}

.ok-alert--info {
  --ok-alert-t: var(--ok-info);
  background: color-mix(in srgb, var(--ok-info) 13%, var(--ok-surface));
  border-color: var(--ok-info-br);
}

/* ---------- Bildirim (toast) -------------------------------------------- */
.ok-toasts {
  position: fixed;
  z-index: var(--ok-z-toast);
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-2);
  padding: var(--ok-sp-3);
  pointer-events: none;
  max-width: min(440px, calc(100vw - 24px));
}

  .ok-toasts[data-pos="top-center"] {
    top: 0;
    left: 50%;
    translate: -50% 0;
    align-items: center;
  }

  .ok-toasts[data-pos="top-right"] {
    top: 0;
    inset-inline-end: 0;
    align-items: flex-end;
  }

  .ok-toasts[data-pos="top-left"] {
    top: 0;
    inset-inline-start: 0;
    align-items: flex-start;
  }

  .ok-toasts[data-pos="bottom-right"] {
    bottom: 0;
    inset-inline-end: 0;
    align-items: flex-end;
    flex-direction: column-reverse;
  }

  .ok-toasts[data-pos="bottom-center"] {
    bottom: 0;
    left: 50%;
    translate: -50% 0;
    align-items: center;
    flex-direction: column-reverse;
  }

.ok-toast {
  pointer-events: auto;
  display: flex;
  align-items: flex-start;
  gap: var(--ok-sp-3);
  width: 100%;
  min-width: 280px;
  padding: var(--ok-sp-3) var(--ok-sp-3) var(--ok-sp-3) var(--ok-sp-4);
  border: 1px solid #444444;
  border-inline-start: 4px solid var(--ok-brand-600);
  border-radius: var(--ok-r-md);
  background: #2a2a2a;
  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
  font-size: var(--ok-fs-sm);
  animation: ok-toast-in var(--ok-dur-base) var(--ok-ease);
  color: #ffffff;
}

@keyframes ok-toast-in {
  from {
    opacity: 0;
    transform: translateY(-8px) scale(.98);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

.ok-toast.is-leaving {
  animation: ok-toast-out var(--ok-dur-base) var(--ok-ease) forwards;
}

@keyframes ok-toast-out {
  to {
    opacity: 0;
    transform: translateY(-6px) scale(.98);
  }
}

.ok-toast__icon {
  flex: 0 0 auto;
  margin-top: 1px;
  font-weight: bold;
  font-size: 18px;
}

.ok-toast__body {
  flex: 1 1 auto;
  min-width: 0;
  color: #ffffff;
}

.ok-toast__title {
  font-weight: var(--ok-fw-semibold);
  margin-bottom: 1px;
  color: #ffffff;
}

.ok-toast__msg {
  color: #e0e0e0;
  overflow-wrap: anywhere;
}

  .ok-toast__msg a {
    text-decoration: underline;
  }

.ok-toast__x {
  flex: 0 0 auto;
  color: #e0e0e0;
}

  .ok-toast__x:hover {
    color: #ffffff;
  }

.ok-toast--success {
  background: #2E6B48;
  border-inline-start-color: #4aa876;
}

  .ok-toast--success .ok-toast__icon {
    color: #b8f0cf;
  }

.ok-toast--info {
  background: #1a2d3f;
  border-inline-start-color: #4b94e8;
}

  .ok-toast--info .ok-toast__icon {
    color: #4b94e8;
  }

.ok-toast--warning {
  background: #99550F;
  border-inline-start-color: #d4a400;
}

  .ok-toast--warning .ok-toast__icon {
    color: #ffd666;
  }

  .ok-toast--warning .ok-toast__msg {
    color: #ffffff;
  }
/* Hata bildirimi kendiliğinden kapanmaz — legacy'de de duration 0 */
.ok-toast--danger {
  background: #8F1F1F;
  border-inline-start-color: #ff6b6b;
}

  .ok-toast--danger .ok-toast__icon {
    color: #ff6b6b;
  }

/* Kalan süre çubuğu */
.ok-toast__timer {
  position: absolute;
  inset: auto 0 0 0;
  height: 2px;
  background: currentColor;
  opacity: .35;
  transform-origin: left center;
  animation: ok-toast-timer linear forwards;
}

.ok-toast {
  position: relative;
  overflow: hidden;
}

@keyframes ok-toast-timer {
  from {
    transform: scaleX(1);
  }

  to {
    transform: scaleX(0);
  }
}

/* ---------- Boş durum --------------------------------------------------- */
.ok-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ok-sp-2);
  padding: var(--ok-sp-10) var(--ok-sp-5);
  text-align: center;
  color: var(--ok-text-2);
}

.ok-empty__icon {
  display: grid;
  place-items: center;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--ok-surface-sunk);
  color: var(--ok-text-3);
  margin-bottom: var(--ok-sp-2);
}

  .ok-empty__icon > .ok-icon {
    width: 26px;
    height: 26px;
  }

.ok-empty__title {
  font-size: var(--ok-fs-md);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text);
}

.ok-empty__desc {
  font-size: var(--ok-fs-sm);
  max-width: 46ch;
}

.ok-empty--sm {
  padding: var(--ok-sp-6) var(--ok-sp-4);
}

  .ok-empty--sm .ok-empty__icon {
    width: 40px;
    height: 40px;
  }

/* ---------- İpucu (tooltip) -------------------------------------------- */
[data-ok-tip] {
  position: relative;
}

  [data-ok-tip]::after {
    content: attr(data-ok-tip);
    position: absolute;
    z-index: var(--ok-z-popover);
    bottom: calc(100% + 7px);
    left: 50%;
    translate: -50% 0;
    padding: 5px 9px;
    border-radius: var(--ok-r-sm);
    background: var(--ok-tooltip-bg);
    color: var(--ok-tooltip-fg);
    font-size: var(--ok-fs-xs);
    font-weight: var(--ok-fw-normal);
    line-height: 1.35;
    white-space: normal;
    width: max-content;
    max-width: 260px;
    text-align: start;
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transition: opacity var(--ok-dur-fast) var(--ok-ease), visibility var(--ok-dur-fast);
    box-shadow: var(--ok-sh-md);
  }

  [data-ok-tip]:hover::after,
  [data-ok-tip]:focus-visible::after {
    opacity: 1;
    visibility: visible;
  }

  [data-ok-tip][data-ok-tip-pos="bottom"]::after {
    bottom: auto;
    top: calc(100% + 7px);
  }

  [data-ok-tip][data-ok-tip-wrap]::after {
    white-space: normal;
    width: max-content;
    max-width: 240px;
  }

/* ---------- Izgara satır aksiyonlarının ipucu (2026-08-20, kullanıcı kararı) ----
   İki fark: konum ALTTA, zemin AÇIK GRİ.

   Neden altta: bu düğmeler satırın sağ ucunda duruyor ve ipucu yukarı açılınca
   BİR ÜSTTEKİ SATIRIN üzerine biniyordu — kullanıcı hangi satıra baktığını
   kaybediyordu. Aşağı açılınca bir sonraki satırı örtüyor ama imleç zaten orada,
   yani okuma akışını bozmuyor.

   Neden açık gri: koyu lacivert balon yoğun veri ızgarasında fazla ağır duruyordu.
   ⚠️ Zemin açılınca METİN RENGİ DE dönmek zorunda — `[data-ok-tip]` varsayılanı
   `color:#fff` ve yalnız zemini değiştirmek yazıyı okunmaz bırakırdı. Açık zemin
   beyaz sayfada kendi başına ayrışmadığı için 1px kenarlık eklendi.

   Kapsam `.ok-act`: ızgara satır aksiyonları (`grid.js:573`), filtre temizleme
   (`grid.js:477`) ve yükleme bileşeninin düğmeleri — üçü de aynı küçük ikon
   düğmesi ailesi. Diğer ipuçları (araç çubuğu, form alanı) DEĞİŞMEDİ.

   Özgüllük `.ok-act[data-ok-tip]::after` (0,2,1) > `[data-ok-tip]::after` (0,1,1),
   yani kaynak sırasından bağımsız kazanır. `data-ok-tip-pos="bottom"` elle
   verilmişse o da aynı sonucu üretir, çakışma yok.
   ------------------------------------------------------------------------- */
.ok-act[data-ok-tip]::after {
  bottom: auto;
  top: calc(100% + 7px);
  background: var(--ok-neutral-bg);
  color: var(--ok-text);
  border: 1px solid var(--ok-neutral-br);
}

/* ---------- İlerleme --------------------------------------------------- */
.ok-progress {
  height: 6px;
  border-radius: var(--ok-r-pill);
  background: var(--ok-surface-sunk);
  overflow: hidden;
}

.ok-progress__bar {
  height: 100%;
  border-radius: inherit;
  background: var(--ok-brand-600);
  transition: width var(--ok-dur-slow) var(--ok-ease);
}

.ok-progress__bar--success {
  background: var(--ok-success);
}

.ok-progress--lg {
  height: 10px;
}

/* Ölçek çubuğu: izin bakiyesi, bütçe kullanımı, hedef gerçekleşme */
.ok-meter {
  display: flex;
  flex-direction: column;
  gap: 4px;
}

.ok-meter__head {
  display: flex;
  justify-content: space-between;
  gap: var(--ok-sp-2);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
}

.ok-meter__value {
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text);
  font-variant-numeric: tabular-nums;
}

@keyframes ok-shimmer {
  to {
    background-position: -200% 0;
  }
}

.ok-spinner {
  width: 22px;
  height: 22px;
  border: 2.5px solid rgba(75, 148, 232, 0.2);
  border-top-color: #4b94e8;
  border-radius: 50%;
  animation: ok-spin .7s linear infinite, ok-pulse 2s ease-in-out infinite;
  box-shadow: 0 0 8px rgba(75, 148, 232, 0.4);
}

@keyframes ok-spin {
  to {
    transform: rotate(360deg);
  }
}

@keyframes ok-pulse {
  0%, 100% {
    opacity: 1;
    transform: scale(1);
  }
  50% {
    opacity: 0.6;
    transform: scale(1.05);
  }
}

/* ---------- Tam ekran bekleme perdesi (legacy $.blockUI() karşılığı) ------
   Legacy: `jquery.blockui.min.js` kabuğa global yüklüydü (Default.aspx:230) ve
   39 ekran perdenin içeriğini şöyle kuruyordu — örn.
   `payroll-emp-calculation.aspx:307-308`:
       $(document).ajaxStart($.blockUI).ajaxStop($.unblockUI);
       $.blockUI.defaults.message =
           "<h3><img src='.../assets/admin/pages/img/busy3.gif' />" + lblPleaseWait + "</h3>";
   ve uzun süren düğmeler `OnClientClick="$.blockUI();"` taşıyordu (:52-54).

   ⚠️ Yukarıdaki `.ok-busy` KAP İÇİ perdedir (`position:absolute`, bir karta/ızgaraya
   uygulanır). Legacy'nin blockUI'ı ise TÜM EKRANI kaplıyordu; karşılığı budur.

   [SAPMA — kozmetik] Animasyonlu `busy3.gif` taşınmadı; yerine `.ok-spinner`
   (CSS animasyonu) kullanılıyor: temaya uyar, yüksek DPI'da bulanmaz, ek ağ
   isteği yoktur. Metin aynı kaynaktan gelir: `lblPleaseWait` ("Lütfen Bekleyiniz...").

   z-index: modal (800) ve popover'ın (900) ÜSTÜNDE, toast'ın (1000) ALTINDA.
   Legacy'de de toastr blockUI'ın üstündeydi — hata mesajı perdenin altında kalmamalı. */
.ok-busy-screen {
  position: fixed;
  inset: 0;
  z-index: calc(var(--ok-z-toast) - 1);
  display: grid;
  place-items: center;
  background: rgba(255, 255, 255, .68);
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--ok-dur-fast) var(--ok-ease), visibility var(--ok-dur-fast);
}

  .ok-busy-screen.is-open {
    opacity: 1;
    visibility: visible;
  }

.ok-busy-screen__box {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-4) var(--ok-sp-5);
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
  box-shadow: var(--ok-sh-md);
  color: var(--ok-text);
  font-weight: 600;
  max-width: min(90vw, 420px);
}

.ok-busy-screen__msg {
  line-height: 1.3;
}

/* [2026-08-24 — kullanıcı isteği] Legacy busy3.gif. Kutu artık yalnız gifi (ve varsa
   ilerleme çubuğunu) taşıyor; metin `ok-sr-only` ile ekran okuyucuda kalıyor.
   Boyut legacy'de verilmemişti (düz <img>), gifin kendi ölçüsü kullanılıyor. */
.ok-busy-screen__gif {
  display: block;
}

/* ---- İlerleme bölümü (kullanıcı isteği, 2026-08-23) ----------------------
   Uzun süren toplu işlemlerde "kaçıncı kalem / toplam" ve o kalemin etiketi.
   Varsayılan GİZLİ: sıradan bekleme perdesi tek satır kalır, yalnız
   OK.busy.ilerleme() çağrılan ekranlarda açılır. */
.ok-busy-screen__box {
  flex-direction: column;
  align-items: stretch;
  gap: var(--ok-sp-3);
}

.ok-busy-screen__row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--ok-sp-3);
}

.ok-busy-screen__prog {
  display: grid;
  gap: var(--ok-sp-2);
  min-width: 320px;
}

.ok-busy-screen__bar {
  height: 8px;
  border-radius: 999px;
  background: var(--ok-brand-100);
  overflow: hidden;
}

.ok-busy-screen__fill {
  display: block;
  height: 100%;
  width: 0;
  border-radius: inherit;
  background: var(--ok-brand-600);
  transition: width var(--ok-dur-fast) var(--ok-ease);
}

.ok-busy-screen__detay {
  display: flex;
  align-items: baseline;
  gap: var(--ok-sp-2);
  font-weight: 400;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-muted, var(--ok-text));
}

.ok-busy-screen__sayac {
  font-weight: 600;
  white-space: nowrap;
}
/* Uzun ad-soyad kutuyu büyütmesin: taşan kısım kırpılır. */
.ok-busy-screen__etiket {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Perde açıkken sayfa kaydırması kilitlenir — legacy blockUI de gövdeyi kilitliyordu. */
body.ok-busy-lock {
  overflow: hidden;
}

@media (max-width: 640px) {
  .ok-toasts {
    max-width: calc(100vw - 16px);
    padding: var(--ok-sp-2);
  }
  .ok-toasts[data-pos="top-center"],
  .ok-toasts[data-pos="bottom-center"] {
    left: 0;
    right: 0;
    translate: none;
    margin-inline: auto;
  }

  .ok-toast {
    min-width: 0;
  }
}

/* ── Kırpılan ipuçları: yüzen kopya (OK.tip) ────────────────────────────────
   `.ok-grid-scroll` gibi `overflow:auto` taşıyan kaplar `::after` ipucunu
   KIRPAR ve `z-index` bunu çözmez (kırpma yığınlamadan önce olur). JS
   (`components/tip.js`) böyle bir kapta duran tetikleyiciyi
   `data-ok-tip-float` ile işaretler ve ipucunun bir kopyasını `<body>`ye
   `position:fixed` olarak basar.

   ⚠️ İşaretli tetikleyicide `::after` BASTIRILMALIDIR, yoksa iki ipucu
   birden çıkar — biri kırpılmış, biri yüzen. */
[data-ok-tip][data-ok-tip-float]::after,
.ok-grid-scroll [data-ok-tip]::after,
.ok-tip-js [data-ok-tip]::after {
  content: none;
}

.ok-tip-float {
  position: fixed;
  z-index: var(--ok-z-popover);
  padding: 5px 9px;
  border-radius: var(--ok-r-sm);
  background: var(--ok-tooltip-bg);
  color: var(--ok-tooltip-fg);
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-normal);
  line-height: 1.35;
  white-space: normal;
  width: max-content;
  max-width: 260px;
  text-align: start;
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  box-shadow: var(--ok-sh-md);
  transition: opacity var(--ok-dur-fast) var(--ok-ease), visibility var(--ok-dur-fast);
}

  .ok-tip-float.is-open {
    opacity: 1;
    visibility: visible;
  }

.ok-tip-float--act {
  background: var(--ok-neutral-bg);
  color: var(--ok-text);
  border: 1px solid var(--ok-neutral-br);
}

.ok-tip-float--wrap {
  white-space: normal;
  width: max-content;
  max-width: 240px;
}

/* ==== components/overlays.css ============================================ */
/* ==========================================================================
   Yüzen katmanlar: açılır menü · modal · yan panel · onay balonu
   Legacy karşılıkları: Bootstrap dropdown, ajax:ModalPopupExtender,
   AlertMessage.ascx, bootstrap-confirmation popover.
   RadWindow legacy'de fiilen kullanılmıyordu.
   ========================================================================== */

/* ---------- Açılır menü ------------------------------------------------- */
.ok-dropdown {
  position: relative;
  display: inline-flex;
}

.ok-menu {
  position: absolute;
  z-index: var(--ok-z-dropdown);
  top: calc(100% + 6px);
  inset-inline-end: 0;
  min-width: 220px;
  max-width: 320px;
  padding: var(--ok-sp-1);
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  box-shadow: var(--ok-sh-lg);
  animation: ok-menu-in var(--ok-dur-fast) var(--ok-ease);
}

  .ok-menu[hidden] {
    display: none;
  }

@keyframes ok-menu-in {
  from {
    opacity: 0;
    transform: translateY(-4px);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

.ok-menu__item {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  width: 100%;
  padding: 7px var(--ok-sp-3);
  border-radius: var(--ok-r-md);
  color: var(--ok-text);
  font-size: var(--ok-fs-sm);
  text-align: start;
  text-decoration: none;
  white-space: nowrap;
}

  .ok-menu__item:hover {
    background: var(--ok-surface-sunk);
    text-decoration: none;
  }

  .ok-menu__item > .ok-icon {
    color: var(--ok-text-3);
    flex: 0 0 auto;
  }

  .ok-menu__item:hover > .ok-icon {
    color: var(--ok-brand-600);
  }

  .ok-menu__item.is-active {
    background: var(--ok-brand-50);
    color: var(--ok-brand-700);
    font-weight: var(--ok-fw-medium);
  }

  .ok-menu__item.is-danger {
    color: var(--ok-danger);
  }

    .ok-menu__item.is-danger > .ok-icon {
      color: var(--ok-danger);
    }

    .ok-menu__item.is-danger:hover {
      background: var(--ok-danger-bg);
    }

  .ok-menu__item:disabled, .ok-menu__item.is-disabled {
    opacity: .5;
    pointer-events: none;
  }

.ok-menu__item-text {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

.ok-menu__sep {
  height: 1px;
  margin: var(--ok-sp-1) 0;
  background: var(--ok-border);
}

.ok-menu__label {
  padding: var(--ok-sp-2) var(--ok-sp-3) 4px;
  font-size: 10px;
  font-weight: var(--ok-fw-bold);
  color: var(--ok-text-3);
  text-transform: uppercase;
  letter-spacing: .07em;
}
/* Kullanıcı menüsünün başındaki kimlik bloğu */
.ok-menu__identity {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-3);
  margin-bottom: var(--ok-sp-1);
  border-bottom: 1px solid var(--ok-border);
}

/* ---------- Modal ------------------------------------------------------- */
.ok-modal-backdrop {
  position: fixed;
  inset: 0;
  z-index: var(--ok-z-backdrop);
  background: rgba(16, 32, 56, .48);
  display: grid;
  place-items: center;
  padding: var(--ok-sp-4);
  overflow-y: auto;
  animation: ok-fade-in var(--ok-dur-base) var(--ok-ease);
}

.ok-modal {
  position: relative;
  z-index: var(--ok-z-modal);
  width: 100%;
  max-width: 520px;
  max-height: calc(100vh - 2 * var(--ok-sp-4));
  display: flex;
  flex-direction: column;
  background: var(--ok-surface);
  border-radius: var(--ok-r-xl);
  box-shadow: var(--ok-sh-lg);
  animation: ok-modal-in var(--ok-dur-base) var(--ok-ease);
}

@keyframes ok-modal-in {
  from {
    opacity: 0;
    transform: translateY(10px) scale(.985);
  }

  to {
    opacity: 1;
    transform: none;
  }
}

.ok-modal--sm {
  max-width: 400px;
}

.ok-modal--lg {
  max-width: 760px;
}

.ok-modal--xl {
  max-width: 1080px;
}

.ok-modal--full {
  max-width: none;
  height: calc(100vh - 2 * var(--ok-sp-4));
}

.ok-modal__head {
  display: flex;
  align-items: flex-start;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-4) var(--ok-sp-5) var(--ok-sp-3);
  border-bottom: none;
  flex: 0 0 auto;
  background: #2a2a2a;
  color: #ffffff;
  border-radius: 14px 14px 0 0;
}

.ok-modal__title {
  font-size: var(--ok-fs-md);
  font-weight: var(--ok-fw-semibold);
  flex: 1 1 auto;
  min-width: 0;
  color: #ffffff;
}

.ok-modal__desc {
  margin-top: 2px;
  font-size: var(--ok-fs-sm);
  color: #d0d0d0;
}

.ok-modal__x {
  display: grid;
  place-items: center;
  width: 30px;
  height: 30px;
  margin: -4px -8px 0 0;
  border-radius: var(--ok-r-md);
  color: #999999;
  flex: 0 0 auto;
  border: none;
  background: none;
  cursor: pointer;
}

  .ok-modal__x:hover {
    background: #3a3a3a;
    color: #ffffff;
  }

.ok-modal__body {
  padding: var(--ok-sp-4) var(--ok-sp-5);
  overflow-y: auto;
  flex: 1 1 auto;
  min-height: 0;
  color: var(--ok-text);
}

.ok-modal__foot {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--ok-sp-2);
  padding: var(--ok-sp-3) var(--ok-sp-5) var(--ok-sp-4);
  border-top: none;
  flex: 0 0 auto;
  flex-wrap: wrap;
  background: #f5f5f5;
  border-radius: 0 0 14px 14px;
}

.ok-modal__foot--between {
  justify-content: space-between;
}

/* Simgeli modal başlığı (onay/uyarı diyalogları) */
.ok-modal__icon {
  display: grid;
  place-items: center;
  width: 40px;
  height: 40px;
  border-radius: 50%;
  flex: 0 0 auto;
  background: #4b94e8;
  color: #ffffff;
  font-size: 20px;
  font-weight: bold;
}

.ok-modal__icon--danger {
  background: var(--ok-danger);
}

.ok-modal__icon--warning {
  background: var(--ok-warning);
}

.ok-modal__icon--info {
  background: #4b94e8;
}

/* ---------- Yan panel (drawer) ----------------------------------------- */
.ok-drawer-backdrop {
  position: fixed;
  inset: 0;
  z-index: var(--ok-z-backdrop);
  background: rgba(16, 32, 56, .42);
  animation: ok-fade-in var(--ok-dur-base) var(--ok-ease);
}

.ok-drawer {
  position: fixed;
  z-index: var(--ok-z-modal);
  inset-block: 0;
  inset-inline-end: 0;
  width: min(520px, 100vw);
  display: flex;
  flex-direction: column;
  background: var(--ok-surface);
  box-shadow: var(--ok-sh-lg);
  animation: ok-drawer-in var(--ok-dur-base) var(--ok-ease);
}

@keyframes ok-drawer-in {
  from {
    transform: translateX(100%);
  }

  to {
    transform: none;
  }
}

.ok-drawer--wide {
  width: min(760px, 100vw);
}

@keyframes ok-drawer-in-start {
  from {
    transform: translateX(-100%);
  }

  to {
    transform: none;
  }
}
/* Mobilde alttan açılan sayfa (filtre paneli) */
.ok-drawer--sheet {
  inset: auto 0 0 0;
  width: auto;
  max-height: 88vh;
  border-start-start-radius: var(--ok-r-xl);
  border-start-end-radius: var(--ok-r-xl);
  animation-name: ok-sheet-in;
}

@keyframes ok-sheet-in {
  from {
    transform: translateY(100%);
  }

  to {
    transform: none;
  }
}

/* Modal ve drawer aynı baş/gövde/ayak yapısını paylaşır */
.ok-drawer .ok-modal__head,
.ok-drawer .ok-modal__body,
.ok-drawer .ok-modal__foot {
  border-radius: 0;
}

/* ---------- Onay balonu (legacy bootstrap-confirmation) ---------------- */
.ok-confirm {
  position: absolute;
  z-index: var(--ok-z-popover);
  /* [K-48] 250px'te "Silme İşlemini Onaylıyor Musunuz ?" üç satıra bölünüyor ve
     düğmeler sıkışıyordu. 340px soruya ve iki düğmeye rahat yetiyor;
     max-width dar ekranda taşmayı önler. */
  width: 340px;
  max-width: calc(100vw - 24px);
  padding: var(--ok-sp-3);
  background: #2a2a2a;
  border: 1px solid #444444;
  border-radius: var(--ok-r-lg);
  box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
  font-size: var(--ok-fs-sm);
  animation: ok-menu-in var(--ok-dur-fast) var(--ok-ease);
  color: #ffffff;
}

.ok-confirm__msg {
  display: flex;
  gap: var(--ok-sp-2);
  margin-bottom: var(--ok-sp-3);
  color: #ffffff;
  line-height: 1.35;
}

  .ok-confirm__msg .ok-icon {
    color: #ff6b6b;
    flex: 0 0 auto;
    margin-top: 1px;
    font-weight: bold;
  }

.ok-confirm__acts {
  display: flex;
  gap: var(--ok-sp-2);
  justify-content: flex-end;
}

/* [K-48] "Hayır" güvenli seçenektir: açık yeşil zemin. "Evet" yıkıcıdır ve
   `ok-btn--danger-solid` ile dolu kırmızıdır. Renk ayrımı, iki nötr düğme
   arasından yanlışlıkla "Evet"e basma riskini düşürür. Odak da Hayır'dadır
   (modal.js), yani Enter güvenli olanı seçer. */
.ok-confirm__no {
  background: #2d8659;
  border: 1px solid #2d8659;
  color: #ffffff;
  font-weight: var(--ok-fw-semibold);
}

  .ok-confirm__no:hover {
    background: #25674a;
    opacity: 0.9;
  }

  .ok-confirm__no:focus-visible {
    outline: 2px solid #4aa876;
    outline-offset: 1px;
  }

.ok-confirm::after {
  content: "";
  position: absolute;
  width: 9px;
  height: 9px;
  background: #2a2a2a;
  border-inline-start: 1px solid #444444;
  border-block-start: 1px solid #444444;
  rotate: 45deg;
}

.ok-confirm[data-place="top"]::after {
  bottom: -5px;
  left: 50%;
  translate: -50% 0;
  rotate: 225deg;
}

.ok-confirm[data-place="bottom"]::after {
  top: -5px;
  left: 50%;
  translate: -50% 0;
}

.ok-confirm[data-place="left"]::after {
  inset-inline-end: -5px;
  top: 50%;
  translate: 0 -50%;
  rotate: 135deg;
}

.ok-confirm[data-place="right"]::after {
  inset-inline-start: -5px;
  top: 50%;
  translate: 0 -50%;
  rotate: -45deg;
}

/* Sayfa kaydırmasını kilitle (modal açıkken) */
body.ok-locked {
  overflow: hidden;
}

@media (max-width: 640px) {
  .ok-modal-backdrop {
    padding: 0;
    place-items: end stretch;
  }

  .ok-modal {
    max-width: none;
    max-height: 92vh;
    border-radius: var(--ok-r-xl) var(--ok-r-xl) 0 0;
    animation-name: ok-sheet-in;
  }

  .ok-modal__head, .ok-modal__body, .ok-modal__foot {
    padding-inline: var(--ok-sp-4);
  }

    .ok-modal__foot > .ok-btn {
      flex: 1 1 auto;
    }

  .ok-menu {
    max-width: calc(100vw - 24px);
  }
}

/* ==== components/tabs.css ================================================ */
/* ==========================================================================
   Sekmeler (legacy .InfoTabHeader / .InfoTabBody karşılığı)
   Personel kartı 21 sekme taşıyor — taşma yönetimi zorunlu.
   ========================================================================== */

.ok-tabs {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

/* ---------- Sekme şeridi ------------------------------------------------ */
.ok-tabs__bar {
  position: relative;
  display: flex;
  align-items: stretch;
  border-bottom: 1px solid var(--ok-border);
  min-width: 0;
}

.ok-tabs__scroll {
  display: flex;
  gap: 2px;
  overflow-x: auto;
  scrollbar-width: none;
  scroll-behavior: smooth;
  flex: 1 1 auto;
  min-width: 0;
  padding-inline: var(--ok-sp-1);
}

  .ok-tabs__scroll::-webkit-scrollbar {
    display: none;
  }

/* Taşma okları — 21 sekmede şart */
.ok-tabs__arrow {
  display: none;
  place-items: center;
  width: 28px;
  flex: 0 0 auto;
  color: var(--ok-text-2);
  background: var(--ok-surface);
  border: 0;
}

  .ok-tabs__arrow:hover {
    color: var(--ok-brand-700);
    background: var(--ok-surface-sunk);
  }

.ok-tabs__bar.has-overflow .ok-tabs__arrow {
  display: grid;
}

.ok-tabs__arrow:disabled {
  opacity: .3;
  cursor: default;
}

.ok-tab {
  display: inline-flex;
  align-items: center;
  gap: var(--ok-sp-2);
  padding: 9px var(--ok-sp-3);
  border: 0;
  border-bottom: 2px solid transparent;
  background: transparent;
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  white-space: nowrap;
  cursor: pointer;
  transition: color var(--ok-dur-fast) var(--ok-ease), border-color var(--ok-dur-fast) var(--ok-ease);
}

  .ok-tab:hover {
    color: var(--ok-text);
    border-bottom-color: var(--ok-border-strong);
  }

  .ok-tab[aria-selected="true"] {
    color: var(--ok-brand-700);
    border-bottom-color: var(--ok-brand-600);
    font-weight: var(--ok-fw-semibold);
  }

  .ok-tab > .ok-icon {
    color: var(--ok-text-3);
  }

  .ok-tab[aria-selected="true"] > .ok-icon {
    color: var(--ok-brand-600);
  }

  .ok-tab:disabled {
    opacity: .45;
    cursor: not-allowed;
  }

/* Sekme içinde doğrulama hatası varsa kırmızı sayaç — legacy'de yoktu */
.ok-tab__err {
  display: inline-grid;
  place-items: center;
  min-width: 17px;
  height: 17px;
  padding-inline: 4px;
  border-radius: var(--ok-r-pill);
  background: var(--ok-danger);
  color: #fff;
  font-size: 10px;
  font-weight: var(--ok-fw-bold);
}

.ok-tab.has-error {
  color: var(--ok-danger);
}

  .ok-tab.has-error[aria-selected="true"] {
    border-bottom-color: var(--ok-danger);
  }

/* Kaydedilmemiş değişiklik göstergesi */
.ok-tab.is-dirty::after {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--ok-warning);
  flex: 0 0 auto;
}

/* ---------- Panel ------------------------------------------------------- */
.ok-tabs__panels {
  min-width: 0;
  border: 1px solid var(--ok-border-strong);
}

.ok-tab-panel {
  padding-top: var(--ok-sp-3);
}

  .ok-tab-panel[hidden] {
    display: none;
  }

/* ---------- Dikey sekmeler (uzun listeler, sol taraf) ------------------ */
/* ⛔ [K-69, 2026-08-20] BU BÖLÜMÜN ASIL TÜKETİCİSİ DÜŞTÜ.
   `emp-detail` 2026-08-20'de legacy yerleşimine döndü ve artık `.ok-tabs--wrap`
   kullanıyor (aşağıdaki K-69 bölümü). Dolayısıyla AŞAĞIDAKİ K-58 / K-63 / K-65
   ÖLÇÜM KARARLARININ DİKEY DALI ARTIK ÜRETİM EKRANINDA ÇALIŞMIYOR:
     · K-58  — 21 satırlık şeridi ekrana sığdırma (dolgu/satır yüksekliği/aralık)
     · K-63  — ikonun satır yüksekliğini dayatması, üç kaldıraç
     · K-65  — bir kademe geri açma (13px yazı, 15px ikon, 16px rozet)
   ⚠️ ÖLÜ AMA SİLİNMEDİ, ÜSTELİK TAMAMEN ÖLÜ DE DEĞİL: tasarım sistemi
   `Template\src\pages\personel-detay.html:106` hâlâ `.ok-tabs--vertical`
   basıyor, yani şablon sayfası bu kuralları kullanmaya devam ediyor.
   Kararların ölçüm gerekçesi (satır yüksekliğini metnin mi ikonun mu
   belirlediği) `.ok-tabs--wrap`in ölçülerine de kaynaklık ettiği için kayıt
   değerlidir. Silme kararı orkestratöre/kullanıcıya aittir. */
.ok-tabs--vertical {
  flex-direction: row;
  gap: var(--ok-sp-5);
  align-items: flex-start;
}

  .ok-tabs--vertical > .ok-tabs__bar {
    flex-direction: column;
    border-bottom: 0;
    border-inline-end: 1px solid var(--ok-border);
    flex: 0 0 232px;
    /* [K-58] 200px payı, başlık bloğu şeridin ÜSTÜNDEyken doğruydu. 2026-08-19'da
     başlık panelin içine alındı (şerit artık kartın tepesinden başlıyor), yani o
     kadar pay gereksiz ve listeyi erken kaydırmaya sokuyordu.
     [K-63, 2026-08-19] Pay 150→128px. Ölçüm: şerit `top: calc(56 + 16) = 72px`
     ile yapışıyor, altında kalan tek sabit engel `.ok-form-actions--sticky`
     (12+12 dolgu + 24px buton ≈ 48px). 72 + 48 = 120, üstüne 8px nefes payı = 128.
     150px, altta gereksiz 22px boşluk bırakıp listeyi erkenden kaydırmaya sokuyordu. */
    max-height: calc(100vh - 128px);
    position: sticky;
    top: calc(var(--ok-topbar-h) + var(--ok-sp-4));
  }

  .ok-tabs--vertical .ok-tabs__scroll {
    flex-direction: column;
    overflow-y: auto;
    overflow-x: hidden;
    /* [K-63, 2026-08-19] Dolgu 4→2px. 21 satırlık şeritte dolgunun kendisi 8px yer
     kaplıyordu; 2px ilk/son sekmenin kenarlığa yapışmasını yine de engelliyor ve
     sekme etiketine 4px daha yatay yer bırakarak SATIR KAYDIRMAYI azaltıyor —
     kaydırılan her etiket satır yüksekliğini iki katına çıkardığı için asıl
     kazanç budur. */
    padding: 2px;
    /* [K-58] Yatay şeritte 2px doğru; dikeyde 21 satırda 40px'e çıkıyordu. */
    gap: 1px;
    scrollbar-width: thin;
  }

    .ok-tabs--vertical .ok-tabs__scroll::-webkit-scrollbar {
      display: block;
      width: 8px;
    }

  .ok-tabs--vertical .ok-tabs__arrow {
    display: none !important;
  }
  /* [K-58, 2026-08-19] Kullanıcı kararı: dikey sekme listesi EKRANA SIĞMIYORDU.
   `emp-detail` 21 sekme basıyor; eski ölçüyle (8px dikey dolgu + 1.45 satır
   yüksekliği + 2px aralık) şerit ~730px ediyor ve kaydırma çubuğuna düşüyordu.
   Yeni ölçü ~500px: dolgu 8→4, satır yüksekliği `tight`, aralık 2→1.
   ⚠️ YALNIZ dikey şerit değişti — yatay sekmeler (`.ok-tab` temel kuralı)
   başka ekranlarda kullanılıyor ve orada sığma sorunu yok. */
  /* [K-63, 2026-08-19] Kullanıcı: "soldaki menü ekrana HÂLÂ sığmıyor".
   K-58 sonrası ölçüm: tek satırlık bir sekmenin yüksekliğini metin DEĞİL İKON
   belirliyordu — 18px ikon, 12px fontun `tight` satırından (15px) daha uzun, yani
   satır yüksekliğini ikon dayatıyordu. Üç kaldıraç birlikte çekildi:
     · dikey dolgu 4→2px            (satır başına −4px)
     · ikon 18→14px + aralık 8→6px  (satır başına −3px, ayrıca etikete +6px yer)
     · yatay dolgu `--ok-sp-3`→`--ok-sp-2` (etikete +8px yer)
   Yatay dolgunun küçülmesi doğrudan yükseklik kazandırmaz; etiket sütununu
   ~163px'ten ~181px'e çıkararak İKİ SATIRA KAYAN sekme sayısını düşürür ve bir
   kayan satır tek başına 19px'lik bir sekmeyi 34px yapar.
   Tahmini yeni boy (21 sekme): ~440px — eski ~600px.
   ⚠️ Yalnız `.ok-tabs--vertical`; yatay sekmeler ve `--pills` dokunulmadı. */
  /* [K-65, 2026-08-19] GERİ AYAR — kullanıcı: "soldaki menü aralıklarını hafif
   açabilirsin, fontları da 1 tık artır". K-58 + K-63 iki tur sıkıştırmıştı;
   bu üçüncü tur bir kademe geri açıyor ama SIĞMA KAZANIMI korunuyor.
   Ölçülen taban (Chrome, 21 sekme): satır 19px, şerit 423px, etiket sütunu 189,6px.
   Çekilen iki kaldıraç:
     · yazı `--ok-fs-sm` (12px) → `--ok-fs-base` (13px)  → satır 15 → 16,25px
     · dikey dolgu 2 → 3px                               → satır başına +2px
   Yeni satır: 16,25 + 3 + 3 = 22,25px · şerit: 21×22,25 + 20×1 (gap) + 2×2
   (şerit dolgusu) = 491px.
   ⚠️ SATIR ARALIĞI (`.ok-tabs__scroll` gap) 1px'te BIRAKILDI. 2px yapılsaydı şerit
   511px olurdu; 1366×768'de kutu ≈512px (640 iç yükseklik − 128px pay), yani pay
   1px'e inerdi. 1px'te bırakılınca pay 21px kalıyor. Aralığı açan kaldıraç zaten
   dolgudur; gap'i de açmak "bir kademe" değil iki kademe olurdu.
   Etiket sütunu 13px'te de yetiyor: en uzun etiket "Sigorta/Vergi/Sendika
   Bilgileri" 178,2px < 188,6px — hiçbir sekme iki satıra kaymıyor (kayan tek satır
   bir sekmeyi 22 → 38px yapardı ve bütçeyi tek başına yerdi).
   ⚠️ Yalnız `.ok-tabs--vertical`; yatay sekmeler ve `--pills` dokunulmadı. */
  .ok-tabs--vertical .ok-tab {
    border-bottom: 0;
    border-inline-start: 2px solid transparent;
    border-radius: 0 var(--ok-r-md) var(--ok-r-md) 0;
    justify-content: flex-start;
    white-space: normal;
    text-align: start;
    font-size: var(--ok-fs-base);
    padding: 3px var(--ok-sp-2);
    gap: 6px;
    line-height: var(--ok-lh-tight);
    width: 100%;
  }
    /* İkon, satır yüksekliğini dayatan öğeydi (18px > 15px metin satırı); 14px'e
   inince yüksekliği yeniden METİN belirliyor. `.ok-icon--sm` ile aynı ölçü —
   işaretlemeye sınıf eklemek gerekmesin diye burada, seçiciyle veriliyor.
   [K-65] Yazı 13px'e çıkınca metin satırı 16,25px oldu; ikon 14 → 15px yapıldı ki
   satır dengesi bozulmasın (büyüyen yazının yanında küçük kalan ikon satırı
   dengesiz gösterir). 15px hâlâ 16,25px'in ALTINDA — yani yüksekliği yine metin
   belirliyor, ikon dayatmıyor. */
    .ok-tabs--vertical .ok-tab > .ok-icon {
      width: 15px;
      height: 15px;
    }
    /* Aynı gerekçe rozetler için: `.ok-count` 19px, `.ok-tab__err` 17px — ikisi de
   15px'lik metin satırından uzun olduğu için rozet TAŞIYAN sekmeler diğerlerinden
   daha yüksek duruyordu (`emp-detail`'de G1710 ve G2700). 15px'e indirilince
   şerit tek satır yüksekliğinde kalır; okunabilirlik için yazı 10px'e çekildi.
   [K-65] Metin satırı 16,25px'e çıktığı için rozet 15 → 16px, yazısı 10 → 11px:
   büyüyen etiketle orantılı kalır ve 16 < 16,25 olduğu için satırı YİNE
   yükseltmez (ölçüldü: rozetli G1710/G2700 de 22,25px). */
    .ok-tabs--vertical .ok-tab > .ok-count,
    .ok-tabs--vertical .ok-tab > .ok-tab__err {
      min-width: 16px;
      height: 16px;
      padding-inline: 4px;
      font-size: 11px;
    }

    .ok-tabs--vertical .ok-tab:hover {
      background: var(--ok-surface-sunk);
      border-inline-start-color: var(--ok-border-strong);
      border-bottom-color: transparent;
    }

    .ok-tabs--vertical .ok-tab[aria-selected="true"] {
      background: var(--ok-brand-50);
      border-inline-start-color: var(--ok-brand-600);
      border-bottom-color: transparent;
    }

  .ok-tabs--vertical .ok-tab__label {
    flex: 1 1 auto;
    min-width: 0;
  }

  .ok-tabs--vertical > .ok-tabs__panels {
    flex: 1 1 auto;
    min-width: 0;
  }

  .ok-tabs--vertical .ok-tab-panel {
    padding-top: 0;
  }

/* ---------- Sarmalayan yatay şerit (`emp-detail`, 21 sekme) ------------ */
/* [K-69, 2026-08-20] Kullanıcı kararı: "Emp/emp-detail ekranında içerde solda
   yaptığın menüyü legacy uygulamadaki gibi yukarı resim vs bölümünün altına
   koysan. Bu şekilde güzel olmadı bence."

   Legacy yerleşimi (C:\ORTAKIKV2\src\OrtakIK\Emp\emp-detail.aspx):
     · :596-636  fotoğraf / künye bloğu — burada BİTER
     · :639      `<ul id="ListContainer">` — şerit hemen ARDINDAN başlar
     · :15-22    `#ListContainer { padding:.1em .1em 0; border:1px solid #aaaaaa;
                  font-size:12px; background:#BDBDBD }`
     · :24-30    `li.InfoTabHeader { display:inline-block; border:2px solid #d3d3d3;
                  background:#E0E0E0; padding:0.4em 0.5em; font-size:14px }`
     · :32-35    seçili → `border:2px solid #328EBC; background:#ffffff`
     · :37-40    hover  → `border:2px solid #F57F17`
   `inline-block` + hiçbir genişlik/kaydırma sınırı olmaması demek: 21 sekme
   SATIR SATIR SARMALANIYOR demektir.

   SARMALAMA mı KAYDIRMA mı? — SARMALAMA. Gerekçe:
     1. Parite (kök CLAUDE.md §1): legacy sarmalıyor, davranış korunur.
     2. Kaydırma 21 sekmede GÖRÜNÜRLÜĞÜ öldürürdü. Sekme genişlikleri 90-215px
        arası; ~1100px'lik bir kaba tek satırda ancak 7-8 tanesi girer, kalan
        13-14 sekme ok düğmesiyle 2-3 tur kaydırılmadan GÖRÜLEMEZ. Dikey şeridin
        kullanıcıya verdiği şey "21'i de tek bakışta görmek"ti; kaydırmaya
        geçmek yerleşim sorununu çözerken o kazanımı da harcardı.
     3. Sarmalayan şeritte yatay taşma oluşmaz → `scrollWidth == clientWidth`
        (tabs.js:94) → `has-overflow` hiç eklenmez → oklar kendiliğinden ölür.
        İşaretlemedeki ok düğmeleri kaldırılmadı; yalnız burada gizleniyor.
   ⚠️ Bu YENİ BİR DEĞİŞTİRİCİDİR. Varsayılan yatay şerit (kaydırmalı + oklu)
   HİÇ DEĞİŞMEDİ; başka ekranlarda aynen çalışmaya devam ediyor.

   Ölçüler K-65'ten devralındı — yazı `--ok-fs-base` (13px), ikon 15px, rozet
   16px/11px. Kullanıcı bu yoğunluğu bu ekranın şeridinde zaten onaylamıştı;
   K-69 yalnız ekseni değiştiriyor, yoğunluğu değil. Tek fark dikey dolgunun
   3 → 4px olması: yatayda satır sayısı yükseklik bütçesini belirlemiyor, buna
   karşılık 2px'lik alt kenarlıklı seçim göstergesi 3px dolguda etikete
   yapışıyordu. Legacy `0.4em` (14px'te ≈ 5,6px) ile aynı mertebede.
   [SAPMA] EMPD-SAPMA-950 — legacy yazı boyu 14px, burada 13px; legacy her
   sekmede 2px'lik gri kutu çerçevesi çiziyor, burada tasarım sisteminin alt
   kenarlık + dolgu tonu kullanılıyor. Görünüm farkı bilinçlidir (tasarım
   sistemi kuralı, kök §1'in "gözlemlenebilir davranış" tanımına girmez:
   hangi sekmenin seçili olduğu ve tıklamayla ne olduğu aynıdır). */
/* [K-71, 2026-08-20] Kullanıcı kararı: "Emp/emp-detail ekranında yaptığın tab
   kısımda … tabları netleştirmek adına biraz daha belirginleştirmek istiyorum.
   En basiti bir iç border olabilir. Background rengi de 2,3 ton koyu olsun."

   Yani K-69'un iki eksiği kapatılıyor ve bu, legacy'ye YAKLAŞMADIR:
     · legacy şeridin kendi zemini var  → `#ListContainer{background:#BDBDBD}`
       (emp-detail.aspx:20) — bizde şerit zeminsizdi, panelin beyazındaydı.
     · legacy'de HER SEKME kendi 2px kutusunu taşır → `li.InfoTabHeader{
       border:2px solid #d3d3d3; background:#E0E0E0}` (aspx:25-26), seçili
       `border:2px solid #328EBC; background:#ffffff` (aspx:32-35), hover
       `border:2px solid #F57F17` (aspx:37-40) — bizde sekmeler kutusuzdu ve
       yalnız ALT KENARLIKLA ayırt ediliyordu (temel kural :48 ve :59-61).
   K-69'un [SAPMA] EMPD-SAPMA-950 notunun ikinci yarısı ("legacy her sekmede
   2px gri kutu çiziyor, burada alt kenarlık kullanılıyor") bu kararla ORTADAN
   KALKIYOR; birinci yarısı (yazı boyu 14px değil 13px) duruyor.

   ÜÇ KATMANLI TON SIRASI — legacy'nin sıralaması, bizim merdivenimizde:
     şerit  `--ok-tabbar-bg`    #E2E8F1 (91,6%)  ↔ legacy #BDBDBD (74,1%)
     sekme  `--ok-surface-sunk` #F1F4F9 (96,1%)  ↔ legacy #E0E0E0 (87,8%)
     seçili `--ok-panel`        #FFFFFF (100%)   ↔ legacy #ffffff (100%)
   Mutlak tonlar değil SIRA taşındı; gerekçe `tokens.css`'teki token yorumunda.

   ⚠️ GEOMETRİ BİLEREK DEĞİŞTİRİLMEDİ — sarmalama bozulmasın diye (K-69 ölçümü:
   21 sekme / 1366×768 / 4 satır / 112,2px):
     · Yatay: 1px kutu kenarlığı sekme başına +2px genişlik getirirdi; yatay
       dolgu `--ok-sp-2` (8px) → 7px'e indirilerek TAM telafi edildi
       (7+7+2 = 8+8 = 16px). Sekme genişlikleri değişmiyor → satır sayısı da
       değişmiyor. Yan etki: 7px legacy'nin `0.5em`/14px = 7px'iyle birebir.
     · Dikey: eski kutuda 4+4 dolgu + 2px ALT kenarlık = +10px; yeni kutuda
       4+4 dolgu + 1px üst + 1px alt = +10px. Satır yüksekliği AYNI.
       (Brief'teki "alt kenarlık için dolgu 3→4 yapılmıştı, dengeyi yeniden
       kur" uyarısı bu yüzden dolguyu DÜŞÜRMEYE değil KORUMAYA çıkıyor:
       4px dolgu + 1px kenarlık = 5px, legacy'nin `0.4em`/14px ≈ 5,6px'i.)
     · Şeridin kendi kutusu: alt kenarlık ZATEN vardı (temel kural :13), yeni
       olan yalnız ÜST kenarlık → şerit yalnız 1px uzar.
   ÖLÇÜLDÜ (Chrome, aynı kırılım, 21 sekme): satır sayısı 4 → 4 (değişmedi),
   sekme yüksekliği 25,85px → 25,85px (değişmedi, rozetli sekmeler dâhil),
   şerit 112,2px → 113,0px (yalnız üst kenarlığın 1px'i).
   ⚠️ Yalnız `.ok-tabs--wrap`. Varsayılan yatay şerit (`dashboard.html:225`,
   `portal-talep.html:41`), `.ok-tabs--vertical` ve `.ok-tabs--pills` bu
   bloğun DIŞINDA ve hiç değişmedi. */
.ok-tabs--wrap .ok-tabs__arrow {
  display: none !important;
}

.ok-tabs--wrap .ok-tabs__bar {
  background: var(--ok-tabbar-bg);
  /* Temel kural yalnız `border-bottom` veriyordu (:13). Legacy şerit dört
     yandan çerçeveli — `1px solid #aaaaaa` (aspx:19); `--ok-border-strong`
     merdivenin buna en yakın basamağı ve zeminden (91,6%) belirgin ayrılıyor. */
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-sm) var(--ok-r-sm) 0 0;
}

.ok-tabs--wrap .ok-tabs__scroll {
  flex-wrap: wrap;
  /* `overflow-x: auto` iptal — sarmalayan şeritte kaydırılacak bir şey yok ve
     `auto` bırakılırsa alt satırlar kırpılır. */
  overflow: visible;
  column-gap: 2px;
  row-gap: 2px;
  /* [K-71] Yatay dolgu `--ok-sp-1` (4px) → 3px: şerit artık 1px yan kenarlık
     taşıyor, iç genişlik aynı kalsın diye. Alt dolgu 0'da bırakıldı — legacy
     de `padding:.1em .1em 0` ile son satırı şeridin alt kenarına dayıyor. */
  padding: 2px 3px 0;
}

.ok-tabs--wrap .ok-tab {
  font-size: var(--ok-fs-base);
  line-height: var(--ok-lh-tight);
  /* [K-71] Yatay 8→7px: aşağıdaki 1px kutu kenarlığının genişlik telafisi. */
  padding: 4px 7px;
  gap: 6px;
  /* [K-71] Sekme artık KAPALI BİR KUTU. K-69'un yalnız ÜST köşeleri yuvarlayan
     `--ok-r-md --ok-r-md 0 0` ölçüsü TERK EDİLDİ ve dört köşeye tek yarıçap
     verildi: üst köşe yuvarlaması "sekme alttaki panele bağlanıyor" demektir,
     oysa sarmalayan şeritte 4 satırın yalnız SONUNCUSU panele değiyor; üst üç
     satırda o görüntü yanıltıcıydı. Legacy köşesi tamamen düz; `--ok-r-sm`
     (4px) tasarım sisteminin en küçük yarıçapı — ikisinin ortasında durur. */
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-sm);
  background: var(--ok-surface-sunk);
  transition: color var(--ok-dur-fast) var(--ok-ease), background-color var(--ok-dur-fast) var(--ok-ease), border-color var(--ok-dur-fast) var(--ok-ease), box-shadow var(--ok-dur-fast) var(--ok-ease);
}
  /* K-63'ün ölçümü burada da geçerli: 18px'lik varsayılan ikon 13px yazının
   16,25px'lik satırından uzun olduğu için satır yüksekliğini İKON dayatıyordu.
   15px'e indirilince yüksekliği yine METİN belirler. */
  .ok-tabs--wrap .ok-tab > .ok-icon {
    width: 15px;
    height: 15px;
  }
  /* Aynı gerekçe rozetlerde: `.ok-count` 19px, `.ok-tab__err` 17px — ikisi de
   16,25px'lik metin satırından uzun; rozet taşıyan sekmeler (emp-detail'de
   G1710 ve G2700) diğerlerinden daha yüksek durup satırı kalınlaştırıyordu. */
  .ok-tabs--wrap .ok-tab > .ok-count,
  .ok-tabs--wrap .ok-tab > .ok-tab__err {
    min-width: 16px;
    height: 16px;
    padding-inline: 4px;
    font-size: 11px;
  }
  /* ÇOK SATIRLI şeritte seçili sekme yalnız alt kenarlıkla ayırt edilemiyor:
   ikinci/üçüncü satırdaki bir alt kenarlık satır ayracı gibi okunuyor. Legacy
   de dolgu rengiyle ayırıyordu (`SelectedHeader { background:#ffffff }`,
   aspx:32-35).
   [K-71, 2026-08-20] K-69 burada `--ok-brand-50` (#EFF6FE) kullanıyordu; şerit
   zemini beyazken bu yeterliydi. Şerit #E2E8F1'e koyulaşınca 21 sekmenin HEPSİ
   zemine göre açık kaldı ve brand-50 ile sekme zemini (#F1F4F9) arasındaki fark
   ayırt edici olmaktan çıktı. Bu yüzden seçili sekme legacy'nin yaptığını yapar:
   TAM BEYAZ (`--ok-panel`) + marka renkli kutu.

   ⚠️ 2px'lik kutu `border-width` ile DEĞİL `box-shadow: inset` ile veriliyor.
   Gerekçe ölçüm: 1px → 2px kenarlık seçili sekmeyi 2px genişletir/uzatır; 21
   sekmelik sarmalayan şeritte tek bir sekmenin genişlemesi ondan sonraki tüm
   sekmeleri kaydırır ve seçim değiştikçe SATIR DÜZENİ OYNAR. `inset` gölge
   yerleşimi hiç etkilemez, görsel sonuç legacy'nin 2px'i ile aynıdır. */
  .ok-tabs--wrap .ok-tab:hover {
    /* Legacy hover YALNIZ kenarlığı değiştirir (aspx:37-40, turuncu #F57F17),
     zemini değiştirmez. Aynı davranış korundu; turuncu yerine marka ailesinden
     `--ok-brand-500` — tasarım sisteminde turuncu bir vurgu rengi yok
     (`--ok-warning` #A96A00 anlamsal olarak "uyarı" demektir, "üzerindesin"
     değil) ve turuncu eklemek yeni renk uydurmak olurdu. [SAPMA] görsel. */
    /* Hover'a BİLEREK `inset` halka verilmedi. Tarayıcıda ölçüldü: hover da
     seçili de 2px'lik mavi halka taşıyınca ikisi birbirine karışıyor — legacy
     bunu HUE ile çözüyordu (turuncu ↔ mavi), bizde iki durum da marka mavisi.
     Ayrım bu yüzden iki kanaldan gidiyor: kalınlık (1px ↔ 2px) ve dolgu
     (`surface-sunk` ↔ beyaz). */
    background: var(--ok-surface-sunk);
    border-color: var(--ok-brand-500);
  }

  .ok-tabs--wrap .ok-tab[aria-selected="true"] {
    background: var(--ok-panel);
    border-color: var(--ok-brand-600);
    box-shadow: inset 0 0 0 1px var(--ok-brand-600);
    font-weight: var(--ok-fw-medium);
  }
  /* Temel kural hatalı sekmenin seçili hâlinde ALT kenarlığı kırmızıya çeviriyor
   (:80); kutulu sekmede ayırt edici olan tüm çerçevedir, kural buna uyarlandı. */
  .ok-tabs--wrap .ok-tab.has-error[aria-selected="true"] {
    border-color: var(--ok-danger);
    box-shadow: inset 0 0 0 1px var(--ok-danger);
  }

@media (max-width: 1024px) {
  .ok-tabs--vertical {
    flex-direction: column;
    gap: 0;
  }

    .ok-tabs--vertical > .ok-tabs__bar {
      flex-direction: row;
      flex: none;
      max-height: none;
      position: static;
      border-inline-end: 0;
      border-bottom: 1px solid var(--ok-border);
    }

    .ok-tabs--vertical .ok-tabs__scroll {
      flex-direction: row;
      overflow-x: auto;
      overflow-y: hidden;
    }

    .ok-tabs--vertical .ok-tabs__arrow {
      display: grid !important;
    }

    .ok-tabs--vertical .ok-tabs__bar.has-overflow .ok-tabs__arrow {
      display: grid;
    }

    .ok-tabs--vertical .ok-tab {
      width: auto;
      white-space: nowrap;
      border-inline-start: 0;
      border-bottom: 2px solid transparent;
      border-radius: 0;
    }

      .ok-tabs--vertical .ok-tab[aria-selected="true"] {
        background: transparent;
        border-bottom-color: var(--ok-brand-600);
      }

    .ok-tabs--vertical .ok-tab-panel {
      padding-top: var(--ok-sp-4);
    }
}

/* ==== components/grid.css ================================================ */
/* ==========================================================================
   Veri tablosu (legacy Telerik RadGrid + DataTables karşılığı)
   Yetenekler: sabit başlık · kolon filtre satırı · sıralama · sayfalama ·
   kolon boyutlandırma · kolon seçici · satır seçimi · satır aksiyonları ·
   alt toplam · gruplama · sabit ilk kolon · mobilde kart görünümü
   ========================================================================== */

.ok-grid-wrap {
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  background: var(--ok-surface);
  overflow: hidden;
  display: flex;
  flex-direction: column;
  min-width: 0;
}
/* Kart içine gömüldüğünde kendi kenarlığını bırakır */
.ok-card__body--flush > .ok-grid-wrap {
  border: 0;
  border-radius: 0;
}

/* Üst araç çubuğu: sol tarafta kayıt sayısı, sağda aksiyonlar */
.ok-grid-bar {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border-bottom: 1px solid var(--ok-border);
  background: var(--ok-surface);
  flex-wrap: wrap;
  min-height: 44px;
}

.ok-grid-bar__end {
  margin-inline-start: auto;
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

/* Kaydırma kabı — yatay kaydırma BURADA olur, sayfa gövdesi asla kaymaz */
.ok-grid-scroll {
  overflow: auto;
  overscroll-behavior-x: contain;
  max-height: var(--ok-grid-max-h, none);
}

/* ⚠️ SINIF ADI ÇAKIŞMASI — DOKUNMADAN ÖNCE OKU.
   layout.css:461 şunu tanımlıyor:  .ok-grid { display: grid; gap: … }
   Yani `ok-grid` aynı zamanda bir YERLEŞİM yardımcı sınıfıdır. Bu bileşen ise aynı adı
   bir <table> üzerinde kullanıyor. Paketleme sırasında grid.css layout.css'ten SONRA
   geldiği hâlde burada `display` yazılmadığı için layout kuralı kazanıyordu: tablo
   `display: grid` oluyor, thead/tbody bağımsız grid öğelerine dönüşüyor ve
   SÜTUN GENİŞLİKLERİ PAYLAŞILMIYOR — başlıklar veri hücreleriyle hizasız kalıyordu.
   Ölçülen (2026-08-18): th[1] sol=604 gen=318 iken td[1] sol=416 gen=176.
   `table.ok-grid` seçicisi (özgüllük 0,0,1,1) tabloyu geri alır; yerleşim yardımcısı
   olarak kullanılan <div class="ok-grid"> öğeleri etkilenmez. */
table.ok-grid {
  display: table;
  gap: 0;
}

/* ---- Modern görünüm (K-45, 2026-08-18) ---------------------------------
   Kullanıcı isteği: grid daha modern dursun. Yapılanlar bilinçli olarak
   ÖLÇÜLÜ — kurumsal bir bordro ekranında okunabilirlik süslemeden önce gelir:
     · tablo yuvarlatılmış bir yüzeyin içinde durur, dışına taşmaz
     · satır geçişleri yumuşak (renk sıçraması yerine 120ms geçiş)
     · üzerine gelinen satır hafifçe belirginleşir
     · başlık altında ince bir ayrım gölgesi — kaydırırken başlık "yüzer"
   Satır yüksekliği ve yazı boyutu DEĞİŞTİRİLMEDİ: 111 liste ekranının çoğu
   tek ekrana çok satır sığdırmak zorunda. */
.ok-grid-scroll {
  /*border: 1px solid var(--ok-border);*/
  border-radius: var(--ok-r-md);
  overflow: auto;
}
  /* Yuvarlatılmış çerçevenin içinde tablonun kendi dış kenarlığı fazlalık olur. */
  .ok-grid-scroll > table.ok-grid {
    border: 0;
  }

.ok-grid tbody tr > td {
  transition: background-color 120ms ease;
}

/* Sticky başlığın altına, gövde kaydıkça görünen ince ayrım. */
.ok-grid thead tr:last-child th {
  box-shadow: 0 1px 0 var(--ok-brand-200);
}

.ok-grid {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-size: var(--ok-fs-sm);
}

  /* ---------- Sütun ayıracı ----------------------------------------------- */
  /* Kullanıcı kararı K-34 (2026-08-18): sütunlar birbirine karışıyordu; her hücrenin
   SAĞINA ince bir dikey çizgi kondu. `--ok-border` (en açık ton) bilinçli seçim —
   amaç sütunu ayırmak, ızgara çizmek değil.
   Kapsam dışı bırakılanlar:
     · her satırın SON hücresi        → tablonun dış kenarında ikinci çizgi olmasın
     · aksiyon kolonu (.ok-grid__cell-act) → zaten `box-shadow: inset 1px 0 0` ile
       ayrılıyor ve sticky; ikinci kenarlık çift çizgi gösterirdi
     · kart görünümü (≤760px)         → orada hücreler alt alta, dikey çizgi anlamsız */
  .ok-grid thead th:not(:last-child):not(.ok-grid__cell-act),
  .ok-grid tbody td:not(:last-child):not(.ok-grid__cell-act),
  .ok-grid tfoot th:not(:last-child):not(.ok-grid__cell-act),
  .ok-grid tfoot td:not(:last-child):not(.ok-grid__cell-act) {
    /* [2026-08-29] Eşi: satır ayıracı `.ok-grid tbody td { border-bottom }`.
       Gerekçe orada yazılı — K-34'ün açık tonu kullanıcı kararıyla koyulaştırıldı. */
    border-right: 1px solid var(--ok-border-hard);
  }

  /* ---------- Başlık — MAVİ TEMA (K-41, 2026-08-18) -----------------------
   Kullanıcı kararı: grid mavi tonlarda olsun, kolon başlıkları daha koyu mavi.
   Ölçek `tokens.css`'teki marka mavisidir; grid kendi rengini uydurmuyor:
     başlık zemini  brand-700 (#14528F)  → beyaz metinle kontrast ~7:1 (AA fazlasıyla)
     aktif sıralama brand-800 (#10457E)  → bir ton koyu, "bu kolona göre sıralı"
     filtre satırı  brand-50  (#EFF6FE)  → koyu başlıkla gövde arasında yumuşak geçiş

   [K-42] BÜYÜK HARFE ÇEVİRME KALDIRILDI. Önceden `text-transform: uppercase` vardı.
   Başlık metinleri etiket sözlüğünden geliyor (`TA_RESOURCES` / `labels-tr.json`) ve
   orada zaten doğru biçimde yazılmış durumda — CSS'in üzerine yazması gereksiz.
   Ayrıca Türkçe'de zararlı: `text-transform` yalnız `lang` doğru kurulduğunda
   `i → İ` yapar, aksi hâlde `i → I` üretir ("İzin" yerine "IZIN"). Metni olduğu
   gibi bırakmak hem doğru hem de sözlükteki yazımı tek doğruluk kaynağı yapar.
   `letter-spacing` de sıfırlandı; o değer büyük harf içindi. */
  .ok-grid thead th {
    position: sticky;
    top: 0;
    z-index: var(--ok-z-sticky);
    background: linear-gradient(180deg,rgba(3, 103, 143, 1) 0%, rgba(87, 141, 199, 1) 57%, rgba(159, 180, 207, 1) 100%);
    border-bottom: 1px solid var(--ok-brand-800);
    padding: var(--ok-cell-py) var(--ok-cell-px);
    font-size: var(--ok-fs-sm);
    font-weight: var(--ok-fw-semibold);
    color: var(--ok-text-on-brand);
    text-transform: none;
    letter-spacing: 0;
    /* 🔴 [2026-08-24 — kullanıcı bildirdi] Burada `white-space: nowrap` vardı ve KALDIRILDI.
     Legacy'de böyle bir kural YOK: Telerik'in `.rgHeader` stillerinde `white-space`
     tanımı hiç geçmiyor (ölçüldü), yani başlık kolonun genişliğine göre kendiliğinden
     sarıyordu. `/Others/task` bunun örneği — legacy uzun başlığı 125px'lik kolonda ÜÇ
     SATIRA sarıyor, V2 ise tek satıra zorluyordu.
     Kullanıcının sözüyle: "bir çoğunda doğrudur ama burada legacy 3 satırda yazmış."
     Kuralı kaldırmak ikisini de doğru yapar: geniş kolonda başlık zaten tek satırda
     kalır, dar kolonda sarar — kararı genişlik verir, CSS değil. Legacy davranışı budur.
     ⚠️ Hücre tarafındaki `.is-nowrap` / `.is-num` KURALLARI DURUYOR: onlar opt-in'dir ve
     sayı/tarih hücrelerinin bölünmemesi için gerekli. */
    vertical-align: middle;
    user-select: none;
  }
  /* Koyu zeminde sütun ayıracı `--ok-border` ile görünmez; beyazın şeffafı kullanılıyor.
   (Gövde tarafındaki ayıraç K-34 kuralında, değişmedi.) */
  .ok-grid thead tr:first-child th:not(:last-child):not(.ok-grid__cell-act) {
    border-right-color: rgba(255, 255, 255, .22);
  }

  /* Filtre satırı başlığın altına yapışır */
  .ok-grid thead tr.ok-grid__filters th {
    top: var(--ok-grid-head-h, 32px);
    z-index: calc(var(--ok-z-sticky) - 1);
    background: var(--ok-brand-50);
    border-bottom: 1px solid var(--ok-brand-200);
    padding: 5px var(--ok-cell-px);
    text-transform: none;
    letter-spacing: 0;
  }

    .ok-grid thead tr.ok-grid__filters th:not(:last-child):not(.ok-grid__cell-act) {
      border-right-color: var(--ok-brand-200);
    }

.ok-grid__th-inner {
  display: flex;
  align-items: center;
  gap: 5px;
  min-width: 0;
}
/* Hem .ok-grid__th-inner ile sarılı hem sarılmamış başlıklarda çalışsın */
.ok-grid__th--num {
  text-align: end;
}

.ok-grid__th--center {
  text-align: center;
}

.ok-grid__th--num .ok-grid__th-inner {
  justify-content: flex-end;
}

.ok-grid__th--center .ok-grid__th-inner {
  justify-content: center;
}

/* Sıralanabilir başlık */
.ok-grid__sort {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: inherit;
  font: inherit;
  letter-spacing: inherit;
  text-transform: inherit;
  cursor: pointer;
  min-width: 0;
  border-radius: var(--ok-r-sm);
}
  /* Koyu mavi başlık (K-41) üzerinde sıralama denetimleri. Eski değerler açık zemine
   göre ayarlıydı (brand-700 metin, border-hard ikon) ve koyu zeminde okunmuyordu. */
  .ok-grid__sort:hover {
    color: var(--ok-brand-100);
  }

.ok-grid__sort-icon {
  color: rgba(255, 255, 255, .55);
  width: 13px;
  height: 13px;
  flex: 0 0 auto;
}

.ok-grid__sort:hover .ok-grid__sort-icon {
  color: var(--ok-text-on-brand);
}
/* Aktif sıralama: bir ton KOYU zemin — açık vurgu koyu başlıkta ters etki yapardı. */
.ok-grid th[aria-sort] {
  color: var(--ok-text-on-brand);
  background: var(--ok-brand-800);
}

  .ok-grid th[aria-sort] .ok-grid__sort-icon {
    color: var(--ok-text-on-brand);
  }
/* Çok kolonlu sıralamada sıra numarası rozeti. Koyu başlık (K-41) üzerinde
   ters çevrildi: açık zemin + koyu metin. */
.ok-grid__sort-rank {
  font-size: 9px;
  font-weight: var(--ok-fw-bold);
  color: var(--ok-brand-800);
  background: var(--ok-brand-100);
  border-radius: var(--ok-r-pill);
  min-width: 13px;
  height: 13px;
  display: inline-grid;
  place-items: center;
}

/* Kolon genişletme tutamağı */
.ok-grid__resize {
  position: absolute;
  inset-block: 0;
  inset-inline-end: -3px;
  width: 7px;
  cursor: col-resize;
  z-index: 2;
  touch-action: none;
}

  .ok-grid__resize::after {
    content: "";
    position: absolute;
    inset-block: 6px;
    inset-inline-start: 3px;
    width: 1px;
    background: var(--ok-border-strong);
    transition: background var(--ok-dur-fast) var(--ok-ease);
  }

  .ok-grid__resize:hover::after,
  .ok-grid__resize.is-active::after {
    background: var(--ok-brand-600);
    width: 2px;
  }

.ok-grid thead th {
  position: sticky;
}
/* resize tutamağı için konumlanabilir olmalı */

/* [2026-08-23] Kolon boyutlandırma ancak SABİT düzende çalışır: otomatik düzende
   `th`'ye verilen genişlik bağlayıcı değildir, tarayıcı içeriğe göre yeniden dağıtır
   ve sürükleme hiçbir şey yapmıyormuş gibi görünür (kullanıcı bildirdi).

   ⚠️ Bu sınıf ızgaraya `grid.js` tarafından YALNIZ ilk sürüklemede eklenir; aynı anda
   her kolonun o anki genişliği ölçülüp sabitlenir. Hiç sürüklenmemiş ızgaralar
   otomatik düzende kalır — mevcut ekranların görünümü değişmez. */
.ok-grid--fixed {
  table-layout: fixed;
}

/* ---------- Gövde ------------------------------------------------------- */
  /* [2026-08-29 — kullanıcı isteği] Izgara çizgisi `--ok-border` (#E2E8F1) yerine
     `--ok-border-hard` (#AFBECF): "o line'lar beyaz yerine koyu gri olsun".
     ⚠️ Bu, K-34'ün (2026-08-18) "en açık ton bilinçli seçim — amaç sütunu ayırmak,
     ızgara çizmek değil" gerekçesini kullanıcı kararıyla DEĞİŞTİRİR; artık istenen
     ızgara görünümünün kendisi. Aynı ton survey-graphics grafiklerinde de kullanıldı.
     Eşi: sütun ayıracı (aşağıda `border-right`). İkisi birlikte değiştirilir. */
.ok-grid tbody td {
  padding: var(--ok-cell-py) var(--ok-cell-px);
  border-bottom: 1px solid var(--ok-border-hard);
  height: var(--ok-row-h);
  vertical-align: middle;
  color: var(--ok-text);
  background: var(--ok-surface);
}

/* 🔴 [2026-08-24 — kullanıcı bildirdi] SATIR RENGİ HÜCREYE GEÇMİYORDU.
   `grid.js` `rowClass` seçeneğini destekliyor (`:532`) ve ekranlar onunla satıra
   `ok-c-danger` gibi bir renk yardımcısı takıyor. Ama yukarıdaki kural hücreye KENDİ
   rengini veriyor (`color: var(--ok-text)`), yani `<tr>`deki renk hiç kalıtılmıyordu:
   sınıf DOM'a basılıyor, ekranda hiçbir şey değişmiyor — hata vermeyen, yalnız
   "renk gelmiyor" diye fark edilen bir sessiz kayıp.
   `inherit` hücreyi satırın rengine bırakır; renk verilmemiş satırlarda `<tr>` de
   `--ok-text` kalıttığı için görünüm DEĞİŞMEZ.
   ⚠️ Yalnız bu iki yardımcı için yazıldı; `tr[class]` gibi genel bir seçici, satıra
   sınıf takan her ekranın metin rengini kazara ele geçirirdi. */
.ok-grid tbody tr.ok-c-danger > td,
.ok-grid tbody tr.ok-c-warning > td {
  color: inherit;
}
/* Gövde — mavi tema (K-41). Basamaklar birbirinden ayırt edilebilir olmalı:
   zebra < hover < seçili < seçili+hover. Eski zebra `--ok-surface-alt` (#FBFCFE)
   beyazdan neredeyse ayırt edilemiyordu ve koyu başlıkla birlikte tablo iki parçaya
   bölünmüş görünüyordu. */
.ok-grid tbody tr:nth-child(even) > td {
  background: var(--ok-brand-50);
}

.ok-grid tbody tr:hover > td {
  background: var(--ok-brand-100);
}

.ok-grid tbody tr.is-selected > td {
  background: var(--ok-brand-200);
}

.ok-grid tbody tr.is-selected:hover > td {
  background: var(--ok-brand-300);
}

.ok-grid tbody tr:last-child > td {
  border-bottom: 0;
}

/* Satır durumu vurgusu (pasif kayıt, ayrılmış personel, kilitli dönem) */
.ok-grid tbody tr.is-inactive > td {
  color: var(--ok-text-3);
}

.ok-grid tbody tr.is-inactive .ok-grid__link {
  color: var(--ok-text-2);
}

.ok-grid tbody tr.is-error > td:first-child {
  box-shadow: inset 3px 0 0 var(--ok-danger);
}

/* ---- Satır zemini geçirgen gövde (K-72, 2026-08-20 kullanıcı kararı) ----
   SORUN (ölçüldü, /Security/company-resources, 2026-08-20):
   Yetki/kaynak ağacı ekranları satır rengini LEGACY PARİTESİ gereği `<tr>` üzerinde
   taşır — Menu #116E9D, Sub Menu #239FD5 (CompanyResources.cshtml.cs:617-622,
   UserGroupResources.cshtml:208-209, UserResources.cshtml:45-48). Yukarıdaki gövde
   kuralı her hücreye OPAK bir zemin bastığı için (`background: var(--ok-surface)`)
   satırın kendi rengi hücrelerin ALTINDA kalıyor ve hiç görünmüyordu.
   Ölçülen sonuç: `<tr>` = rgb(17,110,157), `<td>` = rgb(255,255,255). Menu satırının
   metni `color:#fff` olduğu için BEYAZ ZEMİNDE BEYAZ YAZI oluyor, yani satır
   tamamen boş görünüyordu (B1000 "Kurumsal Tanımlar" ekranda hiç okunmuyordu).

   ÇÖZÜM: temel kuraldaki `background` SİLİNMEDİ — sıradan liste gridleri (personel,
   bordro, ünvan…) ona bağlı ve sticky başlık/kolonlar opak zemin ister; bu
   değiştirici sınıf yalnız kendisine EKLENDİĞİ gridde zemini geçirgen yapar.
   İSİM NOTU: `--matrix` KULLANILAMADI, o ad :447'de puantaj matrisi girişine
   (küçük yazı + dar hücre + `.ok-cell-input`) zaten ait.

   ZEBRA NEDEN BURADA DA EZİLİYOR: temel kuraldaki `background` kalksa bile
   `tr:nth-child(even) > td` daha özgül olduğu için ÇİFT SATIRLARDA kazanmaya devam
   ederdi — ölçüldü: 2. satır (`Sub Menu`, `<tr>` = #239FD5) yine brand-50 (#EFF6FE)
   kalıyordu. Zebra zaten burada anlamsız: satır rengi süs değil, HİYERARŞİ VERİSİ
   (Menu / Sub Menu / Tab Menu / Function) ve zebra onunla yarışıyor.

   HOVER/SEÇİLİ NEDEN KORUNDU AMA YARI SAYDAM: bu ekranlarda kullanıcı geniş bir
   satırda onay kutusu tıklıyor; hangi satırda olduğunu görmesi gerekiyor. Opak
   brand-100 basmak satırın kimlik rengini yok ederdi (koyu mavi satır açık maviye
   dönüp beyaz yazı tekrar kaybolurdu). Yarı saydam katman altındaki rengi KORUYARAK
   koyulaştırır; renksiz satırlarda da eskisiyle aynı hissi verir.

   ⚠️ SABİT KOLONLARLA BİRLİKTE KULLANILMAZ. `.ok-grid--pin-first` (:340) ve aksiyon
   kolonu `.ok-grid__cell-act` (:306) sticky'dir ve altlarından kayan içeriği
   gizlemek için OPAK hücre zeminine muhtaçtır; geçirgen zeminde içerik altlarından
   görünür. Bu sınıfın hedefi olan üç ekranın hiçbirinde ikisi de yok (doğrulandı).
   ⚠️ Mobil kart görünümü (`.ok-grid--cards`, :497-498) daha özgül olduğu için
   ≤760px'te hücreler yine opaklaşır; hedef ekranların hiçbiri `--cards` kullanmıyor. */
.ok-grid--row-bg tbody td {
  background: transparent;
  border: 1px solid lightgray;
}

.ok-grid--row-bg tbody tr:nth-child(even) > td {
  background: transparent;
}

.ok-grid--row-bg tbody tr:hover > td {
  background: rgba(20, 82, 143, .12);
}

.ok-grid--row-bg tbody tr.is-selected > td {
  background: rgba(20, 82, 143, .26);
}

.ok-grid--row-bg tbody tr.is-selected:hover > td {
  background: rgba(20, 82, 143, .36);
}

/* Hücre türleri */
.ok-grid .is-num {
  text-align: end;
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum";
  white-space: nowrap;
}

.ok-grid .is-center {
  text-align: center;
}

.ok-grid .is-neg {
  color: var(--ok-danger);
}

.ok-grid .is-strong {
  font-weight: var(--ok-fw-semibold);
}

.ok-grid__link {
  color: var(--ok-brand-700);
  font-weight: var(--ok-fw-medium);
}

.ok-grid__sub {
  display: block;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
}

/* Personel hücresi: avatar + ad + sicil */
.ok-grid__person {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  min-width: 0;
}

  .ok-grid__person .ok-avatar {
    width: 26px;
    height: 26px;
    font-size: 10px;
  }

/* Seçim kolonu */
.ok-grid__col-check {
  width: 36px;
}

.ok-grid td.ok-grid__cell-check,
.ok-grid th.ok-grid__cell-check {
  padding-inline: var(--ok-sp-3) 0;
  text-align: start;
}

/* Aksiyon kolonu — sağa yapışık kalır ki yatay kaydırmada kaybolmasın */
.ok-grid__col-act {
  width: 1%;
}

.ok-grid td.ok-grid__cell-act,
.ok-grid th.ok-grid__cell-act {
  position: sticky;
  inset-inline-end: 0;
  z-index: 3;
  white-space: nowrap;
  text-align: end;
  padding-inline: var(--ok-sp-2);
  box-shadow: inset 1px 0 0 var(--ok-border);
}

.ok-grid th.ok-grid__cell-act {
  z-index: calc(var(--ok-z-sticky) + 1);
}
/* Ayırıcı gölge koyu başlıkta (K-41) görünmez; beyazın şeffafına çevriliyor.
   Gövdedeki hücreler `--ok-border` ile kalır. */
.ok-grid thead th.ok-grid__cell-act {
  box-shadow: inset 1px 0 0 rgba(255, 255, 255, .22);
}
/* [2026-08-22 — kullanıcı isteği] Satır aksiyonları arasında İNCE AYIRICI.
   Önceki hâlde aralık 2px'ti ve düğmelerin kenarlığı yalnız hover'da görünüyordu;
   ikonlar birbirine giriyordu. Aralık ayırıcıya yer açacak kadar büyütüldü.

   Ayırıcı düğmenin KENDİ kenarlığı DEĞİL, mutlak konumlu bir `::before`:
   · `.ok-act:hover` `border-color`'ın tamamını değiştiriyor (buttons.css:114);
     ayırıcıyı kenarlığa bağlasaydık `.ok-grid__acts > .ok-act + .ok-act` (0,3,0)
     `:hover`'ı (0,2,0) EZERDİ ve düğmenin sol kenarı hover'da griye takılırdı.
   · `.ok-act` `display:inline-grid` + `place-items:center` taşıyor; normal akışta
     bir `::before` ızgara ÖĞESİ olur ve ikonun ortalamasını bozardı. `position:
     absolute` onu ızgara akışından çıkarır — ikon yerinde kalır.
   · İpucu `::after`'ı kullanıyor (feedback.css:138,186), `::before` boştaydı.

   ⚠️ `is-slot` yuvalar `visibility:hidden` (aşağıda); `::before` de onlarla
   birlikte gizlenir, yani boş yuvanın yanında ayırıcı ASILI KALMAZ. */
.ok-grid__acts {
  display: inline-flex;
  gap: 7px;
}

  .ok-grid__acts > .ok-act {
    position: relative;
  }

    .ok-grid__acts > .ok-act + .ok-act::before {
      content: '';
      position: absolute;
      inset-inline-start: -4px;
      top: 4px;
      bottom: 4px;
      width: 1px;
      background: var(--ok-border);
    }

  /* [K-67, 2026-08-19 kullanıcı kararı] Satır aksiyonları SABİT YUVA.
   Gösterilemeyen aksiyon (yetki yok ya da satıra özel `visible` yüklemi false)
   satırdan SİLİNMEZ, yerini boş bırakır — sonraki düğme sola kaymaz, kullanıcı
   aynı ikonu her satırda aynı x'te bulur.
   `display:none` / `[hidden]` (base.css:12) öğeyi akıştan çıkardığı için
   kullanılamaz; `visibility:hidden` yer kaplamaya devam eder.
   Sınıfı `grid.js` (satır çizimi) ve `aut.js` (`data-aut-mode="slot"`) koyar.
   Odak ve ekran okuyucu engeli CSS'ten yapılamadığı için `aut.js` tarafında
   `tabindex="-1"` + `aria-hidden="true"` ile veriliyor.
   Kapsam kasıtlı olarak dar: yalnız `.ok-act` ve `.ok-grid__acts` içi.
   Toolbar/menü/sekme öğeleri eskisi gibi tamamen gizlenir. */

  .ok-act.is-slot,
  .ok-grid__acts > .is-slot {
    visibility: hidden;
    pointer-events: none;
  }

/* Sabit ilk kolon — puantaj matrisi ve geniş raporlar için */
.ok-grid--pin-first td:first-child,
.ok-grid--pin-first th:first-child {
  position: sticky;
  inset-inline-start: 0;
  z-index: 2;
  box-shadow: inset -1px 0 0 var(--ok-border);
}

.ok-grid--pin-first thead th:first-child {
  z-index: calc(var(--ok-z-sticky) + 1);
}

/* ---------- Alt toplam satırı (legacy'de yoktu) ------------------------- */
.ok-grid tfoot td {
  position: sticky;
  bottom: 0;
  z-index: var(--ok-z-sticky);
  padding: var(--ok-cell-py) var(--ok-cell-px);
  background: var(--ok-brand-50);
  border-top: 1px solid var(--ok-brand-200);
  font-weight: var(--ok-fw-bold);
  color: var(--ok-brand-800);
  white-space: nowrap;
}

.ok-grid tfoot .is-num {
  font-variant-numeric: tabular-nums;
}

/* ---------- Gruplama --------------------------------------------------- */
.ok-grid__group > td {
  background: var(--ok-surface-sunk) !important;
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text);
  border-bottom: 1px solid var(--ok-border-strong);
  cursor: pointer;
}

.ok-grid__group-inner {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
}

.ok-grid__group .ok-icon {
  transition: transform var(--ok-dur-fast) var(--ok-ease);
}

.ok-grid__group.is-collapsed .ok-icon {
  transform: rotate(-90deg);
}

/* ---------- Filtre girdileri ------------------------------------------- */
.ok-grid__filter {
  width: 100%;
}

  .ok-grid__filter .ok-input,
  .ok-grid__filter .ok-native-select {
    height: 26px;
    font-size: var(--ok-fs-xs);
    padding-inline: 7px;
    border-color: var(--ok-border);
    background: var(--ok-surface-alt);
  }

    .ok-grid__filter .ok-input:focus {
      background: var(--ok-surface);
    }

  .ok-grid__filter .ok-native-select {
    padding-inline-end: 24px;
    background-size: 13px 13px;
  }

/* ---------- Sayfalama -------------------------------------------------- */
.ok-grid-foot {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border-top: 1px solid var(--ok-border);
  background: var(--ok-surface);
  flex-wrap: wrap;
  min-height: 44px;
}

.ok-pager {
  display: flex;
  align-items: center;
  gap: 2px;
  margin-inline-start: auto;
}

.ok-pager__btn {
  display: grid;
  place-items: center;
  min-width: 28px;
  height: 28px;
  padding-inline: 6px;
  border-radius: var(--ok-r-sm);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
  font-variant-numeric: tabular-nums;
}

  .ok-pager__btn:hover:not(:disabled) {
    background: var(--ok-surface-sunk);
    color: var(--ok-text);
  }

  .ok-pager__btn.is-active {
    background: var(--ok-brand-600);
    color: #fff;
    font-weight: var(--ok-fw-semibold);
  }

  .ok-pager__btn:disabled {
    opacity: .4;
    cursor: not-allowed;
  }

.ok-pager__gap {
  padding-inline: 4px;
  color: var(--ok-text-3);
}

.ok-grid-foot__info {
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
  font-variant-numeric: tabular-nums;
}

.ok-grid-foot__size {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
}

  .ok-grid-foot__size .ok-native-select {
    width: auto;
    height: 26px;
    font-size: var(--ok-fs-xs);
    padding-inline: 7px 24px;
    background-size: 13px 13px;
  }

/* ---------- Kolon seçici paneli (TH_USER_DISPLAY karşılığı) ------------ */
.ok-colpick {
  max-height: 320px;
  overflow-y: auto;
  padding: var(--ok-sp-2);
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.ok-colpick__item {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  padding: 5px var(--ok-sp-2);
  border-radius: var(--ok-r-sm);
  font-size: var(--ok-fs-sm);
  cursor: pointer;
}

  .ok-colpick__item:hover {
    background: var(--ok-surface-sunk);
  }

/* ---------- Matris girişi (puantaj) ------------------------------------ */
.ok-grid--matrix {
  font-size: var(--ok-fs-xs);
}

  .ok-grid--matrix td, .ok-grid--matrix th {
    padding: 2px 4px;
  }
  /* Hafta sonu ve tatil kolonları */
  .ok-grid--matrix .is-weekend {
    background: var(--ok-surface-sunk) !important;
  }

  .ok-grid--matrix .is-holiday {
    background: #FDF1F0 !important;
  }

  .ok-grid--matrix thead th.is-weekend,
  .ok-grid--matrix thead th.is-holiday {
    color: var(--ok-danger);
  }

/* ---------- Mobil: satırlar karta dönüşür ------------------------------ */
@media (max-width: 760px) {
  /* Kart görünümünde hücreler alt alta dizilir; sütun ayıracı (K-34) anlamsızlaşır
     ve kartın içinde asılı kalmış dikey çizgiler olarak görünür. */
  .ok-grid--cards thead th,
  .ok-grid--cards tbody td,
  .ok-grid--cards tfoot th,
  .ok-grid--cards tfoot td {
    border-right: 0;
  }

  .ok-grid--cards {
    display: block;
  }

    .ok-grid--cards thead {
      display: none;
    }

    .ok-grid--cards tbody, .ok-grid--cards tr, .ok-grid--cards td {
      display: block;
      width: auto;
    }

      .ok-grid--cards tbody tr {
        border: 1px solid var(--ok-border);
        border-radius: var(--ok-r-md);
        margin-bottom: var(--ok-sp-2);
        overflow: hidden;
      }

        .ok-grid--cards tbody tr > td,
        .ok-grid--cards tbody tr:nth-child(even) > td {
          background: var(--ok-surface);
        }

      .ok-grid--cards tbody td {
        display: flex;
        align-items: baseline;
        justify-content: space-between;
        gap: var(--ok-sp-3);
        height: auto;
        min-height: 0;
        padding: 6px var(--ok-sp-3);
        text-align: end !important;
      }

        .ok-grid--cards tbody td::before {
          content: attr(data-label);
          flex: 0 0 auto;
          font-size: var(--ok-fs-xs);
          font-weight: var(--ok-fw-semibold);
          color: var(--ok-text-3);
          text-transform: uppercase;
          letter-spacing: .03em;
          text-align: start;
        }

        .ok-grid--cards tbody td.ok-grid__cell-act,
        .ok-grid--cards tbody td.ok-grid__cell-check {
          position: static;
          box-shadow: none;
          justify-content: flex-end;
          background: var(--ok-surface-alt) !important;
          border-top: 1px solid var(--ok-border);
        }
          /* Seçim ve aksiyon hücrelerinde etiket gösterilmez — kendi ikonları yeterli */
          .ok-grid--cards tbody td.ok-grid__cell-act::before,
          .ok-grid--cards tbody td.ok-grid__cell-check::before {
            content: none;
          }

        .ok-grid--cards tbody td.ok-grid__cell-check {
          justify-content: flex-start;
        }

        .ok-grid--cards tbody td:empty {
          display: none;
        }

    .ok-grid--cards .ok-grid__person {
      justify-content: flex-end;
    }

  .ok-grid-foot {
    justify-content: center;
  }

  .ok-pager {
    margin-inline-start: 0;
  }
}

/* ==== components/filterpanel.css ========================================= */
/* ==========================================================================
   Gelişmiş arama paneli (legacy UserControl\DetailedSearch.ascx karşılığı)
   59 ekranda kullanılıyor, ~40 kriter taşıyor. Katlanır; aktif filtreler
   panel kapalıyken de çip olarak görünür.
   ========================================================================== */

.ok-filter {
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-lg);
  background: var(--ok-surface);
  overflow: hidden;
}

body:has([data-ds-ac]) [data-ok-filter="detailedSearch"] > .ok-filter__quick {
  display: none;
}

[data-ds-ac] > .ok-icon:last-child {
  transition: transform .15s;
}

[data-ds-ac][aria-expanded="true"] > .ok-icon:last-child {
  transform: rotate(180deg);
}

/* ---------- Hızlı filtre şeridi (her zaman görünür) -------------------- */
.ok-filter__quick {
  display: flex;
  align-items: flex-end;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-3);
  flex-wrap: wrap;
}

  .ok-filter__quick > .ok-field,
  .ok-filter__quick > [data-ok-field] {
    flex: 1 1 190px;
    min-width: 150px;
  }

.ok-filter__quick-actions {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  margin-inline-start: auto;
  flex: 0 0 auto;
}

/* ---------- Katlanır gelişmiş bölüm ------------------------------------ */
.ok-filter__toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--ok-sp-2);
  height: var(--ok-ctrl-h);
  padding-inline: var(--ok-sp-3);
  border: 1px dashed var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  white-space: nowrap;
}

  .ok-filter__toggle:hover {
    border-color: var(--ok-brand-500);
    color: var(--ok-brand-700);
    background: var(--ok-brand-50);
  }

  .ok-filter__toggle[aria-expanded="true"] {
    border-style: solid;
    border-color: var(--ok-brand-300);
    background: var(--ok-brand-50);
    color: var(--ok-brand-700);
  }

  .ok-filter__toggle .ok-icon:last-child {
    transition: transform var(--ok-dur-base) var(--ok-ease);
  }

  .ok-filter__toggle[aria-expanded="true"] .ok-icon:last-child {
    transform: rotate(180deg);
  }

.ok-filter__advanced {
  border-top: 1px solid var(--ok-border);
  background: var(--ok-surface-alt);
  padding: var(--ok-sp-4);
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-5);
}

  .ok-filter__advanced[hidden] {
    display: none;
  }

/* Kriter grupları — legacy'de <hr class="div-line"> ile ayrılmıştı,
   burada adlandırılmış bölümler hâline getirildi */
.ok-filter__group {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-3);
}

.ok-filter__group-title {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-bold);
  color: var(--ok-text-2);
  text-transform: uppercase;
  letter-spacing: .05em;
}

  .ok-filter__group-title::after {
    content: "";
    flex: 1 1 auto;
    height: 1px;
    background: var(--ok-border);
  }

  .ok-filter__group-title .ok-icon {
    color: var(--ok-brand-500);
  }

/* ---------- Aktif filtre çipleri --------------------------------------- */
.ok-filter__active {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border-top: 1px solid var(--ok-border);
  background: var(--ok-surface);
  flex-wrap: wrap;
}

  .ok-filter__active[hidden] {
    display: none;
  }

.ok-filter__active-label {
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text-3);
  text-transform: uppercase;
  letter-spacing: .04em;
  white-space: nowrap;
}

@media (max-width: 860px) {
  .ok-filter__quick {
    flex-direction: column;
    align-items: stretch;
  }
    /* DİKKAT: sütun yönünde flex-basis YÜKSEKLİK olur. Yatay düzendeki
     `flex: 1 1 190px` burada 190px yüksekliğe dönüşüp alanları şişiriyordu. */
    .ok-filter__quick > .ok-field,
    .ok-filter__quick > [data-ok-field] {
      flex: 0 0 auto;
      min-width: 0;
    }

  .ok-filter__quick-actions {
    margin-inline-start: 0;
  }

    .ok-filter__quick-actions > .ok-btn {
      flex: 1 1 auto;
    }
  /* Gelişmiş panel mobilde alttan açılan tam sayfaya taşınır (JS yapar) */
  .ok-filter__advanced {
    padding: var(--ok-sp-3);
  }
}

/* ==== components/tree.css ================================================ */
/* ==========================================================================
   Ağaç görünümü
   İki kullanım: organizasyon şeması (Corporate\organization-tree) ve
   4 seviyeli yetki matrisi (Security\user-resources — Menu / Sub Menu /
   Tab Menu / Function, her düğümde Görüntüleme-Yeni-Güncelleme-Silme).
   ========================================================================== */

.ok-tree {
  font-size: var(--ok-fs-sm);
}

  .ok-tree ul {
    padding-inline-start: 0;
  }

.ok-tree__node {
  position: relative;
}
/* Bağlantı çizgileri */
.ok-tree__children {
  margin-inline-start: var(--ok-sp-5);
  padding-inline-start: var(--ok-sp-3);
  border-inline-start: 1px solid var(--ok-border);
}

  .ok-tree__children[hidden] {
    display: none;
  }

.ok-tree__row {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  padding: 5px var(--ok-sp-2);
  border-radius: var(--ok-r-sm);
  min-width: 0;
  cursor: pointer;
}

  .ok-tree__row:hover {
    background: var(--ok-surface-sunk);
  }

  .ok-tree__row.is-selected {
    background: var(--ok-brand-50);
    color: var(--ok-brand-800);
  }

  .ok-tree__row.is-match {
    box-shadow: inset 0 0 0 1px var(--ok-brand-300);
  }

.ok-tree__twist {
  display: grid;
  place-items: center;
  width: 20px;
  height: 20px;
  border-radius: var(--ok-r-sm);
  color: var(--ok-text-3);
  flex: 0 0 auto;
  transition: transform var(--ok-dur-fast) var(--ok-ease);
}

  .ok-tree__twist:hover {
    background: var(--ok-border);
    color: var(--ok-text);
  }

.ok-tree__node.is-collapsed > .ok-tree__row > .ok-tree__twist {
  transform: rotate(-90deg);
}

[dir="rtl"] .ok-tree__node.is-collapsed > .ok-tree__row > .ok-tree__twist {
  transform: rotate(90deg);
}

.ok-tree__twist--leaf {
  visibility: hidden;
}

.ok-tree__icon {
  flex: 0 0 auto;
  color: var(--ok-text-3);
}

.ok-tree__row.is-selected .ok-tree__icon {
  color: var(--ok-brand-600);
}

.ok-tree__label {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ok-tree__meta {
  flex: 0 0 auto;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  font-variant-numeric: tabular-nums;
}

.ok-tree mark {
  background: #FFF1A8;
  color: inherit;
  border-radius: 2px;
  padding: 0;
}

/* Seviye renklendirmesi — legacy yetki ekranındaki #116E9D / #239FD5
   girinti renklerinin karşılığı, ama zeminle değil metinle veriliyor */
.ok-tree__level {
  flex: 0 0 auto;
  font-size: 10px;
  font-weight: var(--ok-fw-bold);
  padding: 1px 5px;
  border-radius: var(--ok-r-sm);
  text-transform: uppercase;
  letter-spacing: .04em;
}

.ok-tree__level--menu {
  background: var(--ok-brand-100);
  color: var(--ok-brand-800);
}

.ok-tree__level--sub {
  background: var(--ok-brand-50);
  color: var(--ok-brand-700);
}

.ok-tree__level--tab {
  background: var(--ok-neutral-bg);
  color: var(--ok-text-2);
}

.ok-tree__level--fn {
  background: var(--ok-success-bg);
  color: var(--ok-success);
}

  .ok-permtree .ok-tree__row > .ok-tree__name {
    display: flex;
    align-items: center;
    gap: var(--ok-sp-2);
    min-width: 0;
  }

.ok-permtree__cell {
  display: grid;
  place-items: center;
}

.ok-permtree__cell--na {
  color: var(--ok-border-hard);
}

@media (max-width: 860px) {

  .ok-tree__children {
    margin-inline-start: var(--ok-sp-3);
    padding-inline-start: var(--ok-sp-2);
  }
}

/* ==== components/calendar.css ============================================ */
/* ==========================================================================
   Takvim görünümleri
   1) Ay görünümü — izin takvimi, eğitim takvimi, çalışma takvimi
   2) Kaynak (kişi satırlı) görünümü — organizasyonun izin takvimi, vardiya
   ========================================================================== */

.ok-cal {
  display: flex;
  flex-direction: column;
  min-width: 0;
}

/* ---------- Üst çubuk --------------------------------------------------- */
.ok-cal__bar {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border-bottom: 1px solid var(--ok-border);
  flex-wrap: wrap;
}

.ok-cal__title {
  font-size: var(--ok-fs-md);
  font-weight: var(--ok-fw-semibold);
  min-width: 160px;
}

.ok-cal__bar-end {
  margin-inline-start: auto;
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

/* ---------- Ay görünümü ------------------------------------------------- */
.ok-cal__month {
  display: grid;
  grid-template-columns: repeat(7, minmax(0, 1fr));
  border-inline-start: 1px solid var(--ok-border);
  border-block-start: 1px solid var(--ok-border);
}

.ok-cal__dow {
  padding: 6px var(--ok-sp-2);
  border-inline-end: 1px solid var(--ok-border);
  border-block-end: 1px solid var(--ok-border-strong);
  background: var(--ok-surface-alt);
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text-2);
  text-transform: uppercase;
  letter-spacing: .03em;
  text-align: center;
}

.ok-cal__dow--we {
  color: var(--ok-danger);
}

.ok-cal__cell {
  position: relative;
  min-height: 104px;
  padding: var(--ok-sp-1);
  border-inline-end: 1px solid var(--ok-border);
  border-block-end: 1px solid var(--ok-border);
  background: var(--ok-surface);
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

  .ok-cal__cell.is-outside {
    background: var(--ok-surface-alt);
  }

  .ok-cal__cell.is-weekend {
    background: var(--ok-surface-sunk);
  }

  .ok-cal__cell.is-holiday {
    background: #FDF1F0;
  }

  .ok-cal__cell.is-today {
    box-shadow: inset 0 0 0 2px var(--ok-brand-500);
  }

.ok-cal__daynum {
  align-self: flex-end;
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-semibold);
  color: var(--ok-text-2);
  font-variant-numeric: tabular-nums;
  padding: 1px 4px;
  border-radius: var(--ok-r-sm);
}

.ok-cal__cell.is-today .ok-cal__daynum {
  background: var(--ok-brand-600);
  color: #fff;
}

.ok-cal__cell.is-outside .ok-cal__daynum {
  color: var(--ok-text-3);
}

.ok-cal__holiday-name {
  font-size: 10px;
  color: var(--ok-danger);
  font-weight: var(--ok-fw-medium);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ---------- Olay etiketi ------------------------------------------------ */
.ok-cal__event {
  display: flex;
  align-items: center;
  gap: 4px;
  padding: 2px 5px;
  border-radius: var(--ok-r-sm);
  border-inline-start: 3px solid var(--ok-brand-600);
  background: var(--ok-brand-50);
  color: var(--ok-brand-800);
  font-size: 11px;
  line-height: 1.35;
  min-width: 0;
  cursor: pointer;
  text-align: start;
}

  .ok-cal__event:hover {
    filter: brightness(.97);
  }

.ok-cal__event-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ok-cal__more {
  font-size: 10px;
  color: var(--ok-text-2);
  font-weight: var(--ok-fw-medium);
  text-align: start;
  padding-inline-start: 5px;
}

  .ok-cal__more:hover {
    text-decoration: underline;
  }

/* İzin türü renk kodları — TH_FFN grup 93 (İZİN TÜRLERİ) */
.ok-cal__event--annual {
  border-color: var(--ok-brand-600);
  background: var(--ok-brand-50);
  color: var(--ok-brand-800);
}

.ok-cal__event--unpaid {
  border-color: var(--ok-state-draft);
  background: var(--ok-neutral-bg);
  color: var(--ok-text-2);
}

.ok-cal__event--report {
  border-color: var(--ok-danger);
  background: var(--ok-danger-bg);
  color: #7E1E18;
}

.ok-cal__event--excuse {
  border-color: var(--ok-warning);
  background: var(--ok-warning-bg);
  color: #7A4C00;
}

.ok-cal__event--training {
  border-color: var(--ok-success);
  background: var(--ok-success-bg);
  color: #0E5A3A;
}

.ok-cal__event--pending {
  border-style: dashed;
}

/* ---------- Kaynak (kişi satırlı) görünümü ----------------------------- */
.ok-cal-res {
  overflow: auto;
}

.ok-cal-res__table {
  border-collapse: separate;
  border-spacing: 0;
  font-size: var(--ok-fs-xs);
}

  .ok-cal-res__table th {
    position: sticky;
    top: 0;
    z-index: var(--ok-z-sticky);
    background: var(--ok-surface-alt);
    border-bottom: 1px solid var(--ok-border-strong);
    padding: 4px 2px;
    min-width: 26px;
    text-align: center;
    font-weight: var(--ok-fw-semibold);
    color: var(--ok-text-2);
    font-variant-numeric: tabular-nums;
  }

    .ok-cal-res__table th.is-weekend,
    .ok-cal-res__table th.is-holiday {
      color: var(--ok-danger);
      background: var(--ok-surface-sunk);
    }

.ok-cal-res__name {
  position: sticky;
  inset-inline-start: 0;
  z-index: calc(var(--ok-z-sticky) + 1);
  background: var(--ok-surface);
  border-inline-end: 1px solid var(--ok-border-strong);
  padding: 3px var(--ok-sp-2);
  min-width: 190px;
  max-width: 190px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  font-size: var(--ok-fs-sm);
}

.ok-cal-res__table thead .ok-cal-res__name {
  z-index: calc(var(--ok-z-sticky) + 2);
  background: var(--ok-surface-alt);
}

.ok-cal-res__day {
  border-inline-end: 1px solid var(--ok-border);
  border-bottom: 1px solid var(--ok-border);
  height: 26px;
  padding: 0;
  text-align: center;
}

  .ok-cal-res__day.is-weekend {
    background: var(--ok-surface-sunk);
  }

  .ok-cal-res__day.is-holiday {
    background: #FDF1F0;
  }

.ok-cal-res__mark {
  display: block;
  width: 100%;
  height: 100%;
  background: var(--ok-brand-500);
  opacity: .85;
}

.ok-cal-res__mark--report {
  background: var(--ok-danger);
}

.ok-cal-res__mark--unpaid {
  background: var(--ok-state-draft);
}

.ok-cal-res__mark--excuse {
  background: var(--ok-warning);
}

.ok-cal-res__mark--training {
  background: var(--ok-success);
}

.ok-cal-res__mark--pending {
  background: repeating-linear-gradient(45deg, var(--ok-brand-300) 0 4px, transparent 4px 8px);
}

/* ---------- Renk açıklaması -------------------------------------------- */
.ok-cal__legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ok-sp-2) var(--ok-sp-4);
  padding: var(--ok-sp-3);
  border-top: 1px solid var(--ok-border);
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-2);
}

.ok-cal__legend-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.ok-cal__swatch {
  width: 12px;
  height: 12px;
  border-radius: 3px;
  flex: 0 0 auto;
  background: var(--ok-brand-500);
}

@media (max-width: 860px) {
  .ok-cal__cell {
    min-height: 72px;
  }

  .ok-cal__event-text {
    display: none;
  }

  .ok-cal__event {
    justify-content: center;
    padding: 3px;
  }

  .ok-cal__holiday-name {
    display: none;
  }
}

/* ==== components/upload.css ============================================== */
/* ==========================================================================
   Dosya yükleme ve doküman listesi
   Legacy karşılıkları: CustomFileUpload.ascx (ikon şeridi), FileManager.ascx,
   asp:FileUpload (29 kullanım), zorunlu evrak takibi (TH_EMP_RDOCUMENT).
   ========================================================================== */

/* ---------- Sürükle-bırak alanı ---------------------------------------- */
.ok-drop {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--ok-sp-2);
  padding: var(--ok-sp-6) var(--ok-sp-4);
  border: 1.5px dashed var(--ok-border-strong);
  border-radius: var(--ok-r-lg);
  background: var(--ok-surface-alt);
  text-align: center;
  cursor: pointer;
  transition: border-color var(--ok-dur-fast) var(--ok-ease), background var(--ok-dur-fast) var(--ok-ease);
}

  .ok-drop:hover {
    border-color: var(--ok-brand-500);
    background: var(--ok-brand-50);
  }

  .ok-drop.is-dragover {
    border-color: var(--ok-brand-600);
    background: var(--ok-brand-50);
    box-shadow: var(--ok-focus-ring);
  }

.ok-drop__icon {
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  border-radius: 50%;
  background: var(--ok-brand-50);
  color: var(--ok-brand-600);
}

.ok-drop__title {
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-semibold);
}

.ok-drop__hint {
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
}

.ok-drop input[type="file"] {
  display: none;
}

.ok-drop--sm {
  padding: var(--ok-sp-4) var(--ok-sp-3);
}

  .ok-drop--sm .ok-drop__icon {
    width: 34px;
    height: 34px;
  }

/* ---------- Dosya listesi ---------------------------------------------- */
.ok-files {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-2);
}

.ok-file {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
  background: var(--ok-surface);
  min-width: 0;
}

.ok-file__icon {
  display: grid;
  place-items: center;
  width: 32px;
  height: 32px;
  border-radius: var(--ok-r-sm);
  background: var(--ok-surface-sunk);
  color: var(--ok-text-2);
  flex: 0 0 auto;
}

.ok-file__icon--pdf {
  background: var(--ok-danger-bg);
  color: var(--ok-danger);
}

.ok-file__icon--excel {
  background: var(--ok-success-bg);
  color: var(--ok-success);
}

.ok-file__icon--image {
  background: var(--ok-brand-50);
  color: var(--ok-brand-600);
}

.ok-file__text {
  flex: 1 1 auto;
  min-width: 0;
}

.ok-file__name {
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.ok-file__meta {
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  display: flex;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

.ok-file__acts {
  flex: 0 0 auto;
  display: flex;
  gap: 2px;
}

.ok-file.is-error {
  border-color: var(--ok-danger-br);
  background: var(--ok-danger-bg);
}

  .ok-file.is-error .ok-file__meta {
    color: var(--ok-danger);
  }

.ok-file.is-done .ok-file__icon {
  background: var(--ok-success-bg);
  color: var(--ok-success);
}

/* ---------- Fotoğraf alanı (personel resmi) ---------------------------- */
.ok-photo {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--ok-sp-2);
}

.ok-photo__frame {
  width: 116px;
  height: 140px;
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  background: var(--ok-surface-sunk);
  overflow: hidden;
  display: grid;
  place-items: center;
  color: var(--ok-text-3);
}

  .ok-photo__frame img {
    width: 100%;
    height: 100%;
    object-fit: cover;
  }

.ok-photo__acts {
  display: flex;
  gap: var(--ok-sp-1);
}

/* ==== components/timeline.css ============================================ */
/* ==========================================================================
   Zaman çizelgesi
   1) İş akışı onay adımları (TH_WF_STEPS) — sıralı, durumlu
   2) İşlem geçmişi / değişiklik günlüğü (TA_LOGS, msgChangeLog)
   ========================================================================== */

/* ---------- Onay adımları (dikey) --------------------------------------- */
.ok-steps {
  display: flex;
  flex-direction: column;
}

.ok-step {
  display: grid;
  grid-template-columns: 28px 1fr;
  gap: var(--ok-sp-3);
  position: relative;
  padding-bottom: var(--ok-sp-4);
}

  .ok-step:last-child {
    padding-bottom: 0;
  }
  /* Adımları birleştiren dikey çizgi */
  .ok-step:not(:last-child)::before {
    content: "";
    position: absolute;
    inset-inline-start: 13px;
    top: 28px;
    bottom: 0;
    width: 2px;
    background: var(--ok-border);
  }

  .ok-step.is-done:not(:last-child)::before {
    background: var(--ok-success-br);
  }

.ok-step__marker {
  width: 28px;
  height: 28px;
  border-radius: 50%;
  display: grid;
  place-items: center;
  background: var(--ok-surface);
  border: 2px solid var(--ok-border-strong);
  color: var(--ok-text-3);
  font-size: var(--ok-fs-xs);
  font-weight: var(--ok-fw-bold);
  flex: 0 0 auto;
  z-index: 1;
}

.ok-step.is-done .ok-step__marker {
  background: var(--ok-success);
  border-color: var(--ok-success);
  color: #fff;
}

.ok-step.is-current .ok-step__marker {
  background: var(--ok-brand-600);
  border-color: var(--ok-brand-600);
  color: #fff;
  box-shadow: 0 0 0 4px var(--ok-brand-100);
}

.ok-step.is-rejected .ok-step__marker {
  background: var(--ok-danger);
  border-color: var(--ok-danger);
  color: #fff;
}

.ok-step.is-skipped .ok-step__marker {
  border-style: dashed;
}

.ok-step__body {
  min-width: 0;
  padding-top: 2px;
}

.ok-step__head {
  display: flex;
  align-items: baseline;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

.ok-step__title {
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-semibold);
}

.ok-step__who {
  font-size: var(--ok-fs-sm);
  color: var(--ok-text-2);
}

.ok-step__when {
  margin-inline-start: auto;
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.ok-step__note {
  margin-top: var(--ok-sp-2);
  padding: var(--ok-sp-2) var(--ok-sp-3);
  border-inline-start: 2px solid var(--ok-border);
  background: var(--ok-surface-alt);
  border-radius: 0 var(--ok-r-sm) var(--ok-r-sm) 0;
  font-size: var(--ok-fs-sm);
  color: var(--ok-text-2);
}

.ok-step__actions {
  margin-top: var(--ok-sp-3);
  display: flex;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
}

/* ==== components/auth.css ================================================ */
/* ==========================================================================
   Kimlik ekranları: giriş · şirket seçimi · SMS doğrulama · şifre belirleme ·
   yetkisiz / hata / oturum sonlandı
   Legacy karşılıkları: Login.aspx, pass-initial.aspx, sms-code-control.aspx,
   password-settings.aspx, No-Aut.aspx, page-error-occurred.aspx
   ========================================================================== */

.ok-auth {
  min-height: 100vh;
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(420px, 44%);
  background: var(--ok-bg);
}

/* ---------- Sol taraf: marka paneli ------------------------------------- */
.ok-auth__brand {
  position: relative;
  overflow: hidden;
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: var(--ok-sp-10) var(--ok-sp-12);
  background: radial-gradient(1100px 620px at 12% 8%, #2A7EE0 0%, transparent 58%), radial-gradient(900px 700px at 88% 92%, #0C3F76 0%, transparent 60%), linear-gradient(148deg, var(--ok-brand-800) 0%, var(--ok-brand-900) 100%);
  color: #fff;
}
  /* İnce ızgara dokusu — dış görsel yüklemeden derinlik */
  .ok-auth__brand::before {
    content: "";
    position: absolute;
    inset: 0;
    background-image: linear-gradient(rgba(255, 255, 255, .05) 1px, transparent 1px), linear-gradient(90deg, rgba(255, 255, 255, .05) 1px, transparent 1px);
    background-size: 44px 44px;
    mask-image: radial-gradient(900px 600px at 30% 20%, #000 0%, transparent 75%);
  }

  .ok-auth__brand > * {
    position: relative;
  }

.ok-auth__logo {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-3);
  font-size: var(--ok-fs-lg);
  font-weight: var(--ok-fw-bold);
  letter-spacing: -.01em;
}

.ok-auth__sub {
  margin-top: var(--ok-sp-4);
  font-size: var(--ok-fs-md);
  color: rgba(255, 255, 255, .78);
  max-width: 46ch;
  line-height: var(--ok-lh-loose);
}

.ok-auth__legal {
  font-size: var(--ok-fs-xs);
  color: rgba(255, 255, 255, .55);
}

/* ---------- Sağ taraf: form ------------------------------------------- */
.ok-auth__panel {
  display: flex;
  flex-direction: column;
  justify-content: center;
  padding: var(--ok-sp-8) clamp(var(--ok-sp-5), 5vw, var(--ok-sp-12));
  background: var(--ok-surface);
  border-inline-start: 1px solid var(--ok-border);
}

.ok-auth__box {
  width: 100%;
  max-width: 380px;
  margin-inline: auto;
}

.ok-auth__title {
  font-size: var(--ok-fs-xl);
  font-weight: var(--ok-fw-semibold);
  letter-spacing: -.01em;
}

.ok-auth__desc {
  margin-top: var(--ok-sp-2);
  margin-bottom: var(--ok-sp-6);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-base);
}

.ok-auth__form {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-4);
}

.ok-auth__row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--ok-sp-3);
  flex-wrap: wrap;
}

.ok-auth__link {
  font-size: var(--ok-fs-sm);
  font-weight: var(--ok-fw-medium);
}

/* Giriş formunda alanlar daha büyük — günde bir kez kullanılıyor, yoğunluk gereksiz */
.ok-auth__form .ok-input,
.ok-auth__form .ok-select__control,
.ok-auth__form .ok-native-select {
  height: 42px;
  font-size: var(--ok-fs-base);
}

.ok-auth__form .ok-input-icon > .ok-input {
  padding-inline-start: 38px;
}
/* [K-56, 2026-08-19] Giriş formu yatay düzenin DIŞINDA bırakıldı.
   Kullanıcı kararı 'etiket denetimin yanında' veri giriş ekranları içindi;
   burada kart 380px (.ok-auth__box:97) ve 150px'lik etiket sütunu düşünce
   denetime 218px kalıyor — şirket kodu/kullanıcı kodu alanları okunmaz hâle
   geliyor. Ayrıca giriş ekranında etiket-üstte yerleşim beklenen kalıptır. */
.ok-auth__form .ok-field {
  display: flex;
  flex-direction: column;
  gap: 5px;
}

.ok-auth__form .ok-field__label {
  justify-content: flex-start;
  text-align: start;
  padding-top: 0;
}

.ok-auth__form .ok-input-icon > .ok-icon {
  inset-inline-start: 12px;
  width: 17px;
  height: 17px;
}

.ok-auth__form .ok-btn {
  height: 44px;
  font-size: var(--ok-fs-base);
}

/* Captcha satırı (şifremi unuttum) */
.ok-captcha {
  display: flex;
  align-items: stretch;
  gap: var(--ok-sp-2);
}

.ok-captcha__img {
  flex: 0 0 auto;
  width: 150px;
  height: 38px;
  border: 1px solid var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  background: var(--ok-surface-sunk);
  object-fit: contain;
  user-select: none;
  -webkit-user-drag: none;
}

/* ==========================================================================
   Durum sayfaları (yetkisiz / hata / oturum sonlandı)
   Legacy'de bu sayfaların CSS'i hiç yoktu — en görünür iyileştirme.
   ========================================================================== */
.ok-state-page {
  min-height: 100vh;
  display: grid;
  place-items: center;
  padding: var(--ok-sp-6);
  background: var(--ok-bg);
}

.ok-state {
  width: 100%;
  max-width: 520px;
  padding: var(--ok-sp-8);
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-xl);
  text-align: center;
}

.ok-state__icon {
  display: grid;
  place-items: center;
  width: 64px;
  height: 64px;
  margin-inline: auto;
  margin-bottom: var(--ok-sp-4);
  border-radius: 50%;
  background: var(--ok-warning-bg);
  color: var(--ok-warning);
}

.ok-state__icon--danger {
  background: var(--ok-danger-bg);
  color: var(--ok-danger);
}

.ok-state__icon > .ok-icon {
  width: 30px;
  height: 30px;
}

.ok-state__title {
  font-size: var(--ok-fs-lg);
  font-weight: var(--ok-fw-semibold);
}

.ok-state__desc {
  margin-top: var(--ok-sp-2);
  color: var(--ok-text-2);
  font-size: var(--ok-fs-sm);
  line-height: var(--ok-lh-loose);
}

.ok-state__actions {
  margin-top: var(--ok-sp-6);
  display: flex;
  gap: var(--ok-sp-2);
  justify-content: center;
  flex-wrap: wrap;
}
/* --------------------------------------------------------------------------
   [2026-08-18] Kullanıcı kararı: yetkisiz erişim ekranının "eski orijinal hâli
   daha güzeldi". Legacy `src\OrtakIK\Security\No-Aut.aspx` bir kart değildi:
   ortalanmış bir görsel ve altında kırmızı `<h2>`. Kart çerçevesini (zemin,
   kenarlık, gölge, 520 px sınırı) kaldıran çıplak varyant. `.ok-state-page`
   ortalamayı yapmaya devam eder.
   -------------------------------------------------------------------------- */
.ok-state--bare {
  max-width: 720px; /* görsel 400 px civarı; sınır yalnız çok geniş ekran içindir */
  padding: 0;
  background: none;
  border: 0;
}
/* Legacy `No_Authority.png`. Yükseklik verilmez — görselin kendi oranı korunur;
   dar ekranda `max-width` ile küçülür. */
.ok-state__image {
  display: block;
  max-width: 100%;
  height: auto;
  margin-inline: auto;
}
/* Legacy `<h2 style="color:red">` karşılığı. Ham kırmızı yerine tasarım
   sisteminin tehlike token'ı kullanılır (#C62F26 — beyaz zeminde AA). */
.ok-state__alert {
  margin-top: var(--ok-sp-5);
  color: var(--ok-danger);
  font-size: var(--ok-fs-xl);
  font-weight: var(--ok-fw-semibold);
  line-height: var(--ok-lh-tight);
}

  .ok-state__alert + .ok-state__alert {
    margin-top: var(--ok-sp-2);
  }

/* Hata kodu kutusu — kullanıcı bunu İK yöneticisine iletiyor, kopyalanabilir olmalı */
.ok-errcode {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  justify-content: center;
  margin-top: var(--ok-sp-5);
  padding: var(--ok-sp-3);
  border: 1px dashed var(--ok-border-strong);
  border-radius: var(--ok-r-md);
  background: var(--ok-surface-sunk);
}

.ok-errcode__label {
  font-size: var(--ok-fs-xs);
  color: var(--ok-text-3);
  text-transform: uppercase;
  letter-spacing: .05em;
}

.ok-errcode__value {
  font-family: var(--ok-font-mono);
  font-size: var(--ok-fs-sm);
  color: var(--ok-text);
  user-select: all;
  word-break: break-all;
}

@media (max-width: 1024px) {
  .ok-auth {
    grid-template-columns: 1fr;
  }

  .ok-auth__brand {
    padding: var(--ok-sp-6);
    min-height: 0;
  }

  .ok-auth__sub {
    display: none;
  }

  .ok-auth__panel {
    border-inline-start: 0;
  }
}

@media (max-width: 480px) {
  .ok-auth__panel {
    padding-inline: var(--ok-sp-4);
  }

  .ok-state {
    padding: var(--ok-sp-5);
  }
}

/* ==== utilities.css ====================================================== */
/* ==========================================================================
   Yardımcı sınıflar
   Bootstrap'ın utility yığını değil — yalnızca şablonda fiilen tekrar eden
   ihtiyaçlar. Yeni bir yardımcı eklemeden önce bileşene ait olup olmadığını sor.
   ========================================================================== */

/* ---------- Yerleşim --------------------------------------------------- */
.ok-row {
  display: flex;
  align-items: center;
  gap: var(--ok-sp-2);
  flex-wrap: wrap;
  min-width: 0;
}

.ok-row--tight {
  gap: var(--ok-sp-1);
}

.ok-row--gap4 {
  gap: var(--ok-sp-4);
}

.ok-row--top {
  align-items: flex-start;
}

.ok-row--nowrap {
  flex-wrap: nowrap;
}

.ok-col {
  display: flex;
  flex-direction: column;
  gap: var(--ok-sp-2);
  min-width: 0;
}

.ok-col--gap1 {
  gap: var(--ok-sp-1);
}

.ok-col--gap3 {
  gap: var(--ok-sp-3);
}

.ok-col--gap4 {
  gap: var(--ok-sp-4);
}

.ok-fill {
  flex: 1 1 auto;
  min-width: 0;
}

/* ---------- Görünürlük ------------------------------------------------- */
.ok-hidden {
  display: none !important;
}

@media (max-width: 860px) {
  .ok-hide-md {
    display: none !important;
  }
}

@media (max-width: 640px) {
  .ok-hide-sm {
    display: none !important;
  }
}

@media (min-width: 861px) {
  .ok-only-md {
    display: none !important;
  }
}

/* ---------- Boşluk ---------------------------------------------------- */
.ok-mt-1 {
  margin-top: var(--ok-sp-1);
}

.ok-mt-2 {
  margin-top: var(--ok-sp-2);
}

.ok-mt-3 {
  margin-top: var(--ok-sp-3);
}

.ok-mt-4 {
  margin-top: var(--ok-sp-4);
}

.ok-mt-5 {
  margin-top: var(--ok-sp-5);
}

.ok-mb-2 {
  margin-bottom: var(--ok-sp-1);
}

.ok-mb-3 {
  margin-bottom: var(--ok-sp-2);
}

.ok-mb-4 {
  margin-bottom: var(--ok-sp-2);
}
/* [2026-08-18] Bu sınıf `TitleDetail.cshtml`'de (yapışkan aksiyon çubuğundaki
   "Kaydedilmemiş değişiklik" göstergesi) KULLANILIYORDU ama hiçbir yerde
   TANIMLI DEĞİLDİ — gösterge sola yaslanmıyor, düğmelere yapışıyordu. Aynı
   kalıp TaxDetail'de de kullanılınca eksiklik görüldü ve tanım eklendi.
   Mantıksal yön (`inline-start`) kullanılır: RTL'de kendiliğinden ters döner. */
.ok-me-auto {
  margin-inline-start: auto;
}

.ok-p-3 {
  padding: var(--ok-sp-2);
}

/* ---------- Metin ----------------------------------------------------- */
.ok-t-xs {
  font-size: var(--ok-fs-xs);
}

.ok-t-sm {
  font-size: var(--ok-fs-sm);
}

.ok-t-start {
  text-align: start;
}

.ok-t-center {
  text-align: center;
}

.ok-t-end {
  text-align: end;
}

.ok-w-medium {
  font-weight: var(--ok-fw-medium);
}

.ok-w-semibold {
  font-weight: var(--ok-fw-semibold);
}

.ok-mono {
  font-family: var(--ok-font-mono);
}

.ok-c-brand {
  color: var(--ok-brand-700);
}

.ok-c-success {
  color: var(--ok-success);
}

.ok-c-warning {
  color: var(--ok-warning);
}

.ok-c-danger {
  color: var(--ok-danger);
}

/* ---------- Yüzey ----------------------------------------------------- */
.ok-panel {
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
}

.ok-panel--sunk {
  background: var(--ok-surface-sunk);
  border-color: var(--ok-border);
}

.ok-panel--tint {
  background: var(--ok-brand-50);
  border-color: var(--ok-brand-100);
}

.ok-relative {
  position: relative;
}

/* ==== print.css ========================================================== */
/* ==========================================================================
   Yazdırma
   Legacy'de window.print hiç kullanılmıyordu (çıktı yalnız Excel/PDF idi).
   Şablon bordro zarfı ve raporlar için A4 yazdırma desteği veriyor.
   ========================================================================== */

@media print {
  @page {
    size: A4;
    margin: 14mm 12mm;
  }

  @page :first {
    margin-top: 10mm;
  }

  html, body {
    background: #fff !important;
    color: #000;
    font-size: 10.5pt;
    line-height: 1.35;
  }

  /* Kabuk ve etkileşimli her şey gider */
  .ok-topbar,
  .ok-sidebar,
  .ok-backdrop,
  .ok-toasts,
  .ok-page-head__actions,
  .ok-card__actions,
  .ok-grid-bar,
  .ok-grid-foot,
  .ok-filter,
  .ok-form-actions,
  .ok-tabs__bar,
  .ok-crumbs,
  .ok-skip-link,
  .ok-modal-backdrop,
  .ok-drawer,
  .ok-drawer-backdrop,
  .ok-grid__cell-act,
  .ok-grid__cell-check,
  .ok-grid__filters,
  .ok-recnav,
  .ok-totop,
  [data-ok-no-print] {
    display: none !important;
  }

  .ok-shell {
    display: block;
  }

  .ok-main {
    margin-top: 0;
  }

  .ok-content {
    max-width: none;
    padding: 0;
  }

  /* Sekmeli formda yazdırırken tüm paneller açılır */
  .ok-tab-panel[hidden] {
    display: block !important;
  }

  .ok-tab-panel {
    break-before: page;
    padding-top: 0;
  }

    .ok-tab-panel:first-of-type {
      break-before: auto;
    }

  /* Kartlar sayfa içinde bölünmesin */
  .ok-card {
    border: 1px solid #999;
    border-radius: 0;
    break-inside: avoid;
    margin-bottom: 6mm;
  }

  .ok-card__head {
    border-bottom: 1px solid #999;
    padding: 2mm 3mm;
    min-height: 0;
  }

  .ok-card__body {
    padding: 3mm;
  }

  /* Tablolar: kenarlıklı, başlık her sayfada tekrar eder */
  .ok-grid-wrap {
    border: 0;
    border-radius: 0;
    overflow: visible;
  }

  .ok-grid-scroll {
    overflow: visible;
    max-height: none;
  }

  .ok-grid {
    font-size: 9pt;
  }

    .ok-grid thead {
      display: table-header-group;
    }

    .ok-grid tfoot {
      display: table-footer-group;
    }

    .ok-grid thead th {
      position: static;
      background: #EEE !important;
      border: .4pt solid #666;
      color: #000;
      text-transform: none;
      padding: 1.4mm 1.8mm;
    }

    .ok-grid tbody td {
      border: .4pt solid #999;
      background: #fff !important;
      height: auto;
      padding: 1.2mm 1.8mm;
      color: #000;
    }

    .ok-grid tbody tr {
      break-inside: avoid;
    }

    .ok-grid tfoot td {
      position: static;
      background: #E8E8E8 !important;
      border: .4pt solid #666;
      color: #000;
    }

  .ok-grid--pin-first td:first-child,
  .ok-grid--pin-first th:first-child {
    position: static;
    box-shadow: none;
  }

  /* Formlar salt-okunur görünür */
  .ok-input, .ok-textarea, .ok-native-select, .ok-select__control {
    border: 0 !important;
    border-bottom: .4pt solid #999 !important;
    background: transparent !important;
    box-shadow: none !important;
    padding-inline: 0 !important;
    height: auto !important;
    color: #000;
  }

  .ok-field__label {
    color: #444;
  }

  /* Renkli göstergeler yazdırmada da ayırt edilebilir kalsın */
  .ok-badge, .ok-status, .ok-chip {
    border: .4pt solid #666 !important;
    background: #fff !important;
    color: #000 !important;
  }

    .ok-status::before {
      box-shadow: none;
    }

  /* Bağlantılar sade metin */
  a {
    color: #000;
    text-decoration: none;
  }
}

/* Disabled select'lerde ok-sr-only'yi geçersiz kıl */
select.ok-sr-only:disabled,
select.ok-sr-only[disabled] {
  position: static !important;
  width: 100% !important;
  height: auto !important;
  padding: var(--ok-ctrl-px) !important;
  margin: 0 !important;
  overflow: visible !important;
  clip: auto !important;
  clip-path: none !important;
  white-space: normal !important;
  border: 1px solid var(--ok-border-strong) !important;
  background: var(--ok-surface-sunk) !important;
  color: var(--ok-text-2) !important;
  opacity: 1 !important;
}

/* ==========================================================================
   Ekrandan terfi eden bileşenler (2026-09-16)
   Aşağıdaki kuralların tamamı birden fazla ekranın kendi <style> bloğunda
   BİREBİR tekrar ediyordu; tek kaynağa indirildi. Değerler olduğu gibi
   taşındı — hiçbir ekranın görünümü değişmez.
   Ekranlar arasında FARKLILAŞAN kurallar bilerek burada DEĞİL, ilgili
   ekranın kendi <style> bloğunda bırakıldı.
   ========================================================================== */

/* ---------- Vardiya ----------------------------------------------------
   Ekranlar: Admin\Others\EmpShift · Portal\Others\EmpShift · Portal\Others\MyShift
   Renkler legacy'den geldiği gibi bırakıldı (tasarım jetonu değil): parite. */
.DisabledShift {
  opacity: .4;
}

.ShiftWeekend {
  background-color: greenyellow;
}

.ShiftGeneral {
  background-color: yellowgreen;
}

.ShiftHalfDay {
  background-color: burlywood;
}

.ShiftLeaveDay {
  background-color: aqua;
}

.ShiftLeaveHour {
  background-color: peru;
}

.ShiftTrainingDay {
  background-color: coral;
}

.ShiftHangDay {
  background-color: cornflowerblue;
}

.ok-grid.ok-shift-table tbody td.ShiftWeekend {
  background-color: greenyellow;
}

.ok-grid.ok-shift-table tbody td.ShiftGeneral {
  background-color: yellowgreen;
}

.ok-grid.ok-shift-table tbody td.ShiftHalfDay {
  background-color: burlywood;
}

.ok-grid.ok-shift-table tbody td.ShiftLeaveDay {
  background-color: aqua;
}

.ok-grid.ok-shift-table tbody td.ShiftLeaveHour {
  background-color: peru;
}

.ok-grid.ok-shift-table tbody td.ShiftTrainingDay {
  background-color: coral;
}

.ok-grid.ok-shift-table tbody td.ShiftHangDay {
  background-color: cornflowerblue;
}

/* `cursor: pointer` BİLEREK burada yok: MyShift'te yoktu, eklemek o ekranın
   davranışını değiştirirdi. İki EmpShift ekranı kendi bloğunda ekliyor. */
.ShiftSelector {
  padding: 6px 14px;
  white-space: nowrap;
}

.ShiftPasif {
  padding: 6px 14px;
  white-space: nowrap;
  opacity: .45;
  cursor: default;
}

.ppvrContainer {
  cursor: pointer;
}

.ok-shift-table td.ShiftCell,
.ok-shift-table th.DayHeader {
  text-align: center;
  vertical-align: middle;
}

.ok-shift-table th.ok-shift-sign,
.ok-shift-table td.ok-shift-sign {
  width: 150px;
  text-align: center;
  vertical-align: middle;
}

.ok-shift-nav {
  display: flex;
  justify-content: center;
  gap: var(--ok-sp-2);
  margin: var(--ok-sp-3) 0;
}

.ok-shift-pop {
  position: fixed;
  z-index: 1200;
  background: var(--ok-surface);
  border: 1px solid var(--ok-border);
  border-radius: 6px;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .18);
  padding: 6px;
}

  .ok-shift-pop table {
    border-collapse: collapse;
  }

  .ok-shift-pop--kolonlu table {
    border-collapse: separate;
    border-spacing: 4px 0;
  }

  .ok-shift-pop--kolonlu td {
    text-align: center;
  }

.ok-shift-pop__x {
  display: block;
  text-align: right;
  cursor: pointer;
  padding: 0 2px 4px;
}

/* ---------- Eğitim takvimi (.tcal) -------------------------------------
   Ekranlar: Admin\Training\TrainingCalendar · Portal\Training\TrainingCalendar
   `.tcal__name` ve Admin'in `th` kenarlığı ekranlar arasında FARKLI — yerelde. */
.tcal {
  border-collapse: collapse;
}

  .tcal td {
    border: 1px solid gray;
    height: 30px;
  }

.tcal__month {
  width: 200px;
  background-color: #368DC6;
  color: #fff;
  font-weight: bold;
  text-align: left;
  padding: 3px;
  white-space: nowrap;
}

.tcal__day {
  width: 25px;
  background-color: #368DC6;
  color: #fff;
  font-weight: bold;
  text-align: center;
}

.tcal__empty {
  background-color: #fff;
}

.tcal__row {
  cursor: pointer;
}

/* ---------- İzin takvimi (.plcal) --------------------------------------
   Ekranlar: Portal\Leave\MyLeaveCalendar · Portal\Leave\MyOrganizationLeaveCalendar
   `.plcal__name` ikisinde farklı (birinde `nowrap`) — yerelde. */
.plcal {
  border-collapse: collapse;
  width: 100%;
}

  .plcal td {
    border: 1px solid gray;
    height: 30px;
  }

.plcal__month {
  width: 200px;
  background-color: #368DC6;
  color: #fff;
  font-weight: bold;
  text-align: left;
  padding: 3px;
  white-space: nowrap;
}

.plcal__day {
  width: 25px;
  background-color: #368DC6;
  color: #fff;
  font-weight: bold;
  text-align: center;
}

.plcal__empty {
  background-color: #fff;
}

.plcal__k,
.plcal__p,
.plcal__t {
  text-align: center;
}

.plcal__k {
  background-image: linear-gradient(to bottom, #E1F6E7, #94D9A2, #3FBB5D);
}

.plcal__p {
  background-image: linear-gradient(to bottom, #CEE9F4, #A5D5E9, #7EC4DD);
}

.plcal__t {
  background-image: linear-gradient(to bottom, #F0AA9E, #E8765C, #DF411C);
}

.plcal-legend {
  width: 100%;
  border-collapse: collapse;
}

  .plcal-legend td {
    border: 1px solid;
  }

.plcal-legend__box {
  width: 40px;
  height: 40px;
  text-align: center;
}

.plcal-legend__label {
  padding-left: 5px;
}

/* ---------- Yetki kaynak listesi kabı ----------------------------------
   Ekranlar: Admin\Security\CompanyResources · UserGroupResources · UserResources */
.ures-mainlist {
  display: flex;
  flex-wrap: wrap;
  gap: var(--ok-sp-3);
  padding: 10px;
  border: 1px solid var(--ok-border);
  border-radius: var(--ok-r-md);
}

/* ---------- Toplantı odası / araç havuzu yerleşimi ---------------------
   Ekranlar: Admin ve Portal'da MeetingRoomEmp(Detail) · VehiclePoolEmp(Detail)
   Oran ikisinde farklı, o yüzden iki ayrı kural. */
[data-mre-split] {
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
}

[data-vhc-split] {
  grid-template-columns: minmax(0, 7fr) minmax(0, 3fr);
}

[data-mre-cal] .ok-cal__bar-end,
[data-vhc-cal] .ok-cal__bar-end {
  display: none;
}

@media (max-width: 1024px) {
  [data-mre-split],
  [data-vhc-split] {
    grid-template-columns: 1fr;
  }
}

table.ok-grid,
table.ok-grid tbody,
table.ok-grid tbody tr,
table.ok-grid tbody td {
  -webkit-user-select: text !important;
  user-select: text !important;
  -webkit-touch-callout: default !important;
  pointer-events: auto !important;
}

.row[data-ok-field] .d-flex {
  align-items: center !important;
}

@media (min-width: 861px) {
  .ok-shell {
    grid-template-columns: minmax(var(--ok-sidebar-w), auto) 1fr;
    background-image: linear-gradient(to right,
                                      var(--ok-sidebar-bg) 0 var(--ok-sidebar-w),
                                      transparent var(--ok-sidebar-w));
    background-repeat: no-repeat;
  }

  [dir="rtl"] .ok-shell {
    background-image: linear-gradient(to left,
                                      var(--ok-sidebar-bg) 0 var(--ok-sidebar-w),
                                      transparent var(--ok-sidebar-w));
  }
}

.row[data-ok-field] .d-flex > .ok-native-select,
.row[data-ok-field] .d-flex > .ok-input,
.row[data-ok-field] .d-flex > select,
.row[data-ok-field] .d-flex > input {
  align-self: auto;
}

.ok-arama-bar {
  display: flex;
  flex-wrap: wrap;
  gap: 6px 12px;
  align-items: flex-end;
}

.ok-arama-bar__alan {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.ok-arama-bar__alan > label:first-child {
  font-size: 12px;
  font-weight: 600;
  color: var(--ok-text-2);
  margin: 0;
}

.ok-arama-bar__alan--genis {
  flex: 1 1 260px;
}

.ok-arama-bar__alan--kutu {
  flex: 0 0 auto;
}

.ok-arama-bar__alan--kutu .ok-check {
  height: var(--ok-ctrl-h);
  align-items: center;
  margin: 0;
}

.ok-arama-bar__dugmeler {
  display: flex;
  gap: 8px;
  margin-left: auto;
}

@media (max-width: 767.98px) {
  .ok-arama-bar__dugmeler {
    margin-left: 0;
  }
}

.ok-rapor-kart { background: #fff; border: 1px solid #d5dde6; border-radius: 4px; overflow: hidden; }

.ok-rapor-kart > .ok-rapor-kart__bas {
  background: linear-gradient(to right, #1b8fc9 0%, #0e6db2 55%, #0a4d8c 100%);
  border: 0;
  padding: 12px 16px;
}

.ok-rapor-kart > .ok-rapor-kart__bas .ok-card__title { color: #fff; font-size: 18px; font-weight: 400; margin: 0; }

.ok-rapor-kart > .card-body { background: #fff; color: #333; padding: 16px 12px; }

.ok-rapor-tarih { display: flex; justify-content: flex-end; margin: 26px 10% 22px 0; }
.ok-rapor-tarih table { width: auto; border-collapse: collapse; }
.ok-rapor-tarih table td { padding: 4px 0; font-size: 12px; color: #333; border: 0; white-space: nowrap; }
.ok-rapor-tarih table td:first-child { font-weight: bold; padding-right: 4px; }

.ok-rapor-tbl { width: 100%; border-collapse: collapse; border-spacing: 0; background: #fff; font-size: 12px; color: #333; }
.ok-rapor-tbl th,
.ok-rapor-tbl td { border: 1px solid #ddd; padding: 5px 6px; height: 28px; vertical-align: middle; color: #333; }
.ok-rapor-tbl th { font-weight: bold; text-align: left; vertical-align: top; border-bottom-width: 2px; background: #fff; }
.ok-rapor-tbl tr:nth-child(odd) > td { background: #f9f9f9; }
