/* KAYNAK: dashboard-tasarimi/tema.css — OTOMATİK KOPYA; ELLE DÜZENLEME. Değişiklik kaynakta yapılır, sonra `pnpm --filter @aiyapsin/web tema:sync`. */
/* =====================================================================
   otelyus — tema.css  (tasarım tokenları + ortak bileşen stilleri)
   Açık tema varsayılan; koyu tema: prefers-color-scheme veya [data-theme=dark]
   Mantıksal CSS özellikleri (margin-inline vb.) kullanılır → ileride RTL kolay.
   ===================================================================== */

:root {
  color-scheme: light;
  /* — Yüzeyler — */
  --bg: #F5F7FA;
  --surface: #FFFFFF;
  --surface-2: #F8FAFC;
  --surface-3: #EEF2F7;
  --overlay: rgba(15, 26, 46, .42);
  --border: #E2E8F0;
  --border-strong: #CBD5E1;
  /* — Metin — */
  --text: #0F1A2E;
  --text-2: #44516A;
  --text-3: #64708A;
  --text-inv: #FFFFFF;
  /* — Birincil (Ink 900 #0F1A2E; 28.10.2026 kullanıcı kararı — kırmızı YALNIZ logo/amblem + tehlike; gradyan yok) —
     Açık temada TEK renk: --primary = --primary-solid = --primary-text = #0F1A2E (beyaz üstü 17,4:1; zeminde metin 16,2–17,4:1; soft zeminde 14,7:1).
     Üç ad korunur (rol: --primary = simge/vurgu/odak/grafik; --primary-solid = --on-primary METNİ taşıyan dolgu; --primary-text = metin/bağlantı); açık temada eş değerdir, koyu temada ayrışır.
     Bağlantı rengi gövde metnine yakın olduğundan bağlantılar daima ALTI ÇİZİLİ (a, .cell-link). Hover/active açılır (#24324D / #1A2640); seçili/soft zemin nötr mürekkep #E8ECF3, soft-2 #DDE3EE. */
  --primary: #0F1A2E;
  --primary-hover: #24324D;
  --primary-press: #1A2640;
  --primary-soft: #E8ECF3;
  --primary-soft-2: #DDE3EE;
  --primary-text: #0F1A2E;
  --primary-solid: #0F1A2E;
  --primary-solid-h: #24324D;
  --on-primary: #FFFFFF;
  /* — İkincil (marka: Slate 600 #44516A) — ikincil düğme/metin/simge/vurgu — */
  --secondary: #44516A;
  --secondary-hover: #38445A;
  --secondary-press: #2E3849;
  --secondary-soft: #ECEFF4;
  --secondary-soft-2: #DDE2EB;
  --secondary-text: #44516A;
  --on-secondary: #FFFFFF;
  /* — Doluluk durumu (Dolu oda; marka renginden bağımsız durum paleti: indigo) — */
  --occupied: #4F46E5; --occupied-text: #4338CA; --occupied-soft: #EEF0FE;
  /* — İkincil veri rengi (turkuaz) — */
  --teal: #14B8A6;
  --teal-text: #0F766E;
  --teal-soft: #E6F7F5;
  /* — Semantik — */
  --success: #10B981;  --success-text: #047857; --success-soft: #E7F7F0;
  --warning: #F59E0B;  --warning-text: #B45309; --warning-soft: #FEF4E2;
  /* Tehlike = birincilden AYRIŞIR: daha parlak saf kırmızı (#DC2626 / metin #B91C1C / zemin #FEE2E2). Tehlike eylemi daima SİMGE + KENARLIKLI (btn-danger = outline) — doldurulmuş koyu kırmızı yalnız birincildir. */
  --danger:  #DC2626;  --danger-text:  #B91C1C; --danger-soft:  #FEE2E2; --danger-solid: #B91C1C; --danger-solid-h: #991B1B;
  --info:    #0EA5E9;  --info-text:    #0369A1; --info-soft:    #E6F4FC;
  --violet:  #8B5CF6;  --violet-text:  #6D28D9; --violet-soft:  #F1ECFE;
  --pink:    #DB2777;  --pink-text:    #BE185D; --pink-soft:    #FCE8F2;
  --neutral: #94A3B8;  --neutral-text: #475569; --neutral-soft: #EEF2F7;
  /* — Oda durumu renkleri: TEK KAYNAK (Nikopolis, 28.10.2026) — temiz = yeşil · dolu = kırmızı · bakım = sarı · kirli = mavi; bloke = nötr (çizgili), N.Show = pembe.
       Oda karosu, durum rozeti, çip/lejant renk kutusu, pano oda durumu hep BU belirteçleri kullanır (renk eşlemesi başka yerde yazılmaz). Açık/koyu temada anlamsal paletin AA çiftlerini taşırlar. — */
  --room-clean: var(--success);   --room-clean-text: var(--success-text);   --room-clean-soft: var(--success-soft);
  --room-occupied: var(--danger); --room-occupied-text: var(--danger-text); --room-occupied-soft: var(--danger-soft);
  --room-maintenance: var(--warning); --room-maintenance-text: var(--warning-text); --room-maintenance-soft: var(--warning-soft);
  --room-dirty: var(--info);      --room-dirty-text: var(--info-text);      --room-dirty-soft: var(--info-soft);
  --room-blocked: var(--neutral); --room-blocked-text: var(--neutral-text); --room-blocked-soft: var(--neutral-soft);
  --room-noshow: var(--pink);     --room-noshow-text: var(--pink-text);     --room-noshow-soft: var(--pink-soft);
  /* — Grafik — */
  --chart-1: var(--primary);
  --chart-2: var(--teal);
  --chart-3: #F59E0B;
  --chart-4: #8B5CF6;
  --chart-5: #94A3B8;
  --chart-grid: #E9EEF5;
  /* — Odak — */
  --focus: #0F1A2E;
  --focus-ring: 0 0 0 2px var(--surface), 0 0 0 4px var(--focus);

  /* — Tipografi — */
  --font: "Inter", "InterVariable", system-ui, -apple-system, "Segoe UI", Roboto, "Noto Sans", "Helvetica Neue", Arial, sans-serif;
  --font-mono: ui-monospace, "SF Mono", "Cascadia Mono", "Roboto Mono", Menlo, Consolas, monospace;
  --fs-xs: 12px;   --lh-xs: 16px;
  --fs-sm: 13px;   --lh-sm: 18px;
  --fs-md: 14px;   --lh-md: 20px;
  --fs-lg: 16px;   --lh-lg: 24px;
  --fs-xl: 18px;   --lh-xl: 26px;
  --fs-2xl: 20px;  --lh-2xl: 28px;
  --fs-3xl: 24px;  --lh-3xl: 32px;
  --fs-4xl: 30px;  --lh-4xl: 38px;
  --fw-regular: 400; --fw-medium: 500; --fw-semibold: 600; --fw-bold: 700; --link-fw: var(--fw-medium);

  /* — Boşluk (8px ızgara, 4px yarım adım) — */
  --sp-1: 4px; --sp-2: 8px; --sp-3: 12px; --sp-4: 16px; --sp-5: 20px;
  --sp-6: 24px; --sp-8: 32px; --sp-10: 40px; --sp-12: 48px; --sp-16: 64px;

  /* — Köşe — */
  --r-xs: 4px; --r-sm: 6px; --r-md: 10px; --r-lg: 14px; --r-xl: 18px; --r-full: 999px;

  /* — Gölge — */
  --sh-xs: 0 1px 2px rgba(15, 26, 46, .05);
  --sh-sm: 0 1px 3px rgba(15, 26, 46, .06), 0 1px 2px rgba(15, 26, 46, .04);
  --sh-md: 0 4px 12px -2px rgba(15, 26, 46, .08), 0 2px 4px -2px rgba(15, 26, 46, .05);
  --sh-lg: 0 16px 40px -8px rgba(15, 26, 46, .18), 0 4px 10px -4px rgba(15, 26, 46, .08);

  /* — Hareket — */
  --dur-1: 120ms; --dur-2: 180ms; --dur-3: 260ms;
  --ease: cubic-bezier(.2, .8, .2, 1);
  --ease-out: cubic-bezier(.16, 1, .3, 1);

  /* — Kontrol yüksekliği (yoğunluk) — */
  --ctl-h: 36px; --ctl-h-sm: 30px; --ctl-h-lg: 44px;
  --row-h: 48px;

  /* — Kabuk — */
  --sb-w: 264px; --sb-w-collapsed: 72px; --top-h: 60px;
}

/* ---------- Koyu tema (iki kez: sistem tercihi + elle anahtar) ---------- */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --bg: #0A0F1C; --surface: #121A2B; --surface-2: #172036; --surface-3: #1D2840;
    --overlay: rgba(2, 6, 16, .62);
    --border: #26324B; --border-strong: #34425F;
    --text: #E7ECF5; --text-2: #AEB8CC; --text-3: #8B96AD; --text-inv: #0A0F1C;
    --primary: #C9D3E6; --primary-hover: #DCE3EF; --primary-press: #AEB8CC;
    --primary-soft: #222D47; --primary-soft-2: #2B3753; --primary-text: #DCE3EF; --primary-solid: #C9D3E6; --primary-solid-h: #DCE3EF; --on-primary: #0A0F1C;
    --secondary: #7E8DAA; --secondary-hover: #95A3BE; --secondary-press: #6C7B98; --secondary-soft: #1F2A40; --secondary-soft-2: #29364F; --secondary-text: #B4C0D6; --on-secondary: #0A0F1C;
    --occupied: #6E6AF0; --occupied-text: #A5B0FF; --occupied-soft: #232A5C;
    --teal: #2DD4BF; --teal-text: #5EEAD4; --teal-soft: #0E2E2D;
    --success: #10B981; --success-text: #4ADE9A; --success-soft: #0F2E26;
    --warning: #F59E0B; --warning-text: #FBBF4D; --warning-soft: #33240C;
    --danger: #EF4444;  --danger-text: #FF7A7A;  --danger-soft: #3F1313; --danger-solid: #B91C1C; --danger-solid-h: #991B1B;
    --info: #38BDF8;    --info-text: #5CC3F5;    --info-soft: #0C2A3D;
    --violet: #A78BFA;  --violet-text: #C0A6FF;  --violet-soft: #2A1E4D;
    --pink: #EC4899;    --pink-text: #F58BC1;    --pink-soft: #3A1630;
    --neutral: #64748B; --neutral-text: #B4BFD2; --neutral-soft: #1F2A40;
    --chart-grid: #222D45; --chart-5: #64748B;
    --focus: #C9D3E6;
    --sh-xs: 0 1px 2px rgba(0, 0, 0, .3);
    --sh-sm: 0 1px 3px rgba(0, 0, 0, .35);
    --sh-md: 0 6px 16px -4px rgba(0, 0, 0, .45);
    --sh-lg: 0 20px 48px -8px rgba(0, 0, 0, .6);
  }
}
:root[data-theme="dark"] {
  color-scheme: dark;
  --bg: #0A0F1C; --surface: #121A2B; --surface-2: #172036; --surface-3: #1D2840;
  --overlay: rgba(2, 6, 16, .62);
  --border: #26324B; --border-strong: #34425F;
  --text: #E7ECF5; --text-2: #AEB8CC; --text-3: #8B96AD; --text-inv: #0A0F1C;
  --primary: #C9D3E6; --primary-hover: #DCE3EF; --primary-press: #AEB8CC;
  --primary-soft: #222D47; --primary-soft-2: #2B3753; --primary-text: #DCE3EF; --primary-solid: #C9D3E6; --primary-solid-h: #DCE3EF; --on-primary: #0A0F1C;
  --secondary: #7E8DAA; --secondary-hover: #95A3BE; --secondary-press: #6C7B98; --secondary-soft: #1F2A40; --secondary-soft-2: #29364F; --secondary-text: #B4C0D6; --on-secondary: #0A0F1C;
  --occupied: #6E6AF0; --occupied-text: #A5B0FF; --occupied-soft: #232A5C;
  --teal: #2DD4BF; --teal-text: #5EEAD4; --teal-soft: #0E2E2D;
  --success: #10B981; --success-text: #4ADE9A; --success-soft: #0F2E26;
  --warning: #F59E0B; --warning-text: #FBBF4D; --warning-soft: #33240C;
  --danger: #EF4444;  --danger-text: #FF7A7A;  --danger-soft: #3F1313; --danger-solid: #B91C1C; --danger-solid-h: #991B1B;
  --info: #38BDF8;    --info-text: #5CC3F5;    --info-soft: #0C2A3D;
  --violet: #A78BFA;  --violet-text: #C0A6FF;  --violet-soft: #2A1E4D;
  --pink: #EC4899;    --pink-text: #F58BC1;    --pink-soft: #3A1630;
  --neutral: #64748B; --neutral-text: #B4BFD2; --neutral-soft: #1F2A40;
  --chart-grid: #222D45; --chart-5: #64748B;
  --focus: #C9D3E6;
  --sh-xs: 0 1px 2px rgba(0, 0, 0, .3);
  --sh-sm: 0 1px 3px rgba(0, 0, 0, .35);
  --sh-md: 0 6px 16px -4px rgba(0, 0, 0, .45);
  --sh-lg: 0 20px 48px -8px rgba(0, 0, 0, .6);
}

/* ---------- Yoğunluk ---------- */
[data-density="compact"] { --ctl-h: 32px; --ctl-h-sm: 26px; --ctl-h-lg: 40px; --row-h: 38px; }

/* ---------- Temel ---------- */
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
body {
  margin: 0; background: var(--bg); color: var(--text);
  font-family: var(--font); font-size: var(--fs-md); line-height: var(--lh-md);
  -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale;
  font-feature-settings: "cv11", "ss01";
}
h1, h2, h3, h4, p { margin: 0; }
[hidden] { display: none !important; }
h1 { font-size: var(--fs-3xl); line-height: var(--lh-3xl); font-weight: var(--fw-bold); letter-spacing: -.015em; }
h2 { font-size: var(--fs-xl); line-height: var(--lh-xl); font-weight: var(--fw-semibold); letter-spacing: -.01em; }
h3 { font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); }
/* Bağlantı (tek kural): birincil Ink 900 gövde metnine yakın → daima altı çizili; hover'da çizgi koyulaşır/kalınlaşır. Düğme/menü/kart gibi bağlantı görünümlü olmayan <a>'lar kendi kuralında text-decoration: none taşır. */
a { color: var(--primary-text); text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, currentColor 45%, transparent); }
a:hover { text-decoration-color: currentColor; text-decoration-thickness: 2px; }
button, input, select, textarea { font: inherit; color: inherit; }
button { cursor: pointer; }
img, svg { display: block; }
.num, .tnum { font-variant-numeric: tabular-nums; }
.mono { font-family: var(--font-mono); font-size: .92em; }
.muted { color: var(--text-3); }
.text-2 { color: var(--text-2); }
.sr-only { position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.hstack { display: flex; align-items: center; gap: var(--sp-2); }
.vstack { display: flex; flex-direction: column; gap: var(--sp-2); }
.spacer { flex: 1; }
.wrap { flex-wrap: wrap; }

:focus { outline: none; }
:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; border-radius: var(--r-sm); }
::selection { background: var(--primary-soft-2); }

/* İnce kaydırma çubuğu */
* { scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: .01ms !important; animation-iteration-count: 1 !important; transition-duration: .01ms !important; scroll-behavior: auto !important; }
}

