/* ============================================================
 *  Design tokens — portalv3 / identity-ui tasarim dili
 *
 *  Kaynak: portal-v3 `src/assets/tokens.css` (release/v-20260827).
 *  Bu blok apps/docs/public/css/style.css ile apps/admin/public/css/style.css
 *  arasinda ELLE senkron tutulan bir kopyadir (params.js ile ayni kural) —
 *  birinde degisen digerine de yazilmalidir. Yalniz `--xml-*`, `--sidebar-w`
 *  ve `--try-w` docs'a ozeldir.
 *
 *  KURAL: bilesen kuralina literal hex / rgba / gradient YAZILMAZ — buraya
 *  token eklenir. Renk ve geometrinin tek kaynagi bu bloktur.
 *
 *  KONTRAST SOZLESMESI (portalv3'ten aynen): #16a34a ve lime #88b830
 *  yalnizca DEKORATIFTIR (dolgu, nokta, gradyan) — metin, ikon ya da odak
 *  gostergesi olamaz. Metin tasiyan yesil #15803d'dir (beyazda 5.02:1).
 *  Metinde --color-subtle en acik tondur; bundan acigini metinde kullanmayin
 *  (4.5:1 tabani).
 *
 *  GRADYAN token'lari `background:` ister, `background-color:` DEGIL — bir
 *  linear-gradient() <image>'dir, <color> degil; `background-color` ile
 *  sessizce duser ve yuzey saydam kalir.
 * ============================================================ */
