/* =========================================================================
   Yeni Fiyatlandırma — tasarım sistemi
   2026-08-15: 134 maddelik tasarım denetimi sonrası yeniden kuruldu.
   Kurallar:
   - Renk, boşluk, punto ve kontrol yüksekliği token'dan gelir; kural
     gövdesinde çıplak hex/px ölçü bulunmaz.
   - Tek kontrol yüksekliği: input, select ve buton aynı hatta oturur.
   - Kurumsal kırmızı (--brand) YALNIZCA belge çıktılarında (.a4/.proforma).
     Yönetim panelinin vurgu rengi mavi (--pri), olumsuz durum --neg.
   ========================================================================= */

* { box-sizing: border-box; margin: 0; }
[hidden] { display: none !important; }

/* BELGE (tema dışı) */
/* Belge tokenları — TEMA DIŞI: A4 çıktıları temadan etkilenmez; marka rengi ve
   fiyat paneli laciverti burada kalır. Panel tokenlarının tamamı: tema.css */
:root {
  /* kurumsal renk — SADECE belge çıktısı */
  --brand: #e22726; --brand-soft: #fff0ef; --brand-line: #e6dcdc;
  /* belge fiyat panelinin laciverti — kırmızı fiyat yüzeyi kullanılmaz */
  --navy: #17364f; --navy-deep: #0b2237;
}
/* BELGE SONU */


/* Hareket azaltma tercihinde geçişler etkisizleşir */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    transition-duration: .01ms !important; animation-duration: .01ms !important;
    scroll-behavior: auto !important; }
}

body { min-height: 100vh; background: var(--bg); color: var(--ink);
  font: var(--fs-md)/1.45 var(--font);
  -webkit-font-smoothing: antialiased; }

/* Klavye odağı her yerde görünür (denetim: hiç odak stili yoktu) */
:is(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 3px solid var(--focus); outline-offset: 2px; border-radius: var(--radius-sm); }
:is(input, select, textarea):focus { border-color: var(--pri-mid);
  box-shadow: var(--focus-ring); }
:is(input, select, textarea):hover:not(:disabled) { border-color: var(--line-hover); }

/* =========================================================================
   KABUK — 204px lacivert menü + 44px beyaz üst çubuk (ortak estetik sözleşmesi)
   ========================================================================= */
.shell { display: flex; align-items: stretch; min-height: 100vh; }

/* ---- Sol menü ---- */
.sidebar { width: var(--nav-w); flex: none; background: var(--nav-bg); color: var(--nav-ink);
  display: flex; flex-direction: column; padding-bottom: var(--s3);
  position: sticky; top: 0; height: 100vh; overflow-y: auto;
  transition: margin-left .18s ease;
  /* Dokunmatikte menü YALNIZ dikey kaydırılır. Bunlar tanımsızken parmağı basılı
     tutup oynatmak metin seçimi ya da bağlantı sürükleme başlatıyordu ve menü
     "serbest oynuyor" gibi görünüyordu (kullanıcı bildirimi 2026-08-17).
     pan-y: yatay pan kapalı · overscroll: kaydırma sayfaya zincirlenmez ·
     user-select/touch-callout: uzun basışta seçim ve iOS bağlam menüsü çıkmaz. */
  touch-action: pan-y; overscroll-behavior: contain;
  -webkit-user-select: none; user-select: none; -webkit-touch-callout: none; }
.sidebar a, .sidebar img { -webkit-user-drag: none; }
/* Menünün kendi başlığı üst çubukla aynı hatta oturur */
.brand-row { display: flex; align-items: center; gap: var(--s3); min-height: var(--topbar-h);
  padding: var(--s2) var(--s3); border-bottom: 1px solid var(--nav-line); color: var(--nav-brand);
  font-weight: 700; font-size: var(--fs-md); flex: none; }
.brand-row .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidebar nav { flex: 1; padding: var(--s2) 0; }
.nav-group { margin-top: var(--s1); }
.nav-head { display: flex; align-items: center; justify-content: space-between; gap: var(--s2);
  width: 100%; padding: var(--s2) var(--s4); background: none; border: none; cursor: pointer;
  color: var(--nav-mut); font: inherit; font-size: var(--fs-3xs); text-transform: uppercase;
  letter-spacing: .1em; text-align: left; }
.nav-head:hover { color: var(--nav-ink); }
/* Akordiyon (kullanıcı isteği 2026-09-08: "kullandığım menünün basamağı açık
   kalsın diğerleri kapansın, yoksa çok uzuyor aşağı doğru"). Kapalılık artık
   VARSAYILAN; içinde bulunulan grubu sunucu [data-aktif] ile işaretler. Kural
   CSS'te olduğu için gruplar İLK BOYAMADA doğru durumda çıkar — eskiden bunu
   head'deki bir betik localStorage'dan okuyup stil enjekte ederek yapıyordu.
   JS açarken satır içi `display: block` yazar ve bu kuralı ezer. */
.nav-group:not([data-aktif]) .nav-body { display: none; }
.nav-head .chev { transition: transform var(--t-fast); flex: none; opacity: .8; }
.nav-head[aria-expanded="true"] .chev { transform: rotate(90deg); }
.nav-item { display: flex; align-items: center; min-height: var(--ctl-h);
  padding: var(--s1) var(--s4); color: var(--nav-ink); text-decoration: none;
  font-size: var(--fs-md); border-left: 3px solid transparent;
  transition: background var(--t-fast), border-color var(--t-fast); }
.sidebar > nav > .nav-item { font-weight: 700; }
.nav-item:hover { background: var(--nav-hover); }
.nav-item.on { background: var(--nav-on); color: var(--nav-brand); border-left-color: var(--nav-mark);
  font-weight: 700; }
.nav-item:focus-visible { outline: 3px solid var(--focus); outline-offset: -3px; }
.userbox { margin-top: auto; padding: var(--s3) var(--s4);
  border-top: 1px solid var(--nav-line); }
/* Menü kutusundaki eylemler tam genişliktir; `display: flex` .btn'in dikey
   ortalamasını korur (`block` onu bozuyordu). Aralık tek kuralda. */
.userbox .btn { display: flex; width: 100%; }
.userbox > * + * { margin-top: 6px; }
.userbox .uname { display: flex; align-items: center; gap: var(--s2); font-size: var(--fs-sm);
  color: var(--nav-brand); margin-bottom: var(--s2); overflow: hidden; text-overflow: ellipsis; }
.kdv-note { padding: var(--s3) var(--s4) 0; font-size: var(--fs-2xs); color: var(--nav-mut); }
.nav-closed .sidebar { margin-left: calc(-1 * var(--nav-w)); }
.nav-backdrop { position: fixed; inset: 0; background: var(--overlay); z-index: 55; }
/* Kullanıcı baş harfleri — menüde ve üst çubukta aynı öğe */
.avatar { display: grid; place-items: center; width: 26px; height: 26px; flex: none;
  border-radius: 50%; background: var(--pri-mid); color: var(--nav-brand);
  font-size: var(--fs-2xs); font-weight: 700; }

/* ---- Üst çubuk (beyaz, 44px) ---- */
.workspace { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.topbar { position: sticky; top: 0; z-index: 40; display: flex; align-items: center;
  gap: var(--s3); height: var(--topbar-h); padding: 0 var(--s4);
  background: var(--panel-glass); border-bottom: 1px solid var(--line);
  backdrop-filter: blur(10px); }
.topbar-title { font-weight: 700; font-size: var(--fs-md); overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap; }
.topbar-actions a { display: inline-flex; align-items: center; min-height: 28px; }
.topbar-actions { margin-left: auto; display: flex; align-items: center; gap: var(--s3);
  font-size: var(--fs-sm); color: var(--mut); min-width: 0; }
.topbar-user { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 34vw; }
/* Üst çubuk ikon düğmeleri (zil · rehber · destek): referansın 36px çerçeveli
   düğmeleri; sayaç sağ üst köşede kırmızı nokta-rozet. */
.topbar-actions .topbar-ikon { position: relative; display: inline-flex; align-items: center;
  justify-content: center; flex: none; width: var(--ctl-h-sm); height: var(--ctl-h-sm);
  padding: 0; border: 1px solid var(--line-strong); border-radius: var(--radius);
  background: var(--panel); color: var(--step-ink); cursor: pointer; font: inherit;
  transition: background var(--t-fast), color var(--t-fast); }
.topbar-actions .topbar-ikon[hidden] { display: none; }
.topbar-actions .topbar-ikon:hover, .topbar-actions .topbar-ikon.on { background: var(--surface); color: var(--ink); }
.topbar-actions .topbar-ikon.on { border-color: var(--pri); color: var(--pri); }
.topbar-sayi { position: absolute; top: -6px; right: -6px; display: grid; place-items: center;
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  background: var(--pri); color: var(--on-pri); font-size: var(--fs-3xs); font-weight: 700; line-height: 1; }
.nav-toggle { display: inline-grid; place-items: center; width: 30px; height: 30px; flex: none;
  border-radius: var(--radius-sm); border: 1px solid var(--line); background: var(--panel);
  color: var(--ink); cursor: pointer; }
.topbar .nav-toggle { margin-right: var(--s1); }
.topbar .nav-toggle:hover { background: var(--pri-soft); }

/* ---- Sayfa gövdesi ---- */
main { flex: 1; min-width: 0; width: 100%; max-width: 1560px; margin: 0 auto;
  padding: 18px 14px 34px; }   /* kullanıcı 2026-09-04: çerçeveler biraz daha geniş, "çok değil" */
h1 { font-size: var(--fs-3xl); line-height: 1.18; letter-spacing: -.025em;
  margin-bottom: var(--s1); }
h2 { font-size: var(--fs-xl); line-height: 1.3; margin: var(--s5) 0 var(--s2); }
h3 { font-size: var(--fs-lg); margin: 0 0 var(--s2); }
.sub { color: var(--mut); margin-bottom: var(--s4); font-size: var(--fs-md); }
/* Sayfa başlığı + sağdaki ana eylemler tek hatta */
.page-head { display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--s4); margin-bottom: var(--s4); }
.page-head > div:first-child { min-width: 0; }
.page-head .sub { margin-bottom: 0; }
/* Eylemler tek satırda ve dikeyde ortalı: küçük düğme büyükle yan yana durur (2026-09-04) */
.page-actions { display: flex; flex: none; flex-wrap: nowrap; align-items: center; justify-content: flex-end; gap: var(--s2); }
.eyebrow { color: var(--mut); font-size: var(--fs-3xs); font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase; }
.muted { color: var(--mut); }
.hint { font-size: var(--fs-sm); color: var(--mut); margin-top: var(--s1); }
.mb { margin-bottom: var(--s4); }
/* Görünürlük yardımcıları: display'i geniş ekranda EZMEZ — aksi halde blok
   öğeler satır içine düşer ve overflow kırpması çalışmaz. */
.hide-sm { }                           /* dar ekranda gizlenir (media query'de) */
.only-sm { display: none !important; } /* yalnızca dar ekranda görünür */

.card { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: var(--s4); margin-bottom: var(--s4); box-shadow: var(--shadow-1); min-width: 0; }
/* Kart içindeki ilk başlığın üst boşluğu (27 yerdeki inline stilin yerine) */
.card > :first-child { margin-top: 0; }
/* Başlık şeridi olan kart: iç boşluk gövdeye taşınır */
.card.flush { padding: 0; overflow: hidden; }
.card-header { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: var(--s2) var(--s3); padding: 10px 14px; border-bottom: 1px solid var(--line); }
.card-header > :first-child { margin: 0; }
.card-body { padding: 13px 14px; }
.card-body > :first-child { margin-top: 0; }
/* Geniş tabloyu saran kutu — kırpma bağlamı kartta değil burada olur */
.table-wrap { overflow-x: auto; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--panel); }
/* Kaydırma çubuğu son çare olmalı: metin sütunları GEREKİRSE sarar, böylece tablo
   her punto ölçeğinde kutusuna sığar. Sayı ve eylem sütunları tek satır kalır —
   tutarlar bölünürse okunmaz olur. `white-space: normal` yalnız gerektiğinde sarar;
   içerik sığıyorsa satır yüksekliği değişmez. */
.table-wrap td:not(.num):not(.right):not(.center) { white-space: normal; }
/* Tarih+saat hücresi dar ekranda saati alt satıra alabilir; tutar hücreleri bölünmez. */
.table-wrap td.tarih { white-space: normal; }


/* ---- Tablolar: yoğun veri, 11px gövde / 9px başlık ---- */
table { width: 100%; border-collapse: collapse; background: var(--panel); }
th, td { text-align: left; padding: 7px 9px; border-bottom: 1px solid var(--line);
  font-size: var(--fs-xs); white-space: nowrap; vertical-align: middle; }
td.wrap { white-space: normal; }
th { font-size: var(--fs-3xs); text-transform: uppercase; letter-spacing: .045em;
  color: var(--head-ink); background: var(--head-bg); position: sticky; top: var(--topbar-h);
  z-index: 12; border-bottom: 1px solid var(--line-strong); }
/* Kaydırma kabı içindeki tabloda yapışkanlık başlığı ilk satırın üstüne bindirir */
.table-wrap th { position: static; }
td.num, th.num { text-align: right; font-variant-numeric: tabular-nums; }
/* İmza listesi: 9 sütunla sıkışıyor. Tarih ("2026-09-02 19:14") sarılıp iki
   satıra bölünüyordu — okunması gereken tek şey saatken satır yüksekliği iki
   katına çıkıyor. Kimlik/tarih hücresi bölünmez; işlem düğmeleri sığdıkları
   sürece yan yana kalır. */
.imza-tablo td:first-child .svc-meta { white-space: nowrap; }
/* Hücre genişliği ÜST SINIRLI: metin kırpılsa bile boşluksuz uzun bir dize
   (ör. yapıştırılmış kimlik numarası) sütunu esnetmesin. */
.imza-tablo td.wrap { overflow-wrap: anywhere; }
/* Sütun ölçüsü: ölçüsüz tabloda "OP. DR. AHMET STAFF (Staff Hekim)" altı satıra
   bölünüyor, İşlem sütunu daralıp Sil düğmesini alta atıyordu (2026-09-03). */
.imza-tablo { table-layout: fixed; min-width: calc(972px * var(--kol)); }
.imza-tablo .c-no { width: calc(92px * var(--kol)); }
/* Belge türü rozeti: tam ad ("Doğum Paketi Proforması") 78px'lik sütundan taşıp
   hasta adının ve tarihin üstüne biniyordu (kullanıcı bildirimi 2026-09-04: "imza
   gönder diyince bu ekran karıştı"). Sütun rozetin KISA adına göre ölçülür — tam ada
   göre açmak 1280px'te tabloyu kesiyordu. Sarma kuralı emniyet: yeni bir tür daha
   uzun olursa hücreden taşmak yerine iki satıra iner. */
.imza-tablo .c-belge { width: calc(152px * var(--kol)); }   /* rozet tek satır: 125px yazı + 24px hücre payı */
.imza-tablo .badge.type { white-space: normal; }
.imza-tablo .c-hasta { width: auto; }   /* hasta adı / ameliyat özeti (iki katlı) */
.imza-tablo .c-hekim { width: calc(158px * var(--kol)); }
.imza-tablo .c-tutar { width: calc(88px * var(--kol)); }
.imza-tablo .c-kim { width: calc(108px * var(--kol)); }
.imza-tablo .c-imza { width: calc(56px * var(--kol)); }
.imza-tablo .c-ac { width: calc(186px * var(--kol)); }   /* Görüntüle/İmzala + Sil YAN YANA */
.imza-tablo .dep-islem { flex-wrap: nowrap; }
.imza-tablo .dep-islem { justify-content: flex-end; }
/* Belgedeki koşullu ek ücretler: fiyata dahil OLMADIĞI için kutu içinde ve
   sarımsı zeminde — hasta "bu da fiyata dahil" sanmasın. */
/* Hizmet notları: her not kendi kartında. Tek satıra dizilince cümle kutusu
   40 karakter kalıyor, tutar ve düğmeler birbirine giriyordu ("çok amatörce
   olmuş" — kullanıcı, 2026-09-02). Alanlar etiketli ve ızgarada. */
.not-liste { display: grid; gap: 10px; margin-bottom: 10px; }
.not-kart { position: relative; padding: 8px 10px; border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--surface); }
.not-onizleme { margin: 0 0 6px; font-size: var(--fs-xs); color: var(--ink); }
.not-onizleme .eyebrow { display: block; margin-bottom: 1px; }
/* Not alanları tek hatta: cümle esner, tutar ve sıra sabit genişlikte durur.
   (Kutular `<form>` DEĞİL: iç içe form olmasın diye `form=` ile bağlanan
   düz `<div>`lerdir — bkz. services.html) */
.not-form { display: flex; flex-wrap: wrap; gap: 8px; align-items: flex-end; }
.not-alan { flex: 0 0 130px; }
.not-alan.buyuk { flex: 1 1 280px; }
.not-alan.dar { flex: 0 0 80px; }
/* Birden çok sebep varsa madde madde: tek satırda birleştirilince hangi alanın
   sorunlu olduğu kayboluyordu. */
.hata-liste { margin: 4px 0 0; padding-left: 18px; }
.hata-liste li { margin: 1px 0; }
/* Gövdesiz yardımcı formlar yer kaplamasın */
.gizli-form { display: none; }
.not-yeni { margin-top: 4px; }
.not-alan { min-width: 0; }
.not-alan label { display: block; margin-bottom: 2px; font-size: var(--fs-3xs);
  color: var(--mut); text-transform: uppercase; letter-spacing: .04em; }
.not-alan input { width: 100%; }
.not-eylem { display: flex; gap: 6px; }
.not-sil { position: absolute; top: 8px; right: 10px; }
/* Çoklu ön koşul kutusu: `size` verilse de dar kalıp içerik taşıyordu */
select.cok-secim { min-height: 96px; padding: 4px 6px; }
select.cok-secim option { padding: 2px 4px; }
/* Pakete özel doktor payı rozeti: "dr. özel" mavisinden ayrışsın diye amber —
   oran formülden sapıyor, göz bir bakışta yakalasın. */
.badge.pay { background: var(--amber-soft); color: var(--amber); }
/* Doktora özel formda anahtar + yüzde kutusu tek kontrol hattında */
.dr-pay-kutu { display: flex; align-items: center; gap: 8px; }
.dr-pay-kutu input[type=number] { flex: 1; min-width: 0; }
/* Sütun başlığından sıralama: bağlantı başlığın kendisi gibi görünür, ok yön söyler.
   Ok her başlıkta yer kaplar (sıralanmayanda soluk "↕"), yoksa sütun genişliği
   sıralama değiştikçe oynar ve tablo zıplar. */
th > .sirala-bag { display: inline-flex; align-items: center; gap: 4px;
  color: inherit; text-decoration: none; font: inherit; letter-spacing: inherit; }
th > .sirala-bag:hover { color: var(--brand); }
th > .sirala-bag.etkin { color: var(--brand); font-weight: 700; }
.sirala-ok { font-size: .9em; opacity: .35; }
.sirala-bag.etkin .sirala-ok { opacity: 1; }
/* Başlıkta ikinci satırın ne olduğunu söyleyen ek: "Belge No / çıktı" */
.th-alt { font-weight: 600; text-transform: none; letter-spacing: 0; opacity: .75; }
/* Tutarın döviz karşılığı: aynı satıra sığmadığı için kendi satırında, hizalı */
.usd-alt { display: block; margin-top: 2px; color: var(--mut); font-size: var(--fs-2xs);
  font-weight: 400; }
td.center, th.center { text-align: center; }
/* Satır takibi: zebra + hover (ilk veri satırı da hover alır) */
tbody tr:nth-child(even) { background: var(--zebra); }
tbody tr:hover { background: var(--surface); }
thead tr:hover { background: transparent; }
.table-wrap tbody tr:last-child td { border-bottom: 0; }
/* Seçili satır: solda mavi çizgi + açık mavi zemin */
/* Seçili satır hover'dan belirgin biçimde ayrılır: daha doygun mavi zemin, kalın
   sol çizgi ve koyu metin. Eskiden seçili zemin (#edf7fc) hover tonuna çok yakındı,
   hangi paketin seçili olduğu anlaşılmıyordu. */
/* `font-weight: 600` seçili satırın metnini genişletiyordu: 1366px'te bölüm adı
   yalnız SEÇİLİ satırda iki satıra düşüyor, liste zıplıyordu. Vurgu zemin + sol
   çizgi + koyu renkle veriliyor; genişlik diğer satırlarla birebir aynı kalır. */
tr.sel-row td { background: var(--sel) !important; color: var(--pri-ink); }
tr.sel-row td:first-child { box-shadow: inset 4px 0 0 var(--pri); }
tr.sel-row:hover td { background: var(--sel-hover) !important; }
tr.sel-row a { color: var(--pri-ink); }
/* Pasif satır: opaklık yerine anlamsal renk (opaklık kontrastı düşürüyordu) */
tr.off-row td { color: var(--mut); background: var(--surface); }
tr.off-row td:first-child { box-shadow: inset 2px 0 0 var(--line-strong); }
tr.off-row:hover td { background: var(--surface-2); }
.right { text-align: right; white-space: nowrap; }
/* İşlem butonları tek hatta: baseline yerine flex hizası (form.inline kaymasını önler) */
td.right { text-align: right; }
td.right > .btn, td.right > form, td.right > details, td.right > a, td.right > span {
  display: inline-flex; align-items: center; vertical-align: middle; margin-left: var(--s1); }
td.right > *:first-child { margin-left: 0; }
td.right form.inline { display: inline-flex; align-items: center; }
td.right details { position: relative; }
td.right details > summary { list-style: none; cursor: pointer; }
td.right details > summary::-webkit-details-marker { display: none; }
td.right details[open] > form { position: absolute; right: 0; top: 100%; z-index: 30;
  background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: var(--s3); box-shadow: var(--shadow-2); text-align: left;
  min-width: 320px; white-space: normal; }

/* ---- Bildirimler ---- */
.flash { padding: var(--s3) var(--s4); border-radius: var(--radius); margin-bottom: var(--s3);
  font-size: var(--fs-md); border: 1px solid transparent; }
.flash.success { background: var(--ok-soft); color: var(--ok); border-color: var(--ok-line); }
.flash.error { background: var(--neg-soft); color: var(--neg); border-color: var(--neg-line); }
.flash.warning { background: var(--warn-soft); color: var(--warn); border-color: var(--warn-line); }

/* ---- Butonlar: tek yükseklik, etiket türünden bağımsız ---- */
.btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--s2);
  height: var(--ctl-h); padding: 0 var(--s4); border-radius: var(--radius-sm);
  border: 1px solid var(--pri); background: var(--pri); color: var(--on-pri);
  font-size: var(--fs-md); font-weight: 700; font-family: inherit; line-height: 1;
  cursor: pointer; text-decoration: none; white-space: nowrap;
  transition: background var(--t-fast), border-color var(--t-fast), color var(--t-fast); }
.btn:hover { background: var(--pri-ink); border-color: var(--pri-ink); }
.btn.sec { background: var(--panel); color: var(--pri-ink); }
.btn.sec:hover { background: var(--surface); border-color: var(--pri-ink); }
.btn.sm { height: var(--ctl-h-sm); padding: 0 var(--s3); font-size: var(--fs-sm); }
/* Tek ikonlu kare düğme (referansın ✎ / 🗑 düğmeleri); metin yerine title + aria-label */
.btn.ikon { width: var(--ctl-h); padding: 0; }
.btn.sm.ikon { width: var(--ctl-h-sm); }
.btn.danger { background: var(--panel); color: var(--neg); border-color: var(--neg); }
.btn.danger:hover { background: var(--neg-soft); }
/* Sessiz buton: kenarsız, yalnızca metin (Temizle, + Hizmet ekle) */
/* <summary> varsayılanı `list-item`'dır; buton görünümü için display'i değiştirmek
   gerekir. `inline-block` .btn'in `align-items: center` hizalamasını iptal edip metni
   sabit yükseklikli kutunun tepesine düşürüyordu — `inline-flex` doğrusudur. */
summary.btn { display: inline-flex; }
.btn.quiet { background: transparent; border-color: transparent; color: var(--pri-ink); }
.btn.quiet:hover { background: var(--surface); border-color: transparent; }
.btn:disabled, .btn[disabled], .btn[aria-disabled="true"] {
  opacity: .46; cursor: not-allowed; pointer-events: none; }
form.inline { display: inline; }
/* `inline` + `frm` birlikte kullanıldığında çelişki çıkıyor: `form.inline` özgüllüğü
   yüksek olduğu için `display: inline` kazanıyor, ama `.frm input { width: 100% }`
   yürürlükte kalıp girdiyi hücre genişliğine çekiyor ve satır hücreden taşıyordu
   (Bölümler ekranında 62px). Hücre içi satır-içi düzenleme formu tek kuralla hizalanır. */
td > form.inline.frm { display: inline-flex; align-items: center; gap: var(--s2); }
td > form.inline.frm input { width: auto; }
/* Aksiyon satırı: aralık HTML boşluğuna değil gap'e bağlı */
.form-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s3);
  margin-top: var(--s4); }

/* ---- Form kontrolleri: butonla aynı hatta ---- */
input, select, textarea { height: var(--ctl-h); padding: 0 var(--s3);
  border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
  font-family: inherit; font-size: var(--fs-md); color: var(--ink); background: var(--panel);
  transition: border-color var(--t-fast), box-shadow var(--t-fast); }
textarea { height: auto; min-height: 92px; padding: var(--s2) var(--s3); resize: vertical; }
select { padding-right: var(--s1); }
/* `height: auto` kutuyu tarayıcı varsayılanı 13px'te bırakıyordu: hem küçük hem
   kare değil. Genişlikle aynı yükseklik, tıklaması kolay ve hizalı bir kutu verir. */
input[type=checkbox], input[type=radio] { height: 17px; width: 17px; accent-color: var(--pri-ink);
  box-shadow: none; }
/* Dosya seçici: tek başına stilsiz kalmıştı ve genel `input` kuralını miras alıyordu
   (sabit yükseklik + `padding: 0 12px`). Tarayıcının kendi "Dosya Seç" düğmesi o
   kutunun içine satır-içi bir öğe olarak yerleşiyor; dikey padding olmadığı için
   düğme kutunun tepesine yapışıyor, uzun dosya adı da kutuyu taşırıyordu
   (kullanıcı 2026-08-19: "dosya seç kısmı sıkışık ve kayık"). Kutuyu flex yapıp
   içeriği dikeyde ortalarız; düğmeyi de uygulamanın kendi `.btn.sec` görünümüne
   çekeriz ki komşu kontrollerle aynı dilde olsun. */
input[type=file] { display: flex; align-items: center; gap: var(--s3);
  padding: 0 var(--s2) 0 0; font-size: var(--fs-sm); color: var(--mut);
  overflow: hidden; white-space: nowrap; text-overflow: ellipsis; cursor: pointer; }
input[type=file]::file-selector-button {
  height: calc(var(--ctl-h) - 10px); margin: 0 var(--s2) 0 var(--s1); padding: 0 var(--s3);
  border: 1px solid var(--pri); border-radius: var(--radius-sm);
  background: var(--panel); color: var(--pri-ink);
  font-family: inherit; font-size: var(--fs-sm); font-weight: 700; line-height: 1;
  cursor: pointer; transition: background var(--t-fast); }
input[type=file]::file-selector-button:hover { background: var(--surface); }

input.upper { text-transform: uppercase; }
input[type=number] { text-align: right; }
input:disabled, select:disabled, input[readonly] { background: var(--disabled-bg); color: var(--mut);
  cursor: not-allowed; }
/* Hatalı alan: kenar kırmızı + kırmızı yardımcı metin (.err-text) */
.field-error { border-color: var(--neg) !important;
  box-shadow: var(--neg-ring) !important; }
.err-text { color: var(--neg); font-size: var(--fs-xs); margin-top: var(--s1); }
label { font-size: var(--fs-xs); font-weight: 650; color: var(--mut); display: block;
  margin-bottom: var(--s1); }
/* Seçim etiketi (checkbox/radio yanı) gövde metnidir, alan etiketi değil */
label.opt, .chk-list label, .picker-row { display: inline-flex; align-items: center;
  gap: var(--s2); font-size: var(--fs-md); color: var(--ink); margin-bottom: 0; }

/* Filtre/form satırı: içerik değil sütun hizası belirler */
.frm { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
  gap: var(--s3); align-items: end; }
.frm > div { display: flex; flex-direction: column; min-width: 0; }
/* Onay/radyo kutuları hariç — bkz. .pf-fields'taki aynı gerekçe */
.frm input:not([type=checkbox]):not([type=radio]), .frm select { width: 100%; }
.frm .btn { justify-self: start; }
/* Formun altına inen tam genişlikli açıklama satırı. Alanın kendi altında duran
   uzun bir `.hint`, `align-items: end` yüzünden komşu kontrolleri aşağı kaydırır;
   açıklama buraya alınınca tüm kontroller tek hatta kalır. */
.frm .frm-alt { grid-column: 1 / -1; margin-top: 0; }
/* Tam satır kaplayan alan (dosya seçimi, gerekçe kutusu). Sınıf şablonlarda BEŞ
   yerde kullanılıyordu ama CSS karşılığı HİÇ YOKTU: uzun açıklamalı dosya kutusu
   sıradan bir kolon gibi davranıyor, `align-items: end` yüzünden yanındaki düğme
   kutunun altına kayıyordu (kullanıcı 2026-08-20: *"Proforma-Fatura ekranında
   kayık pencereler var Fatura kısmında özellikle"*). Aynı kök neden 2026-08-17'de
   de yaşandı — bkz. `hiza-sikayeti-kok-neden`: sınıf adı çakışması/eksikliği. */
.frm > .genis { grid-column: 1 / -1; }
.frm:has(> .frm-alt) > .genis { flex-basis: 100%; }
/* HAYALET KOLON (kullanıcı 2026-08-19: "içe aktarma ekranında sıkışıklık ve kayıklık
   var, dosya seç kısmı özellikle"). Yukarıdaki `1 / -1` açıklamayı tüm kolonlara
   yayar; `auto-fit` ancak TAMAMEN BOŞ kolonu çöktürebildiği için hiçbiri çökmez.
   1150px'lik kartta 5 kolon açılır, üç kontrol ilk üçüne 190px'e sıkışır, sağda iki
   boş kolon kalır — dosya adı "Dosya…çilmedi" diye kırpılır, bölüm listesi kesilir.
   Açıklamalı formlarda kolon sayısı kontrol sayısına bağlansın diye esnek kutuya
   geçilir: kontroller satırı paylaşır, açıklama kendi satırına iner.
   `:has()` desteklemeyen eski tarayıcıda üstteki ızgara kuralı geçerli kalır. */
.frm:has(> .frm-alt) { display: flex; flex-wrap: wrap; }
.frm:has(> .frm-alt) > div { flex: 1 1 190px; }
.frm:has(> .frm-alt) > .frm-alt { flex-basis: 100%; }
/* Etiketi olmayan onay kutusu kolonu: komşu kontrollerle aynı hatta otursun diye
   kontrol yüksekliği kadar yer kaplar ve içinde dikeyde ortalanır. */
.frm .frm-onay, .filterbar .frm-onay { justify-content: center; align-items: flex-start;
  min-height: var(--ctl-h); }
/* Tek satırlık kısa form (çarpan, tek alan + düğme): ızgara düğmeyi kartın
   ortasındaki boş kolona atıyordu; kontroller içerik genişliğinde yan yana durur. */
.frm.satir { display: flex; flex-wrap: wrap; }
.frm.satir > div { flex: 0 1 auto; }
/* Sabit genişlikli alan ölçekleri — inline style="width:NNpx" yerine */
.f-num-sm { width: 88px !important; }
.f-num-md { width: 120px !important; }
.f-num-lg { width: 160px !important; }
.tam-genislik { width: 100%; }
/* Filtre çubuğu: her ekranda aynı kap */
.filterbar { display: grid; grid-template-columns: repeat(auto-fit, minmax(224px, 1fr));
  gap: var(--s3); align-items: end; background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-lg); padding: var(--s3) var(--s4); margin-bottom: var(--s4); }
.filterbar > div { display: flex; flex-direction: column; min-width: 0; }
/* Onay/radyo kutusu hariç — `.frm`'deki ile aynı gerekçe: %100 genişlik verilen
   bir onay kutusu kolonu boydan boya kaplar ve etiketini kolonun sağ ucuna iter. */
.filterbar input:not([type=checkbox]):not([type=radio]),
.filterbar select { width: 100%; }
.filterbar .btn { justify-self: start; align-self: end; }

/* ---- Rozetler: tek punto, tek dolgu, anlamsal 4 ton ---- */
.badge { display: inline-flex; align-items: center; min-height: 20px; padding: 0 7px;
  border-radius: 99px; font-size: var(--fs-3xs); font-weight: 700; line-height: 1.5;
  white-space: nowrap; }