/* ---------- İkon ---------- */
.i { width: 18px; height: 18px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.i-sm { width: 16px; height: 16px; }
.i-xs { width: 14px; height: 14px; }
.i-lg { width: 20px; height: 20px; }
.i-xl { width: 24px; height: 24px; }

/* ---------- Klavye tuşu ---------- */
kbd, .kbd {
  display: inline-flex; align-items: center; justify-content: center; min-width: 20px; height: 20px; padding-inline: 5px;
  font: 500 11px/1 var(--font); color: var(--text-3); background: var(--surface-2);
  border: 1px solid var(--border); border-block-end-width: 2px; border-radius: var(--r-xs);
}

/* ---------- Buton ---------- */
.btn {
  --btn-bg: var(--surface); --btn-fg: var(--text); --btn-bd: var(--border-strong); --btn-bg-h: var(--surface-2);
  display: inline-flex; align-items: center; justify-content: center; gap: var(--sp-2);
  height: var(--ctl-h); padding-inline: 14px; border-radius: var(--r-md);
  background: var(--btn-bg); color: var(--btn-fg); border: 1px solid var(--btn-bd);
  font-size: var(--fs-md); font-weight: var(--fw-medium); white-space: nowrap; line-height: 1;
  box-shadow: var(--sh-xs); text-decoration: none !important;
  transition: background var(--dur-1) var(--ease), border-color var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease), transform var(--dur-1) var(--ease);
  position: relative; user-select: none; min-width: 0;
}
.btn:hover { background: var(--btn-bg-h); }
.btn:active { transform: translateY(1px); }
.btn:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.btn .i { margin-inline: -2px; }
.btn > span { overflow: hidden; text-overflow: ellipsis; }
.btn-primary { --btn-bg: var(--primary-solid); --btn-fg: var(--on-primary); --btn-bd: transparent; --btn-bg-h: var(--primary-solid-h); box-shadow: 0 1px 2px rgba(15, 26, 46, .28), inset 0 1px 0 rgba(255,255,255,.12); }
.btn-primary:active { --btn-bg: var(--primary-press); }
.btn-secondary { --btn-bg: var(--surface); --btn-fg: var(--secondary-text); --btn-bg-h: var(--secondary-soft); }
.btn-soft { --btn-bg: var(--primary-soft); --btn-fg: var(--primary-text); --btn-bd: color-mix(in srgb, var(--primary-text) 28%, transparent); --btn-bg-h: var(--primary-soft-2); box-shadow: none; }
/* ÇERÇEVESİZ (ghost) düğme yok (kullanıcı kararı 28.10.2026): her düğme çerçeveli; çerçevesiz yalnız sekme, menü öğesi, satır içi metin bağlantısı. */
/* Tehlike düğmeleri birincilden (koyu kırmızı dolgu) ayrışır: KENARLIKLI (outline) + daima simge (React Button danger* varyantına varsayılan simge ekler). Doldurulmuş koyu kırmızı = yalnız birincil. */
.btn-danger { --btn-bg: var(--surface); --btn-fg: var(--danger-text); --btn-bd: var(--danger); --btn-bg-h: var(--danger-soft); box-shadow: none; }
.btn-danger-soft { --btn-bg: var(--danger-soft); --btn-fg: var(--danger-text); --btn-bd: color-mix(in srgb, var(--danger) 40%, transparent); --btn-bg-h: color-mix(in srgb, var(--danger) 7%, var(--danger-soft)); box-shadow: none; }
/* Tehlike SİMGE düğmesi (Sil/Kaldır): çerçeveli ikincil düğmeyle AYNI boyut + kenarlık + zemin; yalnız simge rengi ve hover zemini tehlike tonu (kırmızı kenarlık/dolgu yok). React `IconButton` danger* varyantını buna çevirir. */
.btn-icon.btn-tone-danger { --btn-fg: var(--danger-text); --btn-bg-h: var(--danger-soft); }
.btn-sm { height: var(--ctl-h-sm); padding-inline: 10px; font-size: var(--fs-sm); border-radius: var(--r-sm); gap: 6px; }
.btn-lg { height: var(--ctl-h-lg); padding-inline: 18px; font-size: var(--fs-lg); border-radius: var(--r-md); }
.btn-icon { width: var(--ctl-h); padding: 0; flex: none; }
.btn-icon.btn-sm { width: var(--ctl-h-sm); }
.btn-block { width: 100%; }
.btn[disabled], .btn[aria-disabled="true"] { opacity: .5; pointer-events: none; box-shadow: none; }
.btn.is-loading { color: transparent !important; pointer-events: none; }
.btn.is-loading > * { visibility: hidden; }
.btn.is-loading::after {
  content: ""; position: absolute; inset: 0; margin: auto; width: 16px; height: 16px; border-radius: 50%;
  border: 2px solid var(--btn-fg); border-inline-end-color: transparent; animation: spin .7s linear infinite; visibility: visible;
}
.btn-badge { position: absolute; inset-block-start: 2px; inset-inline-end: 1px; min-width: 18px; height: 18px; padding-inline: 4px; border-radius: 99px; background: var(--danger-solid); color: #fff; font-size: 10px; font-weight: 700; line-height: 14px; text-align: center; border: 2px solid var(--surface); box-sizing: border-box; font-variant-numeric: tabular-nums; }
.btn-group { display: inline-flex; }
.btn-group .btn { border-radius: 0; margin-inline-start: -1px; }
.btn-group .btn:first-child { border-start-start-radius: var(--r-md); border-end-start-radius: var(--r-md); margin-inline-start: 0; }
.btn-group .btn:last-child { border-start-end-radius: var(--r-md); border-end-end-radius: var(--r-md); }
@keyframes spin { to { transform: rotate(360deg); } }

/* ---------- Segment kontrol ---------- */
.seg { display: inline-flex; padding: 3px; gap: 2px; background: var(--surface-3); border-radius: var(--r-md); }
.seg button { height: calc(var(--ctl-h-sm) - 2px); padding-inline: 10px; border: 0; border-radius: 7px; background: transparent; color: var(--text-2); font-size: var(--fs-sm); font-weight: var(--fw-medium); white-space: nowrap; }
.seg button:hover { color: var(--text); }
.seg button[aria-pressed="true"], .seg button[aria-selected="true"] { background: var(--surface); color: var(--text); box-shadow: var(--sh-sm); }

/* ---------- Form ---------- */
.field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.label { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--text); display: flex; align-items: center; gap: 4px; }
.label .req { color: var(--danger-text); font-weight: 700; }
.label .opt { color: var(--text-3); font-weight: 400; margin-inline-start: auto; font-size: var(--fs-xs); }
.help { font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); display: flex; gap: 6px; align-items: flex-start; }
.help .i { width: 14px; height: 14px; margin-block-start: 1px; }
.input, .select, .textarea {
  width: 100%; height: var(--ctl-h); padding-inline: 12px; background: var(--surface); color: var(--text);
  border: 1px solid var(--border-strong); border-radius: var(--r-md); font-size: var(--fs-md);
  transition: border-color var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease); min-width: 0;
}
.input::placeholder, .textarea::placeholder { color: var(--text-3); opacity: .85; }
.input:hover, .select:hover, .textarea:hover { border-color: var(--text-3); }
.input:focus, .select:focus, .textarea:focus, .input-group:focus-within { outline: none; border-color: var(--primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 22%, transparent); }
.input[disabled], .select[disabled], .textarea[disabled] { background: var(--surface-3); color: var(--text-3); cursor: not-allowed; }
.input[readonly] { background: var(--surface-2); }
.textarea { height: auto; min-height: 88px; padding-block: 10px; resize: vertical; line-height: var(--lh-md); }
.select {
  appearance: none; padding-inline-end: 34px; cursor: pointer;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%2364708A' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center;
}
.input-group { display: flex; align-items: stretch; width: 100%; height: var(--ctl-h); border: 1px solid var(--border-strong); border-radius: var(--r-md); background: var(--surface); transition: border-color var(--dur-1), box-shadow var(--dur-1); min-width: 0; }
.input-group:hover { border-color: var(--text-3); }
.input-group .input, .input-group .select { border: 0; height: 100%; box-shadow: none !important; background-color: transparent; }
.input-group .addon { display: flex; align-items: center; gap: 6px; padding-inline: 10px; color: var(--text-3); font-size: var(--fs-sm); white-space: nowrap; }
.input-group .addon.sep-s { border-inline-start: 1px solid var(--border); }
.input-group .addon.sep-e { border-inline-end: 1px solid var(--border); }
.input-group .select.addon-select { width: auto; flex: none; padding-inline: 10px 30px; border-inline-start: 1px solid var(--border); border-radius: 0; font-weight: 500; color: var(--text-2); background-position: right 8px center; }
.input-group .input { padding-inline: 10px; }
.input.num, .input-group .input.num { text-align: end; font-variant-numeric: tabular-nums; }
.field.is-error .input, .field.is-error .select, .field.is-error .textarea, .field.is-error .input-group { border-color: var(--danger); }
.field.is-error .help { color: var(--danger-text); }
.field.is-success .input, .field.is-success .input-group { border-color: var(--success); }
.field.is-success .help { color: var(--success-text); }

/* Onay kutusu / radyo */
.check { display: inline-flex; align-items: flex-start; gap: 10px; cursor: pointer; font-size: var(--fs-md); line-height: 20px; color: var(--text); }
.check input { appearance: none; flex: none; width: 18px; height: 18px; margin: 1px 0 0; border: 1.5px solid var(--border-strong); border-radius: 5px; background: var(--surface); display: grid; place-content: center; cursor: pointer; transition: background var(--dur-1), border-color var(--dur-1); }
.check input[type="radio"] { border-radius: 50%; }
.check input:hover { border-color: var(--primary); }
.check input:checked, .check input:indeterminate { background: var(--primary); border-color: var(--primary); }
.check input[type="checkbox"]:checked::after { content: ""; width: 10px; height: 6px; border: 2px solid var(--on-primary); border-block-start: 0; border-inline-end: 0; transform: rotate(-45deg) translate(1px, -1px); }
.check input[type="checkbox"]:indeterminate::after { content: ""; width: 9px; height: 2px; background: var(--on-primary); border-radius: 2px; }
.check input[type="radio"]:checked { background: var(--surface); border-width: 5px; }
.check input:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.check input:disabled { opacity: .5; cursor: not-allowed; }
.check small { display: block; color: var(--text-3); font-size: var(--fs-xs); line-height: var(--lh-xs); }

/* Anahtar (switch) */
.switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; }
.switch input { appearance: none; width: 36px; height: 20px; margin: 0; border-radius: 99px; background: var(--border-strong); position: relative; cursor: pointer; transition: background var(--dur-2) var(--ease); flex: none; }
.switch input::after { content: ""; position: absolute; inset-block-start: 2px; inset-inline-start: 2px; width: 16px; height: 16px; border-radius: 50%; background: #fff; box-shadow: 0 1px 2px rgba(0,0,0,.25); transition: transform var(--dur-2) var(--ease-out); }
.switch input:checked { background: var(--primary); }
.switch input:checked::after { background: var(--on-primary); }
.switch input:checked::after { transform: translateX(16px); }
.switch input:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.switch input:disabled { opacity: .5; }

/* Etiket girişi */
.tags { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-height: var(--ctl-h); padding: 4px 6px; border: 1px solid var(--border-strong); border-radius: var(--r-md); background: var(--surface); }
.tags:focus-within { border-color: var(--primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 22%, transparent); }
.tags input { flex: 1; min-width: 80px; border: 0; outline: 0; background: transparent; height: 26px; padding-inline: 4px; }
.chip { display: inline-flex; align-items: center; gap: 4px; height: 24px; padding-inline: 8px 4px; border-radius: var(--r-sm); background: var(--primary-soft); color: var(--primary-text); font-size: var(--fs-sm); font-weight: 500; white-space: nowrap; }
.chip button { display: grid; place-items: center; width: 18px; height: 18px; border: 0; border-radius: 4px; background: transparent; color: inherit; padding: 0; }
.chip button:hover { background: var(--primary-soft-2); }
.chip-filter { height: 30px; padding-inline: 12px; border-radius: var(--r-full); border: 1px solid var(--border); background: var(--surface); color: var(--text-2); font-size: var(--fs-sm); font-weight: 500; display: inline-flex; align-items: center; gap: 6px; text-decoration: none; }
.chip-filter[aria-pressed="true"] { background: var(--primary-soft); border-color: transparent; color: var(--primary-text); }

/* Dosya yükleme */
.drop { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 6px; padding: var(--sp-6); border: 1.5px dashed var(--border-strong); border-radius: var(--r-lg); background: var(--surface-2); color: var(--text-2); text-align: center; cursor: pointer; transition: border-color var(--dur-1), background var(--dur-1); }
.drop:hover, .drop.is-over { border-color: var(--primary); background: var(--primary-soft); }
.drop strong { color: var(--primary-text); }

/* Otomatik tamamlama listesi */
.ac { position: relative; }
.ac-list { position: absolute; inset-inline: 0; inset-block-start: calc(100% + 4px); z-index: 30; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); box-shadow: var(--sh-lg); padding: 4px; max-height: 260px; overflow: auto; }
.ac-list [role="option"] { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: var(--r-sm); cursor: pointer; }
.ac-list [role="option"][aria-selected="true"], .ac-list [role="option"]:hover { background: var(--surface-3); }
.ac-list mark { background: transparent; color: var(--primary-text); font-weight: 600; }

/* ---------- Rozet ---------- */
.badge {
  --b-bg: var(--neutral-soft); --b-fg: var(--neutral-text); --b-dot: var(--neutral);
  display: inline-flex; align-items: center; gap: 6px; height: 22px; padding-inline: 8px; border-radius: var(--r-full);
  background: var(--b-bg); color: var(--b-fg); font-size: var(--fs-xs); font-weight: var(--fw-semibold); line-height: 1; white-space: nowrap; letter-spacing: .01em;
  max-width: 100%;
}
.badge > span { overflow: hidden; text-overflow: ellipsis; }
.badge .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--b-dot); flex: none; }
.badge .i { width: 12px; height: 12px; stroke-width: 2.2; }
.badge-lg { height: 26px; padding-inline: 10px; font-size: var(--fs-sm); }
.badge-square { border-radius: var(--r-xs); }
.badge-outline { background: transparent; box-shadow: inset 0 0 0 1px var(--border-strong); }
.t-primary { --b-bg: var(--primary-soft); --b-fg: var(--primary-text); --b-dot: var(--primary); }
.t-success { --b-bg: var(--success-soft); --b-fg: var(--success-text); --b-dot: var(--success); }
.t-warning { --b-bg: var(--warning-soft); --b-fg: var(--warning-text); --b-dot: var(--warning); }
.t-danger  { --b-bg: var(--danger-soft);  --b-fg: var(--danger-text);  --b-dot: var(--danger); }
.t-info    { --b-bg: var(--info-soft);    --b-fg: var(--info-text);    --b-dot: var(--info); }
.t-violet  { --b-bg: var(--violet-soft);  --b-fg: var(--violet-text);  --b-dot: var(--violet); }
.t-pink    { --b-bg: var(--pink-soft);    --b-fg: var(--pink-text);    --b-dot: var(--pink); }
.t-teal    { --b-bg: var(--teal-soft);    --b-fg: var(--teal-text);    --b-dot: var(--teal); }
.t-neutral { --b-bg: var(--neutral-soft); --b-fg: var(--neutral-text); --b-dot: var(--neutral); }
/* Rezervasyon durumu eşlemesi */
.rs-pending   { --b-bg: var(--warning-soft); --b-fg: var(--warning-text); --b-dot: var(--warning); }
.rs-confirmed { --b-bg: var(--info-soft);    --b-fg: var(--info-text);    --b-dot: var(--info); }
.rs-checkedin { --b-bg: var(--success-soft); --b-fg: var(--success-text); --b-dot: var(--success); }
.rs-checkedout{ --b-bg: var(--neutral-soft); --b-fg: var(--neutral-text); --b-dot: var(--neutral); }
.rs-cancelled { --b-bg: var(--danger-soft);  --b-fg: var(--danger-text);  --b-dot: var(--danger); }
.rs-noshow    { --b-bg: var(--pink-soft);    --b-fg: var(--pink-text);    --b-dot: var(--pink); }
/* Oda durumu eşlemesi (renkler `--room-*` belirteçlerinden; C.Out dolu ile aynı kırmızı, ayrım numara/simge/metinle) */
.ro-clean    { --b-bg: var(--room-clean-soft);       --b-fg: var(--room-clean-text);       --b-dot: var(--room-clean); }
.ro-dirty    { --b-bg: var(--room-dirty-soft);       --b-fg: var(--room-dirty-text);       --b-dot: var(--room-dirty); }
.ro-occupied { --b-bg: var(--room-occupied-soft);    --b-fg: var(--room-occupied-text);    --b-dot: var(--room-occupied); }
.ro-dueout   { --b-bg: var(--room-occupied-soft);    --b-fg: var(--room-occupied-text);    --b-dot: var(--room-occupied); }
.ro-ooo      { --b-bg: var(--room-maintenance-soft); --b-fg: var(--room-maintenance-text); --b-dot: var(--room-maintenance); }
.ro-blocked  { --b-bg: var(--room-blocked-soft);     --b-fg: var(--room-blocked-text);     --b-dot: var(--room-blocked); }
.ro-noshow   { --b-bg: var(--room-noshow-soft);      --b-fg: var(--room-noshow-text);      --b-dot: var(--room-noshow); }
.ro-cin      { --b-bg: var(--neutral-soft);          --b-fg: var(--neutral-text);          --b-dot: var(--neutral); }
/* Ödeme durumu */
.ps-paid     { --b-bg: var(--success-soft); --b-fg: var(--success-text); --b-dot: var(--success); }
.ps-partial  { --b-bg: var(--warning-soft); --b-fg: var(--warning-text); --b-dot: var(--warning); }
.ps-unpaid   { --b-bg: var(--danger-soft);  --b-fg: var(--danger-text);  --b-dot: var(--danger); }
.ps-refund   { --b-bg: var(--info-soft);    --b-fg: var(--info-text);    --b-dot: var(--info); }
.ps-deposit  { --b-bg: var(--primary-soft); --b-fg: var(--primary-text); --b-dot: var(--primary); }
.lock-badge { display: inline-flex; align-items: center; gap: 3px; height: 18px; padding-inline: 6px; border-radius: var(--r-full); background: var(--warning-soft); color: var(--warning-text); font-size: 10.5px; font-weight: 700; letter-spacing: .02em; white-space: nowrap; }
.lock-badge .i { width: 11px; height: 11px; stroke-width: 2.4; }