:root {
  /* ---- Marka ---------------------------------------------------------- */
  --color-primary: #16a34a;        /* DEKORATIF — metinde kullanma */
  --color-primary-hover: #15803d;
  --color-primary-deep: #166534;
  --color-accent: #88b830;         /* DEKORATIF — metinde kullanma */
  --panel-gradient: linear-gradient(160deg, #16a34a 0%, #04382c 45%, #16a34a 100%);

  /* Metin/ikon tasiyabilen yesil ve tint merdiveni. */
  --portal-primary-strong: #15803d;
  --portal-primary-strong-hover: #166534;
  --portal-tint-050: #f0fdf4;
  --portal-tint-100: #dcfce7;
  --portal-tint-200: #bbf7d0;

  /* ---- Notrler (slate) ------------------------------------------------ */
  --color-ink: #0f172a;
  --color-body: #334155;
  --color-muted: #475569;
  --color-subtle: #64748b;         /* metindeki en acik ton — tabani asma */
  --color-border: #e2e8f0;
  --color-hairline: #eef1f4;
  --color-row-line: #f4f6f8;
  --color-surface: #f8fafc;
  --color-surface-head: #fbfcfd;
  --color-white: #ffffff;

  /* ---- Kabuk: koyu gradyan ust bar ------------------------------------ */
  --dash-header-bg: var(--panel-gradient);  /* background:, background-color: DEGIL */
  --dash-header-text: #ffffff;
  /* 0.72 gradyanin koyu ucunda AA tabani — dusurmeyin. */
  --dash-header-text-muted: rgba(255, 255, 255, 0.72);
  --dash-header-overlay: rgba(255, 255, 255, 0.08);  /* duragan/hover dolgu */
  --dash-header-active: rgba(255, 255, 255, 0.14);   /* aktif/basili dolgu */
  --dash-header-border: rgba(255, 255, 255, 0.14);
  --dash-header-shadow:
    0 1px 0 rgba(255, 255, 255, 0.04),
    0 10px 30px rgba(2, 28, 24, 0.32);
  /* 60px bar: kenar cubugu ustu, icerik dolgusu ve sticky ofsetlerin hepsi
     bundan turer — tek knob. */
  --height-dash-header: 4rem;

  /* ---- Katlanir ray (sol menu) ----------------------------------------- */
  --rail-width: 16.8rem;
  --rail-width-collapsed: 4.5333rem;

  /* ---- Sayfa yuzeyleri ------------------------------------------------- */
  --dash-page-bg: #fafaf9;         /* ilik sayfa zemini */
  --dash-card-bg: #ffffff;         /* kart/panel yuzeyi */
  --dash-card-border: #eaecf0;

  /* ---- Durum tonlari (rozet RENK VE METIN tasir; nokta dekoratif) ------
     Yedi ton, her biri metin / zemin / cerceve ucluleriyle. */
  --tone-status-blue-fg: #1d4ed8;
  --tone-status-blue-bg: #eff6ff;
  --tone-status-blue-border: #bfdbfe;
  --tone-status-cyan-fg: #0e7490;
  --tone-status-cyan-bg: #ecfeff;
  --tone-status-cyan-border: #a5f3fc;
  --tone-status-amber-fg: #b45309;
  --tone-status-amber-bg: #fffbeb;
  --tone-status-amber-border: #fde68a;
  --tone-status-green-fg: #15803d;
  --tone-status-green-bg: #f0fdf4;
  --tone-status-green-border: #bbf7d0;
  --tone-status-rose-fg: #be123c;
  --tone-status-rose-bg: #fff1f2;
  --tone-status-rose-border: #fecdd3;
  --tone-status-violet-fg: #7e22ce;
  --tone-status-violet-bg: #f5f3ff;
  --tone-status-violet-border: #ddd6fe;
  --tone-status-slate-fg: #475569;
  --tone-status-slate-bg: #f1f5f9;
  --tone-status-slate-border: #e2e8f0;

  /* ---- Modul ikon tonlari (ton = metin/ikon, tint = zemin) -------------- */
  --tone-green: #15803d;   --tint-green: #f0fdf4;
  --tone-blue: #1d4ed8;    --tint-blue: #eff6ff;
  --tone-indigo: #4338ca;  --tint-indigo: #eef2ff;
  --tone-cyan: #0e7490;    --tint-cyan: #ecfeff;
  --tone-amber: #b45309;   --tint-amber: #fffbeb;
  --tone-violet: #7e22ce;  --tint-violet: #f5f3ff;
  --tone-teal: #0f766e;    --tint-teal: #f0fdfa;
  --tone-rose: #be123c;    --tint-rose: #fff1f2;
  --tone-lime: #4d7c0f;    --tint-lime: #f7fee7;
  --tone-slate: #475569;   --tint-slate: #f1f5f9;

  /* Kaydirma cubugu: 10px ray, ic boslukla hap bicimli tutamak. */
  --scrollbar-thumb: #dbe2e8;

  /*
   * Iskelet yukleme: taban blok + uzerinden gecen parilti.
   *
   * Taban --color-surface DEGIL: o ton (#f8fafc) sayfa zemininin (#fafaf9)
   * neredeyse aynisi, kart DISINDAKI iskelet cizgileri gorunmuyordu.
   * Cerceve tonuyla kagit arasinda bir karisim iki zeminde de okunur.
   */
  --skel-base: color-mix(in srgb, var(--color-border) 55%, var(--color-white));
  --skel-sheen: rgba(255, 255, 255, 0.55);

  /* ---- Geometri -------------------------------------------------------- */
  --radius-control: 0.6667rem;   /* dugme, input, kucuk kontrol */
  --radius-card: 0.9333rem;      /* kart, panel, modal */
  --radius-pill: 66.6rem;

  /* ---- Elevation (iki katmanli; tek katmanli golge kullanmayin) --------- */
  --elevation-1:
    0 1px 2px rgba(15, 23, 20, 0.04),
    0 8px 20px rgba(15, 23, 20, 0.05);
  --elevation-2:
    0 2px 6px rgba(15, 23, 20, 0.06),
    0 14px 30px rgba(15, 23, 20, 0.08);
  --elevation-3:
    0 6px 16px rgba(15, 23, 20, 0.10),
    0 24px 56px rgba(15, 23, 20, 0.16);

  /* Ray ikon karosu aktifken dolu yesile doner; kucuk ve sik bir golge
     karoyu satirdan ayirir (elevation-1 bu olcekte fazla yumusak kalir). */
  --elevation-tile: 0 1px 2px rgba(15, 23, 20, 0.18);

  /* ---- Odak halkalari (iki katmanli; asla ciplak `outline: none`) -------
     Beyaz bosluk + metin tasiyan yesil; koyu gradyan barda koyu bosluk +
     beyaz. Yuzey degisince --color-white de degistigi icin koyu temada
     bosluk kendiliginden koyulasir. */
  --focus-ring:
    0 0 0 2px var(--color-white),
    0 0 0 4px var(--portal-primary-strong);
  --focus-ring-on-dark:
    0 0 0 2px rgba(2, 28, 24, 1),
    0 0 0 4px #ffffff;
  /*
   * FORM ALANI odak halkasi. Alanin KENDI cercevesi zaten yesile dondugu icin
   * burada iki katmanli --focus-ring'in beyaz boslugu kullanilmaz: yogun
   * parametre editorlerinde her alanin cevresinde 4px'lik bir halka fazla
   * agir duruyor ve komsu satirlarla cakisiyordu. Gosterge yine iki katmanli
   * (yesil cerceve + yesil hale), yalniz daha sik. Ciplak `outline: none`
   * DEGIL — halka her zaman var.
   */
  --focus-ring-field: 0 0 0 3px var(--accent-ring);

  /* ---- Tipografi -------------------------------------------------------- */
  --font-sans:
    'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
    'Helvetica Neue', Arial, sans-serif;
  --font-mono: 'JetBrains Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
  --leading-tight: 1.25;
  --leading-snug: 1.45;
  --leading-relaxed: 1.6;

  /* ---- Mobilya yazi olcegi ----------------------------------------------
     Referans kok 15px. Degerler rem oldugu icin akiskan olcekle (asagidaki
     `html` clamp'i) birlikte buyur/kucululur. Once burada 21 ayri piksel
     boyutu vardi (9, 9.5, 10, 10.5, 11, 11.5, 12, 12.5, 13, 13.5, 14, 15 …);
     alti adima oturtuldu. Yeni bir mobilya yazisi eklerken px YAZMAYIN, bu
     adimlardan birini secin. Baslik/display boyutlari (h1, h2 …) olcek disi
     kalir, kendi rem degerleriyle yazilir. */
  --text-3xs: 0.6333rem;  /* 9.5px  — mikro etiket, metot rozeti */
  --text-2xs: 0.7rem;     /* 10.5px — grup basligi, sayac */
  --text-xs: 0.7667rem;   /* 11.5px — yardimci metin, ipucu */
  --text-sm: 0.8333rem;   /* 12.5px — ikincil satir, dugme */
  --text-base: 0.9rem;    /* 13.5px — liste satiri, input */
  --text-md: 1rem;        /* 15px   — govde metni */

  /* ---- Hareket: tek egri, iki sure ------------------------------------- */
  --ease-standard: cubic-bezier(0.2, 0, 0, 1);
  --duration-fast: 120ms;
  --duration-base: 180ms;

  /* ---- Ortu -------------------------------------------------------------- */
  --overlay-scrim: rgba(15, 23, 42, 0.55);

  /* ============================================================
   *  Uyumluluk alias'lari
   *  Bu projenin eski token adlari yukaridaki dile BAGLANIR; boylece
   *  ~4300 satirlik bilesen CSS'i tek tek elden gecirilmeden yeni dile
   *  gecer. YENI kural yazarken alias degil, yukaridaki asil token'i
   *  kullanin.
   * ============================================================ */
  --bg: var(--dash-card-bg);
  --bg-alt: var(--color-surface);
  --bg-sunken: #f1f5f9;
  --bg-sidebar: var(--dash-card-bg);
  --bg-code: #f6f8fa;
  --bg-elev: var(--dash-card-bg);
  --bg-page: var(--dash-page-bg);

  --text: var(--color-ink);
  --text-body: var(--color-body);
  --text-muted: var(--color-muted);
  --text-faint: var(--color-subtle);

  --border: var(--color-border);
  --border-soft: var(--color-hairline);
  --border-strong: #cbd5e1;

  --accent: var(--portal-primary-strong);
  --accent-hover: var(--portal-primary-strong-hover);
  --accent-soft: var(--portal-tint-050);
  --accent-tint: var(--portal-tint-100);
  --accent-ring: var(--portal-tint-200);

  /* Metot rozetleri beyaz metin tasir; hepsi ton paletinin metin ucundan
     secildi ki beyazla AA'yi gecsin (eski #16a34a/#dc2626 gecmiyordu). */
  /* GET marka yesilinden AYRI bir yesil kullanir: --tone-status-green-fg
     (#15803d) ile --portal-primary-strong birebir ayni deger, bu yuzden kenar
     cubugunda yesil GET oku yesil aktif satirin yaninda "bu satir aktif" gibi
     okunuyordu. Teal tonu ayni sicaklikta ama ayirt edilebilir (beyazda
     4.9:1, AA). */
  --method-get:    var(--tone-teal);
  --method-post:   var(--tone-status-blue-fg);
  --method-put:    var(--tone-status-violet-fg);
  --method-patch:  var(--tone-status-amber-fg);
  --method-delete: var(--tone-status-rose-fg);
  --method-soap:   var(--tone-status-cyan-fg);

  /*
   * DOLGU degerleri: metot rozeti / tehlike dugmesi gibi BEYAZ metin tasiyan
   * yuzeyler. --method-* (yukarisi) koyu temada acik uca doner cunku METIN
   * rengi olarak da kullaniliyor (".try-resp-error", ".env-del:hover");
   * beyaz metnin altindaki dolgu ise iki temada da koyu kalmali. Bu yuzden
   * ayri ve tema-bagimsizdirlar.
   */
  --method-get-bg:    #0f766e;
  --method-post-bg:   #1d4ed8;
  --method-put-bg:    #7e22ce;
  --method-patch-bg:  #b45309;
  --method-delete-bg: #be123c;
  --method-soap-bg:   #0e7490;

  --status-ok-bg: var(--tone-status-green-bg);   --status-ok-fg: var(--tone-status-green-fg);
  --status-warn-bg: var(--tone-status-amber-bg); --status-warn-fg: var(--tone-status-amber-fg);
  --status-err-bg: var(--tone-status-rose-bg);   --status-err-fg: var(--tone-status-rose-fg);
  --status-info-bg: var(--tone-status-blue-bg);  --status-info-fg: var(--tone-status-blue-fg);
  --status-ok-border: var(--tone-status-green-border);
  --status-warn-border: var(--tone-status-amber-border);
  --status-err-border: var(--tone-status-rose-border);
  --status-info-border: var(--tone-status-blue-border);

  --sp-1: 0.2667rem;  --sp-2: 0.5333rem;  --sp-3: 0.8rem; --sp-4: 1.0667rem;
  --sp-5: 1.3333rem; --sp-6: 1.6rem; --sp-7: 1.8667rem; --sp-8: 2.1333rem;
  --sp-10: 2.6667rem; --sp-12: 3.2rem;

  /* Yaricaplar portalv3 geometrisine cekildi: kontrol 10px, kart 14px. */
  --r-1: 0.4rem;
  --r-2: var(--radius-control);
  --r-3: 0.8rem;
  --r-4: var(--radius-card);
  --r-pill: var(--radius-pill);
  --radius: var(--radius-control);

  --shadow-sm: var(--elevation-1);
  --shadow-md: var(--elevation-2);
  --shadow-pop: var(--elevation-2);
  --shadow-lg: var(--elevation-3);
  --shadow: var(--elevation-1);

  --dur-fast: var(--duration-fast);
  --dur-base: var(--duration-base);
  --ease: var(--ease-standard);

  --header-h: var(--height-dash-header);

  --xml-tag: #0550ae;
  --xml-attr: #ad6800;
  --xml-value: #0f7a3d;
  --xml-comment: var(--color-subtle);

  --sidebar-w: 280px;
  /* Sabit yanit panelinin genisligi; ust sinir --resp-w'deki clamp() (720px).
     Surukleyince localStorage'a yazilir. Varsayilan bilerek dar: bu duzende
     asil calisma alani soldaki istek formu. */
  --try-w: 520px;
}

/* ============================================================
 *  Koyu tema — YALNIZ token yeniden eslemesi.
 *  portalv3 sozlesmesi: bilesen basina `:root.dark .foo { ... }` blogu
 *  yazmak yerine buradaki degerleri degistir. Kabuk gradyani zaten koyu
 *  oldugu icin oldugu gibi kalir.
 * ============================================================ */
:root.dark {
  --color-ink: #f1f5f9;
  --color-body: #cbd5e1;
  --color-muted: #94a3b8;
  --color-subtle: #7d8794;
  --color-border: #262b35;
  --color-hairline: #1e232c;
  --color-row-line: #1a1e26;
  --color-surface: #161a21;
  --color-surface-head: #161a21;
  /* "Kagit" yuzey koyu temada koyudur; --focus-ring'in bosluk katmani da
     bunu kullandigi icin odak halkasi kendiliginden dogru zemini alir. */
  --color-white: #181c24;

  --dash-page-bg: #0f1115;
  --dash-card-bg: #181c24;
  --dash-card-border: #262b35;

  --portal-primary-strong: #4ade80;
  --portal-primary-strong-hover: #86efac;
  --portal-tint-050: color-mix(in srgb, #16a34a 14%, transparent);
  --portal-tint-100: color-mix(in srgb, #16a34a 22%, transparent);
  --portal-tint-200: color-mix(in srgb, #16a34a 32%, transparent);

  /* Ayni yedi ton: zemin/cerceve aksanin saydam karisimi, metin acik uc.
     Acik temanin #eff6ff gibi tint'leri koyu yuzeyde okunmaz. */
  --tone-status-blue-fg: #93c5fd;
  --tone-status-blue-bg: color-mix(in srgb, #3b82f6 16%, transparent);
  --tone-status-blue-border: color-mix(in srgb, #3b82f6 32%, transparent);
  --tone-status-cyan-fg: #67e8f9;
  --tone-status-cyan-bg: color-mix(in srgb, #06b6d4 16%, transparent);
  --tone-status-cyan-border: color-mix(in srgb, #06b6d4 32%, transparent);
  --tone-status-amber-fg: #fcd34d;
  --tone-status-amber-bg: color-mix(in srgb, #f59e0b 16%, transparent);
  --tone-status-amber-border: color-mix(in srgb, #f59e0b 32%, transparent);
  --tone-status-green-fg: #4ade80;
  --tone-status-green-bg: color-mix(in srgb, #16a34a 16%, transparent);
  --tone-status-green-border: color-mix(in srgb, #16a34a 32%, transparent);
  --tone-status-rose-fg: #fda4af;
  --tone-status-rose-bg: color-mix(in srgb, #e11d48 16%, transparent);
  --tone-status-rose-border: color-mix(in srgb, #e11d48 32%, transparent);
  --tone-status-violet-fg: #d8b4fe;
  --tone-status-violet-bg: color-mix(in srgb, #a855f7 16%, transparent);
  --tone-status-violet-border: color-mix(in srgb, #a855f7 32%, transparent);
  --tone-status-slate-fg: #cbd5e1;
  --tone-status-slate-bg: color-mix(in srgb, #94a3b8 16%, transparent);
  --tone-status-slate-border: color-mix(in srgb, #94a3b8 32%, transparent);

  --tone-green: #4ade80;   --tint-green: color-mix(in srgb, #16a34a 16%, transparent);
  --tone-blue: #93b4fd;    --tint-blue: color-mix(in srgb, #1d4ed8 18%, transparent);
  --tone-indigo: #a5b4fc;  --tint-indigo: color-mix(in srgb, #4338ca 18%, transparent);
  --tone-cyan: #67e8f9;    --tint-cyan: color-mix(in srgb, #0e7490 18%, transparent);
  --tone-amber: #fcd34d;   --tint-amber: color-mix(in srgb, #b45309 18%, transparent);
  --tone-violet: #d8b4fe;  --tint-violet: color-mix(in srgb, #7e22ce 18%, transparent);
  --tone-teal: #5eead4;    --tint-teal: color-mix(in srgb, #0f766e 18%, transparent);
  --tone-rose: #fda4af;    --tint-rose: color-mix(in srgb, #be123c 18%, transparent);
  --tone-lime: #bef264;    --tint-lime: color-mix(in srgb, #4d7c0f 18%, transparent);
  --tone-slate: #94a3b8;   --tint-slate: #161a21;

  --scrollbar-thumb: #353b48;
  --skel-base: color-mix(in srgb, var(--color-border) 70%, var(--color-white));
  --skel-sheen: rgba(255, 255, 255, 0.07);

  --elevation-1: 0 1px 2px rgba(0, 0, 0, 0.40), 0 8px 20px rgba(0, 0, 0, 0.28);
  --elevation-2: 0 2px 6px rgba(0, 0, 0, 0.45), 0 14px 30px rgba(0, 0, 0, 0.35);
  --elevation-3: 0 6px 16px rgba(0, 0, 0, 0.50), 0 24px 56px rgba(0, 0, 0, 0.55);

  --overlay-scrim: rgba(0, 0, 0, 0.62);

  /* Alias'lardan koyu temada AYRISANLAR (digerleri yukaridan turer). */
  --bg-sunken: #0c0f14;
  --bg-code: #1a1e26;
  --border-strong: #353b48;

  --xml-tag: #6ea8ff;
  --xml-attr: #e0a94c;
  --xml-value: #7ec699;
}

* { box-sizing: border-box; }

/*
 * KOK YAZI BOYUTU = ARAYUZUN OLCEK DUGMESI (portalv3 _core.scss / _fn.scss).
 *
 * SORUN: tasarim 15px'lik bir gride gore cizildi ve tum mobilya piksel
 * yaziliydi. Piksel sabit oldugu icin 1366x768 bir dizustunde arayuz ekranin
 * cok buyuk kismini yerken 2560x1440 bir monitorde yazi ve rakamlar
 * okunamayacak kadar kucuk kaliyordu.
 *
 * COZUM: kok yazi boyutu ekran GENISLIGINE gore clamp() ile akar; tum olculer
 * bu kokun kati (rem) olarak yazilir. Yazi, kontrol yuksekligi, bosluk ve
 * kose yaricapi BIRLIKTE olceklenir — oranlar bozulmaz, yalniz yogunluk
 * degisir. Egri portalv3'un egrisinin 15/13 katidir:
 *
 *   <=1366px (dizustu)          -> 13.85px  — bugunkunden ~%8 daha yogun
 *   1920px   (yaygin masaustu)  -> 15px     — bugunkuyle birebir
 *   2560px   (27" 1440p)        -> 17.8px
 *   >=2688px (4K / ultrawide)   -> 18.46px  — ust sinir
 *
 * rem cinsinden yazildi ki tarayicinin kendi yazi boyutu ayari (erisilebilirlik
 * / kullanici zoom'u) carpan olarak korunsun; px yazilsaydi o ayar ezilirdi.
 * Kokun KENDI font-size'indaki rem, hesaplanan degere degil tarayicinin
 * baslangic degerine (16px) gore cozulur — egri bu yuzden boyle yazilabiliyor.
 *
 * Neden `zoom` degil: body zoom'u olculeri tek hamlede buyuturdu ama
 * konumunu JS ile piksel hesaplayan katmanlar (--try-w yanit paneli, surukle
 * tutamaklari, fn-autocomplete) zoom altinda ikinci kez olceklenip
 * tetikleyicisinden kayardi.
 *
 * @media ESIKLERI PX KALIR: duzen kararlari gercek ekran genisligine gore
 * verilir, olcege gore degil. Golgeler, odak halkalari ve 4px altindaki
 * hairline degerler de px kalir — bunlar olcekle buyumemeli.
 */
html {
  font-size: clamp(0.865rem, 0.3923rem + 0.45vw, 1.1538rem);
  scrollbar-color: var(--scrollbar-thumb) transparent;
  scrollbar-width: thin;
}

html, body {
  margin: 0;
  padding: 0;
  /* Sayfa zemini ilik gri (--dash-page-bg), kart/panel yuzeyleri beyaz
     (--dash-card-bg): portalv3'un "kagit kartlar zeminin uzerinde durur"
     ayrimi. Govde metni --color-body, basliklar --color-ink. */
  background: var(--dash-page-bg);
  color: var(--color-body);
  font-family: var(--font-sans);
  line-height: var(--leading-relaxed);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
body { font-size: var(--text-md); }

h1, h2, h3, h4, h5, h6 { color: var(--color-ink); }

a { color: var(--accent); text-decoration: none; transition: color var(--dur-fast) var(--ease); }
a:hover { color: var(--accent-hover); text-decoration: underline; }

button, input, select, textarea { font-family: inherit; }

::selection { background: var(--accent-tint); color: var(--accent-hover); }

/* Iki katmanli odak halkasi (portalv3 sozlesmesi): --focus-ring yuzey
   renginde bir bosluk + metin tasiyan yesil bir dis halka cizer.
   `outline` AYRICA korunur ve ayni 2-4px bandi kaplar; ciplak
   `outline: none` YAZMAYIN — box-shadow `overflow: hidden` bir ata
   tarafindan kirpilabilir ve Windows yuksek kontrast (forced-colors)
   modunda hic cizilmez; o iki durumda gorunur tek gosterge outline'dir. */
:focus-visible {
  outline: 2px solid var(--portal-primary-strong);
  outline-offset: 2px;
  box-shadow: var(--focus-ring);
  border-radius: var(--r-1);
}
/* Koyu gradyan barin uzerindeki kontroller kendi halkasini kullanir. */
header.topbar :focus-visible {
  outline-color: var(--dash-header-text);
  box-shadow: var(--focus-ring-on-dark);
}

/* Kaydirma cubugu: 10px ray, saydam 3px cerceveyle ic boslukta duran hap
   tutamak (content-box klip). */
::-webkit-scrollbar { width: 0.6667rem; height: 0.6667rem; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb {
  border-radius: var(--radius-pill);
  background: var(--scrollbar-thumb);
  border: 3px solid transparent;
  background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover { background: var(--border-strong); background-clip: content-box; }

/* Hareket azaltma tercihinde animasyon global olarak notrlestirilir. Durum
   gostergeleri MUAF: donmus bir spinner "takildi" gibi okunur, yalnizca
   yavaslar. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }
  .loading::before {
    animation-duration: 2s !important;
    animation-iteration-count: infinite !important;
  }
}

/* ---------------- Yalniz ekran okuyucu ---------------- */
/*
 * Gorsel olarak gizli ama erisilebilirlik agacinda duran metin. Kenar
 * cubugunda metot yalniz IKONLA anlatiliyor; ikonun yanina bunu koyarak
 * bilgiyi ekran okuyucuya da veriyoruz (renk ve sekil tek sinyal olmasin).
 */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* ---------------- Iskelet yukleme ---------------- */
/*
 * Once her bekleme bir spinner + "Yukleniyor..." metniydi: ekran bos kalir,
 * gelecek icerigin ne kadar ve ne bicimde olacagi bilinmez, ayni sure daha
 * uzun hissedilir. Iskelet yerlesimi simdiden cizer.
 *
 * Parilti prefers-reduced-motion'da taban kuralla susar. Spinner'lar orada
 * MUAFTI (donmayan spinner "takildi" gibi okunur); iskelet icin bu gecerli
 * degil, durmasi sorun etmez.
 */
.skel {
  position: relative;
  overflow: hidden;
  background: var(--skel-base);
  border-radius: var(--r-1);
}
.skel::after {
  content: '';
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, var(--skel-sheen), transparent);
  transform: translateX(-100%);
  animation: skel-shimmer 1.4s var(--ease) infinite;
}
@keyframes skel-shimmer { to { transform: translateX(100%); } }

.skel-line { height: 0.7333rem; margin-bottom: 0.5333rem; }
.skel-line.w100 { width: 100%; }
.skel-line.w80 { width: 80%; }
.skel-line.w60 { width: 60%; }
.skel-line.w40 { width: 40%; }
.skel-title { height: 1.4667rem; width: 45%; margin-bottom: var(--sp-4); }
.skel-icon { width: 1.2rem; height: 1.2rem; flex-shrink: 0; }
.skel-badge { width: 2.8rem; height: 1.1333rem; flex-shrink: 0; }
.skel-row {
  display: flex;
  align-items: center;
  gap: 0.6667rem;
  min-height: 2.2667rem;
  padding: 0 0.6667rem;
}
.skel-card {
  padding: var(--sp-4);
  background: var(--dash-card-bg);
  border: 1px solid var(--dash-card-border);
  border-radius: var(--radius-card);
  box-shadow: var(--elevation-1);
}
.skel-sidebar { padding: var(--sp-3) 0.6667rem; }
.skel-group-title { height: 0.6rem; width: 45%; margin: 0.8rem 0.5333rem 0.6rem; }

/* ---------------- Ipucu (tooltip) ---------------- */
/*
 * Kenar cubugu satirlarinin adi daraltilmis rayda ellipsis'e dusuyor ve tam
 * ad native `title` ile veriliyordu: 1-2 saniye gecikmeli, bicimlendirilemez,
 * dokunmatikte hic gorunmez, uzun metinde satira sigmaz. Yerine tek bir yuzen
 * eleman (public.js initTooltip): [data-tip] tasiyan her sey uzerine gelince
 * ya da ODAKLANINCA acilir — klavyeyle gezen de gorur.
 *
 * Ipucu YALNIZ GORSELDIR (pointer-events: none, role yok): satirin
 * erisilebilir adi zaten gorunen metnidir. Yalniz ikonla anlatilan bilgi
 * (metot) .sr-only ile ayrica yazilir.
 */
.tip {
  position: fixed;
  z-index: 1200;
  max-width: 22rem;
  padding: 0.3333rem 0.6rem;
  border-radius: var(--r-1);
  /* Ters kontrast: acik temada koyu balon/acik metin, koyu temada tersi —
     iki token da temayla birlikte donduku icin kendiliginden calisir. */
  background: var(--color-ink);
  color: var(--dash-card-bg);
  font-size: var(--text-xs);
  font-weight: 500;
  line-height: var(--leading-snug);
  box-shadow: var(--elevation-2);
  pointer-events: none;
  opacity: 0;
  transition: opacity var(--dur-fast) var(--ease);
}
.tip.is-open { opacity: 1; }

/* ---------------- Marka isareti (white-label) ----------------
 * Logo iki varyant tasiyabilir: acik tema ve koyu tema. Ikisi de DOM'da
 * durur, CSS hangisinin gorunecegine karar verir — tema degisince JS'in
 * src'yi degistirmesini beklemek gerekmez (o bir kare gecikme ve titreme
 * demekti). Koyu varyant verilmemisse acik varyant her iki temada kullanilir.
 *
 * Logo <img> ile cizilir: SVG icindeki script <img> baglaminda calismaz.
 * Inline <svg> olarak gommeyin (bkz. src/branding.js LOGO_TYPES notu).
 */
.brand-logo { display: block; width: auto; }
.brand-logo--dark { display: none; }
:root.dark .brand-logo--light { display: none; }
/* Koyu varyant VARSA acik temada gizlenir, koyu temada gosterilir. */
:root.dark .brand .brand-logo--dark { display: block; }
/* Koyu varyant yoksa (.brand icinde tek img) acik logo koyu temada da kalir. */
:root.dark .brand:not(:has(.brand-logo--dark)) .brand-logo--light { display: block; }

.brand-name { white-space: nowrap; }
/* Logo varken ad ile logo arasi bosluk .brand'in kendi gap'inden gelir;
   logosuz kurulumda (notr varsayilan) yalniz kelime-isaret kalir. */

/* ============================================================
 *  Sayfa basligi bandi (portalv3 .iz-pagebar)
 * ============================================================ */
/*
 * Bant KENDI kartidir: rozet + (ust baslik + sayfa adi) solda, eylemler
 * sagda. Once iki uygulamada da ciplak bir <h1> ve altinda inline stilli bir
 * flex div vardi; sayfanin nerede basladigi, eylemlerin nereye ait oldugu
 * okunmuyordu (portalv3 §2).
 *
 * Bant alttaki icerige YAPISMAZ: arada bandin kendi alt boslugu durur, yani
 * "baslik nerede bitiyor, icerik nerede basliyor" gozle ayrilir.
 *
 * Bu blok apps/docs ve apps/admin style.css'leri arasinda ELLE senkron
 * tutulur (token blogu ile ayni kural).
 */
.pagebar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-5);
  flex-wrap: wrap;
  position: relative;
  padding: 0.9333rem var(--sp-4);
  margin-bottom: 0.9333rem;
  background: var(--dash-card-bg);
  border: 1px solid var(--dash-card-border);
  border-radius: var(--radius-card);
  box-shadow: var(--dash-pagebar-shadow);
}

.pagebar__brand {
  display: flex;
  align-items: center;
  gap: 0.6667rem;
  flex: 1 1 15rem;
  min-width: 0;
}

/*
 * Sayfa rozeti: adin yanindaki SAKIN ikon kutusu — sayfayi tanitir, eylem
 * degildir (tiklanmaz, odak almaz). Tonu sol menudeki satirin tonuyla
 * AYNIDIR (admin'de NAV_GROUPS'tan turer), boylece menu ile baslik arasinda
 * renk surekliligi olur: menude mavi klasor ikonuyla girdiginiz ekranin
 * basliginda da mavi klasor durur.
 */
.pagebar__badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 2.2667rem;
  width: 2.2667rem;
  height: 2.2667rem;
  border-radius: 0.6667rem;
  background: var(--tint-slate);
  color: var(--tone-slate);
  font-size: var(--text-md);
}
.pagebar__badge[data-tone='green'] { background: var(--tint-green); color: var(--tone-green); }
.pagebar__badge[data-tone='blue'] { background: var(--tint-blue); color: var(--tone-blue); }
.pagebar__badge[data-tone='indigo'] { background: var(--tint-indigo); color: var(--tone-indigo); }
.pagebar__badge[data-tone='cyan'] { background: var(--tint-cyan); color: var(--tone-cyan); }
.pagebar__badge[data-tone='amber'] { background: var(--tint-amber); color: var(--tone-amber); }
.pagebar__badge[data-tone='violet'] { background: var(--tint-violet); color: var(--tone-violet); }
.pagebar__badge[data-tone='teal'] { background: var(--tint-teal); color: var(--tone-teal); }
.pagebar__badge[data-tone='rose'] { background: var(--tint-rose); color: var(--tone-rose); }
.pagebar__badge[data-tone='lime'] { background: var(--tint-lime); color: var(--tone-lime); }

.pagebar__text {
  display: flex;
  flex-direction: column;
  gap: 2px;
  min-width: 0;
}

.pagebar__crumbs {
  display: flex;
  align-items: center;
  gap: 0.4rem;
  font-size: var(--text-3xs);
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--color-subtle);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.pagebar h1.pagetitle,
.pagebar .pagetitle {
  margin: 0;
  font-size: 1.4667rem;
  font-weight: 700;
  letter-spacing: -0.02em;
  line-height: var(--leading-tight);
  color: var(--color-ink);
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.pagebar__actions {
  display: flex;
  align-items: center;
  gap: 0.6667rem;
  flex: 0 0 auto;
  margin-left: auto;
}
/* Bant eylemleri TEK ritim: 2.3333rem (35px). Yukseklik burada tek yerde
   veriliyor ki bant, araclar cubugu ve tablo eylemleri uc ayri ritim
   kurmasin (portalv3 .iz-actions). */
.pagebar__actions .btn,
.pagebar__actions .btn-sm {
  min-height: 2.3333rem;
  margin-top: 0;
  /* Dugme metni SARMAZ: bant sikisinca once arama alani daralir, dugme iki
     satira dusup bandin yuksekligini bozmaz. */
  white-space: nowrap;
  flex: 0 0 auto;
}

/* Bant icindeki arama alani. Once her liste ekraninda inline style ile
   tekrarlaniyordu. */
.pagebar__search {
  flex: 1 1 14rem;
  max-width: 24rem;
  min-width: 0;
  padding: 0.4667rem 0.8rem;
  border: 1px solid var(--border);
  border-radius: var(--radius-control);
  background: var(--dash-card-bg);
  color: var(--color-body);
  font-family: inherit;
  font-size: var(--text-base);
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.pagebar__search:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}

/* Metot rozeti / yol satiri (docs endpoint bandi). */
.pagebar__meta {
  display: flex;
  align-items: center;
  gap: 0.5333rem;
  min-width: 0;
  margin-top: 0.1333rem;
  font-family: var(--font-mono);
  font-size: var(--text-xs);
  color: var(--color-muted);
}
.pagebar__meta .path {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

@media (max-width: 700px) {
  .pagebar { align-items: flex-start; }
  .pagebar__actions { width: 100%; margin-left: 0; flex-wrap: wrap; }
  .pagebar__search { max-width: none; }
  .pagebar h1.pagetitle,
  .pagebar .pagetitle { white-space: normal; }
}

/* ============================================================
 *  Layout
 * ============================================================ */
/* Icerik kolonu `minmax(0, 1fr)`, duz `1fr` DEGIL: `1fr`in alt siniri
   `auto`, yani kolondaki en genis ogenin min-content'i. Ust bar iki kolonu
   kaplayan bir grid ogesi oldugu icin onun min-content'i (arama + ortam +
   dil + dugmeler, ~750px) kolonu sisiriyordu; telefonda sayfa ekranin iki
   kati genisliginde aciliyor ve her sey yatay kayiyordu. */
.layout {
  display: grid;
  grid-template-columns: var(--sidebar-w) minmax(0, 1fr);
  grid-template-rows: var(--header-h) 1fr;
  grid-template-areas: "header header" "sidebar main";
  min-height: 100vh;
}

/* ============================================================
 *  Topbar
 * ============================================================ */
header.topbar {
  grid-area: header;
  display: flex;
  align-items: center;
  padding: 0 var(--sp-6);
  background: var(--dash-header-bg);
  position: sticky;
  top: 0;
  /* .search-results (header'in bir cocugu) icin ne kadar yuksek bir z-index
     verilirse verilsin, sticky header kendi stacking context'ini olusturdugu
     icin bu deger her zaman header'in KENDI z-index'iyle sinirli kalir. Sayfa
     icindeki sabit panellerin (.endpoint-response z-index:20, .try-resizer
     z-index:21) ustunde kalabilmesi icin header'in z-index'i onlardan yuksek
     olmak zorunda. */
  z-index: 25;
  gap: var(--sp-3);
  box-shadow: var(--dash-header-shadow);
}

header.topbar .brand {
  font-weight: 600;
  font-size: 1.0667rem;
  letter-spacing: 0.01em;
  color: var(--dash-header-text);
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  white-space: nowrap;
}
header.topbar .brand img {
  height: 2rem !important;
  width: auto;
  /* Yer daralinca kirpilan ad olur, logo ezilmez. */
  flex-shrink: 0;
  filter: brightness(0) invert(1);
}
header.topbar .spacer { flex: 1; }
/* Bar hicbir genislikte tasmaz: arama 24rem'e kadar buyur ama sabit degildir,
   yer daralinca once o kuculur; marka adi da sigmazsa kirpilir. Sabit
   genislikte (24rem + 40vw siniri) 901-1150px arasi masaustunde son dugme
   ("Giris Yap") barin disina itiliyordu. */
header.topbar .brand { flex: 0 1 auto; min-width: 0; }
header.topbar .brand-name { overflow: hidden; text-overflow: ellipsis; }
header.topbar .search-wrap { flex: 0 1 24rem; min-width: 0; }

header.topbar input.search {
  width: 100%;
  min-width: 0;
  padding: 0.5333rem 0.8rem 0.5333rem 2.2667rem;
  border: 1px solid var(--dash-header-border);
  border-radius: var(--radius-control);
  background: var(--dash-header-overlay) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round'><circle cx='11' cy='11' r='7'/><path d='m21 21-4.3-4.3'/></svg>") no-repeat 0.6667rem center;
  color: var(--dash-header-text);
  font-size:var(--text-base);
  outline: none;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), width var(--dur-base) var(--ease);
}
header.topbar input.search::placeholder { color: var(--dash-header-text-muted); }
header.topbar input.search:hover { background-color: var(--dash-header-active); }
header.topbar input.search:focus {
  border-color: var(--dash-header-text);
  background-color: var(--dash-header-active);
}

header.topbar .actions { display: flex; gap: var(--sp-2); align-items: center; }
/* Bar uzerindeki kontroller: duragan halde saydam beyaz dolgu, hover'da
   biraz daha yogun, basiliyken --dash-header-active. Metin duragan halde
   muted (0.72 — AA tabani), hover'da tam beyaz. Koyu temada bar zaten koyu
   gradyan oldugu icin ayri bir :root.dark blogu YOK. */
header.topbar button.icon-btn {
  background: var(--dash-header-overlay);
  border: 1px solid var(--dash-header-border);
  color: var(--dash-header-text-muted);
  padding: 0.4rem 0.8rem;
  border-radius: var(--radius-control);
  cursor: pointer;
  font-size:var(--text-sm);
  font-weight: 600;
  letter-spacing: 0.01em;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
header.topbar button.icon-btn:hover {
  background: var(--dash-header-active);
  border-color: var(--dash-header-border);
  color: var(--dash-header-text);
}
header.topbar button.icon-btn:active { background: var(--dash-header-active); }

/* ============================================================
 *  Sidebar
 * ============================================================ */
/*
 * Sol menu = portalv3 rayi (_menu.scss), icerik agacina uyarlanmis.
 *
 * ---------------------------------------------------------------------------
 * IKI KURAL HER SEYI TASIR — bozarsaniz girintiler yeniden kayar:
 *
 * 1. TEK ISARET SUTUNU. Her satir tipi (kategori, endpoint, rehber, SOAP
 *    servisi, SOAP operasyonu) ayni genislikte (--nav-lead) bir isaret
 *    kutusuyla baslar. Kutunun ICINDE ne oldugu degisir — tint'li kategori
 *    karosu, metot ikonu, dokuman ikonu, nokta — ama GENISLIGI degismez.
 *    Boylece ayni derinlikteki her satirin metni ayni x'ten baslar.
 *
 * 2. CHEVRON SAGDA. portalv3'un yaptigi da bu. Chevron solda olsaydi
 *    acilabilir satirlar (kategori, SOAP servisi) isaret sutununu bir chevron
 *    kadar sagA iterdi ve kardes yaprak satirlarla hizasi bozulurdu — agac
 *    her acildiginda "girintiler kayiyor" hissinin sebebi buydu.
 *
 * GIRINTI TEK ADIMDIR (--nav-indent): margin + 1px kilavuz cizgisi + padding
 * toplami. Her seviye bunu bir kez ekler; baska hicbir yerde margin/padding
 * ile girinti YAPILMAZ.
 * ---------------------------------------------------------------------------
 *
 * portalv3'un 68px ikon rayi BURADA YOK: bu menu sabit bir modul listesi
 * degil, keyfi derinlikte bir kategori agaci — ikona indirgenemez. Daraltma
 * (--sidebar-collapsed) rayi tumuyle gizler; genislik surukleyerek ayarlanir
 * (--sidebar-w).
 */
.sidebar {
  /* Isaret sutunu genisligi ve metinle arasindaki bosluk. Tek yerde. */
  --nav-lead: 1.4667rem;
  --nav-gap: 0.6667rem;
  /* Bir seviyelik girinti: 7px margin + 1px cizgi + 8px padding = 16px. */
  --nav-indent-margin: 0.4667rem;
  --nav-indent-pad: 0.5333rem;
}

aside.sidebar {
  grid-area: sidebar;
  border-right: 1px solid var(--dash-card-border);
  background: var(--dash-card-bg);
  overflow-y: auto;
  padding: var(--sp-3) 0 var(--sp-6);
  max-height: calc(100vh - var(--header-h));
  position: sticky;
  top: var(--header-h);
  scrollbar-width: thin;
  scrollbar-color: var(--scrollbar-thumb) transparent;
}
/* Kaydirma cubugu global taban kuraldan gelir (hap tutamak, content-box
   klip); burada yalniz ray daraltilir. */
aside.sidebar::-webkit-scrollbar { width: 8px; }

/* ---------------- Gruplar ve girinti ---------------- */

.sidebar .cat-group { padding: 0 var(--nav-gap) var(--sp-2); }

/*
 * GIRINTIYI ACILAN LISTE TASIR, grup DEGIL.
 *
 * Kural: bir satirin COCUKLARI o satirdan tam bir adim iceride durur. Girinti
 * .cat-links uzerinde oldugu icin bu YAPRAKLAR ICIN DE gecerlidir — "REST
 * API"nin altindaki endpoint'ler onun kardesi gibi degil, cocugu gibi
 * gorunur. (Girinti .cat-group-sub'ta olsaydi yalniz ALT KATEGORILER
 * icerlerdi; yapraklar ustleriyle ayni x'te kalir ve agac duz okunurdu —
 * "girintiler kayiyor" hissinin asil sebebi buydu.)
 *
 * Girinti DOM ic-iceliginden gelir, bu yuzden tek kural her seviyede
 * kendiliginden birikir. Kilavuz cizgisi, girintinin tek basina
 * soyleyemedigi "hangi dalin altindayim" sorusunu yanitlar.
 *
 * .soap-ops zaten bir .cat-links'tir; ayrica kural gerekmez.
 */
.sidebar .cat-links {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-left: var(--nav-indent-margin);
  padding-left: var(--nav-indent-pad);
  border-left: 1px solid var(--color-border);
}
/* Alt gruplar ve SOAP grubu KENDILERI girinti eklemez: konumlari ustlerinin
   .cat-links'inden gelir. Ikinci bir girinti kaynagi olsa adimlar katlanirdi. */
.sidebar .cat-group-sub,
.sidebar .soap-group { padding: 0 0 var(--sp-1); }
.sidebar .cat-group.collapsed .cat-links { display: none; }

/* ---------------- Ortak satir tabani ----------------
 * Kategori basligi bir <button>, yapraklar <a>; ikisi de AYNI satir olmali.
 */
.sidebar .cat-title,
.sidebar .nav-link {
  display: flex;
  align-items: center;
  gap: var(--nav-gap);
  width: 100%;
  min-height: 2.2667rem;
  padding: 0 var(--nav-gap);
  border: none;
  border-radius: var(--radius-control);
  background: transparent;
  font-family: inherit;
  font-size: var(--text-base);
  line-height: 1.2;
  text-align: left;
  white-space: nowrap;
  overflow: hidden;
  position: relative;
  cursor: pointer;
  user-select: none;
  transition: background var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}

/* Isaret sutunu: tek genislik, her satir tipi icin. */
.sidebar .cat-tile,
.sidebar .nav-icon,
.sidebar .soap-op-bullet {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 var(--nav-lead);
  width: var(--nav-lead);
  height: var(--nav-lead);
}

/* Metin esner ve tasinca ellipsis'e duser; sutunlar sabit kalir. */
.sidebar .cat-title-text,
.sidebar .nav-text {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Chevron SAGDA (bkz. dosya basi, kural 2). */
.sidebar .cat-chevron {
  flex: 0 0 auto;
  width: 0.6667rem;
  font-size: 0.6rem;
  color: var(--color-subtle);
  transition: transform var(--dur-base) var(--ease);
}
.sidebar .cat-group.collapsed > .cat-title-row .cat-chevron,
.sidebar .cat-group.collapsed > .soap-svc-row .cat-chevron { transform: rotate(-90deg); }

/* ---------------- Kategori satiri ----------------
 * portalv3'un modul satirinin karsiligi: tint'li ikon karosu + ad + sayac +
 * chevron. RENK BURADA yasiyor — kategori sayisi az ve her biri farkli, yani
 * ton bilgi tasir (yapraklarda tersi gecerli, orada renk duvari olurdu).
 * Ton slug'dan turer (public.js catTone), sira degisince kaymaz.
 */
.sidebar .cat-title-row { display: flex; align-items: center; }
.sidebar .cat-title-row .cat-title { flex: 1; min-width: 0; width: auto; }

.sidebar .cat-title {
  font-weight: 600;
  color: var(--color-ink);
}
.sidebar .cat-group:not(.cat-group-sub) > .cat-title-row > .cat-title { min-height: 2.5333rem; }
.sidebar .cat-title:hover { background: var(--color-surface); }
.sidebar .cat-title.active { background: var(--portal-tint-050); color: var(--portal-primary-strong); }
.sidebar .cat-title:focus { outline: none; }
.sidebar .cat-title:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; box-shadow: none; }

/* Alt kategori: ayni satir, daha sakin murekkep ve daha kucuk karo. */
.sidebar .cat-group-sub > .cat-title-row > .cat-title { color: var(--color-body); }

.sidebar .cat-tile {
  border-radius: 0.4667rem;
  background: var(--tint-slate);
  color: var(--tone-slate);
  font-size: 0.6667rem;
}
.sidebar .cat-tile[data-tone='green']  { background: var(--tint-green);  color: var(--tone-green); }
.sidebar .cat-tile[data-tone='blue']   { background: var(--tint-blue);   color: var(--tone-blue); }
.sidebar .cat-tile[data-tone='indigo'] { background: var(--tint-indigo); color: var(--tone-indigo); }
.sidebar .cat-tile[data-tone='cyan']   { background: var(--tint-cyan);   color: var(--tone-cyan); }
.sidebar .cat-tile[data-tone='amber']  { background: var(--tint-amber);  color: var(--tone-amber); }
.sidebar .cat-tile[data-tone='violet'] { background: var(--tint-violet); color: var(--tone-violet); }
.sidebar .cat-tile[data-tone='teal']   { background: var(--tint-teal);   color: var(--tone-teal); }
.sidebar .cat-tile[data-tone='rose']   { background: var(--tint-rose);   color: var(--tone-rose); }
.sidebar .cat-tile[data-tone='lime']   { background: var(--tint-lime);   color: var(--tone-lime); }
/* Acik kategori karosu DOLU tona doner: hangi dalin acik oldugu tek bakista. */
.sidebar .cat-group:not(.collapsed) > .cat-title-row > .cat-title > .cat-tile {
  box-shadow: inset 0 0 0 1px currentColor;
}
.sidebar .cat-title.active .cat-tile {
  background: var(--portal-primary-strong);
  color: var(--color-white);
  box-shadow: var(--elevation-tile);
}

/* Sayac ikincil bilgidir: cercevesiz, zeminsiz, yalniz sayi. */
.sidebar .cat-count {
  flex: 0 0 auto;
  font-size: var(--text-3xs);
  font-weight: 600;
  color: var(--color-subtle);
  padding: 0 2px;
  min-width: 0.9333rem;
  text-align: right;
  letter-spacing: 0;
}

/* Paylas dugmesi: her satirda duran bir zincir ikonu, agac derinlestikce
   okunacak seyden cok gurultu oluyordu — yalniz hover/odakta gorunur.
   Dokunmatikte hover yok, orada sonuk ama gorunur kalir. */
.sidebar .cat-share-btn {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.4667rem;
  height: 1.4667rem;
  padding: 0;
  background: transparent;
  border: none;
  border-radius: var(--r-1);
  color: var(--color-subtle);
  font-size: 0.6667rem;
  cursor: pointer;
  opacity: 0;
  transition: color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease), opacity var(--dur-fast) var(--ease);
}
@media (hover: none) { .sidebar .cat-share-btn { opacity: 0.45; } }
.sidebar .cat-title-row:hover .cat-share-btn { opacity: 1; }
.sidebar .cat-share-btn:hover { color: var(--accent); background: var(--accent-soft); }
.sidebar .cat-share-btn:focus { outline: none; }
.sidebar .cat-share-btn:focus-visible { opacity: 1; outline: 2px solid var(--accent); outline-offset: -2px; }
.sidebar .cat-share-btn.copied { opacity: 1; color: var(--accent); }

/* ---------------- Yaprak satirlari ---------------- */

.sidebar .nav-link {
  font-weight: 500;
  color: var(--color-muted);
  text-decoration: none;
}
.sidebar .nav-link:hover { background: var(--color-surface); text-decoration: none; }
.sidebar .nav-link.active {
  background: var(--portal-tint-050);
  color: var(--portal-primary-strong);
  font-weight: 600;
}
.sidebar .nav-link.active:hover { background: var(--portal-tint-100); }
/* Aktif satirin renk-disi ikinci isareti: 3px yesil sol iz (portalv3). */
.sidebar .nav-link.active::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.4rem;
  bottom: 0.4rem;
  width: 3px;
  background: var(--portal-primary-strong);
  border-radius: 0 3px 3px 0;
}

/*
 * Isaret sutunundaki ikon. Metot rengi BILGIDIR: hover ve aktif satirda da
 * degismez. Metot ADI kenar cubugunda yok (42px'lik rozetler her satirda
 * tekrarlayip basliktan cok yer kapliyordu); tam ad + metot satirin
 * data-tip'inde, ekran okuyucu icin .sr-only olarak yazili.
 */
.sidebar .nav-icon { font-size: 0.7333rem; color: var(--color-subtle); }
.sidebar .nav-icon.m-GET     { color: var(--method-get); }
.sidebar .nav-icon.m-POST    { color: var(--method-post); }
.sidebar .nav-icon.m-PUT     { color: var(--method-put); }
.sidebar .nav-icon.m-PATCH   { color: var(--method-patch); }
.sidebar .nav-icon.m-DELETE  { color: var(--method-delete); }
.sidebar .nav-icon.m-SOAP    { color: var(--method-soap); }
.sidebar .nav-icon.m-HEAD,
.sidebar .nav-icon.m-OPTIONS { color: var(--color-muted); }
/* Rehber ikonu notrdur, satirin durumunu izler. */
.sidebar .nav-link:hover .nav-icon--doc { color: var(--color-muted); }
.sidebar .nav-link.active .nav-icon--doc { color: var(--portal-primary-strong); }

/* ---------------- SOAP servisi ve operasyonlari ----------------
 * Servis satiri bir YAPRAK gibi baslar (kendi sayfasi var) ama acilabilir;
 * bu yuzden kardes yapraklarla ayni hizada durur, chevron'u sagda ayri bir
 * dugmededir (ic ice <button>/<a> gecersiz HTML olurdu).
 */
.sidebar .soap-svc-row { display: flex; align-items: center; }
.sidebar .soap-svc-link { flex: 1; min-width: 0; }
.sidebar .soap-svc-toggle {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 1.4667rem;
  height: 2.2667rem;
  background: transparent;
  border: none;
  border-radius: var(--r-1);
  cursor: pointer;
  padding: 0;
  color: var(--color-subtle);
}
.sidebar .soap-svc-toggle:hover { color: var(--color-muted); background: var(--color-surface); }
.sidebar .soap-svc-toggle:focus { outline: none; }
.sidebar .soap-svc-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }

.sidebar .soap-ops .nav-link {
  min-height: 2.1333rem;
  font-size: var(--text-sm);
  color: var(--color-subtle);
}
.sidebar .soap-ops .nav-link:hover { color: var(--color-muted); }
.sidebar .soap-ops .nav-link.active { color: var(--portal-primary-strong); }

/* Operasyon noktasi ayni isaret sutununda ortalanir. */
.sidebar .soap-op-bullet { opacity: 0.55; }
.sidebar .soap-op-bullet::before {
  content: '';
  width: 5px;
  height: 5px;
  border-radius: 50%;
  background: currentColor;
}
.sidebar .soap-op-link.active .soap-op-bullet { opacity: 1; }

/* ---------------- Mobil gezinme cekmecesi ----------------
 * 900px altinda ray akistan cikar ve ust bardaki hamburgerle acilan bir
 * off-canvas cekmeceye doner. Onceden bu esikte kenar cubugu `display: none`
 * idi ve YERINE HICBIR SEY gelmiyordu — public bir dokumantasyon sitesinde
 * telefondan gezinme yoktu.
 *
 * Masaustunde hamburger baska bir is yapar (rayi tumuyle gizler,
 * .sidebar-collapsed); iki davranis ayni dugmede ama farkli esiklerde.
 */
.nav-scrim {
  position: fixed;
  inset: 0;
  z-index: 28;
  background: var(--overlay-scrim);
  opacity: 0;
  transition: opacity var(--dur-base) var(--ease);
}
:root.nav-open .nav-scrim { opacity: 1; }

@media (max-width: 900px) {
  /* Ray akistan cikar: grid tek sutun kalir, cekmece uzerine biner. */
  aside.sidebar {
    display: block;
    position: fixed;
    top: var(--header-h);
    left: 0;
    bottom: 0;
    width: min(88vw, 21rem);
    max-height: none;
    z-index: 29;
    border-right: 1px solid var(--dash-card-border);
    box-shadow: var(--elevation-3);
    transform: translateX(-100%);
    transition: transform var(--dur-base) var(--ease);
    /* iOS'ta cekmece kayarken sayfanin da kaymasini onler. */
    overscroll-behavior: contain;
  }
  :root.nav-open aside.sidebar { transform: translateX(0); }
  /* Masaustunun "tumuyle gizle" durumu mobilde cekmeceyi kilitlemesin. */
  :root.sidebar-collapsed aside.sidebar { display: block; }
  /* Cekmece acikken arkadaki sayfa kaymaz. */
  :root.nav-open body { overflow: hidden; }
}

/* Masaustunde perde ve cekmece yok. */
@media (min-width: 901px) {
  .nav-scrim { display: none; }
}

/* ============================================================
 *  Main content
 * ============================================================ */
main.content {
  grid-area: main;
  padding: var(--sp-8) var(--sp-12) var(--sp-12);
  max-width: 66.6667rem;
  width: 100%;
}
main.content h1 {
  margin-top: 0;
  margin-bottom: var(--sp-4);
  font-size: 1.8667rem;
  font-weight: 700;
  letter-spacing: -0.01em;
  line-height: 1.25;
}
main.content h2 {
  font-size: 1.4rem;
  margin-top: var(--sp-10);
  margin-bottom: var(--sp-3);
  font-weight: 600;
  letter-spacing: -0.005em;
  padding-bottom: var(--sp-2);
  border-bottom: 1px solid var(--border-soft);
}
main.content h3 {
  font-size: 1.0667rem;
  margin-top: var(--sp-6);
  margin-bottom: var(--sp-2);
  font-weight: 600;
}
main.content h4 {
  font-size:var(--text-md);
  margin-top: var(--sp-5);
  margin-bottom: var(--sp-2);
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--text-muted);
}
main.content p { margin: var(--sp-3) 0; }
main.content code {
  font-family: var(--font-mono);
  font-size: 0.875em;
  background: var(--bg-code);
  padding: 2px 0.4rem;
  border-radius: 0.2667rem;
  border: 1px solid var(--border-soft);
}
main.content pre {
  background: var(--bg-code);
  padding: var(--sp-4);
  border-radius: var(--r-3);
  overflow-x: auto;
  border: 1px solid var(--border-soft);
  position: relative;
  font-size:var(--text-base);
  line-height: 1.55;
}
main.content pre code {
  background: transparent;
  padding: 0;
  border: none;
  font-size:var(--text-base);
}
main.content pre .copy-btn {
  position: absolute; top: var(--sp-2); right: var(--sp-2);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  padding: 0.2667rem 0.6667rem;
  font-size:var(--text-xs);
  font-weight: 500;
  cursor: pointer;
  color: var(--text-muted);
  opacity: 0;
  transition: all var(--dur-fast) var(--ease);
  letter-spacing: 0.02em;
}
main.content pre:hover .copy-btn { opacity: 1; }
main.content pre .copy-btn:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }
main.content pre .copy-btn:focus-visible { opacity: 1; }
.copy-btn.copied { color: var(--status-ok-fg); border-color: var(--status-ok-fg); background: var(--status-ok-bg); opacity: 1 !important; }

main.content ul, main.content ol { padding-left: 1.4667rem; }
main.content ul li, main.content ol li { margin: var(--sp-1) 0; }

/* ============================================================
 *  Rendered markdown (.md)
 *  Admin'de yazilan markdown alanlarinin ciktisi. Sadece bu agaca
 *  uygulanir; landing kartlari ve table.params etkilenmez.
 * ============================================================ */
.md > *:first-child { margin-top: 0; }
.md > *:last-child { margin-bottom: 0; }

.md h5, .md h6 {
  font-size:var(--text-base);
  margin: var(--sp-4) 0 var(--sp-2);
  font-weight: 600;
  color: var(--text-muted);
}

.md a { color: var(--accent); text-decoration: none; border-bottom: 1px solid var(--accent-soft); }
.md a:hover { border-bottom-color: var(--accent); }

.md del { color: var(--text-faint); }

.md img { max-width: 100%; height: auto; border-radius: var(--r-2); }

.md hr {
  border: none;
  border-top: 1px solid var(--border);
  margin: var(--sp-6) 0;
}

.md blockquote {
  margin: var(--sp-4) 0;
  padding: var(--sp-1) var(--sp-4);
  border-left: 3px solid var(--accent);
  background: var(--bg-alt);
  border-radius: 0 var(--r-2) var(--r-2) 0;
  color: var(--text-muted);
}
.md blockquote > *:first-child { margin-top: 0; }
.md blockquote > *:last-child { margin-bottom: 0; }

/* Genis tablolar sayfayi tasirmasin, kendi icinde kaysin. */
.md table {
  display: block;
  width: max-content;
  max-width: 100%;
  overflow-x: auto;
  border-collapse: collapse;
  margin: var(--sp-4) 0;
  font-size:var(--text-base);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-3);
}
.md th, .md td {
  border-bottom: 1px solid var(--border-soft);
  padding: 0.6667rem 0.9333rem;
  text-align: left;
  vertical-align: top;
}
.md thead th {
  font-size:var(--text-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  font-weight: 600;
  background: var(--bg-alt);
  border-bottom: 1px solid var(--border);
}
.md tbody tr:last-child td { border-bottom: none; }
.md tbody tr:nth-child(even) { background: var(--bg-alt); }
.md th[align="center"], .md td[align="center"] { text-align: center; }
.md th[align="right"],  .md td[align="right"]  { text-align: right; }

.md li > p { margin: var(--sp-1) 0; }
.md li > ul, .md li > ol { margin: var(--sp-1) 0; }

/* Gorev listeleri: madde isareti yerine kutucuk */
.md li:has(> input[type="checkbox"]) { list-style: none; margin-left: -1.2rem; }
.md li > input[type="checkbox"] { margin-right: var(--sp-2); vertical-align: middle; }

/* Slate tarzi bilgi kutulari: <aside class="success|notice|warning"> */
.md aside {
  margin: var(--sp-4) 0;
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--r-2);
  border-left: 3px solid var(--border-strong);
  background: var(--bg-alt);
  font-size:var(--text-md);
}
.md aside > *:first-child { margin-top: 0; }
.md aside > *:last-child  { margin-bottom: 0; }
.md aside.success { border-left-color: var(--status-ok-fg);   background: var(--status-ok-bg);   color: var(--status-ok-fg); }
.md aside.notice  { border-left-color: var(--status-warn-fg); background: var(--status-warn-bg); color: var(--status-warn-fg); }
.md aside.warning { border-left-color: var(--status-err-fg);  background: var(--status-err-bg);  color: var(--status-err-fg); }
.md aside code { background: rgba(255, 255, 255, 0.55); border-color: rgba(0, 0, 0, 0.08); }

/* ============================================================
 *  Method pill
 * ============================================================ */
.method-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: var(--font-mono);
  font-size:var(--text-2xs);
  font-weight: 700;
  padding: 3px 0.5333rem;
  border-radius: var(--r-1);
  color: #fff;
  min-width: 3.4667rem;
  letter-spacing: 0.04em;
  line-height: 1.2;
}
.method-pill.GET    { background: var(--method-get-bg); }
.method-pill.POST   { background: var(--method-post-bg); }
.method-pill.PUT    { background: var(--method-put-bg); }
.method-pill.PATCH  { background: var(--method-patch-bg); }
.method-pill.DELETE { background: var(--method-delete-bg); }
.method-pill.SOAP   { background: var(--method-soap-bg); }

/* ============================================================
 *  Endpoint header
 * ============================================================ */
.endpoint-header {
  display: flex;
  gap: var(--sp-3);
  align-items: center;
  flex-wrap: wrap;
  margin: var(--sp-3) 0 var(--sp-5);
  padding: var(--sp-3) var(--sp-4);
  background: var(--bg-alt);
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  font-family: var(--font-mono);
}
.endpoint-header .path {
  font-size:var(--text-base);
  color: var(--text);
  word-break: break-all;
  font-weight: 500;
}

/* ============================================================
 *  Params tables
 * ============================================================ */
.params-doc { margin: var(--sp-4) 0; }
.params-doc-toggle {
  display: inline-flex;
  align-items: center;
  gap: 0.5333rem;
  padding: 0.4667rem 0.9333rem;
  font-size:var(--text-base);
  font-weight: 500;
  color: var(--text);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease), color var(--dur-fast) var(--ease);
}
.params-doc-toggle:hover { border-color: var(--accent); color: var(--accent); }
.params-doc-toggle i { font-size:var(--text-xs); transition: transform var(--dur-fast) var(--ease); }
.params-doc-body[hidden] { display: none; }
.params-doc-body { margin-top: var(--sp-3); min-width: 0; max-width: 100%; overflow-x: auto; }
.params-doc-body > h3:first-child { margin-top: 0; }

table.params {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  margin: var(--sp-3) 0 var(--sp-5);
  font-size:var(--text-base);
  background: var(--bg);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-3);
  overflow: hidden;
}
table.params th, table.params td {
  border-bottom: 1px solid var(--border-soft);
  padding: 0.7333rem 0.9333rem;
  text-align: left;
  vertical-align: top;
}
table.params tbody tr:last-child td { border-bottom: none; }
table.params tbody tr:nth-child(even) { background: var(--bg-alt); }
table.params tbody tr:hover { background: var(--accent-soft); }
table.params th {
  font-size:var(--text-xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  font-weight: 600;
  background: var(--bg-alt);
  border-bottom: 1px solid var(--border);
}
table.params td code {
  font-size:var(--text-sm);
  background: var(--bg-code);
  padding: 2px 0.4rem;
  border-radius: 0.2667rem;
  border: 1px solid var(--border-soft);
}
/* Uzun deger (or. Bearer token) tabloyu tasirmasin: kis + ... (hover'da tam deger) */
table.params td code.val-trunc {
  display: inline-block;
  max-width: 17.3333rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: bottom;
}

.required-tag {
  display: inline-block;
  color: var(--tone-status-rose-fg);
  background: var(--tone-status-rose-bg);
  font-size:var(--text-2xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding: 2px 0.4667rem;
  border-radius: var(--r-pill);
}

/* ============================================================
 *  Search results
 * ============================================================ */
.search-results {
  position: absolute;
  top: 2.9333rem;
  right: 0;
  width: 29.3333rem;
  max-width: 90vw;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  box-shadow: var(--shadow-pop);
  max-height: 60vh;
  overflow-y: auto;
  z-index: 40;
  padding: var(--sp-1);
}
.search-results .sr-item {
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--r-2);
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease);
}
.search-results .sr-item:hover { background: var(--bg-alt); }
.search-results .sr-title {
  font-weight: 500;
  display: flex;
  gap: var(--sp-2);
  align-items: center;
  color: var(--text);
}
.search-results .sr-meta { font-size:var(--text-sm); color: var(--text-muted); margin-top: 2px; }

/* ============================================================
 *  Empty / loading
 * ============================================================ */
.empty {
  padding: var(--sp-12) var(--sp-6);
  text-align: center;
  color: var(--text-muted);
  background: var(--bg-alt);
  border: 1px dashed var(--border);
  border-radius: var(--r-3);
  font-size:var(--text-md);
}

.loading {
  padding: var(--sp-5);
  color: var(--text-muted);
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}
.loading::before {
  content: '';
  width: 0.9333rem; height: 0.9333rem;
  border: 2px solid var(--border);
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}
@keyframes spin { to { transform: rotate(360deg); } }

/* Skeleton shimmer for content loading */
.skeleton {
  background: linear-gradient(90deg, var(--bg-alt) 0%, var(--bg-sunken) 50%, var(--bg-alt) 100%);
  background-size: 200% 100%;
  animation: shimmer 1.4s linear infinite;
  border-radius: var(--r-2);
}
@keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }

/* ============================================================
 *  SOAP styles
 * ============================================================ */
.soap-operation {
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  padding: var(--sp-5);
  margin: var(--sp-4) 0;
  background: var(--bg);
}
.soap-op-header {
  display: flex; gap: var(--sp-3); align-items: center;
  font-family: var(--font-mono); font-size:var(--text-md); font-weight: 600;
  margin-bottom: var(--sp-2);
}
.soap-op-name { color: var(--text); }
.soap-action { font-size:var(--text-base); color: var(--text-muted); margin-bottom: var(--sp-2); }
.soap-action code { font-size:var(--text-sm); }
.soap-ns { font-size:var(--text-md); margin: var(--sp-2) 0 var(--sp-3); color: var(--text-muted); }
.soap-header { border-left: 3px solid var(--method-soap); }

/* ============================================================
 *  Environment & language pickers (topbar pills)
 * ============================================================ */
/* Bu haplar KOYU GRADYAN BARIN uzerinde durur; bar iki temada da ayni
   oldugu icin renkleri --dash-header-* token'larindan gelir ve ayri bir
   :root.dark blogu YOKTUR (eskiden vardi: koyu temada bar duz koyu gri
   olduğu icin. Artik degil). */
.env-picker, .lang-picker {
  display: flex; align-items: center; gap: 0.5333rem;
  padding: 0.3333rem 0.6667rem 0.3333rem 0.6667rem;
  background: var(--dash-header-overlay);
  border: 1px solid var(--dash-header-border);
  color: var(--dash-header-text);
  border-radius: var(--radius-pill);
  margin-right: 0.2667rem;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.env-picker:hover, .lang-picker:hover {
  background: var(--dash-header-active);
  border-color: var(--dash-header-border);
}
.env-picker { position: relative; }
.env-picker-dot {
  display: inline-block; width: 0.5333rem; height: 0.5333rem; border-radius: 50%;
  background: var(--dash-header-text);
  box-shadow: 0 0 0 2px var(--dash-header-active);
}
.env-picker select, .lang-picker select {
  background: transparent;
  border: none;
  color: inherit;
  font-size:var(--text-sm);
  font-family: inherit;
  cursor: pointer;
  outline: none;
  padding: 2px 0.2667rem;
  max-width: 10.6667rem;
}
.env-picker select option, .lang-picker select option { color: var(--color-ink); background: var(--dash-card-bg); }
.env-picker-count {
  background: var(--dash-header-active);
  color: var(--dash-header-text);
  font-size:var(--text-2xs);
  font-weight: 700;
  min-width: 1.3333rem;
  height: 1.2rem;
  border-radius: 0.6rem;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0 0.4rem;
}
.env-picker-count.zero { background: var(--method-delete-bg); color: #fff; }
.env-picker-eye {
  background: transparent;
  border: none;
  cursor: pointer;
  font-size:var(--text-md);
  padding: 0 2px;
  color: var(--dash-header-text-muted);
  border-radius: var(--r-1);
  transition: color var(--dur-fast) var(--ease);
}
.env-picker-eye:hover { color: var(--dash-header-text); }

/* Env var inline highlight */
.env-var {
  background: var(--tone-status-blue-bg);
  border: 1px solid var(--tone-status-blue-border);
  border-radius: 3px;
  padding: 0 0.2667rem;
  color: inherit;
  transition: background var(--dur-fast) var(--ease), outline var(--dur-fast) var(--ease);
}
.env-var.env-hl { outline: 2px solid var(--accent); outline-offset: 1px; }
.env-var-ovr {
  display: inline-block;
  color: var(--accent);
  font-weight: 700;
  font-size:var(--text-2xs);
  margin-left: 2px;
}
.env-var-secret {
  background: var(--tone-status-amber-bg);
  border-color: var(--tone-status-amber-border);
  color: var(--tone-status-amber-fg);
  font-family: var(--font-mono);
}
.env-var-missing {
  background: var(--tone-status-rose-bg);
  border-color: var(--tone-status-rose-border);
  color: var(--tone-status-rose-fg);
  font-family: var(--font-mono);
}

/* ============================================================
 *  Env Editor Modal
 * ============================================================ */
.env-modal-overlay {
  position: fixed; inset: 0;
  background: var(--overlay-scrim);
  z-index: 900;
  backdrop-filter: blur(2px);
  animation: fadeIn var(--dur-base) var(--ease);
}
.env-modal {
  position: fixed; inset: 0; margin: auto;
  width: min(72rem, 94vw); max-height: 86vh;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-4);
  box-shadow: var(--shadow-lg);
  z-index: 950;
  display: flex; flex-direction: column;
  align-self: center; justify-self: center;
  animation: popIn var(--dur-base) var(--ease);
}
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes popIn {
  from { opacity: 0; transform: translateY(0.5333rem) scale(0.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
.env-modal-head {
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  padding: var(--sp-4) var(--sp-5);
  border-bottom: 1px solid var(--border);
}
.env-modal-head h2 {
  margin: 0; font-size: 1.1333rem;
  display: flex; align-items: center; gap: var(--sp-2);
}
.env-modal-color {
  display: inline-block;
  width: 0.8rem; height: 0.8rem;
  border-radius: 50%;
  border: 1px solid var(--border);
}
.env-modal-sub { font-size:var(--text-sm); color: var(--text-muted); margin-top: 0.2667rem; }
.env-modal-head-actions { display: flex; gap: var(--sp-2); align-items: center; }
.env-modal-head-actions .btn-sm { margin-top: 0; }
.env-modal-head-actions .icon-btn {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  padding: 0.2667rem 0.8rem;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 1.2rem;
  line-height: 1;
  transition: all var(--dur-fast) var(--ease);
}
.env-modal-head-actions .icon-btn:hover { color: var(--text); background: var(--bg-alt); }
.env-modal-body { padding: var(--sp-3) var(--sp-5); overflow: auto; flex: 1; }
.env-modal-foot {
  display: flex; justify-content: space-between; align-items: center; gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-5);
  border-top: 1px solid var(--border);
  background: var(--bg-alt);
  font-size:var(--text-sm);
  color: var(--text-muted);
  border-radius: 0 0 var(--r-4) var(--r-4);
}
.env-modal-foot kbd {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 3px;
  padding: 1px 0.4rem;
  font-family: var(--font-mono);
  font-size:var(--text-xs);
  box-shadow: 0 1px 0 var(--border-soft);
}

/* Editor table */
.env-editor-table {
  width: 100%;
  border-collapse: separate;
  border-spacing: 0;
  font-size:var(--text-base);
}
.env-editor-table thead th {
  text-align: left;
  font-size:var(--text-xs);
  text-transform: uppercase;
  color: var(--text-muted);
  font-weight: 600;
  letter-spacing: 0.05em;
  padding: var(--sp-2) var(--sp-3);
  border-bottom: 1px solid var(--border);
  background: var(--bg-alt);
  position: sticky;
  top: 0;
  z-index: 1;
}
.env-editor-table tbody tr { border-bottom: 1px solid var(--border-soft); transition: background var(--dur-fast) var(--ease); }
.env-editor-table tbody tr:hover { background: var(--bg-alt); }
.env-editor-table td { padding: 0.5333rem var(--sp-3); vertical-align: middle; }
.env-row.is-overridden { background: var(--accent-soft); }
.env-row.is-overridden .env-row-current input { border-color: var(--accent); }
.env-row-key code {
  background: var(--bg-code);
  padding: 3px 0.5333rem;
  border-radius: 0.2667rem;
  font-size:var(--text-sm);
  font-weight: 500;
  border: 1px solid var(--border-soft);
}
.env-key-input {
  padding: 0.4rem 0.6667rem;
  font-family: var(--font-mono);
  font-size:var(--text-sm);
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  background: var(--bg);
  color: var(--text);
  width: 100%;
  max-width: 13.3333rem;
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.env-key-input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}

.env-type-badge {
  display: inline-block;
  padding: 2px 0.6rem;
  border-radius: var(--r-pill);
  font-size:var(--text-2xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}
.env-type-badge.default { background: var(--bg-code); color: var(--text-muted); }
.env-type-badge.secret  { background: var(--tint-amber); color: var(--tone-amber); }
.env-type-badge.custom  { background: var(--tint-indigo); color: var(--tone-indigo); }

.env-initial {
  background: var(--bg-code);
  padding: 3px 0.5333rem;
  border-radius: 0.2667rem;
  font-size:var(--text-sm);
  color: var(--text-muted);
  max-width: 17.3333rem;
  display: inline-block;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  vertical-align: middle;
  border: 1px solid var(--border-soft);
}
.env-muted { color: var(--text-muted); font-size:var(--text-sm); font-style: italic; }

.env-current-wrap { display: flex; gap: 0.2667rem; align-items: center; }
.env-current-wrap input {
  flex: 1;
  padding: 0.4667rem 0.6667rem;
  font-family: var(--font-mono);
  font-size:var(--text-base);
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  background: var(--bg);
  color: var(--text);
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.env-current-wrap input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.env-eye-toggle, .env-revert {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  padding: 0.3333rem 0.6667rem;
  cursor: pointer;
  color: var(--text-muted);
  font-size:var(--text-sm);
  transition: all var(--dur-fast) var(--ease);
}
.env-eye-toggle:hover, .env-revert:hover { color: var(--accent); border-color: var(--accent); background: var(--accent-soft); }

.env-usage {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 1.6rem;
  height: 1.3333rem;
  padding: 0 0.4667rem;
  border-radius: var(--r-pill);
  background: var(--bg-code);
  color: var(--text-muted);
  font-size:var(--text-xs);
  font-weight: 700;
  border: 1px solid var(--border-soft);
}
.env-usage.active { background: var(--accent); color: #fff; border-color: var(--accent); }

.env-del {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  padding: 0.2667rem 0.6667rem;
  cursor: pointer;
  color: var(--text-muted);
  font-size:var(--text-md);
  line-height: 1;
  transition: all var(--dur-fast) var(--ease);
}
.env-del:hover { color: var(--method-delete); border-color: var(--method-delete); background: var(--status-err-bg); }

.env-row-add {
  border-top: 2px dashed var(--border) !important;
  background: var(--bg-alt);
}
.env-row-add input {
  padding: 0.4667rem 0.6667rem;
  font-family: var(--font-mono);
  font-size:var(--text-base);
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  background: var(--bg);
  color: var(--text);
  width: 100%;
}
.env-row-add .btn-sm { margin-top: 0; }

/* Bulk edit */
.env-bulk { padding: var(--sp-2) 0; }
.env-bulk p { margin: 0 0 var(--sp-3); font-size:var(--text-base); color: var(--text-muted); }
.env-bulk-textarea {
  width: 100%;
  min-height: 22.6667rem;
  padding: var(--sp-3);
  font-family: var(--font-mono);
  font-size:var(--text-base);
  line-height: 1.55;
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  background: var(--bg);
  color: var(--text);
  resize: vertical;
}
.env-bulk-actions {
  display: flex; gap: var(--sp-2); justify-content: flex-end; margin-top: var(--sp-3);
}
.btn-sm.primary {
  background: var(--accent);
  color: #fff;
  border-color: var(--accent);
  border-style: solid;
}
.btn-sm.primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); }

/* ============================================================
 *  Variable autocomplete dropdown
 * ============================================================ */
.var-ac {
  position: absolute;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  box-shadow: var(--shadow-pop);
  max-height: 20rem;
  overflow-y: auto;
  z-index: 1200;
  min-width: 24rem;
  font-size:var(--text-base);
  padding: 0.2667rem 0;
}
.var-ac-item {
  display: grid;
  grid-template-columns: 1fr auto auto;
  gap: var(--sp-2);
  padding: 0.4667rem 0.9333rem;
  cursor: pointer;
  align-items: center;
  transition: background var(--dur-fast) var(--ease);
}
.var-ac-item.selected,
.var-ac-item:hover { background: var(--bg-alt); }
.var-ac-item.selected { box-shadow: inset 3px 0 0 var(--accent); }
.var-ac-key {
  font-family: var(--font-mono);
  font-size:var(--text-sm);
  font-weight: 600;
  color: var(--accent);
}
.var-ac-type {
  font-size:var(--text-3xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  padding: 2px 0.4667rem;
  border-radius: var(--r-pill);
}
.var-ac-type.default { background: var(--bg-code); color: var(--text-muted); }
.var-ac-type.secret  { background: var(--tint-amber); color: var(--tone-amber); }
.var-ac-type.custom  { background: var(--tint-indigo); color: var(--tone-indigo); }
.var-ac-val {
  font-family: var(--font-mono);
  font-size:var(--text-xs);
  color: var(--text-muted);
  max-width: 13.3333rem;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ============================================================
 *  Try-it panel
 * ============================================================ */
/* ============================================================
 *  Endpoint sayfasi: ustte baslik + aciklama, altinda "Dene" formu.
 *  Yanit paneli SUREKLI ACIK ve sag kenara sabitlenmis ayri bir katman.
 *
 *  "Dene" formu tek kolon olarak akista kalir; yanit gelse de gelmese de yeri ve
 *  genisligi degismez. Panel akisin disinda (position: fixed) oldugu icin sayfa
 *  kaydirilirken de ekranda kalir. Panelin icerigi ortmemesi icin yer,
 *  main.content'e verilen sag bosluk ile ayriliyor.
 * ============================================================ */
:root {
  /* Orta alanin (form) asla altina inmeyecegi genislik. */
  --form-min: 460px;
  /* Panelin EFEKTIF genisligi — hem panel hem de icerik boslugu bunu kullanir.
     min() ile mevcut alana gore sinirlaniyor: panel, sol menu ve formun asgari
     genisligi cikarildiktan sonra kalan yerden fazlasini alamaz. Aksi halde
     (ornegin sol menu genisletilmisken panel sonuna kadar cekilirse) orta alan
     kendi asgari genisliginin altina inemeyip panelin ALTINA tasardi.
     100vw kaydirma cubugunu da kapsadigi icin --form-min'e bir miktar pay konuldu. */
  --resp-w: clamp(
    320px,
    min(var(--try-w), calc(100vw - var(--sidebar-w) - var(--form-min))),
    720px
  );
}
:root.has-try main.content {
  /* Panel kalici olarak yer kapladigi icin ust sinir buna gore genisletildi;
     aksi halde form gereksiz yere darlasirdi. */
  max-width: 140rem;
  padding-right: calc(var(--resp-w) + var(--sp-6));
  /* SART: main.content bir grid ogesi ve `1fr` track'in varsayilan min genisligi
     `auto`, yani icerigin min-content'i. Sag bosluk da bu min-content'e dahil
     oldugu icin, alan daraldiginda kutu KUCULMEK YERINE track'i tasiriyordu;
     sonucta form saga kayip sabit panelin altina giriyordu. min-width: 0 ile
     kutunun gercekten daralmasina izin veriyoruz. */
  min-width: 0;
}
.endpoint-page > h1 { margin-bottom: var(--sp-3); }

/* Tek kolon: form akista kalir, panel akisin disindadir. */
.endpoint-work { display: block; min-width: 0; }
/* min-width:0 zinciri: bu kutulardan biri bile daralmayi reddederse icerik
   panelin altina tasar. Grid/flex cocuklarinin varsayilan min-width'i `auto`dur. */
.endpoint-page,
.endpoint-request { min-width: 0; }
.endpoint-request .try-panel { margin-top: var(--sp-5); }

.endpoint-response {
  position: fixed;
  top: calc(var(--header-h) + var(--sp-4));
  right: var(--sp-4);
  width: var(--resp-w);
  max-height: calc(100vh - var(--header-h) - var(--sp-8));
  overflow-y: auto;
  z-index: 20;
}
/* Bilesen alanlari `hidden` ile gizleniyor; .try-resp-meta/.try-resp-tabs gibi
   flex kurallari [hidden]'i ezmesin diye acikca bastiriyoruz. */
.endpoint-response [hidden] { display: none !important; }

/* Ayrac da sabit: panelin sol kenarinda durur, surukleyince --try-w degisir. */
.endpoint-work > .try-resizer {
  position: fixed;
  top: var(--header-h);
  right: calc(var(--resp-w) + var(--sp-4));
  height: calc(100vh - var(--header-h));
  width: 0.4667rem;
  align-self: auto;
  z-index: 21;
}
.endpoint-response::-webkit-scrollbar { width: 0.5333rem; }

/* Sabit panel kendi kartinda durur; akistan ayri oldugu belli olsun diye golgesi
   biraz daha belirgin. */
.endpoint-response .try-response {
  margin-top: 0;
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--border);
  border-top: 1px solid var(--border);
  border-radius: var(--r-4);
  background: var(--bg);
  box-shadow: var(--shadow-md);
}
/* Panel surekli acik; slideIn yalnizca gercek yanit gelince anlamli. */
.endpoint-response .try-response.is-empty { animation: none; }

/* Istek atilmadan onceki bos durum */
.try-resp-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  padding: var(--sp-8) var(--sp-4);
  text-align: center;
  color: var(--text-muted);
  font-size:var(--text-base);
  line-height: 1.6;
}
.try-resp-empty i { font-size: 1.4667rem; opacity: 0.45; }

/* Login endpoint'lerinde token bildirimi — durum satirinin ustunde */
.try-resp-note {
  padding: 0.5333rem 0.6667rem;
  border-radius: var(--r-2);
  margin-bottom: var(--sp-2);
  font-size:var(--text-base);
  line-height: 1.5;
}
/* Ton uclusu (zemin/metin/cerceve) token'dan gelir; token koyu temada
   kendisi yeniden eslendigi icin ayri bir :root.dark blogu YOK. */
.try-resp-note.ok  { background: var(--tone-status-green-bg); color: var(--tone-status-green-fg); border: 1px solid var(--tone-status-green-border); }
.try-resp-note.err { background: var(--tone-status-rose-bg);  color: var(--tone-status-rose-fg);  border: 1px solid var(--tone-status-rose-border); }

/* Hata durumu (ag hatasi vb. — HTTP durum rozeti yok) */
.try-resp-error {
  color: var(--method-delete);
  font-size:var(--text-base);
  margin-bottom: var(--sp-2);
  word-break: break-word;
}

/* Parametre detaylari — govde sekmeleri icinde bir sekme */
.doc-pane { min-width: 0; max-width: 100%; overflow-x: auto; }
.doc-pane > h3:first-child { margin-top: var(--sp-2); }
.doc-pane table.params { margin-top: var(--sp-2); }

/* Yanit detaylari (ornek yanit + yanit kodlari) — "Dene" formunun altinda,
   sayfa akisinda. Sekme degil. */
.resp-doc {
  margin-top: var(--sp-6);
  min-width: 0;
  max-width: 100%;
  overflow-x: auto;
}
.resp-doc > h3:first-child { margin-top: 0; }

/* Form ile yanit paneli arasindaki sürüklenebilir ayraç */
.try-resizer {
  position: sticky;
  top: calc(var(--header-h) + var(--sp-6));
  align-self: stretch;
  height: calc(100vh - var(--header-h) - var(--sp-6));
  width: 0.4667rem;
  cursor: col-resize;
  border-radius: var(--r-pill);
  background: transparent;
  transition: background var(--dur-fast) var(--ease);
}
.try-resizer::before {
  content: '';
  position: absolute;
  inset: 0 2px;
  border-radius: var(--r-pill);
  background: var(--border);
  transition: background var(--dur-fast) var(--ease);
}
.try-resizer:hover::before,
.try-resizer.dragging::before { background: var(--accent); }

/* Sol navigasyon menüsü ayracı */
.sidebar-resizer {
  position: fixed;
  top: var(--header-h);
  left: calc(var(--sidebar-w) - 3px);
  width: 0.4667rem;
  height: calc(100vh - var(--header-h));
  cursor: col-resize;
  z-index: 30;
  background: transparent;
  transition: background var(--dur-fast) var(--ease);
}
.sidebar-resizer::before {
  content: '';
  position: absolute;
  top: 0; bottom: 0; left: 3px;
  width: 1px;
  background: transparent;
  transition: background var(--dur-fast) var(--ease);
}
.sidebar-resizer:hover::before,
.sidebar-resizer.dragging::before { background: var(--accent); width: 2px; }

/* Sürükleme sırasında: imleç sabit + metin seçimi kapalı */
body.resizing-x, body.resizing-x * {
  cursor: col-resize !important;
  user-select: none !important;
}

/* ---- Katlanabilir (collapse) durumlar ---- */

/* Sol menü kapalı */
:root.sidebar-collapsed .layout { grid-template-columns: 0 minmax(0, 1fr); }
:root.sidebar-collapsed aside.sidebar { display: none; }
:root.sidebar-collapsed .sidebar-resizer { display: none; }

/* Dene paneli başlığı */
.try-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-2);
  margin-bottom: var(--sp-3);
}
/* main.content h3/h4 margin'lerini ezerek başlığı hizala */
.try-head .try-title { margin: 0; }

/* Dar ekranda sabit panele yer yok: akisa geri doner, formun altina gecer. */
@media (max-width: 1180px) {
  :root.has-try main.content { max-width: 66.6667rem; padding-right: var(--sp-6); }
  .endpoint-work > .try-resizer { display: none; }
  .endpoint-response {
    position: static;
    width: auto;
    max-height: none;
    overflow: visible;
    z-index: auto;
  }
  .endpoint-response .try-response { margin-top: var(--sp-5); }
}

@media (max-width: 900px) {
  .sidebar-resizer { display: none; }
}

.try-panel {
  margin-top: var(--sp-8);
  border: 1px solid var(--border);
  border-radius: var(--r-4);
  padding: var(--sp-5) var(--sp-6);
  background: var(--bg);
  box-shadow: var(--shadow-sm);
  position: relative;
  overflow: hidden;
}
.try-panel .try-pane { min-width: 0; }
.try-auth-token {
  box-sizing: border-box;
  max-width: 100%;
}
.try-panel::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 1.6rem;
  right: 1.6rem;
  height: 2px;
  background: linear-gradient(90deg, transparent, var(--accent), transparent);
  border-radius: 1px;
  opacity: 0.6;
}
.try-panel.soap { margin-top: var(--sp-5); }
.try-title {
  margin: 0 0 var(--sp-1);
  font-size: 1.0667rem;
  font-weight: 600;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}
.try-title::before {
  content: '';
  display: inline-block;
  width: 0.2667rem; height: 1.0667rem;
  background: var(--accent);
  border-radius: 2px;
}
.try-help {
  margin: 0 0 var(--sp-4);
  font-size:var(--text-sm);
  color: var(--text-muted);
}
.try-help code {
  background: var(--bg-code);
  padding: 1px 0.4rem;
  border-radius: 3px;
  font-size:var(--text-sm);
  border: 1px solid var(--border-soft);
}

.try-url-row {
  display: flex;
  gap: var(--sp-1);
  margin-bottom: var(--sp-3);
  align-items: stretch;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  padding: 3px;
  background: var(--bg-alt);
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.try-url-row:focus-within {
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.try-method, .try-method-static {
  padding: 0.5333rem 0.6667rem;
  border: none;
  border-radius: var(--r-1);
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size:var(--text-sm);
  font-weight: 700;
  min-width: 6.1333rem;
  cursor: pointer;
  letter-spacing: 0.03em;
  text-align: center;
}
.try-method:focus { outline: none; }
.try-method-static {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  background: var(--method-soap-bg);
  color: #fff;
}
.try-url {
  flex: 1;
  /* Input'un kendi dogal genisligi (~20ch) flex tabanini asagi cekmesin:
     dar ekranda "Gonder" dugmesini kartin disina itiyordu. */
  min-width: 0;
  padding: 0.5333rem 0.8rem;
  border: none;
  border-radius: var(--r-1);
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size:var(--text-base);
  outline: none;
}
.try-panel .btn {
  background: var(--accent);
  color: #fff;
  border: none;
  padding: 0.5333rem 1.3333rem;
  border-radius: var(--r-1);
  cursor: pointer;
  font-size:var(--text-base);
  font-weight: 600;
  transition: background var(--dur-fast) var(--ease), transform var(--dur-fast) var(--ease);
  letter-spacing: 0.01em;
}
.try-panel .btn:hover:not(:disabled) { background: var(--accent-hover); }
.try-panel .btn:active:not(:disabled) { transform: translateY(1px); }
.try-panel .btn:disabled { opacity: 0.55; cursor: not-allowed; }

/* Tabs */
.try-tabs {
  display: flex;
  gap: 2px;
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--sp-3);
}
.try-tab {
  background: transparent;
  border: none;
  padding: 0.6rem 1.0667rem;
  cursor: pointer;
  color: var(--text-muted);
  font-size:var(--text-base);
  font-weight: 500;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  transition: color var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
}
.try-tab:hover { color: var(--text); }
.try-tab.active { color: var(--accent); border-bottom-color: var(--accent); }

.try-pane { margin-bottom: var(--sp-2); }
.try-body {
  width: 100%;
  min-height: 12rem;
  padding: var(--sp-3);
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size:var(--text-base);
  line-height: 1.55;
  resize: vertical;
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.try-body:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}

/* ============================================================
 *  Value Inputs (form generator)
 * ============================================================ */
.vi-form { display: flex; flex-direction: column; gap: var(--sp-1); padding: var(--sp-1) 0; }
.vi-row {
  display: grid;
  grid-template-columns: minmax(12rem, 14.6667rem) 1fr;
  gap: var(--sp-4);
  align-items: flex-start;
  padding: 0.6667rem var(--sp-3);
  border-radius: var(--r-2);
  transition: background var(--dur-fast) var(--ease);
}
.vi-row:hover { background: var(--bg-alt); }
.vi-label {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.4rem;
  padding-top: 0.4667rem;
}
.vi-name {
  font-family: var(--font-mono);
  font-size:var(--text-base);
  font-weight: 600;
  color: var(--text);
}
.vi-type {
  display: inline-block;
  font-size:var(--text-3xs);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  background: var(--bg-code);
  padding: 2px 0.4667rem;
  border-radius: var(--r-pill);
  font-family: var(--font-mono);
  font-weight: 600;
  border: 1px solid var(--border-soft);
}
.vi-control { display: flex; flex-direction: column; gap: 0.2667rem; min-width: 0; }
.vi-control .vi-input,
.vi-control input,
.vi-control select {
  padding: 0.5333rem 0.8rem;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size:var(--text-base);
  width: 100%;
  box-sizing: border-box;
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.vi-control .vi-input:hover,
.vi-control input:hover,
.vi-control select:hover { border-color: var(--border-strong); }
.vi-control .vi-input:focus,
.vi-control input:focus,
.vi-control select:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.vi-control input::placeholder { color: var(--text-faint); }

/* Boolean as toggle */
.vi-control input[type=checkbox] {
  appearance: none;
  width: 2.5333rem;
  height: 1.4667rem;
  background: var(--border);
  border: 1px solid var(--border-strong);
  border-radius: var(--r-pill);
  position: relative;
  cursor: pointer;
  margin: 0;
  padding: 0;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
  flex-shrink: 0;
}
.vi-control input[type=checkbox]::before {
  content: '';
  position: absolute;
  top: 1px; left: 1px;
  width: 1.2rem; height: 1.2rem;
  background: #fff;
  border-radius: 50%;
  box-shadow: 0 1px 2px rgba(0,0,0,0.2);
  transition: transform var(--dur-base) var(--ease);
}
.vi-control input[type=checkbox]:checked {
  background: var(--accent);
  border-color: var(--accent);
}
.vi-control input[type=checkbox]:checked::before { transform: translateX(1.0667rem); }
.vi-control input[type=checkbox]:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring-field);
}

.vi-desc { font-size:var(--text-xs); color: var(--text-muted); line-height: 1.45; }

/* XML attributeleri  — leaf/object/array altinda gosterilir */
.vi-attrs {
  display: flex;
  flex-direction: column;
  gap: 0.2667rem;
  margin: 2px 0;
  padding: 0.4rem 0.5333rem;
  border: 1px dashed var(--border);
  border-radius: var(--r-1);
  background: var(--bg-alt);
}
.vi-attr-row {
  display: grid;
  grid-template-columns: minmax(6rem, 11.3333rem) 1fr;
  gap: var(--sp-2);
  align-items: center;
}
.vi-attr-label {
  display: flex;
  align-items: center;
  gap: 3px;
  font-size:var(--text-sm);
  font-family: var(--font-mono);
  color: var(--text-muted);
  min-width: 0;
  overflow-wrap: anywhere;
}
.vi-attr-at { color: var(--accent); font-weight: 700; }
.vi-attr-input {
  width: 100%;
  padding: 0.4rem 0.6667rem;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size:var(--text-sm);
}
.vi-attr-input:hover { border-color: var(--border-strong); }
.vi-attr-input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.vi-attr-input::placeholder { color: var(--text-faint); }

/* Object / array group */
.vi-group {
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  background: var(--bg-alt);
  padding: var(--sp-3) var(--sp-3) var(--sp-3);
  margin-top: var(--sp-1);
}
.vi-group-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-2);
  padding-bottom: var(--sp-2);
  border-bottom: 1px dashed var(--border);
  margin-bottom: var(--sp-3);
  cursor: pointer;
  user-select: none;
}
.vi-group-head:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 2px;
  border-radius: var(--r-1);
}
.vi-group-caret {
  color: var(--text-muted);
  font-size:var(--text-xs);
  line-height: 1;
  transition: transform 0.15s ease;
}
/* Katlanmis grup: govde/liste gizlenir, baslik tek satira duser */
.vi-group.vi-collapsed > .vi-group-head {
  padding-bottom: 0;
  margin-bottom: 0;
  border-bottom: none;
}
.vi-group.vi-collapsed > .vi-group-head .vi-group-caret { transform: rotate(-90deg); }
.vi-group.vi-collapsed > .vi-group-body,
.vi-group.vi-collapsed > .vi-array-list { display: none; }
.vi-group-body {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding-left: var(--sp-3);
  border-left: 2px solid var(--border);
}
.vi-array-list {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  padding-left: var(--sp-3);
  border-left: 2px solid var(--border);
}
.vi-array-item {
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg);
}
.vi-array-item-head {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 0.4rem 0.8rem;
  border-bottom: 1px solid var(--border-soft);
  font-size:var(--text-sm);
  color: var(--text-muted);
  background: var(--bg-alt);
  border-radius: var(--r-2) var(--r-2) 0 0;
}
.vi-array-item-body {
  padding: var(--sp-2) var(--sp-3);
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.vi-array-idx { font-family: var(--font-mono); font-weight: 700; color: var(--accent); }

/* Base64 leaf: textarea + dosya sec butonu (hem vi-control hem kv-row icinde kullanilir) */
.vi-base64-wrap { display: flex; flex-direction: column; gap: 0.2667rem; min-width: 0; }
.vi-base64-input {
  width: 100%;
  box-sizing: border-box;
  padding: 0.5333rem 0.8rem;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-mono);
  font-size:var(--text-sm);
  resize: vertical;
  min-height: 4rem;
  word-break: break-all;
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.vi-base64-input:hover { border-color: var(--border-strong); }
.vi-base64-input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.vi-base64-input::placeholder { color: var(--text-faint); }
.vi-base64-btn-row { display: flex; align-items: center; }
.vi-base64-file-btn { margin-top: 0; }
.vi-base64-file-input { display: none; }

/* form-data 'file' leaf: dosya sec butonu + secilen dosyanin adi (base64'ten
   farkli olarak icerik metne cevrilmez, gercek dosya olarak tutulur) */
.vi-file-wrap { display: flex; align-items: center; gap: 0.5333rem; min-width: 0; }
.vi-file-input { display: none; }
.vi-file-name {
  font-size:var(--text-sm);
  color: var(--text-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}
.vi-del, button.vi-del {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  padding: 3px 0.6667rem;
  cursor: pointer;
  color: var(--text-muted);
  font-size:var(--text-md);
  line-height: 1;
  transition: all var(--dur-fast) var(--ease);
}
.vi-del:hover {
  color: var(--method-delete);
  border-color: var(--method-delete);
  background: var(--status-err-bg);
}

/* Body tabs (Form / JSON manual) */
.body-tabs {
  display: flex;
  gap: 2px;
  border-bottom: 1px solid var(--border-soft);
  margin-bottom: var(--sp-3);
}
.body-tab {
  background: transparent;
  border: 1px solid transparent;
  padding: 0.4667rem 0.9333rem;
  border-radius: var(--r-1) var(--r-1) 0 0;
  cursor: pointer;
  color: var(--text-muted);
  font-size:var(--text-sm);
  font-weight: 500;
  transition: all var(--dur-fast) var(--ease);
}
.body-tab:hover { color: var(--text); }
.body-tab.active {
  color: var(--accent);
  border-color: var(--border-soft);
  border-bottom-color: var(--bg);
  background: var(--bg);
  margin-bottom: -1px;
  font-weight: 600;
}
.body-pane { padding-top: 2px; }
.body-json-msg {
  padding: 0.2667rem 0;
  font-size:var(--text-sm);
  min-height: 1.0667rem;
}

/* Hazir senaryo secici — form govdesinin ustunde */
.scenario-bar {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
  padding: var(--sp-2) var(--sp-3);
  margin-bottom: var(--sp-3);
  background: var(--accent-soft);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-2);
}
.scenario-label {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size:var(--text-sm);
  font-weight: 600;
  color: var(--text-muted);
  white-space: nowrap;
}
.scenario-label i { color: var(--accent); font-size:var(--text-sm); }
/* Senaryoda olup semada karsiligi olmayan alanlar icin bilgi notu */
.scenario-msg {
  margin: calc(-1 * var(--sp-2)) 0 var(--sp-3);
  padding: 0.4667rem 0.6667rem;
  border-radius: var(--r-2);
  background: var(--status-warn-bg);
  color: var(--text-muted);
  font-size:var(--text-sm);
  line-height: 1.5;
  overflow-wrap: anywhere;
}
.scenario-msg i { margin-right: 0.2667rem; }
.scenario-msg code {
  font-size:var(--text-xs);
  padding: 1px 0.2667rem;
  border-radius: 3px;
  background: var(--bg-code);
  color: var(--text);
}
.scenario-select-wrap {
  position: relative;
  flex: 1;
  /* Senaryo secici artik 2 satira sarabildigi icin daha genis bir taban aliyor. */
  min-width: 17.3333rem;
}
.scenario-select-wrap::after {
  content: "";
  position: absolute;
  right: 0.8rem;
  top: 50%;
  width: 0.5333rem;
  height: 0.5333rem;
  border-right: 2px solid var(--text-muted);
  border-bottom: 2px solid var(--text-muted);
  transform: translateY(-65%) rotate(45deg);
  pointer-events: none;
}
.try-scenario {
  appearance: none;
  -webkit-appearance: none;
  width: 100%;
  padding: 0.5333rem 2.1333rem 0.5333rem 0.8rem;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg-elev);
  color: var(--text);
  font-family: inherit;
  font-size:var(--text-base);
  cursor: pointer;
  box-sizing: border-box;
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.try-scenario:hover { border-color: var(--border-strong); }
.try-scenario:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.try-scenario option { color: var(--text); }

/* ---- Senaryo secici (ozel acilir menu) ----
   Native select kapali haldeyken metni 2 satira saramadigi icin (tarayici kisiti)
   gorsel katman olarak bu bilesen ciziliyor. Native select DOM'da kaliyor ama
   gizleniyor: deger ve `change` olayi uzerinden mevcut mantik aynen calisiyor.
   JS kapaliysa .scenario-combo hic olusmaz; o zaman native select gorunur kalir. */
.scenario-select-wrap:has(.scenario-combo) > .try-scenario { display: none; }
.scenario-select-wrap:has(.scenario-combo)::after { display: none; }

.scenario-combo { position: relative; width: 100%; }

.scenario-combo-head {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  width: 100%;
  /* 2 satirlik yukseklik: tek satirlik adlarda da kutu ayni kalinlikta durur. */
  min-height: 3.8667rem;
  padding: 0.5333rem 2.1333rem 0.5333rem 0.8rem;
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  background: var(--bg-elev);
  color: var(--text);
  font-family: inherit;
  font-size:var(--text-base);
  text-align: left;
  cursor: pointer;
  box-sizing: border-box;
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.scenario-combo-head:hover { border-color: var(--border-strong); }
.scenario-combo-head:focus-visible {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.scenario-combo.is-placeholder .scenario-combo-text { color: var(--text-muted); }

/* Uzun senaryo adlari en fazla 2 satira sarar, sonrasi ucnokta olur. */
.scenario-combo-text {
  flex: 1;
  min-width: 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  white-space: normal;
  overflow-wrap: anywhere;
  line-height: 1.45;
}
.scenario-combo-arrow {
  position: absolute;
  right: 0.8rem;
  top: 50%;
  width: 0.5333rem;
  height: 0.5333rem;
  border-right: 2px solid var(--text-muted);
  border-bottom: 2px solid var(--text-muted);
  transform: translateY(-65%) rotate(45deg);
  pointer-events: none;
}

.scenario-combo-list {
  position: absolute;
  z-index: 30;
  top: calc(100% + 0.2667rem);
  left: 0;
  right: 0;
  max-height: 17.3333rem;
  overflow-y: auto;
  background: var(--bg-elev);
  border: 1px solid var(--border);
  border-radius: var(--r-2);
  box-shadow: var(--shadow-md);
  padding: 0.2667rem;
}
.scenario-combo-list[hidden] { display: none; }
.scenario-combo-option {
  padding: 0.5333rem 0.6667rem;
  border-radius: var(--r-1);
  font-size:var(--text-base);
  line-height: 1.45;
  cursor: pointer;
  white-space: normal;
  overflow-wrap: anywhere;
}
.scenario-combo-option:hover { background: var(--accent-soft); }
.scenario-combo-option.selected { background: var(--accent-soft); color: var(--accent); font-weight: 600; }

.param-options-inline {
  display: inline-flex; gap: 0.2667rem; flex-wrap: wrap; margin-top: 0.2667rem;
}
.param-options-inline code {
  font-size:var(--text-xs);
  background: var(--bg-code);
  padding: 1px 0.4rem;
  border-radius: 3px;
  border: 1px solid var(--border-soft);
}
.param-branch { color: var(--text-faint); font-family: var(--font-mono); }

/* KV editor (headers/query) */
.kv-row {
  display: grid;
  grid-template-columns: 3.7333rem minmax(0, 1.2fr) minmax(0, 1.8fr) 2.1333rem;
  gap: var(--sp-2);
  margin-bottom: 0.2667rem;
  align-items: center;
}
/* Grid hucrelerinin icerige gore tasmasini engelle (uzun token vb.) */
.kv-row > * { min-width: 0; }
.kv-row.kv-head {
  font-size:var(--text-2xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  margin-bottom: var(--sp-2);
  padding: 0 0.2667rem;
}
.kv-row input[type=text],
.kv-row input[type=number],
.kv-row input[type=date],
.kv-row input[type=datetime-local],
.kv-row select {
  width: 100%;
  box-sizing: border-box;
  padding: 0.4667rem 0.6667rem;
  font-size:var(--text-base);
  font-family: var(--font-mono);
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  background: var(--bg);
  color: var(--text);
  transition: border-color var(--dur-fast) var(--ease), box-shadow var(--dur-fast) var(--ease);
}
.kv-row input[type=text]:focus,
.kv-row input[type=number]:focus,
.kv-row input[type=date]:focus,
.kv-row input[type=datetime-local]:focus,
.kv-row select:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.kv-row input[readonly] { background: var(--bg-alt); color: var(--text-muted); cursor: default; }
.kv-enabled { display: flex; justify-content: center; }
.kv-enabled input[type=checkbox] {
  appearance: none;
  width: 1.0667rem;
  height: 1.0667rem;
  border: 1.5px solid var(--border-strong);
  border-radius: 3px;
  background: var(--bg);
  cursor: pointer;
  transition: background var(--dur-fast) var(--ease), border-color var(--dur-fast) var(--ease);
  position: relative;
}
.kv-enabled input[type=checkbox]:checked {
  background: var(--accent);
  border-color: var(--accent);
}
.kv-enabled input[type=checkbox]:checked::after {
  content: '';
  position: absolute;
  left: 0.2667rem;
  top: 1px;
  width: 0.2667rem;
  height: 0.5333rem;
  border: solid #fff;
  border-width: 0 2px 2px 0;
  transform: rotate(45deg);
}
.kv-del {
  background: transparent;
  border: 1px solid var(--border);
  border-radius: var(--r-1);
  width: 1.8667rem;
  height: 2rem;
  cursor: pointer;
  color: var(--text-muted);
  font-size: 1.0667rem;
  line-height: 1;
  transition: all var(--dur-fast) var(--ease);
}
.kv-del:hover {
  color: var(--method-delete);
  border-color: var(--method-delete);
  background: var(--status-err-bg);
}
.kv-empty {
  color: var(--text-muted);
  font-size:var(--text-base);
  padding: var(--sp-2) 0;
  font-style: italic;
}

.btn-sm {
  margin-top: var(--sp-2);
  background: transparent;
  color: var(--accent);
  border: 1px dashed var(--border-strong);
  border-radius: var(--r-1);
  padding: 0.4rem 0.9333rem;
  cursor: pointer;
  font-size:var(--text-sm);
  font-weight: 500;
  transition: all var(--dur-fast) var(--ease);
}
.btn-sm:hover { border-color: var(--accent); background: var(--accent-soft); border-style: solid; }
.btn-sm.copied { background: var(--accent) !important; color: #fff !important; border-color: var(--accent) !important; border-style: solid !important; }

.try-share-box {
  display: flex;
  align-items: center;
  gap: 0.5333rem;
  flex-wrap: wrap;
  margin-bottom: 0.8rem;
  padding: 0.6667rem 0.8rem;
  background: var(--color-surface);
  border: 1px solid var(--border);
  border-radius: 0.4rem;
}
.try-share-url {
  flex: 1;
  min-width: 13.3333rem;
  padding: 0.4rem 0.5333rem;
  font-size:var(--text-sm);
  border: 1px solid var(--border);
  border-radius: 0.2667rem;
  background: var(--bg, #fff);
  color: var(--text);
  font-family: var(--font-mono, monospace);
}
.try-share-label {
  font-size:var(--text-base);
  font-weight: 600;
  color: var(--text);
  white-space: nowrap;
}

/* ============================================================
 *  Response area
 * ============================================================ */
.try-response {
  margin-top: var(--sp-5);
  padding-top: var(--sp-4);
  border-top: 1px solid var(--border);
  animation: slideIn var(--dur-base) var(--ease);
}
@keyframes slideIn {
  from { opacity: 0; transform: translateY(0.2667rem); }
  to   { opacity: 1; transform: translateY(0); }
}
.try-response h4 {
  margin: 0 0 var(--sp-2);
  font-size:var(--text-base);
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--text-muted);
}
.try-resp-meta {
  display: flex;
  gap: var(--sp-3);
  align-items: center;
  margin-bottom: var(--sp-2);
  flex-wrap: wrap;
}
.try-resp-meta.error { color: var(--method-delete); }
.try-resp-meta .meta {
  font-size:var(--text-sm);
  color: var(--text-muted);
  font-family: var(--font-mono);
}
.try-resp-url {
  font-size:var(--text-sm);
  color: var(--text-muted);
  margin-bottom: var(--sp-3);
  word-break: break-all;
}
.try-resp-url code {
  background: var(--bg-code);
  padding: 2px 0.4rem;
  border-radius: 3px;
  border: 1px solid var(--border-soft);
}

.status-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  padding: 0.2667rem 0.8rem;
  border-radius: var(--r-pill);
  font-family: var(--font-mono);
  font-size:var(--text-sm);
  font-weight: 700;
  background: var(--bg-code);
  color: var(--text);
  letter-spacing: 0.02em;
}
.status-pill::before {
  content: '';
  width: 0.4rem; height: 0.4rem;
  background: currentColor;
  border-radius: 50%;
}
.status-pill.ok         { background: var(--status-ok-bg);   color: var(--status-ok-fg); }
.status-pill.redirect   { background: var(--status-info-bg); color: var(--status-info-fg); }
.status-pill.client-err { background: var(--status-err-bg);  color: var(--status-err-fg); }
.status-pill.server-err { background: var(--status-err-bg);  color: var(--status-err-fg); }

.try-resp-tabs {
  display: flex;
  gap: 2px;
  border-bottom: 1px solid var(--border);
  margin-bottom: var(--sp-3);
  margin-top: var(--sp-2);
}
.try-resp-pane pre {
  max-height: 32rem;
  overflow: auto;
}
.try-resp-pane pre .xml-punct   { color: var(--text-faint); }
.try-resp-pane pre .xml-tag     { color: var(--xml-tag); font-weight: 600; }
.try-resp-pane pre .xml-attr-name { color: var(--xml-attr); }
.try-resp-pane pre .xml-attr-value { color: var(--xml-value); }
.try-resp-pane pre .xml-comment { color: var(--xml-comment); font-style: italic; }
.try-resp-pane pre .xml-pi      { color: var(--text-muted); }
.hdr-list {
  font-size:var(--text-base);
  font-family: var(--font-mono);
  background: var(--bg-alt);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-2);
  overflow: hidden;
}
.hdr-row {
  display: grid;
  grid-template-columns: 16rem 1fr;
  gap: var(--sp-3);
  padding: 0.5333rem var(--sp-3);
  border-bottom: 1px solid var(--border-soft);
}
.hdr-row:last-child { border-bottom: none; }
.hdr-row:nth-child(even) { background: var(--bg); }
.hdr-k { color: var(--text-muted); font-weight: 600; word-break: break-all; }
.hdr-v { word-break: break-all; color: var(--text); }

/* ============================================================
 *  LANDING + CATEGORY VIEW
 * ============================================================ */
/* Landing tum genisligi kullanir. main.content'in 66rem'lik okuma olcusu
   metin sayfalari (rehber, SOAP servisi) icindir; kart izgarasinda satir
   uzunlugu diye bir sey yok ve o sinir sola yasli oldugu icin genis ekranda
   sagda bos bir serit birakiyordu. Ust sinir portalv3'un .layout-main
   siniri (1960px): 4K'da kartlar ekranin iki ucuna dagilmasin. PX bilerek —
   bu bir duzen karari, olcekle buyumemeli. */
:root.page-landing main.content { max-width: none; }
.landing { max-width: 1960px; margin: 0 auto; }
.landing-welcome {
  margin-bottom: var(--sp-8);
  line-height: 1.65;
}
.landing-welcome h1 { margin-top: 0; }
.landing-welcome img { max-width: 100%; height: auto; }
.landing-welcome-default {
  text-align: center;
  padding: var(--sp-6) 0 var(--sp-8);
}
.landing-welcome-default h1 {
  font-size: 2.1333rem;
  margin-bottom: var(--sp-2);
}
.landing-welcome-default p {
  color: var(--text-muted);
  font-size:var(--text-md);
}

.landing-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(18.6667rem, 1fr));
  gap: var(--sp-4);
  margin-bottom: var(--sp-10);
}
.landing-card {
  display: flex;
  flex-direction: column;
  padding: var(--sp-5);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-3);
  box-shadow: var(--shadow-sm);
  text-decoration: none;
  color: var(--text);
  transition: transform var(--dur-base) var(--ease),
              border-color var(--dur-base) var(--ease),
              box-shadow var(--dur-base) var(--ease);
  position: relative;
}
.landing-card:hover {
  transform: translateY(-3px);
  border-color: var(--accent);
  text-decoration: none;
  box-shadow: var(--shadow-md);
}
.landing-card:hover .landing-card-icon {
  background: var(--accent);
  color: #fff;
}
.landing-card-icon {
  width: 2.9333rem; height: 2.9333rem;
  display: flex; align-items: center; justify-content: center;
  border-radius: var(--r-3);
  background: var(--accent-soft);
  color: var(--accent);
  font-size: 1.2667rem;
  margin-bottom: var(--sp-3);
  transition: background var(--dur-base) var(--ease), color var(--dur-base) var(--ease);
}
/* ---------------- Kategori tonlari ----------------
 * Karo rengi BILGI tasir: her kategori kendi tonunu alir (data-tone, slug'dan
 * turetilir — bkz. public.js catTone). Landing sayfasi boylece tek renkli bir
 * kart dizisi olmaktan cikar, kategori sayfasinin baslik ikonu da AYNI tonu
 * kullanir: karttan tiklayip girince renk degismez.
 *
 * Hover'da karo DOLU tona doner (metin --color-white; koyu temada bu token
 * koyu yuzeye remap ettigi icin acik ton uzerinde koyu metin olur — dogru).
 * Tonsuz kartlar (data-tone tasimayanlar) marka yesili varsayilanini korur.
 */
.landing-card[data-tone='green'] .landing-card-icon,
.cat-header[data-tone='green'] .cat-header-icon { background: var(--tint-green); color: var(--tone-green); }
.landing-card[data-tone='green']:hover { border-color: var(--tone-green); }
.landing-card[data-tone='green']:hover .landing-card-icon { background: var(--tone-green); color: var(--color-white); }
.landing-card[data-tone='blue'] .landing-card-icon,
.cat-header[data-tone='blue'] .cat-header-icon { background: var(--tint-blue); color: var(--tone-blue); }
.landing-card[data-tone='blue']:hover { border-color: var(--tone-blue); }
.landing-card[data-tone='blue']:hover .landing-card-icon { background: var(--tone-blue); color: var(--color-white); }
.landing-card[data-tone='indigo'] .landing-card-icon,
.cat-header[data-tone='indigo'] .cat-header-icon { background: var(--tint-indigo); color: var(--tone-indigo); }
.landing-card[data-tone='indigo']:hover { border-color: var(--tone-indigo); }
.landing-card[data-tone='indigo']:hover .landing-card-icon { background: var(--tone-indigo); color: var(--color-white); }
.landing-card[data-tone='cyan'] .landing-card-icon,
.cat-header[data-tone='cyan'] .cat-header-icon { background: var(--tint-cyan); color: var(--tone-cyan); }
.landing-card[data-tone='cyan']:hover { border-color: var(--tone-cyan); }
.landing-card[data-tone='cyan']:hover .landing-card-icon { background: var(--tone-cyan); color: var(--color-white); }
.landing-card[data-tone='amber'] .landing-card-icon,
.cat-header[data-tone='amber'] .cat-header-icon { background: var(--tint-amber); color: var(--tone-amber); }
.landing-card[data-tone='amber']:hover { border-color: var(--tone-amber); }
.landing-card[data-tone='amber']:hover .landing-card-icon { background: var(--tone-amber); color: var(--color-white); }
.landing-card[data-tone='violet'] .landing-card-icon,
.cat-header[data-tone='violet'] .cat-header-icon { background: var(--tint-violet); color: var(--tone-violet); }
.landing-card[data-tone='violet']:hover { border-color: var(--tone-violet); }
.landing-card[data-tone='violet']:hover .landing-card-icon { background: var(--tone-violet); color: var(--color-white); }
.landing-card[data-tone='teal'] .landing-card-icon,
.cat-header[data-tone='teal'] .cat-header-icon { background: var(--tint-teal); color: var(--tone-teal); }
.landing-card[data-tone='teal']:hover { border-color: var(--tone-teal); }
.landing-card[data-tone='teal']:hover .landing-card-icon { background: var(--tone-teal); color: var(--color-white); }
.landing-card[data-tone='rose'] .landing-card-icon,
.cat-header[data-tone='rose'] .cat-header-icon { background: var(--tint-rose); color: var(--tone-rose); }
.landing-card[data-tone='rose']:hover { border-color: var(--tone-rose); }
.landing-card[data-tone='rose']:hover .landing-card-icon { background: var(--tone-rose); color: var(--color-white); }
.landing-card[data-tone='lime'] .landing-card-icon,
.cat-header[data-tone='lime'] .cat-header-icon { background: var(--tint-lime); color: var(--tone-lime); }
.landing-card[data-tone='lime']:hover { border-color: var(--tone-lime); }
.landing-card[data-tone='lime']:hover .landing-card-icon { background: var(--tone-lime); color: var(--color-white); }
.landing-card[data-tone='slate'] .landing-card-icon,
.cat-header[data-tone='slate'] .cat-header-icon { background: var(--tint-slate); color: var(--tone-slate); }
.landing-card[data-tone='slate']:hover { border-color: var(--tone-slate); }
.landing-card[data-tone='slate']:hover .landing-card-icon { background: var(--tone-slate); color: var(--color-white); }

.landing-card-title {
  margin: 0 0 var(--sp-1);
  font-size: 1.0667rem;
  font-weight: 600;
}
.landing-card-desc {
  margin: 0 0 var(--sp-3);
  font-size:var(--text-base);
  color: var(--text-muted);
  line-height: 1.55;
  flex: 1;
}
.landing-card-meta {
  font-size:var(--text-xs);
  color: var(--text-faint);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-weight: 600;
}

.cat-page { max-width: 61.3333rem; margin: 0 auto; }
.cat-back {
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size:var(--text-base);
  color: var(--text-muted);
  margin-bottom: var(--sp-4);
  padding: 0.2667rem 0.6667rem 0.2667rem 0.2667rem;
  border-radius: var(--r-1);
  transition: color var(--dur-fast) var(--ease), background var(--dur-fast) var(--ease);
}
.cat-back:hover { color: var(--accent); background: var(--accent-soft); text-decoration: none; }
.cat-header {
  display: flex;
  gap: var(--sp-4);
  align-items: center;
  margin-bottom: var(--sp-6);
}
.cat-header h1 { margin: 0; }
.cat-header-main { flex: 1; min-width: 0; }
.cat-header .cat-share { flex-shrink: 0; align-self: flex-start; }
.cat-header-icon {
  width: 3.7333rem; height: 3.7333rem;
  display: flex; align-items: center; justify-content: center;
  border-radius: var(--r-4);
  background: var(--accent-soft);
  color: var(--accent);
  font-size: 1.6rem;
  flex-shrink: 0;
}
.cat-header-desc {
  margin: 0.2667rem 0 0;
  color: var(--text-muted);
  font-size:var(--text-md);
}
.cat-items { display: flex; flex-direction: column; gap: var(--sp-1); }
.cat-item {
  display: grid;
  grid-template-columns: auto 1fr auto;
  gap: var(--sp-3);
  align-items: center;
  padding: 0.8rem var(--sp-4);
  background: var(--bg);
  border: 1px solid var(--border-soft);
  border-radius: var(--r-2);
  text-decoration: none;
  color: var(--text);
  transition: all var(--dur-fast) var(--ease);
}
.cat-item:hover {
  border-color: var(--accent);
  background: var(--accent-soft);
  text-decoration: none;
  transform: translateX(2px);
}
.cat-item-title { font-weight: 500; font-size:var(--text-md); }
.cat-item-path {
  color: var(--text-muted);
  font-size:var(--text-sm);
}
.cat-item-path code {
  background: transparent;
  padding: 0;
  border: none;
  font-family: var(--font-mono);
  font-size:var(--text-sm);
}
.cat-item-kind {
  display: inline-block;
  padding: 3px 0.6rem;
  border-radius: var(--r-1);
  background: var(--bg-alt);
  color: var(--text-muted);
  font-size:var(--text-2xs);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

/* ============================================================
 *  Internal icerik rozeti + giris arayuzu
 * ============================================================ */
.internal-badge {
  display: inline-flex;
  align-items: center;
  margin-left: 0.4rem;
  font-size:var(--text-3xs);
  color: var(--status-warn-fg);
  background: var(--status-warn-bg);
  border-radius: var(--r-pill);
  padding: 2px 0.3333rem;
  vertical-align: middle;
  flex-shrink: 0;
}
main.content h1 .internal-badge { font-size:var(--text-sm); padding: 0.2667rem 0.5333rem; vertical-align: 0.4rem; }

.bypass-badge {
  display: inline-flex;
  align-items: center;
  font-size:var(--text-2xs);
  font-weight: 700;
  letter-spacing: 0.06em;
  padding: 3px 0.5333rem;
  border-radius: var(--r-pill);
  color: var(--status-warn-fg);
  background: var(--status-warn-bg);
  border: 1px solid var(--status-warn-fg);
}

/* Giris modali .env-modal iskeletini kullanir; sadece dar ve otomatik yukseklikte. */
.login-modal {
  width: min(26.6667rem, 92vw);
  max-height: none;
}
.login-form {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  padding: var(--sp-4) var(--sp-5) var(--sp-5);
}
.login-form label {
  font-size:var(--text-sm);
  font-weight: 600;
  color: var(--text-muted);
  margin-top: var(--sp-2);
}
.login-form input {
  padding: 0.6rem 0.8rem;
  font-size:var(--text-md);
  font-family: inherit;
  color: var(--text);
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: var(--r-2);
}
.login-form input:focus-visible {
  outline: none;
  border-color: var(--accent);
  box-shadow: var(--focus-ring-field);
}
.login-submit {
  margin-top: var(--sp-4);
  padding: 0.6667rem;
  font-size:var(--text-md);
  font-weight: 600;
  color: #fff;
  background: var(--accent);
  border-color: var(--accent);
  cursor: pointer;
}
.login-submit:hover { background: var(--accent-hover); }
.login-error {
  min-height: 1.2rem;
  margin-top: var(--sp-2);
  font-size:var(--text-sm);
  color: var(--status-err-fg);
}

/* "Giriş Yap" / "Çıkış Yap" ayni genislikte kalsin, topbar zipla-masin. */
header.topbar button.auth-btn { min-width: 5.6rem; }

/* Onay modali — .env-modal iskeleti, dar ve otomatik yukseklikte. */
.confirm-modal {
  width: min(28rem, 92vw);
  max-height: none;
  z-index: 960; /* login modalinin uzerinde */
}
#confirm-overlay { z-index: 955; }
.confirm-body {
  padding: var(--sp-5);
  font-size:var(--text-md);
  line-height: 1.55;
  color: var(--text);
}
.confirm-actions {
  display: flex;
  justify-content: flex-end;
  gap: var(--sp-2);
  padding: var(--sp-3) var(--sp-5) var(--sp-5);
}
.confirm-actions .btn-sm { margin-top: 0; }
.confirm-ok {
  color: #fff;
  background: var(--method-delete-bg);
  border: 1px solid var(--method-delete-bg);
}
.confirm-ok:hover {
  background: var(--method-delete-bg);
  border-color: var(--method-delete);
  filter: brightness(0.92);
}

/* ============================================================
 *  Responsive
 *
 *  Esik merdiveni portalv3'tur (_responsive.scss, _listscreen.scss,
 *  AppTopbar.vue); her esik bir DUZEN karari verir, yogunluk ayari degil —
 *  yogunluk zaten akiskan kok olcekten (html font-size clamp) geliyor:
 *
 *    >1180px   uc kolon: ray + icerik + sabit yanit paneli
 *    <=1180px  yanit paneli akisa doner, formun altina gecer
 *    <=900px   ray cekmeceye doner; ust bar sikisir (arama esnek, ad kirpilir)
 *    <=720px   ust bar iki satira bolunur: kimlik + eylemler / arama + ortam + dil
 *    <=640px   telefon: sekme seritleri kayar, form satirlari yigilir,
 *              diyaloglar ekrana yayilir
 *
 *  Esikler PX kalir (gercek ekran genisligine gore karar verilir).
 * ============================================================ */
@media (max-width: 900px) {
  .layout {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas: "header" "main";
  }
  /* Ray gizlenmez, cekmeceye doner — kural yukaridaki "Mobil gezinme
     cekmecesi" blogunda. */
  main.content { padding: var(--sp-5) var(--sp-4) var(--sp-10); }
  .vi-row { grid-template-columns: 1fr; gap: 0.2667rem; padding: 0.5333rem var(--sp-2); }
  .vi-label { padding-top: 0; }

  /* Ust bar: portalv3 900px'te barin yatay payini --space-4'e, araligini
     --space-2'ye indirir. */
  header.topbar { padding: 0 var(--sp-4); gap: var(--sp-2); }
  .env-picker, .lang-picker { margin-right: 0; flex: 0 0 auto; }
  .env-picker select { max-width: 7.3333rem; }
}

@media (max-width: 720px) {
  /* Iki satirli bar. --header-h burada yeniden tanimlanir: cekmecenin tepesi,
     yapiskan ofsetler ve grid'in ilk satiri hepsi bu degerden okur, yani bar
     buyuyunce hicbiri ayrica ele alinmaz. */
  :root { --header-h: 6.5333rem; }
  header.topbar {
    flex-wrap: wrap;
    align-content: center;
    row-gap: 0;
    padding: var(--sp-2) var(--sp-4);
  }
  /* 1. satir: menu + marka ··· eylemler. 2. satir: arama + ortam + dil.
     Satir kirilimini .spacer yapar: tam genislikte, yuksekligi satir araligi
     kadar bir oge. Satirlar icerige gore degil kurala gore bolunur — genis
     bir telefonda arama birinci satira "sigdi" diye yer degistirmez. */
  header.topbar .sidebar-toggle { order: 1; }
  /* Taban 0 (asagidaki aramayla ayni sebep): sarmalayan flex kabinda satir
     kirma, ogeler kuculmeden ONCE dogal genislikleriyle hesaplanir; marka
     adi 360px'lik telefonda eylemleri ikinci satira itiyordu. */
  header.topbar .brand { order: 2; flex: 1 1 0%; }
  header.topbar .actions { order: 3; margin-left: auto; }
  header.topbar .spacer {
    display: block;
    order: 4;
    flex: 0 0 100%;
    height: var(--sp-2);
  }
  /* Taban 0: `auto` tabanda aramanin dogal genisligi (24rem) ortam/dil
     secicilerini ucuncu satira dusururdu. */
  header.topbar .search-wrap { order: 5; flex: 1 1 0%; }
  .env-picker { order: 6; }
  .lang-picker { order: 7; }

  /* Ikinci satirda yer dar: sayac bilgi tasir ama sart degil, degiskenler
     goz dugmesiyle zaten aciliyor. Dil adi kisalir. */
  .env-picker-count { display: none; }
  .env-picker { gap: 0.4rem; padding-inline: 0.5333rem; }
  .env-picker select { max-width: 6rem; }
  /* Dil secici ikon dugmeye iner: <select> kurenin USTUNDE saydam durur,
     yani dokunma/klavye yerel secim listesini acmaya devam eder ve erisilebilir
     ad (title) degismez. Ad metniyle ikinci satira sigmiyor, ucuncu satira
     tasip icerigin ustune biniyordu. */
  .lang-picker {
    position: relative;
    justify-content: center;
    width: 2.4rem;
    padding: 0.3333rem;
  }
  .lang-picker select {
    position: absolute;
    inset: 0;
    width: 100%;
    max-width: none;
    opacity: 0;
  }
  .lang-picker:focus-within {
    outline: 2px solid var(--dash-header-text);
    outline-offset: 2px;
    box-shadow: var(--focus-ring-on-dark);
  }

  /* Arama sonuclari kutusu arama kutusunun SAG kenarina baglidir; ikinci
     satirin solundaki dar bir kutuya bagli kaldiginda 90vw'lik liste ekranin
     solundan disari tasiyordu. Telefonda ekrana, barin hemen altina baglanir. */
  .search-results {
    position: fixed;
    top: var(--header-h);
    left: var(--sp-2);
    right: var(--sp-2);
    width: auto;
    max-width: none;
  }
}

@media (max-width: 640px) {
  /* Diyaloglar ekrana yayilir (portalv3 _dialog.scss 640px). */
  .env-modal { width: calc(100vw - var(--sp-4)); max-height: 92vh; }

  /* Dene paneli: kartin ic payi telefonda formdan yer caliyordu. */
  .try-panel { padding: var(--sp-4) var(--sp-3); }
  .try-method, .try-method-static { min-width: 4.5333rem; padding-inline: 0.4rem; }
  .try-panel .btn.try-send { padding-inline: var(--sp-3); }
  /* Sekme seritleri tek satirda kalir; sekme payi daralir. Kaydirmali serit
     yerine sikistirma: sekmeler alt cizgiyle -1px bindirildigi icin
     overflow-x kabi aktif sekmenin cizgisini kirpiyordu. */
  .try-tab { padding: 0.6rem 0.6rem; white-space: nowrap; }
  .body-tab { padding: 0.4667rem 0.6rem; white-space: nowrap; }
}