.badge.on, .badge.act-ekleme, .badge.staff-green { background: var(--ok-soft); color: var(--ok); }
.badge.off, .badge.act-silme { background: var(--neg-soft); color: var(--neg); }
.badge.type, .badge.staff, .badge.act-guncelleme { background: var(--pri-soft); color: var(--pri-ink); }
.badge.guest { background: var(--neg-soft); color: var(--neg); }
.badge.doc, .badge.new, .badge.act-zam { background: var(--warn-soft); color: var(--warn); }
.badge.act-durum, .badge.bekliyor { background: var(--surface-2); color: var(--mut); }
/* İmza kendi işlem tipi (migration 043): rozet de kendi rengini alır, yoksa
   işlem günlüğünde renksiz kalıp "tanınmayan tip" gibi görünürdü. */
.badge.act-imza { background: var(--info-soft); color: var(--info); }
/* Proforma Kayıtları · satış eylemi. Belge No hücresinde tam genişlikte durur:
   İşlemler sütunu (140px) üçüncü düğmeyi taşıyamıyordu. */
.satis-dugme { display: flex; width: 100%; margin-top: 4px; justify-content: center; }
.satis-durum { margin-top: 4px; }
.badge.act-belge { background: var(--info-soft); color: var(--info); }
.badge.act-ice_aktarma { background: var(--teal-soft); color: var(--teal); }

/* =========================================================================
   LİSTE EKRANI — yoğun tablo + 292px detay çekmecesi, 700px altında kayıt kartı
   ========================================================================= */
/* Çekmece 292px'ti; kullanıcı listeye daha fazla yer istedi. 240px içeriği hâlâ
   rahat gösteriyor (en uzun etiket "Son güncelleme" + tarih) ve tabloya 28px kazandırıyor. */
/* Genişlik punto ölçeğiyle birlikte büyür (`--kol`): 1728px'te 14px puntoda
   "Son güncelleme 2026-08-15 14:16" satırı 240px'e sığmıyordu. */
.list-layout { display: grid;
  grid-template-columns: minmax(0, 1fr) calc(240px * var(--kol));
  gap: 10px; align-items: start; }
/* Çekmece kapatılınca tablo tam genişliğe geçer */
.list-layout.kapali { grid-template-columns: minmax(0, 1fr); }
.list-main { min-width: 0; }
.detail-drawer { position: sticky; top: calc(var(--topbar-h) + var(--s5)); margin-bottom: 0; }
.detail-drawer .card-header h2 { font-size: var(--fs-md); font-weight: 700; line-height: 1.3; }
.detail-drawer .card-header .btn { height: 24px; padding: 0 var(--s2); font-size: var(--fs-lg); }
.drawer-sec { padding: 12px 14px; border-bottom: 1px solid var(--line); }
.drawer-sec:last-child { border-bottom: 0; }
.drawer-sec h3 { font-size: var(--fs-md); margin-bottom: var(--s2); }
.drawer-sec p { margin: 2px 0 var(--s3); }
.drawer-sec p:last-child { margin-bottom: 0; }
.d-strong { font-weight: 700; font-size: var(--fs-md); }
.d-row { display: flex; align-items: baseline; justify-content: space-between; gap: var(--s3);
  padding: 3px 0; font-size: var(--fs-xs); }
.d-row span { color: var(--mut); }
.d-row b { font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Çekmece eylemleri: `flex-wrap` dar panelde düğmeleri düzensiz sardırıyordu
   (Görüntüle ve Düzenle ayrı satırlara düşüyordu). Sabit iki kolonlu ızgara:
   Görüntüle + Düzenle daima yan yana, uzun olan eylem altta tam genişlik.
   Kenarlar her punto ölçeğinde hizalı kalır. */
.drawer-actions { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s2); }
.drawer-actions > .btn { width: 100%; }
.drawer-actions > .btn:nth-child(n+3) { grid-column: 1 / -1; }
.table-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--s3);
  padding: 9px 2px; color: var(--mut); font-size: var(--fs-2xs); }
/* Filtre çubuğunda arama açık, diğerleri katlanır */
.filterbar .f-ara { grid-column: span 2; }
/* Canlı arama sayacı ("58 kayıt") etiket satırının SAĞINA oturur. Kutunun altında
   dururken arama kolonunu bir satır uzatıyor, `.filterbar`ın `align-items: end`
   kuralı yüzünden komşu kontroller (Bölüm, Doktor, Filtrele) o kadar aşağı
   kayıyor ve çubuk hizasız görünüyordu. Sayaç artık kolonun yüksekliğini
   değiştirmez: arama kutusu her ekranda diğer kontrollerle aynı hatta oturur. */
/* İkinci kolon `auto` iken KÜÇÜLEMİYORDU: sayacın uzun metni ("0 kayıt eşleşti
   (bu sayfada) — Enter ile tüm kayıtlarda arayın", 355px) kolonu kabından geniş
   yapıyor, etiketi 0 piksele eziyor ve komşu "Durum" filtresinin üstüne taşıyordu
   (kullanıcı bildirimi 2026-09-08: "yazı yazınca saçmalıyor"). `minmax(0, auto)`
   + taşma kırpması: metin ne kadar uzarsa uzasın kolon kabından çıkamaz. */
.filterbar .f-ara { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, auto);
  align-content: end; column-gap: var(--s2); }
.filterbar .f-ara > label { grid-column: 1; grid-row: 1;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.filterbar .f-ara > .hint { grid-column: 2; grid-row: 1; align-self: end;
  margin: 0; font-size: var(--fs-2xs); white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis; }
.filterbar .f-ara > :is(input, select) { grid-column: 1 / -1; grid-row: 2; }
.filterbar .f-btn { display: flex; align-items: end; gap: var(--s2); flex-direction: row; }
.filter-more { grid-column: span 2; min-width: 0; }
.filter-more > summary { display: inline-flex; align-items: center; height: var(--ctl-h);
  color: var(--pri-ink); font-size: var(--fs-md); font-weight: 700; cursor: pointer; }
.filter-more-body { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--s3); padding-top: var(--s2); }
.filter-more-body > div { display: flex; flex-direction: column; min-width: 0; }

/* Kayıt kartı (390px) */
.rec-list { display: grid; gap: var(--s3); }
.rec { padding: 13px; border: 1px solid var(--line); border-radius: var(--radius);
  background: var(--panel); }
.rec.off { background: var(--surface-2); }
.rec-head { display: flex; align-items: flex-start; justify-content: space-between;
  gap: var(--s3); margin-bottom: var(--s3); }
.rec-title { color: var(--pri-ink); font-weight: 800; font-size: var(--fs-md); text-decoration: none; }
.rec-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--s2) var(--s4); }
.rec-grid > div { min-width: 0; }
.rec-v { display: block; margin-top: 2px; font-size: var(--fs-md); font-weight: 700;
  font-variant-numeric: tabular-nums; overflow-wrap: anywhere; }
.rec-v.muted { font-weight: 400; }
.rec-v.up-t { color: var(--ok); }
.rec-v.down-t { color: var(--neg); }
.rec-note { margin-top: var(--s2); }
.rec-more { margin-top: var(--s3); border-top: 1px solid var(--line); }
.rec-more > summary { padding-top: var(--s3); color: var(--pri-ink); font-weight: 700;
  font-size: var(--fs-md); cursor: pointer; }
.rec-more .rec-grid { margin-top: var(--s2); }
.rec-actions { display: flex; flex-wrap: wrap; gap: var(--s2); margin-top: var(--s3); }

/* ---- Yerleşim yardımcıları ---- */
.grid2 { display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(330px, 1fr); gap: var(--s4); }
.grid2 > * { min-width: 0; }
/* Proforma ↔ Fatura karşılaştırması: iki EŞİT sütun (grid2 asimetriktir, burada iki
   taraf da aynı ağırlıkta okunmalı). 900px altında alt alta iner. */
.karsi { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--s4); }
.karsi > * { min-width: 0; }
/* Yüklenen fatura görselleri: kutuya sığar, tıklanınca tam boy açılır */
.fatura-liste { display: grid; gap: var(--s3); margin-top: var(--s3); }
.fatura-oge { border: 1px solid var(--line); border-radius: 6px; padding: var(--s2);
  background: var(--surface-2); }
.fatura-oge img { display: block; width: 100%; max-height: 320px; object-fit: contain;
  border-radius: var(--radius-xs); background: var(--panel); }
.fatura-ad { display: block; margin-top: var(--s2); font-size: var(--fs-sm);
  word-break: break-word; }
.stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--s3); }
.stat { background: var(--panel); border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: var(--s4); box-shadow: var(--shadow-1); }
.stat .v { font-size: var(--fs-2xl); font-weight: 700; font-variant-numeric: tabular-nums;
  line-height: 1.2; }
.stat .l { font-size: var(--fs-md); color: var(--mut); }

/* ---- Hesap özeti tablosu ---- */
.summary { table-layout: fixed; }
.summary th, .summary td { border-bottom: none; padding: 4px 0 4px 2px;
  white-space: normal; font-size: var(--fs-md); }
.summary th { position: static; background: transparent; box-shadow: none;
  font-size: var(--fs-xs); }
.summary td:first-child { width: 52%; }
.summary td.num { width: 48%; font-weight: 700; }
.summary tr:hover, .summary tbody tr:nth-child(even) { background: transparent; }
.summary tr.total td { border-top: 2px solid var(--ink); font-weight: 700; padding-top: var(--s2); }
.summary tr.mid td { font-weight: 700; border-top: 1px solid var(--line); padding-top: var(--s2); }
.summary tr.rule td { color: var(--mut); font-size: var(--fs-xs); }
.summary tr.rule td.num { font-weight: 400; }
.price-big { font-size: var(--fs-2xl); font-weight: 700; line-height: 1.2;
  font-variant-numeric: tabular-nums; }

/* Nihai fiyat kutusu — hesap izinin sonucu, kart içinde vurgulu yüzey */
.final-price { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); margin-top: var(--s3); padding: 12px 13px;
  border: 1px solid var(--pri-mid); border-radius: var(--radius); background: var(--panel-tint); }
.final-price > span { font-weight: 700; font-size: var(--fs-md); }
.final-price strong { color: var(--pri-ink); font-size: var(--fs-2xl); font-weight: 800;
  letter-spacing: -.02em; font-variant-numeric: tabular-nums; white-space: nowrap; }

/* Etiket içindeki ikincil not ("zam +, indirim −") — etiketin kendisi kadar
   baskın olmamalı ama alanın anlamını taşıyor. */
.etiket-not { font-weight: 500; color: var(--mut); }

/* Toplu seçim çubuğunun altındaki uyarı satırı: sayfalanan listede seçim yalnız
   görüneni kapsar, sayı uyuşmazlığı sessiz kalmamalı. */
.toplu-not { margin: 6px 0 0; }

/* Zam ekranı: eski liste (Excel referansı) farkı rozeti. Artı = hesaplanan fiyat
   eski listenin üstünde (indirim adayı), eksi = altında. Renk yalnız YÖN bildirir;
   "üstünde" kendiliğinden hata değil, bu yüzden hata kırmızısı değil uyarı tonu. */
.fark { display: inline-block; padding: 1px 7px; border-radius: 999px;
  font-size: var(--fs-2xs); font-weight: 700; font-variant-numeric: tabular-nums; }
.fark.ust { background: var(--warn-soft); color: var(--warn); }
.fark.alt { background: var(--surface-2); color: var(--mut); }
.onay-tablo .c-fark { width: calc(96px * var(--kol)); }
.onizleme-tablo .c-fark { width: calc(110px * var(--kol)); }
.f-num-sm { width: 84px; }

/* Başlıktaki kayıt sayısı: "Ameliyatlar 583". Kullanıcı isteği 2026-09-04 —
   listenin ne kadar büyük olduğu sayfayı açar açmaz görünsün. */
.baslik-say { display: inline-block; margin-left: 6px; padding: 1px 8px;
  border-radius: 999px; background: var(--surface); color: var(--mut);
  font-size: var(--fs-2xs); font-weight: 700; vertical-align: middle;
  font-variant-numeric: tabular-nums; }

/* Sayfalama şeridi — liste altında: toplam, sayfa boyutu, sayfa bağlantıları.
   Tek satır; dar ekranda üç parça alt alta sarar. */
.sayfalama { display: flex; flex-wrap: wrap; align-items: center;
  gap: var(--s2) var(--s3); margin-top: 12px; padding: 9px 12px;
  border: 1px solid var(--line); border-radius: var(--radius); background: var(--panel); }
.sayfalama-say { font-size: var(--fs-xs); font-variant-numeric: tabular-nums; }
.sayfalama-boyut { display: flex; align-items: center; gap: 6px; }
.sayfalama-boyut label { font-size: var(--fs-2xs); }
.sayfalama-boyut select { height: 28px; padding: 0 6px; font-size: var(--fs-xs); }
.sayfalama-gez { display: flex; flex-wrap: wrap; align-items: center; gap: 4px;
  margin-left: auto; }
.sayfalama-gez .sf { display: inline-flex; align-items: center; justify-content: center;
  min-width: 30px; height: 28px; padding: 0 8px; border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm); color: var(--ink); text-decoration: none;
  font-size: var(--fs-xs); font-weight: 650; font-variant-numeric: tabular-nums; }
.sayfalama-gez .sf:hover { background: var(--surface); }
.sayfalama-gez .sf.secili { background: var(--pri); border-color: var(--pri);
  color: var(--on-pri); cursor: default; }
.sayfalama-gez .sf.pasif { color: var(--faint); border-color: var(--line);
  pointer-events: none; }
.sayfalama-gez .sf-ara { padding: 0 2px; color: var(--mut); }

/* Eski liste fiyatı (Excel'den gelen referans) — nihai fiyatın hemen üstünde,
   ondan daha sessiz. Hesaba girmeyen bir kıyas değeridir; nihai fiyatla eşit
   ağırlıkta görünmemeli ama aynı kolon rayında durmalı. */
.ref-fiyat { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); margin-top: var(--s3); padding: 9px 13px;
  border: 1px dashed var(--line); border-radius: var(--radius); }
.ref-fiyat > span { font-weight: 600; color: var(--mut); }
.ref-fiyat strong { font-size: var(--fs-lg); font-weight: 700; color: var(--mut);
  font-variant-numeric: tabular-nums; white-space: nowrap; }
.ref-fiyat + .final-price { margin-top: 6px; }

/* Paket detayı: üstte iki sütun (~58/42), altta tam genişlik tablolar */
.detail-grid { display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(330px, .82fr);
  gap: 12px; align-items: start; margin-bottom: 18px; }
.detail-grid > * { min-width: 0; margin-bottom: 0; }
.section-head { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); margin: var(--s5) 0 var(--s2); }
.section-head h2 { margin: 0; }
.mt2 { margin-top: var(--s2); }
.mt3 { margin-top: var(--s3); }
.flash-list { margin: var(--s2) 0 0 18px; }
.modal-box.narrow { width: 460px; }
/* Ameliyat seçim penceresi: en uzun ameliyat adı (ör. LAPAROSKOPİK SLEEVE
   GASTREKTOMİ (MALZEME HARİÇ)) 560px'de punto büyüyünce iki satıra düşüyordu.
   Geniş varyant, büyük punto ölçeklerinde de tek satır bırakır. */
.modal-box.wide { width: min(780px, 96vw); }

/* Fark sütunları: artı yeşil, eksi kırmızı */
td.up { color: var(--ok); }
td.down { color: var(--neg); }

/* Fiyatı ARTIRAN satır hafif yeşil, AZALTAN (indirim) hafif pembe */
tr.extra-line td { background: var(--up-soft); }
tr.extra-line td:first-child { box-shadow: inset 2px 0 0 var(--up-line); }
tr.discount-line td { background: var(--down-soft); }
tr.discount-line td:first-child { box-shadow: inset 2px 0 0 var(--down-line); }
tr.off-row.discount-line td { background: var(--down-faint); }
.extra-mark { color: var(--ok); font-weight: 700; font-size: var(--fs-sm); }
.disc-mark { color: var(--neg); font-size: var(--fs-sm); font-weight: 600; }
.legend { display: inline-block; width: 10px; height: 10px; border-radius: 3px;
  vertical-align: middle; margin-right: 3px; }
.legend.green { background: var(--up-soft); border: 1px solid var(--up-line); }
.legend.pink { background: var(--down-soft); border: 1px solid var(--down-line); }

.link-btn { background: none; border: none; padding: 0; font: inherit; color: var(--pri-ink);
  text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }
.link-btn:hover { color: var(--pri-ink); }
.detail-row { display: flex; justify-content: space-between; gap: var(--s3);
  padding: var(--s2) var(--s3); border-radius: var(--radius-sm); margin-bottom: var(--s1);
  font-size: var(--fs-md); background: var(--surface); }
.detail-row.pink { background: var(--down-soft); }
.detail-row.green { background: var(--up-soft); }

/* =========================================================================
   PAKET OLUŞTURUCU — solda hizmet grupları, sağda sabit canlı hesap paneli.
   Bütün katsayılı gruplar AYNI colgroup ölçüsünü kullanır; kolonlar grup
   içeriğine göre kaymaz.
   ========================================================================= */
.builder-sel { display: grid; grid-template-columns: 200px minmax(240px, 1fr) 110px 110px;
  gap: 10px; align-items: end; margin-bottom: 10px; padding: 11px 12px;
  border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--panel);
  box-shadow: var(--shadow-1); }
.builder-sel > div { min-width: 0; }
.builder-sel select, .builder-sel input { width: 100%; }
/* Doktora Özelleştir'de geniş sütun doktor adına ayrılır (adlar uzun); Paket
   Oluşturucu'da aynı yeri ameliyat adı alır. Sıra: doktor · indirim · TTB · ana paket.
   Yalnız masaüstünde: `.builder-sel.ovr` özgüllüğü mobil kuralı da ezdiği için
   media sorgusuna alınmazsa 390px'de şerit taşar. */
@media (min-width: 701px) {
  /* Doktorlar ekranı: bölüm seçme düğmesi diğer alanlarla aynı hatta otursun.
   Altındaki özet metni akışta yer kapladığı için düğme yukarı kayıyordu. */
/* Seçim düğmenin metnindedir; uzun liste kutuyu şişirmesin */
.dep-ac { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  display: inline-flex; justify-content: flex-start; }
.builder-sel.ovr { grid-template-columns: minmax(220px, 1fr) 160px 120px 140px; }
}
@media (max-width: 700px) {
  /* Dar ekranda tam genişliği birincil seçim alır: burada doktor, Paket
     Oluşturucu'da ameliyat. */
  .builder-sel.ovr > div:nth-child(2) { grid-column: auto; grid-row: auto; }
  .builder-sel.ovr > div:nth-child(1) { grid-column: 1 / -1; grid-row: 1; }
}
.builder-durum { margin: 0; height: var(--ctl-h); display: flex; align-items: center; }

/* Hesap paneli 330 → 390px: pay kırılımı dar panelde sarıp okunmaz hâle geliyordu
   (kullanıcı bildirimi 2026-08-19, ekran görüntüsüyle). Genişletme tek başına
   yetmedi, satır yapısı da değişti — bkz. `.calc-alt`. */
.builder-layout { display: grid; grid-template-columns: minmax(0, 1fr) 390px;
  gap: 10px; align-items: start; }
/* 1400px altında sağ panel 340px: hizmet adı kolonu koşul çipini üç satıra kırıyordu */
@media (max-width: 1400px) { .builder-layout { grid-template-columns: minmax(0, 1fr) 340px; } }
.builder-main { min-width: 0; display: grid; gap: 9px; }

.svc-group { overflow: hidden; border: 1px solid var(--line); border-radius: var(--radius-lg);
  background: var(--panel); box-shadow: var(--shadow-1); }
.svc-group > summary { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); min-height: 40px; padding: 8px 12px; font-weight: 800;
  font-size: var(--fs-md); cursor: pointer; list-style: none; }
.svc-group > summary::-webkit-details-marker { display: none; }
.svc-group[open] > summary { border-bottom: 1px solid var(--line); }
.svc-group-ad { display: flex; align-items: center; gap: var(--s2); min-width: 0; }
.svc-group-not { color: var(--mut); font-size: var(--fs-2xs); font-weight: 650; }
.direct-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: var(--s1) var(--s3); min-height: 40px; padding: 8px 12px; border-bottom: 1px solid var(--line); }
.direct-head h2 { white-space: nowrap; }
.direct-head h2 { margin: 0; font-size: var(--fs-lg); }

/* Ortak kolon ölçüsü — tüm katsayılı gruplarda aynı */
.svc-table, .direct-table { width: 100%; table-layout: fixed; border-collapse: collapse; }
/* Ortak kolon rayı: katsayılı hizmet tabloları ile Doğrudan Fiyatlı Hizmetler tablosu
   AYNI colgroup sınıflarını kullanır. Böylece hizmet adları ve "İndirim %" alanları
   iki tabloda tek bir dikey hatta oturur. Doğrudan tabloda ilk (Dahil) ve son
   (Etkin Katkı) sütun boş kalır; "Tutar (TL)" katsayı + adet sütunlarını birlikte
   kaplar — katsayı × adet hesabının yerine geçen alan zaten odur. */
:is(.svc-table, .direct-table) .c-dahil { width: calc(58px * var(--kol)); }
:is(.svc-table, .direct-table) .c-hizmet { width: auto; }
/* Katsayı ayrı sütun değil, hizmet adının altındaki gri satırda (iki katlı hücre,
   2026-09-03). "ETKİN KATKI" 88px'e sığmıyor, kartın kenarında kesiliyordu:
   ölçüldü, 11px büyük harf + 12px dolgu = 114px. */
:is(.svc-table, .direct-table) .c-adet { width: calc(116px * var(--kol)); }
:is(.svc-table, .direct-table) .c-ind { width: calc(100px * var(--kol)); }
:is(.svc-table, .direct-table) .c-katki { width: calc(128px * var(--kol)); }
/* Doğrudan fiyat tablosunda katkı kolonu boştur; yer tutmasın, hizmet adı sarmasın */
.direct-table .c-katki { width: 0; }
.svc-table td, .direct-table td { height: 37px; padding: 5px 9px; vertical-align: middle; }
.svc-table th, .direct-table th { position: static; font-size: var(--fs-3xs); }
.svc-table tr:last-child td, .direct-table tr:last-child td { border-bottom: 0; }
.svc-table tbody tr:nth-child(even), .direct-table tbody tr:nth-child(even) { background: transparent; }
.svc-ad { font-weight: 700; font-size: var(--fs-xs); }
a.svc-ad { color: var(--ink); text-decoration: none; }
a.svc-ad:hover { color: var(--pri-ink); text-decoration: underline; }
.svc-meta { display: block; color: var(--mut); font-size: var(--fs-3xs); }
.svc-ctl { width: 100%; height: 28px; padding: 0 7px; font-size: var(--fs-xs); }
.genel-indirim td { border-top: 1px solid var(--line-strong); }
/* Üstteki tek satırlık "Paket Geneli" bloğunda ayırıcı çizgi gereksiz: satır
   zaten başlığın hemen altında tek başına duruyor, ikinci çizgi kalınlaşırdı. */
.genel-blok .genel-indirim td { border-top: 0; }

/* Doktor payı: yüzde / sabit tutar seçimi. İki radyo + iki kutu tek hatta oturur;
   dar ekranda sarar. Kutular ad kolonundadır (colspan) — 100px'lik "İndirim %"
   rayına dördü birden sığmıyordu. */
.dr-pay-secim { display: flex; flex-wrap: wrap; align-items: center;
  gap: 6px var(--s3); margin: 5px 0 3px; }
.dr-pay-tur { display: inline-flex; align-items: center; gap: 5px;
  font-size: var(--fs-2xs); font-weight: 650; white-space: nowrap; }
.dr-pay-tur input { width: 15px; height: 15px; margin: 0; }
.dr-pay-kutu { display: inline-flex; align-items: center; gap: 4px; }
.dr-pay-kutu .svc-ctl { width: 92px; }
.dr-pay-kutu .birim { color: var(--mut); font-size: var(--fs-2xs); font-weight: 700; }

/* Dahil anahtarı */
/* Geometri simetrik: ray 34×20, yuvarlak 16, her kenardan 2px. Yuvarlak dikeyde
   %50 + translate ile ortalanır; eski `top: 2px` ray çerçevesiyle 1px kayıyordu
   (kullanıcı 2026-09-03: "anahtarların yuvarlaklarında kayıklık"). */
.switch { position: relative; display: inline-block; width: 34px; height: 20px;
  vertical-align: middle; }
.switch input { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0;
  opacity: 0; cursor: pointer; }
.switch .track { display: block; width: 100%; height: 100%; border-radius: 999px;
  position: relative; background: var(--switch-off); transition: background var(--t-fast); }
.switch .track::after { position: absolute; top: 50%; left: 2px; width: 16px; height: 16px;
  border-radius: 50%; background: var(--panel); box-shadow: var(--shadow-knob);
  transform: translateY(-50%); transition: transform var(--t-fast); content: ""; }
.switch input:checked + .track { background: var(--pri-mid); }
.switch input:checked + .track::after { transform: translate(14px, -50%); }
.switch input:focus-visible + .track { outline: 3px solid var(--focus); outline-offset: 2px; }
.switch input:disabled { cursor: not-allowed; }
.switch input:disabled + .track { opacity: .45; }

/* Canlı hesap paneli */
.calc-panel { position: sticky; top: calc(var(--topbar-h) + 12px); margin-bottom: 0; }
.calc-tabs { padding: 0 12px; }
.calc-tabs .tab { padding: 0 var(--s3); font-size: var(--fs-md); }
.calc-sec { padding: 11px 12px; border-bottom: 1px solid var(--line); }
.calc-sec:last-child { border-bottom: 0; }
.calc-sec .eyebrow { display: block; margin-bottom: var(--s2); }
.calc-bos { font-size: var(--fs-xs); }
.calc-row { display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--s3); min-height: 22px; font-size: var(--fs-2xs); }
.calc-row span { color: var(--mut); min-width: 0; }
.calc-row b { font-variant-numeric: tabular-nums; white-space: nowrap; }
.calc-row.toplam { margin-top: 5px; padding-top: 7px; border-top: 1px solid var(--line-strong);
  font-weight: 800; }
.calc-row.toplam span { color: var(--ink); }
/* Tarifenin altında hastane payı / doktor hakedişi. Tek satırda
   "hastane 60.000,00 · doktor 30.000,00" yazılıyordu ve dar panelde ikiye sarıp
   okunmuyordu (kullanıcı bildirimi 2026-08-19). Artık her pay KENDİ satırında:
   etiket solda, tutar sağda, rakamlar alt alta hizalı. */
.calc-oge + .calc-oge { margin-top: 6px; }
.calc-alt { display: flex; align-items: baseline; justify-content: space-between;
  gap: var(--s2); padding-left: 10px; color: var(--mut); font-size: var(--fs-2xs);
  line-height: 1.4; }
.calc-alt b { font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
/* Açıklama metni (rakam değil) yine tek blok olarak kalır */
.calc-row .calc-pay { display: block; margin-top: 1px; color: var(--mut);
  font-size: var(--fs-2xs); white-space: normal; }
.trace { display: grid; gap: 8px; margin: 0; padding: 0; list-style: none; }
.trace-row { display: grid; grid-template-columns: 20px minmax(0, 1fr) auto; gap: 7px;
  align-items: baseline; font-size: var(--fs-2xs); }
.trace-no { display: grid; place-items: center; width: 20px; height: 20px; border-radius: 50%;
  background: var(--pri); color: var(--on-pri); font-size: var(--fs-3xs); font-weight: 800; }
.trace-row b { font-variant-numeric: tabular-nums; white-space: nowrap; }
.calc-final { margin: 12px; padding: 12px; border: 1px solid var(--pri-mid);
  border-radius: var(--radius); background: var(--surface); }
.calc-final strong { display: block; margin-top: 3px; color: var(--pri-ink); font-size: var(--fs-2xl);
  font-weight: 800; letter-spacing: -.025em; font-variant-numeric: tabular-nums; }

/* Mobil sabit çubuk (Paket Oluşturucu ve benzeri kaydetme ekranları) */
.sticky-bar { position: fixed; inset: auto 0 0 0; z-index: 31; display: flex;
  align-items: center; justify-content: space-between; gap: 10px; padding: 10px 12px;
  border-top: 1px solid var(--line); background: var(--panel);
  box-shadow: var(--shadow-up); }
.sticky-bar strong { display: block; color: var(--navy-deep); font-size: var(--fs-xl);
  font-variant-numeric: tabular-nums; }

/* ---- Hizmet satırları (paket formu) ---- */
.svc-grid { display: grid; grid-template-columns: minmax(220px, 1fr) 180px 96px 96px;
  gap: var(--s3); }
.svc-grid > * { min-width: 0; }
.svc-grid.direct { grid-template-columns: minmax(220px, 1fr) 160px 96px; }
.svc-head { display: contents; }
.svc-head > span { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .04em;
  color: var(--mut); padding-bottom: var(--s2); border-bottom: 2px solid var(--line-strong); }
.svc-line { display: contents; }
.svc-line > * { padding: var(--s2) 0; border-bottom: 1px solid var(--line); align-self: center;
  white-space: nowrap; }
.svc-line .lbl { font-size: var(--fs-md); overflow: hidden; text-overflow: ellipsis; }
.svc-line select, .svc-line .direct, .svc-line .qty, .svc-line .disc { width: 100%; }
.svc-grid .col-num { text-align: right; }
.svc-grid input { text-align: right; }
.svc-line.total-line > * { border-bottom: none; padding-top: var(--s3); }

.row3 { display: grid; grid-template-columns: 200px 1fr 110px; gap: var(--s3); align-items: end; }
.row3 select, .row3 input { width: 100%; }
/* Formül satırı: etiket · alan · açıklama tek hatta */
/* Satırda İKİ çocuk var (.fr-input ve .fr-desc) ama şablon üç kolonluydu:
   açıklama 120px'lik dar kolona düşüyor, `1fr` boş kalıyor ve metin 5-6 satıra
   yayılıyordu. İki kolon: alan sabit, açıklama kalan genişliğin tamamını alır. */
.formula-row { display: grid; grid-template-columns: 240px minmax(0, 1fr); gap: var(--s4);
  align-items: center; padding: var(--s2) 0; border-bottom: 1px solid var(--line); }
.formula-row:last-of-type { border-bottom: none; }
.formula-row label { margin-bottom: 0; font-size: var(--fs-md); color: var(--ink); }
.formula-row .fr-input input { width: 100%; }
.formula-row .fr-desc { font-size: var(--fs-md); color: var(--mut); white-space: normal; }

/* ---- Karşılaştırma şeridi ---- */
.cmp { display: flex; align-items: stretch; gap: var(--s3); }
.cmp-box { flex: 1; background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-lg); padding: var(--s3) var(--s4); }
.cmp-box.hi { border-color: var(--pri-ink); box-shadow: 0 0 0 2px var(--pri-soft); }
.cmp-label { font-size: var(--fs-xs); text-transform: uppercase; letter-spacing: .04em;
  color: var(--mut); }
.cmp-value { font-size: var(--fs-xl); font-weight: 700; font-variant-numeric: tabular-nums; }
.cmp-arrow { display: flex; align-items: center; color: var(--mut); font-size: var(--fs-xl); }

/* ---- Sekmeler: alt çizgili, kutu değil ---- */
.tabs { display: flex; gap: var(--s1); border-bottom: 1px solid var(--line-strong); }
.tab { display: inline-flex; align-items: center; height: var(--ctl-h); padding: 0 var(--s4);
  text-decoration: none; color: var(--mut); font-size: var(--fs-md); font-weight: 700;
  background: transparent; border: 0; border-bottom: 2px solid transparent;
  margin-bottom: -1px; cursor: pointer; font-family: inherit; }
.tab:hover { color: var(--pri-ink); background: var(--surface); }
.tab:focus-visible { outline: 3px solid var(--focus); outline-offset: -3px; }
.tab.on, .tab[aria-selected="true"] { color: var(--pri-ink); border-bottom-color: var(--pri-ink); }
.tab[aria-disabled="true"] { color: var(--faint); pointer-events: none; }

/* ---- Bildirim kutusu (kart içi, flash'tan ayrı) ---- */
.notice { display: flex; gap: 10px; padding: 10px 12px; border: 1px solid var(--notice-line);
  border-radius: var(--radius); background: var(--surface); color: var(--notice-ink);
  font-size: var(--fs-xs); }
.notice.warn { border-color: var(--notice-warn-line); background: var(--warn-soft); color: var(--notice-warn-ink); }
.notice.danger { border-color: var(--notice-neg-line); background: var(--neg-soft); color: var(--notice-neg-ink); }
/* Boş durum: yalnızca "kayıt yok" demez, çıkış yolu sunar */
.empty { padding: var(--s5) var(--s4); text-align: center; color: var(--mut); }
.empty .t { display: block; margin-bottom: var(--s2); font-size: var(--fs-md);
  font-weight: 700; color: var(--ink); }

.chk-list { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: var(--s2); }

/* ---- Sayfalama ---- */
.pager { display: flex; align-items: center; gap: var(--s1); flex-wrap: wrap; margin-top: var(--s3); }
.pager .pg { display: inline-flex; align-items: center; height: var(--ctl-h-sm);
  padding: 0 var(--s3); border: 1px solid var(--line-strong); border-radius: var(--radius);
  text-decoration: none; color: var(--pri-ink); background: var(--panel); font-size: var(--fs-md);
  font-variant-numeric: tabular-nums; }