/* ---------- Kart ---------- */
.card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); min-width: 0; display: flex; flex-direction: column; }
.card-h { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-4) var(--sp-5) 0; min-height: 52px; flex-wrap: wrap; }
.card-h.bordered { padding-block-end: var(--sp-4); border-block-end: 1px solid var(--border); }
.card-title { font-size: var(--fs-lg); font-weight: var(--fw-semibold); line-height: var(--lh-lg); display: flex; align-items: center; gap: var(--sp-2); min-width: 0; }
.card-title .i { color: var(--text-3); }
.card-sub { font-size: var(--fs-sm); color: var(--text-3); }
.card-actions { margin-inline-start: auto; display: flex; align-items: center; gap: var(--sp-2); }
.card-b { padding: var(--sp-4) var(--sp-5) var(--sp-5); flex: 1; min-width: 0; }
.card-f { padding: var(--sp-3) var(--sp-5); border-block-start: 1px solid var(--border); display: flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-sm); }
.card-link { display: inline-flex; align-items: center; gap: 4px; font-size: var(--fs-sm); font-weight: 500; }
.card.is-interactive { transition: box-shadow var(--dur-2) var(--ease), border-color var(--dur-2) var(--ease), transform var(--dur-2) var(--ease); }
.card.is-interactive:hover { box-shadow: var(--sh-md); border-color: var(--border-strong); }

/* ---------- KPI ---------- */
.kpi { position: relative; padding: var(--sp-4) var(--sp-5); display: flex; flex-direction: column; gap: 6px; text-decoration: none !important; color: inherit; overflow: hidden; }
.kpi-top { display: flex; align-items: center; gap: var(--sp-2); min-width: 0; }
.kpi-icon { width: 30px; height: 30px; border-radius: 9px; display: grid; place-items: center; flex: none; background: var(--primary-soft); color: var(--primary-text); }
.kpi-icon .i { width: 16px; height: 16px; }
.kpi-icon.c-teal { background: var(--teal-soft); color: var(--teal-text); }
.kpi-icon.c-success { background: var(--success-soft); color: var(--success-text); }
.kpi-icon.c-warning { background: var(--warning-soft); color: var(--warning-text); }
.kpi-icon.c-info { background: var(--info-soft); color: var(--info-text); }
.kpi-icon.c-violet { background: var(--violet-soft); color: var(--violet-text); }
.kpi-icon.c-danger { background: var(--danger-soft); color: var(--danger-text); }
.kpi-label { font-size: var(--fs-sm); font-weight: var(--fw-medium); color: var(--text-2); min-width: 0; flex: 1; }
.kpi-row { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-3); min-width: 0; }
.kpi-value { font-size: 26px; line-height: 32px; font-weight: var(--fw-bold); letter-spacing: -.02em; font-variant-numeric: tabular-nums; white-space: nowrap; }
.kpi-value small { font-size: var(--fs-md); font-weight: var(--fw-medium); color: var(--text-3); letter-spacing: 0; margin-inline-start: 2px; }
.kpi-spark { width: 96px; height: 34px; flex: none; }
.kpi-foot { display: flex; align-items: center; gap: 6px 10px; flex-wrap: wrap; font-size: var(--fs-xs); color: var(--text-3); }
.delta { display: inline-flex; align-items: center; gap: 2px; font-weight: 600; font-variant-numeric: tabular-nums; white-space: nowrap; }
.delta .i { width: 12px; height: 12px; stroke-width: 2.4; }
.delta.up { color: var(--success-text); }
.delta.down { color: var(--danger-text); }
.delta.flat { color: var(--text-3); }

/* ---------- Tablo ---------- */
.table-wrap { overflow: auto; border-radius: inherit; }
.table { width: 100%; border-collapse: separate; border-spacing: 0; font-size: var(--fs-md); }
.table th { position: sticky; inset-block-start: 0; z-index: 1; background: var(--surface-2); color: var(--text-3); font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: .04em; text-align: start; height: 38px; padding-inline: 14px; border-block-end: 1px solid var(--border); white-space: nowrap; }
.table td { height: var(--row-h); padding-inline: 14px; border-block-end: 1px solid var(--border); vertical-align: middle; }
.table tbody tr { transition: background var(--dur-1); }
.table tbody tr:hover { background: var(--surface-2); }
.table tbody tr[aria-selected="true"] { background: var(--primary-soft); }
.table tbody tr:last-child td { border-block-end: 0; }
.table .num, .table .r { text-align: end; font-variant-numeric: tabular-nums; }
.table .c { text-align: center; }
.table .w-check { width: 44px; padding-inline-end: 0; }
.table .w-act { width: 52px; text-align: end; }
/* Hücre satır kuralı (DataTable `Column.kind`; elle yazılan tablolar da aynı `td` sınıflarını kullanır): tarih, saat, sayı, para, yüzde, kod/numara, durum çipi, telefon, aralık, kısa etiket ASLA satır bölünmez (`nw`).
   Uzun olabilen metin (açıklama, not, ad-soyad, adres, e-posta, firma, mesaj) tek satır + `…` ile kesilir (`is-trunc`, en çok `--cell-max`); YALNIZ taşınca tam metin aşağıdaki İpucu (tooltip) ile gösterilir
   (üzerine gelince / klavye odağı / dokunma; bileşen `data-tip` + `tabindex` ekler, katman yoksa `title` yedeği). Tam metin okunmalıysa `is-wrap`: kontrollü genişlikte satır kaydırır, kesmez. Yatay taşma tablonun kendi kaydırma bölgesinde (`.table-wrap`) kalır. */
.nowrap { white-space: nowrap; }
td.nw, th.nw { white-space: nowrap; }
td.is-trunc { white-space: nowrap; max-width: var(--cell-max, 22rem); overflow: hidden; text-overflow: ellipsis; }
td.is-trunc > :is(div, p, [class*="stack"], [class*="-name"]),
td.is-trunc > :is(div, p, [class*="stack"], [class*="-name"]) > * { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
td.is-wrap { white-space: normal; overflow-wrap: anywhere; min-width: 12rem; max-width: var(--cell-max-wrap, 32rem); }
/* Satır hedefi (DataTable `rowHref` / `onRowClick` / `Column.link`): kimlik hücresi bağlantı (`.cell-link`: gerçek `<a>`, hedef modal/çekmeceyse düğme), satırın boş alanı da aynı hedefe gider (`tr.is-clickable`).
   Satır eylemleri `.row-actions`: az eylemde metinsiz simge düğmeleri yan yana ("…" menüsü yok), çok eylemde "…" menüsü. TÜM satır eylem düğmeleri aynı: çerçeveli ikincil (`.btn-secondary.btn-icon.btn-sm`, `--ctl-h-sm`); tehlike (Sil) yalnız simge rengi/hover tonu (`.btn-tone-danger`), boyutu ve kenarlığı aynı. Eylem sütunu satır sonunda SABİT kalır; dar/dokunmatik ekranda düğme ≥ 40 px. */
.cell-link { background: none; border: 0; padding: 0; color: var(--primary-text); font: inherit; font-weight: var(--link-fw); text-align: start; cursor: pointer; text-decoration: underline; text-decoration-thickness: 1px; text-underline-offset: 3px; text-decoration-color: color-mix(in srgb, currentColor 45%, transparent); border-radius: var(--r-xs); }
/* Bağlantı ağırlığı TEK token: `--link-fw` (500, kullanıcı kararı 28.10.2026); linkli başlık/ad (tablo hücresi, kart/başlık içi `a`, EntityLink, `.cell-link`) kalın (600/700) olmaz, altı çizili kalır. */
.table a:not(.btn), .cell-main a, .card-title a, :is(h1, h2, h3, h4) a { font-weight: var(--link-fw); }
.cell-link:hover { text-decoration-color: currentColor; text-decoration-thickness: 2px; }
.cell-link:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.table tbody tr.is-clickable { cursor: pointer; }
.table .w-act { position: sticky; inset-inline-end: 0; z-index: 2; background: var(--surface); }
.table th.w-act { z-index: 3; background: var(--surface-2); }
.table tbody tr:hover td.w-act { background: var(--surface-2); }
.table tbody tr[aria-selected="true"] td.w-act { background: var(--primary-soft); }
.table .w-act.is-inline { width: 1%; }
.row-actions { display: inline-flex; align-items: center; justify-content: flex-end; gap: 4px; white-space: nowrap; }
.row-actions .btn-icon { width: var(--ctl-h-sm); height: var(--ctl-h-sm); border-radius: var(--r-sm); }
@media (max-width: 767px), (pointer: coarse) { .row-actions .btn-icon { width: 40px; height: 40px; } }
/* Sabit sütunlu tablo (`Column.sticky = 'start'`): baştaki sütunlar yatay kaydırmada satır başında SABİT kalır, diğerleri kayar. Ofset `--sticky-x` (DataTable hesaplar), hücre zemini OPAK,
   mantıksal özellik (RTL güvenli); son sabit sütun ayırıcı çizgi taşır, kayma başlayınca (`.table-wrap[data-scrolled]`) hafif gölge belirir. Başlık köşe hücresi (üst + başta sabit) en üst katmanda. */
.table .is-sticky { position: sticky; inset-inline-start: var(--sticky-x, 0px); white-space: nowrap; background: var(--surface); }
.table td.is-sticky { z-index: 2; }
.table th.is-sticky { z-index: 3; background: var(--surface-2); }
.table tbody tr:hover td.is-sticky { background: var(--surface-2); }
.table tbody tr[aria-selected="true"] td.is-sticky { background: var(--primary-soft); }
.table .is-sticky-last { border-inline-end: 1px solid var(--border-strong); }
.table .is-sticky-last::after { content: ""; position: absolute; inset-block: 0; inset-inline-start: 100%; inline-size: 8px; pointer-events: none; opacity: 0; transition: opacity var(--dur-1); background: linear-gradient(to right, color-mix(in srgb, var(--border-strong) 75%, transparent), transparent); }
.table-wrap[data-scrolled] .is-sticky-last::after { opacity: 1; }
.table-wrap:dir(rtl) .is-sticky-last::after { background: linear-gradient(to left, color-mix(in srgb, var(--border-strong) 75%, transparent), transparent); }
.th-sort { display: inline-flex; align-items: center; gap: 4px; background: none; border: 0; padding: 0; color: inherit; font: inherit; text-transform: inherit; letter-spacing: inherit; cursor: pointer; }
.th-sort:hover { color: var(--text); }
.th-sort .i { width: 12px; height: 12px; opacity: .5; }
th[aria-sort] .th-sort { color: var(--text); }
th[aria-sort] .th-sort .i { opacity: 1; color: var(--primary-text); }
th[aria-sort="descending"] .th-sort .i { transform: rotate(180deg); }
.cell-main { font-weight: var(--fw-medium); color: var(--text); }
.cell-sub { font-size: var(--fs-xs); color: var(--text-3); }
.toolbar { display: flex; align-items: center; gap: var(--sp-2); flex-wrap: wrap; padding: var(--sp-3) var(--sp-4); border-block-end: 1px solid var(--border); }
.toolbar .search { width: 260px; max-width: 100%; }
.bulkbar { display: flex; align-items: center; gap: var(--sp-2); padding: 8px var(--sp-4); background: var(--primary-soft); color: var(--primary-text); font-size: var(--fs-sm); font-weight: 500; border-block-end: 1px solid var(--border); }

/* ---------- Sekme ---------- */
.tabs { display: flex; gap: var(--sp-1); border-block-end: 1px solid var(--border); overflow-x: auto; scrollbar-width: none; }
.tabs [role="tab"] { position: relative; height: 40px; padding-inline: 12px; text-transform: uppercase; border: 0; background: transparent; color: var(--text-2); font-weight: var(--fw-medium); white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; border-radius: var(--r-sm) var(--r-sm) 0 0; }
.tabs [role="tab"]:hover { color: var(--text); background: var(--surface-2); }
.tabs [role="tab"][aria-selected="true"] { color: var(--primary-text); }
.tabs [role="tab"][aria-selected="true"]::after { content: ""; position: absolute; inset-inline: 8px; inset-block-end: -1px; height: 2px; border-radius: 2px; background: var(--primary); }
.tabs .count { text-transform: none; min-width: 20px; height: 18px; padding-inline: 6px; border-radius: 99px; background: var(--surface-3); color: var(--text-2); font-size: 11px; font-weight: 600; display: inline-grid; place-items: center; }
.tabs [aria-selected="true"] .count { background: var(--primary-soft); color: var(--primary-text); }

/* ---------- Dikey sekme (VerticalTabs; kullanıcı kararı 28.10.2026) ----------
   Çok bölümlü uzun ayar/form sayfasında SOLDA dikey sekme listesi + sağda seçili sekmenin paneli. Etiket BÜYÜK HARF (yatay sekmeyle aynı kural, `<html lang>` dile duyarlı), başında simge; seçili = nötr mürekkep zemini + başta çizgi (menü öğesiyle aynı ton), simge+etiket birlikte.
   Durum işareti (`.vt-mark`): kaydedilmemiş = amber nokta, hata = tehlike simgesi (ekran okuyucu metni `.sr-only`). Dar ekranda (≤767 px) liste panelin ÜSTÜNDE yatay kayan şeride döner (seçili = yatay sekme gibi alt çizgi); gezinme ←/→, geniş ekranda ↑/↓ (aria-orientation). */
.vtabs { --vt-w: 15rem; display: grid; grid-template-columns: var(--vt-w) minmax(0, 1fr); gap: var(--sp-6); align-items: start; }
.vtabs-list { display: flex; flex-direction: column; gap: var(--sp-1); position: sticky; inset-block-start: var(--sp-4); padding: var(--sp-2); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); min-width: 0; }
.vtabs [role="tab"] { position: relative; display: flex; align-items: center; gap: var(--sp-3); width: 100%; min-height: var(--ctl-h); padding: var(--sp-2) var(--sp-3); border: 0; border-radius: var(--r-md); background: transparent; color: var(--text-2); font: inherit; font-weight: var(--fw-medium); text-transform: uppercase; text-align: start; cursor: pointer; transition: background var(--dur-1), color var(--dur-1); }
.vtabs [role="tab"] > .i { color: var(--text-3); transition: color var(--dur-1); }
.vtabs [role="tab"] > .vt-label { flex: 1; min-width: 0; overflow-wrap: anywhere; line-height: var(--lh-sm); }
.vtabs [role="tab"]:hover { background: var(--surface-3); color: var(--text); }
.vtabs [role="tab"]:hover > .i { color: var(--text-2); }
.vtabs [role="tab"]:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.vtabs [role="tab"][aria-selected="true"] { background: var(--primary-soft); color: var(--primary-text); font-weight: var(--fw-semibold); }
.vtabs [role="tab"][aria-selected="true"] > .i { color: var(--primary-text); }
.vtabs [role="tab"][aria-selected="true"]::before { content: ""; position: absolute; inset-inline-start: 0; inset-block: var(--sp-2); width: 3px; border-radius: var(--r-full); background: var(--primary); }
.vtabs .vt-mark { flex: none; display: inline-flex; align-items: center; }
.vtabs .vt-mark.is-dirty::before { content: ""; width: var(--sp-2); height: var(--sp-2); border-radius: 50%; background: var(--warning); }
.vtabs .vt-mark.is-error { color: var(--danger-text); }
.vtabs-panel { min-width: 0; display: flex; flex-direction: column; gap: var(--sp-4); }
.vtabs-panel[hidden] { display: none; }
@media (max-width: 767px) {
  .vtabs { grid-template-columns: minmax(0, 1fr); gap: var(--sp-4); }
  .vtabs-list { position: static; flex-direction: row; overflow-x: auto; scrollbar-width: none; padding: 0; gap: var(--sp-1); background: transparent; border: 0; border-block-end: 1px solid var(--border); border-radius: 0; box-shadow: none; }
  .vtabs [role="tab"] { width: auto; flex: none; min-height: 40px; white-space: nowrap; border-radius: var(--r-sm) var(--r-sm) 0 0; }
  .vtabs [role="tab"] > .vt-label { flex: none; overflow-wrap: normal; }
  .vtabs [role="tab"][aria-selected="true"] { background: transparent; }
  .vtabs [role="tab"][aria-selected="true"]::before { inset-inline: var(--sp-2); inset-block: auto -1px; width: auto; height: 2px; }
}
@media (pointer: coarse) { .vtabs [role="tab"] { min-height: 40px; } }

