/* odomind — uygulama katmani.
 *
 * odo-arayuz.css TASARIM SISTEMIDIR ve DEGISTIRILMEZ. Burasi yalnizca
 * tasarim sisteminde KARSILIGI OLMAYAN, bu uygulamaya ozgu birkac yardimci
 * sinif tanimlar.
 *
 * Sistemde zaten olani burada yeniden tanimlamayin. Ilk yazimda tam tersi
 * yapildi: .kart/.rozet/.soluk/.btn-birincil gibi UYDURMA adlar kullanildi,
 * sistemdeki karsiliklari (.card/.badge/.muted/.btn-primary) yerine. Sayfalar
 * render oluyordu ama hicbir stil uygulanmiyordu. Yeni sinif eklemeden once
 *     python3 scripts/sinif_denetimi.py
 * calistirin — tanimsiz sinif kullanimini yakalar.
 */

/* --- Ust uste istiflenen bloklarin dikey ritmi ---
 *
 * Tasarim sisteminde .card MARGIN TASIMAZ; bosluklanmasi cagirana birakilmis:
 *   .grid .card  -> .grid'in gap:1rem'i
 *   .stats       -> kendi margin-bottom:1.75rem'i
 * Panel sayfalarinda kartlar dogrudan .wrap altina istifleniyor ve arada
 * HIC BOSLUK KALMIYORDU (olculdu: 0px) — kartlar birbirine yapisik ciziliyordu.
 *
 * Deger .stats'in margin-bottom'u ile ayni secildi: baslik -> sayaclar ->
 * kart -> kart boyunca TEK ritim olusuyor.
 *
 * SADECE sistemin bos biraktigi yerlere kural yaziliyor. Sistemde zaten
 * margin'i olanlara (.alert 1.1rem, .actions .5rem, .filter-row 1.1rem)
 * DOKUNULMUYOR — onlari ezmek tasarim sistemini catallastirir. */
.wrap > .card { margin-bottom: 1.75rem; }

/* Son blogun altinda .wrap'in kendi padding-bottom'u (4rem) zaten var */
.wrap > :last-child { margin-bottom: 0; }

/* Kart basligi ile govdesi arasi — .head-row sistemde margin tasimiyor */
.card > .head-row { margin-bottom: .9rem; }

/* Kart icinde ust uste gelen tablo/form — .tbl de margin tasimiyor */
.card > .tbl:not(:last-child),
.card > form:not(:last-child) { margin-bottom: 1rem; }

/* --- Sol menu basligi ile icerik basligi AYNI HIZADA ---
 *
 * Iki cubuk birbirinden bagimsiz olculendirilmisti ve alt cizgileri
 * tutmuyordu (olculdu: .side-ust alt kenar 66.3px, .ust-cubuk 58.9px
 * — 7.3px kayma). Yukseklikleri iceriklerine gore olusuyordu:
 * solda .brand'in 1.3rem'i, sagda btn-sm dugmeler.
 *
 * Cozum: ikisine de AYNI min-height verip dikey padding'i sifirliyoruz.
 * Ikisi de zaten display:flex; align-items:center oldugu icin icerik
 * kendiliginden ortalaniyor. Yatay padding'e DOKUNULMUYOR
 * (padding-block yalnizca dikeyi hedefler).
 *
 * body.dar .side-ust kisayol `padding` ile ezdigi icin secici listeye
 * ACIKCA dahil edildi — yoksa daraltilmis menude hizalama bozulurdu. */
:root { --ust-yukseklik: 3.9rem; }

.side-ust,
body.dar .side-ust,
.ust-cubuk {
  padding-block: 0;
  min-height: var(--ust-yukseklik);
}

/* --- Ust cubuk ikon dugmeleri ---
 * Metinsiz dugmeler (ara, onay, bildirim, tam ekran) kare gorunsun;
 * btn-sm yatay padding metin icin ayarli.
 * Yukseklik esitleniyor: ikon dugmeler 30px, metinli tema dugmesi 36px
 * cikiyordu — yan yana durduklari icin 6px fark goze carpiyordu. */
