/* ============================================================
   LOCA GAYRİMENKUL — Güven Laciverti + Karamel
   Palet: kâğıt zemin · koyu lacivert çapa · karamel accent
   İKİ ton ailesi yürür: sıcak eksen (zemin + karamel, hue ~66–80°) ve
   soğuk çapa (lacivert, hue ~250°). Üçüncü bir aile eklenmez — bir tur
   mürekkep haki (89–100°) ve satılık rozeti terrakota (49°) idi; ikisi de
   kendi ailelerine çekildi.
   Tipografi: Fraunces (display) + Hanken Grotesk (body)
   ============================================================ */

/* ---------- tokens ---------- */
:root {
  /* Zemin & yüzey — "kâğıt", "bej" değil.
     Ölçüm: eski krem OKLCH C=0.017 idi ve sayfanın %30.8'ini kaplıyordu; bu kroma
     seviyesinde geniş alan bej okunur, kâğıt okunmaz (referans sınıfı kâğıtlar
     C≈0.008–0.011). Kroma yarıya indirildi, hue karamel ekseniyle hizalandı
     (85°→78°) — böylece zemin ve accent TEK sıcak aile olur, iki yakın-ama-farklı
     sıcak olmaz. Açıklık ayrımı bilerek bir tık açıldı: beyaz↔krem bölüm ritmi
     eskiden kroma farkına dayanıyordu, kroma düşünce ritim çökmesin diye fark
     açıklığa devredildi (yeni ayrım 1.129, eski 1.126 — korundu). */
  --cream: #f2eee8;
  --paper: #f9f7f3;
  --paper-2: #f5f2ed;
  --card: #fefcf9;

  /* Kâğıt Işığı — YALNIZ hero perdesinin rengi; bir zemin değil, bir ışıktır.
     Perde uzun süre --cream ile boyanıyordu ve bu iki hata üretiyordu: (1) zemin
     rengi fotoğrafın üstünde "boya" gibi durur, ışık gibi değil; (2) kroma yarıya
     inince (C 0.017→0.009) perde nötrleşti, altındaki gün batımının sıcaklığını
     emip griye çekti — fotoğrafın kalıntısı krem değil PUS okundu. Bu ton kremin
     aynı sıcak ekseninde bir kademe açığıdır (OKLCH L 0.975 / C 0.0119 / H 79.8;
     krem: 0.951 / 0.0091 / 78.3) — yeni bir aile değil, kremin ışık hâli. */
  --hero-light: #fbf6ee;
  --hero-light-rgb: 251 246 238;

  /* lacivert çapa */
  --olive-950: #0d1e30; /* footer — pitch'in olive-900'ünden ayrışsın diye bir kademe koyu */
  --olive-900: #12293f;
  --olive-800: #16324f;
  --olive-700: #22456a;
  --olive-600: #305a85;
  --olive-500: #43709b;
  --olive-300: #86a3bd;

  /* Alfa türetmek için RGB üçlüleri. Kural: alfalı lacivert/karamel değeri ASLA elle
     rgba(...) yazılmaz — `rgb(var(--x-rgb) / .2)` ile buradan türetilir. Palet üç kez
     değişti (zeytin→lacivert, brass→Vantara karameli) ve her seferinde token'lar
     güncellenip literaller geride kaldı; tek kaynak bunu kalıcı olarak imkânsız kılar. */
  --olive-800-rgb: 22 50 79;
  --olive-950-rgb: 13 30 48;
  --shadow-rgb: 18 41 63;
  --cream-rgb: 242 238 232;
  --paper-rgb: 249 247 243;

  /* karamel accent (Vantara tonu) */
  --brass: #b68a5e;
  --brass-rgb: 182 138 94;
  --brass-600-rgb: 139 101 50;
  /* metin taşıyan karamel. bir kademe açığı idi: beyaz metinle 4.42:1, krem üstünde eyebrow olarak
     3.86:1 — ikisi de AA 4.5:1 altındaydı. Ton korunarak %10 koyulatıldı → beyaz 5.26:1,
     --paper 4.90:1, krem üstünde 4.59:1. --brass (#b68a5e) DEĞİŞMEDİ: büyük dolgu ve
     dekoratif aksan olarak kalır, ama üstüne açık metin KONMAZ (2.93:1). */
  --brass-600: #8b6532;
  --brass-300: #d3b78e;
  --brass-100: #ece0cd;

  /* ---- mürekkep ----
     Palet üç kez göç etti (zeytin→lacivert→Vantara karameli) ama mürekkep rampası
     HİÇ göç etmedi: bu değerler zeytin devrinden kalmaydı ve OKLCH hue'ları 89–100°
     yani sarı-yeşil (haki) idi. Çapa ise 250° (lacivert). Alan ölçümü sorunun
     büyüklüğünü gösterdi: yalnız --muted, sayfada render edilen tüm metnin
     %20.1'iydi — yani okunan her paragraf, terk edilmiş bir paletin rengiyle
     yazılıydı. Haki mürekkep + bej zemin, "premium" değil "tozlu" okunur.
     Rampanın tamamı çapanın hue'suna (250°) taşındı.

     Ayrıca rol ayrımı yapıldı: --muted iki iş birden yapıyordu — hem gövde
     paragrafı hem mikro-meta. Paragraf L=52'de yıkanık kalıyordu (sayfanın "haze"
     hissinin asıl kaynağı). Paragraflar kendi mürekkebine (--ink-2) taşındı;
     --muted yalnızca künye/etiket/caption rolünde kaldı. */
  --ink: #14202d;      /* gövde varsayılanı — krem üstünde 14.26:1 (eski 13.77) */
  --ink-2: #3c4957;    /* PARAGRAF mürekkebi — krem üstünde 7.96:1 (eski 4.72) */
  --muted: #606a75;    /* künye/etiket/caption — 4.76:1 (eski 4.72, eşdeğer) */
  /* dekoratif ikon/caret. Eski zeytin-haki tonu krem üstünde 2.93:1 idi — WCAG 1.4.11'in
     grafik nesne eşiği 3:1'in altında. Ton göçüyle birlikte açıklık da bir kademe
     düşürüldü: 3.15:1 (kart üstünde 3.56:1). */
  --muted-2: #7e8791;
  --line: rgb(var(--olive-800-rgb) / 0.14);
  --line-2: rgb(var(--olive-800-rgb) / 0.07);
  /* Kontrol sınırı. --line dekoratif ayraç için doğru ama BUTON kenarı için değil:
     beyaz üstünde 1.30:1 verir, WCAG 1.4.11 kontrolü tanımlayan sınır için 3:1 ister.
     0.56 alfa ölçülerek seçildi: en kötü zeminde (krem) 3.13:1, beyaz kartta 3.24:1.
     Ghost butonlar, burger ve akordeon ikonu bunu kullanır. */
  --line-control: rgb(var(--olive-800-rgb) / 0.56);
  /* koyu bölümlerdeki kontrol sınırı — açık kâğıt tonundan türer (navy-800'de 4.04:1).
     Alfa Türetme Kuralı: krem üçlüsü buraya elle yazılmaz, --cream-rgb'den gelir. */
  --line-control-dark: rgb(var(--cream-rgb) / 0.5);

  /* Odak halkası YÜZEYE DUYARLI tek token. Tek sabit renk iki dünyaya yetmez:
     --brass-600 açık zeminlerde 4.58–5.16:1 ama lacivert üstünde 2.50:1'e düşer;
     --brass-300 tersi. Koyu bölümler bu değişkeni kendi scope'unda ezer (aşağıda),
     böylece her odak halkası bulunduğu yüzeyde 3:1'i geçer.
     NOT: --brass (#b68a5e) halka olarak KULLANILMAZ — krem üstünde 2.70:1 verir.
     "İki Karamel Kuralı" yalnız metni değil grafik nesneleri de kapsar. */
  --focus-ring: var(--brass-600);

  /* durum renkleri (etiket) */
  /* Satılık rozeti + favori kalbi. Eski terrakota sayfanın EN yüksek kromalı rengiydi
     (C=0.111 > --brass C=0.080): bir servis etiketi marka accent'ini bastırıyordu,
     üstelik H=49° ile karamelin (72°) akrabası bile değildi — beşinci bir ton ailesi.
     Karamel ailesine katıldı; sayfada artık tek yüksek kroma accent'in kendisi.
     Beyaz metinle 5.24:1 (eski 4.83). */
  --sale: var(--brass-600);
  --rent: #305a85;      /* kiralık — lacivert */
  /* WhatsApp — birincil dönüşüm rengi. bir kademe açık yeşil beyaz etiketle 4.36:1 idi (AA altı),
     bir kademe koyulaştırıldı: 5.56:1. Literal olarak hiçbir yere yazılmaz. */
  --wa: #1a7748;
  --wa-600: #15613b;

  /* ---- panel mockup alt-paleti ----
     Panel mockup'ı bir YAZILIM ekran görüntüsünü temsil eder; markanın lacivert/karamel
     dilinde DEĞİL, kasıtlı olarak nötr yazılım estetiğindedir (brief kararı #9). Ama
     "nötr" zeytin demek değildi: burada eski zeytin paletinden kalma
     paletinden kalma değerler duruyordu ve mockup'a kirli yeşilimsi bir ton veriyordu.
     Nötr slate rampasına taşındı; ana içerik hiyerarşisinden ayrı bir alt-sistem olarak
     kalır ama artık isimli ve tek noktadan uyarlanabilir. */
  --mock-ink: #23272e;        /* mockup mürekkebi + koyu yüzeyler (nötr slate-siyah) */
  --mock-ink-2: #2f333b;      /* mockup gövde metni */
  --mock-muted: #6b7078;      /* mockup ikincil metin — beyazda 4.83:1 (AA) */
  --mock-surface: #f7f7f8;    /* uygulama gövdesi */
  --mock-surface-2: #f1f1f3;  /* tarayıcı çerçevesi */
  --mock-bar: #e6e6e9;        /* tarayıcı adres çubuğu şeridi */
  --mock-dot: #c6c6cb;        /* pencere noktaları */
  --mock-chip-bg: #eceef0;    /* portal senkron çipi zemini */
  --mock-chip-ink: #4a5058;   /* portal senkron çipi metni — çip üstünde 6.53:1 */
  --mock-line: rgb(35 39 46 / 0.09);
  --mock-ok: #14714a;         /* senkron/artış göstergesi — beyazda 5.29:1 (AA) */
  --mock-ok-300: #7fd7a3;     /* koyu mockup yüzeyinde yeşil etiket */

  /* efekt — 2026 yumuşak gölge dili (Vantara kalibrasyonu: maks ~0.16 opaklık,
     geniş blur + negatif spread, ton = lacivert mürekkep — siyah/zeytin değil) */
  --shadow-sm: 0 1px 2px rgb(var(--shadow-rgb) / 0.04), 0 2px 8px -2px rgb(var(--shadow-rgb) / 0.05);
  --shadow: 0 2px 6px -2px rgb(var(--shadow-rgb) / 0.05), 0 18px 36px -18px rgb(var(--shadow-rgb) / 0.13);
  --shadow-lg: 0 24px 50px -20px rgb(var(--shadow-rgb) / 0.16), 0 4px 12px -8px rgb(var(--shadow-rgb) / 0.06);
  /* gölge mürekkebi karamelin KENDİ tonundan türer; eskiden #a67c3d (iki nesil önceki
     brass-600) elle yazılıydı ve palet değişince geride kalmıştı */
  --shadow-brass: 0 14px 30px -14px rgb(var(--brass-600-rgb) / 0.30);

  --r-xs: 8px;
  --r-sm: 12px;
  --r-md: 18px;
  --r-lg: 26px;
  --r-xl: 34px;
  /* İkon çipi yarıçapı — ORANSAL. Sitedeki altı kare ikon çipinin her biri elle
     yazılmış, birbirinden farklı bir yarıçap taşıyordu; ölçüldüğünde hepsinin kenar
     uzunluğunun yaklaşık %28'i olduğu görüldü — yani sabit bir sayı değil, gizli bir
     ORAN kuralıydı. Yüzde yarıçap kutuya göre hesaplandığından tek token hepsini
     piksel piksel yeniden üretir ve yeni bir çip boyutu otomatik doğru olur. */
  --r-chip: 28%;
  --mock-r-chip: 5px; /* panel mockup'ının kendi mikro çipi — alt-sisteme ait */

  --wrap: 1200px;
  --gutter: clamp(20px, 5vw, 56px);
  --nav-h: 80px;

  --ease: cubic-bezier(0.22, 1, 0.36, 1);
  --ease-out: cubic-bezier(0.16, 1, 0.3, 1);

  --font-display: "Fraunces", Georgia, "Times New Roman", serif;
  --font-body: "Hanken Grotesk", -apple-system, BlinkMacSystemFont, sans-serif;

  /* destek tipografi rampası — display/headline/title/body üstündeki roller.
     Önceden aynı işi gören 6+ birbirine yakın rastgele değer (ör. etiketler
     0.6–0.76rem arası dağınıktı) tek isimli role indirgendi; kart/nav/form/footer
     genelinde AYNI rol AYNI boyutu kullanır. */
  --fs-label: 0.75rem;   /* büyük harf + tracking mikro etiket: eyebrow, rozet, footer başlığı, form etiketi */
  --fs-caption: 0.86rem; /* ikincil/meta bilgi: konum, puan, alt-etiket, künye satırı */
  --fs-small: 0.94rem;   /* gövdeye yakın destek metni: nav linki, buton-benzeri kontrol, bölüm paragrafı */
  --fs-lead: 1.2rem;     /* bölüm/kart giriş paragrafı — gövdenin (17px) belirgin üstünde */
  --fs-mock-2xs: 0.64rem; /* panel mockup'ı: en küçük rozet/altyazı */
  --fs-mock-xs: 0.72rem;  /* panel mockup'ı: küçük etiket/metin */
  --fs-caption-tight: 0.8rem; /* topband mobilde tek satıra sığsın diye bir kademe kısık */
  /* buton bileşeninin kendi kasıtlı iki adımlı ölçeği — destek rampasına dahil değil */
  --fs-button: 0.98rem;
  --fs-button-sm: 0.9rem;

  /* ---- display-rakam katmanı (--fs-num-*) ----
     "Serif Rakam Kuralı" fiyatların ve sayısal vurguların display fontta yazılmasını
     söylüyordu ama ÖLÇÜLERİNİ hiç isimlendirmemişti: h1/h2/h3'ün altında, gövdenin
     üstünde kalan bu katmanda 1.24 / 1.4 (3 kez) / 1.5 (3 kez) / 2 / 3.4rem değerleri
     tek tek elle yazılıydı. Aynı işi gören değerler tek token'a indirildi; ölçüler
     korundu (görsel değişiklik yok), yalnız isimlendirildi. */
  --fs-body: 1.0625rem;  /* gövde ile aynı ölçü (17px) — küçük başlık/değer rolleri */
  --fs-num-xs: 1.2rem;   /* SSS sorusu, filtre sayacı, mockup başlığı */
  --fs-num-sm: 1.24rem;  /* kart başlığı, danışman adı */
  --fs-num: 1.4rem;      /* ilan fiyatı, italik imza, mockup istatistiği */
  --fs-num-lg: 1.5rem;   /* wordmark, mobil menü linki, danışman imzası */
  --fs-num-xl: 2rem;     /* rozet rakamı */
  --fs-num-2xl: 3.4rem;  /* süreç adım numarası */
  --fs-quote: 3rem;      /* dekoratif tipografik tırnak (aria-hidden) */
  /* akışkan display roller — bölüm/sayfa başına özel, her biri tek kullanım */
  --fs-stat: clamp(2rem, 3.4vw, 2.9rem);        /* güven bandı istatistiği */
  --fs-detail-h1: clamp(2rem, 4vw, 3.1rem);     /* ilan-detay sayfa başlığı */
  --fs-detail-price: clamp(2rem, 4vw, 2.9rem);  /* ilan-detay fiyatı */
  --fs-detail-h2: clamp(1.5rem, 2.6vw, 2rem);   /* ilan-detay bölüm başlığı */
}

/* ---------- reset ---------- */
*, *::before, *::after { box-sizing: border-box; }
* { margin: 0; padding: 0; }
/* overflow-x: clip → yatay taşmayı kırpar ama (hidden'ın aksine) kaydırma-konteyneri
   oluşturmaz; böylece sticky nav düzgün sabitlenir (hidden position:sticky'yi kırıyordu) */
html { -webkit-text-size-adjust: 100%; scroll-behavior: smooth; overflow-x: clip; }
/* Hareket hassasiyeti: amaç hareketi yok saymak DEĞİL, yer değiştiren/ölçek
   değiştiren hareketi kaldırıp durum değişimi geri bildirimini KORUMAKtır.
   Önceden burada global bir `transition-duration: 0.001ms !important` vardı; kaydırma
   ve ölçekleme hareketini gerçekten kaldırıyordu ama aynı anda hover, odak, akordeon
   ve filtre geri bildirimini de siliyordu — kullanıcı neyin değiştiğini göremiyordu.
   Şimdi: yer değiştirme/ölçek/otomatik hareket gider, renk ve opaklık geçişleri
   (yani "bir şey değişti" bilgisi) kısaltılmış süreyle kalır. */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  /* imza hareketleri ve süslü geçişler tamamen durur */
  .hero-media { animation: none !important; }
  .nav .wrap::after { transition: none !important; }
  /* .reveal: aşağı kaydırarak girmek yerine yerinde belirir (hiyerarşi korunur) */
  .reveal { transform: none !important; transition: opacity 0.2s linear !important; }
  /* transform tabanlı tüm mikro-hareketler nötrlenir — kart/buton kalkması, ok kayması,
     görsel yakınlaşması, carousel kayması. Durum yine renkle bildirilir. */
  .card:hover, .svc:hover, .btn:hover, .card-fav:hover, .card-cta:hover,
  .hs-submit button:hover, .card:hover .card-media img, .btn:hover svg,
  .svc:hover .svc-more svg, .g-item:hover img {
    transform: none !important;
  }
  .tst-track { transition: none !important; }
  /* renk/opaklık/gölge geri bildirimi KALIR, yalnız kısalır */
  * { transition-duration: 0.12s !important; animation-duration: 0.001ms !important; animation-iteration-count: 1 !important; }
  /* akordeon yüksekliği anında açılır (yüksekliği canlandırmak zaten hareket) */
  .qa .a { transition: none !important; }
  /* mobil çekmece: 343px'lik kayma yer değiştirmenin ta kendisi → panel kaymadan
     belirir. Ayrıca yukarıdaki `*` kuralı `transition-duration`'ı visibility'ye de
     yazıyor; ayrık (discrete) bir özellik süre alınca %50'de döndüğü için panel
     AÇILIŞTA ~60ms `hidden` kalıyor ve JS'in `focus()` çağrısı sessizce düşüyordu.
     Süre burada açıkça sıfırlanır (aynı sıfır-süre + gecikme deseni). */
  .mobile-menu {
    transform: none !important; opacity: 0;
    transition: opacity 0.12s linear, visibility 0s linear 0.12s !important;
  }
  .nav.open ~ .mobile-menu, body.menu-open .mobile-menu {
    opacity: 1;
    transition: opacity 0.12s linear, visibility 0s linear 0s !important;
  }
  .menu-scrim { transition: opacity 0.12s linear, visibility 0s linear 0.12s !important; }
  body.menu-open .menu-scrim { transition: opacity 0.12s linear, visibility 0s linear 0s !important; }
  /* sticky bar: yükselme (yer değiştirme) kalkar, durum bildirimi opaklıkla kalır;
     visibility yine açıkça sıfır süreye çekilir (yukarıdaki `*` kuralı ona da süre yazar) */
  .sticky-bar {
    transform: none !important;
    transition: opacity 0.12s linear, visibility 0s linear 0.12s !important;
  }
  .sticky-bar.is-visible { transition: opacity 0.12s linear, visibility 0s linear 0s !important; }
}
body {
  font-family: var(--font-body);
  background: var(--cream);
  color: var(--ink);
  line-height: 1.6;
  font-size: 17px;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: clip;
}
img { display: block; max-width: 100%; height: auto; }
.svg-defs { position: absolute; width: 0; height: 0; overflow: hidden; }
/* yalnız ekran okuyucu için — görsel olarak kısa kalan bir etiketi bağlamıyla
   tamamlar (ör. altı hizmet kartındaki "Bilgi alın" hangi hizmet olduğunu söyler) */
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip-path: inset(50%); white-space: nowrap; border: 0;
}
a { color: inherit; text-decoration: none; }
button { font: inherit; cursor: pointer; border: none; background: none; color: inherit; }
input, select { font: inherit; color: inherit; }
::selection { background: var(--brass-100); color: var(--olive-900); }

/* ---------- atmosfer: grain — KALDIRILDI ----------
   Burada `body::before` ile tam ekran sabit (position:fixed) bir SVG gürültü katmanı
   vardı. Ölçüldü: `z-index: 1`, ama `section { z-index: 2 }` — yani sayfanın TÜM
   bölümlerinin ALTINDA kalıyordu ve yalnız hero ile footer üzerinde görünüyordu.
   Yani ne tutarlı bir doku sistemiydi ne de görünmezliği bedavaydı: her karede
   yeniden birleştirilen tam viewport'luk bir compositing katmanının maliyetini
   ödüyorduk. İki seçenek vardı — z-index'i yükseltip her yere yaymak (fotoğrafları
   ve kartları da bulandırırdı) ya da kaldırmak. Kâğıt hissini zaten
   krem → paper → beyaz ton merdiveni taşıyor; katman kaldırıldı.
   Gerçek etki ölçüsü: 0.4 opaklık × 0.035 gürültü ≈ %1.4 — görsel kayıp yok. */

/* ---------- typografi ---------- */
h1, h2, h3, h4 {
  font-family: var(--font-display);
  font-weight: 430;
  line-height: 1.02;
  letter-spacing: -0.015em;
  font-optical-sizing: auto;
  color: var(--olive-900);
}
h1 { font-size: clamp(2.9rem, 7vw, 5.6rem); }
h2 { font-size: clamp(2.1rem, 4.4vw, 3.5rem); }
h3 { font-size: clamp(1.3rem, 2vw, 1.65rem); font-weight: 500; letter-spacing: -0.01em; }
h1 em, h2 em, h3 em {
  font-style: italic;
  font-weight: 380;
  color: var(--brass-600);
}
p { text-wrap: pretty; }