/* ---------- Adım göstergesi ---------- */
.steps { display: flex; gap: var(--sp-2); counter-reset: st; list-style: none; padding: 0; margin: 0; }
.steps li { flex: 1; display: flex; align-items: center; gap: 10px; min-width: 0; position: relative; }
.steps li:not(:last-child)::after { content: ""; flex: 1; height: 2px; border-radius: 2px; background: var(--border); min-width: 12px; }
.steps .s-dot { counter-increment: st; flex: none; width: 28px; height: 28px; border-radius: 50%; display: grid; place-items: center; font-size: var(--fs-sm); font-weight: 600; background: var(--surface); border: 1.5px solid var(--border-strong); color: var(--text-3); }
.steps .s-dot::before { content: counter(st); }
.steps .s-txt { display: flex; flex-direction: column; min-width: 0; }
.steps .s-txt b { font-size: var(--fs-sm); font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.steps .s-txt small { font-size: var(--fs-xs); color: var(--text-3); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.steps .is-done .s-dot { background: var(--success); border-color: var(--success); color: #fff; }
.steps .is-done .s-dot::before { content: "✓"; }
.steps .is-done::after { background: var(--success) !important; }
.steps .is-current .s-dot { border-color: var(--primary); color: var(--primary-text); box-shadow: 0 0 0 4px var(--primary-soft); }

/* ---------- Diyalog / çekmece ---------- */
dialog { border: 0; padding: 0; color: var(--text); background: transparent; max-width: none; max-height: none; }
dialog::backdrop { background: var(--overlay); backdrop-filter: blur(2px); }
.modal { width: min(560px, calc(100vw - 32px)); background: var(--surface); border-radius: var(--r-xl); box-shadow: var(--sh-lg); border: 1px solid var(--border); overflow: hidden; }
/* Modal yüksekliği ekranı aşmaz (KESİN): başlık (.modal-h) + altbilgi (.modal-f) SABİT, yalnız gövde (.modal-b) kayar. 100vh yedeği, ardından 100dvh (mobil adres çubuğu); 32 px = genişlikteki kenar payı. */
.modal[open] { display: flex; flex-direction: column; max-height: calc(100vh - 32px); max-height: calc(100dvh - 32px); overscroll-behavior: contain; animation: pop var(--dur-3) var(--ease-out); }
.modal > form { display: flex; flex-direction: column; flex: 1 1 auto; min-height: 0; }
.modal-h, .modal-f { flex: none; }
.modal-h { display: flex; align-items: flex-start; gap: var(--sp-3); padding: var(--sp-5) var(--sp-6) var(--sp-2); }
.modal-h h2 { font-size: var(--fs-xl); }
.modal-h p { color: var(--text-3); font-size: var(--fs-sm); margin-block-start: 2px; }
.modal-b { padding: var(--sp-3) var(--sp-6) var(--sp-5); max-height: 70vh; overflow: auto; flex: 1 1 auto; min-height: 0; overscroll-behavior: contain; }
.modal-f:empty { display: none; }
.modal-f { display: flex; justify-content: flex-end; gap: var(--sp-2); padding: var(--sp-4) var(--sp-6); background: var(--surface-2); border-block-start: 1px solid var(--border); flex-wrap: wrap; }
.modal-sm { width: min(420px, calc(100vw - 32px)); }
.modal-icon { width: 40px; height: 40px; border-radius: 12px; display: grid; place-items: center; flex: none; }
.modal-icon.danger { background: var(--danger-soft); color: var(--danger-text); }
.modal-icon.primary { background: var(--primary-soft); color: var(--primary-text); }
.drawer { position: fixed; inset-block: 0; inset-inline-end: 0; inset-inline-start: auto; margin: 0; height: 100dvh; width: min(480px, 100vw); background: var(--surface); border-inline-start: 1px solid var(--border); box-shadow: var(--sh-lg); display: none; flex-direction: column; overscroll-behavior: contain; }
.drawer[open] { display: flex; animation: slide-in var(--dur-3) var(--ease-out); }
/* Yalnız çekmecenin KENDİ gövdesi (doğrudan çocuk): içine yuvalanan modal (.drawer içindeki .modal) kendi gövde kuralını korur. */
.drawer > .modal-b { max-height: none; flex: 1; }
/* ---------- Küçük (sm) kontrol kapsamı: yan panel ve modal içinde varsayılan ----------
   `.ctl-sm` kapsayıcısı (React: Modal/Drawer/ConfirmDialog kökü <dialog>) altındaki tüm kontroller sm ölçüye iner.
   Yalnız yükseklik / yazı boyutu / iç boşluk / köşe yarıçapı değişir; renk, boşluk (gap) ve varyantlar aynen kalır.
   Yükseklik tek değişkenden: --ctl-h → --ctl-h-sm (30 px; sıkı yoğunlukta 26 px). Açık `.btn-lg` korunur. */
.ctl-sm { --ctl-h: var(--ctl-h-sm); }
.ctl-sm .input, .ctl-sm .select, .ctl-sm .textarea { padding-inline: 10px; font-size: var(--fs-sm); border-radius: var(--r-sm); }
.ctl-sm .select { padding-inline-end: 30px; background-position: right 8px center; }
.ctl-sm .textarea { min-height: 72px; padding-block: 6px; line-height: var(--lh-sm); }
.ctl-sm .input-group { border-radius: var(--r-sm); }
.ctl-sm .input-group .addon { padding-inline: 8px; }
.ctl-sm .input-group .select.addon-select { padding-inline: 8px 26px; background-position: right 6px center; }
.ctl-sm .input-group .btn-icon.btn-sm { width: calc(var(--ctl-h) - 6px); height: calc(var(--ctl-h) - 6px); }
.ctl-sm .btn:not(.btn-lg) { font-size: var(--fs-sm); gap: 6px; }
.ctl-sm .btn:not(.btn-lg):not(.btn-icon) { padding-inline: 10px; }
.ctl-sm :where(.btn:not(.btn-lg)) { border-radius: var(--r-sm); }
.ctl-sm .btn:not(.btn-lg) .i:not(.i-xs) { width: 16px; height: 16px; }
.ctl-sm .tags { padding: 2px 4px; border-radius: var(--r-sm); }
.ctl-sm .tags input, .ctl-sm .tags input.input { height: 24px; font-size: var(--fs-sm); }
.ctl-sm .ac-list [role="option"] { padding: 6px 8px; font-size: var(--fs-sm); }
/* ---------- Filtre paneli (.fp) ----------
   Liste/rapor ekranlarında dağınık satır içi filtre alanları yerine tek desen: üstte sade araç çubuğu (arama + "Filtreler" düğmesi + etkin sayı rozeti + hızlı seçimler + dışa aktar),
   altında etkin filtre çipleri + "Temizle", detay alanlar açılır/kapanır panelde (az alan: satır içi; çok alan veya dar ekran: yan panel/offcanvas). Tüm kontroller sm (.ctl-sm). */
.fp { display: flex; flex-direction: column; gap: var(--sp-2); inline-size: 100%; min-inline-size: 0; }
.fp.is-framed { padding: var(--sp-3) var(--sp-4); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); }
.fp-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); min-inline-size: 0; }
.fp-search { display: flex; align-items: center; gap: var(--sp-2); flex: 0 1 auto; min-inline-size: 0; }
.fp-search .input-group { inline-size: 260px; max-inline-size: 100%; }
/* Araç çubuğu düzeni: arama kutusu VARSA kalan genişliği doldurur (en az 260 px; yanındaki Filtreler/hızlı seçim/eylemler sabit genişlikte kalır, sığmazsa arama kendi satırına sarıp tam genişlik olur);
   arama kutusu YOKSA (`.fp-bar--end`) düğmeler satırın SAĞINA hizalanır. Etkin filtre çipleri altta soldan başlar. */
.fp-bar > .fp-search { flex: 1 1 260px; }
.fp-bar > .fp-search .input-group { flex: 1 1 auto; inline-size: auto; min-inline-size: 0; }
.fp-bar > .fp-search ~ .spacer { display: none; }
.fp-bar--end { justify-content: flex-end; }
.fp-bar--end > .spacer { display: none; }
.fp-count { display: inline-grid; place-items: center; min-inline-size: 18px; block-size: 18px; padding-inline: 5px; border-radius: var(--r-full); background: var(--primary); color: var(--on-primary); font-size: 11px; font-weight: 600; font-variant-numeric: tabular-nums; }
.fp-panel { padding: var(--sp-3) var(--sp-4); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); min-inline-size: 0; }
.fp-panel[hidden] { display: none; }
.fp-fields { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: var(--sp-3) var(--sp-4); align-items: start; }
.fp-fields > * { min-inline-size: 0; }
.fp-fields .span-2 { grid-column: span 2; }
.drawer .fp-fields { grid-template-columns: minmax(0, 1fr); gap: var(--sp-4); }
.drawer .fp-fields .span-2 { grid-column: auto; }
.fp-chips { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); min-inline-size: 0; }
.fp-chips .chip { white-space: normal; block-size: auto; min-block-size: 24px; max-inline-size: 100%; overflow-wrap: anywhere; }
/* Araç çubuğu önü (leading): arama kutusunun SOLUNDA kompakt seçimler (örn. Kat, Oda tipi); dar ekranda arama gibi tam satır, seçimler satırı paylaşır. Durum çip seti çubuğun ayrı, tam genişlikli satırıdır. */
.fp-lead { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); min-inline-size: 0; }
.fp-lead > * { inline-size: 148px; max-inline-size: 100%; }
.fp-bar > .legend-set { flex: 1 1 100%; }
@media (max-width: 640px) {
  .fp-lead { flex: 1 1 100%; }
  .fp-lead > * { flex: 1 1 0; inline-size: auto; }
  .fp-bar > .fp-search { flex: 1 1 100%; }
  .fp-fields .span-2 { grid-column: auto; }
}

@keyframes pop { from { opacity: 0; transform: translateY(8px) scale(.98); } }
@keyframes slide-in { from { transform: translateX(24px); opacity: 0; } }
@keyframes fade-in { from { opacity: 0; } }

/* ---------- Toast ---------- */
.toasts { position: fixed; inset-block-end: 20px; inset-inline-end: 20px; z-index: 100; display: flex; flex-direction: column; gap: 10px; width: min(380px, calc(100vw - 32px)); pointer-events: none; }
.toast { pointer-events: auto; display: flex; gap: 12px; align-items: flex-start; padding: 12px 14px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-lg); animation: pop var(--dur-3) var(--ease-out); }
.toast .t-ic { width: 28px; height: 28px; border-radius: 8px; display: grid; place-items: center; flex: none; }
.toast b { display: block; font-size: var(--fs-md); }
.toast p { font-size: var(--fs-sm); color: var(--text-2); }
.toast.is-leaving { opacity: 0; transform: translateY(6px); transition: all var(--dur-2) var(--ease); }

/* ---------- İpucu (tooltip) ---------- */
[data-tip] { position: relative; }
[data-tip]::after {
  content: attr(data-tip); position: absolute; inset-block-end: calc(100% + 8px); inset-inline-start: 50%; transform: translateX(-50%) translateY(2px);
  padding: 6px 9px; border-radius: var(--r-sm); background: #0F1A2E; color: #fff; font-size: var(--fs-xs); font-weight: 500; line-height: 1.35; white-space: nowrap;
  opacity: 0; pointer-events: none; transition: opacity var(--dur-1) var(--ease), transform var(--dur-1) var(--ease); z-index: 60; box-shadow: var(--sh-md);
}
:root[data-theme="dark"] [data-tip]::after { background: #E7ECF5; color: #0A0F1C; }
@media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) [data-tip]::after { background: #E7ECF5; color: #0A0F1C; } }
[data-tip]:hover::after, [data-tip]:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); transition-delay: 250ms; }
[data-tip-pos="bottom"]::after { inset-block-end: auto; inset-block-start: calc(100% + 8px); }
[data-tip-pos="start"]::after { inset-inline-start: 0; transform: none; }
[data-tip-pos="end"]::after { inset-inline-start: auto; inset-inline-end: 0; transform: none; }
/* Yan konum: ipucu hedefin satır-sonu yanında, dikey ortalı (daraltılmış kenar menü simgeleri). Uygulamada TooltipLayer aynı konumu `.tip-ghost[data-tip-v="side"]` ile verir. */
[data-tip-pos="inline-end"]::after { inset-block-end: auto; inset-block-start: 50%; inset-inline-start: calc(100% + 8px); transform: translateY(-50%); }
[data-tip-pos="inline-end"]:hover::after, [data-tip-pos="inline-end"]:focus-visible::after { transform: translateY(-50%); }

/* ---------- Açılır menü ---------- */
.dd { position: relative; }
.menu { position: absolute; z-index: 50; inset-block-start: calc(100% + 6px); inset-inline-start: 0; min-width: 220px; padding: 6px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-lg); display: none; animation: pop var(--dur-2) var(--ease-out); }
.menu.end { inset-inline-start: auto; inset-inline-end: 0; }
.dd.is-open > .menu { display: block; }
.menu-item { display: flex; align-items: center; gap: 10px; width: 100%; min-height: 34px; padding: 6px 10px; border: 0; border-radius: var(--r-sm); background: transparent; color: var(--text); font-size: var(--fs-md); text-align: start; text-decoration: none !important; }
.menu-item:hover, .menu-item:focus-visible { background: var(--surface-3); outline: none; }
.menu-item .i { color: var(--text-3); }
.menu-item .meta { margin-inline-start: auto; color: var(--text-3); font-size: var(--fs-xs); }
.menu-item[aria-checked="true"]::after { content: ""; margin-inline-start: auto; width: 14px; height: 8px; border: 2px solid var(--primary); border-block-start: 0; border-inline-end: 0; transform: rotate(-45deg) translateY(-2px); }
.menu-item.danger { color: var(--danger-text); }
.menu-item.danger .i { color: var(--danger-text); }
.menu-sep { height: 1px; background: var(--border); margin: 6px -6px; }
.menu-label { padding: 8px 10px 4px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: .05em; color: var(--text-3); }

/* ---------- Ekmek kırıntısı ---------- */
.crumbs { display: flex; align-items: center; flex-wrap: wrap; gap: 4px; font-size: var(--fs-sm); color: var(--text-3); list-style: none; padding: 0; margin: 0; }
.crumbs li { display: inline-flex; align-items: center; gap: 4px; }
.crumbs li + li::before { content: ""; width: 6px; height: 6px; border: 1.5px solid currentColor; border-block-start: 0; border-inline-start: 0; transform: rotate(-45deg); opacity: .6; margin-inline: 4px 6px; }
.crumbs a { color: var(--text-2); }
.crumbs [aria-current] { color: var(--text); font-weight: 500; }

/* ---------- Sayfalama ---------- */
.pager { display: flex; align-items: center; gap: 4px; flex-wrap: wrap; }
.pager button { min-width: 32px; height: 32px; padding-inline: 8px; border-radius: var(--r-sm); border: 1px solid transparent; background: transparent; color: var(--text-2); font-variant-numeric: tabular-nums; font-weight: 500; display: inline-grid; place-items: center; }
.pager button:hover { background: var(--surface-3); }
.pager button[aria-current="page"] { background: var(--primary-soft); color: var(--primary-text); }
.pager button:disabled { opacity: .4; pointer-events: none; }

/* ---------- İlerleme ---------- */
.progress { height: 8px; border-radius: 99px; background: var(--surface-3); overflow: hidden; }
.progress > span { display: block; height: 100%; border-radius: inherit; background: var(--primary); transition: width var(--dur-3) var(--ease-out); }
.progress.sm { height: 6px; }
.progress.success > span { background: var(--success); }
.progress.warning > span { background: var(--warning); }
.progress.danger > span { background: var(--danger); }
.progress.indeterminate > span { width: 35%; animation: indet 1.2s var(--ease) infinite; }
.progress-stack { display: flex; height: 10px; border-radius: 99px; overflow: hidden; gap: 2px; background: var(--surface-3); }
.progress-stack > span { display: block; height: 100%; }
@keyframes indet { from { transform: translateX(-100%); } to { transform: translateX(300%); } }

/* ---------- Avatar ---------- */
.avatar { --av: 32px; width: var(--av); height: var(--av); border-radius: 50%; display: inline-grid; place-items: center; flex: none; background: var(--primary-soft); color: var(--primary-text); font-size: calc(var(--av) * .38); font-weight: 600; letter-spacing: .01em; position: relative; }
.avatar.sm { --av: 24px; } .avatar.lg { --av: 40px; } .avatar.xl { --av: 56px; }
.avatar.c2 { background: var(--teal-soft); color: var(--teal-text); }
.avatar.c3 { background: var(--warning-soft); color: var(--warning-text); }
.avatar.c4 { background: var(--violet-soft); color: var(--violet-text); }
.avatar.c5 { background: var(--pink-soft); color: var(--pink-text); }
.avatar .presence { position: absolute; inset-block-end: 0; inset-inline-end: 0; width: 30%; height: 30%; border-radius: 50%; background: var(--success); border: 2px solid var(--surface); }
.avatar-stack { display: flex; }
.avatar-stack .avatar { border: 2px solid var(--surface); margin-inline-start: -8px; }
.avatar-stack .avatar:first-child { margin-inline-start: 0; }