.pager .pg:hover { background: var(--pri-soft); }
.pager .pg.on { background: var(--pri); border-color: var(--pri-ink); color: var(--on-pri); font-weight: 600; }
.pager .pg.off { color: var(--faint); pointer-events: none; }
.pager .pg.gap { border: none; background: none; color: var(--mut); pointer-events: none; }
.pager .muted { margin-left: var(--s2); font-size: var(--fs-md); }

/* ---- Seçim penceresi ---- */
.modal { position: fixed; inset: 0; background: var(--overlay); z-index: 80;
  display: flex; align-items: center; justify-content: center; padding: var(--s5); }
.modal-box { background: var(--panel); border-radius: var(--radius-lg); padding: var(--s5);
  width: 560px; max-width: 100%; max-height: 82vh; overflow-y: auto; box-shadow: var(--shadow-2); }
.picker-list { margin-top: var(--s2); max-height: 46vh; overflow-y: auto;
  border: 1px solid var(--line); border-radius: var(--radius); padding: var(--s2); }
.picker-row { display: flex; padding: var(--s1) var(--s1); border-radius: var(--radius-sm); }
.picker-row:hover { background: var(--pri-soft); }
.picker-box { border: 1px solid var(--line-strong); border-radius: var(--radius);
  padding: var(--s1) var(--s2); min-height: var(--ctl-h); background: var(--panel);
  display: flex; flex-wrap: wrap; align-items: center; gap: var(--s1); }
.chip { display: inline-flex; align-items: center; background: var(--pri-soft); color: var(--pri-ink);
  border-radius: 99px; padding: 2px var(--s3); font-size: var(--fs-md); }

/* =========================================================================
   PROFORMA EKRANI — özet şerit + katlanır bölüm (tasarım denetimi: C yaklaşımı)
   Form kartı ile A4 önizlemesi aynı ölçü kolonuna oturur, ikisi de sola hizalı.
   ========================================================================= */
.pf-stage { max-width: 210mm; }
/* Ana alan + 242px seçim özeti (rehber: masaüstü Proforma) */
.pf-layout { display: grid; grid-template-columns: minmax(0, 1fr) 242px; gap: 14px;
  align-items: start; }
.pf-main { min-width: 0; }
.pf-card { background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-lg); margin-bottom: var(--s4); overflow: hidden;
  box-shadow: var(--shadow-1); }

/* Adım şeridi: 5 eşit sütun (1. satır) + açılan tek panel (2. satır) */
/* Onaylı mockuptaki şerit: adımlar yuvarlak köşeli ayrı parçalardır ve aralarında
   kısa bir bağlayıcı çizgi bulunur (alt çizgi değil). */
.pf-steps { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--s2); padding: 7px; }
.pf-step { grid-row: 1; position: relative;
  display: grid; grid-template-columns: 26px minmax(0, 1fr) 18px;
  gap: var(--s2); align-items: center; min-width: 0; min-height: 52px; padding: 7px 8px;
  background: none; border: none; border-radius: var(--radius);
  font: inherit; text-align: left; cursor: pointer; }
.pf-step + .pf-step::before { position: absolute; top: 50%; left: -10px; width: 8px; height: 1px;
  background: var(--line-strong); content: ""; }
/* Tamamlanan adım hafif yeşile döner; açık adım her zaman önde gelir (aşağıda). */
.pf-step.tamam { background: var(--up-soft); }
.pf-step.tamam .pf-no { background: var(--pri); color: var(--on-pri); }
.pf-step.son { border-right: none; }
.pf-copy { min-width: 0; }
.pf-no { display: grid; place-items: center; width: 24px; height: 24px; border-radius: 50%;
  background: var(--step-bg); color: var(--step-ink); font-size: var(--fs-2xs); font-weight: 800; }
.pf-no.ok { background: var(--pri); color: var(--on-pri); }
.pf-step .k { display: block; margin-bottom: 1px; font-size: var(--fs-2xs); font-weight: 800;
  color: var(--ink); }
.pf-step .v { display: block; max-width: 100%; font-size: var(--fs-3xs); line-height: 1.3;
  color: var(--mut); font-weight: 650; overflow: hidden; text-overflow: ellipsis;
  white-space: nowrap; }
.pf-step .v.bos { color: var(--mut); font-weight: 400; }
.pf-step .tik { color: var(--ok); flex: none; }
.pf-step:hover { background: var(--surface); }
.pf-step.tamam:hover { background: var(--ok-soft-hover); }
.pf-step.acik, .pf-step.tamam.acik { background: var(--panel-tint);
  box-shadow: inset 0 0 0 1px var(--pri-mid), var(--focus-ring-soft); }
.pf-step.acik .pf-no { background: var(--pri); color: var(--on-pri); }
.pf-step.kilitli, .pf-step:disabled { cursor: default; background: none; }
.pf-step.kilitli:hover { background: none; }
.pf-panel { grid-row: 2; grid-column: 1 / -1; padding: var(--s4) var(--s4) var(--s5);
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }

/* Seçim özeti kartı */
.summary-card { position: sticky; top: calc(var(--topbar-h) + 12px); margin-bottom: 0; }
.summary-card .card-header h2 { font-size: var(--fs-md); }
.sum-item { padding-bottom: 9px; margin-bottom: 9px; border-bottom: 1px solid var(--line); }
.sum-item .eyebrow { display: block; }
.sum-item strong { display: block; margin-top: 2px; font-size: var(--fs-xs); }
.sum-total { margin-top: var(--s3); padding-top: 12px; border-top: 1px solid var(--line-strong); }
.sum-total > span { display: block; color: var(--mut); font-size: var(--fs-2xs); }
.sum-total > strong { display: block; margin-top: 3px; font-size: 18px; letter-spacing: -.02em;
  font-variant-numeric: tabular-nums; }
.sum-cikti { margin: 3px 0 0; font-size: var(--fs-xs); color: var(--mut); }

/* Alanlar: her satırda aynı sütun rayı */
.pf-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: var(--s4); }
.pf-fields > div { min-width: 0; }
/* Onay/radyo kutuları hariç: `width: 100%` bunlara da uygulanınca kutu satırın
   tamamını kaplıyor ve yanındaki etiketi (ör. "Peşin ödeme") sağ kenara itip
   sarmasına yol açıyordu. */
.pf-fields input:not([type=checkbox]):not([type=radio]), .pf-fields select { width: 100%; }
.pf-lbl { display: block; margin-bottom: var(--s1); font-size: var(--fs-xs);
  text-transform: uppercase; letter-spacing: .04em; color: var(--mut); }
.pf-opt { display: flex; align-items: center; gap: var(--s2); margin-bottom: var(--s1);
  font-size: var(--fs-md); color: var(--ink); }
.pf-opt.kapali { opacity: .55; }
/* İş kuralı taşıyan metin en küçük punto olmaz */
.pf-kural { margin-top: var(--s2); font-size: var(--fs-md); color: var(--ink); }
.pf-kural.err { color: var(--neg); }
.pf-row { display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap; margin-top: var(--s2); }
.pf-row .hint { margin-top: 0; }
.pf-row-end { justify-content: flex-end; margin-top: var(--s4); }
.pf-row-end .muted { margin-right: auto; font-size: var(--fs-md); }

/* Aksiyon şeridi: çıktı türü solda, butonlar sağda */
.pf-actions { display: flex; align-items: flex-end; gap: var(--s5); flex-wrap: wrap;
  padding: var(--s4); background: var(--surface); }
.pf-actions .sag { display: flex; align-items: center; gap: var(--s4); margin-left: auto; }
.pf-warn { padding: 0 var(--s4) var(--s4); background: var(--surface);
  font-size: var(--fs-md); color: var(--warn); }

/* Önizleme sahnesi: belgenin kendi bağlamı */
.pf-stage { border-top: 1px solid var(--line); padding-top: var(--s4); overflow-x: auto; }
.pf-stage-head { display: flex; align-items: center; gap: var(--s3); flex-wrap: wrap;
  margin-bottom: var(--s3); }
.pf-stage-head .t { font-size: var(--fs-lg); font-weight: 600; }
.pf-stage-head .n { font-size: var(--fs-md); color: var(--mut); }
.pf-tabs { display: flex; gap: var(--s1); margin-left: auto; }
.pf-tab { display: inline-flex; align-items: center; height: var(--ctl-h); padding: 0 var(--s3);
  border: 1px solid var(--line-strong); border-radius: var(--radius); background: var(--panel);
  color: var(--mut); font: inherit; font-size: var(--fs-md); cursor: pointer; }
.pf-tab.on { background: var(--pri); border-color: var(--pri-ink); color: var(--on-pri); }
.pf-stage .a4 { margin: 0 0 var(--s4); }   /* ortalama yok: kartın sol kenarına oturur */
.pf-doc.off { display: none; }             /* sekmeyle gizlenen belge — yazdırmada geri gelir */
.pf-empty { border: 1px dashed var(--line-strong); border-radius: var(--radius-lg);
  padding: var(--s5); background: var(--panel); }
.pf-empty .t { font-size: var(--fs-lg); font-weight: 600; margin-bottom: var(--s2); }
.pf-empty ul { margin: 0 0 var(--s2) var(--s4); font-size: var(--fs-md); }
.pf-empty li { margin-bottom: var(--s1); }
.a4 .pf-desc { display: block; margin-top: var(--s1); font-size: var(--fs-xs); color: var(--mut); }

/* BELGE (tema dışı) */
/* =========================================================================
   BELGE ÇIKTILARI — kurumsal kırmızı yalnızca burada
   ========================================================================= */
.proforma { background: #fff; border: 1px solid var(--line); border-radius: var(--radius-lg);
  padding: var(--s6); margin-bottom: var(--s5); max-width: 780px; }
.pf-letterhead { display: grid; grid-template-columns: 240px 1fr auto; gap: var(--s5);
  align-items: center; border-bottom: 3px solid var(--brand); padding-bottom: var(--s3);
  margin-bottom: var(--s4); }
.pf-logo { display: flex; align-items: center; height: 96px; }
.pf-logo img { max-height: 96px; max-width: 240px; object-fit: contain; }
.pf-logo-ph { display: flex; align-items: center; justify-content: center; width: 100%;
  height: 100%; border: 1px dashed var(--line); border-radius: var(--radius-sm);
  color: var(--mut); font-size: var(--fs-sm); letter-spacing: .1em; }