.eyebrow {
  font-family: var(--font-body);
  font-size: var(--fs-label);
  font-weight: 600;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--brass-600);
  display: inline-flex; align-items: center; gap: 0.6em;
}
.eyebrow::before {
  content: ""; width: 26px; height: 1px; background: currentColor; opacity: 0.6;
}
.eyebrow.center::after {
  content: ""; width: 26px; height: 1px; background: currentColor; opacity: 0.6;
}

/* ---------- layout ---------- */
/* Section zemin ritmi: beyaz (card) ↔ krem (cream) kararlı değişim + koyu lacivert
   "statement" bölümler (valuation → testimonials → pitch → footer, giderek koyulaşır).
   Aynı tonun mikro-koyusuyla bant denemesi YAPMA — kirli bej okunuyor. */
.wrap { width: 100%; max-width: var(--wrap); margin-inline: auto; padding-inline: var(--gutter); }
.wrap-wide { max-width: 1360px; }
section { position: relative; z-index: 2; }
.section-pad { padding-block: clamp(72px, 10vw, 140px); }
.sec-head { max-width: 640px; }
.sec-head.center { max-width: 720px; margin-inline: auto; text-align: center; }
.sec-head h2 { margin-top: 18px; }
.sec-head p { margin-top: 18px; color: var(--ink-2); font-size: var(--fs-lead); }
/* bölüm başlığının yanındaki kısa açıklama sütunu (eskiden inline style'daydı) */
.sec-note { color: var(--ink-2); max-width: 34ch; }
/* ikon boyutu inline `style="width:12px;height:12px"` ile yazılıyordu (5 yer) */
.ic-xs { width: 12px; height: 12px; }
.ic-sm { width: 18px; height: 18px; }
/* yalnız üst dolguyu ezen bölümler — inline padding override yerine */
.pad-top-0 { padding-top: 0; }
.pad-bottom-0 { padding-bottom: 0; }
.section-pad-tight { padding-block: clamp(40px, 5vw, 64px) clamp(72px, 10vw, 140px); }
.mt-0 { margin-top: 0; }

/* ---------- buttons ---------- */
.btn {
  display: inline-flex; align-items: center; gap: 0.55em;
  padding: 15px 26px;
  border-radius: 100px;
  font-weight: 600; font-size: var(--fs-button);
  letter-spacing: -0.005em;
  transition: transform 0.4s var(--ease), box-shadow 0.4s var(--ease), background 0.3s, color 0.3s;
  white-space: nowrap;
}
.btn svg { width: 18px; height: 18px; transition: transform 0.4s var(--ease); }
.btn-primary {
  background: var(--olive-800); color: var(--paper);
  box-shadow: var(--shadow);
}
.btn-primary:hover { background: var(--olive-900); transform: translateY(-2px); box-shadow: var(--shadow-lg); }
.btn-primary:hover svg { transform: translateX(4px); }
/* "İki Karamel Kuralı": açık metin taşıyan zemin daima --brass-600'dür. Gradyanın açık ucu
   (--brass) beyaz metinle 2.93:1 veriyordu → düz --brass-600 (5.26:1). Hover dili renk
   değiştirmek değil kalkmaktır, o yüzden gradyanın kaybı görsel bir kayıp değil. */
.btn-brass {
  background: var(--brass-600);
  color: #fff; box-shadow: var(--shadow-brass);
}
.btn-brass:hover { transform: translateY(-2px); box-shadow: 0 18px 38px -16px rgb(var(--brass-600-rgb) / 0.38); }
.btn-brass:hover svg { transform: translateX(4px); }
/* Sınır --line (1.30:1) değil --line-control (3.13:1): ghost butonun kenarı onu
   "buton" yapan tek işaret, WCAG 1.4.11 gereği 3:1 ister. En kritik örnek
   ilan-detay'daki tam genişlikli "Hemen Ara" — beyaz gövdede kenarı görünmüyordu. */
.btn-ghost {
  background: transparent; color: var(--olive-800);
  box-shadow: inset 0 0 0 1.5px var(--line-control);
}
.btn-ghost:hover { box-shadow: inset 0 0 0 1.5px var(--olive-700); background: rgb(var(--olive-800-rgb) / 0.05); }
/* koyu bölümde ghost — eskiden inline style ile rgb(var(--cream-rgb) / 0.25) yazılıydı (2.10:1) */
.btn-ghost.on-dark { color: var(--paper); box-shadow: inset 0 0 0 1.5px var(--line-control-dark); }
.btn-ghost.on-dark:hover { box-shadow: inset 0 0 0 1.5px var(--paper-2); background: rgb(var(--cream-rgb) / 0.08); }
.btn-wa { background: var(--wa); color: #fff; box-shadow: 0 10px 24px -14px rgb(var(--shadow-rgb) / 0.42); }
.btn-wa:hover { background: var(--wa-600); transform: translateY(-2px); }
.btn-block { width: 100%; justify-content: center; }
.btn-sm { padding: 11px 18px; font-size: var(--fs-button-sm); }

/* ---------- erişilebilirlik: tutarlı klavye odak halkası ----------
   Öğe listesi yerine :focus-visible'ı tek noktada TÜM interaktif öğelere veririz —
   eski allowlist yaklaşımı yeni bir buton eklendiğinde sessizce halkasız bırakıyordu
   (.tb-close, .mobile-menu a, .breadcrumb a, .g-item, .svc-more hepsi listede yoktu). */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible,
summary:focus-visible,
[tabindex]:focus-visible {
  outline: 2px solid var(--focus-ring);
  outline-offset: 3px;
  border-radius: var(--r-xs);
}
/* Koyu bölümler halka rengini kendi scope'unda çevirir (custom property kalıtımı):
   lacivert üstünde brass-600 2.50:1'e düşer, brass-300 6.8–8.8:1 verir. */
.valuation, .testimonials, .pitch, .footer, .faq-aside, .svc.svc-wide, .mock-side, .mock-lead {
  --focus-ring: var(--brass-300);
}
/* kapsül butonlar halkayı kendi siluetinde taşır (dikdörtgen halka kapsülü bozuyordu) */
.btn:focus-visible, .fb-btn:focus-visible, .hs-tab:focus-visible,
.card-fav:focus-visible, .card-cta:focus-visible, .tst-btn:focus-visible,
.f-social a:focus-visible, .tb-close:focus-visible, .pl-chip:focus-visible {
  border-radius: 100px;
}
.hs-submit button:focus-visible, .burger:focus-visible { border-radius: var(--r-sm); }
/* atlama linki — klavye kullanıcısı topband + nav + menüyü (≈15 durak) geçmek zorunda
   kalmasın. Odaklanmadan görünmez, odakta gerçek bir kapsül buton olur. */
.skip-link {
  position: fixed; top: 10px; left: 50%; transform: translate(-50%, -160%);
  z-index: 100; padding: 12px 22px; border-radius: 100px;
  background: var(--olive-900); color: var(--paper);
  font-size: var(--fs-small); font-weight: 600;
  box-shadow: var(--shadow-lg);
  transition: transform 0.25s var(--ease);
}
.skip-link:focus-visible { transform: translate(-50%, 0); }

/* ============================================================
   META ÜST BAND
   ============================================================ */
.topband {
  position: relative; z-index: 60;
  background: var(--olive-900); color: var(--paper-2);
  font-size: var(--fs-caption);
}
.topband .wrap { display: flex; align-items: center; gap: 16px; padding-block: 10px; }
.topband .tb-txt { flex: 1; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.topband .tb-tag {
  font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--olive-900); background: var(--brass-300);
  padding: 3px 9px; border-radius: 100px;
}
.topband a.tb-link { display: inline-block; padding-block: 3px; color: var(--brass-300); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
.topband a.tb-link:hover { color: #fff; }
.topband .tb-close {
  width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center;
  color: var(--paper-2); opacity: 0.7; transition: 0.25s; flex-shrink: 0;
}
.topband .tb-close:hover { opacity: 1; background: rgba(255,255,255,0.1); }
body.band-closed .topband { display: none; }

/* ------------------------------------------------------------
   REKLAM-FARKINDA BAND (Web Atölye satış katmanı — şablon satılırken silinir)
   ------------------------------------------------------------
   Reklamdan gelen ziyaretçi EMLAK OFİSİ SAHİBİdir, sayfanın kendisi ise ev
   arayana konuşur ("Aradığınız gayrimenkul burada"). Çerçeveyi yalnız üstteki
   sade band taşıyordu ve o cümle ≤560px'te gizliydi (aşağıdaki mobil kural) —
   yani mesaj eşleşmesi tam da trafiğin indiği yerde kopuyordu. Bu band o
   boşluğu kapatır ve normal ziyaretçiye HİÇ görünmez.

   `html.ad-traffic` sınıfını <head>'deki senkron betik koyar (defer/altta
   çalışsaydı band boyamadan sonra eklenip hero'yu aşağı zıplatırdı).
   İki band üst üste gürültü olduğu için sade band bu modda gizlenir. */
.wa-band { display: none; }
html.ad-traffic .wa-band { display: block; }
html.ad-traffic .topband { display: none; }

.wa-band {
  position: relative; z-index: 60;
  background: var(--olive-950);
  border-bottom: 1px solid rgb(var(--brass-600-rgb) / 0.45);
}
/* koyu bölümlerin brass radial imzasının kısık hali: band "ayrı bir katman"
   olduğunu renkle söyler, bağırmadan */
.wa-band::before {
  content: ''; position: absolute; inset: 0; pointer-events: none;
  background: radial-gradient(120% 220% at 10% 50%, rgb(var(--brass-600-rgb) / 0.22), transparent 62%);
}
.wa-band .wrap {
  position: relative; z-index: 1;
  display: flex; align-items: center; gap: 16px; padding-block: 12px;
}
.wa-band .wb-txt {
  flex: 1; min-width: 0;
  font-size: var(--fs-caption); line-height: 1.45; color: var(--paper);
}
.wa-band .wb-txt b { font-weight: 600; }
/* Serif Rakam Kuralı: fiyat display fontta yazılır. Bandın tek editoryal notu bu —
   reklamın vaat ettiği rakam, sitenin ilan fiyatlarıyla aynı jestle. Desen `.fb-count b`
   ile aynı: küçük metnin içinde --fs-num-xs boyunda Fraunces. */
.wa-band .wb-price { font-family: var(--font-display); font-size: var(--fs-num-xs); letter-spacing: -0.01em; }
.wa-band .wb-long { color: var(--olive-300); } /* 6.41:1 — ikincil cümle, AA (ölçüldü) */
.wa-band .wb-tag {
  flex-shrink: 0;
  font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--olive-900); background: var(--brass-300);
  padding: 3px 9px; border-radius: 100px;
}
/* CTA .btn.btn-brass.btn-sm'i yeniden kullanır ("İki Karamel Kuralı" gereği beyaz metin
   --brass-600 üstünde kalsın). Yalnız dolgu kısılır — buton metni kendi iki adımlı
   ölçeğinde (--fs-button-sm) kalır; "Aynı Rol Aynı Token Kuralı" caption token'ını
   butona taşımayı yasaklıyor. */
.wa-band .btn-sm { padding: 9px 16px; }
.wa-band .wb-close {
  width: 32px; height: 32px; border-radius: 50%; display: grid; place-items: center;
  color: var(--paper-2); opacity: 0.65; transition: 0.25s; flex-shrink: 0;
}
.wa-band .wb-close:hover { opacity: 1; background: rgb(var(--paper-rgb) / 0.14); }
.wa-band .wb-close svg { width: 16px; height: 16px; }
/* Koyu bölümlerin odak halkası kuralı (yukarıdaki `.valuation, .testimonials, …`
   listesi) iki meta bandı atlamıştı: ikisi de koyu lacivert ama halkayı --brass-600
   ile çiziyordu (band zemininde 3.22:1 — 1.4.11'i kıl payı geçer, sistemin koyu
   yüzeylerdeki 6.8–8.8:1 standardının çok altı). Kapatma butonu daire olduğu için
   kapsül halkası listesine de girer. */
.topband, .wa-band { --focus-ring: var(--brass-300); }
.wa-band .wb-close:focus-visible { border-radius: 100px; }
body.wa-band-closed .wa-band { display: none; }

/* ============================================================
   NAV
   ============================================================ */
/* floating "liquid glass" pill (2026): üstten boşluklu, sticky, yuvarlak;
   katmanlı krem cam + üst specular parıltı + hover'da geçen sıvı ışık huzmesi.
   backdrop blur/saturate/brightness arkaplanı canlandırır; metin ön planda net kalır. */
.nav {
  position: sticky; top: 0; z-index: 50;
  padding-top: clamp(12px, 1.6vw, 20px);
  /* floating pill hiçbir genişlikte ekran kenarına yapışmasın: iç .wrap'ın
     gutter'ı pill'in kendi padding'iyle ezildiğinden dış boşluğu nav taşır
     (1200px cap'in üstünde margin:auto zaten devrede, bu değer görünmez olur) */
  padding-inline: clamp(14px, 2.5vw, 32px);
  pointer-events: none; /* şeffaf boşluk tıklanabilir olmasın; yalnız pill aktif */
}
.nav .wrap {
  pointer-events: auto;
  position: relative;
  /* ⛔ Pill'in genişliği --wrap'tir; buraya kendi max-width'i YAZILMAZ. Pill'in
     kenarı sayfa içerik sütununun kenarıyla aynı dikey çizgide durur — logo
     hizasını taşıyan şey budur. Pill bir kez 1320px'e genişletildi (menü
     sığmıyordu) ve logo içerik sütununun 91px dışına çıktı: başlık "kenara
     itilmiş" göründü. Menü sığmıyorsa çözüm pill'i şişirmek değil, kalem
     eksiltmektir — yer kararı .nav--burger ölçümünde yaşar. */
  display: flex; align-items: center; gap: 24px;
  padding: 11px 14px 11px 24px;
  border-radius: 100px;
  /* Vantara cam zemini: krem değil SAF BEYAZ (ölçülen: rgba(255,255,255,0.4));
     saturate düşük tutulur — yüksek saturate arkadaki kremi pompalayıp camı sarartıyordu */
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0) 58%),
    linear-gradient(180deg, rgba(255, 255, 255, 0.56), rgba(255, 255, 255, 0.4));
  backdrop-filter: saturate(140%) brightness(1.08) blur(18px);
  -webkit-backdrop-filter: saturate(140%) brightness(1.08) blur(18px);
  border: 1px solid rgba(255, 255, 255, 0.62);
  /* Vantara dili: cam kendini gölgeyle değil blur+kenarlıkla ayırır —
     fısıltı düzeyinde tek dış gölge + beyaz iç parıltı (karanlık iç gölge YOK) */
  box-shadow:
    0 6px 24px -16px rgb(var(--shadow-rgb) / 0.18),
    0 1px 2px rgb(var(--shadow-rgb) / 0.04),
    inset 0 1px 0 rgba(255, 255, 255, 0.75),
    inset 0 2px 18px rgba(255, 255, 255, 0.35);
  transition: background 0.5s var(--ease), box-shadow 0.5s var(--ease), border-color 0.5s var(--ease);
}
/* nav içeriği cam yüzeyin (::before/::after) üstünde kalsın */
.nav .wrap > * { position: relative; z-index: 2; }
/* üst specular parıltı — camın yüzey ışığı */
.nav .wrap::before {
  content: ""; position: absolute; inset: 0; z-index: 1;
  border-radius: inherit; pointer-events: none;
  background: linear-gradient(180deg, rgba(255, 255, 255, 0.6) 0%, rgba(255, 255, 255, 0) 42%);
  opacity: 0.85;
}
/* hover'da yüzeyden geçen sıvı ışık huzmesi (background-position ile — kırpma gerekmez) */
.nav .wrap::after {
  content: ""; position: absolute; inset: 0; z-index: 1;
  border-radius: inherit; pointer-events: none;
  background: linear-gradient(100deg, transparent 30%, rgba(255, 255, 255, 0.45) 50%, transparent 70%);
  background-size: 250% 100%; background-position: 190% 0; opacity: 0;
  transition: background-position 1.1s var(--ease), opacity 0.5s var(--ease);
}
@media (hover: hover) {
  .nav .wrap:hover::after { background-position: -50% 0; opacity: 1; }
}
/* gerçek kırılma (feDisplacementMap): yalnız Chromium — JS motor tespitiyle
   html.glass-refract eklenir (Safari/Firefox url()'lu backdrop-filter'ı düşürüp
   camı tamamen kaybettirdiği için @supports yerine JS şart) */