/* ---------- Uyarı kutusu ---------- */
.alert { display: flex; gap: 12px; align-items: flex-start; padding: 12px 14px; border-radius: var(--r-md); background: var(--a-bg, var(--info-soft)); color: var(--text); border: 1px solid color-mix(in srgb, var(--a-fg, var(--info-text)) 18%, transparent); }
.alert > .i { color: var(--a-fg, var(--info-text)); margin-block-start: 1px; }
.alert b { display: block; font-weight: 600; }
.alert p { font-size: var(--fs-sm); color: var(--text-2); }
.alert .alert-actions { margin-inline-start: auto; display: flex; gap: 6px; flex: none; align-self: center; }
.alert.info { --a-bg: var(--info-soft); --a-fg: var(--info-text); }
.alert.success { --a-bg: var(--success-soft); --a-fg: var(--success-text); }
.alert.warning { --a-bg: var(--warning-soft); --a-fg: var(--warning-text); }
.alert.danger { --a-bg: var(--danger-soft); --a-fg: var(--danger-text); border-inline-start: 4px solid var(--danger); } /* hata kutusu: soft kırmızı + sol çubuk + sol simge (birincil bantla karışmaz) */

/* ---------- Boş durum ---------- */
.empty { display: flex; flex-direction: column; align-items: center; text-align: center; gap: 8px; padding: var(--sp-10) var(--sp-6); color: var(--text-2); }
.empty-art { width: 56px; height: 56px; border-radius: 16px; display: grid; place-items: center; background: var(--surface-3); color: var(--text-3); margin-block-end: 4px; }
.empty-art .i { width: 26px; height: 26px; }
.empty h3 { color: var(--text); }
.empty p { font-size: var(--fs-sm); max-width: 360px; }

/* ---------- İskelet ---------- */
.skel { display: block; border-radius: var(--r-sm); background: linear-gradient(90deg, var(--surface-3) 0%, var(--surface-2) 50%, var(--surface-3) 100%); background-size: 200% 100%; animation: shimmer 1.4s linear infinite; }
@keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }

/* ---------- Kota / yükseltme bandı ---------- */
.banner { display: flex; align-items: center; gap: var(--sp-3); padding: 12px 16px; border-radius: var(--r-lg); background: var(--primary-soft); border: 1px solid color-mix(in srgb, var(--primary) 18%, transparent); flex-wrap: wrap; }
.banner .b-ic { width: 36px; height: 36px; border-radius: 10px; display: grid; place-items: center; background: var(--surface); color: var(--primary-text); box-shadow: var(--sh-xs); flex: none; }
.banner b { display: block; }
.banner p { font-size: var(--fs-sm); color: var(--text-2); }
.banner .b-body { flex: 1; min-width: 200px; }

/* ---------- Oda hücresi (rack) ---------- */
.room {
  --rc-bg: var(--success-soft); --rc-fg: var(--success-text); --rc-bd: color-mix(in srgb, var(--success) 35%, transparent);
  position: relative; display: flex; flex-direction: column; justify-content: space-between; gap: 2px; min-width: 0;
  height: 46px; padding: 5px 7px; border-radius: 8px; background: var(--rc-bg); color: var(--rc-fg);
  border: 1px solid var(--rc-bd); font-size: 12px; font-weight: 600; line-height: 1.1; text-align: start; cursor: pointer;
  transition: transform var(--dur-1) var(--ease), box-shadow var(--dur-1) var(--ease);
}
.room:hover { transform: translateY(-1px); box-shadow: var(--sh-md); z-index: 1; }
.room:focus-visible { outline: 2px solid var(--focus); outline-offset: 1px; }
.room .rn { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--text); }
.room .rt { font-size: 10px; font-weight: 600; opacity: .9; letter-spacing: .02em; display: flex; align-items: center; gap: 3px; white-space: nowrap; overflow: hidden; }
.room .ri { position: absolute; inset-block-start: 5px; inset-inline-end: 5px; width: 12px; height: 12px; stroke-width: 2.2; }
.room.s-clean, .room .s-clean    { --rc-bg: var(--room-clean-soft); --rc-fg: var(--room-clean-text); --rc-bd: color-mix(in srgb, var(--room-clean) 40%, transparent); }
.room.s-dirty, .room .s-dirty    { --rc-bg: var(--room-dirty-soft); --rc-fg: var(--room-dirty-text); --rc-bd: color-mix(in srgb, var(--room-dirty) 45%, transparent); }
.room.s-occupied, .room .s-occupied, .room.s-dueout, .room .s-dueout { --rc-bg: var(--room-occupied-soft); --rc-fg: var(--room-occupied-text); --rc-bd: color-mix(in srgb, var(--room-occupied) 45%, transparent); }
.room.s-ooo, .room .s-ooo      { --rc-bg: var(--room-maintenance-soft); --rc-fg: var(--room-maintenance-text); --rc-bd: color-mix(in srgb, var(--room-maintenance) 55%, transparent); }
.room.s-blocked, .room .s-blocked  { --rc-bg: repeating-linear-gradient(-45deg, var(--room-blocked-soft) 0 6px, var(--surface-2) 6px 12px); --rc-fg: var(--room-blocked-text); --rc-bd: var(--border-strong); }
.room.s-blocked { border-style: dashed; }
.room.s-noshow, .room .s-noshow { --rc-bg: var(--room-noshow-soft); --rc-fg: var(--room-noshow-text); --rc-bd: color-mix(in srgb, var(--room-noshow) 50%, transparent); }
/* Gün hareketi işaretleri (renk DEĞİL; durum rengi korunur): C.In (bugün girişi olan oda) = durum rengi BLOKE gibi ÇİZGİLİ (`.is-cin`: temiz ise yeşil çizgili, kirli ise mavi çizgili; çizgiler hep açık tonla değişir → metin kontrastı durum zeminiyle aynı kalır);
   C.Out (bugün çıkışı olan oda, `.s-dueout` / `.is-cout`) = dolu kırmızısı + ODA NUMARASI eğik ve altı çizili (yalnız yazı karakteri; AA, renkten bağımsız, koyu temada da ayırt edilir). */
.room.is-cin:not(.s-blocked) { background: repeating-linear-gradient(-45deg, var(--rc-bg) 0 6px, var(--surface-2) 6px 12px); }
.room.s-dueout .rn, .room.is-cout .rn { font-style: italic; text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 2px; }
.room.is-dim { opacity: .25; transform: none; box-shadow: none; }
/* Kat satırı (rack): solda kat etiketi, sağda yan yana kompakt karolar. Pano karosu: sol üstte oda no (.rn), sağ üstte durum simgesi (.ri), altta oda tipi kodu (.rt) — durum rengi + simge (renk tek taşıyıcı değil).
   `.rack-body` kapsayıcı genişliğine göre 4/6/12 sütun (pano kartı); tam sayfa rafında `.floor-rooms.is-fluid` kompakt karoları genişliğe göre dizer. Oda rafı karosu için `.room.is-rack` (aşağıda). */
.rack { display: flex; flex-direction: column; gap: 8px; }
.floor { display: grid; grid-template-columns: 52px minmax(0, 1fr); gap: 10px; align-items: center; }
.floor-lbl { margin: 0; font-size: var(--fs-xs); font-weight: 600; color: var(--text-3); white-space: nowrap; }
.floor-rooms { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 6px; }
.floor-rooms.is-fluid { grid-template-columns: repeat(auto-fill, minmax(112px, 1fr)); }
/* Oda rafı karosu `.room.is-rack` (Oda Durumları; ŞEKİL pano kartıyla aynı, VERİ rafın kendi verisi): ÜST satır `.rh` = solda oda no + oda notu rozeti `.rnote` (simge + kısa başlık; dar karoda kesilir, tam metin üzerine gelince),
   SAĞ ÜSTTE odada bulunan kişi sayısı `.rp`; ALT satır `.rt` = durum simgesi + durum metni; en altta isteğe bağlı bayrak rozetleri `.rb` (geciken çıkış, geçici, grup — katalog Badge). */
.room.is-rack { min-height: 46px; height: auto; }
.room .rh { display: flex; align-items: center; gap: 4px; min-width: 0; }
.room .rh .rn { flex: none; }
.room .rp { margin-inline-start: auto; flex: none; display: inline-flex; align-items: center; gap: 2px; font-size: var(--fs-xs); font-weight: 600; line-height: 1; color: var(--text); font-variant-numeric: tabular-nums; }
.room .rnote { display: inline-flex; align-items: center; gap: 2px; min-width: 0; max-inline-size: 100%; padding: 1px 4px; border-radius: var(--r-full); background: var(--warning-soft); color: var(--warning-text); border: 1px solid color-mix(in srgb, var(--warning) 45%, transparent); font-size: var(--fs-xs); font-weight: 600; line-height: 1; cursor: pointer; }
.room .rnote > .i { flex: none; }
.room .rnote > span, .room.is-rack .rt > span { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.room .rb { display: flex; flex-wrap: wrap; gap: 4px; min-width: 0; }
.room .rb .badge { max-inline-size: 100%; min-width: 0; height: 18px; padding-inline: 6px; font-size: 10px; gap: 4px; }
.room .rb .badge .dot { width: 5px; height: 5px; }
/* Oda karosunda isteğe bağlı kısa satır `.rs` (oda no altında oda tipi adı; Odalar ekranı) ve arşivli/pasif oda `.is-archived` (soluk + kesikli kenar). */
.room .rs { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 10px; font-weight: 500; opacity: .85; }
.room.is-archived { opacity: .7; border-style: dashed; }
.rack-body { container-type: inline-size; }
@container (min-width: 330px) { .floor-rooms:not(.is-fluid) { grid-template-columns: repeat(6, minmax(0, 1fr)); } }
@container (min-width: 640px) { .floor-rooms:not(.is-fluid) { grid-template-columns: repeat(12, minmax(0, 1fr)); } }
@media (max-width: 640px) { .floor { grid-template-columns: 40px minmax(0, 1fr); gap: 6px; } .floor-rooms.is-fluid { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); } }
.legend { display: flex; flex-wrap: wrap; gap: 6px; }
.legend-item { display: inline-flex; align-items: center; gap: 6px; height: 28px; padding-inline: 8px 10px; border-radius: var(--r-full); border: 1px solid var(--border); background: var(--surface); color: var(--text-2); font-size: var(--fs-xs); font-weight: 500; white-space: nowrap; }
button.legend-item:hover { border-color: var(--border-strong); color: var(--text); }
button.legend-item[aria-pressed="true"] { border-color: var(--primary); color: var(--text); box-shadow: 0 0 0 1px var(--primary) inset; }
.legend-item .sw { width: 12px; height: 12px; border-radius: 4px; flex: none; border: 1px solid transparent; }
.legend-item b { font-variant-numeric: tabular-nums; color: var(--text); font-weight: 600; }
/* Durum çip seti: filtre + açıklama TEK sette (ayrı lejant satırı yok). Her çip kendi durum rengi + ad + sayı gösterir, tıklanınca süzer (`aria-pressed`); sayısı 0 olan çip soluktur (`.is-zero`, gizlenmez). Gruplar (`.legend-grp`) arası boşluk daha geniştir. */
.legend-set { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; min-inline-size: 0; }
.legend-grp { display: flex; flex-wrap: wrap; gap: 6px; min-inline-size: 0; }
button.legend-item.is-zero:not([aria-pressed="true"]) { color: var(--text-3); }
.legend-item.is-zero .sw { opacity: .45; }
.legend-item.is-zero b { color: var(--text-3); font-weight: 500; }
.sw.s-clean { background: var(--room-clean); } .sw.s-dirty { background: var(--room-dirty); } .sw.s-occupied { background: var(--room-occupied); }
.sw.s-ooo { background: var(--room-maintenance); } .sw.s-noshow { background: var(--room-noshow); }
/* C.Out çipi: dolu kırmızısı + altı çizgi (karodaki altı çizili oda numarasının işareti); C.In çipi: yeşil/mavi çizgili (temiz ve kirli odanın çizgili hâli) */
.sw.s-dueout { background: linear-gradient(var(--surface), var(--surface)) center calc(100% - 2px) / 7px 2px no-repeat, var(--room-occupied); }
.sw.s-cin { background: repeating-linear-gradient(-45deg, var(--room-clean) 0 3px, var(--room-dirty) 3px 6px); }
.sw.s-blocked { background: repeating-linear-gradient(-45deg, var(--room-blocked) 0 2px, transparent 2px 4px); border-color: var(--room-blocked); }

/* ---------- Zaman çizelgesi (aktivite) ---------- */
.timeline { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.timeline li { display: grid; grid-template-columns: 32px 1fr; gap: 12px; position: relative; padding-block-end: 16px; }
.timeline li:not(:last-child)::before { content: ""; position: absolute; inset-inline-start: 15.5px; inset-block: 32px 0; width: 1px; background: var(--border); }
.timeline .tl-ic { width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center; background: var(--surface-3); color: var(--text-2); }
.timeline .tl-ic .i { width: 15px; height: 15px; }
.timeline .tl-b { min-width: 0; padding-block-start: 5px; }
.timeline .tl-b p { font-size: var(--fs-sm); }
.timeline .tl-b time { font-size: var(--fs-xs); color: var(--text-3); }

/* ---------- Çeviri eksik işareti (bileşen sayfası) ---------- */
.show-missing [data-i18n-missing] { outline: 1.5px dashed var(--warning); outline-offset: 2px; border-radius: 3px; }
.i18n-key { display: inline-flex; align-items: center; gap: 4px; height: 20px; padding-inline: 6px; border-radius: 5px; background: var(--warning-soft); color: var(--warning-text); font: 600 11px/1 var(--font-mono); }

/* ---------- Kullanıcı menüsü (dil + tema burada; üst barda yok) ---------- */
.plan-name { display: inline-flex; align-items: center; gap: 6px; height: 26px; padding-inline: 10px; border-radius: var(--r-full); background: var(--primary-solid); color: var(--on-primary); font-size: var(--fs-xs); font-weight: 700; letter-spacing: .02em; }
.plan-name .i { width: 13px; height: 13px; }
.user-menu { min-width: 280px; }
.um-head { display: flex; align-items: center; gap: 10px; padding: 8px 10px 10px; }
.um-head b { display: block; font-size: var(--fs-md); }
.um-head small { display: block; font-size: var(--fs-xs); color: var(--text-3); }
.um-plan { display: block; margin: 0 4px 6px; padding: 8px 10px; border-radius: var(--r-md); background: var(--surface-2); border: 1px solid var(--border); color: inherit; text-decoration: none !important; }
.um-plan .row { display: flex; align-items: center; gap: 8px; font-size: var(--fs-xs); color: var(--text-2); margin-block-end: 6px; }
.um-plan .row b { margin-inline-start: auto; color: var(--text); }
.plan-name.sm { height: 18px; padding-inline: 7px; font-size: 10px; }
.lang-code { width: 26px; height: 20px; border-radius: 5px; background: var(--surface-3); display: inline-grid; place-items: center; font-size: 10.5px; font-weight: 700; color: var(--text-2); flex: none; }
.um-theme { padding: 2px 6px 6px; }
.um-theme .seg button { display: inline-flex; align-items: center; justify-content: center; gap: 4px; }
.um-theme .seg button[aria-checked="true"] { background: var(--surface); color: var(--text); box-shadow: var(--sh-sm); }
.user-btn-s { display: inline-flex; align-items: center; gap: 6px; height: 40px; padding: 4px 6px 4px 4px; border: 0; border-radius: 12px; background: transparent; }
.user-btn-s:hover { background: var(--surface-3); }

/* ---------- Marka logosu (otelyus; SVG) ---------- */
/* Açık/koyu: yatay logonun iki sürümü de DOM'dadır (`.is-light` / `.is-dark`); tema CSS ile seçilir (koyu zeminde yazısı beyaz sürüm). Amblem iki temada aynıdır. */
.brand-logo { display: block; flex: none; max-inline-size: 100%; block-size: auto; }
.brand-logo.is-dark { display: none; }
:root[data-theme="dark"] .brand-logo.is-light { display: none; }
:root[data-theme="dark"] .brand-logo.is-dark { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .brand-logo.is-light { display: none; }
  :root:not([data-theme="light"]) .brand-logo.is-dark { display: block; }
}
/* Çıktı başlığı: yalnız yazdırmada görünür; siyah-beyaz ÇİZGİLİ logo (marka rengi/filtre yok). */
.print-brand { display: none; }
@media print {
  .print-brand { display: block; margin-block-end: 8px; }
  .print-brand img { display: block; }
}

/* ---------- Gelen kutusu (iki panelli talep kutusu; kullanıcı kararı 29.10.2026) ----------
   SOLDA liste (`.inbox-list`: araç çubuğu + `.inbox-items` satırları), SAĞDA seçili kaydın ayrıntısı (`.inbox-detail`: başlık + kayan gövde + alt yazma alanı).
   Satır (`.inbox-item`, düğme): üst satır no · zaman, başlık (tek satır …), alt bilgi (oda · kategori), rozetler (durum, gecikme, okunmamış sayı). Seçili satır = `aria-current="true"`
   (nötr mürekkep zemini + başta 3 px çizgi; menü/dikey sekmeyle aynı ton); okunmamış = kalın başlık + sayaç rozeti (renk tek taşıyıcı değil).
   Dar kap (≤720 px, container query): TEK panel — `.inbox[data-view="list"]` liste, `[data-view="detail"]` ayrıntı + başlıkta geri düğmesi (`.inbox-back`). Yükseklik görünüm penceresine sığar; liste ve gövde kendi içinde kayar. */
.inbox { --inbox-h: clamp(420px, calc(100dvh - var(--top-h) - 160px), 880px); container: inbox / inline-size; min-inline-size: 0; }
.inbox-grid { display: grid; grid-template-columns: minmax(260px, 340px) minmax(0, 1fr); block-size: var(--inbox-h); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); overflow: hidden; }
.inbox-list { display: flex; flex-direction: column; min-inline-size: 0; min-block-size: 0; border-inline-end: 1px solid var(--border); }
.inbox-list-h { flex: none; display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-3); border-block-end: 1px solid var(--border); }
.inbox-items { list-style: none; margin: 0; padding: 0; flex: 1 1 auto; min-block-size: 0; overflow: auto; overscroll-behavior: contain; }
.inbox-items > li + li { border-block-start: 1px solid var(--border); }
.inbox-item { position: relative; display: flex; flex-direction: column; gap: var(--sp-1); inline-size: 100%; min-block-size: 40px; padding: var(--sp-3) var(--sp-4); border: 0; background: transparent; color: var(--text); font: inherit; text-align: start; text-decoration: none !important; cursor: pointer; transition: background var(--dur-1) var(--ease); }
.inbox-item:hover { background: var(--surface-2); }
.inbox-item:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--focus); border-radius: 0; }
.inbox-item[aria-current="true"] { background: var(--primary-soft); }
.inbox-item[aria-current="true"]::before { content: ""; position: absolute; inset-inline-start: 0; inset-block: var(--sp-2); inline-size: 3px; border-radius: var(--r-full); background: var(--primary); }
.ii-top { display: flex; align-items: center; gap: var(--sp-2); min-inline-size: 0; font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); }
.ii-no { font-weight: var(--fw-semibold); color: var(--text-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ii-top time { margin-inline-start: auto; white-space: nowrap; font-variant-numeric: tabular-nums; }
.ii-title { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-md); font-weight: var(--fw-medium); }
.inbox-item.is-unread .ii-title { font-weight: var(--fw-bold); }
.ii-sub { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); color: var(--text-2); }
.ii-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1) var(--sp-2); min-inline-size: 0; }
.inbox-detail { display: flex; flex-direction: column; min-inline-size: 0; min-block-size: 0; }
.inbox-detail-h { flex: none; display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; min-block-size: 60px; padding: var(--sp-3) var(--sp-5); border-block-end: 1px solid var(--border); }
.idh-title { flex: 1 1 200px; min-inline-size: 0; display: flex; flex-direction: column; gap: 2px; }
.idh-title > :first-child { margin: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); }
.idh-title small { font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.idh-actions { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); }
.inbox-back { display: none; }
.inbox-detail-b { flex: 1 1 auto; min-block-size: 0; overflow: auto; overscroll-behavior: contain; display: flex; flex-direction: column; gap: var(--sp-4); padding: var(--sp-4) var(--sp-5); }
.inbox-compose { flex: none; display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-3) var(--sp-5); border-block-start: 1px solid var(--border); background: var(--surface-2); }
.inbox-compose .textarea { min-block-size: 64px; }
.inbox-compose-f { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--sp-2); }
.inbox-none { flex: 1 1 auto; display: grid; place-items: center; min-block-size: 0; }
@container inbox (max-width: 720px) {
  .inbox-grid { grid-template-columns: minmax(0, 1fr); }
  .inbox-list { border-inline-end: 0; }
  .inbox:not([data-view="detail"]) .inbox-detail, .inbox[data-view="detail"] .inbox-list { display: none; }
  .inbox-back { display: inline-flex; }
  .inbox-detail-h, .inbox-detail-b, .inbox-compose { padding-inline: var(--sp-4); }
}
@media (pointer: coarse) { .inbox-item { min-block-size: 44px; } }