.ust-sag .btn-ghost { min-height: 2.25rem; }
.ust-sag .btn-ghost:not(:has(#tema-metin)) { padding-inline: .5rem; }

/* Sayac rozeti dugmenin kosesine otursun — .zil position:relative verir */
.ust-sag .zil { display: inline-flex; }

/* --- Ust cubuk sayac rozeti ---
 *
 * NEDEN .zil-sayac DEGIL: tasarim sisteminin bildirim merkezi bileseni
 * (odo-arayuz.js -> merkezSay) sayfa acilisinda BELGEDEKI ILK .zil-sayac
 * ogesini bulup icerigini `.merkez-oge.okunmamis` sayisina gore YENIDEN
 * YAZIYOR. Bizde bildirim merkezi markup'i yok, dolayisiyla sunucudan
 * gelen dogru sayac (1) sifira cekiliyor ve gizleniyordu.
 *
 * Bu yuzden ayri bir ad kullaniliyor. Gorsel olarak .zil-sayac ile ayni
 * tanimi tasir — sistemi ezmiyoruz, sahipli bir sinifin yanina kendi
 * sinifimizi koyuyoruz. Bildirim merkezi ileride eklenirse bu sinif
 * kaldirilip .zil-sayac'a donulebilir. */
.ust-sayac {
  position: absolute; top: -3px; right: -3px;
  min-width: 16px; height: 16px; padding: 0 .2rem;
  border-radius: var(--radius-full); background: var(--danger);
  color: #fff; font-size: .62rem; font-weight: 700;
  display: grid; place-items: center;
  border: 2px solid var(--yuzey);
}

/* --- Daraltilmis menude UCAN alt menu ---
 *
 * Tasarim sistemi daraltilmis kenar cubugunda alt menuyu tamamen
 * gizliyor: `body.dar .nav-alt{display:none!important}`. Bu, alt menude
 * yalnizca birkac yonetim baglantisi varken makuldu — gezinmenin geri
 * kalani ikonlarla ust seviyedeydi.
 *
 * Artik Panel disindaki TUM sayfalar bu grubun altinda. Kural oldugu gibi
 * kalsaydi menu daraltilinca SADECE PANEL'e erisilebilirdi; daralt
 * dugmesi gezinmeyi tamamen kilitlerdi.
 *
 * Cozum: daraltilmis modda alt menu, uzerine gelince (veya klavyeyle
 * odaklaninca) kenar cubugunun saginda acilan bir kutu olarak gosteriliyor.
 * .nav'in overflow-x:hidden'i kutuyu kirpardi; yalnizca daraltilmis modda
 * kaldiriliyor — orada zaten 2 oge var, kaydirma gerekmiyor.
 * Mobilde daraltma devre disi (tasarim sistemi), bu yuzden dokunmatikte
 * hover sorunu olusmuyor. */
body.dar .nav { overflow: visible; }
body.dar .nav-grup { position: relative; }

body.dar .nav-grup:hover > .nav-alt,
body.dar .nav-grup:focus-within > .nav-alt {
  display: flex !important;
  /* left:100% — kutu ogeye BITISIK; arada bosluk birakmak fareyle
     gecerken hover'i kopariyordu. */
  position: absolute; left: 100%; top: 0; z-index: 70;
  min-width: 13rem; margin: 0; padding: .4rem;
  border: 1px solid rgba(255, 255, 255, .12); border-left: 0;
  border-radius: var(--radius-md);
  background: #241634;
  box-shadow: var(--shadow-lg);
}

/* body.dar .nav a icerigi ortalar; ucan kutuda sola hizali olmali */
body.dar .nav-grup > .nav-alt a {
  justify-content: flex-start;
  padding-left: .7rem; padding-right: .7rem;
}

/* body.dar .nav-rozet gizlenir; ucan kutuda sayac gorunmeli */
body.dar .nav-grup > .nav-alt .nav-rozet { display: inline-block; }

/* --- Satir icinde birden fazla POST formu (tablo satiri eylemleri) --- */
.satir-form { display: inline-block; margin: 0 .25rem 0 0; }

/* --- Tablo hucre yardimcilari --- */
.tbl .dar { white-space: nowrap; width: 1%; }
.tbl .sag { text-align: right; }
.tbl .orta { text-align: center; }

/* Uzun metni tek satirda kirp (kaynak yollari, hata mesajlari) */
.kirp {
  max-width: 26rem; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}

/* Okunmamis bildirim satiri */
.satir-okunmamis { font-weight: 600; }

/* --- Bildirim seviyesi noktasi ---
   .badge kullanmiyoruz: tablo satirinda tek karakterlik gosterge yeterli,
   rozet fazla gurultu yapiyor. */
.nokta {
  display: inline-block; width: .55rem; height: .55rem;
  border-radius: 50%; background: var(--ink-400);
}
.nokta-info    { background: var(--info,   #3b82f6); }
.nokta-success { background: var(--ok,     #16a34a); }
.nokta-warning { background: var(--warn,   #d97706); }
.nokta-error   { background: var(--danger, #dc2626); }

/* --- Onay kutusu satiri / grubu (form icinde) --- */
.onay-satir { display: flex; align-items: center; gap: .5rem; }
.onay-grup { display: flex; gap: 1.1rem; flex-wrap: wrap; }

/* --- Uzun metin blogu (bildirim govdesi, JSON, cikti) ---
   .copy-box koyu zeminlidir ve kopyalama dugmesi bekler; burada yalnizca
   okunabilir bir blok gerekiyor. */
.metin-blok {
  white-space: pre-wrap; word-break: break-word;
  font-size: .8rem; line-height: 1.55;
  padding: .75rem; border-radius: var(--radius-md, 8px);
  background: var(--surface-100); border: 1px solid var(--ink-200);
  overflow-x: auto;
}

/* --- Sayfalama devre disi oku --- */
.pasif { opacity: .4; pointer-events: none; }

/* --- Ortalanmis tek kart (oturum ici hata sayfasi) --- */
.merkez-kart { max-width: 28rem; margin: 3rem auto; text-align: center; }


/* odomind: markdown govdesi (dokuman/rapor) */
.md-govde { line-height: 1.55; max-width: 900px; }
.md-govde h1 { font-size: 1.35rem; margin: 1.2em 0 .4em; }
.md-govde h2 { font-size: 1.12rem; margin: 1.3em 0 .4em; border-bottom: 1px solid var(--cizgi, #e5e7eb); padding-bottom: .2em; }
.md-govde h3 { font-size: 1rem; margin: 1em 0 .3em; }
.md-govde p, .md-govde li { margin: .35em 0; }
.md-govde ul, .md-govde ol { padding-left: 1.4em; }
.md-govde code { font-size: .9em; }
.md-govde pre { overflow-x: auto; padding: .6em .8em; border-radius: 6px; background: var(--kod-zemin, #f5f5f7); }
.md-govde table { border-collapse: collapse; margin: .6em 0; }
.md-govde td, .md-govde th { border: 1px solid var(--cizgi, #e5e7eb); padding: .3em .55em; }


/* ============ odomind gorsellestirme ============ */
.mind-tabs{display:flex;gap:6px;flex-wrap:wrap}
.mind-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:14px;margin-bottom:18px}
.mind-grid .card{margin:0}
.mind-topic h3 a{text-decoration:none}
.mind-ring-row{display:flex;gap:18px;align-items:center}
.mind-ring{--p:0;width:96px;height:96px;border-radius:50%;flex:none;display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:conic-gradient(var(--brand-primary) calc(var(--p)*1%),var(--ink-200) 0);position:relative}
.mind-ring::before{content:"";position:absolute;inset:9px;border-radius:50%;background:var(--yuzey)}
.mind-ring b,.mind-ring span{position:relative;z-index:1}
.mind-ring b{font-family:var(--font-heading);font-size:1.15rem}
.mind-ring span{font-size:.68rem;color:var(--ink-500)}
.mind-kpis{display:grid;grid-template-columns:1fr 1fr;gap:8px 16px;flex:1}
.mind-kpis b{display:block;font-family:var(--font-heading);font-size:1.05rem}
.mind-kpis span{font-size:.74rem;color:var(--ink-500)}
.bar{height:6px;border-radius:99px;background:var(--ink-200);overflow:hidden;margin-top:5px}
.bar i{display:block;height:100%;background:var(--brand-gradient);border-radius:99px;transition:width .4s}
.bar.warn i{background:linear-gradient(90deg,#f0a830,#a8620a)}
.stat .bar{margin-top:8px}
.stat b small{font-size:.9rem;color:var(--ink-500);font-weight:500}
.etki{height:7px;width:90px;border-radius:99px;background:var(--ink-200);overflow:hidden;display:inline-block;vertical-align:middle;margin-right:6px}
.etki i{display:block;height:100%;background:var(--brand-gradient)}
.chip{display:inline-block;padding:.1rem .5rem;border-radius:99px;font-size:.72rem;border:1px solid var(--ink-300);color:var(--ink-700)}
.chip.vol-invariant{border-color:#1a7f5a;color:#1a7f5a}
.chip.vol-volatile{border-color:#b3243c;color:#b3243c}
.chip.vol-mixed{border-color:#a8620a;color:#a8620a}
.danger-text{color:var(--danger);font-style:normal}
.warn-text{color:var(--warn);font-style:normal}
.mind-row{padding:6px 0;border-bottom:1px solid var(--ink-200)}
.mind-row:last-child{border-bottom:0}
.spark{width:100%;height:80px;display:block}
.spark rect{fill:var(--ink-400)}
.spark rect.today{fill:var(--brand-primary)}
.mind-tiers{margin-top:6px;display:flex;gap:4px;flex-wrap:wrap}
.tbl.compact td{padding:.35rem .5rem;font-size:.82rem}

/* graf */
.graf-card{position:relative}
.graf-bar{display:flex;gap:14px;align-items:center;flex-wrap:wrap;font-size:.82rem;margin-bottom:6px}
.graf-bar label{display:inline-flex;align-items:center;gap:4px;cursor:pointer}
.graf-leg{display:inline-block;width:14px;height:3px;border-radius:2px;margin-right:2px}
.graf-legend{display:flex;gap:10px;flex-wrap:wrap;font-size:.78rem;color:var(--ink-600);margin-bottom:6px}
.graf-legend i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:4px;vertical-align:middle}
.graf-alan{width:100%;height:640px;border:1px solid var(--ink-200);border-radius:var(--radius-md);background:var(--surface-50);overflow:hidden}
.graf-alan svg{display:block}
.graf-tip{position:absolute;max-width:320px;background:var(--yuzey);border:1px solid var(--ink-300);border-radius:8px;padding:8px 10px;font-size:.8rem;
  box-shadow:var(--shadow-md);pointer-events:none;z-index:5;line-height:1.35}
.graf-presets{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}

/* mindmap */
.mm-wrap{width:100%;height:70vh;overflow:hidden;border:1px solid var(--ink-200);border-radius:var(--radius-md);background:var(--surface-50)}
.mm-wrap pre.mermaid{margin:0;background:transparent;border:0}
.md-govde pre.mermaid{background:transparent;border:1px solid var(--ink-200);border-radius:8px;padding:8px;overflow-x:auto}

.md-govde,.md-govde p,.md-govde li,.md-govde td{color:var(--ink-700)}
.md-govde h1,.md-govde h2,.md-govde h3,.md-govde th{color:var(--ink-900)}
.md-govde th{background:var(--surface-100)}
.md-govde a.fref{color:var(--brand-primary);text-decoration:none;font-size:.85em;border-bottom:1px dotted var(--brand-primary)}
.md-govde a.fref:hover{background:var(--info-bg)}
.mind-grid .wide{grid-column:span 2}
@media (max-width:900px){.mind-grid .wide{grid-column:span 1}}
tr.f-hedef{outline:2px solid var(--brand-primary)}

/* formlar */
.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:10px 16px;margin-bottom:10px}
.form-grid label,form.card>label{display:block;font-size:.82rem;color:var(--ink-600)}
.form-grid input,.form-grid select,.form-grid textarea,form.card>label input,form.card>label textarea{display:block;width:100%;margin-top:4px}
textarea.mono{font-family:ui-monospace,SFMono-Regular,monospace;font-size:.8rem}
.mono{font-family:ui-monospace,SFMono-Regular,monospace;font-size:.82rem;white-space:pre-wrap}
/* oneriler */
.oneri{padding:10px 0;border-bottom:1px solid var(--ink-200)}
.oneri:last-child{border-bottom:0}
.oneri-ust{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:4px}
.oneri-yanit{margin-top:6px;padding:8px 10px;border-left:3px solid var(--brand-primary);background:var(--surface-100);border-radius:6px;white-space:pre-wrap}
.oneri.accepted .oneri-yanit{border-color:var(--ok)}.oneri.rejected .oneri-yanit{border-color:var(--danger)}
/* kanban */
.kanban{display:grid;grid-template-columns:repeat(6,minmax(180px,1fr));gap:10px;overflow-x:auto}
.kanban-col{background:var(--surface-100);border:1px solid var(--ink-200);border-radius:var(--radius-md);padding:8px;min-height:240px}
.kanban-col.hedef{outline:2px dashed var(--brand-primary)}
.kanban-head{margin-bottom:8px;font-size:.85rem}
.kart{background:var(--yuzey);border:1px solid var(--ink-200);border-left:3px solid var(--ink-400);border-radius:8px;padding:8px;margin-bottom:8px;font-size:.8rem}
.kart[draggable=true]{cursor:grab}
.kart.kind-research{border-left-color:#2563eb}.kart.kind-synthesize{border-left-color:#c03060}.kart.kind-review{border-left-color:#a8620a}
.kart.kind-umbrella{border-left-color:#7c3aed}.kart.kind-suggestion,.kart-oneri{border-left-color:#0e7490}.kart.kind-custom{border-left-color:#1a7f5a}
.kart-btn{margin-top:6px;display:flex;gap:4px;flex-wrap:wrap}
.kart-btn button{font-size:.72rem;padding:2px 7px;border-radius:99px;border:1px solid var(--ink-300);background:transparent;color:var(--ink-700);cursor:pointer}
.kart-btn button:hover{border-color:var(--brand-primary);color:var(--brand-primary)}
.mind-row.done{opacity:.55;text-decoration:line-through}
.tl-alan{position:relative;width:100%;height:170px}
/* mobil */
@media (max-width:820px){
  .graf-alan{height:460px}.mm-wrap{height:60vh}
  .mind-ring-row{flex-direction:column;align-items:flex-start}
  .kanban{grid-template-columns:repeat(6,240px)}
  .tbl.compact td:nth-child(4){display:none}
  .mind-tabs .btn-sm{padding:.3rem .55rem;font-size:.75rem}
}