.proforma table tr { background: #fff; }
.proforma tbody td { border-bottom: 1px solid var(--brand-line); }
.proforma tbody tr:last-child td { border-bottom: 1px solid var(--brand); }
.proforma tbody tr:hover { background: #fdf6f6; }
.proforma thead th { color: var(--brand); background: transparent; position: static;
  box-shadow: inset 0 -2px 0 var(--brand-soft); }
.proforma .price-big { color: var(--brand); }
.pf-org-name { font-size: var(--fs-lg); font-weight: 700; letter-spacing: .03em; color: var(--brand); }
.pf-meta { text-align: right; font-size: var(--fs-md); }
.pf-title { font-size: var(--fs-lg); font-weight: 700; letter-spacing: .06em; text-align: center;
  padding: var(--s2) 0 var(--s3); color: var(--brand); }
.pf-foot { border-top: 2px solid var(--brand); padding-top: var(--s2); font-size: var(--fs-md);
  display: flex; justify-content: space-between; align-items: baseline; gap: var(--s3); }
.pf-table { margin-bottom: var(--s4); }
.pf-table th { width: 190px; text-transform: none; font-size: var(--fs-md); color: var(--ink);
  font-weight: 600; vertical-align: top; position: static; background: transparent;
  box-shadow: none; }
.pf-table td { white-space: normal; }
.pf-table tr.pf-total th, .pf-table tr.pf-total td { border-top: 2px solid var(--brand);
  font-weight: 700; font-size: var(--fs-lg); color: var(--brand); }
.pf-price { text-align: center; padding: var(--s4) 0; border-top: 2px solid var(--brand);
  border-bottom: 2px solid var(--brand); margin-bottom: var(--s3); background: var(--brand-soft); }
.pf-note { font-size: var(--fs-md); color: var(--mut); margin-bottom: var(--s3); }

/* =========================================================================
   A4 BELGE — tam 210 × 297 mm. Kurumsal kırmızı yalnız logo, ana antet çizgisi
   ve ince bölüm işaretlerinde; FİYAT ALANI KIRMIZI DEĞİL: açık nötr zemin,
   lacivert üst çizgi ve en fazla 18pt lacivert tutar.
   ========================================================================= */
/* Sayfa dikey esnek kolondur: gövde büyür, altbilgi her zaman en altta kalır.
   Mutlak konumlu altbilgi uzun içerikte metnin üstüne biniyordu. */
.a4 { position: relative; display: flex; flex-direction: column;
  background: #fff; width: 210mm; min-height: 297mm;
  margin: 0 auto var(--s5); padding: 18mm 18mm 16mm;
  box-shadow: 0 16px 46px rgba(11, 34, 55, .18);
  color: #1c2733; font-family: Arial, Helvetica, sans-serif; font-size: 10.5pt;
  line-height: 1.35; overflow-x: hidden; }
.a4-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 18mm; }
/* `contain` geniş logoyu 20mm'lik kutusunda dikeyde ortalıyordu; görünen logonun üstü
   sağdaki Tarih/Belge No bloğundan aşağıda kalıp antet hizasız görünüyordu.
   `object-position: left top` logoyu kutusunun tepesine oturtur. */
.a4-logo { height: 20mm; max-width: 70mm; object-fit: contain; object-position: left top; }
.a4-meta { display: grid; grid-template-columns: auto auto; gap: 3px 12px;
  font-size: 9pt; text-align: right; }
.a4-meta .k { color: #596b7b; }
.a4-stripe { height: 2px; background: var(--brand); margin: 8mm 0 6mm; }
.a4-body { flex: 1 1 auto; min-width: 0; }
.a4-title { margin: 0 0 6mm; color: var(--navy-deep); font-size: 16pt; font-weight: 700;
  letter-spacing: .08em; text-align: center; text-transform: uppercase; }
/* Bölüm işareti: yalnız 2px kırmızı sol çizgi */
.a4-sec { margin-top: 6mm; }
.a4-sec > p { margin: 0; }
.a4-sec-title { margin: 0 0 3mm; padding: 0 0 2mm 2.5mm; border-bottom: 1px solid #d8dee3;
  border-left: 2px solid var(--brand); color: var(--navy); font-size: 10.5pt; font-weight: 800;
  letter-spacing: .06em; text-transform: uppercase; }
/* Kapsam satırı: uzun hizmet listesi sarabilmeli */
.a4-kapsam dd { white-space: normal; }
.a4-info { display: grid; grid-template-columns: 46mm minmax(0, 1fr);
  border-top: 1px solid #d8dee3; margin: 0; }
.a4-info dt, .a4-info dd { margin: 0; padding: 2mm 3mm; border-bottom: 1px solid #d8dee3; }
.a4-info dt { font-weight: 700; }
.a4-care { display: grid; grid-template-columns: repeat(3, 1fr); gap: 3mm; }
.a4-care-item { padding: 2.5mm 3mm; border: 1px solid #d8dee3; }
.a4-care-item span { display: block; color: #687887; font-size: 8pt; text-transform: uppercase; }
.a4-care-item strong { font-size: 10pt; }
/* Fiyat paneli: nötr yüzey + lacivert üst çizgi (kırmızı kullanılmaz) */
.a4-price { margin-top: 6mm; padding: 5mm; border: 1px solid #d8dee3;
  border-top: 2px solid var(--navy); background: #f7f9fc; text-align: center; }
.a4-price .label { display: block; color: #596b7b; font-size: 9.5pt; }
.a4-price strong { display: block; margin: 2mm 0 1mm; color: var(--navy-deep); font-size: 18pt;
  line-height: 1.1; font-variant-numeric: tabular-nums; }
.a4-price .alt { display: block; color: #596b7b; font-size: 9pt; }
.a4-price s { color: #7b8b99; }
.a4-note { margin-top: 4mm; padding: 3mm 4mm; border-left: 3px solid var(--navy);
  background: #f7f9fc; font-size: 9.5pt; }
.a4-table { width: 100%; border-collapse: collapse; font-size: 9.5pt; table-layout: auto; }
/* Belge tablosu 210mm'ye SIĞMAK ZORUNDA: kaydırma çubuğu yoktur, taşan sütun basılmaz.
   Metin sütunları gerektiğinde sarar; tutar sütunları bölünmez. */
.a4-table td:not(.num), .a4-table th:not(.num) { white-space: normal; }
/* Çok sütunlu belge tablosu (staff hekim fiyat listesi: 5 tarife sütunu) */
.a4-table.dar { font-size: 7.5pt; }
.a4-table.dar th, .a4-table.dar td { padding: 1.6mm 1.2mm; }
/* v2 özel listede İndirim sütunu da çıkınca 7 sayı sütunu 210mm'yi aşıyordu
   (27.10 ölçüldü): başlıklar sarar, sayı hücrelerinin yan boşluğu daralır. */
.a4-table.dar th { white-space: normal; vertical-align: bottom; }
.a4-table.dar td.num, .a4-table.dar th.num { padding-left: .8mm; padding-right: .8mm; }
.a4-table th { padding: 2.5mm; border-bottom: 2px solid var(--navy); background: transparent;
  color: var(--navy); font-size: 8pt; text-align: left; text-transform: uppercase;
  position: static; letter-spacing: .04em; }
.a4-table td { padding: 2.5mm; border-bottom: 1px solid #d8dee3; white-space: normal;
  vertical-align: top; font-size: 9.5pt; }
.a4-table .total-row td { border-top: 2px solid #1c2733; border-bottom: none; font-weight: 800; }
.a4-table tbody tr:nth-child(even), .a4-table tbody tr:hover { background: transparent; }
.a4-table .num { font-variant-numeric: tabular-nums; }
.a4 .pf-desc { display: block; margin-top: 1mm; color: #687887; font-size: 8.5pt; }
.a4-sign { margin-top: 4mm; font-size: 9pt; color: #687887; text-align: right; }
/* Kurum içi işareti — sağ üstte, lacivert çerçeve */
.a4-stamp { display: inline-flex; padding: 2mm 4mm; border: 1px solid var(--navy);
  color: var(--navy); font-size: 9pt; font-weight: 800; letter-spacing: .08em;
  text-transform: uppercase; margin-bottom: 3mm; }
/* Baskıda her sayfanın altına düşen sayfa numarası (JS yerleştirir; Chrome
   `counter(page)` desteklemediği için konum baskı anında hesaplanır). */
.a4-sayfa-no { display: none; }
@media print {
  .a4-sayfa-no { display: block; position: absolute; left: 0; right: 0;
    text-align: center; font-size: 8pt; color: #8091a1; }
}
.a4-foot { display: flex; justify-content: space-between; gap: 12mm; margin-top: 6mm;
  border-top: 1px solid #d8dee3; padding-top: 4mm; color: #657586; font-size: 8.5pt; }
.a4-foot .a4-mobile { color: var(--navy); font-weight: 700; }
.a4 table tr { background: #fff; }

/* Henüz yeniden tasarlanmamış belgeler (doktor fiyat listesi, proforma yeniden
   yazdırma) aynı A4 çerçevesini paylaşır. Belge kuralı gereği fiyat yüzeyleri
   burada da kırmızı değil lacivert/nötr olur. */
.a4 .pf-title { margin: 0 0 6mm; color: var(--navy-deep); font-size: 14pt; font-weight: 700;
  letter-spacing: .06em; text-align: center; text-transform: uppercase; padding: 0; }
.a4 .pf-table { margin-bottom: 6mm; }
.a4 .pf-table th { width: 46mm; color: #1c2733; font-weight: 700; text-transform: none;
  font-size: 9.5pt; background: transparent; box-shadow: none; position: static;
  border-bottom: 1px solid #d8dee3; padding: 2.5mm 3mm; }
.a4 .pf-table td { font-size: 9.5pt; padding: 2.5mm 3mm; border-bottom: 1px solid #d8dee3;
  white-space: normal; }
.a4 .pf-table tr.pf-total th, .a4 .pf-table tr.pf-total td {
  border-top: 2px solid #1c2733; border-bottom: none; color: var(--navy-deep);
  font-weight: 800; font-size: 11pt; }
.a4 .pf-items { margin-bottom: 6mm; }
.a4 .pf-items thead th { color: var(--navy); background: transparent; position: static;
  box-shadow: none; border-bottom: 2px solid var(--navy); font-size: 8pt; padding: 2.5mm; }
.a4 .pf-items tbody td { border-bottom: 1px solid #d8dee3; font-size: 9.5pt;
  white-space: normal; vertical-align: top; padding: 3mm 2.5mm; }
.a4 .pf-items td:first-child { width: 45%; }
.a4 .pf-price { margin: 7mm 0 5mm; padding: 5mm; border: 1px solid #d8dee3;
  border-top: 2px solid var(--navy); background: #f7f9fc; text-align: center; }
.a4 .price-big { color: var(--navy-deep); font-size: 18pt; }
.a4 .pf-note { font-size: 9pt; color: #687887; margin-bottom: 4mm; }
.a4 .pf-sign { font-size: 9pt; color: #687887; text-align: right; }

/* Paket ekranından gelen proformada sabit seçim şeridi */
.locked-head { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s2);
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius);
  padding: var(--s3) var(--s4); }

/* BELGE SONU */
/* =========================================================================
   Küçük laptop ve mobil
   ========================================================================= */
@media (max-width: 1280px) {
  main { padding: var(--s4); }
  .grid2 { gap: var(--s3); }
}
@media (max-width: 1100px) {
  .grid2 { grid-template-columns: 1fr; }
  /* Paket Oluşturucu: seçim şeridi sarar, canlı hesap paneli daralır */
  .builder-sel { grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); }
  .builder-layout { grid-template-columns: minmax(0, 1fr) 340px; }
  .pf-layout { grid-template-columns: minmax(0, 1fr) 226px; }
}
/* Tablet genişliğinde sağ paneller alta iner; yatay taşma olmaz */
@media (max-width: 900px) {
  .karsi { grid-template-columns: 1fr; }
  .builder-layout, .pf-layout { grid-template-columns: minmax(0, 1fr); }
  .calc-panel, .summary-card { position: static; }
}

/* Mobil eşiği 700px: bu genişliğin altında menü kayan panele döner (rehber §Mobil 390px) */
@media (max-width: 700px) {
  html, body { overflow-x: clip; }
  .sidebar { position: fixed; top: 0; left: 0; z-index: 60; width: 270px; height: 100vh;
    box-shadow: var(--shadow-nav); }
  .nav-closed .sidebar { margin-left: -270px; box-shadow: none; }
  main { padding: 14px 12px 34px; }
  h1 { font-size: var(--fs-2xl); }
  h2 { font-size: var(--fs-lg); }
  /* Dokunma hedefleri en az 44px (rehber: erişilebilirlik) */
  .nav-item { min-height: 44px; }
  .nav-head { min-height: 44px; padding-top: var(--s3); padding-bottom: var(--s3); }
  .btn, .btn.sm { height: 44px; padding: 0 var(--s4); }
  .nav-toggle { width: 44px; height: 44px; }
  .tab { height: 44px; }
  summary { min-height: 44px; display: flex; align-items: center; }
  .link-btn { display: inline-flex; align-items: center; min-height: 44px; }
  input, select, textarea { height: 44px; font-size: 16px; }
  input[type=checkbox], input[type=radio] { width: 20px; height: 20px; }
  /* Kalan (Task 8) ekranlardaki geniş tablolar kendi kutusunda kayar */
  main table { display: block; overflow-x: auto; white-space: nowrap; }
  main table.summary, main table.no-scroll { display: table; white-space: normal; }
  th { position: static; }
  .pf-crumb { min-width: 130px; flex: 1 1 45%; }
  .page-head { display: block; }
  .page-actions { flex-wrap: wrap; justify-content: flex-start; margin-top: var(--s3); }
  .tabs { overflow-x: auto; }
  .tab { flex: 0 0 auto; padding: 0 var(--s3); }
  .hide-sm { display: none !important; }
  .only-sm { display: revert !important; }
  /* Liste ekranı: tablo ve çekmece yerine kayıt kartları */
  .list-layout { display: block; }
  .rec-list.only-sm { display: grid !important; }
  .filterbar { grid-template-columns: minmax(0, 1fr) auto; padding: var(--s2); }
  .filterbar .f-ara, .filter-more { grid-column: 1 / -1; }
  .filterbar .f-ara label { position: absolute; width: 1px; height: 1px;
    overflow: hidden; clip-path: inset(50%); }
  .filterbar .f-btn { grid-column: 1 / -1; }
  .filterbar .f-btn .btn { flex: 1; }
  .table-foot { flex-direction: column; align-items: flex-start; gap: var(--s1); }
  /* Paket detayı: iki sütun tek kolona iner, fiyatlar kırpılmaz */
  .detail-grid { grid-template-columns: 1fr; gap: 10px; }

  /* ---- Paket Oluşturucu: akordeon + sekme + sabit alt çubuk ---- */
  .builder-sel { grid-template-columns: 1fr 1fr; padding: 9px 10px; }
  .builder-sel > div:nth-child(2) { grid-column: 1 / -1; grid-row: 1; }
  .builder-layout { display: block; }
  .mobil-tabs { display: flex !important; margin-bottom: 8px; background: var(--panel); }
  .mobil-tabs .tab { flex: 1; justify-content: center; }
  /* Sekme seçimi: gövdedeki sınıf hangi panelin açık olduğunu belirler */
  .calc-panel { position: static; display: none; }
  body.hesap-acik .calc-panel { display: block; }
  body.hesap-acik .builder-main { display: none; }
  .svc-group { border-radius: var(--radius); box-shadow: none; }
  .svc-group > summary { min-height: 44px; }
  /* Katsayılı satır: Dahil + Hizmet + Adet/Gece görünür kalır */
  .svc-table colgroup, .svc-table thead { display: none; }
  .svc-table tr { display: grid; grid-template-columns: 44px minmax(0, 1fr) 76px;
    align-items: center; gap: var(--s2); padding: 8px 10px;
    border-bottom: 1px solid var(--line); }
  .svc-table tr:last-child { border-bottom: 0; }
  .svc-table td { height: auto; padding: 0; border: 0; }
  .svc-table td:nth-child(1) { grid-column: 1; grid-row: 1 / 3; }
  .svc-table td:nth-child(2) { grid-column: 2; grid-row: 1 / 3; min-width: 0; }
  .svc-table td:nth-child(4), .svc-table td:nth-child(5) { display: none; }
  .svc-table td:nth-child(3) { grid-column: 3; grid-row: 1 / 3; }
  .svc-table td:nth-child(3)::before { display: block; margin-bottom: 2px; color: var(--mut);
    font-size: var(--fs-3xs); font-weight: 700; content: "Adet / Gece"; }
  /* Doğrudan fiyatlı satır: Tutar (TL) ve İndirim % etiketleriyle görünür */
  .direct-table colgroup, .direct-table thead { display: none; }
  .direct-table tr { display: grid; grid-template-columns: 44px minmax(0, 1fr) 92px;
    align-items: center; gap: var(--s2);
    padding: 9px 10px; border-bottom: 1px solid var(--line); }
  .direct-table td { height: auto; padding: 0; border: 0; }
  /* Hücre sırası: 1 DAHİL ANAHTARI · 2 hizmet · 3 tutar · 4 indirim · 5 boş.
     2026-08-17'de bu satırlara "Dahil" onay kutusu eklendi, ama buradaki kural
     hâlâ 1. hücreyi BOŞ sayıp gizliyordu (yorumu da öyle diyordu). Sonuç: mobilde
     anahtar hiç görünmüyor, hizmet açılamıyor, tutar alanı sonsuza kadar pasif
     kalıyordu — kullanıcı bildirimi 2026-08-19: *"mobilde doğrudan fiyatlı
     hizmetlerde tutar alanı pasif, giremiyorum."* */
  .direct-table td:nth-child(5) { display: none; }
  .direct-table td:nth-child(1) { grid-column: 1; grid-row: 1 / 3; text-align: left; }
  .direct-table td:nth-child(2) { grid-column: 2; grid-row: 1 / 3; min-width: 0; }
  .direct-table td:nth-child(3) { grid-column: 3; grid-row: 1; }
  .direct-table td:nth-child(4) { grid-column: 3; grid-row: 2; }
  .direct-table td:nth-child(3)::before, .direct-table td:nth-child(4)::before {
    display: block; margin-bottom: 2px; color: var(--mut); font-size: var(--fs-3xs); font-weight: 700; }
  .direct-table td:nth-child(3)::before { content: "Tutar (₺)"; }
  .direct-table td:nth-child(4)::before { content: "İndirim %"; }
  /* Doktor payı satırında 4. hücre indirim değil oran: etiketi ayrı */
  .direct-table tr.dr-pay-satir td:nth-child(4)::before { content: "Dr. payı %"; }
  /* Sade proforma listesi mobilde: etiketler iki satıra düşüyordu (kullanıcı
     bildirimi 2026-08-19). Etiket sütunu daraltılıp puntosu bir kademe küçültüldü;
     DEĞER sütunu tam puntoda kalır — okunması gereken asıl şey tutarlardır. */
  .imza-liste td:first-child { width: 44%; font-size: var(--fs-sm); line-height: 1.25;
    color: var(--mut); padding-right: var(--s2); }
  .imza-liste td.num { width: 56%; }
  .imza-liste .svc-meta { display: block; }
  .svc-ctl { height: 40px; font-size: 16px; }
  /* Dokunma hedefi: anahtarın tıklanabilir alanı 44px'e çıkar */
  .switch { padding: 12px 5px; margin: -12px -5px; box-sizing: content-box; }
  .sticky-bar { display: flex !important; }
  main { padding-bottom: 84px; }   /* sabit çubuk içeriği örtmesin */
  .final-price { flex-direction: column; align-items: flex-start; gap: var(--s1); }
  .final-price strong { font-size: var(--fs-xl); white-space: normal;
    overflow-wrap: anywhere; }
  .summary td.num { overflow-wrap: anywhere; white-space: normal; }
  .section-head { margin-top: var(--s5); }
}
/* Orta genişlikte çekmece alta iner (rehber: 1100px altı tek sütun) */
@media (max-width: 1100px) {
  .list-layout { grid-template-columns: minmax(0, 1fr); }
  .detail-drawer { position: static; }
}

@media (max-width: 560px) {
  /* `.topbar-user { display: none }` BURADA YAZILIYDI ama hiç çalışmadı: bir üstteki
     `.topbar-actions a { display: inline-flex }` kuralı daha ÖZGÜL (0,1,1 > 0,1,0) ve
     medya sorgusu özgüllüğü değiştirmez. Kullanıcı adı ve rol rozeti dar ekranda
     çubuktan taşıp kırpılıyordu (2026-08-21'de ölçüldü: rozetin sağ kenarı 485px,
     ekran 390px). Kimin girdiği bilgisi KALSIN istiyoruz — bu yüzden gizlemek yerine
     sığdırılır: rol rozeti düşer (rol zaten sol menünün altında yazıyor), ada daha
     çok yer verilir. Bildirim düğmesi de ≤700px'te yalnız ikon olur. */
  .topbar-actions .topbar-user .badge { display: none; }
  .topbar-user { max-width: 26vw; }
  /* Zil · rehber · destek dar ekranda 32px; başlık kalan yeri alır */
  .topbar-actions .topbar-ikon { width: 32px; height: 32px; }
  .topbar-actions .topbar-ikon svg { width: 16px; height: 16px; }
  .topbar-title { flex: 1; min-width: 0; }
  .topbar { padding: 0 var(--s3); gap: var(--s2); }
  .topbar-actions { gap: var(--s2); }
  .frm, .filterbar { grid-template-columns: 1fr; }
  .stats { grid-template-columns: 1fr 1fr; }
  /* Tek sayıda kutu: sonuncu yarım satırda yalnız kalmasın, tam satır olsun */
  .stats > .stat:last-child:nth-child(odd) { grid-column: 1 / -1; }
  /* Proforma özeti: etiketler kısa, değerler uzun ("OP. DR. AHMET STAFF"); yarı yarıya
     bölünce değer iki satıra kırılıyordu — değere daha çok yer. Yalnız bu liste:
     paket özetinde tersi geçerli (etiket uzun, değer kısa). */
  .summary.imza-liste td:first-child { width: 38%; }
  .summary.imza-liste td.num { width: 62%; }
  .price-big, .stat .v { font-size: var(--fs-xl); }
  .modal-box { width: 94vw; max-height: 86vh; padding: var(--s4); }
  .formula-row { grid-template-columns: 1fr; gap: var(--s1); }
  .svc-grid, .svc-grid.direct { grid-template-columns: 1fr 1fr; }
  .pf-stage { padding: var(--s3); }
}

/* Proforma şeridi mobilde dikey akordiyona döner (adım → hemen altında paneli) */
@media (max-width: 700px) {
  .pf-layout { display: block; }
  .pf-steps { display: block; }
  .pf-step { display: grid; grid-template-columns: 26px minmax(0, 1fr) 16px; width: 100%;
    min-height: 58px; padding: var(--s3) var(--s4); border-right: none; }
  .pf-step .v { white-space: normal; overflow-wrap: anywhere; }
  .pf-panel { padding: 0 var(--s4) var(--s4); border-top: none; }
  .pf-actions { flex-direction: column; align-items: stretch; }
  .pf-actions .sag { width: 100%; margin-left: 0; }
  .pf-actions .sag .btn { flex: 1; }
  /* Belge önizlemesi 210mm sabittir: dar ekranda kendi kutusunda kayar */
  .pf-stage { overflow-x: auto; }
}

/* ---- Yazdırma ---- */
@media print {
  .topbar, .sidebar, .nav-backdrop, .flash, .btn, .no-print { display: none !important; }
  .pf-doc.off { display: block !important; }   /* sekmeyle gizlenen belge de basılır */
  .pf-stage { border: none; padding: 0; max-width: none; overflow: visible; }
  .pf-stage-head { display: none !important; }
  /* NOT: burada bir zamanlar "belge dışındaki her şeyi gizle" kuralı vardı
     (`:not(:has(.pf-stage))`). Kilit gelince gereksizleşti ve ZARARLI oldu:
     `basilamaz-uyari` metnini de gizlediği için kilitli ekranda BOMBOŞ BEYAZ SAYFA
     basılıyordu (kullanıcı bildirimi 2026-08-19). Kaldırıldı. */
  /* HER NÜSHA KENDİ SAYFASINDA BAŞLAR. `.pfd`nin ekranda nüshaları ayıran 24px alt
     boşluğu baskıda da duruyordu: ikinci nüsha 297mm yerine 303,3mm'den başlıyor,
     yani sayfa sınırını ORTASINDAN kesiyordu — kullanıcı bildirimi 2026-08-19:
     *"her A4 yarım kayık şekilde görünüyor"*. Ölçüldü: akış 600,3mm (2 A4 = 594mm).
     Boşluğu sıfırlamak tek başına yetmez, çünkü belge yüksekliği veri uzunluğuna
     göre birkaç mm oynayabiliyor; bu yüzden kırılım AÇIKÇA zorlanır. */
  .pfd { margin: 0 !important; }
  /* Kırılım SONRAKİ nüshanın ÖNÜNE konur. `break-after: always` sonuncudan sonra da
     tetiklenip BOŞ bir sayfa bırakabiliyor; `+` seçicisi yalnız aralara koyar. */
  .pf-doc + .pf-doc { break-before: page; page-break-before: always; }
  /* Tam 297mm'de alt piksel yuvarlaması belgeyi bir sonraki sayfaya taşırabiliyor;
     sayfa kutusu zaten A4 olduğu için 290mm güvenli taban. */
  .pfd { min-height: 290mm; }
  /* Önizleme artık sol sütunun içindedir (onaylı mockuptaki gibi); baskıda ızgara
     kalırsa A4 sütun genişliğine sıkışır. İki kap da bloka döner. */
  .pf-layout, .pf-main { display: block; }
  body { background: var(--panel); }
  main { padding: 0; max-width: none; overflow: visible; }
  .proforma { border: none; padding: 0 0 40px; page-break-after: always; max-width: none; }
  .proforma tbody td { border-bottom: 1px solid #ddd !important; }
  /* Kenar boşluğu SAYFA KUTUSUNDA olmalı: `.a4`'ün kendi padding'i yalnız belgenin
     başında ve sonunda uygulanır, bu yüzden ikinci sayfa kâğıdın en üstünden
     başlıyordu. `@page` marjı her sayfada tekrarlanır. */
  /* Chrome, sayfa marjı 8mm'yi AŞTIĞINDA kendi üstbilgi/altbilgisini (tarih, sekme
     başlığı, ADRES — yani ngrok linki — ve "1/2") o boşluğa basar. Ölçüldü
     (2026-08-20, headless Chrome, 90 satırlık 3 sayfalık tablo): 8mm'de basmıyor,
     9mm'den itibaren basıyor. Kullanıcı isteği: *"doktor liste baskısında ya da
     proformalarda sayfaların altına link basılmasın"*.
     Sayfa kutusu bu yüzden 8mm; belgenin görsel kenar boşluğu `.a4` dolgusundan
     tamamlanır. Dolgunun sol/sağı HER SAYFADA, üstü yalnız ilk sayfada uygulanır —
     ara sayfaların üst/alt boşluğu 8mm'lik sayfa marjıdır. */
  @page { size: A4; margin: 8mm; }
  /* Baskıda min-height tam 297mm olursa alt piksel yuvarlaması belgeyi ikinci
     sayfaya taşırıyor; sayfa kutusu zaten A4 olduğu için 290mm yeterli. */
  /* `overflow: hidden` tek sayfalık belgede güvenliydi ama uzun listede sayfaya
     sığmayan kısmı kırpıyordu; çok sayfalı belge için görünür olmalı. */
  /* Marj artık @page'te; kutu basılabilir alanı doldurur. Genişlik aynı kalır
     (210mm - 2x18mm = 174mm), yalnız her sayfada kenar boşluğu oluşur. */
  .a4 { width: auto; min-height: 0; margin: 0; padding: 10mm 10mm 0; box-shadow: none;
    overflow: visible;
    page-break-after: always; break-after: page;
    -webkit-print-color-adjust: exact; print-color-adjust: exact; }
  .a4:last-of-type { page-break-after: auto; break-after: auto; }
  /* `.a4-table` bu listede DEĞİL: uzun fiyat listesi sayfaya bölünebilmeli.
     Eskiden `break-inside: avoid` yüzünden 29 satırlık tablo tümüyle bir sonraki
     sayfaya itiliyor, ilk sayfa antetten sonra boş kalıyordu. */
  .a4-price, .a4-sec { break-inside: avoid; }
  /* Sayfa bölünürse başlık her sayfada tekrarlanır, satır ortadan bölünmez. */
  .a4-table thead { display: table-header-group; }
  .a4-table tr, .pf-items tr, .proforma tbody tr { break-inside: avoid; page-break-inside: avoid; }
  .a4 .pf-price, .a4 .pf-items thead th, .proforma thead th {
    -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}

/* Bağımlı hizmet, gerektirdiği hizmet seçili değilken kilitli görünür */
tr.locked-row td { color: var(--faint); background: var(--surface-2); }
tr.locked-row td:first-child { box-shadow: inset 2px 0 0 var(--line-strong); }
.req-note { display: inline-block; max-width: 100%; font-size: var(--fs-xs); color: var(--warn);
  background: var(--warn-soft); border-radius: 99px; padding: 1px var(--s2);
  white-space: normal; line-height: 1.35; }
.svc-line.locked-line > * { color: var(--faint); }

/* =========================================================================
   ONAYLI HİBRİT UYGULAMA DÜZELTMELERİ — 2026-08-16
   Yalnızca sunum katmanı: iş alanları, adlar ve veri sözleşmeleri korunur.
   ========================================================================= */

/* Sol menü: onaylı mockuptaki statik grup ritmi ve her satırda ikon izi. */
.nav-group { margin-top: 13px; }
.nav-head { min-height: auto; margin: 0 0 var(--s1); padding: 0 15px;
  color: var(--nav-mut); font-size: var(--fs-3xs); font-weight: 500;
  letter-spacing: .1em; text-transform: uppercase; }
/* `.nav-body { display: block !important }` kuralı buradaydı: grupları kalıcı
   açık tutuyordu. Kullanıcı kararı (2026-08-17) menü başlıklarının açılır menü
   olması yönünde; kural JS'in koyduğu `display: none`'ı ezip kapanmayı
   engellediği için kaldırıldı. */
.nav-item { gap: var(--s3); padding: 7px 15px; }
/* Satır içi SVG ikon (eskiden içi boş kutu yer tutucusuydu) */
.nav-icon { width: 17px; height: 17px; flex: 0 0 17px; opacity: .82; }
.nav-item.on .nav-icon { opacity: 1; }

/* Paketler: masaüstünde dört filtre rayı aynı anda görünür. details yalnız
   mobilde gerçek açılır filtre olarak davranır. */
@media (min-width: 701px) {
  .packages-screen .filterbar { grid-template-columns: repeat(4, minmax(130px, 1fr)) auto;
    padding: var(--s3); margin-bottom: 10px; }
  .packages-screen .filterbar .f-ara { grid-column: 3; grid-row: 1; }
  .packages-screen .filter-toggle { display: none; }
  .packages-screen .filter-more-body { display: contents; }
  .packages-screen .filter-more-body > div:nth-child(1) { grid-column: 1; grid-row: 1; }
  .packages-screen .filter-more-body > div:nth-child(2) { grid-column: 2; grid-row: 1; }
  .packages-screen .filter-more-body > div:nth-child(3) { grid-column: 4; grid-row: 1; }
  .packages-screen .filterbar .f-btn { grid-column: 5; grid-row: 1; align-self: end; }
  .packages-screen .filterbar .f-btn .quiet { padding-inline: var(--s2); }
  /* Ana tabloda ayrıntı çekmecesinde zaten bulunan USD, tarih ve işlemler
     yinelenmez; sekiz veri sütunu rahat ve okunur kalır. */
  .packages-ana .rows .c-usd, .packages-ana .rows .c-ac { display: none; }
}

/* Cari3/Yurtdışı TL — USD ve İşlemler'in aksine (bunlar HER ZAMAN gizli, üstteki
   kural) bunlar gizlenmiyor: kullanıcı isteği 2026-09-07 "yurtdışına kadar
   görsem yeter" — dar ekranda yatay kaydırmayla ulaşılır, aşağıdaki kaydırma
   bölmesi bunun için var. */

/* Kaydırma çubuğu tablonun EN ALTINDA (583 satır sonra) değil, görünen alanın
   hemen altında dursun diye tablo kendi yüksekliğine sahip bir bölme olur —
   kullanıcı isteği 2026-09-07: "scroll barı bulunduğum hizada çıksın en altta
   değil, kendi içinde kaysın". Başlık da bölme içinde sabitlenir (`.table-wrap
   th` genelde bunu `static`e çeker — sayfa geneli yapışkanlığı yatay kaydırmalı
   tabloda satırın üstüne biniyordu; burada üstünü YENİDEN yazıp bölmenin kendi
   tepesine sabitliyoruz). Ortak sınıf — Paketler, Ameliyatlar, Doktorlar, Zam,
   Proforma Kayıtları ve Dashboard'ın son işlemler tablosu kullanır; her ekranın
   üstündeki alan farklı olabileceği için yükseklik ekran sınıfıyla ezilebilir. */
.tablo-bolme { max-height: calc(100vh - 380px); min-height: 320px; overflow-y: auto; }
.tablo-bolme th { position: sticky; top: 0; }

/* Zam: yedi alanlı filtre çubuğu (arama + bölüm + TTB aralığı + fark yönü/eşiği)
   `auto-fit, minmax(224px,1fr)` ızgarasında 224px'lik EN KÜÇÜK ölçüye göre kolon
   sayısı hesaplanıyor; kalan boşluk son alanları 2. satıra düşürüyordu (kullanıcı
   bildirimi 2026-09-07). Flexbox gerçek genişliğe göre sarar: yalnız GERÇEKTEN
   sığmayınca 2. satıra iner. */
@media (min-width: 701px) {
  .bulk-screen .filterbar { display: flex; flex-wrap: wrap; }
  .bulk-screen .filterbar > div { flex: 1 1 170px; }
  .bulk-screen .filterbar > div:has(.f-num-sm) { flex: 0 1 110px; }
  .bulk-screen .filterbar .f-ara { flex: 2 1 260px; }
  .bulk-screen .filterbar .frm-onay, .bulk-screen .filterbar .f-btn { flex: 0 0 auto; }
}

/* Bölüm adı artık ameliyatın altındaki gri satırda (iki katlı hücre): "GENEL CERRAHİ"
   sütunu ve onun 1400px kuralı kalktı. Sayı sütunları kendi ölçüsünü ister. */
.paket-tablo th.c-ttb { width: calc(72px * var(--kol)); }
.paket-tablo th.c-tl { width: calc(108px * var(--kol)); }
.paket-tablo th.c-sec { width: calc(40px * var(--kol)); }
.paket-tablo td { vertical-align: middle; }

.sticky-list-action { display: none; }

/* Proforma tamamlandığında Tarife paneli aktif bir çalışma kartı gibi görünür;
   aksiyon şeridiyle arasında gereksiz beyaz alan oluşmaz. */
.proforma-screen .pf-panel#panel-tarife { padding: 14px 16px; }
.proforma-screen .pf-actions { padding: 12px 16px; }
.proforma-screen .pf-actions .pf-outputs { display: grid; grid-template-columns: auto auto;
  gap: 3px var(--s4); align-items: center; }
.proforma-screen .pf-actions .pf-outputs > .pf-lbl,
.proforma-screen .pf-actions .pf-outputs > .pf-kural { grid-column: 1 / -1; }
.proforma-screen .pf-actions .pf-opt { margin: 0; }

/* NOT: Burada önceden `margin-top: -210px` ile önizleme yukarı çekiliyordu; amaç
   sağdaki uzun Seçim Özeti sütununun altındaki boşluğu kapatmaktı. Ancak boşluğun
   yüksekliği içeriğe göre değişir, sabit -210px ise değişmez: çalışma kartı kısa
   olduğunda önizleme aksiyon şeridinin ÜSTÜNE binip "Hasta için" / "Hastane İçin
   için" onay kutularını tıklanamaz hâle getiriyordu (çıktı türü seçilmeden
   Yazdır/Kaydet açılmadığı için akış tamamen kilitleniyordu).
   Onaylı mockupta bu boşluk hiç oluşmaz; çünkü orada önizleme sol sütunun
   (`stage-main`) son çocuğudur. Kalıcı çözüm önizlemeyi sol sütuna taşımaktır;
   `.pf-stage` baskıda görünmesi gerektiği için `no-print` sarmalayıcısının dışında
   durur ve bu taşıma ayrı bir baskı doğrulaması ister. */

@media (max-width: 700px) {
  /* Paket listesi: üstteki yinelenen eylem kalkar, ana eylem güvenli altta kalır. */
  .packages-screen .page-actions { display: none; }
  .packages-screen .rec-actions { display: none; }
  .packages-screen .filterbar { grid-template-columns: minmax(0, 1fr) auto; }
  .packages-screen .filterbar .f-ara { grid-column: 1; }
  .packages-screen .filter-toggle { grid-column: 2; align-self: end; min-width: 92px;
    height: 44px; justify-content: center;
    padding: 0 var(--s3); border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
    background: var(--panel); color: var(--pri-ink); font: inherit; font-weight: 700; }
  .packages-screen .filter-more-body { display: none; grid-column: 1 / -1;
    grid-template-columns: 1fr; gap: var(--s3); }
  .packages-screen .filterbar.filters-open .filter-more-body { display: grid; }
  .packages-screen .filterbar .f-btn { display: none; grid-column: 1 / -1; }
  .packages-screen .filterbar.filters-open .f-btn { display: flex; }
  .packages-screen .table-foot { display: none; }
  .sticky-list-action { position: fixed; z-index: 31; right: 0; bottom: 0; left: 0;
    display: flex !important; align-items: center; justify-content: space-between; gap: var(--s3);
    padding: 10px 12px; border-top: 1px solid var(--line); background: var(--panel-glass);
    box-shadow: var(--shadow-up); }
  .sticky-list-action strong { display: block; margin-top: 2px; font-size: var(--fs-md); }

  /* Oluşturucu ve Proforma mobilde tek, koyu uygulama başlığı kullanır. */
  .builder-screen .topbar,
  .proforma-screen .topbar { border-bottom-color: var(--nav-line-solid); background: var(--nav-bg); color: var(--nav-brand); }
  /* Başlık ORTALANIR ama yan blokların altına GİRMEZ. Eskiden başlık %100
     genişlikteydi ve iki yan blok mutlak konumluydu; uzun başlık bildirim çipinin
     altına giriyordu (kullanıcı bildirimi 2026-08-19: *"Paketi Düzenle başlığı,
     kullanıcı ismi, kullanıcı türü birbirine girik görünüyor"* — 390px'te ölçüldü).
     Üç kolonlu ızgara yan blokların yerini ayırır, çakışma yapısal olarak imkânsız. */
  .builder-screen .topbar,
  .proforma-screen .topbar { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto;
    align-items: center; }
  .builder-screen .topbar-title,
  .proforma-screen .topbar-title { grid-column: 2; text-align: center; min-width: 0; }
  .builder-screen .topbar .nav-toggle,
  .proforma-screen .topbar .nav-toggle { grid-column: 1; }
  .builder-screen .topbar-actions,
  .proforma-screen .topbar-actions { grid-column: 3; margin-left: 0; }
  .builder-screen .page-head,
  .proforma-screen .page-head { display: none; }

  /* Oluşturucu tablo rayları: dahil, hizmet ve adet/gece tüm gruplarda aynı hizada. */
  .builder-screen .svc-table tr { grid-template-columns: 34px minmax(0, 1fr) 58px; }
  .builder-screen .svc-table td:nth-child(1) { text-align: left; }
  .builder-screen .svc-ctl { width: 64px; }   /* 3 hane sığsın: %100 */
  /* Hizmet notu alanları dar ekranda alt alta; sil düğmesi akışa girsin */
  .not-alan, .not-alan.dar { flex: 1 1 120px; }
  .not-alan.buyuk { flex: 1 1 100%; }
  .not-eylem { flex: 1 1 100%; }
  .not-sil { position: static; margin-top: 6px; }

  /* Proforma mobil: açık adım + özet, belge ise ayrı baskı bağlamında kalır. */
  .proforma-screen .pf-card { border-radius: var(--radius); box-shadow: none; }
  .proforma-screen .pf-panel#panel-tarife { padding: 0 var(--s4) var(--s4); }
  .proforma-screen .pf-actions { padding: var(--s3) var(--s4); }
  .proforma-screen .pf-actions .pf-outputs { grid-template-columns: 1fr; }
  .proforma-screen .pf-actions .pf-outputs > * { grid-column: 1; }
}


/* =========================================================================
   AÇILIR PENCERE — referansın "Kullanıcıyı düzenle" modalı: 520px, radius 14,
   24px dolgu, başlık satırında yuvarlak kapat düğmesi, alanlar iki sütun,
   altta İptal + ana eylem tam genişlikte yan yana. `<dialog>` ile açılır.
   ========================================================================= */
.pencere { position: fixed; inset: 0; margin: auto; width: min(520px, calc(100vw - var(--s6) * 2));
  max-height: 88vh; padding: 0; border: 0; border-radius: 14px; background: var(--panel);
  color: var(--ink); box-shadow: var(--shadow-2); overflow: visible; }
.pencere::backdrop { background: var(--overlay); }
.pencere.genis { width: min(780px, calc(100vw - var(--s6) * 2)); }
/* Gövde kendi içinde kayar; kapat düğmesi pencerenin DIŞINDA, sağ üst köşede sabit —
   uzun pencerede kapatmak için başa kaydırmak gerekmesin (kullanıcı 2026-09-04). */
.pencere-govde { max-height: 88vh; overflow: auto; border-radius: 14px; }
.pencere-kapat { position: absolute; top: -16px; right: -16px; z-index: 2; display: grid;
  place-items: center; width: 36px; height: 36px; border: 1px solid var(--line); border-radius: 999px;
  background: var(--panel); color: var(--ink); box-shadow: var(--shadow-1); cursor: pointer; }
.pencere-kapat:hover { background: var(--step-bg); }
.pencere .svc-duzen-form { padding: 0; margin-top: var(--s4); background: transparent; border: 0; }
.pencere-govde { padding: var(--s5); }
.pencere-baslik { display: flex; align-items: center; justify-content: space-between; gap: var(--s3); }
.pencere-alanlar textarea { width: 100%; }
.pencere-baslik h2 { display: flex; align-items: center; flex-wrap: wrap; gap: var(--s2);
  margin: 0; font-size: var(--fs-lg); }
.pencere-alanlar { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s3); margin-top: var(--s4); }
.pencere-alanlar .alan { display: grid; gap: 6px; min-width: 0; align-content: start; }
.pencere-alanlar .alan.tam { grid-column: 1 / -1; }
.pencere-alanlar input, .pencere-alanlar select { width: 100%; }
.pencere-alanlar .hint { margin: 0; font-size: var(--fs-3xs); }
/* Kaydırmalı seçim kutusu: referansın "Sorumlu olduğu konumlar" listesi */
.secim-kutusu { max-height: 180px; overflow: auto; border: 1px solid var(--line-strong);
  border-radius: var(--radius); }
.secim-kutusu label { display: flex; align-items: center; gap: var(--s3); margin: 0;
  padding: 10px var(--s3); border-bottom: 1px solid var(--step-bg);
  font-weight: 400; font-size: var(--fs-sm); color: var(--ink); cursor: pointer; }
.secim-kutusu label:last-child { border-bottom: 0; }
.secim-kutusu label:hover { background: var(--surface); }
.secim-kutusu input { flex: none; width: 16px; height: 16px; margin: 0; accent-color: var(--pri); }
.secim-bos { display: block; padding: 10px var(--s3); font-size: var(--fs-sm); color: var(--mut); }
.pencere-eylem { display: grid; grid-template-columns: 1fr 1fr; gap: var(--s3); margin-top: var(--s5); }
/* Üç seçenekli şerit (kaydetmeden çıkış uyarısı): iki kolonluk ızgara üçüncü
   düğmeyi alta atıp tam genişliğe yayıyordu. */
.pencere-eylem.uclu { display: flex; flex-wrap: wrap; justify-content: flex-end; }
.pencere-alt { margin: var(--s1) 0 0; font-size: var(--fs-sm); color: var(--mut); }
/* Pencere içinde ikinci bölüm (ör. hesap güvenliği): üst çizgi + küçük büyük harf başlık */
.pencere-bolum { margin-top: var(--s5); padding-top: var(--s4); border-top: 1px solid var(--line); }
.pencere-bolum h3 { margin: 0 0 var(--s2); font-size: var(--fs-3xs); font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase; color: var(--mut); }
.pencere-eylem-satir { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s2); margin-top: var(--s3); }
@media (max-width: 700px) { .pencere-alanlar { grid-template-columns: 1fr; } }

/* =========================================================================
   GİRİŞ EKRANLARI — referans `admin-login`: solda koyu marka paneli (1fr),
   sağda 580px beyaz form paneli; 1024px altında tek sütun (referansın mobil
   varyantı). Ölçüler referansın Tailwind sınıflarından birebir: px-20 py-16 =
   80/64, max-w-[390px], h-[54px] alan ve düğme, 48px ikon kutusu, 48px manşet.
   Renkler yalnız tokendan (tema katmanı kuralı).
   ========================================================================= */
.giris-ekran { display: grid; place-items: center; margin: 0; min-height: 100vh;
  padding: var(--s6) var(--s5); background: var(--bg); }
/* Referans (2026-09-04): 1280px kart, 800px asgari yükseklik, sol %52 / sağ %48.
   Panellerin arasına ÇİZGİ KONMAZ — referansın açık kuralı. */
.giris-sahne { display: grid; grid-template-columns: 52fr 48fr;
  width: min(1280px, 100%); max-width: none; min-height: 800px; padding: 0;
  border-radius: 18px; overflow: hidden; box-shadow: var(--shadow-1);
  background: var(--panel); }

/* ---- sol: marka paneli ---- */
.giris-marka-panel { position: relative; overflow: hidden; display: flex;
  flex-direction: column; align-items: center;
  padding: 115px 56px 52px; text-align: center;
  background: var(--giris-panel); color: var(--giris-panel-ink); }
/* Logo ÜSTTE (referans): panel dikeyde ortalanmaz, künye alta itilir. */
.giris-marka-icerik { display: flex; flex-direction: column; align-items: center; }
.giris-logo { width: 260px; max-width: 100%; height: auto; filter: brightness(0) invert(1); }
.giris-modul { margin: 58px 0 0; font-size: 33px; font-weight: 700; letter-spacing: -.01em; }
.giris-tanim { margin: 14px 0 0; font-size: 18px; line-height: 1.55;
  color: var(--giris-panel-mut); }
/* Filigran: markanın kendi "A" logosu (kullanıcı 2026-09-04 — yazı tipinden
   üretilen A yeterince geometrik durmuyordu). Görsel beyazdır; koyu panelde
   yalnız saydamlıkla silikleşir. Başlıktan daha dikkat çekici OLMAMALI. */
.giris-damga { position: absolute; left: 50%; top: 61%; transform: translate(-50%, -50%);
  width: 400px; max-width: 62%; height: auto; opacity: .04;
  pointer-events: none; user-select: none; }
/* Tek dekoratif yay; grid/nokta deseni yok. */
.giris-yay { position: absolute; right: -150px; top: 220px; width: 260px; height: 720px;
  border: 1px solid var(--giris-yay); border-radius: 50%;
  box-shadow: var(--giris-yay-golge); pointer-events: none; }
.giris-kunye { position: relative; display: grid; gap: 2px; margin-top: var(--s5);
  padding-top: var(--s4); border-top: 1px solid var(--line);
  font-size: var(--fs-2xs); color: var(--mut); text-align: center; }
.giris-kunye strong { color: var(--ink); font-weight: 650; }
.giris-kunye-masaustu { margin: auto 0 0; padding: 0; border: 0; font-size: 13.5px;
  line-height: 1.8; color: var(--giris-panel-mut); }
.giris-kunye-masaustu strong { color: var(--giris-panel-isim); font-weight: 600; }
.giris-telif { margin-top: 16px; }
.giris-form-panel .giris-kunye-mobil { display: none; }

/* ---- sağ: form paneli ---- */
.giris-form-panel { display: flex; flex-direction: column; justify-content: center;
  padding: 64px 80px; background: var(--panel); }
.giris-kutu { width: 100%; max-width: 430px; margin: 0 auto; }
.giris-logo-mobil { display: none; }
.giris-ikon { display: grid; place-items: center; width: 48px; height: 48px;
  border-radius: 13px; background: var(--pri-soft); color: var(--pri); }
.giris-kutu h1 { margin: 26px 0 0; font-size: 36px; line-height: 1.15;
  letter-spacing: -.03em; }
.giris-kutu .sub { margin: var(--s2) 0 0; font-size: var(--fs-md); line-height: 1.6; }
.giris-kutu .flash { margin: var(--s4) 0 0; }
.giris-form { display: grid; gap: 22px; margin-top: 36px; }
.giris-form .alan { display: grid; gap: var(--s2); }
.giris-form label { font-size: var(--fs-sm); font-weight: 600; }
/* Alanlar referanstaki gibi dolgulu: 56px, açık mavi zemin, odakta kırmızı halka. */
.giris-form input:not([type=checkbox]) { width: 100%; height: 56px;
  border: 1px solid var(--giris-alan-cizgi); border-radius: 9px;
  background: var(--giris-alan); font-size: var(--fs-md); }
.giris-form input:not([type=checkbox]):focus { border-color: var(--focus);
  box-shadow: var(--focus-ring-soft); outline: none; }
.etiket-satir { display: flex; align-items: center; justify-content: space-between; }
.giris-baglanti { padding: 0; border: 0; background: none; font: inherit; font-size: var(--fs-sm);
  font-weight: 600; color: var(--pri); cursor: pointer; }
.giris-baglanti:hover { color: var(--pri-ink); text-decoration: underline; }
.alan-ikonlu { position: relative; }
.alan-ikonlu .alan-ikon { position: absolute; left: 16px; top: 50%; transform: translateY(-50%);
  color: var(--faint); pointer-events: none; z-index: 1; }
.alan-ikonlu input { padding-left: 46px; }
.giris-form .parola-goz { background: var(--giris-goster); }
.giris-form .hint { margin: 0; font-size: var(--fs-2xs); line-height: 1.5; }
/* Kutu solda sabit, metin yanında; açıklama metnin altına iner. */
.beni-hatirla { display: flex; align-items: flex-start; gap: var(--s3); font-size: var(--fs-sm);
  font-weight: 600; color: var(--step-ink); cursor: pointer; }
.beni-hatirla input { flex: none; width: 20px; height: 20px; margin: 1px 0 0; accent-color: var(--pri); }
.beni-hatirla .hint { display: block; margin-top: 2px; font-weight: 400; }
.giris-btn { width: 100%; height: 58px; font-size: var(--fs-md); border-radius: 10px; }
.giris-btn.birincil { background: var(--giris-btn); box-shadow: var(--shadow-pri); }
.giris-btn.birincil:hover { transform: translateY(-1px); }
.giris-yardim { margin-top: var(--s5); padding: var(--s4); border: 1px solid var(--line);
  border-radius: var(--radius-lg); background: var(--bg); }
.giris-yardim h2 { margin: 0; font-size: var(--fs-md); }
.giris-yardim .hint { margin-top: var(--s2); }
.giris-yardim .giris-form { margin-top: var(--s4); gap: var(--s4); }
.giris-vazgec { margin-top: var(--s4); text-align: center; }
.totp-kod { font-size: var(--fs-2xl); letter-spacing: .32em; text-align: center;
  font-variant-numeric: tabular-nums; }
.parola-kural { margin: 0; padding-left: var(--s5); font-size: var(--fs-2xs); line-height: 1.6;
  color: var(--mut); }
.giris-bilgi { display: flex; gap: var(--s3); margin-top: 25px; padding: 16px;
  border-radius: 9px; background: var(--bg); color: var(--mut);
  font-size: var(--fs-xs); line-height: 1.65; }
.giris-bilgi svg { flex: none; margin-top: 2px; }
.giris-bilgi p { margin: 0; }
@media (max-width: 1200px) {
  .giris-sahne { width: calc(100vw - 40px); min-height: 720px; }
  .giris-marka-panel { padding: 72px 40px 44px; }
  .giris-form-panel { padding: 56px 48px; }
  .giris-damga { width: 320px; }
}
@media (max-width: 1024px) {
  .giris-ekran { padding: 0; background: var(--panel); }
  .giris-sahne { grid-template-columns: minmax(0, 1fr); width: 100%; min-height: 100vh;
    border-radius: 0; box-shadow: none; }
  .giris-marka-panel { display: none; }
  .giris-form-panel { justify-content: flex-start; padding: 40px var(--s5); }
  .giris-logo-mobil { display: block; width: 190px; height: auto; margin-bottom: 32px; }
  .giris-form-panel .giris-kunye-mobil { display: grid; }
  .giris-kutu h1 { font-size: 30px; }
}
@media (max-width: 600px) {
  .giris-form-panel { padding: 32px 24px; }
}

/* ---------------------------------------------- kullanıcı ve yetki yönetimi */
/* Yetki paneli, Paket Oluşturucu'nun açılır grup + anahtar dilini kullanır;
   ek stil yalnız iki sütunlu tabloya ve okunabilirliğe yöneliktir. */
.yetki-liste { max-width: 900px; }
.yetki-table .c-dahil { width: calc(72px * var(--kol)); }
.yetki-table td { height: 44px; }
.yetki-table .svc-ad { font-size: var(--fs-md); }
.yetki-table tr.locked-row .switch { opacity: .55; cursor: not-allowed; }
.yetki-not { max-width: 900px; margin-top: var(--s4); }
.dahil-sayac { font-variant-numeric: tabular-nums; }

/* Geçici parola: bir kez gösterilir, gözden kaçmaması için vurgulanır */
.gecici-parola { border-color: var(--pri-ink); box-shadow: 0 0 0 3px var(--pri-soft); }
.parola-kutu { margin: var(--s3) 0 0; }
.parola-kutu code { display: inline-block; padding: var(--s2) var(--s4);
  background: var(--surface-2); border: 1px solid var(--line-strong);
  border-radius: var(--radius); font-family: var(--font-mono);
  font-size: var(--fs-xl); font-weight: 700; letter-spacing: .06em;
  user-select: all;   /* tek tıkla seçilip iletilebilsin */ }
.istek-kutu { border-color: var(--warn); }
.istek-kutu h2 { display: flex; align-items: center; gap: var(--s2); }

/* Kullanıcılar — iki katlı hücre (2026-09-03): Kişi (ad / e-posta) · Rol · Son giriş
   (tarih / saat) · Durum (rozet yığını) · İşlemler. Yedi sütunda e-posta dört satıra
   kırılıyordu; ad altına inince sütun kendine yer buluyor. */
.kullanici-tablo { table-layout: fixed; min-width: calc(960px * var(--kol)); }
.kullanici-tablo .c-kisi { width: auto; }
.kullanici-tablo .c-rol { width: calc(176px * var(--kol)); }
.kullanici-tablo .c-giris { width: calc(120px * var(--kol)); }
.kullanici-tablo .c-durum { width: calc(168px * var(--kol)); }
.kullanici-tablo .c-ac { width: calc(320px * var(--kol)); }   /* Parola sıfırla · Pasif yap · ✎ · 🗑 */
.kullanici-tablo td { vertical-align: middle; }
.table-wrap .kullanici-tablo td.tarih { white-space: nowrap; }
.kullanici-tablo td.tarih b { display: block; }
.kullanici-tablo .svc-ad + .badge { margin-left: var(--s1); vertical-align: 2px; }
/* Uzun e-posta bölünmezse tablo taşar; gerekirse kırılır */
.kullanici-tablo .eposta { overflow-wrap: anywhere; }
.kullanici-tablo td .svc-meta { margin-left: 0; }

@media (max-width: 860px) {
  /* İki sütunlu yetki tablosu, altı sütunluk mobil ızgarayı kullanmaz */
  .yetki-table tr { grid-template-columns: 52px minmax(0, 1fr); }
  .yetki-table td:nth-child(2) { grid-column: 2; }
  .yetki-liste, .yetki-not { max-width: none; }
}

/* ------------------------------------------------------------- marka ve sürüm */
/* Menüde logo görseli kullanılmaz (kullanıcı tercihi): kurum adı ve modül adı
   iki satır yazıdır. İki satır da aynı sol kenardan başlar, menü anahtarıyla
   dikeyde ortalanır — kayık görünmemesi için hizalama tek yerde tanımlıdır. */
.brand { display: flex; flex-direction: column; align-items: flex-start;
  justify-content: center; gap: 5px; min-width: 0; text-decoration: none;
  color: inherit; line-height: 1.2; }
/* Beyaz logo (referansın 174px logosu; bizde 132px — satır 56px) */
.brand-logo { display: block; width: 132px; height: auto; filter: brightness(0) invert(1); }
.brand-modul { font-size: var(--fs-3xs); font-weight: 600; letter-spacing: .06em;
  text-transform: uppercase; color: var(--nav-mut); white-space: nowrap; }
.brand:hover .brand-modul { color: var(--nav-ink); }
.userbox .urol { font-size: var(--fs-2xs); color: var(--nav-mut); margin: -2px 0 var(--s2); }
/* Menü altındaki "Hakkında" düğmesi ve açtığı pencere. Künye menüye yazılmıyor:
   dar menüde her satır sarmalanıyordu. Pencere geniş olduğu için isimler bütün durur. */
.hakkinda-ac { display: flex; align-items: center; gap: var(--s2); width: calc(100% - var(--s5));
  margin: var(--s2) var(--s4) var(--s4); padding: var(--s2) var(--s3);
  background: transparent; border: 1px solid var(--nav-line); border-radius: var(--radius);
  color: var(--nav-mut); font: inherit; font-size: var(--fs-2xs); cursor: pointer;
  transition: background var(--t-fast), color var(--t-fast); }
.hakkinda-ac:hover { background: var(--nav-hover); color: var(--nav-ink); }
.hakkinda-ac:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; }
.hakkinda-kutu { position: fixed; inset: 0; margin: auto; height: fit-content;
  width: min(420px, calc(100vw - var(--s5) * 2)); padding: var(--s5);
  border: 1px solid var(--line); border-radius: var(--radius-lg); background: var(--panel);
  color: var(--ink); box-shadow: var(--shadow-2); }
.hakkinda-kutu::backdrop { background: var(--overlay); }
.hakkinda-kutu h2 { margin: 0 0 var(--s4); font-size: var(--fs-lg); }

/* Rol kartı başlığı: rol adı asla iki satıra düşmez, açıklama kendi satırında */
.yetki-liste > .svc-group > summary { flex-direction: column; align-items: flex-start;
  gap: 3px; }
.yetki-liste .svc-group-ad { white-space: nowrap; }
.yetki-liste .svc-group-not { font-weight: 550; white-space: normal; line-height: 1.45; }



/* Künye listesi: etiket üstte küçük, isim altında bütün — hiçbir metin kutudan taşmaz */
.hakkinda-liste { display: grid; gap: var(--s3); margin: 0; }
.hakkinda-liste dt { color: var(--mut); font-size: var(--fs-2xs); letter-spacing: .05em;
  text-transform: uppercase; }
.hakkinda-liste dd { margin: 2px 0 0; font-weight: 700; font-size: var(--fs-md);
  overflow-wrap: anywhere; }
.hakkinda-kutu .hint { margin: var(--s4) 0 var(--s4); }
.hakkinda-kutu form { display: flex; justify-content: flex-end; }
.badge.act-giris { background: var(--ok-soft); color: var(--ok); }
.badge.act-cikis { background: var(--surface-2); color: var(--mut); }
.badge.act-giris_hatali { background: var(--neg-soft); color: var(--neg); }
/* Bölüm satırı işlemleri: butonlar tek hizada, dar ekranda alt alta değil yan yana */
.dep-islem { display: flex; flex-wrap: wrap; gap: var(--s2); justify-content: flex-end; }
.dep-islem .btn { white-space: nowrap; }

/* ---------------------------------- hizmet düzenleme paneli (satır altı, tam genişlik) */
/* Eskiden form 11 kolonlu tablonun en dar hücresine sıkışıyordu: alanlar etiketsiz ve
   88px genişlikteydi, ne işe yaradıkları anlaşılmıyordu. Artık satırın altında tam
   genişlikte, üç anlam bloğuna ayrılmış olarak açılır. */
.duzen-satir > td { padding: 0; background: var(--surface); }
/* `.duzen-govde`: aynı panel, tek form yerine birkaç ayrı form içerdiğinde
   (Kullanıcılar) sarmalayıcı div olur — form iç içe geçemez. */
.svc-duzen-form, .duzen-govde { padding: var(--s4) var(--s4) var(--s5);
  border-left: 3px solid var(--pri); }
.duzen-baslik h3 { margin: 0; font-size: var(--fs-lg); }
.duzen-baslik .hint { margin: 2px 0 var(--s4); }
.duzen-blok { margin: 0 0 var(--s4); padding: var(--s4); border: 1px solid var(--line);
  border-radius: var(--radius); background: var(--panel); }
.duzen-blok > legend { padding: 0 var(--s2); font-size: var(--fs-sm); font-weight: 700;
  color: var(--pri-ink); }
/* Alan başına açıklama olduğu için hücreler farklı yükseklikte: alta hizalanırsa
   (varsayılan `.frm` davranışı) etiket ve kutular kayık durur. Panelde üste hizalanır. */
.duzen-blok .frm { grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  align-items: start; }
.duzen-blok .frm .hint { margin-top: 3px; }
.duzen-formul { margin: var(--s3) 0 0; padding: var(--s3);
  background: var(--pri-soft); border-radius: var(--radius);
  font-size: var(--fs-sm); color: var(--pri-ink); }
.duzen-formul span[hidden] { display: none; }
.duzen-anahtarlar { display: flex; flex-wrap: wrap; gap: var(--s3) var(--s5);
  margin-bottom: var(--s3); }
.duzen-anahtarlar .onay { display: flex; align-items: center; gap: var(--s2);
  font-size: var(--fs-md); cursor: pointer; }
.duzen-anahtarlar .onay input { width: 18px; height: 18px; flex: none; margin: 0; }
/* Düğmeler form alanlarına yapışıktı (ölçüldü 2026-08-17: 0px) — kullanıcı bunu
   "kayıklık" olarak bildirdi. Üst boşluk, alanlarla düğme şeridini ayırır. */
.duzen-eylem { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s3);
  margin-top: var(--s4); }
/* Kendi rolü değiştirilemediği için seçim yerine rozet durur; yüksekliği
   yanındaki alanlarla aynı kalsın diye denetim yüksekliğine oturtulur. */
.rol-sabit { display: flex; align-items: center; min-height: var(--ctl-h); margin: 0; }
.pasif-alan { opacity: .5; }
@media (max-width: 700px) {
  .svc-duzen-form, .duzen-govde { padding: var(--s3); }
  .duzen-eylem .btn { flex: 1 1 auto; }
  /* Düzenleme paneli, İÇİNDE bulunduğu geniş tablonun genişliğini alıyordu
     (Hizmetler tablosu 390px ekranda 1170px): panel açılınca kullanıcı formu
     görmek için sağa kaydırmak zorunda kalıyordu (kullanıcı bildirimi
     2026-09-02). `sticky left:0` hücreyi yatay kaydırmadan bağımsız kılar —
     tablo kaysa da panel görünen alanda durur ve genişliği ekranı aşmaz. */
  .duzen-satir > td { position: sticky; left: 0;
    width: 100vw; max-width: 100vw; box-sizing: border-box; }
  .svc-duzen-form, .duzen-govde { max-width: 100%; box-sizing: border-box; }
  /* Panel içindeki ızgaralar da tek kolona insin, yoksa kutular kırpılıyor */
  .duzen-blok .frm { grid-template-columns: 1fr; }
}

/* ------------------------------------------------------------ roller (kullanıcılar) */
/* Üç rol yalnız renkle ayrılmaz: her rolün kendi ikonu ve açıklaması var
   (erişilebilirlik kuralı — bilgi renge bağlı kalmamalı). */
.rol-rozet { display: inline-flex; align-items: center; gap: 5px; padding: 3px var(--s2);
  border-radius: 999px; font-size: var(--fs-2xs); font-weight: 700; white-space: nowrap;
  border: 1px solid transparent; }
.rol-rozet svg { flex: none; }
.rol-rozet.rol-super_yonetici { color: var(--rol-super_yonetici);
  background: var(--rol-super_yonetici-zemin); border-color: var(--rol-super_yonetici-cizgi); }
.rol-rozet.rol-yonetici { color: var(--rol-yonetici); background: var(--rol-yonetici-zemin);
  border-color: var(--warn-line); }
.rol-rozet.rol-fiyatlandirma { color: var(--rol-fiyatlandirma);
  background: var(--rol-fiyatlandirma-zemin); border-color: var(--rol-fiyatlandirma-cizgi); }
.rol-rozet.rol-goruntuleyen { color: var(--rol-goruntuleyen);
  background: var(--rol-goruntuleyen-zemin); border-color: var(--line-strong); }
.rol-rozet.rol-yatan_hasta { color: var(--rol-yatan_hasta);
  background: var(--rol-yatan_hasta-zemin); border-color: var(--rol-yatan_hasta-cizgi); }

.rol-karne { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: var(--s3); margin-bottom: var(--s4); }
/* Rol kartı = referansın KPI kartı: rozet üstte, sayı büyük, açıklama küçük gri (2026-09-04) */
.rol-kart { padding: var(--s4); background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-lg); }
.rol-kart-bas { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s2); }
.rol-sayi { margin: var(--s2) 0 0; font-size: var(--fs-2xs); color: var(--mut); white-space: nowrap; }
.rol-sayi b { display: block; font-size: var(--fs-2xl); font-weight: 700; line-height: 1.1;
  letter-spacing: -.02em; color: var(--ink); }
.rol-aciklama { margin: var(--s2) 0 0; font-size: var(--fs-2xs); color: var(--mut); line-height: 1.5; }

/* Satırın solundaki ince şerit, listede rolü taramayı kolaylaştırır */
tr.rol-satir > td:first-child { box-shadow: inset 3px 0 0 var(--line-strong); }
tr.rol-yonetici > td:first-child { box-shadow: inset 3px 0 0 var(--rol-yonetici); }
tr.rol-fiyatlandirma > td:first-child { box-shadow: inset 3px 0 0 var(--rol-fiyatlandirma); }
tr.rol-goruntuleyen > td:first-child { box-shadow: inset 3px 0 0 var(--rol-goruntuleyen); }
tr.rol-yatan_hasta > td:first-child { box-shadow: inset 3px 0 0 var(--rol-yatan_hasta); }

/* Doktora Özel Paketler tablosu: kısa ve bölünmemesi gereken kolonlar kendi genişliğini
   alır, sarmalanan tek kolon uzun ameliyat adıdır. Kolon genişliği verilmezse tablo
   hepsini eşit daraltıp "GENEL CERRAHİ" gibi kısa değerleri iki satıra düşürüyor. */
/* Paket detayındaki "bu paketin doktora özel fiyatları" tablosu */
.ozel-fiyat-tablo { table-layout: fixed; min-width: calc(1170px * var(--kol)); }
.ozel-fiyat-tablo .c-dr { width: calc(150px * var(--kol)); }
.ozel-fiyat-tablo .c-tl { width: calc(96px * var(--kol)); }
.ozel-fiyat-tablo .c-not { width: auto; }
.ozel-fiyat-tablo .c-dt { width: calc(104px * var(--kol)); }
.ozel-fiyat-tablo .c-ac { width: calc(250px * var(--kol)); }   /* Gör · Düzenle · Proforma tek satırda */
.ozel-fiyat-tablo th, .ozel-fiyat-tablo th.num { white-space: normal; }
.table-wrap .ozel-fiyat-tablo td.tarih { white-space: nowrap; }

.ozel-tablo { table-layout: fixed; min-width: calc(900px * var(--kol)); }
.ozel-tablo .c-doktor { width: calc(180px * var(--kol)); }
.ozel-tablo td { vertical-align: middle; }
.ozel-tablo .c-ameliyat { width: auto; }
.ozel-tablo .c-tutar { width: calc(104px * var(--kol)); }
.ozel-tablo th, .ozel-tablo th.num { white-space: normal; }
/* Rozet/ikincil değer ana değerin altında kendi satırında durur */
.alt-satir { display: block; margin-top: 3px; }
/* Bu tablodaki kısa değerler (doktor, bölüm) sabit kolon genişliğine sığar; `nowrap`
   VERİLMEZ — nowrap tabloyu kabından geniş yapıp yatay kaydırma çubuğu çıkarıyordu.
   Kural: kaydırma yok. Sığmıyorsa kolon çekmeceye taşınır, zorlanmaz. */

/* Liste tablolarında kolon genişlikleri. Genişlik verilmezse tarayıcı kolonları eşit
   daraltıp "GENEL CERRAHİ", "2026-08-14 00:04" gibi kısa değerleri ikiye bölüyor;
   `nowrap` ise tabloyu kabından taşırıp yatay kaydırma çıkarıyor (yasak). Doğru çözüm
   kolonlara sığacak genişliği vermek, sarmalamayı yalnız uzun ada bırakmaktır. */
/* Ölçüler değere göre: doktor ve bölüm adları tek satıra sığar, tutar kolonları
   sayının gerektirdiği kadar dar, eylem kolonu kısa etiketlerle. Artan pay uzun
   ameliyat adına gider — sarmalamasına izin verilen tek kolon odur. */
/* İki katlı hücre (2026-09-03): bölüm, sürüm ve güncelleme ameliyat adının altında */
.doctor-packages-tablo { table-layout: fixed; min-width: calc(900px * var(--kol)); }
.doctor-packages-tablo .c-dr { width: calc(180px * var(--kol)); }
.doctor-packages-tablo .c-op { width: auto; }
.doctor-packages-tablo .c-tl { width: calc(110px * var(--kol)); }
.doctor-packages-tablo .c-ac { width: calc(196px * var(--kol)); }   /* ✎ · Pasif yap · 🗑 */
.doctor-packages-tablo td { vertical-align: middle; }
.doctor-packages-tablo th, .doctor-packages-tablo th.num { white-space: normal; }
.table-wrap .doctor-packages-tablo td.tarih:not(.num) { white-space: nowrap; }

/* Hizmetler — iki katlı hücre (2026-09-03): Hizmet (ad / tip · grup) · Katsayı
   (sayı / birim · varsayılan) · Ayarlar (rozet yığını) · İşlemler. Sekiz sütun 1440px'e
   sığmıyordu; dört sütun kendi kutusuna sığar, kaydırma gerekmez. */
.hizmet-tablo { table-layout: fixed; min-width: calc(760px * var(--kol)); }
.hizmet-tablo .c-ad { width: auto; }
.hizmet-tablo .c-kat { width: calc(150px * var(--kol)); }
.hizmet-tablo .c-ayar { width: calc(190px * var(--kol)); }
.hizmet-tablo .c-ac { width: calc(180px * var(--kol)); }
.hizmet-tablo th { white-space: normal; }
.hizmet-tablo td { vertical-align: middle; }
.hizmet-tablo td.num > b { display: block; }
@media (max-width: 700px) {
  .hizmet-tablo { min-width: 100%; }
  .hizmet-tablo .c-kat { width: 84px; }
  .hizmet-tablo .c-ac { width: 112px; }
  .hizmet-tablo th:nth-child(3), .hizmet-tablo td:nth-child(3) { display: none; }
}
/* Kolon ölçüsü verilmeyince 10 kolon eşit paylaşıyordu: "—"/"✓" kolonları ad kolonu
   kadar genişti, tablo 1170px'e taşıyor ve işlem sütunu 1280px ekranda görünmüyordu
   (2026-09-03). Ad kolonu artığı alır; kısa kolonlar içeriği kadar. */
/* Dar ekranda kolonları ezilmesin diye asgari genişlik alan diğer geniş tablolar */
/* Personel listesi */
.personel-tablo { table-layout: fixed; min-width: calc(880px * var(--kol)); }
.personel-tablo .c-ad { width: auto; }
.personel-tablo .c-unvan { width: calc(180px * var(--kol)); }
.personel-tablo .c-tel { width: calc(150px * var(--kol)); }
.personel-tablo .c-durum { width: calc(100px * var(--kol)); }
.personel-tablo .c-dt { width: calc(120px * var(--kol)); }
.personel-tablo .c-ac { width: calc(220px * var(--kol)); }
/* Doktor fiyat listesi kayıtları + arşiv belgesi eylem çubuğu */
.liste-kayit-tablo { table-layout: fixed; min-width: calc(1060px * var(--kol)); }
.liste-kayit-tablo .c-belge { width: calc(140px * var(--kol)); }
.liste-kayit-tablo .c-dt { width: calc(112px * var(--kol)); }
.liste-kayit-tablo .c-dr { width: auto; }
.liste-kayit-tablo .c-dep { width: calc(150px * var(--kol)); }
.liste-kayit-tablo .c-sayi { width: calc(100px * var(--kol)); }
.liste-kayit-tablo .c-ind { width: calc(120px * var(--kol)); }
.liste-kayit-tablo .c-kisi { width: calc(140px * var(--kol)); }
.liste-kayit-tablo .c-ac { width: calc(130px * var(--kol)); }
.liste-kayit-tablo th { white-space: normal; }
/* Belge ekranlarının üst çubuğu: geri dön + yazdır + bağlam notu tek hizada */
.belge-cubugu { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s3);
  padding: var(--s3) var(--s4); background: var(--panel); border: 1px solid var(--line);
  border-radius: var(--radius-lg); }
.belge-cubugu .muted { flex: 1 1 240px; font-size: var(--fs-2xs); }
/* Kullanım rehberi: arama kutusu, öneri etiketleri, açılır soru listesi */
.rehber-ara-kutu label { display: block; margin-bottom: var(--s2); font-weight: 700;
  font-size: var(--fs-md); }
.rehber-ara-kutu input[type=search] { width: 100%; height: calc(var(--ctl-h) + 8px);
  padding: 0 var(--s4); font-size: var(--fs-lg); }
.rehber-oneri { display: flex; flex-wrap: wrap; gap: var(--s2); margin-top: var(--s3); }
.oneri-etiket { padding: 5px 11px; border: 1px solid var(--line-strong); border-radius: 999px;
  background: var(--surface); color: var(--pri-ink); font: inherit; font-size: var(--fs-2xs);
  font-weight: 700; cursor: pointer; }
.oneri-etiket:hover { background: var(--pri-soft); }
.rehber-bolum { margin-top: var(--s5); }
.rehber-bolum h2 { display: flex; align-items: baseline; gap: var(--s3); }
.rehber-bolum h2 .muted { font-size: var(--fs-2xs); font-weight: 600; }
.rehber-liste { display: grid; gap: var(--s2); }
.rehber-soru { border: 1px solid var(--line); border-radius: var(--radius-lg);
  background: var(--panel); overflow: hidden; }
.rehber-soru > summary { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s3); padding: 11px var(--s4); cursor: pointer; list-style: none;
  font-weight: 700; font-size: var(--fs-md); }
.rehber-soru > summary::-webkit-details-marker { display: none; }
.rehber-soru:hover > summary { background: var(--surface); }
.rehber-soru[open] > summary { border-bottom: 1px solid var(--line); background: var(--surface); }
.rehber-soru[open] .soru-ok { transform: rotate(45deg); }
.soru-ok { flex: none; color: var(--pri-ink); font-size: var(--fs-lg); line-height: 1;
  transition: transform var(--t-fast); }
.soru-cevap { padding: var(--s4); }
.soru-cevap p { margin: 0; font-size: var(--fs-md); line-height: 1.6; }
.soru-eylem { margin-top: var(--s3) !important; }
.rehber-bos { border-color: var(--warn); }
/* Destek tabloları (destek düğmesi 2026-09-03'te üst çubuğa taşındı: .topbar-ikon) */
/* Yanıt sütunu 2026-08-17'de kaldırıldı: cevap artık konu hücresinin altında.
   Üç kolon kaldığı için tablo daralabilir ve konu sütunu genişler. */
.destek-tablo { table-layout: fixed; min-width: calc(520px * var(--kol)); }
.destek-tablo .c-dt { width: calc(112px * var(--kol)); }
.destek-tablo .c-konu { width: auto; }
.destek-tablo .c-durum { width: calc(120px * var(--kol)); }
.destek-yonetim-tablo { table-layout: fixed; min-width: calc(940px * var(--kol)); }
.destek-yonetim-tablo .c-dt { width: calc(112px * var(--kol)); }
.destek-yonetim-tablo .c-kisi { width: calc(170px * var(--kol)); }
.destek-yonetim-tablo .c-konu { width: auto; }
.destek-yonetim-tablo .c-durum { width: calc(120px * var(--kol)); }
.destek-yonetim-tablo .c-ac { width: calc(130px * var(--kol)); }
/* Form ızgarasında tam satır kaplayan alan (uzun metin kutuları) */
.frm .tam-satir { grid-column: 1 / -1; }
.frm textarea { width: 100%; padding: 8px 10px; border: 1px solid var(--line-strong);
  border-radius: var(--radius-sm); font: inherit; font-size: var(--fs-md);
  background: var(--panel); color: var(--ink); resize: vertical; }
.frm textarea:focus-visible { outline: 3px solid var(--focus); outline-offset: 1px; }
.kurulum-adim { margin: 0 0 var(--s4); padding-left: var(--s5); display: grid; gap: 6px;
  font-size: var(--fs-sm); }
/* Hesabım: yetki özeti, kayıtlı cihaz tablosu, uzun bağlantı metni */
.yetki-ozet { display: grid; gap: 6px; margin: var(--s3) 0 var(--s4); }
.yetki-ozet li { display: flex; align-items: baseline; gap: var(--s3);
  font-size: var(--fs-sm); }
.yetki-ozet li.yok { color: var(--mut); }
.yetki-isaret { flex: none; width: 16px; text-align: center; font-weight: 800; }
.yetki-ozet li.var .yetki-isaret { color: var(--ok); }
.cihaz-tablo { table-layout: fixed; min-width: calc(360px * var(--kol)); }
.cihaz-tablo .c-dt { width: auto; }
.cihaz-tablo .c-bitis { width: calc(150px * var(--kol)); }
.kirilabilir { overflow-wrap: anywhere; font-size: var(--fs-2xs); }
/* Menüdeki ad artık bağlantı: renk ve altı çizgi devralınmaz */
.userbox a.uname { text-decoration: none; color: inherit; }
.userbox a.uname:hover span:last-child { text-decoration: underline; }
a.topbar-user { text-decoration: none; color: inherit; }
a.topbar-user:hover { text-decoration: underline; }
/* Dashboard işlem günlüğü */
.gunluk-tablo { table-layout: fixed; min-width: calc(960px * var(--kol)); }
.gunluk-tablo .c-dt { width: calc(112px * var(--kol)); }
.gunluk-tablo .c-islem { width: calc(132px * var(--kol)); }
.gunluk-tablo .c-tur { width: calc(120px * var(--kol)); }
.gunluk-tablo .c-ack { width: auto; }
.gunluk-tablo .c-kisi { width: calc(150px * var(--kol)); }
.gunluk-tablo .c-ac { width: calc(130px * var(--kol)); }
.gunluk-tablo th { white-space: normal; }
/* Excel içe aktarma: geçmiş, hata ve aktarım önizleme tabloları */
.gecmis-tablo { table-layout: fixed; }
.gecmis-tablo .c-dt { width: calc(112px * var(--kol)); }
.gecmis-tablo .c-dosya { width: auto; }
.gecmis-tablo .c-dep { width: calc(150px * var(--kol)); }
.gecmis-tablo .c-sayi { width: calc(96px * var(--kol)); }
.gecmis-tablo .c-kisi { width: calc(140px * var(--kol)); }
.gecmis-tablo .c-ac { width: calc(150px * var(--kol)); }
.gecmis-tablo th { white-space: normal; }
.hata-tablo, .aktarim-tablo { table-layout: fixed; min-width: calc(720px * var(--kol)); }
.hata-tablo .c-satir, .aktarim-tablo .c-satir { width: calc(110px * var(--kol)); }
.hata-tablo .c-ad, .aktarim-tablo .c-ad { width: auto; }
.hata-tablo .c-sorun { width: calc(320px * var(--kol)); }
.aktarim-tablo { min-width: calc(1180px * var(--kol)); }
.aktarim-tablo .c-dep { width: calc(150px * var(--kol)); }
.aktarim-tablo .c-ttb { width: calc(90px * var(--kol)); }
.aktarim-tablo .c-yatis { width: calc(130px * var(--kol)); }
.aktarim-tablo .c-anestezi { width: calc(100px * var(--kol)); }
.aktarim-tablo .c-ek { width: calc(280px * var(--kol)); }
.aktarim-tablo .c-ref { width: calc(130px * var(--kol)); }
.doktor-aktarim-tablo { table-layout: fixed; min-width: calc(760px * var(--kol)); }
.doktor-aktarim-tablo .c-satir { width: calc(90px * var(--kol)); }
.doktor-aktarim-tablo .c-ad { width: auto; }
.doktor-aktarim-tablo .c-tip { width: calc(140px * var(--kol)); }
.doktor-aktarim-tablo .c-dep { width: calc(280px * var(--kol)); }
.hata-tablo th, .aktarim-tablo th { white-space: normal; }
/* Zam ekranı: seçim tablosu, onay tablosu ve geçmiş */
.onizleme-tablo { table-layout: fixed; }
/* Genişlikler tahmin değil, gerçek içerikten ölçüldü (scrollWidth) — kullanıcı
   bildirimi 2026-09-07: "Mevcut Fiyat" ve "Eski Liste" üst üste biniyordu. "Dr.
   fiyatı" rozeti de bu yüzden fiyatın YANINA değil ALTINA taşındı (bkz. şablon):
   yan yana 178px, alt alta yalnız 132px istiyordu. */
.onizleme-tablo .c-sec { width: calc(92px * var(--kol)); }
.onizleme-tablo .c-dep { width: calc(136px * var(--kol)); }
.onizleme-tablo .c-ad { width: auto; }
.onizleme-tablo .c-tl { width: calc(158px * var(--kol)); }
.onizleme-tablo .c-zam { width: calc(124px * var(--kol)); }
.onizleme-tablo .c-dt { width: calc(118px * var(--kol)); }
.onizleme-tablo th, .onay-tablo th { white-space: normal; }
.onay-etiket { display: inline-flex; align-items: center; gap: var(--s2); cursor: pointer; }
/* Başlık satırındaki "Tümü": diğer sütun başlıkları gibi metin ÜSTTE durur,
   kutu altta ortalanır — yan yana dar kolonu sıkıştırıyordu (kullanıcı 2026-09-07). */
th .onay-etiket { flex-direction: column; align-items: center; gap: 3px; }
.onay-tablo { table-layout: fixed; min-width: calc(820px * var(--kol)); }
.onay-tablo .c-dep { width: calc(160px * var(--kol)); }
.onay-tablo .c-ad { width: auto; }
.onay-tablo .c-tl { width: calc(180px * var(--kol)); }
.zam-gecmis-tablo { table-layout: fixed; min-width: calc(820px * var(--kol)); }
.zam-gecmis-tablo .c-dt { width: calc(120px * var(--kol)); }
.zam-gecmis-tablo .c-oran { width: calc(90px * var(--kol)); }
.zam-gecmis-tablo .c-sayi { width: calc(140px * var(--kol)); }
.zam-gecmis-tablo .c-not { width: auto; }
.zam-gecmis-tablo .c-ac { width: calc(220px * var(--kol)); }
.zam-gecmis-tablo th { white-space: normal; }
/* Silme istekleri ve doktor ameliyat seçimi tabloları */
.istek-tablo { table-layout: fixed; min-width: calc(1080px * var(--kol)); }
.istek-tablo .c-dt { width: calc(104px * var(--kol)); }
.istek-tablo .c-tur { width: calc(96px * var(--kol)); }
.istek-tablo .c-kayit { width: auto; }
.istek-tablo .c-gerekce { width: calc(200px * var(--kol)); }
.istek-tablo .c-kisi { width: calc(140px * var(--kol)); }
.istek-tablo .c-durum { width: calc(128px * var(--kol)); }
.istek-tablo .c-ac { width: calc(220px * var(--kol)); }
.istek-tablo th { white-space: normal; }
.secim-tablo { table-layout: fixed; min-width: calc(620px * var(--kol)); }
.secim-tablo .c-sec { width: calc(44px * var(--kol)); }
.secim-tablo .c-dep { width: calc(150px * var(--kol)); }
.secim-tablo .c-ad { width: auto; }
.secim-tablo .c-ttb { width: calc(80px * var(--kol)); }
/* Ekran okuyucu için başlık; görsel olarak gizlidir */
.gizli-etiket { position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap; }
/* Döviz kurları ve silme gerekçeleri: dar değer kolonları, geniş ad kolonu */
/* Doğum paketleri — iki katlı hücre (paket / bölüm) ve sürüm geçmişi */
.dogum-tablo, .dogum-surum-tablo { table-layout: fixed; min-width: calc(760px * var(--kol)); }
.dogum-tablo .c-ad, .dogum-surum-tablo .c-ad { width: auto; }
.dogum-tablo .c-tutar, .dogum-surum-tablo .c-tutar { width: calc(140px * var(--kol)); }
.dogum-tablo .c-durum { width: calc(96px * var(--kol)); }
.dogum-tablo .c-ac { width: calc(236px * var(--kol)); }   /* Düzenle · Pasif yap · 🗑 */
.dogum-tablo td { vertical-align: middle; }
.dogum-surum-tablo .c-no { width: calc(80px * var(--kol)); }
.dogum-surum-tablo .c-zam { width: calc(80px * var(--kol)); }
.dogum-surum-tablo .c-dt { width: calc(200px * var(--kol)); }
.dogum-surum-tablo td.right > b { display: block; font-weight: 600; }
/* Doğum paketleri · zam geçmişi ve zam karşılaştırma (2026-09-04). Ölçüler normal
   zam panelindeki `.zam-gecmis-tablo` ile aynı mantıkta: not sütunu esner, işlem
   sütunu iki düğmeyi yan yana tutar. */
.duz-zam-tablo { table-layout: fixed; min-width: calc(880px * var(--kol)); }
.duz-zam-tablo .c-dt { width: calc(180px * var(--kol)); }
.duz-zam-tablo .c-oran { width: calc(150px * var(--kol)); }
.duz-zam-tablo .c-sayi { width: calc(80px * var(--kol)); }
.duz-zam-tablo .c-not { width: auto; }
.duz-zam-tablo .c-ac { width: calc(230px * var(--kol)); }
.duz-zam-tablo th { white-space: normal; }
.duz-zam-tablo .dep-islem { justify-content: flex-end; flex-wrap: nowrap; }
/* Karşılaştırma: sütun sayısı seçime göre değişir, ölçü verilmez; başlıktaki tarih
   kendi satırına iner. */
.dzk-tablo th { white-space: normal; }
.dzk-tablo th .svc-meta { display: block; }
/* Konaklama ücretleri · paketlere yansıma tablosu. */
.konaklama-tablo { table-layout: fixed; min-width: calc(720px * var(--kol)); }
.konaklama-tablo .c-ad { width: auto; }
.konaklama-tablo .c-gece { width: calc(110px * var(--kol)); }
.konaklama-tablo .c-tutar { width: calc(150px * var(--kol)); }
/* ------------------------------------------------------------ Sistem ve Yedek
   Durum şeridi: "yedek çalışıyor mu?" sorusunun cevabı ekranın ilk gördüğü şey.
   Kutular kart değil, tek çerçeve içinde bölmeler — hepsi aynı ağırlıkta okunur. */
.sis-durum { display: grid; gap: 1px; background: var(--line); padding: 1px;
             grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); }
.sis-kutu { display: flex; flex-direction: column; gap: 2px; padding: 14px 16px;
            background: var(--panel); min-width: 0; }
.sis-etiket { font-size: var(--fs-3xs); font-weight: 700; letter-spacing: .06em;
              text-transform: uppercase; color: var(--mut); }
.sis-deger { font-size: var(--fs-xl); font-weight: 600; line-height: 1.2; }
.sis-alt { font-size: var(--fs-xs); color: var(--mut); }
/* Durum rengi yalnız ZEMİNDE ve ince bir şeritte: metin rengini değiştirmek
   kontrastı düşürüyordu. */
.sis-iyi { box-shadow: inset 3px 0 0 var(--ok); }
.sis-uyari { box-shadow: inset 3px 0 0 var(--neg); }
.yedek-tablo { table-layout: fixed; min-width: calc(640px * var(--kol)); }
.yedek-tablo .c-dt { width: calc(180px * var(--kol)); }
.yedek-tablo .c-boyut { width: calc(110px * var(--kol)); }
.yedek-tablo .c-yas { width: auto; }
.yedek-tablo .c-ac { width: calc(220px * var(--kol)); }
.yedek-tablo .dep-islem { justify-content: flex-end; }
/* Yönetici rehberi: markdown'dan gelen gövde. Okuma metni olduğu için satır
   uzunluğu sınırlı; tablo ve kod blokları kendi kabında kaydırılır. */
.rehber-govde { max-width: none; }
.rehber-govde p, .rehber-govde .rehber-liste { max-width: 78ch; }
.rehber-govde h2.rehber-bolum { margin: var(--s6) 0 var(--s3); padding-bottom: var(--s2);
  border-bottom: 1px solid var(--line); font-size: var(--fs-xl); }
.rehber-govde h2.rehber-bolum:first-child { margin-top: 0; }
.rehber-govde h3 { margin: var(--s4) 0 var(--s2); font-size: var(--fs-lg); }
.rehber-govde .rehber-liste { margin: 0 0 var(--s3); padding-left: 22px; }
.rehber-govde .rehber-liste li { margin-bottom: 4px; }
.rehber-govde .rehber-kod { background: var(--surface-2); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 12px 14px; overflow-x: auto;
  font-family: var(--font-mono); font-size: var(--fs-sm); line-height: 1.6;
  margin: 0 0 var(--s3); white-space: pre; }
.rehber-govde .table-wrap { margin-bottom: var(--s4); }
.rehber-govde .notice { margin: var(--s3) 0; }
/* Baskıda menü ve düğmeler yok; rehber kâğıda düz metin olarak iner. */
@media print {
  .sidebar, .topbar, .page-actions, .flash { display: none !important; }
  main { max-width: none; padding: 0; }
  .rehber-govde { border: 0; box-shadow: none; padding: 0; }
}
/* Doktorlar — iki katlı hücre (ad / hekim tipi), bölümler kendi sütununda */
.doktor-tablo { table-layout: fixed; min-width: calc(900px * var(--kol)); }
.doktor-tablo .c-ad { width: auto; }
.doktor-tablo .c-dep { width: calc(240px * var(--kol)); }
.doktor-tablo .c-say { width: calc(104px * var(--kol)); }
.doktor-tablo .c-durum { width: calc(96px * var(--kol)); }
.doktor-tablo .c-ac { width: calc(300px * var(--kol)); }   /* Ameliyatları · ✎ · Pasif yap · 🗑 */
.doktor-tablo td { vertical-align: middle; }
.doktor-tablo th { white-space: normal; }
.th-ayrac { margin: 0 6px; color: var(--faint); }
/* Kur: kur kalın, altında son güncelleme */
.kur-tablo { table-layout: fixed; min-width: calc(640px * var(--kol)); }
.kur-tablo .c-birim { width: auto; }
.kur-tablo .c-kur { width: calc(160px * var(--kol)); }
.kur-tablo td.num > b { display: block; }
.kur-tablo .c-durum { width: calc(96px * var(--kol)); }
.kur-tablo .c-dt { width: auto; }
.kur-tablo .c-ac { width: calc(140px * var(--kol)); }
.gerekce-tablo { table-layout: fixed; min-width: calc(640px * var(--kol)); }
.gerekce-tablo .c-metin { width: auto; }
.gerekce-tablo .c-durum { width: calc(96px * var(--kol)); }
.gerekce-tablo .c-ac { width: calc(140px * var(--kol)); }
/* Hata sayfası: kod büyük ve sessiz, eylemler tek hizada */
.hata-kutu { max-width: 560px; }
.hata-kod { display: block; margin-bottom: var(--s3); font-size: var(--fs-3xl);
  font-weight: 800; color: var(--faint); letter-spacing: .04em; }
/* Ameliyatlar — iki katlı hücre (referans deseni, kullanıcı onayı 2026-09-03):
   üstte kalın ana bilgi, altında küçük gri bağlam. Bölüm adı ameliyatın altına
   indi ("BEYİN VE SİNİR CERRAHİSİ" 168px sütuna sığmıyordu), süre TTB'nin altına.
   Sütun sırası: Kimlik → Ölçü → Durum → İşlem. */
.ameliyat-tablo { table-layout: fixed; min-width: calc(1000px * var(--kol)); }
.ameliyat-tablo .c-sec { width: calc(44px * var(--kol)); }
.ameliyat-tablo .c-ad { width: auto; }
.ameliyat-tablo .c-olcu { width: calc(112px * var(--kol)); }
.ameliyat-tablo .c-durum { width: calc(124px * var(--kol)); }
.ameliyat-tablo .c-ac { width: calc(336px * var(--kol)); }    /* Paket Oluştur · Düzenle · Pasif · Sil */
.ameliyat-tablo th { white-space: normal; }
.ameliyat-tablo td { vertical-align: middle; }
.ameliyat-tablo td.num .view { display: block; }
/* Durum hücresi: rozetler alt alta, sola hizalı (referansın rozet yığını) */
.badge-yigin { display: inline-grid; gap: var(--s1); justify-items: start; }
/* Bölümler: ad kolonu düzenleme alanını taşır, sayı/durum kolonları dar kalır */
.bolum-tablo { table-layout: fixed; min-width: calc(800px * var(--kol)); }
.bolum-tablo .c-ad { width: auto; }   /* ad kalın / "N ameliyat · M doktor" gri (2026-09-03) */
.bolum-tablo .c-durum { width: calc(112px * var(--kol)); }
.bolum-tablo td { vertical-align: middle; }
/* "+ Ameliyat · Pasif yap · Sil" tek satırda: Sil düğmesi eklenince 220px'te
   alt satıra düşüyordu (ölçüldü: üç düğme + boşluklar 288px). */
.bolum-tablo .c-ac { width: calc(436px * var(--kol)); }
/* Engel notu düğmelerin ALTINA iner: yanında durunca düğmeler iki satıra kırılıyor,
   satırdan satıra hizaları kayıyordu (2026-09-03). */
.bolum-tablo .dep-islem .dep-engel { flex-basis: 100%; text-align: right; margin: 0; }
.bolum-tablo th { white-space: normal; }
/* Bölüm adı kutusu hücreyi DOLDURUR. Genel kural (`td > form.inline.frm input
   { width: auto }`) kutuyu varsayılan ~20 karakterde bırakıyordu: "PLASTİK,
   REKONSTRÜKTİF VE ESTETİK CERRAHİ" kırpılırken kolonun sağ yarısı boş duruyordu.
   `min-width: 0` şart — onsuz esnek öğe kendi içerik genişliğinin altına inemez
   ve dar ekranda kutu düğmeyi hücreden taşırır. */
/* Kilitli Sil düğmesinin yanındaki gerekçe: ipucu balonu dokunmatikte açılmıyor,
   sebep görünür metin olarak da durur. */
.dep-engel { margin: 0; align-self: center; white-space: nowrap; }
.gecmis-tablo { min-width: calc(1080px * var(--kol)); }     /* Excel içe aktarma geçmişi — 8 kolon */
.formul-tablo { min-width: calc(1320px * var(--kol)); }    /* Formül versiyon geçmişi — 12 kolon */
.onizleme-tablo { min-width: calc(1080px * var(--kol)); }    /* Zam önizlemesi — 8 kolona kadar */

/* Başlık iki satıra düşebilir (kolon adı kısaltmaktansa sarmalansın); hücre içindeki
   rozet de sarmalanır — sabit kolonda taşmasın diye. */

.proforma-ozet-tablo { table-layout: fixed; }
.proforma-ozet-tablo .c-donem { width: auto; }
.proforma-ozet-tablo .c-sayi { width: calc(96px * var(--kol)); }
.proforma-ozet-tablo .c-kisi { width: calc(168px * var(--kol)); }
.proforma-ozet-tablo .c-tutar { width: calc(148px * var(--kol)); }
/* ASGARİ GENİŞLİK KURALI: geniş tablolar dar ekranda kolonlarını ezmez; `.table-wrap`
   içinde kendi kutusunda kayar. Ezilince tarih/isim/başlık hücreleri iki-üç satıra
   bölünüyor, tablo okunmaz oluyordu. */
/* Yedi kolon: ikincil değerler (çıktı, düzenleyen, tarife) ana değerin altında
   `svc-meta` satırı olarak durur. On bir kolonda hiçbir hücre sığmıyordu. */
.proforma-kayit-tablo { table-layout: fixed; min-width: calc(1104px * var(--kol)); }
.proforma-kayit-tablo .c-belge { width: calc(152px * var(--kol)); }
.proforma-kayit-tablo .c-zaman { width: calc(130px * var(--kol)); }
.proforma-kayit-tablo .c-hasta { width: calc(150px * var(--kol)); }
/* Boşluksuz uzun bir değer (yanlışlıkla yapıştırılmış kod, e-posta) kolona
   sığmadığında satır ortasından kırılır; aksi halde hücreden taşar. */
.proforma-kayit-tablo td { overflow-wrap: anywhere; }
.proforma-kayit-tablo .c-op { width: auto; }
.proforma-kayit-tablo .c-dr { width: calc(160px * var(--kol)); }
.proforma-kayit-tablo .c-fiyat { width: calc(118px * var(--kol)); }
/* "PDF" ve "İptal" yan yana: 76px tek düğmeye göreydi, iptal eklenince alt alta
   düşüyorlardı (ölçüldü: iki düğme + boşluk 132px). */
.proforma-kayit-tablo .c-islem { width: calc(140px * var(--kol)); }
.proforma-kayit-tablo th { white-space: normal; }
.table-wrap .proforma-kayit-tablo td.tarih:not(.num) { white-space: nowrap; }


/* BELGE (tema dışı) */
/* =========================================================================
   BELGE GÖVDELERİNDE PANEL CSS'İNİN SIFIRLANMASI — TEK YER
   Panel tablo görünümünü ELEMENT seçicileri kurar (`table`, `th, td`, `th`,
   `tbody tr`); sınıf öneki bundan KORUMAZ, çünkü belge tablosu da `<table>`dır.
   Ölçülen üç sonuç (2026-08-21):
     · `white-space: nowrap` → çok ameliyatlı belgede kapsam sütunu sarmıyor,
       tablo sayfanın 597px DIŞINA taşıyor ve tutar sütunu kâğıttan düşüyordu;
     · `position: sticky` (th) → başlık satırı akıştan çıkıyordu;
     · `tbody tr:nth-child(even)` → belgeye istenmeyen gri zebra şeridi giriyordu.
   Sıfırlama önce yalnız `.pfb-tablo` için yazılmıştı; `.pfd` ailesi (migration 030
   öncesi arşiv kayıtlarının yeniden baskı yolu, hâlâ canlı) aynı hatayı taşımaya
   devam ediyordu ve her yeni belge türü sızıntıyı ölçerek yeniden keşfediyordu.
   Artık kural BELGE KÖKÜ üzerinden yazılır, tablo sınıfı üzerinden değil: yeni bir
   belge türü eklendiğinde kökünü aşağıdaki listeye eklemek yeter
   (bekçi: `test_sinif_tanimlari.BelgeTablosuSizintiTests`).
   Tek satırda kalması gereken sütunlar (tutar) kendi kuralında `nowrap` der;
   dikey hizalama belgeye göre değiştiği için burada değil, tablo bloklarındadır.
   `.a4` ailesi (doktor fiyat listesi) KAPSAM DIŞIDIR: kendi sıfırlaması
   (`.a4-table` bloğu) çalışıyor ve `.num` sütununu ayrı bir kuralla koruyor.
   ========================================================================= */
.pfb table, .pfd table { background: transparent; }
.pfb th, .pfb td, .pfd th, .pfd td { white-space: normal; }
.pfb th, .pfd th { position: static; top: auto; z-index: auto; }
.pfb tbody tr, .pfd tbody tr,
.pfb tbody tr:hover, .pfd tbody tr:hover { background: transparent; }


/* =========================================================================
   PROFORMA BELGESİ (.pfd) — 2026-08-17'de onaylanan tasarımın birebir uygulaması
   Kaynak: gelistirme/tasarim/proforma-tasarimlari/{hasta,hasta-haklari}-proforma/
   Ölçüler, renkler ve punto değerleri o dosyalardan alınmıştır; bu blok panel
   token'larını KULLANMAZ (belge baskı sadakati punto ve mm cinsindendir).
   Doktor fiyat listesi belgeleri eski `.a4` ailesini kullanmaya devam eder —
   bu blok onları etkilemez.
   ========================================================================= */
.pfd {
  /* RENKSİZ BELGE (kullanıcı isteği 2026-08-19: *"tasarımda hiçbir satırda renkli
     bant olmasın, çerçeve varsa da renksiz kalsın"*). Kırmızı ve lacivert tek bir
     koyu mürekkebe indirildi; çizgiler gri. Değişkenler KORUNDU, böylece belgenin
     her yerinde tek noktadan değişir ve istenirse kurum rengi geri gelebilir.
     Logo görselin kendisidir, ondaki renk yerinde kalır. */
  --pfd-red: #4A5560; --pfd-navy: #1B232A; --pfd-text: #20272D; --pfd-muted: #69747D;
  --pfd-line: #C9CFD4; --pfd-light: #FFFFFF; --pfd-light2: #FFFFFF;
  position: relative; display: flex; flex-direction: column;
  width: 210mm; min-height: 297mm; margin: 0 0 var(--s5);
  padding: 18mm 18mm 16mm; background: #fff; color: var(--pfd-text);
  font-family: "Lato", Arial, Helvetica, sans-serif; font-size: 9pt; line-height: 1.35;
  box-shadow: 0 16px 46px rgba(11, 34, 55, .18); overflow: hidden;
  -webkit-print-color-adjust: exact; print-color-adjust: exact;
}
.pfd * { box-sizing: border-box; }

/* ---- Antet: logo solda, tarih/belge no sağda, altında kırmızı çizgi ---- */
/* Antet yüksekliği ölçüyle belirlendi (2026-08-17): logo 14,2mm, meta bloğu normal
   nüshada 14mm, kurum içi nüshada (rozet aşağı ittiği için) 22,5mm yer kaplar.
   24mm üçüne de yeter ve tasarımın ilk hâline göre belgeye 18mm yer kazandırır —
   kurum içi nüshada ek hizmet satırı eklenince kayıt notunun altbilgiye binmesi
   bu boşlukla çözüldü. Kullanıcı isteği: "logo ile kırmızı çizgi arasında fazla
   boşluk var, orasını değerlendir". */
.pfd-head { position: relative; height: 24mm; }
.pfd-logo { position: absolute; left: 0; top: -1mm; width: 55mm; height: auto; display: block; }
.pfd-meta { position: absolute; right: 0; top: 2mm; width: 62mm; font-size: 8.7pt; line-height: 6mm; }
.pfd-head.ic .pfd-meta { top: 10.5mm; }
.pfd-meta-row { display: grid; grid-template-columns: 29mm 33mm; align-items: center; }
.pfd-meta-k { text-align: right; padding-right: 4mm; color: var(--pfd-muted); font-size: 8pt; }
.pfd-meta-v { text-align: right; font-weight: 600; }
.pfd-ic-rozet { position: absolute; right: 0; top: -3mm; width: 27mm; height: 8mm;
  border: .7pt solid var(--pfd-navy); display: flex; align-items: center; justify-content: center;
  color: var(--pfd-navy); font-size: 7.5pt; font-weight: 700; letter-spacing: .15px; }
.pfd-rule { position: absolute; left: 0; right: 0; bottom: 0; border-top: 1pt solid var(--pfd-red); }

/* ---- Başlık ---- */
.pfd-title { margin-top: 11mm; font-size: 16pt; line-height: 1.1; color: var(--pfd-navy);
  font-weight: 700; }
.pfd-title-rule { position: relative; height: 5mm; border-bottom: .6pt solid var(--pfd-line); }
.pfd-title-rule:after { content: ""; position: absolute; left: 0; bottom: -.6pt; width: 22mm;
  border-bottom: 1.2pt solid var(--pfd-red); }

/* ---- Kimlik tablosu ---- */
.pfd-kv { width: 100%; border-collapse: collapse; margin-top: 5mm; font-size: 9pt; }
/* Zebra bant KALDIRILDI (kullanıcı isteği 2026-08-19): satırları zaten ince
   çizgiler ayırıyor, dolgu hem gereksiz mürekkep hem de "form doldurulmuş" hissi
   veriyordu. Ayrım artık yalnız tipografi ve çizgiyle. */
.pfd-kv .k { color: var(--pfd-muted); font-weight: 500; }
.pfd-kv td { height: 10.3mm; border-bottom: .45pt solid var(--pfd-line); vertical-align: middle; }
.pfd-kv tr:first-child td { border-top: .45pt solid var(--pfd-line); }
.pfd-kv .k { width: 50mm; padding: 0 3mm; font-size: 8.8pt; font-weight: 600;
  border-right: .45pt solid var(--pfd-line); }
.pfd-kv .v { padding: 0 4mm; font-size: 9.3pt; font-weight: 500; }

/* ---- Bölüm başlığı ---- */
.pfd-sec { margin-top: 9mm; }
.pfd-sec-title { font-size: 10pt; line-height: 1; color: var(--pfd-navy); font-weight: 700; }
.pfd-sec-rule { position: relative; height: 4.5mm; border-bottom: .45pt solid var(--pfd-line); }
.pfd-sec-rule:after { content: ""; position: absolute; left: 0; bottom: -.45pt; width: 14mm;
  border-bottom: 1pt solid var(--pfd-red); }

/* ---- Yatış · süre · yoğun bakım ---- */
/* Üç EŞİT sütun, etiket değerin üstünde. Kullanıcı 2026-08-19: *"ameliyat ve paket
   bilgileri çok fazla yer tutuyor"* → 18mm'lik kutu ızgarası ~10mm'ye indi; kenarlık
   kutu yerine iki ince yatay çizgi. Süre notu ızgaranın DIŞINDA, tam genişlikte —
   içerideyken satırı bozup hizayı kaydırıyordu. */
.pfd-bilgi3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0 6mm;
  min-height: 0; border-top: .5pt solid var(--pfd-line);
  border-bottom: .5pt solid var(--pfd-line); margin-top: 3mm; padding: 2.6mm 0; }
.pfd-bilgi3 > div { padding: 0; min-width: 0; }
.pfd-bilgi-k { font-size: 6.6pt; color: var(--pfd-muted); font-weight: 700;
  letter-spacing: .06em; margin-bottom: 1.1mm; }
.pfd-bilgi-v { font-size: 9.3pt; color: var(--pfd-navy); font-weight: 700; }
/* Süre kutusundaki küçük açıklama — kullanıcı isteği (2026-08-17): sürenin
   ortalama olduğu belgede yazsın, hasta kesin taahhüt sanmasın. */
.pfd-bilgi-not { margin-top: 1.5mm; font-size: 6.4pt; line-height: 1.2;
  color: var(--pfd-muted); }

/* İmza ekranı liste görünümü (2026-08-19): mobilde iki A4 nüsha yerine tek liste */
.imza-liste .imza-ayrac td { border-top: 1px solid var(--line-strong); padding-top: 9px; }
.imza-liste .imza-toplam td { border-top: 1px solid var(--line-strong); font-weight: 800; }
/* İmza ekranındaki soru-yanıt yazışması (2026-08-19). Sohbet balonu taklidi
   YAPILMAZ: bu bir mesajlaşma uygulaması değil, belgenin yanındaki kayıt. Yanıtlar
   soldan girintili ve farklı zeminle ayrılır. */
.yazisma { display: grid; gap: var(--s3); margin-top: var(--s2); }
.yazisma-oge { border-left: 3px solid var(--line-strong); padding: var(--s2) var(--s3);
  background: var(--surface-2); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; }
.yazisma-oge.yanit { margin-left: var(--s5); border-left-color: var(--pri-ink); }
.yazisma-ust { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s2); }
.yazisma-metin { margin: var(--s1) 0 0; white-space: pre-wrap; overflow-wrap: anywhere; }
@media (max-width: 700px) { .yazisma-oge.yanit { margin-left: var(--s3); } }
/* Belge tasarımı: ekranda düğmeyle açılır, BASKIDA her zaman görünür.
   `<details>` kullanılmıyordu — kapalı `<details>`in içeriği baskıda da gizlenir ve
   belge hiç basılmazdı (kullanıcı bildirimi 2026-08-19). */
.imza-belge { display: none; margin-top: var(--s4); }
.imza-belge.acik { display: block; }
@media print { .imza-belge { display: block !important; margin-top: 0; } }
/* Kurum içi nüshada ek hizmetler kalem kalem, tutarlarıyla (2026-08-19) */
.pfd-ek-liste { display: grid; gap: 1px; }
.pfd-ek-satir { display: flex; justify-content: space-between; gap: 8px; }
.pfd-ek-satir .tutar { font-variant-numeric: tabular-nums; white-space: nowrap; }
.pfd-ek { min-height: 10.5mm; margin-top: 4mm; border-top: .5pt solid var(--pfd-line);
  border-bottom: .5pt solid var(--pfd-line); display: grid; grid-template-columns: 45mm 1fr;
  align-items: center; padding: 1.5mm 3mm; font-size: 9.3pt; }
.pfd-ek-k { font-size: 9.3pt; font-weight: 600; }

/* ---- Hasta nüshası: tek fiyat satırı ---- */
.pfd-fiyat { min-height: 21mm; margin-top: 10mm; border-top: .9pt solid var(--pfd-navy);
  border-bottom: .5pt solid var(--pfd-line); display: flex; align-items: flex-start;
  justify-content: space-between; gap: 8mm; padding: 6mm 2mm 3mm; }
.pfd-fiyat-k { font-size: 9.3pt; color: var(--pfd-muted); font-weight: 500; }
.pfd-fiyat-v { font-size: 14.2pt; line-height: 1; color: var(--pfd-navy); font-weight: 700;
  text-align: right; white-space: nowrap; }
.pfd-fiyat-alt { display: block; margin-top: 2.4mm; font-size: 7.6pt; font-weight: 500;
  color: var(--pfd-muted); white-space: normal; }
.pfd-fiyat-alt s { color: #7b8b99; }

/* ---- Not kutusu ---- */
.pfd-not { position: relative; margin-top: 8mm; min-height: 15mm;
  border-left: 1.3pt solid var(--pfd-red);
  padding: 3.4mm 0 3mm 4.5mm; font-size: 7.8pt; line-height: 1.27; }
.pfd-not strong { display: block; font-size: 7.6pt; margin-bottom: 2mm; }

/* ---- Kurum içi nüsha: fiyat dağılımı ---- */
.pfd-dagilim { margin-top: 7mm; }
.pfd-tablo { width: 100%; border-collapse: collapse; margin-top: 4mm; font-size: 9.3pt; }
.pfd-tablo thead th { height: 7mm; border-bottom: .9pt solid var(--pfd-navy);
  color: var(--pfd-muted); font-size: 6.8pt; letter-spacing: .06em;
  text-align: left; padding: 0 3mm; font-weight: 700; }
.pfd-tablo thead th:last-child { text-align: right; }
.pfd-tablo tbody td { height: 10.2mm; border-bottom: .45pt solid var(--pfd-line);
  padding: 1mm 3mm; vertical-align: middle; }
.pfd-tablo tbody td + td { border-left: .45pt solid var(--pfd-line); }
.pfd-tablo .c1 { width: 43mm; } .pfd-tablo .c2 { width: 86mm; }
/* Grup satırı: "fiyat nasıl oluştu" ile "paylara nasıl bölündü" ayrımını taşır.
   Sayı sütunu boş kalır — hangi rakamların toplanacağı böylece belli olur. */
.pfd-tablo .pfd-grup td { height: 6mm; border-bottom: .45pt solid var(--pfd-navy);
  border-left: 0; color: var(--pfd-muted); font-size: 6.6pt; font-weight: 700;
  letter-spacing: .06em; text-transform: uppercase; padding-top: 1.6mm; }
.pfd-tablo .tutar { text-align: right; font-weight: 500; white-space: nowrap; }
.pfd-toplam { min-height: 10.5mm; border-top: 1pt solid var(--pfd-navy);
  border-bottom: .45pt solid var(--pfd-line); display: flex; align-items: center;
  justify-content: space-between; gap: 6mm; padding: 2mm 3mm; color: var(--pfd-navy);
  font-size: 9.3pt; font-weight: 700; }
.pfd-toplam .tutar { font-size: 10.5pt; white-space: nowrap; }

/* ---- Düzenleyen + altbilgi: sayfanın dibinde sabit ---- */
.pfd-duzenleyen { margin-top: auto; padding-top: 8mm; text-align: right;
  color: var(--pfd-muted); font-size: 7.8pt; font-weight: 500; }
.pfd-foot { margin-top: 6mm; border-top: .55pt solid var(--pfd-line); padding-top: 4mm; }
.pfd-foot-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 6mm; }
.pfd-adres { color: var(--pfd-muted); font-size: 6.9pt; line-height: 1.25; max-width: 110mm; }
.pfd-iletisim { color: var(--pfd-navy); font-size: 7pt; font-weight: 700; white-space: nowrap; }
/* Sayfa numarası altbilginin İÇİNDE, en altta durur. Kutunun dışına taşarsa
   (bottom negatif) belge sayfa sınırını aşar ve yazıcı arkasına neredeyse boş
   bir sayfa daha ekler — "boş 3. sayfa" sorununun kaynağı buydu. */
.pfd-sayfa-no { margin-top: 3mm; text-align: center;
  color: var(--pfd-muted); font-size: 6.8pt; }

/* Kurum içi nüsha, hasta nüshasından bir bölüm fazla taşır: dikey ritim
   tasarımdaki gibi sıkıştırılır ki içerik tek A4'e sığsın. */
.pfd.ic .pfd-title { margin-top: 10mm; }
.pfd.ic .pfd-kv { margin-top: 4.5mm; }
.pfd.ic .pfd-kv td { height: 8.2mm; }
.pfd.ic .pfd-sec { margin-top: 5.5mm; }
.pfd.ic .pfd-sec-rule { height: 4mm; }
.pfd.ic .pfd-bilgi3 { margin-top: 2.5mm; min-height: 0; padding: 2mm 0; }
.pfd.ic .pfd-ek { margin-top: 3mm; min-height: 10mm; }
.pfd.ic .pfd-dagilim { margin-top: 5mm; }
.pfd.ic .pfd-tablo { margin-top: 3mm; }
.pfd.ic .pfd-tablo thead th { height: 8mm; }
/* Kurum içi nüsha ek hizmet kalemleriyle 304,7mm'ye çıkıyordu (ölçüldü 2026-08-19);
   A4 297mm. Aşağıdaki üç sıkma 7,7mm'lik taşmayı kapatır. Hasta nüshası TAM 297mm
   olduğu için bu kurallar bilerek yalnız `.ic` kapsamındadır. */
.pfd.ic .pfd-kv td { height: 7.6mm; }
.pfd.ic .pfd-sec { margin-top: 4mm; }
/* `margin-top: auto` KORUNUR — altbilgiyi sayfanın altına iten şey o; ezilirse
   kısa belgelerde blok ortada asılı kalırdı. Kazanç yalnız üst boşluktan. */
.pfd.ic .pfd-duzenleyen { padding-top: 3mm; }
.pfd.ic .pfd-tablo tbody td { height: 7.9mm; }
.pfd.ic .pfd-toplam { min-height: 8.6mm; }
.pfd.ic .pfd-not { margin-top: 4.5mm; min-height: 12.5mm; padding: 2.6mm 0 2.2mm 4.5mm;
  font-size: 7.2pt; line-height: 1.15; }
.pfd.ic .pfd-not strong { font-size: 7.3pt; margin-bottom: 1.2mm; }

/* Birden çok ameliyatlı proformada kalem tablosu bilgi kutularının yerine geçer */
.pfd-kalem-ek { display: block; margin-top: .8mm; color: var(--pfd-muted); font-size: 6.6pt; }

@media print {
  /* Kenar boşluğu `@page`ten gelir (çok sayfalı belgede her sayfada tekrarlanır),
     bu yüzden kutunun kendi dolgusu baskıda kalkar. 297 − 18 − 16 = 263mm;
     258mm bilinçli olarak biraz altındadır: tam sınırda alt piksel yuvarlaması
     belgeyi bir sonraki sayfaya taşırıp ARKASINA BOŞ SAYFA bırakıyordu. */
  /* Proforma KENDİ sayfa kutusunu taşır: `@page proforma { margin: 0 }`.
     İki sonucu var, ikisi de bilinçli:
     1) Chrome, sayfa kenar boşluğuna kendi üstbilgi/altbilgisini basar (tarih,
        sekme başlığı, adres, "1/2"). Marj sıfırlanınca yazacak yer kalmaz ve
        bunları HİÇ basmaz — kullanıcı isteği (2026-08-17): "sayfanın üstünde
        altında anlamsız ... ngrok linkleri falan var, onlar olmasın".
     2) Kenar boşluğu artık belgenin kendi dolgusundan gelir. Proforma tek
        sayfalık bir belgedir; çok sayfalı belgelerdeki "ikinci sayfa kâğıdın
        tepesinden başlıyor" sorunu burada oluşmaz. Doktor fiyat listesi (`.a4`)
        eski `@page` marjını kullanmaya DEVAM eder — adlandırılmış sayfa yalnız
        `.pfd`ye bağlıdır.
     Yükseklik 297mm değil 295mm: tam sayfa yüksekliğinde alt piksel yuvarlaması
     belgeyi bir sonraki sayfaya taşırıp arkasına boş sayfa bırakıyor (ölçüldü —
     297 / 296,5 / 296mm → 3 sayfa, 295mm → 2 sayfa).
     `min-height` (sabit `height` değil): çok ameliyatlı bir proformada içerik
     sığmazsa ikinci sayfaya taşar; kırpmak veri kaybı olurdu.
     `@page { margin: 0 }` kuralı BU DOSYADA DEĞİL, proforma şablonlarının kendi
     `head_ek` bloğundadır: `@page` sayfa geneline uygulanır ve buraya yazılsa
     doktor fiyat listesi belgelerinin kenar boşluğunu da sıfırlardı. Adlandırılmış
     sayfa (`@page proforma`) denendi ve BIRAKILDI — sayfa tipi değiştiği için
     Chrome belgeden önce boş bir sayfa açıyordu (ölçüldü). */
  .pfd { width: 210mm; min-height: 295mm; margin: 0;
    padding: 18mm 18mm 16mm; box-shadow: none; overflow: visible; }
  /* Alt blok akışta; `margin-top: auto` sayfanın dibine iter (bkz. `.pfd` flex). */
  /* Hasta ve Hastane İçin nüshaları HER ZAMAN ayrı kâğıda basılır. Son belgede
     kırılım YOKTUR — `page-break-after: always` sonda kalırsa yazıcı arkasına
     boş bir sayfa ekler. Sonuncu şablonda `son` sınıfıyla işaretlenir; CSS
     `:last-of-type` kullanılamaz, her nüsha kendi sarmalayıcısının tek çocuğudur
     ve hepsi "son" sayılırdı (iki belgenin tek akışta birleşmesinin nedeni buydu). */
  .pfd { page-break-after: always; break-after: page; }
  .pfd.son { page-break-after: auto; break-after: auto; }
  .pfd-sec, .pfd-fiyat, .pfd-not, .pfd-toplam { break-inside: avoid; }
  .pfd-tablo thead { display: table-header-group; }
  .pfd-tablo tr { break-inside: avoid; page-break-inside: avoid; }
}

/* Belge önizlemesi mobilde akışkan olur: mm ölçüleri ve mutlak konumlu
   antet/altbilgi 390px'e sığmaz. Gerçek A4 ölçüleri @media print içinde aynen
   korunur — bu blok yalnızca EKRAN içindir. Kurallar `.pfd` üzerinden yazılır
   (`.proforma-screen` değil), böylece yeniden baskı ekranı da aynı davranır. */
@media screen and (max-width: 700px) {
  .proforma-screen .pf-stage { padding: 0; overflow: visible; }
  .proforma-screen .pf-stage-head { padding: var(--s3) 0 0; }
  .pfd { width: 100%; min-height: auto; margin: 0 0 var(--s4); padding: 20px 16px;
    box-shadow: none; font-size: 12px; overflow: visible; }
  .pfd-head { height: auto; padding-bottom: 14px; }
  .pfd-logo { position: static; width: 150px; margin-bottom: 12px; }
  .pfd-ic-rozet { position: static; width: 92px; height: 22px; margin-bottom: 10px;
    font-size: 10px; }
  .pfd-meta { position: static; width: 100%; font-size: 11px; line-height: 1.7; }
  .pfd-head.ic .pfd-meta { top: auto; }
  .pfd-meta-row { grid-template-columns: 84px 1fr; }
  .pfd-meta-k, .pfd-meta-v { text-align: left; padding: 0; }
  .pfd-title { margin-top: 16px; font-size: 17px; }
  .pfd-title-rule { height: 8px; }
  .pfd-kv { margin-top: 12px; font-size: 12px; }
  .pfd-kv td { height: auto; padding: 9px 10px; }
  .pfd-kv .k { width: 40%; font-size: 11px; }
  .pfd-kv .v { font-size: 12px; padding: 9px 10px; }
  .pfd-sec, .pfd-dagilim { margin-top: 20px; }
  .pfd-sec-title { font-size: 12px; }
  .pfd-sec-rule { height: 8px; }
  /* Üç kutu 390px'te yan yana okunmaz; alt alta iner, ayırıcı çizgi yön değiştirir. */
  .pfd-bilgi3 { grid-template-columns: 1fr; min-height: 0; margin-top: 10px; }
  .pfd-bilgi3 > div { padding: 10px 12px; }
  .pfd-bilgi3 > div + div { border-left: 0; border-top: .6pt solid var(--pfd-line); }
  .pfd-bilgi-k { font-size: 10px; margin-bottom: 4px; }
  .pfd-bilgi-v { font-size: 13px; }
  .pfd-bilgi-not { font-size: 10px; }
  .pfd-ek { grid-template-columns: 1fr; min-height: 0; gap: 4px; padding: 10px 2px;
    margin-top: 10px; font-size: 12px; }
  .pfd-ek-k { font-size: 11px; }
  .pfd-fiyat { flex-direction: column; align-items: stretch; gap: 6px; min-height: 0;
    margin-top: 20px; padding: 14px 2px; }
  .pfd-fiyat-k { font-size: 11px; }
  .pfd-fiyat-v { font-size: 20px; text-align: left; white-space: normal; }
  .pfd-fiyat-alt { font-size: 11px; }
  .pfd-not { margin-top: 16px; min-height: 0; padding: 12px 14px; font-size: 11px; }
  .pfd.ic .pfd-not { font-size: 11px; padding: 12px 14px; }
  .pfd-not strong { font-size: 11px; }
  .pfd-tablo { font-size: 11px; margin-top: 10px; }
  .pfd-tablo thead th { height: auto; padding: 8px 6px; font-size: 10px; }
  .pfd-tablo tbody td { height: auto; padding: 8px 6px; }
  .pfd-tablo .c1, .pfd-tablo .c2 { width: auto; }
  .pfd-toplam { min-height: 0; padding: 10px 6px; font-size: 12px; }
  .pfd-toplam .tutar { font-size: 13px; }
  .pfd-duzenleyen { padding-top: 16px; font-size: 11px; }
  .pfd-foot { margin-top: 16px; padding-top: 12px; }
  .pfd-foot-row { flex-direction: column; gap: 6px; }
  .pfd-adres { max-width: none; font-size: 10px; }
  .pfd-iletisim { font-size: 10px; white-space: normal; }
  .pfd-sayfa-no { margin-top: 8px; font-size: 10px; }
}

/* =========================================================================
   PROFORMA BELGESİ v2 (.pfb) — 2026-08-21'de onaylanan yeni tasarım
   Kaynak: Proforma-tasarim/gpt/revize/{ortak.css, hasta.html, kurum-ici.html}
   Ölçüler, punto ve mm değerleri o dosyalardan birebir alınmıştır.

   NEDEN YENİ AD (.pfd DEĞİL): `proforma_reprint.html` migration 030 öncesi
   (gövde JSON'u olmayan) kayıtlar için ESKİ `.pfd` ailesini kullanmaya devam
   ediyor. Aynı adları yeniden tanımlamak o yedek yolu sessizce bozardı.
   `.pfd` bloğu bu yüzden yerinde bırakıldı; canlı belge artık `.pfb`dir.

   SINIF ADI ÇAKIŞMASI: tasarımın kendi adları (.section, .note, .stats, .genis,
   .num, .k) panel CSS'iyle çakışıyordu — kök neden kaydı `hiza-sikayeti-kok-neden`.
   Hepsi `pfb-` önekiyle yeniden adlandırıldı; `test_sinif_tanimlari` bekçisi
   şablondaki her adın burada karşılığı olmasını zorunlu kılar.
   ========================================================================= */
.pfb {
  --pfb-ink: #202428; --pfb-mut: #697077; --pfb-line: #D2D6DA; --pfb-zebra: #F1F3F4;
  /* Altbilgi AKIŞTA durur ve `margin-top: auto` ile sayfanın dibine iner —
     mutlak konumlu DEĞİL. Tasarımın kendi dosyasında `position: absolute;
     bottom: 9mm` idi; orada belge tek A4 olduğu için sorun çıkmıyordu. Uygulamada
     çok ameliyatlı proforma 314mm'ye çıkabiliyor (ölçüldü) ve mutlak altbilgi tam
     sayfa sınırına, yani 296-305mm arasına düşüp KÂĞIDIN ORTASINDAN İKİYE
     BÖLÜNÜYORDU. Akıştaki altbilgi kısa belgede aynı yerde durur (275mm), uzun
     belgede içeriğin peşinden bütün hâlde ikinci sayfaya geçer. */
  display: flex; flex-direction: column;
  position: relative; width: 210mm; min-height: 297mm; margin: 0 0 var(--s5);
  padding: 14mm 16mm 9mm; background: #fff; color: var(--pfb-ink);
  /* `line-height: normal` — tasarımın `ortak.css`i gövdeye satır yüksekliği
     VERMİYOR, tarayıcı varsayılanını kullanıyor. Panelin `body`si ise 1.45
     dayatıyor ve miras alınırsa etiket/değer blokları şişip ölçü kutularının
     ayraç çizgilerini uzatıyor, belge tasarımdan görünür biçimde ayrılıyordu.
     Not/altbilgi/düzenleyen kendi değerlerini ayrıca veriyor (tasarımdaki gibi). */
  font-family: Arial, Helvetica, sans-serif; font-size: 10.5pt; line-height: normal;
  box-shadow: 0 16px 46px rgba(11, 34, 55, .18);
  -webkit-print-color-adjust: exact; print-color-adjust: exact;
}
/* Tasarımın kendi `ortak.css`inde burada `box-sizing` ve `<p>/<dl>/<dd>` marj
   sıfırlaması vardı (o dosyanın global reset'i yok). `style.css`te ikisini de
   dosyanın başındaki `* { box-sizing: border-box; margin: 0 }` zaten yapıyor —
   kopyalanan kurallar hiçbir şeyi değiştirmiyordu, kaldırıldı. */

/* ---- antet ----
   Logo, "KURUM İÇİ" rozeti ve künye TEK ÜST HATTA hizalanır (14mm). Rozet daha önce
   1mm aşağıdaydı: logonun üstünü 1mm, altını 0,4mm ıskalıyordu. */
.pfb-head { display: flex; align-items: flex-start; justify-content: space-between; }
.pfb-logo { width: 40mm; height: auto; }
.pfb-meta-wrap { display: flex; align-items: flex-start; gap: 6mm; text-align: right; }
.pfb-rozet {
  display: inline-block; flex: 0 0 auto; padding: 1.6mm 4mm;
  border: 1px solid var(--pfb-ink); border-radius: 1mm;
  font-size: 10.5pt; font-weight: 700; letter-spacing: .04em; white-space: nowrap;
}
.pfb-meta { display: grid; grid-template-columns: auto auto; gap: .8mm 6mm;
  font-size: 10.5pt; }
.pfb-meta dt { color: var(--pfb-mut); text-align: left; }
.pfb-meta dd { font-weight: 700; }
.pfb-rule { margin: 4mm 0 0; border: 0; border-top: 1.1pt solid var(--pfb-ink); }

/* ---- başlık ve kimlik ızgarası ---- */
.pfb-title { margin: 4mm 0 3mm; font-size: 21pt; font-weight: 700; letter-spacing: .01em; }
.pfb-kimlik {
  display: grid; grid-template-columns: repeat(3, 1fr); gap: 0;
  border-top: .8pt solid var(--pfb-line);
}
/* Ameliyat adı TAM SATIR: katalogdaki en uzun ad 66 karakter ve yarım sütunda üç
   satıra kırılıp ızgarayı 14mm şişiriyordu. */
.pfb-alan { padding: 2.2mm 8mm 2.2mm 0; border-bottom: .8pt solid var(--pfb-line); }
.pfb-alan.tam { grid-column: 1 / -1; }
.pfb-etiket { font-size: 9.5pt; color: var(--pfb-mut); letter-spacing: .05em;
  text-transform: uppercase; }
.pfb-deger { margin-top: .6mm; font-size: 11pt; font-weight: 700;
  overflow-wrap: anywhere; word-break: normal; }
/* Ameliyatın hastaya anlatılacak kısa açıklaması (kullanıcı isteği 2026-09-08).
   Adın ALTINDA, ince ve gri: tutarla ya da ameliyat adıyla yarışmaz, hasta ne
   ameliyatı olduğunu okur. Canlı veride 22–133 karakter (ortalama 58), yani
   tek satır — belge boyunu ameliyat başına bir satırdan fazla büyütmez. */
.pfb-aciklama { margin-top: .8mm; font-size: 9.5pt; font-weight: 400;
  line-height: 1.35; color: var(--pfb-mut); }

/* ---- bölüm ---- */
.pfb-sec { margin-top: 5mm; break-inside: avoid; page-break-inside: avoid; }
.pfb-sec-title { margin: 0 0 3mm; padding-bottom: 1.8mm;
  border-bottom: 1.1pt solid var(--pfb-ink);
  font-size: 12.5pt; font-weight: 700; letter-spacing: .06em; }

/* ---- ameliyat/paket bilgileri: solda ölçüler, sağda not ---- */
/* Ölçü sütunu tasarımda 1.45fr idi; canlı yatış metinleri ("1 gece yatış") örnek
   verilerden uzun olduğu için değer kendi kutusunda ikiye bölünüyordu. Oranlar
   ölçüldü (2026-08-21): 1.6fr'de 40 paketin 37'sinde değer sarmıyor, satır
   yüksekliği 18,6mm → 15,3mm düşüyor ve nota 65mm kalıyor (not 3 satır, satır
   yüksekliğini zaten o belirliyor — yani bu genişletme belgeye hiç yer maliyeti
   getirmiyor). Kalan üç pakette ("Günübirlik (yatışsız)") değer kendi kutusunda
   sarar; kutu sırası ve ayraçlar bozulmaz. */
.pfb-olcu-satir { display: grid; grid-template-columns: 1.6fr 1fr; gap: 0 8mm;
  align-items: start; }
/* ÜÇ KUTU HER ZAMAN TEK SATIRDA (`nowrap`). Tasarım dosyasında `flex-wrap: wrap`
   vardı ve orada sorun çıkarmıyordu, çünkü örnek değerler kısaydı ("3 gece").
   Canlıda yatış metni "1 gece yatış" / "Günübirlik (yatışsız)" biçiminde geliyor;
   ölçüldü (2026-08-21): EN KISA gerçek değerle bile üç kutu 104,2mm tutuyor ve
   100,6mm'lik alana sığmayıp "YOĞUN BAKIM" alt satıra düşüyordu — yani kayıklık
   40 paketin HEPSİNDE vardı. Artık kutular sarmaz; uzun DEĞER kendi kutusunda
   alt satıra iner (etiket bölünmez, kutu sırası bozulmaz). */
.pfb-olculer { display: flex; flex-wrap: nowrap; gap: 0 6mm; }
/* `min-width` VERİLMEZ (varsayılan `auto` = min-content): kutu, etiketinin
   genişliğinden daha dar olamaz. `min-width: 0` denendi ve etiketler kendi
   kutularını 5–24px aştı (ölçüldü) — ayraç çizgisinin üstüne biniyorlardı.
   Değer `overflow-wrap: anywhere` ile sardığı için taban yalnız etikettir. */
.pfb-olcu { flex: 0 1 auto; padding-left: 6mm;
  border-left: .8pt solid var(--pfb-line); }
.pfb-olcu:first-child { padding-left: 0; border-left: 0; }
.pfb-olcu-k { font-size: 9.5pt; color: var(--pfb-mut); letter-spacing: .03em;
  text-transform: uppercase; white-space: nowrap; }
.pfb-olcu-v { margin-top: .6mm; font-size: 12pt; font-weight: 700;
  overflow-wrap: anywhere; }

.pfb-not { font-size: 10pt; line-height: 1.45; color: var(--pfb-ink); }
.pfb-not b { font-weight: 700; }
.pfb-not.kutu { padding: 0 0 0 4mm; border-left: 1.6pt solid var(--pfb-line); }

/* ---- ek hizmetler ---- */
.pfb-ek { display: flex; gap: 4mm; margin-top: 5mm; padding-top: 3.5mm;
  border-top: .8pt solid var(--pfb-line); font-size: 11pt; }
.pfb-ek-k { flex: 0 0 auto; font-weight: 700; }
.pfb-ek-v { color: var(--pfb-ink); }

/* ---- fiyat kutusu (hasta nüshası) ----
   Etiket ve tutar AYNI satırda: alt alta iki satır harcıyordu ve paket fiyatı
   solda, peşin sağda kalınca tutarlar iki ayrı kolonda görünüyordu. */
.pfb-fiyat { margin-top: 10mm; padding: 7mm; border: 1.1pt solid var(--pfb-ink);
  border-radius: 1.5mm; break-inside: avoid; page-break-inside: avoid; }
.pfb-fiyat-satir, .pfb-alt-satir {
  display: flex; align-items: baseline; justify-content: space-between; gap: 6mm; }
.pfb-fiyat-k { font-size: 12pt; color: var(--pfb-mut); }
.pfb-fiyat-v { font-size: 19pt; font-weight: 700; white-space: nowrap;
  letter-spacing: -.01em; }
.pfb-alt-satir { margin-top: 4mm; padding-top: 4mm;
  border-top: .8pt solid var(--pfb-line); font-size: 11pt; }
.pfb-alt-k { color: var(--pfb-mut); }
.pfb-alt-v { font-weight: 700; white-space: nowrap; }
/* Peşin ödeme seçildiğinde: kutunun üstünde rozet, büyük tutar PEŞİN fiyattır,
   alt satırda paketin normal fiyatı durur (kullanıcı kararı 2026-08-21). */
.pfb-pesin-rozet { display: inline-block; margin-bottom: 3.5mm; padding: 1.2mm 3.5mm;
  border: 1pt solid var(--pfb-ink); border-radius: 1mm;
  font-size: 9.5pt; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; }
.pfb-indirim-not { margin-top: 2.5mm; font-size: 9.5pt; color: var(--pfb-mut); }

.pfb-gecerlilik { margin-top: 8mm; }
/* Peşin ödeme seçilince ARKA ARKAYA iki not durur (ödeme + geçerlilik). 8mm o
   grubu fiyat kutusundan ayırmak içindir; grubun İÇİNDE aynı boşluk iki notu
   birbirinden koparıyor ve boşa 4mm yiyordu. Ölçüldü: bu 4mm çok ameliyatlı
   peşin belgeyi fazladan kâğıttan kurtarıyor
   (`araclar/baski-sayfa-denetimi.py`). */
.pfb-gecerlilik + .pfb-gecerlilik { margin-top: 4mm; }

/* ---- düzenleyen ----
   Ticari belgede düzenleyen/imza bloğu sağ altta durur; iletişim numarası da
   burada, çünkü belgeyi alan kişi soruyu bu kişiye soracak. */
.pfb-duzenleyen { margin-top: 9mm; padding-top: 3.5mm;
  border-top: .8pt solid var(--pfb-line);
  text-align: right; font-size: 10.5pt; line-height: 1.4; }
.pfb-duz-k { color: var(--pfb-mut); }
.pfb-duz-ad { font-weight: 700; }

/* ---- altbilgi ---- */
.pfb-foot { margin-top: auto;
  display: grid; grid-template-columns: 1fr auto; gap: 0 6mm;
  padding-top: 3mm; border-top: .8pt solid var(--pfb-line);
  font-size: 9.5pt; line-height: 1.5; color: var(--pfb-mut); }
.pfb-foot > :last-child { text-align: right; white-space: nowrap; }
.pfb-foot b { color: var(--pfb-ink); }
/* Sayfa numarası altbilginin altında, akışta. Altbilgi gibi mutlak konumlanırsa
   uzun belgede sayfa sınırına düşer. */
.pfb-sayfa-no { margin-top: 2.5mm; text-align: center; font-size: 9pt;
  color: var(--pfb-mut); }

/* ---- belge tabloları: fiyat dağılımı ve çok ameliyatlı kalem listesi ---- */
.pfb-tablo { width: 100%; border-collapse: collapse; font-size: 10.5pt; }
/* Panel sızıntısının sıfırlanması BELGE KÖKÜNDE, tek yerde (`.pfb table` bloğu).
   Burada yalnız bu tasarıma özgü olan kalır: hücreler tepeden hizalanır —
   panel `vertical-align: middle` dayatıyor, tasarım `baseline` istiyor. */
.pfb-tablo th, .pfb-tablo td { vertical-align: baseline; }
/* Başlık ve grup satırları hafif gri: veri satırlarından ayırt edilsin
   (kullanıcı isteği). Renkli band değil, nötr bir ton. */
.pfb-tablo th { padding: 1.6mm 3mm; background: var(--pfb-zebra);
  border-bottom: .8pt solid var(--pfb-line);
  font-size: 9.5pt; color: var(--pfb-mut); letter-spacing: .05em;
  text-transform: uppercase; text-align: left; font-weight: 700; }
.pfb-tablo th.tutar, .pfb-tablo td.tutar { text-align: right; white-space: nowrap; }
.pfb-tablo td { padding: 1.2mm 3mm; border-bottom: .8pt solid var(--pfb-line); }
.pfb-tablo td.aciklama { color: var(--pfb-mut); }
/* Dış kenarlar sayfa ızgarasıyla hizalı: hücre dolgusu tabloyu içeri kaçırmasın. */
.pfb-tablo th:first-child, .pfb-tablo td:first-child { padding-left: 0; }
.pfb-tablo th:last-child, .pfb-tablo td:last-child { padding-right: 0; }
/* Alt grup: "Pay dağılımı" — açıklama cümlesi değil, sade bir ayraç. */
.pfb-grup td { padding: 2mm 3mm 1.8mm; background: var(--pfb-zebra);
  border-top: .8pt solid var(--pfb-line); border-bottom: .8pt solid var(--pfb-line);
  font-size: 9.5pt; font-weight: 700; letter-spacing: .06em; color: var(--pfb-ink); }
/* Hasta Fiyatı ayrı bir kutu değil, tablonun TOPLAM SATIRI: kutu kendi kenarlığı,
   dolgusu ve boşluğuyla ~9mm yiyordu; kalın çift çizgi aynı vurguyu bedavaya verir. */
.pfb-toplam td { padding: 3.4mm 3mm 3.2mm; border-top: 1.6pt solid var(--pfb-ink);
  border-bottom: 1.6pt solid var(--pfb-ink); font-size: 13.5pt; font-weight: 700; }
.pfb-toplam td.tutar { white-space: nowrap; }
/* `white-space: nowrap` YALNIZ TUTARDA: etiket hücresinde de duruyordu ve uzun
   etiket ("Paketin normal fiyatı (%5 peşin indirimi düşülmüştür)") tabloyu
   sayfa genişliğinin DIŞINA taşırıp tutar sütununu kâğıttan düşürüyordu
   (ölçüldü 2026-08-21). Etiket sarabilir, tutar bölünemez. */
.pfb-pesin td { padding: 1.8mm 3mm 0; border-bottom: 0; font-size: 10pt;
  color: var(--pfb-mut); }
.pfb-pesin td.tutar { white-space: nowrap; }
/* Kayıt notu ile düzenleyen aynı satırı paylaşır; alt alta iki blok bir satır
   boşa harcıyordu. */
.pfb-alt-blok { display: grid; grid-template-columns: 1.5fr 1fr; gap: 0 8mm;
  align-items: start; margin-top: 6mm; }
.pfb-alt-blok .pfb-duzenleyen { margin-top: 0; padding-top: 0; border-top: 0; }

/* ---- hasta nüshasına özel dikey ritim ----
   Bu nüshada içerik az, sayfa bol: kurum içi nüshanın sıkı ritmi belgeyi üstte
   toplayıp altta boşluk bırakıyordu. Punto değişmeden dikey ritim açıldı.

   `:not(.coklu)` — gerekçe ("içerik az") ÇOK AMELİYATLI belgede geçerli değildir:
   orada kalem tablosu sayfayı zaten doldurur ve fazladan hava belgeyi ikinci
   kâğıda taşırır. Punto değişmez, yalnız boşluk kurum nüshasının ritmine döner
   (ölçüm: `araclar/baski-sayfa-denetimi.py`). */
.pfb.hasta:not(.coklu) .pfb-alan { padding-top: 3mm; padding-bottom: 3mm; }
.pfb.hasta:not(.coklu) .pfb-sec { margin-top: 9mm; }
.pfb.hasta .pfb-ek { margin-top: 6mm; padding-top: 4mm; }
.pfb-kapsam-notu { margin-top: 3.5mm; }

@media print {
  /* Kenar boşluğu belgenin KENDİ dolgusundan gelir; `@page { margin: 0 }` şablonun
     `head_ek` bloğundadır (buraya yazılsa doktor fiyat listesini de etkilerdi).
     Chrome sayfa marjına kendi üstbilgi/altbilgisini basar — marj sıfırlanınca
     yazacak yer kalmaz ve ngrok linki kâğıda çıkmaz (bkz. `test_baski_kurallari`).

     `min-height` (sabit `height` DEĞİL): tasarım tek A4'e göre ölçülüdür, ama çok
     ameliyatlı bir proformada kalem tablosu uzayabilir. Sabit yükseklik + `overflow:
     hidden` o kısmı sessizce KIRPARDI — veri kaybı. Taşarsa ikinci sayfaya geçer.

     297mm BURADA KÜÇÜLTÜLMEZ. `.pfd` baskı bloğu tam sayfa yüksekliğinde her
     nüshanın arkasına boş kâğıt çıktığı için 295mm'ye çekilmişti; aynı düzeltmenin
     `.pfb`ye kopyalanması gerektiği düşünüldü ve ÖLÇÜLDÜ (2026-08-30,
     `araclar/baski-sayfa-denetimi.py`): 297mm ve 295mm bütün senaryolarda AYNI
     sonucu veriyor (iki nüsha → 2 sayfa). `.pfb` `.pfd`den farklı olarak `overflow:
     hidden` taşımaz ve dolgusu başkadır; o tuzak burada yok. Ölçmeden 2mm
     kısaltmak belgeyi tasarımdan sebepsiz ayırırdı. */
  .pfb { margin: 0; box-shadow: none; }
  /* Hasta ve Hastane İçin nüshaları HER ZAMAN ayrı kâğıda basılır. Son belgede
     kırılım YOKTUR — sonda kalırsa yazıcı arkasına boş bir sayfa ekler. `son`
     sınıfıyla işaretlenir; `:last-of-type` kullanılamaz, her nüsha kendi
     sarmalayıcısının tek çocuğudur ve hepsi "son" sayılırdı. */
  .pfb { page-break-after: always; break-after: page; }
  .pfb.son { page-break-after: auto; break-after: auto; }
  /* Altbilgi ikinci sayfaya geçerse BÜTÜN geçer, ortadan bölünmez. */
  .pfb-sec, .pfb-fiyat, .pfb-gecerlilik, .pfb-foot { break-inside: avoid; }
  .pfb-tablo thead { display: table-header-group; }
  .pfb-tablo tr { break-inside: avoid; page-break-inside: avoid; }
}

/* Belge önizlemesi mobilde akışkan olur: mm ölçüleri ve mutlak konumlu altbilgi
   390px'e sığmaz. Gerçek A4 ölçüleri @media print içinde aynen korunur — bu blok
   yalnızca EKRAN içindir. */
@media screen and (max-width: 700px) {
  .pfb { width: 100%; min-height: auto; margin: 0 0 var(--s4); padding: 20px 16px;
    box-shadow: none; font-size: 13px; }
  .pfb-head { flex-direction: column; align-items: flex-start; gap: 12px; }
  .pfb-logo { width: 150px; }
  .pfb-meta-wrap { flex-direction: column-reverse; align-items: flex-start;
    gap: 10px; text-align: left; width: 100%; }
  .pfb-rozet { font-size: 11px; padding: 4px 10px; }
  .pfb-meta { grid-template-columns: 96px 1fr; gap: 4px 12px; font-size: 12px; }
  .pfb-meta dt { text-align: left; }
  .pfb-title { margin: 14px 0 10px; font-size: 18px; }
  /* Üç kolon 390px'te okunmaz; her alan tam satıra iner. */
  .pfb-kimlik { grid-template-columns: 1fr; }
  .pfb-alan { padding: 10px 0; }
  .pfb.hasta .pfb-alan { padding: 10px 0; }
  .pfb-etiket { font-size: 11px; }
  .pfb-deger { font-size: 14px; }
  .pfb-aciklama { font-size: 12px; }
  .pfb-sec, .pfb.hasta .pfb-sec { margin-top: 20px; }
  .pfb-sec-title { font-size: 14px; padding-bottom: 6px; margin-bottom: 12px; }
  .pfb-olcu-satir { grid-template-columns: 1fr; gap: 12px; }
  .pfb-olculer { gap: 0; flex-direction: column; flex-wrap: wrap;
    align-items: stretch; }
  .pfb-olcu { padding: 8px 0 0; border-left: 0; border-top: .8pt solid var(--pfb-line); }
  .pfb-olcu:first-child { padding-top: 0; border-top: 0; }
  .pfb-olcu-k { font-size: 11px; }
  .pfb-olcu-v { font-size: 15px; }
  .pfb-not { font-size: 12px; }
  .pfb-ek, .pfb.hasta .pfb-ek { flex-direction: column; gap: 4px;
    margin-top: 16px; padding-top: 12px; font-size: 13px; }
  /* mm cinsinden boşluk 390px'te göze çarpmıyor: kapsam notu ek hizmet listesine
     yapışık okunuyordu (okunaklılık önce). */
  .pfb-kapsam-notu { margin-top: 10px; }
  .pfb-fiyat { margin-top: 20px; padding: 16px; }
  .pfb-fiyat-satir, .pfb-alt-satir { flex-direction: column; align-items: flex-start;
    gap: 4px; }
  .pfb-fiyat-k { font-size: 12px; }
  .pfb-fiyat-v { font-size: 22px; white-space: normal; }
  .pfb-alt-satir { margin-top: 12px; padding-top: 12px; font-size: 13px; }
  .pfb-alt-v { white-space: normal; }
  .pfb-pesin-rozet { font-size: 11px; padding: 4px 10px; margin-bottom: 12px; }
  .pfb-indirim-not { font-size: 12px; }
  .pfb-gecerlilik { margin-top: 20px; }
  .pfb-duzenleyen { margin-top: 20px; padding-top: 12px; font-size: 12px;
    text-align: left; }
  /* Tablo 390px'te yatay kaydırılabilir kendi kutusunda kalır: sayfa gövdesi
     yatay kaymaz (mobil uyumluluk kuralı). */
  .pfb-tablo-kutu { overflow-x: auto; }
  .pfb-tablo { font-size: 12px; min-width: 300px; }
  .pfb-tablo th { padding: 8px 6px; font-size: 11px; }
  .pfb-tablo td { padding: 8px 6px; }
  .pfb-toplam td { padding: 12px 6px; font-size: 15px; }
  .pfb-pesin td { padding: 8px 6px 0; font-size: 12px; white-space: normal; }
  .pfb-alt-blok { grid-template-columns: 1fr; gap: 16px; }
  .pfb-foot { margin-top: 20px; grid-template-columns: 1fr;
    gap: 8px; font-size: 11px; }
  .pfb-foot > :last-child { text-align: left; white-space: normal; }
  .pfb-sayfa-no { margin-top: 10px; font-size: 11px; }
}


/* ---- koşullu ek ücret notu (endoskopi vb.) ---- */
.pfb-kosullu { margin: 6px 0 0; padding: 6px 8px; border: 1px solid #e6d9b8;
  border-radius: var(--radius-xs); background: var(--amber-faint); }
.pfb-kosullu-baslik { display: block; font-size: var(--fs-3xs); font-weight: 700;
  text-transform: uppercase; letter-spacing: .04em; color: var(--amber); }
.pfb-kosullu-liste { margin: 3px 0 0; padding-left: 16px; font-size: var(--fs-2xs); }
.pfb-kosullu-liste li { margin: 1px 0; }
.pfb-kosullu-alt { margin: 3px 0 0; font-size: var(--fs-3xs); color: var(--mut); }
/* BELGE SONU */
/* =========================================================================
   GENEL ÖLÇEK — kullanıcı kararı (2026-08-17)
   2560×1440 ekranda arayüz büyük geliyordu; Chrome'un %90 yakınlaştırması doğru
   ölçüyü verdi. `zoom` tarayıcı yakınlaştırmasının aynısını yapar: punto, boşluk,
   kontrol yüksekliği ve menü genişliği ORANTILI küçülür — hiçbir yerleşim ya da
   kaydırma kuralı değişmez, hiçbir bileşen ayrıca elden geçirilmez.
   Sınırlar bilinçli:
   - `screen`: baskıda uygulanmaz. A4 belgeleri mm biriminde ölçülür; %90 küçülen
     bir proforma kâğıda yanlış basılırdı.
   - `min-width: 1600px`: yalnız puntonun zaten büyütüldüğü geniş ekranlarda.
     1440px dizüstünde gövde 15px'tir, orada küçültmek yazıyı okunmaz yapardı.
   `100vh` görsel alanı ölçer ve zoom'dan etkilenmez: tam ekran yüksekliği isteyen
   kurallar aynı çarpanla geri büyütülür, yoksa menü ekranın altına yetişmez.
   Blok dosyanın SONUNDADIR: `.sidebar`/`body` yükseklikleri yukarıda tanımlıdır,
   eşit özgüllükte sonra gelen kural kazanır.
   ========================================================================= */
@media screen and (min-width: 1600px) {
  :root { --olcek: .9; zoom: var(--olcek); }
  body, .shell, .giris-ekran { min-height: calc(100vh / var(--olcek)); }
  .sidebar { height: calc(100vh / var(--olcek)); }
}

/* Bildirim tercihleri (Hesabım) — her tür tek satır: kutu solda, ad ve açıklama
   sağda. Açıklama etiketin altına iner, satırlar arası ince ayraçla ayrılır. */
.bildirim-tercih { display: grid; gap: 0; }
.bildirim-satir { display: grid; grid-template-columns: auto minmax(0, 1fr);
  align-items: start; gap: var(--s3); padding: 10px 0;
  border-bottom: 1px solid var(--line); cursor: pointer; }
.bildirim-satir input { width: auto; margin-top: 3px; flex: none; }
.bildirim-satir .hint { display: block; margin-top: 2px; }
.bildirim-tercih .btn { justify-self: start; margin-top: var(--s3); }
.mt { margin-top: var(--s4); }
/* Zorunlu alan işareti — etiketin yanında küçük kırmızı yıldız */
.zorunlu { color: var(--neg); font-weight: 700; }

/* İptal edilmiş proforma satırı: kayıt görünür kalır ama "geçersiz" okunur.
   Silinmediği için numara arşivde durur; soluk gösterim onu geçerli belgelerden ayırır. */
.satir-iptal td { opacity: .55; }
.satir-iptal td strong { text-decoration: line-through; }
/* Bildirim türü listesinde açıklama, adın altına iner. */
.yetki-ozet li .hint { display: block; margin: 2px 0 0; }

/* Hasta geçmişi paneli (Proforma Oluştur) — önizlemenin üstünde, belge
   üretilmeden önce görünür. Başlıklar üç güven düzeyini ayırır. */
.gecmis-kutu h3 { margin: var(--s4) 0 var(--s2); font-size: var(--fs-md); }
.gecmis-kutu h3:first-child { margin-top: 0; }
.gecmis-kutu h3 .hint { font-weight: 400; }
/* SINIF ÇAKIŞMASI (2026-08-19): `gecmis-tablo` adını iki ayrı ekran kullanıyor —
   burası hasta geçmişi (4 kolon), `import.html` ise Excel aktarma geçmişi (8 kolon).
   Bu kurallar dosyada sonra geldiği için oradaki kolon genişliklerini eziyordu:
   içe aktarma tablosu 1080px yerine 520px'e sıkışıyor, İşlemler kolonu 150px yerine
   104px alıyor ve "dosya saklanmamış" yazısı hücreden taşıyordu. Kurallar kendi
   kutusuna hapsedildi; içe aktarma tablosu artık kendi tanımını kullanır. */
.gecmis-kutu .gecmis-tablo { table-layout: fixed; width: 100%;
  min-width: calc(520px * var(--kol)); }
.gecmis-kutu .gecmis-tablo .c-belge { width: calc(132px * var(--kol)); }
.gecmis-kutu .gecmis-tablo .c-op { width: auto; }
.gecmis-kutu .gecmis-tablo .c-tl { width: calc(104px * var(--kol)); }
.gecmis-kutu .gecmis-tablo .c-ac { width: calc(104px * var(--kol)); }
.gecmis-kutu .gecmis-tablo td { white-space: normal; }
.gecmis-kutu .gecmis-tablo td.num,
.gecmis-kutu .gecmis-tablo td.right { white-space: nowrap; }
@media screen and (max-width: 700px) {
  /* Geçmiş tablosu dar ekranda da kendi kutusunda kayar; kaydırma payı azalsın
     diye yardımcı kolonlar daraltılır (Fiyat ve Görüntüle görünürde kalsın). */
  .gecmis-kutu .gecmis-tablo { min-width: 430px; }
  .gecmis-kutu .gecmis-tablo .c-belge { width: 116px; }
  .gecmis-kutu .gecmis-tablo .c-tl { width: 84px; }
  .gecmis-kutu .gecmis-tablo .c-ac { width: 88px; }
  .gecmis-kutu .card-body { padding: var(--s3); }
}

/* Seçili ama tutarı girilmemiş doğrudan fiyatlı hizmet: satır işaretlenir, altında
   kısa bir not çıkar. Bu hâlde paket kaydedilemez (kullanıcı kararı 2026-08-17). */
.tutar-eksik-satir td { background: var(--warn-soft); }
/* `.direct` Paket Oluşturucu, `.price` Doktora Özelleştir ekranının tutar alanıdır */
.tutar-eksik-satir .direct,
.tutar-eksik-satir .price { border-color: var(--warn); }
.tutar-eksik { display: block; margin-top: 2px; color: var(--warn);
  font-size: var(--fs-xs); font-weight: 600; }

/* Menüdeki sayı rozeti: bekleyen destek talebi / okunmamış yanıt.
   Kullanıcı isteği (2026-08-17): "tamamlandı olana kadar menüde talep sayısı yazsın". */
.nav-sayi { display: inline-grid; place-items: center; min-width: 19px; height: 19px;
  margin-left: auto; padding: 0 5px; border-radius: 99px;
  background: var(--neg); color: var(--on-pri); font-size: var(--fs-3xs); font-weight: 700;
  font-variant-numeric: tabular-nums; }

/* Destek talebinde verilen cevap, ayrı sütun yerine KONU hücresinin altında durur
   (kullanıcı isteği 2026-08-17): soru ile cevap yan yana okunur. */
.destek-cevap { display: block; margin-top: var(--s2); padding: 6px 9px;
  border-left: 3px solid var(--ok); background: var(--ok-soft);
  border-radius: var(--radius-sm); font-size: var(--fs-xs); color: var(--ink);
  white-space: normal; }
.destek-cevap strong { color: var(--ok); }
.destek-yanitlayan { display: block; margin-top: 3px; color: var(--mut);
  font-size: var(--fs-2xs); }
/* Kişi hücresindeki uzun e-posta sabit genişlikli sütundan taşıyordu; cevap kutusu
   eklenince komşu hücrenin üstüne bindiği görüldü. Boşluksuz adresler kırılır. */
.destek-yonetim-tablo .c-kisi, .destek-yonetim-tablo td:nth-child(2) {
  overflow-wrap: anywhere; }
.destek-yonetim-tablo td .svc-meta { white-space: normal; }

/* Paket detayı — staff tarifelerinin hastane payı / doktor hakedişi kırılımı. */
/* Kart dar bir sütunda durduğu için başlıklar iki satıra sarar ("Doktor hakedişi"
   tek satırda kesiliyordu); tutar kolonları dar ve bölünmez. */
.staff-pay-tablo { table-layout: fixed; min-width: calc(400px * var(--kol)); font-size: var(--fs-xs); }
.staff-pay-tablo .c-ad { width: auto; }
.staff-pay-tablo .c-tl { width: calc(92px * var(--kol)); }
.staff-pay-tablo td.num { white-space: nowrap; }
.staff-pay-tablo th.num { white-space: normal; line-height: 1.25; }
.staff-pay-tablo th, .staff-pay-tablo td { padding-inline: 6px; }

/* Cari Formülleri örnek hesabı: fiyatın yanında pay dağılımı da gösterilir.
   Önizlemede her tarife İKİ satır olur (mevcut / yeni) — yan yana altı kolon yerine
   bu düzen seçildi, dar kartta okunaklı kalıyor. İki satır, aradaki çizgi
   kaldırılarak görsel olarak tek kayda bağlanır. */
/* Sayı kolonları sabit, ad kolonu kalanı alır: pay kolonları eklenince
   "Yurtdışı Komisyonlu" iki satıra düşüyordu (tasarım denetimi bulgusu). */
.ornek-pay { table-layout: fixed; }
.ornek-pay th:first-child, .ornek-pay td:first-child { width: auto; }
.ornek-pay th.num, .ornek-pay td.num { width: calc(94px * var(--kol)); }
.ornek-pay th.num { white-space: normal; line-height: 1.25; }
.ornek-pay td.num { white-space: nowrap; }
.ornek-pay th, .ornek-pay td { padding-inline: 6px; }
.ornek-pay .mini { font-size: var(--fs-3xs); color: var(--mut); font-weight: 400; }
.ornek-pay .ornek-mevcut td { border-bottom: 0; color: var(--mut); padding-bottom: 2px; }
.ornek-pay .ornek-yeni td { padding-top: 0; }

/* Parola alanı + "Göster/Gizle" düğmesi (bkz. templates/_parola_goster.html).
   Sarmalayıcı JS ile eklenir; alanın kendisi hiç değişmez, yalnız sağ tarafında
   düğmeye yer açılır. */
.parola-alan { position: relative; display: block; }
.parola-alan input { width: 100%; padding-right: 74px; }
.parola-goz { position: absolute; right: 5px; top: 50%; transform: translateY(-50%);
  height: calc(var(--ctl-h) - 10px); padding: 0 10px; border: 1px solid var(--line);
  border-radius: var(--radius-sm); background: var(--surface-2); color: var(--pri-ink);
  font: inherit; font-size: var(--fs-2xs); line-height: 1; cursor: pointer; }
.parola-goz:hover { background: var(--pri-soft); border-color: var(--line-strong); }
@media (max-width: 700px) {
  /* Dokunma hedefi: alan 44px olunca düğme de büyür, kenara yapışmaz */
  .parola-goz { height: 34px; padding: 0 12px; }
}

/* =========================================================================
   İMZACI ANAHTARI — /onay "İmza kuralı" panelindeki kişi listesi
   Kullanıcı isteği (2026-08-18): *"tüm yöneticilere imza gidebilme yetkisi olsun
   ama ... anahtarla seçebileyim."* Anahtar bir <button>'dır ve POST formu gönderir:
   JS olmadan çalışır, klavyeyle erişilir; `role="switch"` + `aria-checked` durumu
   ekran okuyucuya taşır.
   ========================================================================= */
/* Okunabilir genişlik: tam genişlikte ad solda, anahtar 1100px ötede kalıyordu */
.imzaci-liste { max-width: 560px; border: 1px solid var(--line);
  border-radius: var(--radius); overflow: hidden; }
.imzaci-satir { display: flex; align-items: center; justify-content: space-between;
  gap: var(--s4); padding: var(--s3); background: var(--panel); }
.imzaci-satir + .imzaci-satir { border-top: 1px solid var(--line); }
.imzaci-kisi { min-width: 0; }

.anahtar { display: inline-flex; align-items: center; gap: var(--s2); flex: none;
  min-height: var(--ctl-h); padding: 0 var(--s2); border: 0; background: none;
  color: var(--mut); font: inherit; font-size: var(--fs-sm); cursor: pointer; }
.anahtar-yuva { position: relative; flex: none; width: 42px; height: 24px;
  border: 1px solid var(--line-strong); border-radius: 999px;
  background: var(--surface-2); transition: background .15s, border-color .15s; }
.anahtar-top { position: absolute; top: 2px; left: 2px; width: 18px; height: 18px;
  border-radius: 50%; background: var(--panel); box-shadow: var(--shadow-1);
  transition: transform .15s; }
.anahtar-yazi { white-space: nowrap; }
.anahtar:hover .anahtar-yuva { border-color: var(--pri-ink); }
.anahtar.acik { color: var(--ok); font-weight: 600; }
.anahtar.acik .anahtar-yuva { background: var(--ok); border-color: var(--ok); }
.anahtar.acik .anahtar-top { transform: translateX(18px); }

/* SEKMESİZ ekranlarda iki nüsha da görünür. `_belge_govde.html`, "Hastane İçin"
   nüshasına `.off` koyar; bu, proforma ekranındaki sekme (.pf-tab) içindir. Sekmesi
   olmayan ekranlarda (imza ekranı, arşivden açılan belge) o sınıf nüshayı kalıcı
   gizliyordu: kullanıcı bildirimi 2026-08-18 *"pdf'e basınca sadece hasta için olanı
   görünüyor ... yazdır diyince ikisini de görebiliyorum"* — ekranda gizli, baskıda
   görünür olması tam da bu yüzdendi (baskı kuralı `.off`u zaten geri açıyor). */
.tum-nushalar .pf-doc.off { display: block; }

@media (max-width: 700px) {
  /* Dokunma hedefi büyür; top da orantılı kayar (yuva 44px iç genişlik) */
  .imzaci-satir { gap: var(--s3); padding: var(--s3) var(--s2); }
  .anahtar-yuva { width: 46px; height: 26px; }
  .anahtar-top { width: 20px; height: 20px; }
  .anahtar.acik .anahtar-top { transform: translateX(20px); }
}

/* İMZASIZ BELGE BASILAMAZ — kullanıcı bildirimi 2026-08-18: *"imzaya göndermeden
   sağ klikle hala çıktı alabiliyor fiyatlandırma uzmanı."*

   Onay kapısı (`proforma._onay_dogrula`) yalnız "Yazdır ve Kaydet" düğmesinin çağırdığı
   uçta duruyordu. Tarayıcının kendi yazdırması (sağ tık → Yazdır, Ctrl+P, menü) o ucu
   hiç çağırmaz; belge DOM'da hazır durduğu ve baskı kuralları onu güzelce dizdiği için
   imzasız kâğıt çıktı alınabiliyordu. Kural artık baskı katmanında da var: gövdede
   `basilamaz` sınıfı varsa belge basılmaz, yerine gerekçe basılır. */
.basilamaz-uyari { display: none; }
@media print {
  /* `.pfd` proforma, `.a4` doktor fiyat listesi, `.dgm-sayfa` doğum belgesidir.
     Doğum 2026-09-02'de eklendi: body sınıfı vardı ama gövdesi gizlenmediği için
     kilit hiçbir şey yapmıyordu (test yakaladı). */
  .basilamaz .pf-stage, .basilamaz .pfd, .basilamaz .a4,
  .basilamaz .dgm-sayfa { display: none !important; }
  .basilamaz .basilamaz-uyari { display: block !important; padding: 24px;
    border: 2px solid #000; font-size: 12pt; line-height: 1.6; }
  /* `body`/`.shell` min-height 100vh'dir; baskıda 100vh = bir sayfa boyu olduğu için
     belge gizlenince geriye kalan kısa içerik yine bir tam sayfa kaplıyor ve arkasına
     BOŞ ikinci sayfa düşüyordu. Yalnız bu yola özel sıfırlanır. */
  .basilamaz, .basilamaz .shell { min-height: 0 !important; }
}

/* İÇE AKTARMA ÇAKIŞMALARI (kullanıcı isteği 2026-08-20)
   Mevcut doktor kaydı sessizce ezilmiyor; her karar burada tek tek soruluyor.
   Okunaklılık yoğunluğun önünde: satırlar geniş, seçimler parmakla basılabilir. */
.cakisma { border: 1px solid var(--line); border-radius: 8px; padding: 12px 14px; }
.cakisma-ad { margin: 0 0 8px; font-size: 15px; letter-spacing: .01em; }
.cakisma-ad .badge { margin-left: 8px; vertical-align: middle; }
.cakisma-satir { display: flex; flex-wrap: wrap; gap: 8px 16px;
  align-items: baseline; justify-content: space-between;
  padding: 8px 0; border-top: 1px dashed var(--line); }
.cakisma-satir:first-of-type { border-top: 0; }
.cakisma-durum { flex: 1 1 240px; line-height: 1.5; }
/* Tek gerçekten tehlikeli karar bu: staff/misafir değişimi fiyatı değiştirir. */
.cakisma-not { display: inline-block; margin-left: 6px; font-size: 12px;
  color: var(--warn); font-weight: 600; }
.cakisma-secim { display: flex; gap: 14px; flex: 0 0 auto; }
.cakisma-secim label { display: inline-flex; align-items: center; gap: 5px;
  white-space: nowrap; cursor: pointer; }
.ttb-girdi { width: 90px; text-align: right; }
.ttb-tablo th, .ttb-tablo td { vertical-align: middle; }
/* Excel ile mevcut paket arasındaki fark listesi (içe aktarma çakışma ekranı). */
.paket-fark { margin: 0 0 10px; padding: 0; list-style: none; }
.paket-fark li { display: flex; gap: 8px; align-items: baseline;
  padding: 3px 0; line-height: 1.5; }
.fark-im { flex: 0 0 16px; text-align: center; font-weight: 700; }
.fark-eklenen .fark-im { color: var(--ok); }
.fark-cikan .fark-im { color: var(--neg); }
.fark-degisen .fark-im { color: var(--mut); }

@media (max-width: 700px) {
  /* Seçimler alt satıra iner; kutucuklar dar ekranda da tam genişlikte okunur. */
  .cakisma-satir { flex-direction: column; gap: 6px; }
  /* `flex: 1 1 240px` DİKEY akışta 240px'lik bir YÜKSEKLİK tabanına dönüşüyordu:
     her soru bloğunun içinde 240px boş alan kalıyor, ekran uzayıp okunmaz oluyordu
     (390px'te ölçüldü, 2026-08-20). Dar ekranda taban kaldırılır. */
  .cakisma-durum { flex: 0 0 auto; }
  .cakisma-secim { width: 100%; gap: 18px; }
  .ttb-girdi { width: 100%; }
  /* 5 sütunluk TTB tablosu 390px'te yatay kaymak yerine kart olur. */
  .ttb-tablo, .ttb-tablo tbody, .ttb-tablo tr, .ttb-tablo td { display: block; width: auto; }
  .ttb-tablo thead { display: none; }
  .ttb-tablo tr { border: 1px solid var(--line); border-radius: 8px;
    padding: 10px 12px; margin-bottom: 10px; }
  .ttb-tablo td { border: 0; padding: 3px 0; text-align: left; }
  .ttb-tablo td.num { text-align: left; }
}

/* Belgenin imza kaydı (kim, ne zaman) — ekran bilgisidir, baskıya girmez. */
.imza-seridi { display: flex; flex-wrap: wrap; align-items: baseline; gap: var(--s2) var(--s4);
  margin: 0 0 var(--s4); padding: var(--s3) var(--s4);
  background: var(--ok-soft); border: 1px solid var(--line); border-radius: var(--radius); }
.imza-baslik { font-size: var(--fs-3xs); letter-spacing: .06em; text-transform: uppercase;
  color: var(--mut); }
/* Ad `imza-seridi-liste`: eskiden `.imza-liste` idi ve proforma özet TABLOSU da aynı
   sınıfı taşıdığından tablo flex olup 300px'e büzülüyordu (2026-09-03). */
.imza-seridi-liste { display: flex; flex-wrap: wrap; gap: var(--s2) var(--s5);
  margin: 0; padding: 0; list-style: none; }
.imza-seridi-liste li { font-size: var(--fs-sm); }
.imza-rol { color: var(--mut); }
.imza-zaman { color: var(--mut); margin-left: var(--s2); white-space: nowrap; }
@media (max-width: 700px) {
  .imza-seridi { flex-direction: column; gap: var(--s1); }
  .imza-liste { flex-direction: column; gap: var(--s1); }
  .imza-zaman { display: block; margin-left: 0; }
}

/* Toplu seçim çubuğu (Paketler / Ameliyatlar listeleri, yalnız süper yönetici).
   Seçim kutusu, bölüm seçici ve silme düğmesi tek hatta; dar ekranda alt alta. */
.toplu-cubuk { display: flex; flex-wrap: wrap; align-items: center; gap: var(--s3) var(--s4);
  margin: 0 0 var(--s3); padding: var(--s3) var(--s4);
  background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); }
.toplu-cubuk .btn[disabled] { opacity: .5; cursor: not-allowed; }
.toplu-bolum { display: inline-flex; align-items: center; gap: var(--s2);
  font-size: var(--fs-sm); color: var(--mut); }
.toplu-bolum select { min-width: 160px; }
.toplu-sec { width: 16px; height: 16px; }
th.c-sec, td:has(> .toplu-sec) { width: 34px; }
.rec-head .toplu-sec { margin-right: var(--s2); }
@media (max-width: 700px) {
  .toplu-cubuk { flex-direction: column; align-items: stretch; }
  .toplu-cubuk .btn { width: 100%; }
  .toplu-bolum select { flex: 1; }
}

/* ---------------------------------------------------------------- Düz paketler
   Doğum paketi kapsam editörü. Sınıflar `dgm-` ile ÖNEKLİ: bu projede önce
   önekiz adlar (`.satir`, `.baslik`) panelin genel kurallarıyla çakışıp hizayı
   bozmuştu. Belge gövdesi de aynı öneki kullanır. */
/* `.frm > div` (özgüllük 0,1,1) `flex-direction: column` dayatıyor ve özet
   kalemleri alt alta diziliyordu; kural bu yüzden `.frm >` ile yazılır. */
.dgm-ozet { display: flex; flex-direction: row; flex-wrap: wrap;
            gap: 6px 22px; padding: 10px 12px; border-radius: var(--radius);
            background: var(--surface-2); font-size: var(--fs-md); }
/* Konaklama kartı ODA'ya göre gruplanır (kullanıcı 2026-09-04: "Mini Suit Oda
   başlığı altında yükseltme - ekstra gece şeklinde"). Her oda kendi kutusunda:
   üstte oda adı, altında o odanın iki rakamı. */
.dgm-odalar { display: grid; gap: 10px; margin: 4px 0 12px;
              grid-template-columns: repeat(auto-fit, minmax(196px, 1fr)); }
.dgm-oda { border: 1px solid var(--line); border-radius: var(--radius);
           padding: 10px 12px 12px; background: var(--surface-2); min-width: 0; }
.dgm-oda h3 { margin: 0 0 8px; font-size: var(--fs-md); }
.dgm-oda label { display: block; margin: 8px 0 4px; }
.dgm-oda label:first-of-type { margin-top: 0; }
.dgm-oda input { width: 100%; }
/* Denk yükseklik: kutu içindeki satırlar dört odada da aynı hizada başlasın. */
.dgm-oda .dgm-oda-not { display: flex; align-items: center; min-height: var(--ctl-h);
                        margin: 0; color: var(--mut); font-size: var(--fs-xs); }
.dgm-blok { border: 1px solid var(--line); border-radius: var(--radius-lg);
            padding: 10px; margin: 0 0 10px; }
.dgm-blok.seviye-2 { margin-left: 18px; background: var(--bg); }
.dgm-blok-basi { display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
                 margin-bottom: 8px; }
.dgm-blok-basi .dgm-baslik { flex: 1 1 240px; font-weight: 600; }
.dgm-madde { display: flex; gap: 8px; margin: 0 0 6px; }
.dgm-madde input { flex: 1; }
.dgm-madde .dgm-tutar { flex: 0 0 110px; text-align: right; }
.ob-maddeler { display: grid; gap: 6px; margin-bottom: var(--s2); }
/* Mobilde parmakla basılabilir olmalı (390px kuralı, bkz. mobil-uyumluluk). */
.dgm-blok .btn { min-height: 44px; }
@media (max-width: 480px) {
  .dgm-blok-basi { flex-direction: column; align-items: stretch; }
  /* Sütuna dönünce `flex-basis` ANA EKSENE, yani YÜKSEKLİĞE uygular: başlık
     kutusu 390px'te 240px boyunda çıkıyordu (ölçüldü). Basis sıfırlanmalı. */
  .dgm-blok-basi .dgm-baslik { flex: 1 1 auto; }
  .dgm-blok.seviye-2 { margin-left: 8px; }
}

/* BELGE (tema dışı) */
/* ------------------------------------------- DOĞUM PAKETİ BELGE GÖVDESİ (.dgm-)
   Antet, logo ve iletişim şeridi kullanıcının verdiği ŞABLON GÖRÜNTÜSÜNDEN gelir;
   gövde markasızdır ve `_letterhead.html` / `_letterfoot.html` çağırmaz.
   İçerik alanı (`inset`) logonun altında başlar, iletişim şeridinin üstünde biter. */
.dgm-sayfa {
  position: relative; width: 210mm; min-height: 297mm;
  box-sizing: border-box; margin: 0 auto;
  background-image: url("img/dogum-sablon.png");
  background-size: 210mm 297mm; background-repeat: no-repeat;
  -webkit-print-color-adjust: exact; print-color-adjust: exact;
  page-break-after: always; color: #1a1a1a;
}
/* İçerik AKIŞTA durur, mutlak konumda DEĞİL: mutlakken uzun paketlerde metin alt
   iletişim şeridinin üstüne biniyordu. Akışta hiçbir satır gizlenmez.
   TEK SAYFAYA SIĞDIRMA (kullanıcı bildirimi 2026-09-02, kaynak broşürler tek
   sayfa): ölçüldü — 30 maddelik hastane nüshası 235mm'lik alana ~279mm istiyor,
   yani her nüsha ikinci kâğıda taşıyordu. Kazanç önce BOŞLUKTAN alınır (satır
   aralığı, madde ve başlık marjları), punto en son ve en az dokunulan yerdir
   (bkz. okunaklı tipografi tercihi). Uzun paketler için `.dgm-sik` kademesi var. */
/* Dolgu, şablon görselinin KENDİ dekorundan ölçüldü (2026-09-02, piksel analizi):
   üst logo bloğu 34mm'de biter, alt iletişim şeridi 285mm'de başlar. 3mm emniyet
   payıyla içerik 37mm–282mm arasında, yani 245mm'lik bir alanda akar. */
.dgm-icerik { padding: 37mm 16mm 15mm 16mm; font-size: 10pt; line-height: 1.22; }
.dgm-ad { font-size: 15pt; font-weight: 700; color: #c8102e; margin: 0 0 1.5mm; }
.dgm-hekim { font-size: 11.5pt; font-weight: 600; margin: 0 0 2.5mm; }
.dgm-hasta { font-size: 9.5pt; margin: 0 0 3mm; color: #444; }
.dgm-h1 { font-size: 10.5pt; font-weight: 700; color: #c8102e;
          margin: 2.6mm 0 0.8mm; text-transform: uppercase; }
.dgm-h2 { font-size: 9.8pt; font-weight: 600; color: #c8102e; margin: 1.8mm 0 0.6mm; }
.dgm-liste { margin: 0 0 0 5mm; padding: 0; }
.dgm-liste li { margin: 0 0 0.25mm; }
.dgm-fiyat { margin-top: 3.5mm; padding-top: 2.2mm; border-top: 1.5px solid #c8102e;
             font-size: 12.5pt; font-weight: 700; text-align: center; }
.dgm-paylar { margin-top: 2.5mm; font-size: 9pt; border-collapse: collapse; }
.dgm-paylar td { padding: 0.35mm 4mm 0.35mm 0; }
.dgm-paylar td:last-child { font-weight: 700; }
.dgm-not { margin-top: 2.5mm; font-size: 8.2pt; color: #555; }

/* Uzun paket kademesi: madde sayısı eşiği aşınca punto bir tık iner. Sunucu
   `dgm-sik` sınıfını içerik uzunluğuna göre koyar — kısa paketler ferah kalır. */
.dgm-sik .dgm-icerik { font-size: 9.2pt; line-height: 1.18; }
.dgm-sik .dgm-ad { font-size: 14pt; }
.dgm-sik .dgm-hekim { font-size: 11pt; }
.dgm-sik .dgm-h1 { font-size: 10pt; margin-top: 2.2mm; }
.dgm-sik .dgm-h2 { font-size: 9.3pt; }
.dgm-sik .dgm-fiyat { font-size: 11.8pt; margin-top: 3mm; }
.dgm-sik .dgm-paylar { font-size: 8.5pt; }

/* PANEL CSS'İNİN SIFIRLANMASI — belge de `<table>`dır, sınıf öneki korumaz.
   Aynı sızıntı 2026-08-21'de `.pfb`de ölçülerek yakalanmıştı: nowrap tutar
   sütununu kâğıttan düşürüyor, sticky başlığı akıştan çıkarıyor, nth-child
   belgeye gri zebra sokuyordu. Bkz. testler/test_sinif_tanimlari.py. */
.dgm-sayfa table { background: transparent; }
.dgm-sayfa td { white-space: normal; background: transparent; }
.dgm-sayfa th { position: static; background: transparent; }
.dgm-sayfa tbody tr { background: transparent; }

@media screen {
  .dgm-sayfa { box-shadow: 0 0 12px rgba(0, 0, 0, .15); margin-bottom: 8mm; }
}

/* BELGE SONU */
/* =========================================================================
   FORM KARTLARI — Hesabım, Excel içe aktar, doğum proforması (2026-09-04):
   etiket kutunun hemen üstünde (6px), alanlar eşit rayda, eylem sağda.
   ========================================================================= */
.hs-form { display: grid; gap: var(--s4); }
.hs-alanlar { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--s4); }
.hs-alanlar .alan, .ia-alanlar .alan, .dp-form .alan { display: grid; gap: 6px; min-width: 0;
  align-content: start; }
.hs-alanlar input, .ia-alanlar input, .ia-alanlar select, .dp-form input:not([type=checkbox]), .dp-form select { width: 100%; }
.hs-alanlar .hint, .ia-alanlar .hint, .dp-form .alan .hint { margin: 0; }
.hs-eylem { display: flex; justify-content: flex-end; gap: var(--s2); }
.ia-alanlar { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr); gap: var(--s4) var(--s5); }
.dp-form { display: grid; gap: var(--s4); }
.dp-satir { display: grid; gap: var(--s4); }
.dp-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.dp-ciktilar { display: flex; align-items: center; gap: var(--s4); min-height: var(--ctl-h); }
.dp-ciktilar .pf-opt { margin: 0; white-space: nowrap; }
/* Konaklama satırı: hediye kutusu alanla aynı yükseklikte; ekstra gece = sayı + oda tipi */
.dp-konaklama { align-items: start; }
.dp-secenek { min-height: var(--ctl-h); align-items: center; gap: var(--s2); }
.dp-secenek input { width: 18px; height: 18px; margin: 0; accent-color: var(--pri); }
.dp-ekstra { display: grid; grid-template-columns: 88px minmax(0, 1fr); gap: var(--s2); }
/* Tek satırlık işlem kartı: başlık + açıklama solda, düğme sağda */
.karsilastir-kart { display: flex; align-items: center; justify-content: space-between; gap: var(--s4); }
.karsilastir-kart h2 { margin-bottom: var(--s1); }
.karsilastir-kart p { margin: 0; }
.f-not { width: 360px !important; }
@media (max-width: 700px) {
  .hs-alanlar, .ia-alanlar, .dp-3 { grid-template-columns: 1fr; }
  .karsilastir-kart { flex-direction: column; align-items: flex-start; }
  .f-not { width: 100% !important; }
}

/* ---- v2 (2026-10-27): doğrudan fiyatlı paket formu, fiyat listeleri, liste notları ---- */
/* Alanlar etiketin ALTINDA, sola hizalı, içeriğe göre kısa (kullanıcı isteği 27.10:
   "biri sağa biri sola dayalı olmasın, gereksiz uzunlukta olmasın"). */
.v2-alanlar { display: grid; grid-template-columns: repeat(auto-fill, minmax(180px, 240px));
  gap: var(--s4); padding: var(--s3) var(--s4) var(--s4); }
.v2-alan { display: flex; flex-direction: column; gap: var(--s1); }
.v2-alan.tam { grid-column: 1 / -1; }
.v2-alan label { font-weight: 600; }
.v2-alan .svc-ctl { width: 160px; text-align: left; }
.liste-notlari textarea { width: 100%; margin-top: var(--s2); font: inherit; }
#kalemler .k-ad { width: 100%; }
#kalemler .k-tutar { width: 130px; text-align: left; }
#kalemler .k-cogalt, #kalemler .k-sil { margin-left: var(--s1); }
#kalemler .k-tur { max-width: 200px; }
#kalemler td.nowrap { white-space: nowrap; }
.liste-eylem { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: var(--s4); margin: var(--s4) 0; }
.liste-v2 td.wrap a { font-weight: 600; }
.liste-eylem .check { display: inline-flex; align-items: center; gap: var(--s2); margin-right: var(--s3); }
.liste-eylem .frm { display: grid; gap: var(--s3); margin-bottom: var(--s3); }
.liste-notlari { padding-left: 1.4em; display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--s3); }
.liste-notlari li { display: flex; gap: var(--s2); align-items: flex-start; }
.liste-notlari li textarea { margin-top: 0; flex: 1 1 0%; width: auto; min-width: 0;
  min-height: 2.4em; resize: vertical; }
.liste-notlari li .btn, .satir-listesi li .btn { flex: none; }
.liste-notlari .not-metin { flex: 1 1 0%; min-width: 0; }
.liste-notlari .not-dugmeler { flex: none; display: inline-flex; gap: var(--s1); }
.satirli { white-space: pre-line; }
/* Açıklama satırları: girinti yok, kutular diğer alanlarla aynı sol hizada ve
   aynı yükseklikte; Sil kutunun hemen yanında (kullanıcı isteği 27.10). */
.satir-listesi { list-style: none; padding: 0; margin: 0; display: grid;
  grid-template-columns: minmax(0, 1fr); gap: var(--s2); max-width: 560px; }
.satir-listesi li { display: flex; gap: var(--s2); align-items: center; }
.v2-alan .satir-listesi .ac-satir { flex: 1 1 0%; min-width: 0; width: auto; }
.satir-listesi li .btn { align-self: stretch; height: auto; }
#kalemler:not(:has(tr.kalem)) thead { display: none; }
.liste-notlari-oku li, .pf-liste-notlari li { white-space: pre-line; margin-bottom: var(--s2); }
.pf-liste-notlari { font-size: var(--fs-sm, 12px); margin: 14px 0 0 1.2em; padding: 0; }
.fd-tablo td.num { white-space: nowrap; }
/* Seçim şeridi: ameliyat adı uzun (Excel adları 100+ karakter), en geniş kolon onun. */
.builder-sel.v2-sel { grid-template-columns: 220px minmax(320px, 2fr) 140px 110px; }
.builder-sel.v2-sel.ozel { grid-template-columns: 220px 220px minmax(280px, 2fr) 140px; }
.dr-pay-satir td.center { width: 64px; }
.direct-group > p { margin: 0; padding: var(--s3) var(--s4); }
@media (max-width: 640px) {
  .v2-alanlar { grid-template-columns: 1fr; }
  .builder-sel.v2-sel, .builder-sel.v2-sel.ozel { grid-template-columns: 1fr; }
  .liste-v2 .sm-gizle { display: none; }
  .liste-v2 { table-layout: fixed; width: 100%; }
  .liste-v2 th:first-child, .liste-v2 td:first-child { width: 36px; }
  .liste-v2 th:nth-child(4), .liste-v2 td:nth-child(4) { width: 52px; }
  .liste-v2 th:nth-child(5), .liste-v2 td:nth-child(5) { width: 104px; white-space: nowrap; }
  .liste-v2 th, .liste-v2 td { padding-left: 6px; padding-right: 6px; overflow-wrap: anywhere; }
  #kalemler, #kalemler tbody, #kalemler tr, #kalemler td { display: block; width: 100%; }
  #kalemler thead { display: none; }
  #kalemler tr.kalem { border-bottom: 1px solid var(--line); padding: var(--s2) 0; }
  #kalemler .k-tur { max-width: none; width: 100%; }
}

/* Basılı belgede imza ibaresi (2026-10-27): küçük, tek satır; görsel 9 mm. */
.belge-imza-notu { margin-top: 2mm; display: flex; flex-direction: column; align-items: flex-end; gap: 1mm;
  font-size: 7.5pt; color: var(--pfb-mut, var(--mut)); }
.belge-imza { display: flex; align-items: center; gap: 2mm; }
.belge-imza-gorsel { height: 9mm; width: auto; max-width: 35mm; object-fit: contain; }
.imza-onizleme { height: 36px; width: auto; max-width: 160px; object-fit: contain; background: var(--panel); }
.imza-gorsel-tablo td { vertical-align: middle; }
.liste-notu-ozet { padding: var(--s3) var(--s4) var(--s4); }
.liste-notu-ozet .liste-notlari-oku { margin: 0 0 var(--s3); padding-left: 1.4em; font-size: var(--fs-sm); }
/* Excel notları kendi numarasını taşır ("1- …"); listenin numarası ikinci kez yazmasın. */
.liste-notlari, .liste-notlari-oku, .pf-liste-notlari, .liste-notu-ozet .liste-notlari-oku {
  list-style: none; padding-left: 0; }
.ozel-not-ibaresi { margin: 0 0 var(--s3); padding: var(--s2) var(--s3); font-size: var(--fs-sm);
  border-left: 3px solid var(--line-strong); background: var(--bg); }
.liste-notu-kart { margin-top: var(--s4); }
.not-eylem { display: flex; gap: var(--s2); }
.dl-aciklama { font-size: 7.5pt; color: var(--mut); margin-top: 1px; }
.pfb-aciklama { white-space: pre-line; }