/* ---------- Mesaj balonu (misafir / personel / sistem / iç not; kullanıcı kararı 29.10.2026) ----------
   Akış `.msg-thread` (`ol`, eskiden yeniye). Misafir balonu SOLDA (`.msg.is-guest`, ikincil zemin + kenarlık), personel balonu SAĞDA (`.msg.is-staff`, nötr mürekkep zemini),
   iç not SAĞDA kesikli amber (`.msg.is-note`; kilit simgesi + "İç not" etiketi, misafire gösterilmez), sistem olayı ORTADA küçük hap (`.msg.is-system`). Balonun üstünde yazan
   (`.msg-head`), altında zaman + iletim durumu (`.msg-meta`): `.msg-status.is-delivered` "İletildi (kanal)" · `.is-off` "Misafire bildirim kapalı" · `.is-failed` "İletilemedi" ·
   `.is-read` "Okundu" — her biri simge + metin (renk tek taşıyıcı değil). Metin `pre-wrap`, uzun sözcük kırılır; balon en çok %80 / 560 px.
   Misafir portalında bakış açısı tersine döner: misafirin KENDİ mesajı sağda `.msg.is-own` (personel balonu görünümü), otelin cevabı solda `.msg.is-in` (misafir balonu görünümü). */
.msg-thread { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-3); min-inline-size: 0; }
.msg { display: flex; flex-direction: column; align-items: flex-start; gap: var(--sp-1); align-self: flex-start; max-inline-size: min(80%, 560px); min-inline-size: 0; }
.msg.is-staff, .msg.is-own, .msg.is-note { align-self: flex-end; align-items: flex-end; }
.msg-head { display: inline-flex; align-items: center; gap: var(--sp-1); font-size: var(--fs-xs); line-height: var(--lh-xs); font-weight: var(--fw-semibold); color: var(--text-2); }
.msg-head .i { inline-size: 12px; block-size: 12px; stroke-width: 2.2; }
.msg-bubble { max-inline-size: 100%; padding: var(--sp-2) var(--sp-3); border-radius: var(--r-lg); border-end-start-radius: var(--r-xs); background: var(--surface-2); border: 1px solid var(--border); color: var(--text); font-size: var(--fs-md); line-height: var(--lh-md); white-space: pre-wrap; overflow-wrap: anywhere; }
.msg.is-staff .msg-bubble, .msg.is-own .msg-bubble { background: var(--primary-soft); border-color: color-mix(in srgb, var(--primary) 14%, transparent); border-end-start-radius: var(--r-lg); border-end-end-radius: var(--r-xs); }
.msg.is-note .msg-bubble { background: var(--warning-soft); border: 1px dashed color-mix(in srgb, var(--warning) 70%, transparent); border-end-start-radius: var(--r-lg); border-end-end-radius: var(--r-xs); }
.msg.is-note .msg-head { color: var(--warning-text); }
.msg-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 2px var(--sp-2); font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); }
.msg.is-staff .msg-meta, .msg.is-own .msg-meta, .msg.is-note .msg-meta { justify-content: flex-end; }
.msg-meta time { white-space: nowrap; font-variant-numeric: tabular-nums; }
.msg-status { display: inline-flex; align-items: center; gap: var(--sp-1); white-space: nowrap; font-weight: var(--fw-medium); }
.msg-status .i { inline-size: 12px; block-size: 12px; stroke-width: 2.2; }
.msg-status.is-delivered { color: var(--success-text); }
.msg-status.is-off { color: var(--text-3); }
.msg-status.is-failed { color: var(--danger-text); }
.msg-status.is-read { color: var(--info-text); }
.msg.is-system { align-self: center; align-items: center; max-inline-size: 100%; }
.msg.is-system .msg-bubble { display: inline-flex; align-items: center; gap: var(--sp-1); padding: 2px var(--sp-3); border: 0; border-radius: var(--r-full); background: var(--surface-3); color: var(--text-2); font-size: var(--fs-xs); line-height: var(--lh-xs); white-space: normal; text-align: center; }
.msg.is-system .msg-bubble .i { inline-size: 12px; block-size: 12px; }

/* ---------- Misafir portalı düzeni (kabuksuz, mobil öncelikli; kullanıcı kararı 29.10.2026) ----------
   Personel kabuğu (kenar menü, üst çubuk, oturum) YOK. ÜSTTE yapışkan başlık `.gp-head` = otel logosu (`.gp-logo`; yoksa baş harf kutusu `.gp-mark`) + otel adı / alt bilgi (`.gp-name`)
   + 4 dil seçici (`.gp-lang`: katalog açılır menüsü, `menuitemradio`); ORTADA tek sütun içerik `.gp-main` (en çok 560 px, kartlar/alanlar katalog bileşenleri); ALTTA yapışkan eylem alanı
   `.gp-foot` (tam genişlik büyük düğmeler, ≥44 px; iPhone alt güvenli alanı). Dokunma hedefi ≥ 44 px; sayfa başlığı `h1` (fs-2xl). Geniş ekranda da tek sütun ortalanır. */
.gp { min-block-size: 100vh; min-block-size: 100dvh; display: flex; flex-direction: column; background: var(--bg); color: var(--text); }
.gp-head { position: sticky; inset-block-start: 0; z-index: 20; background: var(--surface); border-block-end: 1px solid var(--border); }
.gp-head-in, .gp-main, .gp-foot-in { inline-size: 100%; max-inline-size: 560px; margin-inline: auto; padding-inline: var(--sp-4); }
.gp-head-in { display: flex; align-items: center; gap: var(--sp-3); min-block-size: 64px; padding-block: var(--sp-2); }
.gp-brand { flex: 1 1 auto; display: flex; align-items: center; gap: var(--sp-3); min-inline-size: 0; }
.gp-logo { flex: none; inline-size: auto; block-size: auto; max-block-size: 40px; max-inline-size: 120px; object-fit: contain; }
.gp-mark { flex: none; inline-size: 40px; block-size: 40px; border-radius: var(--r-md); display: grid; place-items: center; background: var(--primary-soft); color: var(--primary-text); font-size: var(--fs-md); font-weight: var(--fw-bold); }
.gp-name { display: flex; flex-direction: column; min-inline-size: 0; }
.gp-name b { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); }
.gp-name small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); }
.gp-lang { flex: none; }
.gp-lang .btn { min-block-size: 40px; }
.gp-lang .menu { min-inline-size: 180px; }
.gp-main { flex: 1 0 auto; display: flex; flex-direction: column; gap: var(--sp-4); padding-block: var(--sp-4) var(--sp-6); min-inline-size: 0; }
.gp-main h1 { font-size: var(--fs-2xl); line-height: var(--lh-2xl); }
/* Görünüm değişince odak sayfa başlığına taşınır (tabindex=-1, ekran okuyucu duyurur); programatik odakta halka çizilmez. */
.gp-main h1[tabindex="-1"]:focus { outline: none; }
.gp-main .btn, .gp-main .input, .gp-main .select { min-block-size: 44px; }
.gp-main .btn-icon { min-inline-size: 44px; }
.gp-foot { position: sticky; inset-block-end: 0; z-index: 20; background: var(--surface); border-block-start: 1px solid var(--border); }
.gp-foot-in { display: flex; flex-wrap: wrap; gap: var(--sp-2); padding-block: var(--sp-3) calc(var(--sp-3) + env(safe-area-inset-bottom, 0px)); }
.gp-foot-in .btn { flex: 1 1 140px; min-block-size: var(--ctl-h-lg); }
@media (min-width: 768px) { .gp-main { padding-block: var(--sp-8); } }

/* ---------- QR önizleme (kullanıcı kararı 29.10.2026) ----------
   `.qr`: ÜSTTE QR görseli (`.qr-img`, `img` + `alt`; sunucunun ürettiği SVG kendi beyaz sessiz alanını taşır → koyu temada da okunur), ALTINDA bağlantı/PIN/geçerlilik tanım listesi
   (`.qr-info`: bağlantı `.qr-url` mono + her yerde kırılır, PIN `.qr-pin` iri mono), EN ALTTA yardımcı eylemler (`.qr-actions`: metinsiz çerçeveli simge düğmeleri + ipucu:
   Bağlantıyı kopyala · PIN'i kopyala · SVG indir · Yazdır). Yazdır: `body`nin doğrudan çocuğu `.qr-print` geçici kopyası basılır, sayfanın geri kalanı gizlenir; çıktı siyah-beyaz
   (marka rengi yok; sistem Canvas/CanvasText renkleri, sabit renk yok). */
.qr { display: flex; flex-direction: column; align-items: center; gap: var(--sp-3); padding: var(--sp-4); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); min-inline-size: 0; }
.qr-img { display: block; inline-size: var(--qr-size, 192px); max-inline-size: 100%; aspect-ratio: 1; block-size: auto; border: 1px solid var(--border); border-radius: var(--r-md); background: var(--surface-2); }
.qr-cap { font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); text-align: center; }
.qr-info { inline-size: 100%; margin: 0; display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: var(--sp-2) var(--sp-3); align-items: baseline; font-size: var(--fs-sm); line-height: var(--lh-sm); }
.qr-info dt { color: var(--text-3); white-space: nowrap; }
.qr-info dd { margin: 0; min-inline-size: 0; overflow-wrap: anywhere; }
.qr-url { font-family: var(--font-mono); font-size: var(--fs-xs); color: var(--text-2); word-break: break-all; }
.qr-pin { font-family: var(--font-mono); font-size: var(--fs-xl); line-height: var(--lh-xl); font-weight: var(--fw-bold); letter-spacing: .2em; font-variant-numeric: tabular-nums; }
.qr-actions { display: flex; flex-wrap: wrap; justify-content: center; gap: var(--sp-2); }
.qr-print { display: none; }
@media print {
  body:has(> .qr-print) > :not(.qr-print) { display: none !important; }
  .qr-print { color-scheme: light; display: flex; flex-direction: column; align-items: center; gap: var(--sp-3); padding: var(--sp-6); background: Canvas; color: CanvasText; text-align: center; }
  .qr-print .qr-img { inline-size: 70mm; border: 0; }
  .qr-print .qr-info { max-inline-size: 120mm; text-align: start; }
  .qr-print .qr-info dt, .qr-print .qr-url { color: CanvasText; }
}

/* ---------- Katlanır "Gelişmiş" bölüm / disclosure (kullanıcı kararı 29.10.2026) ----------
   `.disc`: formda nadiren değişen, riskli ya da teknik ayarları varsayılan KAPALI katlayan çerçeveli bölüm. Başlık satırı (`.disc-h`) TEK tıklanır `button`
   (chevron-right ikon + başlık [+ `.disc-sub` kısa açıklama]); `aria-expanded` + `aria-controls`, Enter/Space (yerel düğme). Açılınca ikon 90° döner.
   Gövde `.disc-b` (`hidden` iken içerik DOM'da kalır; form durumu korunur). İsteğe bağlı uyarı notu gövdenin İLK öğesi: `.alert.warning` ("teyide kadar değiştirmeyin").
   Başlık düğmesi çerçevelidir (kapsayıcı kenarlığı); ayrıca çerçevesiz düğme değildir: sekme/menü öğesi gibi satırın kendisidir. Dokunma hedefi ≥44 px. */
.disc { background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); min-inline-size: 0; }
.disc-h { display: flex; align-items: center; gap: var(--sp-2); inline-size: 100%; min-block-size: 44px; padding: var(--sp-3) var(--sp-5); border: 0; border-radius: var(--r-lg); background: none; color: var(--text); font: inherit; font-weight: var(--fw-semibold); text-align: start; cursor: pointer; }
.disc-h:hover { background: var(--surface-2); }
.disc-h:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.disc-h .i { flex: none; color: var(--text-3); transition: transform var(--dur-2) var(--ease); }
.disc-h[aria-expanded="true"] .i { transform: rotate(90deg); }
.disc-h[aria-expanded="true"] { border-end-start-radius: 0; border-end-end-radius: 0; }
.disc-sub { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-sm); font-weight: var(--fw-regular); color: var(--text-3); }
.disc-b { display: flex; flex-direction: column; gap: var(--sp-4); padding: var(--sp-4) var(--sp-5) var(--sp-5); border-block-start: 1px solid var(--border); min-inline-size: 0; }
.disc-b[hidden] { display: none; }
@media (prefers-reduced-motion: reduce) { .disc-h .i { transition: none; } }

/* ---------- Kod bloğu / code block (kullanıcı kararı 29.10.2026) ----------
   `.code`: komut/yapılandırma/değer gösterimi. Çerçeveli yüzey, mono yazı (`--font-mono`), satır numarasız, uzun satır SARILMAZ: `pre` yatay kaydırılır (klavye için tabindex=0).
   Kopyala = ikon-only çerçeveli ikincil sm düğme (`.btn.btn-secondary.btn-icon.btn-sm`) + ipucu "Kopyala"; blok sağ üstte (tek satırda dikey ortada). Tek satır: `.is-single`.
   Renkler tokenlardan gelir (koyu/açık tema ayrı kural istemez). Salt okunur: düzenlenebilir alan için `.textarea`/`.input` kullanılır. */