html.glass-refract .nav .wrap {
  backdrop-filter: url(#liquid-lens) saturate(140%) brightness(1.08) blur(14px);
  -webkit-backdrop-filter: url(#liquid-lens) saturate(140%) brightness(1.08) blur(14px);
}
.nav.scrolled .wrap {
  background:
    linear-gradient(180deg, rgba(255, 255, 255, 0.44), rgba(255, 255, 255, 0) 58%),
    linear-gradient(180deg, rgba(255, 255, 255, 0.84), rgba(255, 255, 255, 0.72));
  border-color: rgba(255, 255, 255, 0.7);
  box-shadow:
    0 10px 30px -18px rgb(var(--shadow-rgb) / 0.22),
    0 1px 3px rgb(var(--shadow-rgb) / 0.05),
    inset 0 1px 0 rgba(255, 255, 255, 0.8),
    inset 0 2px 20px rgba(255, 255, 255, 0.45);
}
.brand { display: inline-flex; align-items: center; gap: 11px; font-family: var(--font-display); font-size: var(--fs-num-lg); font-weight: 500; letter-spacing: -0.02em; color: var(--olive-900); }
.brand .glyph { width: 30px; height: 30px; color: var(--brass); flex-shrink: 0; }
.brand .glyph svg { width: 100%; height: 100%; }
/* Marka > Logo dolu: görsel TAM RENKLİ basılır, yanında yazı yoktur
   (KARARLAR §14). Loca demoda alan boş → gömülü SVG + yazı; bu kurallar
   hiç eşleşmez. */
.brand--logo { gap: 0; }
.brand--logo img { display: block; width: auto; height: 56px; transition: height 0.5s var(--ease); }
/* 56px logo pill'i şişirmesin: logo varken dikey iç boşluk kısılır */
.nav .wrap:has(.brand--logo) { padding-top: 6px; padding-bottom: 6px; }
.nav.scrolled .brand--logo img { height: 46px; }
.mm-head .brand--logo img { height: 44px; }
/* koyu altbilgide siyah logo kaybolmasın: arkasına açık zemin şeridi */
.footer .brand--logo { background: var(--paper); border-radius: var(--r-sm); padding: 12px 18px; }
/* --muted-2 krem/cam üstünde 2.93:1 veriyordu (AA 4.5 altı) — markanın yanındaki
   "GAYRİMENKUL" alt-etiketi sessiz kalmalı ama okunur olmalı: --muted 5.31:1. */
.brand small { font-family: var(--font-body); font-size: var(--fs-label); font-weight: 600; letter-spacing: 0.22em; text-transform: uppercase; color: var(--muted); align-self: flex-end; margin-bottom: 6px; }
/* koyu footer'da aynı etiket karamel ışığına döner (eskiden inline style'daydı) */
.footer .brand small { color: var(--brass-300); }
.navlinks { display: flex; gap: 4px; margin-left: auto; }
.navlinks a {
  padding: 9px 10px; border-radius: 100px; font-size: var(--fs-small); font-weight: 500; color: var(--olive-700);
  position: relative; transition: color 0.25s, background 0.25s;
}
.navlinks a:hover { color: var(--olive-900); background: rgb(var(--olive-800-rgb) / 0.05); }
.navlinks a.active { color: var(--brass-600); }
.nav-right { display: flex; align-items: center; gap: 12px; margin-left: 8px; }
.nav-phone { display: inline-flex; align-items: center; gap: 7px; font-weight: 600; font-size: var(--fs-small); color: var(--olive-800); }
.nav-phone svg { width: 16px; height: 16px; color: var(--brass); }
.burger { display: none; width: 44px; height: 44px; border-radius: 12px; flex-direction: column; gap: 5px; align-items: center; justify-content: center; box-shadow: inset 0 0 0 1.5px var(--line-control); }
.burger span { width: 18px; height: 1.5px; background: var(--olive-800); transition: 0.3s var(--ease); }
.nav.open .burger span:nth-child(1) { transform: translateY(6.5px) rotate(45deg); }
.nav.open .burger span:nth-child(2) { opacity: 0; }
.nav.open .burger span:nth-child(3) { transform: translateY(-6.5px) rotate(-45deg); }

/* ---------- nav daralması: çubuk asla taşmaz ----------
   .wrap 1200px'te sabittir (max-width), yani geniş monitör yer AÇMAZ — sekiz
   kalemlik menü 1220px ister ve her masaüstü genişliğinde taşar; tarayıcı da
   açığı logoyu ve telefon yazısını sıkıştırarak kapatmaya çalışır.

   Kural tek: çubuk sığmıyorsa yatay linkler açılan menüye devredilir. Karar iki
   katmanlıdır — birincisi app.js'in gerçek ölçümü (`.nav--burger`), çünkü menü
   uzunluğu müşteriden müşteriye değişir ve tek bir piksel eşiği kimseye uymaz.
   JS çalışmazsa (html.nav-olculdu yoksa) kaba eşik devreye girer: 1250px —
   Ferhat kurulumunda altı kalemlik çubuğun sığdığı en dar genişlik (ölçüldü:
   1260'ta 18px pay kalır, 1240'ta taşar). Telefon ve "Bize Ulaşın" bu modda
   KALIR — yer 820px altında zaten ayrıca kısılıyor. */
/* Ölçüm anı: üç blok da sıkışmayı bırakır ve GERÇEK genişliğini söyler.
   Sıkışmış hâli ölçmek ölçümü değersiz kılıyordu — flex blokları daralttığı
   için toplam daima "sığıyor" çıkıyor, çubuk ise görünürde taşıyordu. */
.nav--olcum .wrap { overflow: hidden; }
.nav--olcum .brand,
.nav--olcum .navlinks,
.nav--olcum .nav-right { flex: 0 0 auto; min-width: max-content; }
.nav--olcum .navlinks a { white-space: nowrap; }

.nav--burger .navlinks { display: none; }
.nav--burger .nav-right { margin-left: auto; }
.nav--burger .burger { display: flex; }
@media (max-width: 1250px) {
  html:not(.nav-olculdu) .navlinks { display: none; }
  html:not(.nav-olculdu) .nav-right { margin-left: auto; }
  html:not(.nav-olculdu) .burger { display: flex; }
}

/* mobil menü — modal çekmece
   KRİTİK (ölçümle bulundu): panel z-index 55 iken .nav (z-index 50) onun ALTINDA
   kalıyordu. Panel sağa yaslı ve burger de sağ üstte olduğundan açık menüde burger
   tamamen panelin altına gömülüyordu: `elementFromPoint(burger merkezi)` menünün
   ilk linkini (<a> "Portföy") döndürdü. Yani X'e dokunmak menüyü KAPATMIYOR,
   #ilanlar'a atlıyordu; geriye kalan tek kapatma yolu 47px'lik perde şeridiydi.
   Kapatma artık panelin KENDİ başlığındadır — katman sırasına hiç bağlı değil.

   Kapalıyken yalnız `translateX(100%)` vardı — öğe görünür ve ODAKLANABİLİR
   kalıyordu (masaüstünde tab sırasının 9–14. durağı). `visibility` geçişe dâhil:
   ayrık (discrete) bir özellik olduğu için SÜRE verilmez, gecikme verilir —
   `visibility 0.5s` yazmak onu %50'de çevirir ve açılışta yarım saniye `hidden`
   bırakıp JS'in `focus()` çağrısını sessizce düşürür. JS ayrıca `inert` ekler. */
.mobile-menu {
  position: fixed; inset: 0 0 0 auto; width: min(88vw, 360px); z-index: 65;
  background: var(--paper); box-shadow: var(--shadow-lg);
  transform: translateX(100%); visibility: hidden;
  transition: transform 0.5s var(--ease), visibility 0s linear 0.5s;
  padding: 0 26px calc(clamp(16px, 2.4vh, 28px) + env(safe-area-inset-bottom, 0px));
  display: flex; flex-direction: column;
  /* yatay telefonda (≈390px yükseklik) içerik 585px sürüyordu: WhatsApp CTA'sı
     ekranın dışında kalıp erişilemez oluyordu. Panel kendi içinde kayar; taşma
     zinciri arkadaki sayfaya geçmez. */
  overflow-y: auto; overscroll-behavior: contain;
}
.nav.open ~ .mobile-menu, body.menu-open .mobile-menu {
  transform: translateX(0); visibility: visible;
  transition: transform 0.5s var(--ease), visibility 0s linear 0s;
}
/* panel başlığı: nav pill'i panel örttüğü için marka ve kapatma burada yaşar.
   Panel kaydığında (yatay telefon) başlık yapışır — kapatma düğmesi her kaydırma
   konumunda erişilebilir kalmalı; ölçüldü: sticky olmadan 380px yükseklikte panelin
   dibine inince X ekranın 171px üstünde kalıyordu. Dolgu panelde değil başlıkta:
   yapışkan öğenin altından geçen linkleri kendi krem zemini örtsün. */
.mm-head {
  position: sticky; top: 0; z-index: 1; background: var(--paper);
  padding: clamp(12px, 2.2vh, 20px) 0 clamp(10px, 1.7vh, 14px);
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
}
/* dokunma hedefleri 44px'e tamamlanır: ikisi de yazı yüksekliğinde 32px kalıyordu */
.mm-head .brand { font-size: var(--fs-num-sm); gap: 9px; padding: 6px 0; }
.mm-head .brand .glyph { width: 26px; height: 26px; }
.mm-close {
  flex-shrink: 0; width: 44px; height: 44px; border-radius: 50%;
  display: grid; place-items: center; color: var(--olive-800);
  box-shadow: inset 0 0 0 1.5px var(--line-control);
  transition: background 0.25s var(--ease), color 0.25s var(--ease);
}
.mm-close svg { width: 19px; height: 19px; }
.mm-close:hover { background: rgb(var(--olive-800-rgb) / 0.06); color: var(--olive-900); }
.mm-close:focus-visible { border-radius: 100px; }
.mm-links { display: flex; flex-direction: column; }
/* Panel Ekranla Ölçeklenir Kuralı. Menü sekiz kalem; sabit 24px yazı + 14px dolgu
   satır başına 67px ediyordu ve panel içeriği 835px sürüyordu — 375x812'de 23px,
   375x667'de ~280px ekran dışında kalıyordu, yani menünün tamamını görmek için
   kaydırmak gerekiyordu. Ölçek GENİŞLİĞE değil YÜKSEKLİĞE bağlanır (`vh`): taşan
   eksen dikey olan. Uzun telefonda bugünkü ferah 24px korunur, kısa telefonda
   kendiliğinden ~17px'e iner. Sabit küçültme iki ucu da bozardı: uzun ekranda
   panel cılızlaşır, kısa ekranda taşma yine kalırdı.
   `min-height: 46px` pazarlık dışıdır — ölçek ne kadar inerse insin dokunma hedefi
   44px eşiğinin altına düşmez; alt sınır oradan gelir, `clamp`in tabanından değil. */
.mm-links a {
  display: flex; align-items: center; min-height: 46px;
  padding: clamp(9px, 1.6vh, 14px) 4px;
  font-family: var(--font-display); font-size: clamp(1.05rem, 2.6vh, 1.5rem);
  line-height: 1.2; color: var(--olive-900); border-bottom: 1px solid var(--line-2);
}
.mm-links a:last-child { border-bottom: 0; }
/* dönüşüm bloğu alta yaslanır: başparmak erişimi + panelin ölü alt yarısı kapanır.
   Kısa/yatay ekranda `auto` sıfıra düşer ve panel kaydırılır. */
.mm-foot {
  margin-top: auto; padding-top: clamp(16px, 2.4vh, 26px);
  border-top: 1px solid var(--line-2);
  display: grid; grid-template-columns: 1fr 1fr; gap: 10px;
}
.mm-foot .btn { width: 100%; justify-content: center; padding-inline: 12px; }
/* karamel zeminde lacivert metin 2.83:1 idi (grafik/büyük metin eşiği 3:1 altı);
   panel linklerinin renk kuralı .btn-brass'ı özgüllükle eziyordu → beyaza sabitlendi */
.mobile-menu .mm-cta { color: #fff; }
/* Telefon aksiyonu `.btn-ghost`tur: panelde ve alt sticky barda AYNI iş, aynı
   görünüm (halka kuralı için bkz. .sticky-bar .btn-ghost). İkon rengi metinden
   ayrılmaz — karamel ikon tonal butonda ikinci bir odak noktası üretiyordu. */
.mm-phone svg { color: currentColor; }
.menu-scrim {
  position: fixed; inset: 0; z-index: 64;
  background: rgb(var(--olive-950-rgb) / 0.45);
  opacity: 0; visibility: hidden;
  /* kısayol `transition: 0.4s` visibility'yi de 0.4s'ye bağlıyordu → ayrık özellik
     %50'de dönüyor, perde açılışta 200ms tıklanamıyordu. Aynı sıfır-süre + gecikme
     deseni panelde olduğu gibi burada da geçerli. */
  transition: opacity 0.4s var(--ease), visibility 0s linear 0.4s;
  /* perde şeridine dokunup arkadaki sayfayı kaydırmak mümkün olmasın */
  touch-action: none;
}
body.menu-open .menu-scrim {
  opacity: 1; visibility: visible;
  transition: opacity 0.4s var(--ease), visibility 0s linear 0s;
}
/* arka plan kaymasın. `overflow:hidden` KULLANILMAZ: html'de `overflow-x:clip`
   olduğu için taşma viewport'a taşınmaz, body kendi kaydırma konteynerine dönüşür
   ve içerik tepeye zıplar (aynı tuzak sticky header'ı da kırmıştı). Konum
   sabitleme + JS'in kaydırma ofsetini yazıp geri yüklemesi doğru desendir. */
body.menu-open { position: fixed; left: 0; right: 0; width: 100%; }
/* Menü paneli yalnız menü DÜĞMESİ yokken kapatılır — ölçüt genişlik değildir.
   Eski kural "burger ≥821px'te yok" varsayıyordu; düğme artık çubuk sığmadığı
   her genişlikte çıkabildiği için o varsayım paneli masaüstünde ölü bırakıyordu
   (düğme görünür, basılınca hiçbir şey açılmaz). İki yol da kapsanır: ölçüm
   çalışıyorsa .nav-burger'in yokluğu, çalışmıyorsa 1250px yedek eşiğinin üstü. */
@media (min-width: 821px) {
  html.nav-olculdu:not(.nav-burger) .mobile-menu,
  html.nav-olculdu:not(.nav-burger) .menu-scrim { display: none; }
  html.nav-olculdu:not(.nav-burger) body.menu-open { position: static; }
}
@media (min-width: 1251px) {
  html:not(.nav-olculdu) .mobile-menu,
  html:not(.nav-olculdu) .menu-scrim { display: none; }
  html:not(.nav-olculdu) body.menu-open { position: static; }
}

/* ============================================================
   HERO — full-bleed arka plan (ref-1: sağdan görsel, sola krem fade)
   ============================================================ */
.hero {
  position: relative; margin-top: calc(-1 * var(--nav-h));
  min-height: 100vh;
  display: flex; align-items: flex-start; overflow: hidden;
  --hero-ink: var(--olive-900); --hero-muted: var(--olive-800);
}
/* sayfanın TEK authored motion anı: fotoğraf açılışta yerine oturur.
   Diğer her yerde jenerik .reveal var; zirve olan hero kendi hareketini hak eder. */
.hero-media { position: absolute; inset: 0; z-index: 0; animation: hero-settle 1.8s var(--ease-out) both; }
@keyframes hero-settle { from { transform: scale(1.055); } to { transform: none; } }
/* dikey %30: gökyüzü kadraja girsin (kullanıcı ekranında onaylı yön) */
.hero-media img { width: 100%; height: 100%; object-fit: cover; object-position: 60% 30%; }
/* Perde = METNİN ARKASINA DÜŞEN IŞIK, fotoğrafın üstüne sürülen boya DEĞİL.
   Önceki perde tek bir kolon-boyu rampaydı ve tepe opaklığı %90'dı. Sorun kontrast
   değildi (ölçüm: gereken en yüksek opaklık ~%50), KOMPOZİSYONDU: %50–85 arası
   opaklık, altında YAPI olan bir alana sürüldüğünde ne fotoğraf ne düz zemin üretir —
   villanın hayaleti kalır. Simülasyonla ölçüldü (gerçek piksel, 1440×900): metin
   bandında fotoğrafın kontrastının yalnız %54'ü, sol kenarda %40'ı hayatta kalıyordu;
   sonuç, gün batımını gri bir sise çeviren "puslu/kirli" bir yüzeydi. Üstteki ayrı
   %55'lik 180° katman da tam olarak hiçbir şey korumuyordu: altında yalnız boş gökyüzü
   vardı, onu da beyaza yakıyordu.

   Yeni yapı iki katmandır ve ikisi de FOTOĞRAFIN İÇİNDEKİ IŞIĞI taklit eder:
     1) Yumuşak elips — ışık metin bloğunun üstüne düşer, kolonun tamamına değil.
        Koruma tam glifin olduğu yerde en güçlü, oradan her yöne söner.
     2) Zayıf soldan-sağa açılma — kompozisyonu sola doğru sakinleştirir, sağdaki
        ahşap/iç ışık %84'ten sonra tamamen serbest kalır.
   Tepe opaklık %90 → %52; fotoğrafın hayatta kalımı %52 → %67 (ölçüm), gökyüzü ve
   deniz geri geldi. Kontrast marjı ölçüldü (5 masaüstü genişliğinde, glif kutularıyla):
   eyebrow en kötü 4.77 · h1 4.18 (eşik 3.0) · lead 4.99 — hepsi eşiğin üstünde.
   Perde rengi --cream değil --hero-light: bkz. token açıklaması. */
.hero-scrim {
  position: absolute; inset: 0; z-index: 1; pointer-events: none;
  background:
    radial-gradient(68% 69% at 24% 49%,
      rgb(var(--hero-light-rgb) / 0.52) 0%,
      rgb(var(--hero-light-rgb) / 0.44) 50%,
      rgb(var(--hero-light-rgb) / 0) 100%),
    linear-gradient(93deg,
      rgb(var(--hero-light-rgb) / 0.10) 0%,
      rgb(var(--hero-light-rgb) / 0.26) 20%,
      rgb(var(--hero-light-rgb) / 0.40) 40%,
      rgb(var(--hero-light-rgb) / 0.34) 58%,
      rgb(var(--hero-light-rgb) / 0.14) 72%,
      rgb(var(--hero-light-rgb) / 0) 84%);
}
/* 100vh full-bleed hero'da içerik dikeyde ORTALANIR (üste yaslamak alt yarıyı ölü boşluk bırakıyordu);
   padding-top nav'ı temizler, optik merkez hafif aşağıda kalır (doğru). Mobil override: flex-end (aşağıda). */
.hero-content {
  position: relative; z-index: 3; width: 100%;
  display: flex; flex-direction: column; justify-content: center; min-height: 100vh;
  padding-top: calc(var(--nav-h) + clamp(22px, 4vh, 52px));
  padding-bottom: clamp(32px, 4vh, 52px);
}
/* Kolon ve h1 birlikte akışkan büyür — "Yaşamak isteyeceğiniz" satırı ~10×font-size px ister:
   h1 4.3vw (satır ≈ 42.8vw) + kolon 48vw → her genişlikte ~5vw pay = 2 satır GARANTİ, 3 satır istif imkânsız.
   Tavan 4.5rem/72px = sektör normu (Vantara canlı ölçüm: 885px'te bile 62px). Kuyruk kontrastı için
   scrim durakları %4 sağa kaydırıldı (yukarıda): 72px kuyruk 1440'ta ~0.51, 1920'de ~0.39 krem altında. */
.hero-inner { max-width: clamp(600px, 64vw, 1060px); }
/* h1 sistemin GERÇEK display katına döner. Önceden hero'ya özel küçük ölçek (4.3vw/4.5rem)
   vardı: 1280px'te 55px render ediyordu — aynı sayfadaki bölüm h2'si (56px) ile aynı, yani
   ana başlık alt başlıktan küçüktü. Tavan artık sistemin kendi display token tavanı (5.6rem).
   İki satır garantisi: "Yaşamak isteyeceğiniz" ≈ 9.9 × font-size ister → 6vw × 9.9 = 59.4vw,
   kolon 64vw → her genişlikte ~4.6vw pay. Mobil taban 2.5rem korundu (6vw ancak 667px'te
   tabanı geçer, yani ≤667px telefonlarda ölçü bire bir eskisi). Harf aralığı -0.022em:
   DESIGN.md'nin display spec'i (-0.02em) — display katına çıkınca -0.015em gevşek kalıyor. */
.hero h1 {
  margin: 18px 0 0; color: var(--hero-ink);
  font-size: clamp(2.5rem, 6vw, 5.6rem); line-height: 1.03; letter-spacing: -0.022em;
}
/* İmza kelimesi hero'da kendi registerine çıkar. Paylaşılan `h1 em` 380'dir: italiğin
   optik fazlalığını dengelemek için romandan (430) bir tık HAFİF — düz kâğıt üstündeki
   9 bölüm h2'sinde doğru karar. Fotoğrafın üstünde değil: orada ince gövdeler dokuya
   yeniliyor ve sayfanın EN önemli kelimesi, alt bölüm başlıklarıyla birebir aynı jesti
   kullanıp onlardan hafif kalıyordu. 430 = çevresindeki roman glifle aynı ağırlık.
   Ölçüldü: renk değişmediği için kontrast aynı (4.80:1); 470 denendi, bold-italiğe
   kayıp Fraunces'in kalın/ince kontrastını (pahalı duran şey) düzleştiriyor.
   Kapsam bilerek yalnız hero — bu, aynı anda hiyerarşi farkını da kuran şeydir. */
.hero h1 em { font-weight: 430; }
.hero .lead { margin-top: 28px; font-size: clamp(1.12rem, 0.9vw + 0.55rem, 1.45rem); color: var(--hero-muted); max-width: 42ch; }
/* hero eyebrow'un çizgisi display ölçeğine karşı ayakta kalsın (yalnız hero'da) */
.hero .eyebrow::before { width: 56px; }

/* hero arama çubuğu */
/* NOT: hero-search'e backdrop-filter EKLENMEZ — üst-öğedeki filter/transform,
   içindeki özel açılır menünün (position:fixed .cs-panel) konumunu bozar. */
.hero-search {
  margin-top: 36px; background: var(--card); border-radius: var(--r-lg);
  box-shadow: var(--shadow-lg); border: 1px solid var(--line-2);
  padding: 10px; position: relative; z-index: 4;
  max-width: 760px; /* kolon 1060'a kadar büyürken arama çubuğu başlıkla orantılı kalsın */
}
.hs-tabs { display: flex; gap: 6px; padding: 4px 4px 12px; }
.hs-tab {
  padding: 11px 20px; border-radius: 999px; font-weight: 600; font-size: var(--fs-small); color: var(--olive-700);
  transition: background 0.25s, color 0.25s;
}
/* pasif sekmenin hover geri bildirimi yoktu. Zemin --card (beyaza yakın) olduğu için
   şeffaf ghost erir (sticky-bar dersi) → sistemin kendi "seçenek hover" deseni kullanılır,
   .cs-opt:hover ile birebir aynı çift: paper-2 dolgu + olive-900 mürekkep. */
.hs-tab:hover:not(.active) { background: var(--paper-2); color: var(--olive-900); }
.hs-tab.active { background: var(--olive-800); color: var(--paper); }
.hs-fields { display: grid; grid-template-columns: 1.2fr 1fr 1fr auto; gap: 8px; align-items: stretch; }
.hs-field { position: relative; display: flex; flex-direction: column; justify-content: center; padding: 8px 16px; border-radius: var(--r-sm); background: var(--paper-2); transition: box-shadow 0.25s; }
.hs-field:hover { box-shadow: inset 0 0 0 1.5px var(--line); }
.hs-field label { font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); margin-bottom: 2px; }
/* Alanın görünür yüzeyi ~61px yüksekti ama tıklanabilir olan yalnız 24px'lik değer
   satırıydı: ÜSTÜNDE 29px ölü alan vardı (etikete dokunmak hiçbir şey yapmıyordu) —
   mobilde hero'nun birincil etkileşimi. Tetikleyici görünmez bir katmanla alanın
   tamamını kaplar; menü konumu tetikleyicinin kendi kutusundan hesaplandığı için
   açılır panelin hizası değişmez. (Etiket ayrıca JS'te tetikleyiciye bağlandı.) */
.hs-field .cs { position: static; }
.hs-field .cs-trigger::after { content: ""; position: absolute; inset: 0; border-radius: var(--r-sm); }
.hs-field select { border: none; background: transparent; font-weight: 600; font-size: var(--fs-small); color: var(--olive-900); outline: none; width: 100%; -webkit-appearance: none; appearance: none; cursor: pointer; }
.hs-submit { align-self: stretch; }
/* Zemin eskiden `linear-gradient(135deg, var(--brass), var(--brass-600))` idi; gradyanın
   AÇIK ucu (--brass) metinle 2.93:1 veriyordu — ikon-only hâlinde bile grafik nesne eşiğini
   (3:1) geçmiyordu. Paylaşılan .btn-brass bileşeni zaten düz dolgu + #fff kullanıyor;
   bu tekil uygulama ona hizalandı → tüm yüzey 5.26:1. */
/* Buton ikon + görünür "Ara" etiketi taşır (erişilebilir ad görünür metinden gelir,
   aria-label'a gerek yok); grid-auto-flow:column ikisini yan yana dizer.
   `justify-content: center` ŞART, dekoratif değil: grid'in "Stretch auto Tracks"
   adımı (CSS Grid §12.8) justify-content `normal`/`stretch` iken auto track'leri
   BOŞ ALANI EŞİT PAYLAŞTIRARAK büyütür. Masaüstünde track buton içeriğine göre
   ölçüldüğü için boş alan yoktu; mobilde buton `grid-column: 1/-1` ile tam genişliğe
   çıkınca 328px iki track'e 133/137 diye bölündü ve `place-items:center` ikon ile
   etiketi KENDİ track'lerinin ortasına koydu → aralarında 10px gap yerine 123px
   boşluk. `center` track'leri max-content'te tutar, ikisi tek grup olarak ortalanır. */
.hs-submit button {
  height: 100%; width: 100%; min-height: 58px; padding: 0 24px;
  border-radius: var(--r-sm); background: var(--brass-600); color: #fff;
  display: grid; grid-auto-flow: column; place-items: center;
  justify-content: center; gap: 10px;
  font-weight: 600; font-size: var(--fs-small);
  box-shadow: var(--shadow-brass); transition: transform 0.35s var(--ease);
}
.hs-submit button:hover { transform: translateY(-2px); }
.hs-submit button:active { transform: translateY(0); }
.hs-submit svg { width: 20px; height: 20px; }

/* ============================================================
   ÖZEL AÇILIR MENÜ (native <select> yerine — markaya uygun)
   ============================================================ */
.cs { position: relative; }
/* native select JS ile gizlenir; JS yoksa görünür kalır (fallback) */
.cs-native {
  position: absolute !important; width: 1px; height: 1px;
  padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); border: 0;
}
.cs-trigger {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  width: 100%; background: transparent; border: none; font: inherit; text-align: left;
  color: var(--olive-900); cursor: pointer;
}
.cs-value { font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cs-caret { flex: none; display: flex; color: var(--muted-2); transition: transform 0.22s var(--ease); }
.cs.open .cs-caret { transform: rotate(180deg); }

.cs-panel {
  /* fixed: .hero/.valuation gibi overflow:hidden ebeveynlerin menüyü kırpmasını önler;
     konum (top/left/width) JS ile tetikleyicinin viewport konumuna göre hesaplanır */
  position: fixed; z-index: 200;
  background: var(--card); border: 1px solid var(--line-2); border-radius: var(--r-sm);
  box-shadow: var(--shadow-lg); padding: 6px; max-height: min(300px, 56vh); overflow-y: auto;
  opacity: 0; transform: translateY(-6px) scale(0.99); transform-origin: top center;
  pointer-events: none; transition: opacity 0.16s var(--ease), transform 0.16s var(--ease);
}
.cs.open .cs-panel { opacity: 1; transform: none; pointer-events: auto; }
.cs-opt {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 11px 13px; border-radius: var(--r-xs); font-size: var(--fs-small); font-weight: 600; line-height: 1.2;
  color: var(--olive-800); cursor: pointer; transition: background 0.15s, color 0.15s;
}
.cs-opt:hover, .cs-opt.hi { background: var(--paper-2); color: var(--olive-900); }
.cs-opt.sel { color: var(--olive-900); }
.cs-opt.sel::after { content: "✓"; color: var(--brass); font-weight: 800; font-size: var(--fs-small); }
.cs-trigger:focus-visible { outline: 2px solid var(--brass); outline-offset: 3px; border-radius: var(--r-xs); }

/* hero arama alanı içinde: eski değer satırıyla aynı görünüm */
.hs-field .cs-value { font-size: var(--fs-small); }
/* değerleme formunda: input kutusu görünümü */
.field .cs-trigger {
  padding: 13px 15px; border-radius: var(--r-sm); background: var(--paper-2);
  border: 1.5px solid transparent; transition: border-color 0.25s, background 0.25s;
}
.field .cs.open .cs-trigger, .field .cs-trigger:focus-visible {
  border-color: var(--brass); background: var(--card); outline: none;
}
.field .cs-value { font-weight: 500; }

/* ============================================================
   GÜVEN / İSTATİSTİK BANDI
   ============================================================ */
.trust-band { border-block: 1px solid var(--line); background: var(--card); }
.trust-band .wrap { display: grid; grid-template-columns: repeat(4, 1fr) auto; gap: 30px; align-items: center; padding-block: 40px; }
.stat .n { font-family: var(--font-display); font-size: var(--fs-stat); color: var(--olive-900); line-height: 1; letter-spacing: -0.02em; }
.stat .n .suf { color: var(--brass); }
.stat .l { font-size: var(--fs-caption); color: var(--muted); margin-top: 8px; }
.portals { display: flex; flex-direction: column; gap: 8px; padding-left: 30px; border-left: 1px solid var(--line); }
.portals .pl-lbl { font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
.portals .pl-row { display: flex; gap: 8px; flex-wrap: wrap; }
.portals .pl-chip { font-size: var(--fs-caption); font-weight: 600; color: var(--olive-700); background: var(--paper-2); border: 1px solid var(--line); padding: 5px 11px; border-radius: 100px; display: inline-flex; align-items: center; gap: 5px; }
.portals .pl-chip::before { content: ""; width: 6px; height: 6px; border-radius: 50%; background: var(--wa); }

/* ============================================================
   İLANLAR + FİLTRE
   ============================================================ */
.listings { background: var(--cream); }
.listings-head { display: flex; align-items: flex-end; justify-content: space-between; gap: 20px; flex-wrap: wrap; margin-bottom: 34px; }
/* Yarıçap 29px = tek satırlık çubuğun (8+42+8) tam yarısı, yani hap biçimi
   AYNEN korunur. ⛔ 100px yazılamaz: tek satırda tarayıcı onu zaten 29'a
   kırpıyor, ama düğmeler sarıp çubuk iki satır olunca kırpılmıyor ve çubuk
   dev bir baloncuğa dönüşüyor (Ferhat'ta tür sayısı altıya çıkınca sarma
   olağan hâl olacak). */
.filter-bar {
  display: flex; gap: 8px; flex-wrap: wrap; align-items: center;
  background: var(--card); padding: 8px; border-radius: 29px; box-shadow: var(--shadow-sm); border: 1px solid var(--line-2);
  margin-bottom: 34px;
}
/* Rozet çubuğa aitmiş gibi okunsun: araya 34px değil 12px girer. */
.filter-bar-bitisik { margin-bottom: 12px; }
.fb-group { display: flex; gap: 4px; }
.fb-btn {
  padding: 9px 16px; border-radius: 100px; font-size: var(--fs-small); font-weight: 600; color: var(--olive-700);
  transition: 0.22s; white-space: nowrap;
}
.fb-btn:hover { color: var(--olive-900); background: var(--paper-2); }
.fb-btn.active { background: var(--olive-800); color: var(--paper); }
.fb-divider { width: 1px; align-self: stretch; background: var(--line); margin: 4px 2px; }
/* Bütçe rozeti — hero aramasından gelen seçimin izi, ÇUBUĞUN ALTINDA kendi
   satırında (yerleşim gerekçesi `loca_filtre_cubugu()`'nda ölçüldü).
   ⛔ Aktif `.fb-btn`in koyu dilini konuşmaz: çubukta koyu = "bu seçenek
   seçili" demek, rozet ise seçenek değil kaldırılabilir bir seçimdir. İkisi
   aynı görünürse rozet dördüncü bir filtre grubu sanılır. Açık zemin +
   kenarlık onu "etiket" yapar, `×` dairesi de kaldırılabilir olduğunu
   söyler. */
.suzgec-aktif { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin-bottom: 34px; }
.fb-butce {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 6px 6px 6px 14px; border-radius: 999px;
  background: var(--paper-2); color: var(--olive-800);
  box-shadow: inset 0 0 0 1px var(--line-control);
  font-size: var(--fs-caption); font-weight: 600;
}
.fb-butce-x {
  display: inline-flex; align-items: center; justify-content: center;
  width: 22px; height: 22px; border-radius: 50%;
  background: var(--olive-800); color: var(--paper);
  font-size: 15px; line-height: 1;
}
.fb-butce:hover { background: var(--brass-100); }
.fb-butce:hover .fb-butce-x { background: var(--olive-900); }
.fb-count { margin-left: auto; padding-right: 12px; font-size: var(--fs-caption); color: var(--muted); }
.fb-count b { color: var(--olive-900); font-family: var(--font-display); font-size: var(--fs-num-xs); }

.grid-listings { display: grid; grid-template-columns: repeat(3, 1fr); gap: 26px; }

.card {
  background: var(--card); border-radius: var(--r-lg); overflow: hidden;
  box-shadow: var(--shadow-sm); border: 1px solid var(--line-2);
  transition: transform 0.45s var(--ease), box-shadow 0.45s var(--ease);
  display: flex; flex-direction: column;
}
.card:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); }
.card-media { position: relative; aspect-ratio: 16 / 11; overflow: hidden; background: linear-gradient(150deg, var(--olive-500), var(--olive-800)); }
.card-media img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.7s var(--ease); }
.card:hover .card-media img { transform: scale(1.05); }
.card-badges { position: absolute; top: 14px; left: 14px; display: flex; gap: 7px; z-index: 2; }
.badge {
  font-size: var(--fs-caption); font-weight: 700; letter-spacing: 0.02em; padding: 5px 11px; border-radius: 100px;
  color: #fff; background: var(--rent);
}
.badge.sale { background: var(--sale); }
.badge.tag { background: rgb(var(--paper-rgb) / 0.9); color: var(--olive-800); }

/* Satıldı / Kiralandı — rozet şeridinin en güçlü sinyali, yumuşak `.tag`
   pilinden ayrılır. Kontrast dolu lacivert damgadan gelir: İki Eksen Kuralı
   gereği kırmızı bir "satıldı" rengi yok. En koyu lacivert (--olive-900) +
   büyük harf + geniş tracking + gerçek gölge, onu komşu durum rozetinden
   (özellikle kiralıkta lacivert "Kiralık") ayırır. Referans şeridindeki
   kart da (.card-satilan) bu sınıfı kullanır. */
.badge.badge-sold {
  background: var(--olive-900);
  color: #fff;
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.09em;
  padding-inline: 13px;
  box-shadow: 0 2px 8px rgb(var(--olive-800-rgb) / 0.28);
}
.card-fav { position: absolute; top: 12px; right: 12px; z-index: 2; width: 44px; height: 44px; border-radius: 50%; background: rgb(var(--paper-rgb) / 0.92); display: grid; place-items: center; color: var(--olive-700); transition: 0.25s; }
.card-fav:hover { background: #fff; color: var(--sale); transform: scale(1.08); }
.card-fav svg { width: 18px; height: 18px; transition: fill 0.2s; }
.card-fav.is-fav { color: var(--sale); background: #fff; }
.card-fav.is-fav svg { fill: var(--sale); }
.card-fav.is-fav:hover { transform: scale(1.12); }
.card-body { padding: 18px 20px 20px; display: flex; flex-direction: column; flex: 1; }
.card-loc { font-size: var(--fs-caption); color: var(--muted); display: inline-flex; align-items: center; gap: 5px; }
.card-loc svg { width: 13px; height: 13px; color: var(--brass); }
.card-title { font-family: var(--font-display); font-size: var(--fs-num-sm); font-weight: 500; color: var(--olive-900); margin: 7px 0 0; letter-spacing: -0.01em; line-height: 1.15; }
.card-title a:hover { color: var(--brass-600); }
.card-specs { display: flex; gap: 16px; margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--line-2); }
.card-spec { display: flex; align-items: center; gap: 6px; font-size: var(--fs-caption); color: var(--olive-700); font-weight: 500; }
.card-spec svg { width: 16px; height: 16px; color: var(--muted-2); }
.card-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 16px; }
.card-price { font-family: var(--font-display); font-size: var(--fs-num); color: var(--olive-900); letter-spacing: -0.02em; }
.card-price .per { font-family: var(--font-body); font-size: var(--fs-caption); color: var(--muted); font-weight: 500; }
.card-cta { width: 44px; height: 44px; border-radius: 50%; background: var(--olive-800); color: var(--paper); display: grid; place-items: center; transition: 0.3s var(--ease); }
.card-cta:hover { background: var(--brass-600); transform: rotate(-8deg) scale(1.05); }
.card-cta svg { width: 17px; height: 17px; }
.card.is-hidden { display: none; }

/* ---------- satılan/kiralanan: referans kartı ----------
   `.is-sold` uzun süre HTML'de basılıp CSS'te karşılığı olmayan ölü bir
   sınıftı: satılan ilan gridde küçük bir rozet dışında satılıkla birebir
   aynı görünüyordu. Artık iki iş yapıyor — (1) referans şeridindeki kartın
   sesini kısar, (2) satılan bir ilan herhangi bir yoldan aktif gride sızarsa
   emniyet ağı olur.

   Renk YENİ AİLE AÇMAZ: rozet lacivert çapadan, susturma doygunluk
   düşürmeyle yapılır. Terrakota/kırmızı bir "satıldı" rengi paletin iki ton
   ailesi kuralını bozardı. Rozetin dolu-damga hâli `.badge.badge-sold`'da
   (kart grid'i ve ilan detayı da aynı sınıfı kullanır). */
.card.is-sold .card-media img { filter: grayscale(0.55) saturate(0.7); }
.card.is-sold .card-title { color: var(--olive-700); }

/* Referans kartı TIKLANMAZ: bir teklif değil, geçmiş kaydıdır. Kalkan ve
   büyüyen kart tıklanabilirlik vaat ederdi — ikisi de kapatılıyor. */
.card-satilan { box-shadow: none; }
.card-satilan:hover { transform: none; box-shadow: var(--shadow-sm); }
.card-satilan:hover .card-media img { transform: none; }

/* Fotoğrafsız referans kartı (arsa/tarla — KARARLAR §9): kutu 16/11 oranını
   TUTMAZ, yoksa kartın üstünde rozetten başka bir şey taşımayan yüksek bir
   zeytin bloğu kalırdı. Kalan yüzey rozetin kendi yüksekliği kadardır. */
.card-media-yalin { aspect-ratio: auto; min-height: 0; padding: 14px; }
.card-media-yalin .card-badges { position: static; }
.card-sold-note { display: inline-flex; align-items: center; gap: 7px; font-size: var(--fs-caption); font-weight: 600; color: var(--muted); }
.card-sold-note svg { width: 15px; height: 15px; color: var(--brass); }

/* Krem (listings) → kâğıt (sold) → lacivert (valuation): bölüm ritmi
   korunsun diye şerit kremde DEĞİL kâğıtta durur. */
.sold { background: var(--paper); }
.sold .sec-note { margin-top: 14px; max-width: 52ch; }
.no-results { display: none; grid-column: 1 / -1; text-align: center; padding: 60px 20px; color: var(--ink-2); }
.no-results.show { display: block; }
.no-results h3 { color: var(--olive-700); margin-bottom: 8px; }

/* ---------- /ilanlar arşivi (archive-ilan.php) ----------
   Izgara, filtre ve kart yukarıdaki kurallardan gelir; burada yalnız sayfa
   çerçevesi (başlık, başlık altı açıklama, boş portföy) ve sayfalama. */
.listings .page-head { margin-bottom: 18px; }
.archive-lead { max-width: 46ch; margin-bottom: 30px; color: var(--ink-2); font-size: var(--fs-lead); }

.portfoy-bos { max-width: 46ch; margin: clamp(24px, 6vw, 56px) auto 0; text-align: center; }
.portfoy-bos h2 { font-size: var(--fs-detail-h2); }
.portfoy-bos p { margin: 14px 0 24px; color: var(--ink-2); }
/* Süzgeç sıfır sonuç verdiğinde blok İKİ düğme taşır ("Tüm ilanları göster" +
   WhatsApp). Satır içi boşluk dar telefonda düğmeleri birbirine yapıştırıp
   sarınca hiç aralık bırakmıyor; sarmalayıcı hem aralığı hem ortalamayı
   tek yerde tutar. */
.portfoy-bos-eylem { display: flex; flex-wrap: wrap; justify-content: center; gap: 12px; }

.pagination { display: flex; flex-wrap: wrap; justify-content: center; gap: 8px; margin-top: clamp(40px, 6vw, 64px); }
.pagination .page-numbers {
  min-width: 44px; padding: 10px 15px; border-radius: 100px; text-align: center;
  font-size: var(--fs-small); font-weight: 600; color: var(--olive-700);
  background: var(--card); border: 1px solid var(--line-2); transition: 0.22s;
}
.pagination a.page-numbers:hover { color: var(--olive-900); border-color: var(--brass); }
.pagination .page-numbers.current { background: var(--olive-800); border-color: var(--olive-800); color: var(--paper); }
.pagination .page-numbers.dots { border-color: transparent; background: none; padding-inline: 4px; min-width: 0; }

/* ============================================================
   ÜCRETSİZ DEĞERLEME (satıcı lead)
   ============================================================ */
.valuation { background: var(--olive-800); color: var(--paper); overflow: hidden; }
.valuation::before { content: ""; position: absolute; top: -30%; left: -10%; width: 50vw; height: 50vw; max-width: 700px; max-height: 700px; background: radial-gradient(circle, rgb(var(--brass-rgb) / 0.22), transparent 62%); pointer-events: none; }
.valuation .wrap { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: clamp(36px, 5vw, 80px); align-items: center; }
.val-copy .eyebrow { color: var(--brass-300); }
.val-copy h2 { color: var(--paper); margin-top: 18px; }
.val-copy h2 em { color: var(--brass-300); }
.val-copy p { color: rgb(var(--cream-rgb) / 0.72); margin-top: 20px; font-size: var(--fs-lead); }
.val-perks { display: flex; flex-direction: column; gap: 14px; margin-top: 28px; }
.val-perk { display: flex; align-items: center; gap: 12px; font-size: var(--fs-small); color: rgb(var(--cream-rgb) / 0.9); }
.val-perk .vp-ic { width: 30px; height: 30px; border-radius: var(--r-chip); background: rgb(var(--brass-rgb) / 0.2); color: var(--brass-300); display: grid; place-items: center; flex-shrink: 0; }
.val-perk .vp-ic svg { width: 16px; height: 16px; }
.val-form { background: var(--card); border-radius: var(--r-lg); padding: clamp(24px, 3vw, 38px); box-shadow: var(--shadow-lg); color: var(--ink); }
.val-form h3 { color: var(--olive-900); }
.val-form .vf-sub { font-size: var(--fs-small); color: var(--ink-2); margin: 6px 0 22px; }
.val-form .vf-liste { list-style: none; display: flex; flex-direction: column; gap: 10px; margin: 0 0 24px; }
.val-form .vf-liste li { position: relative; padding-left: 22px; font-size: var(--fs-small); color: var(--ink-2); }
.val-form .vf-liste li::before { content: ""; position: absolute; left: 0; top: 0.55em; width: 8px; height: 8px; border-radius: 50%; background: var(--brass); }
.field { margin-bottom: 15px; }
.field label { display: block; font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); margin-bottom: 7px; }
.field input, .field select {
  width: 100%; padding: 13px 15px; border-radius: var(--r-sm); background: var(--paper-2);
  border: 1.5px solid transparent; outline: none; font-weight: 500; transition: border-color 0.25s, background 0.25s;
}
.field input:focus, .field select:focus { border-color: var(--brass); background: var(--card); }
.field-row { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }
.val-form .form-note { font-size: var(--fs-caption); color: var(--muted); margin-top: 12px; text-align: center; }

/* ============================================================
   HİZMETLER
   ============================================================ */
.services { background: var(--cream); }
/* bento: 4 kolon, 1. ve 6. tile geniş (span 2) + koyu "featured" */
.svc-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px; margin-top: 48px; }
.svc-wide { grid-column: span 2; }
.svc.svc-wide { background: linear-gradient(140deg, var(--olive-800), var(--olive-900)); border-color: transparent; }
.svc.svc-wide h3 { color: var(--paper); }
.svc.svc-wide p { color: rgb(var(--cream-rgb) / 0.82); }
.svc.svc-wide .svc-ic { background: rgb(var(--cream-rgb) / 0.08); color: var(--brass-300); }
.svc.svc-wide:hover .svc-ic { background: var(--brass-600); color: #fff; }
.svc.svc-wide .svc-more { color: var(--brass-300); }
.svc.svc-wide::after { background: linear-gradient(90deg, var(--brass-300), var(--brass)); }
.svc {
  background: var(--card); border-radius: var(--r-lg); padding: 30px 28px 32px;
  border: 1px solid var(--line-2); box-shadow: var(--shadow-sm);
  transition: transform 0.4s var(--ease), box-shadow 0.4s var(--ease), border-color 0.4s;
  position: relative; overflow: hidden;
}
.svc::after { content: ""; position: absolute; inset: 0 0 auto 0; height: 3px; background: linear-gradient(90deg, var(--brass), var(--brass-300)); transform: scaleX(0); transform-origin: left; transition: transform 0.5s var(--ease); }
.svc:hover { transform: translateY(-5px); box-shadow: var(--shadow); border-color: var(--line); }
.svc:hover::after { transform: scaleX(1); }
.svc-ic { width: 54px; height: 54px; border-radius: var(--r-chip); background: var(--paper-2); color: var(--olive-700); display: grid; place-items: center; margin-bottom: 22px; transition: 0.4s var(--ease); }
.svc:hover .svc-ic { background: var(--olive-800); color: var(--brass-300); }
.svc-ic svg { width: 26px; height: 26px; }
.svc h3 { color: var(--olive-900); }
.svc p { margin-top: 10px; color: var(--ink-2); font-size: var(--fs-small); }
/* artık gerçek bir link (hizmete özel WhatsApp aksiyonu) → dokunma hedefi taban
   ölçüsünü (24px) geçmeli; dikey dolgu margin'den düşülerek ritim korunur */
.svc .svc-more { margin-top: 12px; padding-block: 6px; display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-caption); font-weight: 600; color: var(--brass-600); }
.svc .svc-more:hover { text-decoration: underline; text-underline-offset: 3px; }
.svc .svc-more svg { width: 15px; height: 15px; transition: transform 0.3s; }
.svc:hover .svc-more svg { transform: translateX(4px); }

/* ============================================================
   OFİS / DANIŞMAN
   ============================================================ */
.about { background: var(--card); }
.about .wrap { display: grid; grid-template-columns: 0.9fr 1.1fr; gap: clamp(36px, 5vw, 76px); align-items: center; }
.about-visual { position: relative; }
.about-photo { border-radius: var(--r-xl); overflow: hidden; aspect-ratio: 4/4.4; box-shadow: var(--shadow-lg); background: linear-gradient(150deg, var(--olive-500), var(--olive-800)); }
.about-photo img { width: 100%; height: 100%; object-fit: cover; }
.about-badge {
  position: absolute; bottom: -22px; right: -18px; background: var(--card); border-radius: var(--r-md);
  box-shadow: var(--shadow-lg); padding: 18px 22px; display: flex; align-items: center; gap: 14px; z-index: 3;
}
.about-badge .ab-n { font-family: var(--font-display); font-size: var(--fs-num-xl); color: var(--olive-900); line-height: 1; }
.about-badge .ab-l { font-size: var(--fs-caption); color: var(--muted); max-width: 90px; }
.about-badge .ab-sig { font-family: var(--font-display); font-style: italic; font-size: var(--fs-num); color: var(--brass-600); }
.about-copy h2 { margin-top: 18px; }
.about-copy .about-lead { margin-top: 22px; font-size: var(--fs-lead); color: var(--olive-700); }
.about-copy p { margin-top: 16px; color: var(--ink-2); }
.about-signature { margin-top: 28px; display: flex; align-items: center; gap: 16px; }
.about-signature .sig-name { font-family: var(--font-display); font-size: var(--fs-num-lg); font-style: italic; color: var(--olive-900); }
.about-signature .sig-role { font-size: var(--fs-caption); color: var(--muted); }

/* ============================================================
   REFERANSLAR (carousel)
   ============================================================ */
/* koyu sosyal-kanıt bölümü: valuation ile pitch arasındaki 5 açık section
   koşusunu kırar; beyaz kartlar lacivert üstünde güçlü kontrastla öne çıkar */