.code { display: flex; align-items: flex-start; gap: var(--sp-2); min-inline-size: 0; max-inline-size: 100%; padding: var(--sp-2); background: var(--surface-2); border: 1px solid var(--border); border-radius: var(--r-md); }
.code.is-single { align-items: center; }
.code pre { flex: 1 1 auto; min-inline-size: 0; margin: 0; padding: var(--sp-1) var(--sp-2); overflow-x: auto; font-family: var(--font-mono); font-size: var(--fs-sm); line-height: 1.55; color: var(--text); white-space: pre; tab-size: 2; border-radius: var(--r-sm); }
.code pre:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.code .btn { flex: none; }

/* ---------- Kamera önizleme / camera viewfinder (kullanıcı kararı 29.10.2026) ----------
   `.cam`: tarayıcıda kare işleyen okuma (kimlik MRZ) için canlı kamera görünümü. Çerçeveli kart yüzeyi; ÜSTTE `.cam-view` (16:10 görüntü alanı, boşken `--surface-3`),
   içinde `video.cam-video` (sessiz, `playsinline`, `object-fit: cover`; görüntü yalnız ekranda, kaydedilmez) + hizalama kılavuzu `.cam-guide` (ID-1 kart oranı 85,6×54,
   dışı `--overlay` ile karartılır) ve içinde MRZ bandı `.cam-mrz` (kesikli, kılavuzun alt %30'u). Kamera kapalı / izin reddedildi / kamera yok hâllerinde video ve kılavuz
   gizlenir, görüntü alanında katalog boş-durumu (`.empty`: simge + başlık + kısa yönerge [+ "Yeniden dene" etiketli ikincil düğme]) durur. ALTTA durum/ipucu satırı `.cam-bar`:
   durum rozeti (`.badge` + nokta: Canlı t-success · Kapalı t-neutral · İzin yok t-warning · Kamera yok t-neutral) + ipucu metni `.cam-hint` (`aria-live="polite"`) + EN SAĞDA
   başlat/durdur metinsiz çerçeveli simge düğmesi (`.btn.btn-secondary.btn-icon.btn-sm`, `camera` / `camera-off` + ipucu "Kamerayı başlat" / "Kamerayı durdur", `aria-pressed`).
   Renkler tokenlardan gelir (koyu/açık tema ayrı kural istemez). */
.cam { display: flex; flex-direction: column; min-inline-size: 0; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); overflow: hidden; }
.cam-view { position: relative; display: grid; place-items: center; aspect-ratio: 16 / 10; min-block-size: 200px; background: var(--surface-3); overflow: hidden; }
.cam-video { position: absolute; inset: 0; inline-size: 100%; block-size: 100%; object-fit: cover; background: var(--surface-3); }
.cam-video[hidden], .cam-guide[hidden] { display: none; }
.cam-guide { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); inline-size: 84%; aspect-ratio: 856 / 540; border: 2px solid var(--surface); border-radius: var(--r-lg); box-shadow: 0 0 0 100vmax var(--overlay); pointer-events: none; }
.cam-mrz { position: absolute; inset-inline: var(--sp-2); inset-block-end: var(--sp-2); block-size: 30%; border: 2px dashed var(--surface); border-radius: var(--r-sm); }
.cam-view .empty { padding: var(--sp-6) var(--sp-4); }
.cam-bar { display: flex; align-items: center; gap: var(--sp-2); min-inline-size: 0; padding: var(--sp-2) var(--sp-3); border-block-start: 1px solid var(--border); }
.cam-bar > .badge, .cam-bar > .btn { flex: none; }
.cam-hint { flex: 1 1 auto; min-inline-size: 0; margin: 0; font-size: var(--fs-sm); line-height: var(--lh-sm); color: var(--text-2); }

/* =====================================================================
   SEKİZ EK BİLEŞEN (kullanıcı kararı 29.10.2026) — katalog: `bilesenler.html#more`, kurallar: `tasarim-sistemi.md` §4
   Yalnız mevcut tokenlar; açık/koyu tema ayrı kural istemez. Var olan bileşenlerin görünümü DEĞİŞMEZ (aşağıdakiler yalnız yeni sınıf/varyant ekler).
   Davranış (geri sayım, tek seferlik sır, puan girişi, girdi şeması): `ortak.js` sonu, `data-*` bağları.
   ===================================================================== */
:root { --logo-accent: #C4343A; } /* YALNIZ metin logo / logo-amblem vurgusu (marka kırmızısı); arayüz bileşenlerinde kullanılmaz */

/* ---------- 1) Zaman çizelgesi: durum varyantı `.timeline.is-status` (sipariş / olay geçmişi) ----------
   Mevcut `.timeline` (aktivite akışı) aynen kalır. Durumlu varyant: `ol.timeline.is-status > li.is-done|is-info|is-warn|is-failed|is-current|is-pending`.
   Her olay = durum SİMGESİ (`.tl-ic`: done=check, info=info, warn=alert, failed=x, current=clock, pending=boş halka+clock) + başlık + durum rozeti (renge bağımlı değil) + isteğe bağlı açıklama + zaman.
   `is-current` = akıştaki mevcut adım (`aria-current="step"`), en fazla bir tane. Zaman `time[datetime]` (tarih/saat nowrap). Bağlantı çizgisi tamamlanan adımlarda yeşil, diğerlerinde nötr. */
.timeline.is-status li { padding-block-end: var(--sp-5); }
.timeline.is-status .tl-b { padding-block-start: 4px; display: flex; flex-direction: column; gap: var(--sp-1); }
.timeline.is-status .tl-head { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-1) var(--sp-2); min-inline-size: 0; }
.timeline.is-status .tl-title { font-size: var(--fs-md); font-weight: var(--fw-semibold); min-inline-size: 0; overflow-wrap: anywhere; }
.timeline.is-status .tl-desc { font-size: var(--fs-sm); line-height: var(--lh-sm); color: var(--text-2); overflow-wrap: anywhere; }
.timeline.is-status .tl-meta { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-1) var(--sp-3); font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); }
.timeline.is-status .tl-meta time { white-space: nowrap; font-variant-numeric: tabular-nums; }
.timeline.is-status .tl-ic { flex: none; }
.timeline.is-status li.is-done .tl-ic { background: var(--success-soft); color: var(--success-text); }
.timeline.is-status li.is-info .tl-ic { background: var(--info-soft); color: var(--info-text); }
.timeline.is-status li.is-warn .tl-ic { background: var(--warning-soft); color: var(--warning-text); }
.timeline.is-status li.is-failed .tl-ic { background: var(--danger-soft); color: var(--danger-text); }
.timeline.is-status li.is-current .tl-ic { background: var(--primary-solid); color: var(--on-primary); box-shadow: 0 0 0 4px var(--primary-soft-2); }
.timeline.is-status li.is-pending .tl-ic { background: var(--surface); color: var(--text-3); box-shadow: inset 0 0 0 1.5px var(--border-strong); }
.timeline.is-status li.is-pending .tl-title { color: var(--text-2); font-weight: var(--fw-medium); }
.timeline.is-status li.is-done:not(:last-child)::before { background: var(--success); }

/* ---------- 2) Geri sayım / countdown (`.cd`, `role="timer"`) ----------
   Hap biçimli süre göstergesi: durum simgesi + etiket ("Otomatik onaya") + kalan süre (`.cd-val`, tabular, en çok iki birim: 2g 4s · 5s 30dk · 12dk 40sn). Durum eşikleri (`data-cd-warn`, `data-cd-danger`, saniye;
   varsayılan 24 saat / 1 saat): is-ok (nötr, saat) → is-warn (amber, uyarı simgesi) → is-danger (kırmızı, uyarı simgesi + 1 px halka) → is-expired (kırmızı, x simgesi + halka + "Süre doldu").
   Renge bağımlı değil: simge + halka + ekran okuyucu metni (`aria-label` tam birimlerle: "Otomatik onaya 2 gün 4 saat, süre yeterli"). Betik: `ortak.js` (her saniye tazeler; `data-cd` = bitiş zamanı ISO). */
.cd { --cd-bg: var(--neutral-soft); --cd-fg: var(--neutral-text); display: inline-flex; align-items: center; gap: var(--sp-2); max-inline-size: 100%; min-block-size: 28px; padding: var(--sp-1) var(--sp-3); border-radius: var(--r-full); background: var(--cd-bg); color: var(--cd-fg); font-size: var(--fs-sm); line-height: var(--lh-sm); white-space: nowrap; }
.cd > .i { width: 14px; height: 14px; flex: none; }
.cd-label { min-inline-size: 0; overflow: hidden; text-overflow: ellipsis; }
.cd-val { font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.cd.is-warn { --cd-bg: var(--warning-soft); --cd-fg: var(--warning-text); }
.cd.is-danger, .cd.is-expired { --cd-bg: var(--danger-soft); --cd-fg: var(--danger-text); box-shadow: inset 0 0 0 1px currentColor; }
.cd.is-lg { min-block-size: 36px; padding-inline: var(--sp-4); font-size: var(--fs-md); line-height: var(--lh-md); }
.cd.is-lg .cd-val { font-size: var(--fs-xl); line-height: var(--lh-xl); }
.cd.is-lg > .i { width: 18px; height: 18px; }

/* ---------- 3) Ödeme alanı / payment (`.pay`) ----------
   Kart verisini BİZ TUTMAYIZ: kart numarası/SKT/CVC alanları ödeme sağlayıcısının iframe'inde (`.pay-slot > iframe.pay-iframe`, `title` zorunlu, sağlayıcı adresi CSP `frame-src` ile sınırlı) girilir;
   bu sistemde kart girişi (input) ÇİZİLMEZ. SOLDA kart: başlık + "Güvenli bağlantı" rozeti + iframe yeri (yüklenirken `.skel`, hata `.alert.danger` + "Yeniden dene"), SAĞDA özet kartı (`.pay-sum`: kalem satırları, kesikli ayırıcı, kalın Toplam,
   tek birincil düğme "Ödemeyi tamamla" [kilit simgesi; ödeme sürerken `.is-loading`], güvenlik notu `.pay-note`). Tutarlar sağa hizalı, tabular, nowrap. ≤ 640 px kapta tek sütun (özet üstte, düğme en altta kalır). */
.pay { container: pay / inline-size; inline-size: 100%; min-inline-size: 0; }
.pay-grid { display: grid; grid-template-columns: minmax(0, 1.35fr) minmax(0, 1fr); gap: var(--sp-5); align-items: start; }
@container pay (max-width: 640px) { .pay-grid { grid-template-columns: minmax(0, 1fr); } .pay-sum { order: -1; } }
.pay-card { display: flex; flex-direction: column; gap: var(--sp-4); min-inline-size: 0; padding: var(--sp-4) var(--sp-5) var(--sp-5); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); }
.pay-h { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2) var(--sp-3); }
.pay-h h3 { font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); min-inline-size: 0; }
.pay-h .badge { margin-inline-start: auto; }
.pay-slot { display: grid; place-items: center; min-block-size: 232px; padding: var(--sp-4); border: 1.5px dashed var(--border-strong); border-radius: var(--r-md); background: var(--surface-2); text-align: center; }
.pay-slot .empty { padding: var(--sp-4); }
.pay-slot.is-loading { display: flex; flex-direction: column; align-items: stretch; justify-content: center; gap: var(--sp-3); border-style: solid; }
.pay-iframe { display: block; inline-size: 100%; block-size: 232px; border: 0; border-radius: var(--r-sm); background: transparent; }
.pay-lines { margin: 0; display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--sp-2) var(--sp-4); font-size: var(--fs-md); }
.pay-lines dt { min-inline-size: 0; color: var(--text-2); overflow-wrap: anywhere; }
.pay-lines dd { margin: 0; text-align: end; white-space: nowrap; font-variant-numeric: tabular-nums; }
.pay-lines .pay-total { padding-block-start: var(--sp-3); border-block-start: 1px dashed var(--border-strong); font-size: var(--fs-xl); line-height: var(--lh-xl); font-weight: var(--fw-bold); color: var(--text); }
.pay-lines dt.pay-total { align-self: end; }
.pay-note { display: flex; gap: var(--sp-2); align-items: flex-start; font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-3); }
.pay-note .i { width: 14px; height: 14px; flex: none; margin-block-start: 1px; color: var(--success-text); }
.pay-sum .btn { inline-size: 100%; }

/* ---------- 4) Çift kayıtlı defter tablosu (`table.table.ledger`) ----------
   Muhasebe fişi: her İŞLEM bir `tbody.lg-tx` (satır grubu) = tek fiş; ilk satırda tarih + fiş no (gerçek bağlantı `.cell-link`) + işlem denge simgesi, sonraki satırlarda bu hücreler boş; borç satırları önce, alacak satırları (`tr.lg-cr`) hesap adı girintili.
   Sütunlar: Tarih · Fiş no · Hesap (kod `.mono` + ad, `is-trunc` + tooltip) · Açıklama (`is-trunc` + tooltip) · Borç · Alacak (sağa, tabular, nowrap; karşı taraf boş). Gruplar arası güçlü çizgi, grup üzerine gelince tüm satırlar vurgulanır.
   `tfoot.lg-total`: Toplam borç / Toplam alacak + Denge satırı (dengeliyse `t-success` "Dengede", değilse `t-danger` "Fark: tutar" ve toplamlar tehlike renginde). İşlem dengesiz ise ilk satırda `alert` simgesi (+ ekran okuyucu metni). Hücre kuralı (nowrap/ellipsis) `.table` ile aynı. */
.ledger td, .ledger th { vertical-align: middle; }
.ledger tbody.lg-tx > tr > td { height: 40px; border-block-end-color: transparent; }
.ledger tbody.lg-tx > tr:first-child > td { border-block-start: 1px solid var(--border-strong); }
.ledger tbody.lg-tx:first-of-type > tr:first-child > td { border-block-start: 0; }
.ledger tbody.lg-tx > tr:last-child > td { border-block-end: 1px solid var(--border); }
.ledger tbody.lg-tx:hover > tr { background: var(--surface-2); }
.ledger tr.lg-cr .lg-acct { padding-inline-start: calc(14px + var(--sp-6)); }
.ledger .lg-code { color: var(--text-2); margin-inline-end: var(--sp-2); }
.ledger .lg-ok, .ledger .lg-bad { display: inline-flex; vertical-align: middle; margin-inline-start: var(--sp-2); }
.ledger .lg-ok .i, .ledger .lg-bad .i { width: 14px; height: 14px; }
.ledger .lg-ok { color: var(--success-text); }
.ledger .lg-bad { color: var(--danger-text); }
.ledger tfoot th, .ledger tfoot td { position: static; background: var(--surface-2); color: var(--text); text-transform: none; letter-spacing: 0; font-size: var(--fs-md); font-weight: var(--fw-semibold); height: 44px; border-block-end: 0; }
.ledger tfoot tr:first-child > th, .ledger tfoot tr:first-child > td { border-block-start: 2px solid var(--border-strong); }
.ledger tfoot tr + tr > th, .ledger tfoot tr + tr > td { border-block-start: 1px solid var(--border); }
.ledger tfoot .is-diff { color: var(--danger-text); }

/* ---------- 5) Metin logo / wordmark (`.wm`) ----------
   İki parçalı yazı logosu: ilk parça (`.wm-a`) vurgu rengi + kalın, ikinci parça (`.wm-b`) ikincil renk + normal ("AI" + "yapsın"). Vurgu `--wm-accent` (varsayılan `--primary-text`; ürün logosunda `.is-brand` = `--logo-accent` marka kırmızısı —
   kırmızı YALNIZ logoda). I/l KARIŞMAZ kuralı: sans-serif yazı tiplerinde büyük "I" ile küçük "l" aynı görünür (AIyapsın ≈ Alyapsın); büyük I `span.wm-i` içine alınır → serifli (mono ailesi) çizilir. Kök `role="img"` + `aria-label` = düz yazı
   (ekran okuyucu tek parça okur; iç parçalar `aria-hidden`). Boyut: `.is-sm|.is-lg|.is-xl`. Bağlantı olarak kullanılırsa altı çizili DEĞİLDİR (logo istisnası, `.brand-link` gibi). */
.wm { --wm-accent: var(--primary-text); --wm-rest: var(--text-2); display: inline-flex; align-items: baseline; font-family: var(--font); font-size: var(--fs-2xl); line-height: 1.15; letter-spacing: -.02em; white-space: nowrap; }
.wm-a { color: var(--wm-accent); font-weight: var(--fw-bold); }
.wm-b { color: var(--wm-rest); font-weight: var(--fw-medium); }
.wm-i { font-family: var(--font-mono); font-size: .94em; letter-spacing: 0; }
.wm.is-brand { --wm-accent: var(--logo-accent); }
.wm.is-sm { font-size: var(--fs-lg); }
.wm.is-lg { font-size: var(--fs-4xl); }
.wm.is-xl { font-size: 44px; }
a.wm { text-decoration: none; }
a.wm:focus-visible { outline: none; box-shadow: var(--focus-ring); border-radius: var(--r-sm); }