.testimonials { background: var(--olive-800); overflow: hidden; }
.testimonials::before { content: ""; position: absolute; inset: 0; background: radial-gradient(ellipse 60% 50% at 12% 0%, rgb(var(--brass-rgb) / 0.16), transparent); pointer-events: none; }
.testimonials .wrap { position: relative; }
.testimonials .eyebrow { color: var(--brass-300); }
.testimonials .sec-head h2 { color: var(--paper); }
.testimonials .sec-head h2 em { color: var(--brass-300); }
.testimonials .sec-head p { color: rgb(var(--cream-rgb) / 0.75); }
/* halka 0.32 alfada 2.51:1 idi — kontrol sınırı eşiği 3:1 (--line-control-dark: 4.04:1) */
.testimonials .tst-btn { color: var(--paper-2); box-shadow: inset 0 0 0 1.5px var(--line-control-dark); }
/* hover'da zemin --brass'a açılıyordu: açık metinle 2.93:1, yani "İki Karamel Kuralı"nın
   tam ihlali (--brass üstüne açık metin konmaz). Okunur karamele çekildi.
   Metin rengi de token'a bağlandı: burada elle yazılmış palet dışı bir açık ton vardı
   (kroma 0.0175 — kâğıt ailesinin iki katı). Sistemin "marka dolgusu üstünde açık metin"
   cevabı zaten --paper: bir satır yukarıdaki açık bölüm hover'ı da onu kullanıyor.
   Kontrast 4.97 → 4.90 (eşik 4.5). */
.testimonials .tst-btn:hover { background: var(--brass-600); color: var(--paper); box-shadow: none; }
.tst-viewport { overflow: hidden; margin-top: 44px; }
.tst-track { display: flex; gap: 24px; transition: transform 0.6s var(--ease); }
.tst-card {
  flex: 0 0 calc((100% - 48px) / 3); background: var(--card); border-radius: var(--r-lg);
  padding: 32px 30px; border: 1px solid var(--line-2); box-shadow: var(--shadow-sm);
}
.tst-quote { font-family: var(--font-display); font-size: var(--fs-quote); line-height: 0.6; color: var(--brass-300); height: 26px; }
.tst-card p { color: var(--olive-700); font-size: var(--fs-lead); margin: 12px 0 22px; }
.tst-person { display: flex; align-items: center; gap: 13px; }
.tst-person .av { width: 46px; height: 46px; border-radius: 50%; background-size: cover; background-position: center; background-color: var(--olive-300); }
/* Referans avatarları — gerçek portre yok, paletten türeyen soyut yüzeyler.
   Eskiden HTML'de 5 adet inline gradyan yazılıydı ve hepsi ESKİ ZEYTİN paletinden
   geliyordu: palet göçünde atlanmışlardı, lacivert bölümdeki beyaz kartlarda yeşil
   daireler olarak görünüyorlardı. Artık sınıf + paletten türer.
   (Eski hex değerleri bilinçli olarak buraya yazılmadı: kalıntı grep'i kendi
   açıklama satırımızı yakalamasın.) */
.av-1 { background-image: linear-gradient(135deg, var(--olive-500), var(--olive-800)); }
.av-2 { background-image: linear-gradient(135deg, var(--brass-300), var(--brass-600)); }
.av-3 { background-image: linear-gradient(135deg, var(--brass), var(--olive-700)); }
.av-4 { background-image: linear-gradient(135deg, var(--olive-300), var(--olive-600)); }
.av-5 { background-image: linear-gradient(135deg, var(--olive-700), var(--olive-950)); }
.tst-person .tp-name { font-weight: 700; color: var(--olive-900); font-size: var(--fs-small); }
.tst-person .tp-meta { font-size: var(--fs-caption); color: var(--muted); }
.tst-nav { display: flex; gap: 10px; margin-top: 34px; align-items: center; }
/* duraklat/oynat — ok butonlarıyla aynı siluet, ama etiketi görünür metin taşır
   (ikon-only kontrolde ad yalnız aria-label'da kalıyordu). Dar kapsül, ok
   butonlarının dairesel ritmini bozmadan yanlarında durur. */
/* .tst-btn bu kuraldan SONRA tanımlı ve sabit 48px genişlik veriyor; eşit özgüllükte
   sonra gelen kazandığından etiket kırpılıyordu → .tst-nav ile scope'lanarak
   özgüllük bir kademe yükseltildi. */
.tst-nav .tst-toggle { width: auto; grid-auto-flow: column; gap: 9px; padding-inline: 18px; border-radius: 100px; margin-left: 6px; }
.tst-toggle .tst-toggle-label { font-size: var(--fs-caption); font-weight: 600; letter-spacing: -0.005em; }
.tst-toggle svg { width: 16px; height: 16px; }
.tst-toggle .ic-play { display: none; }
.tst-toggle[aria-pressed="true"] .ic-pause { display: none; }
.tst-toggle[aria-pressed="true"] .ic-play { display: block; }
.tst-btn { width: 48px; height: 48px; border-radius: 50%; box-shadow: inset 0 0 0 1.5px var(--line); color: var(--olive-800); display: grid; place-items: center; transition: 0.3s; }
.tst-btn:hover { background: var(--olive-800); color: var(--paper); box-shadow: none; }
.tst-btn svg { width: 20px; height: 20px; }

/* ============================================================
   SÜREÇ
   ============================================================ */
.process { background: var(--cream); }
.proc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; margin-top: 52px; counter-reset: step; position: relative; }
.proc-step { position: relative; padding: 34px 28px; background: var(--card); border-radius: var(--r-lg); border: 1px solid var(--line-2); }
/* "01/02/03" bu bölümde bilgi taşır (üç adımlı süreç), dolayısıyla dekorasyon değil ve
   büyük-metin eşiğini (3:1) geçmesi gerekir. --brass-300 1.89:1 veriyordu; --brass
   3.04:1 ile eşiği geçer ve havadar editoryal tonu korur — --brass-600 bu ölçüde
   fazla ağır olur, h3 başlığıyla yarışırdı. (Karamel burada METİN değil büyük grafik
   rakam olduğu için "İki Karamel Kuralı"nın metin şartı devreye girmez.) */
.proc-step .num { font-family: var(--font-display); font-size: var(--fs-num-2xl); color: var(--brass); line-height: 0.8; letter-spacing: -0.03em; }
.proc-step h3 { color: var(--olive-900); margin-top: 16px; }
.proc-step p { color: var(--ink-2); margin-top: 10px; font-size: var(--fs-small); }
.proc-step .step-ic { position: absolute; top: 34px; right: 28px; width: 44px; height: 44px; border-radius: var(--r-chip); background: var(--paper-2); color: var(--olive-700); display: grid; place-items: center; }
.proc-step .step-ic svg { width: 22px; height: 22px; }

/* ============================================================
   SSS
   ============================================================ */
.faq { background: var(--card); }
/* İki kolonluk ızgara artık .wrap değil .faq-grid üzerinde: bölüm başlığı (sec-head)
   tam genişlikte üstte durur, diğer sekiz bölümle aynı desen. */
.faq-head { margin-bottom: 48px; }
.faq-grid { display: grid; grid-template-columns: 0.8fr 1.2fr; gap: clamp(36px, 5vw, 76px); align-items: start; }
.faq-list { display: flex; flex-direction: column; }
.qa { border-bottom: 1px solid var(--line); }
.qa .q { width: 100%; text-align: left; display: flex; align-items: center; justify-content: space-between; gap: 20px; padding: 24px 0; font-family: var(--font-display); font-size: var(--fs-num-xs); font-weight: 500; color: var(--olive-900); }
.qa .q .qi { width: 34px; height: 34px; border-radius: 50%; flex-shrink: 0; box-shadow: inset 0 0 0 1.5px var(--line); display: grid; place-items: center; color: var(--olive-700); transition: 0.35s var(--ease); position: relative; }
.qa .q .qi::before, .qa .q .qi::after { content: ""; position: absolute; background: currentColor; border-radius: 100px; }
.qa .q .qi::before { width: 13px; height: 1.6px; }
.qa .q .qi::after { width: 1.6px; height: 13px; transition: transform 0.35s var(--ease); }
.qa.open .q .qi { background: var(--olive-800); color: var(--brass-300); box-shadow: none; }
.qa.open .q .qi::after { transform: scaleY(0); }
/* Akordeon yüksekliği `max-height` + JS'in ölçtüğü `scrollHeight` ile canlandırılır.
   Dedektörün `layout-transition` kuralı bunu işaretler ve önerdiği alternatif
   (`grid-template-rows: 0fr→1fr`) DENENDİ — bu projede çalışmadı: açık durumda
   `1fr` izi de 0'a çöküyor (ölçüldü, `.qa.open` sınıfı uygulanmışken bile computed
   değer `0px`; kırpıcıya `min-height:0` verilince ızgaranın serbest alanı sıfırlanıyor,
   verilmeyince `<p>`'nin alt dolgusu kapalı duruma 24px taban koyuyor). Ara çözümler
   ya akordeonu hiç açmıyor ya hiç kapatmıyordu, dolayısıyla ÇALIŞAN uygulama korundu.
   Kuralın hedeflediği "gelişigüzel layout animasyonu" değil: 5 satır, etkileşim başına
   bir kez, ve `prefers-reduced-motion` altında geçiş tamamen kapanıyor. Gerekçe
   DESIGN.md'nin "bilinçli kabul edilen dedektör bulguları" bölümünde. */
.qa .a { max-height: 0; overflow: hidden; transition: max-height 0.45s var(--ease); }
.qa .a p { padding: 0 0 24px; color: var(--ink-2); max-width: 60ch; }
.faq-aside { background: var(--olive-800); color: var(--paper); border-radius: var(--r-lg); padding: 38px 34px; position: sticky; top: 100px; }
.faq-aside h3 { color: var(--paper); }
/* koyu bölümlerin eyebrow rengi diğer üç koyu bölümde kuralla veriliyordu, burada
   inline style ile — aynı kurala alındı */
.faq-aside .eyebrow { color: var(--brass-300); }
.faq-aside-title { margin-top: 16px; }
.faq-aside p { color: rgb(var(--cream-rgb) / 0.7); margin: 12px 0 24px; font-size: var(--fs-small); }

/* ============================================================
   ANA SAYFA HUB'I (front-page.php — müşteri kurulumu, KARARLAR §13)
   ============================================================
   Demo tek sayfalıktır; buradaki sınıflar yalnız hub bölümlerinde geçer.
   Hub "özetler ve linkler" — uzun içerik kendi sayfasında yaşar. Zemin
   ritmi (DESIGN.md): hero → güven (beyaz) → ilanlar (krem) → CTA (koyu)
   → hizmetler (krem) → Hakkımda (beyaz) → SSS (krem). */

/* Güven bandı: demo dört rakam ızgarası basar; müşteri modu yalnız
   doğrulanabilir olgu (KARARLAR §13). Rakam yerine esnek olgu satırları. */
.trust-band--facts .wrap { display: flex; flex-wrap: wrap; gap: 22px 56px; align-items: baseline; }
.trust-band--facts .fact { display: flex; flex-direction: column; gap: 6px; }
.trust-band--facts .fact-l { font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted); }
.trust-band--facts .fact-v { font-family: var(--font-display); font-size: var(--fs-num-sm); color: var(--olive-900); letter-spacing: -0.01em; }

/* Öne çıkan ilanlar başlığındaki "tümü" bağlantısı taşmasın */
.listings-head .btn { flex-shrink: 0; }

/* Üç CTA bloğu — koyu bölüm (demo'da valuation'ın yeri; satıcı CTA'sı da burada) */
.hub-cta { background: var(--olive-900); color: var(--paper); }
.hub-cta .sec-head h2 { color: var(--paper); }
.hub-cta .sec-head h2 em { color: var(--brass-300); }
.hub-cta .sec-head .eyebrow { color: var(--brass-300); }
.hub-cta .sec-head p { color: rgb(var(--cream-rgb) / 0.75); }
.hub-cta-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 48px; }
.hub-cta-card { display: flex; flex-direction: column; gap: 10px; padding: 28px 26px; border-radius: var(--r-lg); background: rgb(var(--cream-rgb) / 0.06); border: 1px solid var(--line-control-dark); transition: transform 0.4s var(--ease), background 0.4s var(--ease); }
@media (hover: hover) { .hub-cta-card:hover { transform: translateY(-5px); background: rgb(var(--cream-rgb) / 0.1); } }
.hub-cta-card .hcc-eyebrow { font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.14em; text-transform: uppercase; color: var(--brass-300); }
.hub-cta-card h3 { color: var(--paper); font-size: var(--fs-num-sm); }
.hub-cta-card p { color: rgb(var(--cream-rgb) / 0.82); font-size: var(--fs-small); flex: 1; }
.hub-cta-card .hcc-more { display: inline-flex; align-items: center; gap: 6px; font-size: var(--fs-caption); font-weight: 600; color: var(--brass-300); margin-top: 4px; }
.hub-cta-card .hcc-more svg { width: 15px; height: 15px; transition: transform 0.3s; }
@media (hover: hover) { .hub-cta-card:hover .hcc-more svg { transform: translateX(4px); } }

/* Hizmetler özeti — isim çipleri + "tümü" bağlantısı */
.hub-hizmet-list { display: flex; flex-wrap: wrap; gap: 12px; justify-content: center; max-width: 760px; margin: 40px auto 0; list-style: none; padding: 0; }
.hub-hizmet-list li { font-size: var(--fs-caption); font-weight: 600; color: var(--olive-700); background: var(--card); border: 1px solid var(--line); padding: 9px 16px; border-radius: 100px; }
.hub-hizmet-cta { text-align: center; margin-top: 30px; }

/* Hakkımda özeti — portre YOKKEN tek kolon okunur genişlik; uydurma rozet/rakam yok */
.hub-about .wrap { display: block; max-width: 640px; }
.hub-about .about-copy .btn { margin-top: 26px; }

/* Portre VARKEN (Marka ekranından ya da müşteri kurulumunda depodaki hazır
   dosyadan) bölüm iki sütuna açılır. Sütunlar içeriğe göre sınırlı (görsel ~380,
   metin okunur ölçü) ve ÇİFT ORTALI: artan yer tek yana boş ray bırakmaz, iki
   yana eşit kenar boşluğu olur — sol/sağ dev boşluk şikâyetinin kaynağı buydu. */
.hub-about--portre .wrap {
  display: grid;
  grid-template-columns: minmax(0, 380px) minmax(0, 460px);
  justify-content: center;
  gap: clamp(40px, 5vw, 88px);
  align-items: center;
  max-width: var(--wrap);
}
.hub-about--portre .about-copy { max-width: none; }

/* Şeffaf kadraj portre: çerçeveli foto değil, zeminden "adım atan" figür.
   Arkasında sistemin köşe dilinde (--r-xl) sıcak bir panel; figür alttan panele
   basar, gölge mürekkebi lacivert ve 0.16 tavanında (bkz. DESIGN.md).

   Panel bölüm zemininden GÖRÜNÜR biçimde ayrışmak ZORUNDADIR. Dolgu --paper-2 →
   --cream iken bölüm zemini --card'dı: kanal başına ~10 birim fark, yani panel
   pratikte görünmüyordu. Geriye tek bir ince çizgi kalınca göz o çizgiyi kutu
   sanıyor, başın çizginin üstüne çıkmasını da "fotoğraf kutuya sığmamış" diye
   okuyordu — efekt bozuk değildi, niyeti okunmuyordu. Dolgu --cream → --brass-100
   olarak derinleştirildi ve örtüşme %9'dan %16'ya çıkarıldı (dar kırılımda %13):
   figürün panelin ÖNÜNDE durduğu artık tek bakışta anlaşılıyor. */
.hub-portre {
  position: relative;
  display: flex;
  justify-content: center;
  isolation: isolate;
}
.hub-portre::before {
  content: "";
  position: absolute;
  inset: 16% 0 0;
  z-index: -1;
  border-radius: var(--r-xl);
  background:
    radial-gradient(115% 80% at 50% 0%, rgb(var(--brass-rgb) / 0.16), transparent 62%),
    linear-gradient(180deg, var(--cream), var(--brass-100));
  border: 1px solid var(--line);
}
/* Alt kapanış ZORUNLUDUR, süs değil. Kadraj görselleri bir yerden kesilir; bu
   portre gövdeyi alt kenarda DÜZ keser ve silüet üç kenara birden değer — alt
   satırın 680 pikselinden 677'si opak, sol kenarda 31 satır opak. Kesik serbest
   bırakılırsa üç kusur birden çıkar: (1) görselin köşeli alt köşeleri panelin
   --r-xl yuvarlağının dışında kalır, (2) drop-shadow alfa silüetini takip ettiği
   için kesiğin altına ve soluna, panelin DIŞINA gri bant çizer, (3) kesik
   "panele basan figür" yerine kırpılmış fotoğraf okunur.

   Çözüm soldurma DEĞİL, kesin kırpma: görsel kendi kutusunun alt iki köşesinden
   panelin yarıçapıyla kırpılır. Kumaş sonuna kadar tam yoğunlukta kalır, alta
   doğru sönmez. Üst kenar kırpılmaz — figürün panelin üstüne çıkması efektin
   kendisidir. clip-path filtreden SONRA uygulandığı için gölge de aynı sınırda
   biter. Görselin kutusu panelin sol/sağ/alt kenarlarıyla birebir çakıştığından
   yarıçap panelinkiyle aynıdır ve iki kırılımda da geçerlidir (--r-xl sabit).
   Silüetten bağımsızdır — müşteri hangi portreyi yüklerse yüklesin çalışır. */
.hub-portre img {
  display: block;
  width: 100%;
  max-width: 380px;
  height: auto;
  filter: drop-shadow(0 22px 38px rgb(var(--shadow-rgb) / 0.16));
  -webkit-clip-path: inset(0 round 0 0 var(--r-xl) var(--r-xl));
          clip-path: inset(0 round 0 0 var(--r-xl) var(--r-xl));
}

/* SSS özeti — Hakkımda (beyaz) ile arka arkaya gelmesin diye krem */
.hub-faq { background: var(--cream); }
.hub-faq .faq-aside .btn { margin-top: 4px; }

@media (max-width: 1080px) {
  .hub-cta-grid { grid-template-columns: 1fr; max-width: 520px; margin-inline: auto; }
  /* Portre tek sütuna iner; görsel önce, sonra metin (demo about ile aynı sıra). */
  .hub-about--portre .wrap { grid-template-columns: 1fr; justify-content: stretch; max-width: 520px; }
  .hub-about--portre .about-copy { max-width: none; }
  /* Panel görselin genişliğine kilitlenir. Sarmalayıcı serbest bırakılınca
     tek sütunda 520px'e açılıyordu; görsel 300'de kalıp panel iki yana
     taşıyordu — masaüstündeki hizanın tersi. Kutu her iki kırılımda da
     görselin kutusudur. */
  .hub-portre { order: -1; max-width: 300px; margin-inline: auto; }
  .hub-portre::before { inset: 13% 0 0; }
  .hub-portre img { max-width: 300px; }
}

/* ============================================================
   META KAPANIŞ + PANEL MOCKUP
   ============================================================ */
.pitch { background: var(--olive-900); color: var(--paper); overflow: hidden; position: relative; }
.pitch::before { content: ""; position: absolute; inset: 0; background: radial-gradient(ellipse 60% 50% at 80% 0%, rgb(var(--brass-rgb) / 0.2), transparent); pointer-events: none; }
.pitch .wrap { position: relative; }
.pitch-head { max-width: 680px; }
.pitch-head .eyebrow { color: var(--brass-300); }
.pitch-head h2 { color: var(--paper); margin-top: 18px; }
.pitch-head h2 em { color: var(--brass-300); }
.pitch-head p { color: rgb(var(--cream-rgb) / 0.75); margin-top: 20px; font-size: var(--fs-lead); }

.pitch-grid { display: grid; grid-template-columns: 1fr 1.15fr; gap: clamp(36px, 5vw, 64px); align-items: center; margin-top: 56px; }
.pitch-feats { display: flex; flex-direction: column; gap: 22px; }
.pfeat { display: flex; gap: 16px; }
.pfeat .pf-ic { width: 46px; height: 46px; border-radius: var(--r-chip); background: rgb(var(--brass-rgb) / 0.16); color: var(--brass-300); display: grid; place-items: center; flex-shrink: 0; }
.pfeat .pf-ic svg { width: 22px; height: 22px; }
/* Küçük özellik başlığı: display değil gövde fontunda kalır (kasıtlı). 1.02rem
   literaliydi — gövde ölçeğine (17px) hizalandı, artık isimsiz bir ara değer değil. */
.pfeat .pfeat-title { font-family: var(--font-body); font-weight: 700; font-size: var(--fs-body); line-height: 1.35; letter-spacing: 0; color: var(--paper); }
.pfeat p { font-size: var(--fs-small); color: rgb(var(--cream-rgb) / 0.65); margin-top: 4px; }
.pitch-cta { margin-top: 38px; display: flex; gap: 14px; flex-wrap: wrap; }

/* panel mockup — tarayıcı çerçevesi
   Kasıtlı olarak markanın DIŞINDA bir alt-sistem: bir yazılım ekranını temsil eder,
   nötr yazılım estetiği taşır (brief #9). Renkleri --mock-* token'larından gelir;
   önceden eski zeytin paletinden kalma literaller vardı ve
   "nötr" olması gereken panel yeşilimsi-kirli okunuyordu. Tek marka izi karamel logo
   ve lead kutusu vurgusu — sahibi kendi panelini hayal edebilsin diye kasıtlı.
   Metin kontrastları AA'ya çekildi: künye 3.28→4.65, etiket 3.67→4.65, artış 4.36→5.62. */
.mock-window { border-radius: var(--r-md); overflow: hidden; box-shadow: 0 40px 80px -32px rgb(var(--shadow-rgb) / 0.45), 0 0 0 1px rgb(255 255 255 / 0.06); background: var(--mock-surface-2); }
.mock-bar { background: var(--mock-bar); display: flex; align-items: center; gap: 8px; padding: 11px 14px; border-bottom: 1px solid var(--mock-line); }
.mock-dots { display: flex; gap: 6px; }
.mock-dots i { width: 11px; height: 11px; border-radius: 50%; background: var(--mock-dot); }
.mock-url { flex: 1; background: var(--mock-surface); border-radius: var(--r-xs); padding: 5px 12px; font-size: var(--fs-mock-xs); color: var(--mock-muted); text-align: center; font-family: var(--font-body); }
.mock-app { display: grid; grid-template-columns: 60px 1fr; min-height: 420px; background: var(--mock-surface); color: var(--mock-ink-2); }
.mock-side { background: var(--mock-ink); padding: 16px 0; display: flex; flex-direction: column; align-items: center; gap: 20px; }
.mock-side .ms-logo { width: 30px; height: 30px; border-radius: var(--r-chip); background: var(--brass-600); display: grid; place-items: center; color: #fff; font-family: var(--font-display); font-size: var(--fs-body); }
.mock-side .ms-ico { width: 34px; height: 34px; border-radius: var(--r-chip); display: grid; place-items: center; color: rgb(255 255 255 / 0.6); }
.mock-side .ms-ico svg { width: 18px; height: 18px; }
.mock-side .ms-ico.on { background: rgb(var(--brass-rgb) / 0.22); color: var(--brass-300); }
.mock-main { padding: 20px 22px; }
.mock-h { display: flex; align-items: center; justify-content: space-between; margin-bottom: 18px; }
.mock-h .mh-t { font-family: var(--font-display); font-size: var(--fs-num-xs); color: var(--mock-ink); }
.mock-h .mh-btn { font-size: var(--fs-mock-xs); font-weight: 700; color: #fff; background: var(--mock-ink); padding: 7px 13px; border-radius: var(--r-xs); display: inline-flex; align-items: center; gap: 5px; }
.mock-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin-bottom: 16px; }
.mock-stat { background: #fff; border: 1px solid var(--mock-line); border-radius: var(--r-sm); padding: 12px 14px; }
.mock-stat .n { font-family: var(--font-display); font-size: var(--fs-num); color: var(--mock-ink); line-height: 1; }
.mock-stat .l { font-size: var(--fs-mock-2xs); color: var(--mock-muted); margin-top: 5px; text-transform: uppercase; letter-spacing: 0.06em; }
.mock-stat .up { font-size: var(--fs-mock-2xs); color: var(--mock-ok); font-weight: 700; }
.mock-listing { background: #fff; border: 1px solid var(--mock-line); border-radius: var(--r-sm); padding: 11px 13px; display: flex; align-items: center; gap: 12px; margin-bottom: 9px; }
.mock-listing .ml-th { width: 46px; height: 40px; border-radius: var(--r-xs); background: linear-gradient(150deg, var(--olive-500), var(--olive-800)); flex-shrink: 0; overflow: hidden; }
.mock-listing .ml-th img { width: 100%; height: 100%; object-fit: cover; }
.mock-listing .ml-info { flex: 1; min-width: 0; }
.mock-listing .ml-t { font-size: var(--fs-caption); font-weight: 700; color: var(--mock-ink); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
/* İlan satırının künye çipleri (2026-07-29'da yeniden adlandırıldı).
   Önceki hâli her çipe "✓" koyuyordu ve içerik portal adlarıydı; bu,
   "ilan şu portala gönderildi" anlamına geliyordu. Böyle bir ürün YOK —
   panel yalnızca müşterinin kendi sitesindeki ilanları yönetir.
   Çipler durum + künyeye çevrildi; ✓ yalnızca .is-live çipinde kaldı. */
.mock-listing .ml-meta { display: flex; gap: 4px; margin-top: 4px; flex-wrap: wrap; }
.mock-listing .ml-meta span { font-size: var(--fs-mock-2xs); font-weight: 600; color: var(--mock-chip-ink); background: var(--mock-chip-bg); padding: 2px 6px; border-radius: var(--mock-r-chip); display: inline-flex; align-items: center; gap: 3px; }
.mock-listing .ml-meta .is-live::before { content: "✓"; color: var(--mock-ok); font-size: var(--fs-mock-2xs); }
.mock-listing .ml-price { font-family: var(--font-display); font-size: var(--fs-small); color: var(--mock-ink); white-space: nowrap; }
.mock-listing .ml-price small { display: block; font-family: var(--font-body); font-size: var(--fs-mock-2xs); color: var(--mock-muted); text-align: right; }
.mock-lead { margin-top: 14px; background: var(--mock-ink); border-radius: var(--r-sm); padding: 12px 14px; }
.mock-lead .mle-h { font-size: var(--fs-mock-xs); color: var(--brass-300); font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; display: flex; align-items: center; gap: 6px; margin-bottom: 8px; }
.mock-lead .mle-row { display: flex; align-items: center; gap: 9px; padding: 6px 0; }
.mock-lead .mle-av { width: 26px; height: 26px; border-radius: 50%; background: var(--mock-chip-ink); color: #fff; display: grid; place-items: center; font-size: var(--fs-mock-xs); font-weight: 700; flex-shrink: 0; }
.mock-lead .mle-txt { flex: 1; font-size: var(--fs-mock-xs); color: rgb(255 255 255 / 0.88); }
.mock-lead .mle-txt b { color: #fff; }
.mock-lead .mle-wa { font-size: var(--fs-mock-2xs); color: var(--mock-ok-300); background: rgb(var(--shadow-rgb) / 0.5); padding: 3px 7px; border-radius: 100px; }

/* ============================================================
   FOOTER + STICKY BAR
   ============================================================ */
.footer { background: var(--olive-950); color: rgb(var(--cream-rgb) / 0.7); padding-block: clamp(56px, 7vw, 88px) 0; border-top: 1px solid rgb(var(--cream-rgb) / 0.08); }
/* kolon grid'i YALNIZ .f-cols wrap'ına — genel .footer .wrap hedeflenirse
   f-bottom'un wrap'ı da grid olur ve telif satırı 1. kolona sıkışır (mobil hatasının kökü) */
.footer .f-cols { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 40px; }
.footer .brand { color: var(--paper); }
.footer .f-about { margin-top: 18px; font-size: var(--fs-small); max-width: 32ch; }
.footer .f-social { display: flex; gap: 10px; margin-top: 22px; }
.footer .f-social a { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center; box-shadow: inset 0 0 0 1px rgb(var(--cream-rgb) / 0.18); color: var(--paper); transition: 0.3s; }
.footer .f-social a:hover { background: var(--brass); box-shadow: none; }
.footer .f-social svg { width: 18px; height: 18px; }
/* Görsel olarak mikro etiket, semantik olarak bölüm başlığı. Eskiden <h5>'ti ve
   kart h3'lerinden sonra geldiği için h3->h5 seviye atlaması yapıyordu. */
.footer .f-title { font-family: var(--font-body); font-size: var(--fs-label); font-weight: 500; line-height: 1.4; letter-spacing: 0.14em; text-transform: uppercase; color: var(--brass-300); margin-bottom: 18px; }
.footer ul { list-style: none; display: flex; flex-direction: column; gap: 3px; }
/* Satır yüksekliği 20px'ti → WCAG 2.5.8'in 24×24 taban hedefinin altında. Dikey
   dolgu eklendi (satırlar arası gap küçültülerek görsel ritim korundu): 26px. */
.footer ul a { display: inline-block; padding-block: 4px; font-size: var(--fs-small); transition: color 0.25s; }
.footer ul a:hover { color: var(--paper); }
.footer .f-bottom { border-top: 1px solid rgb(var(--cream-rgb) / 0.12); margin-top: clamp(40px, 5vw, 64px); padding-block: 26px; display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap; font-size: var(--fs-caption); }
.footer .f-bottom .made { color: var(--brass-300); }
.footer .f-bottom a { display: inline-block; padding-block: 3px; text-decoration: underline; text-underline-offset: 3px; }
/* Yasal metin bağlantıları (yalnız müşteri modu, ticket 05). */
.footer .f-legal { display: flex; flex-wrap: wrap; gap: 4px 18px; }

.sticky-bar {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 45;
  display: none; gap: 10px; padding: 12px var(--gutter) calc(12px + env(safe-area-inset-bottom, 24px));
  /* fallback: cam desteklenmiyorsa opağa yakın beyaz — içerik asla sızmaz */
  background: rgba(255, 255, 255, 0.94);
  border-top: 1px solid var(--line-2);
  box-shadow: 0 -12px 32px -22px rgb(var(--shadow-rgb) / 0.16);
}
/* header pill ile aynı beyaz liquid-glass dili (krem cam sararıyordu — Vantara dersi);
   blur'suz yarı şeffaflık altındaki metni bara sızdırıyordu.

   KOYU BÖLÜM KALİBRASYONU: cam yalnız açık zeminler üzerinde ayarlanmıştı. Bar
   lacivert bir bölümün (valuation/testimonials/pitch) üstüne geldiğinde 0.42–0.6
   beyaz + saturate(140%) altındaki laciverti öne çıkarıp barı ≈rgb(135,150,170),
   yani PALETTE OLMAYAN parlak bir çelik mavisine çeviriyordu (ekran görüntüsüyle
   görüldü); üstelik tonal "Ara" butonunun bardan ayrımı 1.22'den 1.16'ya düşüyordu —
   v29'da tonal dolguyu seçmenin tek sebebi butonun erimemesiydi.
   Çözüm: taban beyazı yükseltilir (arka plan camı ele geçiremez) ve saturate
   KALDIRILIR — kroma pompalamak hem kremi sarartıyordu hem laciverti mavileştiriyordu.
   Blur ve parlaklık korunur: cam hissi onlardan gelir, kromadan değil. */
@supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .sticky-bar {
    background: linear-gradient(180deg, rgb(255 255 255 / 0.9), rgb(255 255 255 / 0.82));
    backdrop-filter: brightness(1.06) blur(20px);
    -webkit-backdrop-filter: brightness(1.06) blur(20px);
  }
}
/* GÖRÜNÜRLÜK: bar hero ekranın alt bandını bırakır bırakmaz belirir (app.js
   IntersectionObserver, rootMargin -75% → hero'nun altı ekranın %75'ini geçtiği an;
   390×844'te ~197px kaydırma, yani bir sonraki bölüm ekrana girer girmez). Eskiden
   ölçüt "hero-search tamamen ekrandan çıktı" idi ve barı 820px'e kadar bekletiyordu.
   Yeni ölçüt eski P0 çakışmasını da kapsar: bar da hero'nun kendi arama submit'i de
   ekranın alt bandında yaşar, hero orayı bırakmadan bar gelmez.
   `visibility` AYRIK bir özellik: süre verilirse geçişin %50'sinde döner (mobil menüde
   yaşanan tuzak) → sıfır süre + gecikme deseni kullanılır. */
.sticky-bar {
  opacity: 0;
  visibility: hidden;
  transform: translateY(14px);
  transition: opacity 0.34s var(--ease), transform 0.34s var(--ease), visibility 0s linear 0.34s;
}
.sticky-bar.is-visible {
  opacity: 1;
  visibility: visible;
  transform: none;
  transition: opacity 0.34s var(--ease), transform 0.34s var(--ease), visibility 0s linear 0s;
}
/* çift aksiyonlu barda sektör normu 50/50: hiyerarşi genişlikle değil dolguyla kurulur */
.sticky-bar .btn { flex: 1; justify-content: center; }
/* ikincil aksiyon = tonal lacivert (Material 3 filled-tonal deseni): beyaz cam barda
   beyaz/şeffaf buton eriyordu — açık marka tonu dolgusu butonluğu netleştirir,
   dolu yeşil birincilin önüne geçmez.

   HALKA GERİ ALINDI: dolgu tek başına bardan yalnız 1.22:1 ayrışıyordu (WCAG 1.4.11
   kontrol sınırı için 3:1 ister) ve %11 alfada lacivert hue kaybolup ekranda NÖTR GRİ
   bir hap kalıyordu — gri hap arayüz dilinde "devre dışı" demektir, ikincil aksiyon
   pasif görünüp tıklama kaybediyordu. Sitedeki her `.btn-ghost` (burger, mm-close,
   ilan-detay'daki AYNI "Ara" butonu) `--line-control` halkasını taşır; halkanın
   söküldüğü tek yer burasıydı, yani aynı aksiyon iki farklı görünüyordu.
   Dolgu korunur (şeffaf ghost koyu bölümlerin üstünde içerik sızdırıyor — v29 dersi),
   üstüne sistemin kendi halkası gelir. Yeşil doygunluğu baskın kaldığı için WhatsApp
   birinciliği değişmez. */
.sticky-bar .btn-ghost {
  background: rgb(var(--olive-800-rgb) / 0.11); color: var(--olive-900);
  box-shadow: inset 0 0 0 1.5px var(--line-control);
}
.sticky-bar .btn-ghost:hover {
  background: rgb(var(--olive-800-rgb) / 0.16);
  box-shadow: inset 0 0 0 1.5px var(--olive-700);
}
.sticky-bar .btn-ghost:active { background: rgb(var(--olive-800-rgb) / 0.2); }

/* ============================================================
   İLAN DETAY SAYFASI
   ============================================================ */
.detail-top { padding-top: 24px; }
.breadcrumb { display: flex; align-items: center; gap: 9px; font-size: var(--fs-caption); color: var(--muted); margin-bottom: 22px; }
.breadcrumb a:hover { color: var(--brass-600); }
.breadcrumb svg { width: 13px; height: 13px; opacity: 0.5; }
.detail-headrow { display: flex; align-items: flex-end; justify-content: space-between; gap: 24px; flex-wrap: wrap; margin-bottom: 26px; }
.detail-headrow .dh-loc { font-size: var(--fs-caption); color: var(--muted); display: inline-flex; align-items: center; gap: 6px; }
.detail-headrow .dh-loc svg { width: 15px; height: 15px; color: var(--brass); }
.detail-headrow h1 { font-size: var(--fs-detail-h1); margin-top: 12px; }
.detail-badges { display: flex; gap: 8px; margin-top: 14px; }
.detail-price { text-align: right; }
.detail-price .dp-n { font-family: var(--font-display); font-size: var(--fs-detail-price); color: var(--olive-900); letter-spacing: -0.02em; line-height: 1; }
.detail-price .dp-per { font-size: var(--fs-caption); color: var(--muted); margin-top: 6px; }
/* Satılan ilanda fiyatın yerini durum alır (single-ilan.php). Aynı yerde,
   fiyat ölçüsünün bir kademe altında: sayfanın çapası hâlâ orada, ama
   okunan şey bir bedel değil bir sonuç. */
.detail-price-sold .dp-sold { font-family: var(--font-display); font-size: var(--fs-detail-h2); color: var(--olive-700); letter-spacing: -0.01em; line-height: 1; }
.agent-sold-note { font-size: var(--fs-small); color: var(--muted); line-height: 1.5; margin-bottom: 4px; }

/* galeri */
.gallery { display: grid; grid-template-columns: 2fr 1fr 1fr; grid-template-rows: 1fr 1fr; gap: 12px; height: clamp(340px, 46vw, 540px); border-radius: var(--r-lg); overflow: hidden; }
/* Önceden `cursor:pointer` vardı ama lightbox yoktu, öğeler <div> ve klavyeyle
   erişilemezdi — tıklanabilirlik vaadi karşılıksızdı. Şimdi gerçek: <button>,
   gerçek lightbox açar, klavyeyle erişilebilir. */
.gallery .g-item { position: relative; overflow: hidden; background: linear-gradient(150deg, var(--olive-500), var(--olive-800)); display: block; width: 100%; height: 100%; padding: 0; border: 0; cursor: pointer; font: inherit; }
.gallery .g-item:first-child { grid-row: 1 / 3; }
.gallery .g-item img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.7s var(--ease); pointer-events: none; }
.gallery .g-item:hover img { transform: scale(1.06); }
.g-more { position: absolute; bottom: 16px; right: 16px; z-index: 2; background: rgb(var(--olive-950-rgb) / 0.62); backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px); color: var(--paper); font-size: var(--fs-caption); font-weight: 600; padding: 8px 14px; border-radius: 100px; }

/* galeri lightbox */
body.lb-locked { overflow-y: hidden; }
.lightbox {
  position: fixed; inset: 0; z-index: 300; display: flex; align-items: center; justify-content: center;
  opacity: 0; visibility: hidden; transition: opacity 0.3s var(--ease), visibility 0s linear 0.3s;
  --focus-ring: var(--brass-300);
}
.lightbox.open { opacity: 1; visibility: visible; transition: opacity 0.3s var(--ease), visibility 0s linear 0s; }
.lb-scrim { position: absolute; inset: 0; background: rgb(var(--olive-950-rgb) / 0.92); }
.lb-shell { position: relative; z-index: 1; width: min(92vw, 1100px); max-height: 88vh; display: flex; align-items: center; gap: 8px; }
.lb-fig { position: relative; flex: 1; min-width: 0; margin: 0; display: flex; flex-direction: column; align-items: center; gap: 14px; }
.lb-fig img { max-width: 100%; max-height: 76vh; width: auto; height: auto; object-fit: contain; border-radius: var(--r-md); box-shadow: var(--shadow-lg); background: var(--olive-900); }
.lb-count { color: rgb(var(--paper-rgb) / 0.78); font-size: var(--fs-caption); letter-spacing: 0.02em; }
/* Kontroller rastgele fotoğrafların üstünde oturur (parlak gökyüzü/beyaz duvar dahil)
   — .g-more'la aynı "koyu lacivert şeffaf + açık ikon" rozet dili, ton fotoğrafa
   göre değişmez, her zaman okunur (açık/şeffaf zemin parlak fotoğrafta neredeyse kaybolurdu). */
.lb-close {
  position: absolute; top: -52px; right: 0; z-index: 2; width: 40px; height: 40px; border-radius: 50%;
  display: grid; place-items: center; color: var(--paper); background: rgb(var(--shadow-rgb) / 0.55);
  border: 0; cursor: pointer; transition: background 0.2s;
}
.lb-close:hover { background: rgb(var(--shadow-rgb) / 0.72); }
.lb-close svg { width: 20px; height: 20px; }
.lb-nav {
  flex: none; width: 48px; height: 48px; border-radius: 50%; display: grid; place-items: center;
  color: var(--paper); background: rgb(var(--shadow-rgb) / 0.55); border: 0; cursor: pointer; transition: background 0.2s;
}
.lb-nav:hover { background: rgb(var(--shadow-rgb) / 0.72); }
.lb-nav svg { width: 22px; height: 22px; }
.lb-nav[disabled] { opacity: 0.3; cursor: default; pointer-events: none; }
@media (max-width: 700px) {
  .lb-shell { width: 100vw; flex-direction: column; gap: 16px; padding: 0 14px; }
  .lb-close { top: 14px; right: 14px; }
  .lb-fig img { max-height: 60vh; }
  .lb-nav { position: absolute; top: 50%; transform: translateY(-50%); }
  .lb-prev { left: 4px; }
  .lb-next { right: 4px; }
}

/* zemin ritmi (sektör standardı — emlak detay sayfası "beyaz belge" deseni):
   sayfa tepeden haritaya kesintisiz BEYAZ → benzer ilanlar KREM bandı → footer koyu.
   (Üstte krem + gövdede beyaz zigzag'ı reddedildi; nav camı beyaz üstünde
   Vantara alt sayfa deseniyle çalışır — kenarlık+fısıltı gölge yeter.) */
body.detail-page { background: var(--card); }
.detail-body { display: grid; grid-template-columns: 1.5fr 0.9fr; gap: clamp(30px, 4vw, 56px); margin-top: clamp(36px, 5vw, 60px); align-items: start; }

/* özellik tablosu — dolgulu bej mozaik DEĞİL (geniş alanda düşük kontrastlı ton =
   kirli bej algısı), Airbnb amenity deseni: çerçevesiz hairline liste;
   ton yalnız küçük ikon çiplerinde */
.spec-table { display: grid; grid-template-columns: repeat(2, 1fr); column-gap: clamp(28px, 4vw, 56px); }
.spec-cell { padding: 15px 2px; display: flex; align-items: center; gap: 14px; border-bottom: 1px solid var(--line-2); }
.spec-cell:nth-last-child(-n+2) { border-bottom: 0; }
.spec-cell .sc-ic { width: 40px; height: 40px; border-radius: var(--r-chip); background: var(--paper-2); color: var(--olive-700); display: grid; place-items: center; flex-shrink: 0; }
.spec-cell .sc-ic svg { width: 20px; height: 20px; }
.spec-cell .sc-l { font-size: var(--fs-caption); color: var(--muted); }
.spec-cell .sc-v { font-weight: 700; color: var(--olive-900); font-size: var(--fs-body); }
.detail-block { margin-top: clamp(36px, 4vw, 52px); }
.detail-block h2 { font-size: var(--fs-detail-h2); margin-bottom: 18px; }
.detail-desc p { color: var(--ink-2); margin-bottom: 14px; }
.detail-map { margin-top: 20px; border-radius: var(--r-md); overflow: hidden; border: 1px solid var(--line); position: relative; aspect-ratio: 16/8; background: var(--paper-2); }
.detail-map iframe { width: 100%; height: 100%; border: 0; filter: grayscale(0.3) sepia(0.12); }

/* ============================================================
   GENEL SAYFA ŞABLONU (page.php)
   ============================================================ */
/* Hakkımda, Hizmetler, bölge sayfaları, yasal metinler. İskelet: okunur
   ölçüde tek kolon; içerik the_content'ten gelir (KARARLAR §13). Üst boşluk
   .section-pad'den, "beyaz belge" zemini ilan detayıyla aynı. */
body.page-tpl { background: var(--card); }
.page-body .breadcrumb { margin-bottom: 22px; }
.page-head h1 { font-size: var(--fs-detail-h1); }
.page-copy { max-width: 68ch; margin-top: clamp(24px, 3vw, 36px); }
.page-copy > :first-child { margin-top: 0; }
.page-copy h2 { font-size: var(--fs-detail-h2); margin: clamp(32px, 4vw, 48px) 0 16px; }
.page-copy h3 { margin: 28px 0 12px; }
.page-copy p { color: var(--ink-2); margin-bottom: 14px; }
.page-copy ul, .page-copy ol { color: var(--ink-2); margin: 0 0 16px 1.2em; }
.page-copy li { margin-bottom: 8px; }
.page-copy a { color: var(--brass-600); text-decoration: underline; text-underline-offset: 2px; }

/* Miras içerik blokları (ticket 09). `the_content` bu sayfalarda tablo,
   figure, blockquote ve img basıyor; tema `wp-block-library`'yi koşulsuz
   kaldırdığı için (functions.php) bunların stili burada durmazsa Kayapa'nın
   sayısal verisi stilsiz açılırdı. */
.page-copy strong { color: var(--ink); font-weight: 600; }
.page-copy hr { border: 0; border-top: 1px solid var(--line); margin: clamp(28px, 4vw, 44px) 0; }
.page-copy figure { margin: clamp(24px, 3vw, 36px) 0; }
.page-copy figure img { display: block; width: 100%; height: auto; border-radius: var(--r-lg); }
.page-copy figcaption { margin-top: 10px; font-size: var(--fs-caption); color: var(--muted); }
.page-copy p img, .page-copy > img { max-width: 100%; height: auto; border-radius: var(--r-lg); }
.page-copy blockquote {
  margin: clamp(24px, 3vw, 36px) 0; padding: 4px 0 4px 20px;
  border-left: 3px solid var(--brass); color: var(--ink-2);
  font-size: var(--fs-lead); font-style: italic;
}
.page-copy blockquote p:last-child { margin-bottom: 0; }

/* Sayısal veri tablosu — mobilde kap yatay kaydırılır (figure.tablo-kaydir). */
.page-copy .tablo-kaydir { margin: clamp(24px, 3vw, 36px) 0; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.page-copy .tablo-kaydir table { margin: 0; }
.page-copy table { width: 100%; border-collapse: collapse; font-size: var(--fs-small); }
.page-copy th, .page-copy td { padding: 10px 14px; text-align: left; border-bottom: 1px solid var(--line); vertical-align: top; }
.page-copy thead th { color: var(--olive-900); font-family: var(--font-display); font-weight: 500; white-space: nowrap; }
.page-copy tbody th { font-weight: 600; color: var(--ink-2); }
/* Veri tablosunda sayısal değer bölünmez; satır etiketi (th) dar ekranda sarar. */
.page-copy .tablo-kaydir tbody td { white-space: nowrap; }
.page-copy tbody tr:last-child td, .page-copy tbody tr:last-child th { border-bottom: 0; }
.page-copy caption, .page-copy figcaption.tablo-atif { caption-side: bottom; margin-top: 10px; font-size: var(--fs-caption); color: var(--muted); text-align: left; }

/* ---- Talep formu sayfası (page-form.php) ----
   Üç form aynı kabuğu paylaşır. Gövde zemini `page-tpl` ile beyaz olduğu için
   form kabı beyaz kart olamaz (beyaz üstünde beyaz okunmaz): kap `--paper-2`
   dolgu + hairline kenarlık ile ayrılır — `.detail-loc`'un yüzey diliyle aynı.
   Kanca boşken de aynı kap kullanılır; sayfa "eksik" değil "henüz" görünür. */
.form-page .page-head .eyebrow { margin-bottom: 14px; }
.form-lead { max-width: 62ch; margin-top: 16px; font-size: var(--fs-lead); color: var(--ink-2); }
.form-shell {
  max-width: 720px; margin-top: clamp(28px, 3.5vw, 44px);
  padding: clamp(24px, 3vw, 38px);
  background: var(--paper-2); border: 1px solid var(--line); border-radius: var(--r-lg);
}
.form-bos h2 { font-size: var(--fs-detail-h2); color: var(--olive-900); }
.form-bos p { margin-top: 10px; color: var(--ink-2); max-width: 52ch; }
.form-bos-eylem { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 22px; }
.form-kvkk { max-width: 720px; margin-top: 14px; font-size: var(--fs-caption); color: var(--muted); }
.form-kvkk a { color: var(--brass-600); text-decoration: underline; text-underline-offset: 2px; }
/* Satıcı ↔ değerleme çapraz bağlantısı: formun altında, KVKK satırından bir
   tık baskın — yönlendirme cümlesidir, dipnot değil. */
.form-capraz { max-width: 720px; margin-top: 22px; font-size: var(--fs-small); color: var(--ink-2); }
.form-capraz a { color: var(--brass-600); font-weight: 600; text-decoration: underline; text-underline-offset: 2px; }

/* ---- Talep formu gövdesi (inc/talep-form.php) ----
   Kap `.form-shell` (--paper-2). Alanlar iki sütun, dar ekranda tek. Hata
   rengi --tf-hata: --paper-2 (#f5f2ed) üstünde 6.0:1 — WCAG AA metin. */
.tf-form { --tf-hata: #a5321c; }
.tf-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px 18px; }
.tf-alan { display: flex; flex-direction: column; min-width: 0; }
/* Dal alanlarını `talep-form.js` `el.hidden` ile kapatır; yazar kuralı olan
   `display:flex` tarayıcının `[hidden] { display:none }` kuralını ezer, o yüzden
   burada açıkça yazılır (`.tf-foto-sec[hidden]` ve `.g-item[hidden]` ile aynı
   sebep). Yazılmazsa konut seçiliyken arsanın imar durumu formda kalır. */
.tf-alan[hidden] { display: none; }
.tf-alan-genis, .tf-onay-satir { grid-column: 1 / -1; }
@media (max-width: 620px) { .tf-grid { grid-template-columns: 1fr; } }

/* `:not(.tf-onay)` şart: `tip: kutu` alanlarında (Asansörlü olsun, Krediyle
   almayı düşünüyorum) tek çocuk zaten `<label class="tf-onay">`. Muafiyet
   olmadan bu kural onları da alan etiketi sanıp BÜYÜK HARF + susturulmuş
   griye çeviriyordu; ekranda seçilebilir bir kutu değil, pasif bir başlık
   okunuyordu — üstlerindeki aynı biçim WhatsApp onayı normal cümle iken. */
.tf-alan > label:not(.tf-onay),
.tf-radyo legend { font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); margin-bottom: 7px; }
/* Onay kutusu iki sütunlu ızgarada tek başına bir hücre kaplar ve yanındaki
   alan etiket+kutu diye iki katlı olduğu için kutu havada, komşusunun
   ETİKETİ hizasında duruyordu (en görünür yeri: değerlemede "Site içinde"
   ile "Tapu tipi" yan yana). Hücrenin ALTINA yaslanınca komşu kontrolün alt
   kenarıyla aynı çizgiye oturur. İki onay kutusu yan yana geldiğinde satır
   zaten onların boyunda, kural bir şeyi değiştirmez. */
.tf-alan-kutu { justify-content: flex-end; }
.tf-alan > .tf-onay { padding: 6px 0; }
.tf-yildiz { color: var(--brass-600); }

.tf-alan input,
.tf-alan select,
.tf-alan textarea {
  width: 100%; padding: 12px 14px; border-radius: var(--r-sm);
  background: var(--card); border: 1.5px solid var(--line-control, var(--line));
  outline: none; font-weight: 500; transition: border-color 0.2s, box-shadow 0.2s;
}
.tf-alan textarea { resize: vertical; min-height: 84px; }
.tf-alan input:focus,
.tf-alan select:focus,
.tf-alan textarea:focus { border-color: var(--brass-600); box-shadow: 0 0 0 3px rgb(var(--brass-600-rgb) / 0.12); }

/* Özel açılır menü (`app.js` `<select>`i `.cs`ye çevirir) TALEP FORMUNDA
   kutusuz kalıyordu: `.cs-trigger`in kutu görünümü yalnız `.field`
   (değerleme formu) ve `.hs-field` (hero arama) altında tanımlıydı. Sonuç,
   "Gayrimenkul türü" ve "İl" — formun iki eksen alanı — 27px'lik düz yazı
   gibi dururken yanlarındaki "Ad Soyad" 54px'lik halkalı kutuydu; ikisinin
   tıklanabilir olduğu ekrandan okunmuyordu. Ölçüler `.tf-alan input`in
   AYNISI: aynı dolgu, aynı köşe, aynı halka, aynı odak. */
.tf-alan .cs-trigger {
  padding: 12px 14px; border-radius: var(--r-sm);
  background: var(--card); border: 1.5px solid var(--line-control, var(--line));
  transition: border-color 0.2s, box-shadow 0.2s;
}
.tf-alan .cs-value { font-weight: 500; }
.tf-alan .cs.open .cs-trigger,
.tf-alan .cs-trigger:focus-visible {
  border-color: var(--brass-600); box-shadow: 0 0 0 3px rgb(var(--brass-600-rgb) / 0.12);
  outline: none;
}
.tf-alan-hata .cs-trigger { border-color: var(--tf-hata); }

.tf-sonekli { position: relative; display: flex; align-items: center; }
.tf-sonekli input { padding-right: 44px; }
.tf-sonek { position: absolute; right: 14px; color: var(--muted); font-size: var(--fs-small); pointer-events: none; }

/* Birim seçici (m²/Dönüm) alan kutusunun İÇİNDE durur — ayrı bir "Birim"
   satırı değil (TALEP-SEMASI §1b). Kutu artık sarmalayıcı `.tf-sonekli-secim`:
   içteki input kendi kenarlığını bırakır, seçici alanın sağ ucuna gömülür
   (fiyat + para birimi kutularındaki "değer + birim tek kutu" deseni). `.tf-alan`
   öneki `.tf-alan input/select`in genel kutu biçimini burada ezmek için gerekli. */
.tf-alan .tf-sonekli-secim {
  border: 1.5px solid var(--line-control, var(--line)); border-radius: var(--r-sm);
  background: var(--card); transition: border-color 0.2s, box-shadow 0.2s;
}
.tf-alan .tf-sonekli-secim:focus-within {
  border-color: var(--brass-600); box-shadow: 0 0 0 3px rgb(var(--brass-600-rgb) / 0.12);
}
.tf-alan .tf-sonekli-secim input {
  flex: 1 1 auto; min-width: 0;
  border: 0; background: transparent; padding-right: 10px;
}
.tf-alan .tf-sonekli-secim input:focus { border: 0; box-shadow: none; }
.tf-alan .tf-sonek-secim {
  /* Native `<select>` görünümü KORUNUR (appearance:none YOK): açılan listeyi /
     mobil seçim tekerini platform çizer ve "Dönüm" hiçbir ende kırpılmaz.
     `width:auto` — kutu en geniş seçeneğe + kendi okuna göre daralır; sabit
     genişlik verince mobil teker "Dönüm"ü "Dön" diye kesiyordu. */
  flex: 0 0 auto; width: auto; min-width: 3.5rem; align-self: stretch;
  margin: 4px 4px 4px 0; padding: 0 6px 0 12px;
  border: 0; border-left: 1.5px solid var(--line-control, var(--line));
  border-radius: 0; background: transparent;
  color: var(--muted); font-size: var(--fs-small); font-weight: 600; cursor: pointer;
}
.tf-alan .tf-sonek-secim:focus { box-shadow: none; }

.tf-ipucu { margin-top: 6px; font-size: var(--fs-caption); color: var(--muted); }
.tf-hata { margin-top: 6px; font-size: var(--fs-caption); font-weight: 600; color: var(--tf-hata); }
.tf-alan-hata input,
.tf-alan-hata select,
.tf-alan-hata textarea { border-color: var(--tf-hata); }
/* Alan/yüzölçümü kutusunda kenarlık sarmalayıcıda (input'ta değil) — hata
   rengi de oraya. */
.tf-alan-hata .tf-sonekli-secim { border-color: var(--tf-hata); }

/* Seçenek grupları (satılık/kiralık · ilçe · oda sayısı) HAP kontroldür.
   Gerekçe üç katlı ve ölçüldü:
   (a) Bu üç alan formu yeniden kuran eksenlerdir; çıplak 13px'lik tarayıcı
       radyosu onları formun en önemsiz görünen parçası yapıyordu.
   (b) 17 ilçe kutusu tırtıklı bir duvar oluyordu — hap, seçeneği kendi
       sınırıyla çizer, satırlar hizalanır.
   (c) Dokunma alanı 33px'ti (17 hedef, yan yana); hap 40px tabanı verir.
   Fieldset flex olunca legend de bir flex öğesidir; `flex: 0 0 100%`
   yazılmazsa hapların yanına düşer. */
.tf-radyo { border: 0; padding: 0; margin: 0; display: flex; flex-flow: row wrap; row-gap: 9px; column-gap: 8px; }
.tf-radyo legend { flex: 0 0 100%; margin-bottom: 0; }
.tf-radyo-sec {
  position: relative;
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 40px; padding: 9px 16px;
  border: 1px solid var(--line-control, var(--line)); border-radius: 999px;
  background: var(--card); color: var(--ink);
  font-size: var(--fs-small); font-weight: 500; line-height: 1.2; cursor: pointer;
  transition: background-color 0.18s, border-color 0.18s, color 0.18s;
}
.tf-radyo-sec:hover { border-color: var(--olive-700); background: var(--paper); }
/* Seçili hap: dolu lacivert + beyaz metin. Kontrast doygunluktan gelir —
   ikinci bir ton ailesi açılmaz (DESIGN.md "İki Eksen Kuralı"). */
.tf-radyo-sec:has(input:checked) {
  background: var(--olive-800); border-color: var(--olive-800); color: #fff;
}
.tf-radyo-sec:has(input:checked):hover { background: var(--olive-900); border-color: var(--olive-900); }
/* Odak halkası formun geri kalanıyla aynı: karamel kenarlık + %12 halka. */
.tf-radyo-sec:has(input:focus-visible) {
  border-color: var(--brass-600); box-shadow: 0 0 0 3px rgb(var(--brass-600-rgb) / 0.12);
}
/* Hata işareti etikete konur, HAPLARA değil: 17 ilçe hapsının kenarlığını
   birden kırmızıya çevirmek "on yedi şey yanlış" diye okunuyor — oysa eksik
   olan TEK alan. Grubun kimliği etiketidir; mesaj hemen altında durur. */
.tf-alan-hata .tf-radyo legend { color: var(--tf-hata); }
.tf-radyo-sec input {
  position: absolute; left: 50%; top: 50%; width: 1px; height: 1px; margin: 0;
  opacity: 0; pointer-events: none;
}
/* `:has()` yoksa (eski tarayıcı) seçili durum görünmez kalırdı — hap sökülür,
   tarayıcının kendi kutusu geri gelir. Biçim kaybolur, bilgi kaybolmaz. */
@supports not selector(:has(*)) {
  .tf-radyo { flex-direction: column; row-gap: 0; }
  .tf-radyo-coklu { flex-flow: row wrap; gap: 4px 20px; }
  .tf-radyo-sec {
    display: flex; align-items: flex-start; justify-content: flex-start;
    min-height: 0; padding: 4px 0; border: 0; border-radius: 0;
    background: none; gap: 10px;
  }
  .tf-radyo-sec input { position: static; left: auto; top: auto; width: auto; height: auto; opacity: 1; margin-top: 3px; pointer-events: auto; accent-color: var(--olive-800); }
}
/* Yüksek kontrast kipinde arka plan renkleri düşer — seçili hap ile boş hap
   ayırt edilemez kalırdı. Sistem "seçili" rengiyle kalın kenarlık konur. */
@media (forced-colors: active) {
  .tf-radyo-sec { border: 1px solid ButtonBorder; }
  .tf-radyo-sec:has(input:checked) { border: 3px solid Highlight; }
}
.tf-onay { display: flex; align-items: flex-start; gap: 10px; font-weight: 500; cursor: pointer; }
.tf-onay input { width: 18px; height: 18px; margin-top: 1px; flex-shrink: 0; accent-color: var(--olive-800); }
.tf-onay span a { color: var(--brass-600); text-decoration: underline; text-underline-offset: 2px; }
.tf-onay em { color: var(--muted); font-style: normal; }
.tf-onay-hata { color: var(--tf-hata); }

.tf-onay-satir { margin-top: 2px; }

.tf-ek { grid-column: 1 / -1; margin-top: 20px; border-top: 1px solid var(--line); padding-top: 16px; }
/* Tarayıcının çizdiği ▶ üçgeni hiçbir tasarım sistemine ait değil ve formun
   tek katlanır kontrolünü "eklenti" gibi gösteriyordu. Yerine sistemin
   karamel çevrik oku; açılınca aşağı döner. Satır 40px'e çıkar (dokunma). */
.tf-ek > summary {
  display: flex; align-items: center; gap: 10px;
  min-height: 40px; margin: -8px 0; padding: 8px 0;
  font-weight: 600; color: var(--olive-900); cursor: pointer;
  list-style: none;
}
.tf-ek > summary::-webkit-details-marker { display: none; }
.tf-ek > summary::before {
  content: ''; flex: 0 0 auto; width: 8px; height: 8px; margin-left: 3px;
  border-right: 2px solid var(--brass-600); border-bottom: 2px solid var(--brass-600);
  transform: rotate(-45deg); transition: transform 0.2s ease;
}
.tf-ek[open] > summary::before { transform: rotate(45deg); }
.tf-ek > summary:hover { color: var(--brass-600); }
.tf-ek > summary:focus-visible { outline: 2px solid var(--brass-600); outline-offset: 3px; border-radius: var(--r-xs); }
.tf-ek .tf-grid { margin-top: 16px; }

.tf-kvkk { margin-top: 22px; display: flex; flex-direction: column; gap: 14px; font-size: var(--fs-small); }

/* Gönderim uyarısı (`.pn-uyari`) — panelin sınıfı ama ÖN YÜZDE de basılıyor
   (talep formları, ilan sorusu, ziyaretçi foto hattı). panel.css yalnız
   /panel'de yüklendiği için bu kutu ziyaretçiye bugüne dek biçimsiz düz metin
   olarak gidiyordu: gönderim başarısız olduğunda ekranda "başarısız oldu"
   diyen tek işaret hiçbir şeye benzemiyordu. Panelin kopyası değil:
   4px'lik renkli sol kenarlık yok ve mürekkep lacivert — panelin karamel
   metni karamel zemin üstünde 3.98:1'de kalıyor, lacivert 11.3:1. */
.pn-uyari {
  margin: 0 0 18px; padding: 12px 16px;
  border: 1px solid var(--brass); border-radius: var(--r-xs);
  background: var(--brass-100); color: var(--olive-900);
  font-size: var(--fs-small); font-weight: 500;
}

/* Honeypot — ekran dışında, ekran okuyucudan gizli, sekmeyle atlanır. */
.tf-hp { position: absolute; left: -9999px; width: 1px; height: 1px; overflow: hidden; }

.tf-gonder { margin-top: 24px; }

.tf-basari h2 { font-size: var(--fs-detail-h2); color: var(--olive-900); }
.tf-basari p { margin: 10px 0 20px; color: var(--ink-2); max-width: 52ch; }

/* ---- Ziyaretçi fotoğraf alanı — katlanır bölümde (inc/talep-foto.js) ----
   Panelin fotoğraf karosuyla akraba dil: kare karo, `object-fit: cover`,
   köşede yuvarlak kaldır düğmesi. JS kapalıyken `.tf-foto` `hidden` kalır. */
.tf-foto { margin-top: 18px; display: flex; flex-direction: column; gap: 8px; }
.tf-foto-baslik { font-size: var(--fs-label); font-weight: 700; letter-spacing: 0.05em; text-transform: uppercase; color: var(--muted); }
.tf-foto-baslik em { font-style: normal; font-weight: 500; text-transform: none; letter-spacing: 0; color: var(--muted-2); }
.tf-foto-yardim { font-size: var(--fs-caption); color: var(--muted); margin: -2px 0 2px; }
.tf-foto-sayac { font-size: var(--fs-caption); color: var(--muted); }

.tf-foto-kareler { list-style: none; margin: 4px 0 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(92px, 1fr)); gap: 10px; }
.tf-foto-kareler:empty { display: none; }

.tf-foto-k { position: relative; aspect-ratio: 1; border-radius: var(--r-sm); overflow: hidden; background: var(--paper-2); border: 1px solid var(--line); }
.tf-foto-k img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Yükleniyor: ince ilerleme çubuğu karonun ortasında. */
.tf-foto-k-bar { position: absolute; left: 12px; right: 12px; top: 50%; height: 4px; transform: translateY(-50%); border-radius: 999px; background: rgb(var(--olive-800-rgb) / 0.14); overflow: hidden; }
.tf-foto-k-bar > i { display: block; height: 100%; width: 0; background: var(--brass-600); transition: width 0.2s linear; }

/* Hata karosu: fotoğraf yok, kısa cümle. */
.tf-foto-k.is-hata { display: flex; align-items: center; justify-content: center; padding: 8px; background: var(--paper-2); }
.tf-foto-k-hata { font-size: var(--fs-caption); font-weight: 600; color: var(--tf-hata); text-align: center; line-height: 1.3; }

/* Kaldır / durdur düğmesi — karo köşesinde, dokunmatikte de rahat hedef. */
.tf-foto-k-kaldir { position: absolute; top: 4px; right: 4px; width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; padding: 0; border: 0; border-radius: 50%; cursor: pointer; background: rgb(var(--shadow-rgb) / 0.72); color: #fff; }
.tf-foto-k-kaldir:hover { background: rgb(var(--shadow-rgb) / 0.85); }
.tf-foto-k-kaldir:disabled { opacity: 0.5; cursor: default; }
.tf-foto-k-kaldir svg { display: block; width: 15px; height: 15px; }
.tf-foto-k.is-hata .tf-foto-k-kaldir { background: rgb(var(--olive-800-rgb) / 0.5); }

/* "Fotoğraf seçin" — ikincil, çerçeveli düğme; gerçek girdi görünmez. */
.tf-foto-sec { align-self: flex-start; display: inline-flex; align-items: center; gap: 8px; margin-top: 4px; padding: 9px 16px; border: 1px solid var(--line-control); border-radius: var(--r-sm); font-size: var(--fs-small); font-weight: 600; color: var(--olive-900); cursor: pointer; background: var(--card); }
.tf-foto-sec:hover { border-color: var(--brass-600); color: var(--brass-600); }
.tf-foto-sec[hidden] { display: none; }
.tf-foto-girdi { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.tf-foto-girdi:focus-visible + .tf-foto-sec-yazi { text-decoration: underline; }

/* ---- İlan sorusu — satır içi form (inc/ilan-sorusu.php) ----
   Danışman kartında, WhatsApp/Ara düğmelerinin ALTINDA durur. Dar sütun:
   alanlar her zaman tek kolon. WhatsApp birincil eylem olarak üstte kalır. */
.ilan-soru-form { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--line-2); }
.ilan-soru-form .tf-grid { grid-template-columns: 1fr; gap: 13px; }
.ilan-soru-baslik { font-size: var(--fs-small); font-weight: 600; color: var(--olive-900); margin-bottom: 13px; }
.ilan-soru-form .tf-kvkk { margin-top: 15px; font-size: var(--fs-caption); }
.ilan-soru-form .tf-gonder { margin-top: 15px; }
.ilan-soru-basari { margin-top: 18px; padding-top: 18px; border-top: 1px solid var(--line-2); }
.ilan-soru-basari h2 { font-size: var(--fs-num-sm); color: var(--olive-900); }
.ilan-soru-basari p { margin-top: 8px; font-size: var(--fs-small); color: var(--ink-2); }

/* danışman kartı (sticky) — beyaz gövde zemininde kenarlık bir kademe belirgin */
.agent-card { position: sticky; top: 100px; background: var(--card); border-radius: var(--r-lg); padding: 28px 26px; box-shadow: var(--shadow); border: 1px solid var(--line); }
.agent-top { display: flex; align-items: center; gap: 15px; }
.agent-top .ag-av { width: 62px; height: 62px; border-radius: 50%; background-size: cover; background-position: center; background-color: var(--olive-300); flex-shrink: 0; }
.agent-top .ag-name { font-family: var(--font-display); font-size: var(--fs-num-sm); color: var(--olive-900); }
.agent-top .ag-role { font-size: var(--fs-caption); color: var(--muted); }
/* Yıldızlar ve puan GÖRÜNÜR metindir (yalnız ekran okuyucudan gizli); --brass
   13.8px'te 3.04:1 veriyordu → okunur karamel: 5.16:1. Puan rakamı ikincil tonda. */
.agent-rating { margin-top: 3px; color: var(--brass-600); font-size: var(--fs-caption); }
.agent-rating .ag-rating-num { color: var(--muted); }
.agent-actions { display: flex; flex-direction: column; gap: 10px; margin-top: 22px; }
/* Değerleme çağrısı (ticket 18): satılan/aktif split'inin dışında durduğu için
   kendi üst çizgisini taşır — agent-meta ile aynı ayraç deseni. */
.agent-valuation { max-width: none; margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--line-2); }
.agent-meta { margin-top: 20px; padding-top: 18px; border-top: 1px solid var(--line-2); display: flex; flex-direction: column; gap: 10px; font-size: var(--fs-small); color: var(--muted); }
.agent-meta div { display: flex; align-items: center; gap: 9px; }
.agent-meta svg { width: 15px; height: 15px; color: var(--brass); }
.agent-ref { font-family: var(--font-display); }

/* benzer ilanlar — krem zemin: beyaz kartlar index listings'teki gibi pop yapar */
.similar { background: var(--cream); }
.grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 26px; margin-top: 40px; }

/* ============================================================
   REVEAL ANİMASYON
   ============================================================ */
.reveal { opacity: 0; transform: translateY(26px); transition: opacity 0.8s var(--ease-out), transform 0.8s var(--ease-out); }
.reveal.in { opacity: 1; transform: none; }
.reveal.d1 { transition-delay: 0.08s; }
.reveal.d2 { transition-delay: 0.16s; }
.reveal.d3 { transition-delay: 0.24s; }
.reveal.d4 { transition-delay: 0.32s; }

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width: 1080px) {
  .trust-band .wrap { grid-template-columns: repeat(2, 1fr); gap: 26px; }
  .portals { grid-column: 1 / -1; border-left: none; border-top: 1px solid var(--line); padding-left: 0; padding-top: 20px; flex-direction: row; align-items: center; justify-content: space-between; }
  .valuation .wrap, .about .wrap, .faq-grid, .pitch-grid { grid-template-columns: 1fr; }
  .svc-grid { grid-template-columns: repeat(2, 1fr); }
  .svc-wide { grid-column: span 2; }
  .about-visual { max-width: 440px; }
  .pitch-grid > .mock-window { order: -1; }
  .detail-body { grid-template-columns: 1fr; }
  .agent-card { position: static; }
  .faq-aside { position: static; }
}
@media (max-width: 820px) {
  /* dar başlıkta logo küçülür (slogan okunmayabilir — kabul, KARARLAR §14) */
  .nav .brand--logo img { height: 44px; }
  /* hero: koyu scrim + açık metin (görsel tam görünsün) */
  .hero { --hero-ink: var(--paper); --hero-muted: rgb(var(--cream-rgb) / 0.92); min-height: 92vh; }
  .hero-media img { object-position: center; }
  /* Mobil perde — GERÇEK PİKSELLE yeniden ölçüldü.
     İki ayrı düzeltme bir arada:
     1) Mürekkep lacivert oldu. Eskiden zeytin-siyahıydı: telefonda tam ekranı kaplayan
        en büyük boyalı alan palet göçünde atlanmıştı, fotoğrafa kahverengimsi ton veriyordu.
     2) Opaklık profili yükseltildi (0.54/0.50/0.82 → 0.74/0.68/0.88). Eski profil
        BİR ÖNCEKİ hero fotoğrafına göre kalibre edilmişti; kullanıcının kendi görseli
        (parlak gökyüzü + havuz) geldiğinde yeniden ölçülmemişti. Canvas'tan gerçek
        piksel örnekleyip WCAG hesabı yapıldığında eski profil şunları veriyordu:
        h1 3.25 (eşik 3.0, kıl payı), lead **2.93** ve eyebrow **2.17** — ikisi de
        4.5 eşiğinin belirgin altında. Yeni profil: h1 5.96 · lead 5.20 · eyebrow 5.75.
        (Ölçüm gerçek glif kutularıyla yapıldı — blok kutusuyla değil, çünkü blok
        kutusu glifin olmadığı boşluğu örnekleyip sahte sonuç verir.)
     DESIGN.md'nin "Perde, Fotoğrafı Takip Eder" kuralı masaüstü için uygulanmıştı;
     bu tur kuralın MOBİL profili de kapsadığı netleşti. */
  /* Perde kalınlığı METNİN OLDUĞU yere gider, orana değil. Önceki profil (0.74 / 0.68 /
     0.88) en kalın örtüsünü %100'e, yani TAMAMEN OPAK arama kartının altına koyuyordu:
     korunacak metnin olmadığı yerde fotoğrafın alt yarısı (havuz, teras, sıcak iç ışık)
     bedavaya siliniyordu — masaüstü perdesinin yorumunda anlatılan "ölü levha" hatasının
     dikey eksende tekrarı. Metin bandındaki koruma AYNEN korundu (0.72; ölçüm: eyebrow
     5.7 · h1 6.3 · lead 5.3 — eski profilin 5.75/5.96/5.20 değerleriyle eşdeğer), yalnız
     kartın altı serbest bırakıldı.
     Duraklar yüzde DEĞİL iki gerçek çapaya bağlıdır, çünkü hero içeriği flex-end'dir ve
     yüzde duraklar kısa ekranda metnin altından kayar:
       · üst  → var(--nav-h): .hero-content'in padding-top'u da bu, yani metin hiçbir
                ekran yüksekliğinde bu çizginin üstüne çıkamaz;
       · alt  → calc(100% - 392px): arama kartının üst kenarı hero dibinden 380px yukarıda
                (kart 344px + 36px padding-bottom), geçiş 12px öncesinde başlar ve kartın
                arkasında biter. Kart ölçüsü değişirse bu iki sayı yeniden ölçülür. */
  .hero-scrim {
    background: linear-gradient(180deg,
      rgb(var(--olive-950-rgb) / 0.38) 0,
      rgb(var(--olive-950-rgb) / 0.72) var(--nav-h),
      rgb(var(--olive-950-rgb) / 0.72) calc(100% - 392px),
      rgb(var(--olive-950-rgb) / 0.32) calc(100% - 340px),
      rgb(var(--olive-950-rgb) / 0.28) 100%);
  }
  /* eyebrow 12px'te --brass-300 ile 3.90:1 kalıyordu (küçük metin eşiği 4.5);
     karamel ailesinin en açık kademesi 5.75:1 verir — hue korunur, eşik geçilir */
  .hero .eyebrow { color: var(--brass-100); }
  /* içerik 92vh'yi aşınca üste taşan pay padding-top'tan geliyordu (masaüstünün ortalama düzeni için
     eklenen ekstra clamp payı burada gereksiz — flex-end zaten alta yaslıyor) → mobilde yalnız nav-h payı */
  .hero-content { display: flex; flex-direction: column; justify-content: flex-end; min-height: 92vh; padding-top: var(--nav-h); padding-bottom: 36px; }
  .hero h1 em { color: var(--brass-300); }
  /* masaüstünde display ölçeğiyle birlikte açılan dikey paylar burada geri alınır:
     telefonda içerik zaten 92vh'yi zorluyor, +18px kazanılmış yer değil kaybedilmiş yerdir */
  /* Satır aralığı mobilde AYRI ayarlanır çünkü kompozisyon ayrıdır: masaüstünde başlık
     2 satır, telefonda 3 (390px'te "Aradığınız / gayrimenkul / burada."). 1.03 tek satır
     arası için doğru, üst üste iki geçiş için değil — ölçüldü: 40px'te satır kutusu 41.2px,
     "gayrimenkul" italiğinin iniş çizgisi 10px, "burada"nın çıkış çizgisi 30px → g ile b
     arasında yalnız **1.2px** (0.03em) kalıyordu, yani soldaki g kuyruğu b gövdesine
     değiyordu. 1.12 → 44.8px satır kutusu, açıklık 4.8px (0.12em): display katı için
     hâlâ sıkı ama glifler artık çarpışmıyor. Maliyet 3 satırda ~11px; hero'nun 390×844'te
     ölçülen 23px dikey payının içinde kalır (içerik flex-end, taşma yok). */
  .hero h1 { margin-top: 16px; line-height: 1.12; }
  .hero .lead { margin-top: 20px; }
  .hero-search { margin-top: 28px; }
  /* floating pill kendi açık zeminini taşıdığından marka lacivert kalır;
     parlak hero üzerinde okunurluk için mobilde cam zemin daha opak (specular korunur) */
  .nav .wrap {
    background:
      linear-gradient(180deg, rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0) 55%),
      rgba(255, 255, 255, 0.78);
  }
  .nav.scrolled .wrap {
    background:
      linear-gradient(180deg, rgba(255, 255, 255, 0.44), rgba(255, 255, 255, 0) 55%),
      rgba(255, 255, 255, 0.92);
  }
  .grid-listings, .svc-grid, .proc-grid, .grid-3 { grid-template-columns: repeat(2, 1fr); }
  .tst-card { flex-basis: calc((100% - 24px) / 2); }
  .navlinks, .nav-phone { display: none; }
  .nav-right { margin-left: auto; }
  .nav-right .btn { display: none; }
  .burger { display: flex; }
  .hs-fields { grid-template-columns: 1fr 1fr; }
  .hs-field:nth-child(3) { grid-column: 1 / -1; } /* Bütçe tam genişlik: yetim alan/boşluk olmasın */
  .hs-submit { grid-column: 1 / -1; }
  .hs-submit button { min-height: 52px; }
  /* Bar yalnız mobilde vardır; görünme/gizlenme durumu `.is-visible` ile yönetilir
     (bileşenin kendi bloğuna bakınız) — `display` geçiş alamadığı için burada sabit. */
  .sticky-bar { display: flex; }
  body { padding-bottom: 76px; }
  .gallery { grid-template-columns: 1fr 1fr; grid-template-rows: 1.4fr 1fr; height: 400px; }
  .gallery .g-item:first-child { grid-column: 1 / 3; }
  .gallery .g-item:nth-child(n+4) { display: none; }
  .detail-headrow { flex-direction: column; align-items: flex-start; }
  .detail-price { text-align: left; }
  /* topband: 5 satıra kırılınca 10px flex satır-arası band'ı ~130px'e şişiriyordu */
  .topband { font-size: var(--fs-caption-tight); }
  .topband .tb-txt { gap: 4px 10px; }
  /* İkincil cümle 820px altında düşer: ölçümde 678px'te metin 3 satıra kırılıp
     bandı 85px'e çıkarıyordu — tablet/telefon ilk ekranında hero'dan çalınan yer.
     Çekirdek vaat + CTA tek satırda kalır (≈54px). */
  .wa-band .wrap { gap: 12px; }
  .wa-band .wb-long { display: none; }
  /* footer: 4 kolon dar ekranda kelime-kelime kırılıyordu → marka tam satır + 2 kolon link listesi */
  .footer .f-cols { grid-template-columns: 1fr 1fr; gap: 36px 28px; }
  .footer .f-cols > div:first-child { grid-column: 1 / -1; }
}
@media (max-width: 560px) {
  body { font-size: 16px; }
  /* dar telefonda uzun tanıtım cümlesi 2-3 satıra kırılıp topband'ı şişiriyordu (ilk ekranda pitch'e ayrılan
     alanı yiyor) → yalnız etiket + link kalır, tek satır garanti */
  .topband .tb-txt > span:not(.tb-tag) { display: none; }
  /* Reklam bandı MOBİLDE DE KONUŞUR (sade bandın tersine) — Instagram trafiğinin
     tamamına yakını mobil, çerçeveyi taşıyan cümle burada susarsa hiç konuşmamış
     olur. 375px'te yer kıt: etiket pili de düşer, çekirdek vaat + tek CTA kalır
     (metin 2 satıra kırılır, band 63px — ölçüldü). */
  .wa-band .wb-tag { display: none; }
  .wa-band .wrap { gap: 10px; padding-block: 11px; }
  /* Reklamın para butonu telefonda 44px'in altına inmez — hedef dolguyla değil
     `min-height` ile sabitlenir, font metriği değişse de kaymasın. */
  .wa-band .btn-sm { padding: 11px 16px; min-height: 44px; }
  .grid-listings, .svc-grid, .proc-grid, .grid-3, .spec-table, .field-row { grid-template-columns: 1fr; }
  /* tek kolonda sondan 2. hücrenin ayracı geri gelsin (masaüstü kuralı son SATIRI hedefliyordu) */
  .spec-cell:nth-last-child(2) { border-bottom: 1px solid var(--line-2); }
  .svc-wide { grid-column: auto; }
  .tst-card { flex-basis: 100%; }
  .trust-band .wrap { grid-template-columns: 1fr 1fr; }
  /* hero arama: telefonda tek sütun — tüm alanlar hizalı ve tam genişlik */
  .hs-fields { grid-template-columns: 1fr; }
  /* filtre çubuğu: gruplar alt alta net satırlar; anlamsız dikey çizgiler kalksın */
  .filter-bar {
    flex-direction: column; align-items: stretch; gap: 0;
    border-radius: var(--r-lg); padding: 4px 14px;
  }
  .fb-divider { display: none; }
  .fb-group { flex-wrap: wrap; gap: 6px; padding: 11px 0; }
  .fb-group ~ .fb-group { border-top: 1px solid var(--line); }
  .fb-count {
    width: 100%; margin-left: 0; padding: 11px 2px 4px;
    border-top: 1px solid var(--line);
  }
  .about-badge { right: 0; bottom: -16px; padding: 14px 16px; }
  .mock-app { grid-template-columns: 1fr; }
  .mock-side { flex-direction: row; padding: 10px; justify-content: center; }
}