/* ---------- 6) Girdi şeması düzenleyici (`.sch`) ----------
   Bir ajan/araç/form için girdi alanlarının şeması: SOLDA alan satırları (`.sch-row`: alan adı [mono, harfle başlar, harf/rakam/alt çizgi] · tür seçici · "Zorunlu" onay kutusu · çöp simge düğmesi [`.btn-tone-danger`, ipucu "Alanı sil"]),
   altında "Alan ekle" (çerçeveli ikincil + `plus`); SAĞDA canlı JSON önizleme (`.code`, salt okunur, kopyalanır; JSON Schema `{type:"object", properties, required}`). Geçersiz/yinelenen ad satırda `.field.is-error` + ikonlu yardım metni; önizleme yalnız geçerli adları içerir.
   Etiketler daima görünür: geniş kapta sütun başlığı `.sch-head`, dar kapta (≤ 560 px) her alanın kendi `.sch-lbl` etiketi. Kap < 1080 px: önizleme altta. Boş durum: kısa yönerge. Betik: `ortak.js` `OS.schemaEditor`. */
.sch { container: sch / inline-size; inline-size: 100%; min-inline-size: 0; }
.sch-grid { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--sp-5); align-items: start; }
@container sch (min-width: 1080px) { .sch-grid { grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr); } }
.sch-edit, .sch-prev { display: flex; flex-direction: column; gap: var(--sp-3); min-inline-size: 0; }
.sch-head, .sch-row { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr) 136px 36px; gap: var(--sp-2) var(--sp-3); align-items: start; }
.sch-head { padding-inline: var(--sp-3); font-size: var(--fs-xs); font-weight: var(--fw-semibold); text-transform: uppercase; letter-spacing: .04em; color: var(--text-3); }
.sch-head .req { color: var(--danger-text); }
.sch-rows { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--sp-2); }
.sch-row { padding: var(--sp-3); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); }
.sch-row.is-error { border-color: var(--danger); }
.sch-row .check { min-block-size: var(--ctl-h); align-items: center; }
.sch-row .btn-icon { align-self: start; }
.sch-lbl { display: none; }
.sch-empty { padding: var(--sp-5); border: 1.5px dashed var(--border-strong); border-radius: var(--r-md); background: var(--surface-2); color: var(--text-2); font-size: var(--fs-sm); text-align: center; }
.sch-prev-h { display: flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-md); font-weight: var(--fw-semibold); }
.sch-prev-h .i { color: var(--text-3); }
.sch-prev .code pre { max-block-size: 360px; }
@container sch (max-width: 560px) {
  .sch-head { display: none; }
  .sch-row { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .sch-row > .field:first-child { grid-column: 1 / -1; }
  .sch-lbl { display: block; font-size: var(--fs-sm); font-weight: var(--fw-medium); }
  .sch-row .check { align-self: end; }
  .sch-row .btn-icon { grid-column: 2; justify-self: end; }
}
@media (pointer: coarse) { .sch-row .btn-icon { width: 40px; height: 40px; } }

/* ---------- 7) Tek seferlik sır gösterimi (`.secret`) ----------
   Oluşturulduktan SONRA yalnız bir kez gösterilen değer (API anahtarı, istemci sırrı, kurtarma kodu). Yapı: başlık + uyarı (`.alert.warning`: "Bu değer yalnızca bir kez gösterilir…") + değer satırı
   (`.secret-val` MASKELİ — sabit uzunlukta noktalar, gerçek uzunluğu sızdırmaz; yanında metinsiz çerçeveli simge düğmeleri: Göster/Gizle [eye / eye-off, `aria-pressed`] ve Kopyala [copy], ipucu + `aria-label`) +
   "Kaydettim" onay kutusu + birincil "Tamam". Tamam'a basınca değer bellekten ve DOM'dan silinir: `.is-gone` (kilit simgesi + "Bir daha gösterilmez"); geri alınamaz, sayfa yenilenince de gelmez (sunucu da bir daha vermez).
   Kopyalandı bildirimi `role="status"` (+ toast). Değer panoya kopyalanır, günlüğe/URL'ye/depolamaya YAZILMAZ. Betik: `ortak.js` `OS.secretShow`. */
.secret { display: flex; flex-direction: column; gap: var(--sp-4); min-inline-size: 0; padding: var(--sp-4) var(--sp-5) var(--sp-5); background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-lg); box-shadow: var(--sh-xs); }
.secret-h { display: flex; align-items: center; gap: var(--sp-2); font-size: var(--fs-lg); line-height: var(--lh-lg); font-weight: var(--fw-semibold); }
.secret-h .i { color: var(--text-3); }
.secret-row { display: flex; align-items: center; gap: var(--sp-2); min-inline-size: 0; }
.secret-val { flex: 1 1 auto; min-inline-size: 0; display: block; box-sizing: border-box; min-block-size: var(--ctl-h); padding: 0 var(--sp-3); overflow-x: auto; white-space: nowrap; font-family: var(--font-mono); font-size: var(--fs-sm); line-height: calc(var(--ctl-h) - 2px); letter-spacing: .04em; color: var(--text); background: var(--surface-2); border: 1px solid var(--border-strong); border-radius: var(--r-md); }
.secret-val:focus-visible { outline: none; box-shadow: var(--focus-ring); }
.secret-val.is-masked { letter-spacing: .18em; color: var(--text-2); user-select: none; }
.secret-row .btn { flex: none; }
.secret-state { min-block-size: var(--lh-xs); font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--success-text); }
.secret-foot { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--sp-3); }
.secret-gone { display: flex; align-items: center; gap: var(--sp-3); padding: var(--sp-4); background: var(--surface-2); border: 1px dashed var(--border-strong); border-radius: var(--r-md); }
.secret-gone .i { flex: none; color: var(--text-3); }
.secret-gone b { display: block; font-weight: var(--fw-semibold); }
.secret-gone p { font-size: var(--fs-sm); color: var(--text-2); }
.secret.is-gone .secret-warn, .secret.is-gone .secret-row, .secret.is-gone .secret-state, .secret.is-gone .secret-foot { display: none; }
.secret:not(.is-gone) .secret-gone { display: none; }

/* ---------- 8) Puan yıldızı / rating (`.rate`) ----------
   SALT OKUMA: `.rate[data-rate="4.5"]` — 5 yıldız, YARIM yıldız desteği (gösterim en yakın 0,5'e yuvarlanır; sayı gerçek değeri verir: "4,3"), yanında `.rate-n` sayı (+ isteğe bağlı `data-count` ile `(128)`).
   `role="img"` + `aria-label` = "5 üzerinden 4,5" (betik kurar). GİRDİ: `.rate.rate-in[data-rate-in]` — `role="radiogroup"`; yarım adımda 10 radyo (0,5…5), yalnız tam yıldızda 5 (`data-whole`). Klavye: ←/→ (↑/↓) değeri değiştirir (yerel radyo), Tab gruba tek durak.
   Dokunmatikte (`pointer: coarse`) yarım adım kapanır, tam yıldız ≥ 40 px hedef olur. Yıldız = maske (dolu/ana hat), renk tokenlardan (dolu `--warning-text`, boş ana hat `--text-3`); renk tek ipucu değil (dolgu oranı + sayı). Yüksek karşıtlıkta sistem renkleri. */
.rate { --rate-size: 16px; --rate-v: 0; --rate-fill: var(--warning-text); --rate-empty: var(--text-3); --rate-solid: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m12 2.8 2.8 5.8 6.3.9-4.6 4.4 1.1 6.3L12 17.2l-5.6 3 1.1-6.3L2.9 9.5l6.3-.9z' fill='black' stroke='black' stroke-width='1.8' stroke-linejoin='round'/%3E%3C/svg%3E"); --rate-line: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m12 2.8 2.8 5.8 6.3.9-4.6 4.4 1.1 6.3L12 17.2l-5.6 3 1.1-6.3L2.9 9.5l6.3-.9z' fill='none' stroke='black' stroke-width='1.8' stroke-linejoin='round'/%3E%3C/svg%3E"); direction: ltr; display: inline-flex; align-items: center; gap: var(--sp-2); max-inline-size: 100%; vertical-align: middle; }
.rate.is-sm { --rate-size: 14px; }
.rate.is-lg { --rate-size: 24px; }
.rate-stars { position: relative; display: inline-block; flex: none; inline-size: calc(var(--rate-size) * 5); block-size: var(--rate-size); }
.rate-stars::before, .rate-stars::after { content: ""; position: absolute; inset-block: 0; inset-inline-start: 0; -webkit-mask-repeat: repeat-x; mask-repeat: repeat-x; -webkit-mask-size: var(--rate-size) var(--rate-size); mask-size: var(--rate-size) var(--rate-size); -webkit-mask-position: 0 0; mask-position: 0 0; }
.rate-stars::before { inline-size: 100%; background: var(--rate-empty); -webkit-mask-image: var(--rate-line); mask-image: var(--rate-line); }
.rate-stars::after { inline-size: calc(var(--rate-v) / 5 * 100%); background: var(--rate-fill); -webkit-mask-image: var(--rate-solid); mask-image: var(--rate-solid); }
.rate-n { font-size: var(--fs-sm); line-height: var(--lh-sm); font-weight: var(--fw-semibold); font-variant-numeric: tabular-nums; white-space: nowrap; }
.rate-c { font-size: var(--fs-sm); line-height: var(--lh-sm); color: var(--text-3); font-variant-numeric: tabular-nums; white-space: nowrap; }
.rate-in { --rate-size: 32px; }
.rate-in .rate-stars { cursor: pointer; }
.rate-in .rate-stars > label { position: absolute; inset-block: 0; inset-inline-start: calc((var(--i) + var(--h) * .5) * var(--rate-size)); inline-size: calc(var(--rate-size) * .5); z-index: 1; cursor: pointer; }
.rate-in .rate-stars > label > input { position: absolute; inset: 0; inline-size: 100%; block-size: 100%; margin: 0; opacity: 0; cursor: pointer; }
.rate-in:has(input:focus-visible) .rate-stars { outline: 2px solid var(--focus); outline-offset: 3px; border-radius: var(--r-sm); }
.rate-in[data-whole] .rate-stars > label.is-half { display: none; }
.rate-in[data-whole] .rate-stars > label.is-full { inset-inline-start: calc(var(--i) * var(--rate-size)); inline-size: var(--rate-size); }
@media (pointer: coarse) {
  .rate-in { --rate-size: 40px; }
  .rate-in .rate-stars > label.is-half { display: none; }
  .rate-in .rate-stars > label.is-full { inset-inline-start: calc(var(--i) * var(--rate-size)); inline-size: var(--rate-size); }
}
@media (forced-colors: active) { .rate-stars::before { background: CanvasText; } .rate-stars::after { background: Highlight; } }

/* ---------- Bölüm düzenleyici / section editor (S-UI7; kullanıcı kararı 29.10.2026) ----------
   `ol.secedit` (+ `.ctl-sm`: içindeki kontroller sm): sıralı bölüm listesi; her satır `li.secedit-row` = SOLDA sürükle tutamacı `.secedit-grip` (`grip` simgesi, yalnız fare/dokunma;
   `aria-hidden`) + bölüm adı `.secedit-name` (tek satır, taşarsa `…`; `small` kısa açıklama) + SAĞDA `.secedit-ctl`: boyut ve hizalama `Select` (sm), "Kalın" onay kutusu (`.check`),
   göster/gizle `Switch` (`.switch`, görünmez etiket) ve KLAVYE ALTERNATİFİ yukarı/aşağı taşı ikon-only çerçeveli ikincil sm düğmeler (`arrow-up`/`arrow-down` + ipucu; ilk/son satırda pasif).
   Gizli bölüm `.is-off` (ad soluk; kontroller açık kalır). Kilitli bölüm `.is-locked` (ör. platform imzası: gizlenemez) = anahtar pasif + `lock` simgesi + ipucu; sürükleme yine serbest.
   Sürüklerken kaynak `.is-dragging` (soluk), bırakma yeri `.is-drop-before` / `.is-drop-after` (birincil renkli 2 px iç çizgi). Taşıma sonrası `aria-live` ile duyuru (bileşen dışı `.sr-only`).
   Dar ekranda (≤ 640 px) kontroller adın altına iner. Yalnız mevcut tokenlar; açık/koyu tema ayrı kural istemez. */
.secedit { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; min-inline-size: 0; background: var(--surface); border: 1px solid var(--border); border-radius: var(--r-md); overflow: hidden; }
.secedit-row { display: flex; align-items: center; gap: var(--sp-2); min-inline-size: 0; min-block-size: calc(var(--ctl-h) + 2 * var(--sp-2)); padding: var(--sp-1) var(--sp-2); background: var(--surface); border-block-start: 1px solid var(--border); }
.secedit-row:first-child { border-block-start: 0; }
.secedit-grip { flex: none; display: grid; place-items: center; inline-size: 20px; block-size: var(--ctl-h); color: var(--text-3); cursor: grab; touch-action: none; }
.secedit-row.is-dragging { opacity: .5; }
.secedit-row.is-dragging .secedit-grip { cursor: grabbing; }
.secedit-row.is-drop-before { box-shadow: inset 0 2px 0 var(--primary); }
.secedit-row.is-drop-after { box-shadow: inset 0 -2px 0 var(--primary); }
.secedit-name { flex: 1 1 8rem; min-inline-size: 0; font-size: var(--fs-sm); line-height: var(--lh-sm); font-weight: var(--fw-medium); color: var(--text); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.secedit-name small { display: block; overflow: hidden; text-overflow: ellipsis; font-size: var(--fs-xs); line-height: var(--lh-xs); font-weight: var(--fw-regular); color: var(--text-3); }
.secedit-row.is-off .secedit-name { color: var(--text-3); }
.secedit-ctl { flex: none; display: flex; align-items: center; justify-content: flex-end; gap: var(--sp-2); flex-wrap: wrap; min-inline-size: 0; }
.secedit-ctl .select { inline-size: auto; min-inline-size: 7.5rem; }
.secedit-ctl .check { font-size: var(--fs-sm); white-space: nowrap; }
.secedit-lock { display: inline-grid; place-items: center; color: var(--text-3); }
@media (max-width: 640px) {
  .secedit-row { flex-wrap: wrap; }
  .secedit-ctl { flex: 1 1 100%; justify-content: flex-start; padding-inline-start: 28px; }
}

/* ---------- Termal fiş önizlemesi / thermal receipt preview (S-UI8; kullanıcı kararı 29.10.2026) ----------
   `figure.tprev[data-paper="58"|"80"]`: termal çıktının ekran benzetimi. Sahne `--surface-3` (çerçeveli, `--r-lg`), ortada kâğıt `.tprev-paper`: genişlik satır karakter sayısından
   (58 mm = 32, 80 mm = 48 karakter; `ch`), EŞ ARALIKLI yazı (`--font-mono`, `--fs-xs`), SİYAH-BEYAZ; alt kenar YIRTIK (testere dişi, `::after`). Kâğıt rengi tema dışıdır
   (`--tp-paper`/`--tp-ink`, yalnız bu bileşende): KOYU TEMADA DA kâğıt beyaz, yazı siyah kalır. Satırlar `.tprev-ln` (`white-space: pre`; `.is-c` orta, `.is-r` sağ, `.is-b` kalın,
   `.is-2x` iki kat, `.is-sm` küçük [platform imzası]); sunucu önizlemesi kâğıt içinde `iframe.tprev-frame` (betiksiz `sandbox`). Altta `figcaption.tprev-cap` (kâğıt · karakter).
   Dar alanda sahne yatay kayar (kâğıt küçülmez). Marka rengi yok. */
.tprev { --tp-paper: #fff; --tp-ink: #000; --tp-cols: 48; display: flex; flex-direction: column; align-items: center; gap: var(--sp-3); min-inline-size: 0; margin: 0; padding: var(--sp-5) var(--sp-4); background: var(--surface-3); border: 1px solid var(--border); border-radius: var(--r-lg); overflow-x: auto; }
.tprev[data-paper="58"] { --tp-cols: 32; }
.tprev-paper { position: relative; flex: none; inline-size: calc(var(--tp-cols) * 1ch + 2 * var(--sp-3)); margin-block-end: 8px; padding: var(--sp-4) var(--sp-3) var(--sp-3); background: var(--tp-paper); color: var(--tp-ink); color-scheme: light; font-family: var(--font-mono); font-size: var(--fs-xs); line-height: 1.4; }
.tprev-paper::after { content: ""; position: absolute; inset-inline: 0; inset-block-start: 100%; block-size: 8px; background: conic-gradient(from -45deg at 50% 100%, var(--tp-paper) 90deg, transparent 0) 0 0 / 12px 8px repeat-x; }
.tprev-ln { margin: 0; min-block-size: 1.4em; white-space: pre; overflow: hidden; }
.tprev-ln.is-c { text-align: center; }
.tprev-ln.is-r { text-align: end; }
.tprev-ln.is-b { font-weight: var(--fw-bold); }
.tprev-ln.is-2x { font-size: 2em; line-height: 1.2; }
.tprev-ln.is-sm { font-size: .8em; }
.tprev-frame { display: block; inline-size: 100%; border: 0; background: var(--tp-paper); }
.tprev-cap { font-size: var(--fs-xs); line-height: var(--lh-xs); color: var(--text-2); }
@media (forced-colors: active) { .tprev-paper { border: 1px solid CanvasText; } }