/* ============================================================
   TEMA EKLERİ — WordPress dönüşümünde ortaya çıkan iki durum.
   Statik demoda karşılığı yoktu; yeni tasarım kararı DEĞİL,
   dinamik içeriğin gerektirdiği asgari kural.
   ============================================================ */

/* Galeri 5 karo basar; fazlası lightbox dizisine girsin diye gizli düğme
   olarak durur. Grid çocuğu olduğu için [hidden] tek başına yetmiyor. */
.gallery .g-item[hidden] { display: none; }

/* İlan videosu — CEPHE DESENİ (KARARLAR §9). Kapak ilanın kendi
   fotoğrafıdır ve <iframe> ancak tıklamada yerine geçer; kap ölçüsü iki
   durumda da aynı (16/9) olduğu için oynatıcı gelince sayfa zıplamaz.
   Rozet dili .g-more ile aynı: koyu şeffaf zemin + açık glif, ton
   fotoğrafa göre değişmez. */
.video-facade {
  position: relative; margin-top: 20px; aspect-ratio: 16 / 9; overflow: hidden;
  border: 1px solid var(--line); border-radius: var(--r-md); background: var(--olive-900);
}
.video-facade .vf-play, .video-facade iframe { position: absolute; inset: 0; }
.video-facade iframe { border: 0; display: block; }
/* Odak halkası dışa taşıyordu; kap overflow:hidden olduğu için kırpılırdı. */
.vf-play { display: block; padding: 0; border: 0; background: none; cursor: pointer; }
.vf-play:focus-visible { outline-offset: -4px; }
.vf-play img { width: 100%; height: 100%; object-fit: cover; display: block; transition: transform 0.5s var(--ease); }
.vf-play:hover img { transform: scale(1.04); }
.vf-btn {
  position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
  width: 74px; height: 74px; border-radius: 50%; display: grid; place-items: center;
  color: var(--paper); background: rgb(var(--shadow-rgb) / 0.62);
  backdrop-filter: blur(6px); -webkit-backdrop-filter: blur(6px);
  transition: background 0.2s, transform 0.2s var(--ease);
}
.vf-play:hover .vf-btn { background: rgb(var(--shadow-rgb) / 0.78); transform: translate(-50%, -50%) scale(1.06); }
.vf-btn svg { width: 30px; height: 30px; margin-left: 4px; }
@media (prefers-reduced-motion: reduce) {
  .vf-play img, .vf-btn { transition: none; }
  .vf-play:hover img { transform: none; }
  .vf-play:hover .vf-btn { transform: translate(-50%, -50%); }
}

/* Konum bloğu v1'de gömülü harita değil, mahalle/ilçe metnidir
   (TEMA-REHBERI §4). .detail-map'in yüzey diliyle aynı kap. */
.detail-loc {
  margin-top: 20px; padding: 16px 18px;
  border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--paper-2); color: var(--ink-2);
  font-size: var(--fs-body);
  display: flex; align-items: center; gap: 10px;
}
.detail-loc svg { width: 20px; height: 20px; color: var(--olive-700); flex: none; }

/* ============================================================
   İLETİŞİM YÜZEYİ (page-iletisim.php)
   ============================================================ */
/* İki hızlı yöntem kartı + olgu listesi + statik harita. Harita gömülü
   DEĞİL (KARARLAR §13): görsel sayfanın öne çıkan görselidir (OSM'den bir
   kez üretilir), tıklayınca Google işletme kaydı / yol tarifi açılır. */
.contact-surface { margin-top: clamp(32px, 4vw, 48px); max-width: 760px; }

.contact-methods { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 640px) { .contact-methods { grid-template-columns: 1fr; } }
.contact-method {
  display: flex; flex-direction: column; align-items: flex-start; gap: 4px;
  padding: 22px 22px 20px; text-decoration: none;
  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-md);
  transition: transform 0.25s var(--ease), box-shadow 0.25s var(--ease);
}
.contact-method:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.contact-method .cm-ic {
  width: 44px; height: 44px; border-radius: var(--r-sm); margin-bottom: 8px;
  display: grid; place-items: center; color: #fff;
}
.contact-method .cm-ic svg { width: 22px; height: 22px; }
.cm-wa .cm-ic { background: var(--wa); }
.cm-call .cm-ic { background: var(--olive-800); }
.contact-method .cm-k { font-size: var(--fs-caption); color: var(--muted); }
.contact-method .cm-v {
  font-family: var(--font-display); font-weight: 600; color: var(--olive-900);
  font-size: var(--fs-lead); letter-spacing: -0.01em;
}
.contact-method .cm-d { font-size: var(--fs-caption); color: var(--ink-2); }

.contact-facts { list-style: none; margin: 22px 0 0; padding: 0; }
.contact-facts li {
  display: flex; gap: 14px; align-items: flex-start;
  padding: 16px 2px; border-bottom: 1px solid var(--line-2);
}
.contact-facts li:last-child { border-bottom: 0; }
.contact-facts .cf-ic {
  width: 38px; height: 38px; border-radius: var(--r-chip); flex-shrink: 0;
  background: var(--paper-2); color: var(--olive-700);
  display: grid; place-items: center;
}
.contact-facts .cf-ic svg { width: 19px; height: 19px; }
.contact-facts .cf-tx { display: flex; flex-direction: column; gap: 3px; }
.contact-facts .cf-tx b {
  font-size: var(--fs-caption); font-weight: 700; color: var(--muted);
  text-transform: uppercase; letter-spacing: 0.06em;
}
.contact-facts .cf-tx span, .contact-facts .cf-tx a {
  font-size: var(--fs-body); color: var(--ink); line-height: 1.5;
}
.contact-facts .cf-tx a { text-decoration: none; }
.contact-facts .cf-tx a:hover { color: var(--brass-600); }

/* Harita bloğu — TIKLA-YÜKLE (inc/harita.php · KARARLAR §9 · §13).
   İletişim ve ilan sayfası AYNI bloğu kullanır; tek fark en-boy oranı.
   Kapak bir GÖRSEL DEĞİL: harita resmi indirilip saklanamaz (Google şartları),
   bu yüzden kapak konum ikonu + metin + düğmeden ibaret sade bir alandır. */
.lharita { margin: 26px 0 0; }
.detail-block .lharita { margin: 14px 0 0; }

.lharita-kapak {
  display: flex; flex-direction: column; align-items: flex-start; gap: 10px;
  padding: 22px; border: 1px solid var(--line); border-radius: var(--r-md);
  background: var(--paper-2);
}
.lharita-pin { display: inline-flex; color: var(--brass-600); }
.lharita-pin svg { width: 22px; height: 22px; }
.lharita-metin {
  margin: 0; font-size: var(--fs-body); color: var(--ink); line-height: 1.5;
}
.lharita-ac { margin-top: 2px; }
.lharita-not {
  margin: 0; font-size: var(--fs-caption); color: var(--muted);
}
.lharita-yol { margin-top: 14px; }

/* Açıldıktan sonra: kapak yerini iframe'e bırakır. Oran İletişim'de 16/9,
   ilan sayfasında 16/10. */
.lharita-cerceve {
  border: 1px solid var(--line); border-radius: var(--r-md);
  overflow: hidden; aspect-ratio: 16 / 9; background: var(--paper-2);
}
.detail-block .lharita-cerceve { aspect-ratio: 16 / 10; }
.lharita-cerceve iframe { width: 100%; height: 100%; border: 0; display: block; }
