/* =====================================================================
   style.css — güzergâh karşılaştırma arayüzü (2. tasarım turu)
   Görsel dil: karayolu tabelası mavisi, bilet perforasyonu, sade kâğıt
   zemin — kullanıcının ilettiği referans tasarımdan uyarlandı.
     --navy/--amber : marka rengi
     --car/--bus/--train/--plane (+ -soft) : moda göre aksan rengi,
       .app üzerindeki data-mode="car|bus|train|plane" ile aktifleşir
   ===================================================================== */

:root {
  --bg: #EDF1F4;
  --surface: #FFFFFF;
  --surface-2: #F5F8FA;
  --ink: #0F1F2B;
  --ink-2: #44576A;
  --ink-3: #444;
  --line: #D6DEE5;
  --line-strong: #B4C1CC;
  --navy: #0E2A47;
  --amber: #F5A800;

  --car: #0B57A4;   --car-soft: #E3EEFA;
  --bus: #A75B00;   --bus-soft: #FBEEDA;
  /* (2026-09-30, kullanıcı isteği: "Tren renkleri #333333 olsun") eski
     kırmızı (#B3262B) koyu nötr griye çevrildi - --train-soft de buna
     uyumlu açık gri bir tona (#E8E8E8) güncellendi. */
  --train: #333333; --train-soft: #E8E8E8;
  /* (2026-09-30, 36. tur, kullanıcı isteği: "uçak rengi yeşil gökyüzü
     mavisi yapsak daha iyi olmaz mı?") eski #08706B bir koyu teal/yeşil
     tonuydu - uçak/gökyüzü çağrışımı yapan daha canlı bir mavi (--car'ın
     koyu lacivert-mavisinden BİLEREK farklı/daha açık bir ton, ikisi
     yan yana sekmede karışmasın diye) ile değiştirildi. */
  --plane: #0EA5E9; --plane-soft: #E0F2FE;
  /* (16. tur) --taxi: klasik "taksi sarısı" - car/bus/train/plane'in hiçbiriyle
     karışmayan ayrı bir aksan rengi (bkz. .mode-tab[data-tab-mode="taxi"]
     ve RenderHelpers::renderTaxiCard()'ın --route-color olarak kullandığı yer). */
  --taxi: #B8860B;  --taxi-soft: #FBF1D6;
  --transit: #C62828; --transit-soft: #FDECEC;
  --sea: #00897B; --sea-soft: #E0F2F1;
  --suburban: #EF6C00; --suburban-soft: #FFF0E0;
  /* (2026-09-30, 36. tur devamı, kullanıcı isteği: "karşılaştırma
     tablosunu görseldeki hale getirsene") Kullanıcının paylaştığı
     referans görselde maliyet karşılaştırma KARTLARININ dairesel ikon
     rengi - haritadaki/sekmelerdeki --car (lacivert) ve --bus (kahve/
     turuncu) tonlarından BİLEREK FARKLI, sadece bu kart bileşenine özel
     bir palet (görseldeki yeşil araba / turuncu otobüs / mavi uçak ile
     birebir eşleşsin diye) - harita/sekme renkleri (yukarıdaki --car/
     --bus/--train/--plane) HİÇ değiştirilmedi, sadece bu YENİ değişkenler
     eklendi. --compare-plane ve --compare-train, sitenin geri kalanıyla
     tutarlı kalsın diye kasıtlı olarak mevcut --plane/--train'i tekrar
     kullanıyor (referans görselde uçak zaten benzer bir mavi). */
  --compare-car: #16A34A; --compare-bus: #F59E0B;
  --compare-train: var(--train); --compare-plane: var(--plane);
  /* (2026-10-02, 43. tur, kullanıcı tespiti verbatim: "Karşılaştırma
     tablosunda taksi iconu rengi yok taksi rengi olarak gelsin.") KÖK
     NEDEN: taksi modu (16. tur) bu --compare-* paletinin TANIMLANMASINDAN
     SONRA eklenmişti - car/bus/train/plane için birer
     `[data-compare-icon="..."]` renk kuralı varken taksi için hiç
     eklenmemişti, bu yüzden ikon rozeti rengi .compare-card__icon'un
     renksiz/şeffaf varsayılanında kalıyordu. train/plane'in yaptığı gibi
     (sitenin GERÇEK taksi rengini tekrar kullanmak, YENİ bir renk
     UYDURMAMAK) burada da mevcut --taxi değişkeni kullanılıyor. */
  --compare-taxi: var(--taxi);
  --mode: var(--car);
  --mode-soft: var(--car-soft);

  --ok: #1E7A45;
  --warn: #A94400;

  --radius-sm: 8px;
  --radius-md: 12px;
  --radius-lg: 20px;
  /* (2026-10-03, 48. tur 17. devam, kullanıcı isteği verbatim: "benim
     için hız ve performans çok önemli o yüzden lcp öncelik olsun.
     googleapis font kodlarını kaldıralım") Google Fonts (Bricolage
     Grotesque/Instrument Sans) TAMAMEN kaldırıldı - artık sadece cihazın
     KENDİ sistem fontları kullanılıyor: hiçbir ağ isteği YOK (DNS/TLS/CSS/
     .woff2 - raporun "Ağ bağımlılık ağacı"nda kritik yolun EN UZUN parçası
     buydu, 418ms), hiçbir render-blocking CSS YOK (rapordaki "Oluşturma
     engelleme istekleri" bulgusundaki 370ms'nin kaynağı), hiçbir FOUT/
     FOIT (yazı tipi değişimiyle göz kırpması) riski YOK. `-apple-system`
     (macOS/iOS: San Francisco), `Segoe UI` (Windows), `Roboto` (Android/
     Chrome OS), `Helvetica Neue`/`Arial` (eski/diğer) - neredeyse HER
     cihazda zaten YÜKLÜ, modern ve okunabilir bir yazı tipiyle sonuçlanan,
     yaygın kullanılan bir "sistem fontu" zinciri. `--font-display`/
     `--font-body` AYNI kaldı (tüm dosyada tek değişim noktası burası -
     CSS'in geri kalanı, font-weight/boyut farklarıyla zaten görsel
     hiyerarşi kuruyordu, tek bir typeface kullanmak bunu BOZMAZ). */
  --font-display: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  --font-body: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  --shadow: 0 1px 2px rgba(15, 31, 43, .08), 0 6px 20px rgba(15, 31, 43, .08);
  --shadow-card: var(--shadow);
}

/* .app üzerinde data-mode ile aktif olur (ROUTE_COLORS'tan BAĞIMSIZ bir
   kavram: bu, "araç vs otobüs vs tren vs uçak" temasıdır; ROUTE_COLORS
   ise araç sekmesindeki ALTERNATİF rotaları birbirinden ayırt eder). */
[data-mode="car"]   { --mode: var(--car);   --mode-soft: var(--car-soft); }
[data-mode="bus"]   { --mode: var(--bus);   --mode-soft: var(--bus-soft); }
[data-mode="train"] { --mode: var(--train); --mode-soft: var(--train-soft); }
[data-mode="plane"] { --mode: var(--plane); --mode-soft: var(--plane-soft); }
[data-mode="taxi"]  { --mode: var(--taxi);  --mode-soft: var(--taxi-soft); }
[data-mode="transit"] { --mode: var(--transit); --mode-soft: var(--transit-soft); }
[data-mode="sea"] { --mode: var(--sea); --mode-soft: var(--sea-soft); }
[data-mode="suburban"] { --mode: var(--suburban); --mode-soft: var(--suburban-soft); }

* { box-sizing: border-box; }
html, body { height: 100%; margin: 0; }
body { font: 400 15px/1.5 var(--font-body); color: var(--ink); background: var(--bg); }
h1, h2, h3 { font-family: var(--font-display); line-height: 1.15; margin: 0; letter-spacing: -0.01em; }
p { margin: 0; }
ul {padding-left: 15px}
img, svg { max-width: 100%; }
.icon { flex: none; display: block; }
[hidden] { display: none !important; }
:focus-visible { outline: 3px solid var(--amber); outline-offset: 2px; border-radius: 4px; }

/* ---------------------------------------------------------------- */
/* Header                                                            */
/* ---------------------------------------------------------------- */
/* (2026-10-03, 48. tur 7. devam, kullanıcı isteği verbatim: "headerı
   şekillendirelim. Eklenecek link/kategoriler: rotalar, şehirler, keşfet
   ve arama motoru olacak.") Header artık 3 bölge: marka | nav (Rotalar/
   Şehirler/Keşfet) | arama kutusu. Renk paleti `anasayfa-tasarim.html`
   (47. tur onaylanmış tasarım) ile BİREBİR aynı: BEYAZ header, koyu gri
   nav metni - eski `.site-nav a { color: #D3DFEC }` AÇIK MAVİ tonu koyu
   bir header için yazılmıştı (hiç kullanılmamıştı, gerçek header hep
   beyazdı) - o yüzden burada KOYU metne çevrildi, aksi halde beyaz zemin
   üzerinde neredeyse görünmez olurdu. Yükseklik 56px'TE BİLİNÇLİ OLARAK
   SABİT bırakıldı (.app'in iki calc(100vh - 56px)/calc(100dvh - 56px)
   referansını ETKİLEMEMEK için) - navın kendisi bu yüzden kompakt/küçük
   punto. */
.site-header {
  display: flex; align-items: center; gap: 16px;
  padding: 0 20px; height: 56px;
  background: var(--surface); color: var(--ink);
  /* (2026-10-03, 48. tur 14. devam, kullanıcı isteği verbatim: "tren,
     otobüs, uçak sefer detaylarına tıklayınca header yok oluyor sanırım
     sağdaki scroll olayı bozuyor") Asıl hata js/app.js'teki
     scrollPaneIntoView()'da BULUNUP DÜZELTİLDİ (bkz. o dosyadaki ayrıntılı
     not) - ama header'ın `position: relative` olması, GERÇEK bir sayfa
     kaydırması olduğunda (ör. .sheet panelinin sonuna gelip footer'a
     kaydırırken - madde 1) header'ın da normal akışın parçası olarak
     yukarı kayıp GÖRÜNÜMDEN ÇIKMASINA izin veriyordu - bu da kullanıcının
     "sağdaki scroll olayı bozuyor" sezgisinin isabetli olduğu ikinci bir
     etkendi. `position: sticky; top: 0` ile header artık GERÇEK sayfa
     kaydırması ne kadar ilerlerse ilerlesin (footer'a inerken dahil) her
     zaman viewport'un en üstünde sabit kalıyor - yükseklik yine BİLEREK
     56px'te sabit (`.app`'in calc(100vh - 56px) referansını etkilememek
     için, bkz. yukarıdaki eski not). */
  position: sticky; top: 0; z-index: 1100; border-bottom: 1px solid #ccc; align-items: center; justify-content: space-between;
}
.brand { display: flex; align-items: center; gap: 4px; text-decoration: none; color: var(--ink); flex: 0 0 auto; }
.brand__mark { display: block; width: 40px; height:40px; object-fit: contain; }
.brand__text { display: flex; flex-direction: column; line-height: 1.05; }
.brand__name { font: 700 clamp(1.2rem, 3vw, 1rem) var(--font-display); letter-spacing: -0.02em; color: #0b57a4; }
/* (2026-10-03, 48. tur 8. devam, kullanıcı isteği verbatim: "logo aldına
   küçük yazıyla "Türkiye'nin ulaşım rehberi" yazdıralım.") Onaylanan
   tasarım referansı anasayfa-tasarim.html'deki `.logo-text span` deseniyle
   AYNI: küçük, soluk alt-başlık. O dosyada da dar ekranlarda (≤560px)
   `display:none` oluyordu (bkz. aşağıdaki @media) - header'da yer
   kazanmak için aynı davranış burada da uygulandı. */
.brand__tagline { font: 500 clamp(.72rem, 3vw, .55rem) var(--font-body); color: var(--ink-3); line-height: 1; white-space: nowrap; }
.site-nav { display: flex; flex-direction: column; gap: 2px; }
.site-nav a { color: #42586C; text-decoration: none; font-weight: 600; font-size: 14px; padding: 10px 12px; border-radius: 6px; white-space: nowrap; }
.site-nav a:hover { color: var(--car); background: var(--car-soft); }
.site-nav a.is-active { color: var(--car); }

/* (2026-10-03, 48. tur 8. devam, kullanıcı isteği verbatim: "header da
   sadece linkler olsun (duraklar da ekle) ve arama motoru masaüstünde
   icon şeklinde dursun tıklanınca açılsın.") 47. tur 7. devam'da arama
   kutusu SADECE mobilde (≤860px) ikona dönüşüyor, masaüstünde HER ZAMAN
   açık bir metin kutusu olarak duruyordu. Artık TEK bir davranış var -
   TÜM genişliklerde iki ikon-buton (ara/menü) + tıklanınca açılan TEK bir
   panel (nav + arama formu birlikte). Bu yüzden eskiden "mobile" eki
   taşıyan sınıflar (`.site-header__mobile-actions`,
   `.site-header__mobile-panel`, `.site-nav--mobile`,
   `.site-header__search--mobile`) sadeleştirildi/kaldırıldı - artık tek
   bir kopya olduğu için ayrıca "masaüstü asıl + mobil kopya" çakışma
   riski de (bkz. eski not, artık geçersiz) YOK. */
.site-header__actions { display: flex; margin-left: auto; gap: 6px; }
.site-header__icon-btn {
  display: grid; place-items: center; width: 36px; height: 36px; flex: none;
  border: 1px solid var(--line-strong); border-radius: 9px; background: var(--surface);
  color: #42586C; cursor: pointer;
}
.site-header__icon-btn .icon { width: 17px; height: 17px; }
.site-header__icon-btn[aria-expanded="true"] { background: var(--car-soft); color: var(--car); border-color: var(--car); }
.site-header__panel {
  display: none; position: absolute; right: 20px; top: 64px; width: 280px; max-width: calc(100vw - 40px);
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--radius-md);
  box-shadow: 0 8px 24px rgba(15,31,43,.16); padding: 14px; z-index: 1090;
  flex-direction: column; gap: 14px;
}
.site-header__panel[data-open="true"] { display: flex; }
.site-header__search {
  display: flex; align-items: center; gap: 6px; width: 100%;
  background: var(--surface-2); border: 1px solid var(--line-strong);
  border-radius: 20px; padding: 4px 4px 4px 12px;
}
.site-header__search input {
  border: 0; background: transparent; font: 400 13px/1 var(--font-body);
  color: var(--ink); width: auto; flex: 1 1 auto; padding: 6px 2px; min-width: 0;
}
.site-header__search input:focus { outline: none; }
.site-header__search input::placeholder { color: var(--ink-3); }
.site-header__search-divider { color: var(--line-strong); font-size: 12px; }
.site-header__search button {
  display: grid; place-items: center; width: 32px; height: 32px; flex: none;
  border: 0; border-radius: 50%; background: var(--car); color: #fff; cursor: pointer;
}
.site-header__search button:hover { filter: brightness(0.92); }
.site-header__search button .icon { width: 16px; height: 16px; }

.main-nav ul {
    display: flex;
    gap: 4px;
    list-style: none;
}
.main-nav a {
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 8px 12px;
    border-radius: 8px;
    text-decoration: none;
    font-size: 16px;
    font-weight: 500;
    color: var(--navy);
    transition: background .2s, color .2s;
}

.icon-btn {
    width: 38px;
    height: 38px;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 0;
    background: transparent;
    color: #164b78;
    border-radius: 8px;
    cursor: pointer;
    padding: 0;
    transition: background .2s ease, color .2s ease;
}

.icon-btn svg {
    width: 20px;
    height: 20px;
    display: block;
}

.icon-btn:hover {
    background: #eef6fc;
    color: #087bea;
}

.menu-check{display:none!important}
.menu-toggle{display:none;width:42px;height:42px;padding:0;margin:0;align-items:center;justify-content:center;cursor:pointer;color:inherit}
.menu-icon{width:23px;height:23px;display:block;overflow:visible}
.menu-line{transform-box:fill-box;transform-origin:center;transition:transform .25s ease,opacity .2s ease}

@media(max-width:800px){
.header-inner{position:relative;min-height:70px;display:flex;align-items:center;justify-content:space-between}
.header-actions{width:auto!important;height:70px!important;display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:flex-end!important;gap:4px!important;flex-shrink:0}
.icon-btn,.menu-toggle{flex:0 0 42px!important;width:42px!important;height:42px!important;margin:0!important}
.icon-btn{display:flex!important;align-items:center!important;justify-content:center!important}
.icon-btn svg{width:22px;height:22px;display:block}
.menu-toggle{display:flex!important;flex-direction:row!important;align-items:center!important;justify-content:center!important}
.menu-icon{width:23px;height:23px}
.site-header:has(#menu-check:checked) .line-1{transform:translateY(6px) rotate(45deg)}
.site-header:has(#menu-check:checked) .line-2{opacity:0}
.site-header:has(#menu-check:checked) .line-3{transform:translateY(-6px) rotate(-45deg)}
.main-nav{position:fixed!important;top:56px!important;left:0!important;right:0!important;width:100%!important;max-width:none!important;height:calc(100dvh - 70px)!important;margin:0!important;padding:0!important;background:#fff!important;overflow-y:auto!important;overflow-x:hidden!important;z-index:9999!important;transform:translateX(100%)!important;visibility:hidden!important;transition:transform .28s ease,visibility .28s ease!important;box-shadow:none!important}
.site-header:has(#menu-check:checked) .main-nav{transform:translateX(0)!important;visibility:visible!important}
.main-nav>ul{display:flex!important;flex-direction:column!important;width:100%!important;margin:0!important;padding:8px 20px 30px!important;list-style:none!important;box-sizing:border-box!important}
.main-nav>ul>li{display:block!important;width:100%!important;margin:0!important;padding:0!important;border-bottom:1px solid #e8e8e8!important;box-sizing:border-box!important}
.main-nav>ul>li>a{display:flex!important;width:100%!important;min-height:58px!important;margin:0!important;padding:0 4px!important;align-items:center!important;color:#171717!important;background:transparent!important;text-decoration:none!important;font-size:17px!important;font-weight:600!important;white-space:nowrap!important;box-sizing:border-box!important}
.main-nav>ul>li>a:active{background:#f5f5f5!important}
.main-nav>ul>li>a:before,.main-nav>ul>li>a:after{content:none!important;display:none!important}
.main-nav .dropdown,.main-nav .submenu,.main-nav ul ul{display:none!important}
.menu-overlay{display:block!important;position:fixed!important;top:70px!important;left:0!important;right:0!important;bottom:0!important;background:rgba(0,0,0,.28)!important;opacity:0;visibility:hidden;z-index:9998!important;transition:opacity .25s ease,visibility .25s ease}
.site-header:has(#menu-check:checked)~.menu-overlay{opacity:1;visibility:visible}
.brand{flex-shrink:0}
}

@media(max-width:480px){
.header-inner{min-height:70px;padding-left:12px;padding-right:12px}
.header-actions{gap:2px!important}
.icon-btn,.menu-toggle{width:40px!important;height:40px!important;flex-basis:40px!important}
.icon-btn svg{width:21px;height:21px}
.menu-icon{width:22px;height:22px}
.main-nav{top:56px!important;height:calc(100dvh - 70px)!important}
.main-nav>ul{padding-left:16px!important;padding-right:16px!important}
.main-nav>ul>li>a{min-height:56px!important;font-size:16px!important}
.sheet[data-state="half"] { height: 70dvh; }
}

@media (max-width: 560px) {
  /* bkz. yukarıdaki .brand__tagline notu - anasayfa-tasarim.html
     referansıyla AYNI dar-ekran davranışı. */
  .site-header__panel { left: 12px; right: 12px; width: auto; max-width: none; }
}
/* (2026-10-02, 41. tur 13. devam, kullanıcı isteği verbatim, madde 5:
   "Ana içeriğe geç kurgusu kaldırılsın.") .skip-link/.skip-link:focus
   kuralları kaldırıldı - karşılığı olan <a class="skip-link"> index.php'den
   de kaldırıldı. */

/* ---------------------------------------------------------------- */
/* Layout: sol panel (sheet) + sağ harita                             */
/* ---------------------------------------------------------------- */
.app { display: flex; height: calc(100vh - 56px); overflow: hidden; }

.sheet {
  width: 520px; max-width: 100%; flex-shrink: 0;
  background: var(--surface);
  border-right: 1px solid var(--line-strong);
  display: flex; flex-direction: column;
}
.sheet__grip { display: none; } /* sadece mobilde, aşağıda */
.sheet__scroll {
  overflow-y: auto; overflow-x: hidden;
  /* (2026-10-03, 48. tur 8. devam, kullanıcı isteği verbatim: "Footer
     mobilde görünmüyor masaüstünde de aşağı indiğimde yok ama haritadan
     aşığa bir scroll daha var oradan indirmek gerekiyor saçma düzelt")
     KÖK NEDEN: burada daha önce `overscroll-behavior: contain` vardı -
     bu, bu panel kendi içinde sona erdiğinde (route kartlarının en altına
     gelindiğinde) scroll olayının DIŞ sayfaya (body'e, dolayısıyla
     .app'ten SONRA gelen <footer>'a) "zincirlenmesini" (scroll chaining)
     KASITLI olarak ENGELLİYORDU (contain'in tanımı tam olarak bu). Sonuç:
     - Masaüstünde fare imleci sol panelin (bu .sheet__scroll) ÜZERİNDEYKEN
       tekerlek aşağı çevrilmeye devam edildiğinde, panel sonuna gelince
       hiçbir şey olmuyordu - sayfa aşağı kaymıyordu. Footer'a ulaşmak için
       kullanıcının imleci panelin DIŞINA (örn. harita alanına) TAŞIYIP
       oradan AYRICA bir scroll daha yapması gerekiyordu - kullanıcının
       tam olarak tarif ettiği "saçma" / "haritadan aşağı bir scroll daha
       var" davranışı buydu.
     - Mobilde ise `.sheet` (bkz. aşağıdaki @media bloğu) `position:
       absolute` ile `.app`'in TAMAMINI (100dvh) kaplıyor; `.app`'in
       kendisi de `overflow:hidden` - yani sayfanın GERÇEK (body düzeyi)
       kaydırmasına ulaşabilecek TEK yol, bu `.sheet__scroll`'un kendi
       içindeki dokunmatik kaydırmanın sona erip DIŞARIYA zincirlenmesiydi.
       `overscroll-behavior: contain` tam da bunu engellediği için mobilde
       footer'a dokunmatik kaydırmayla ulaşmanın HİÇBİR yolu yoktu (DOM'da
       vardı, `display:none` değildi - bu yüzden önceki turun Playwright
       kontrolü, gerçek bir dokunmatik kaydırmayı DEĞİL JS `scrollTo()`'yu
       kullandığı için bu sorunu YAKALAYAMAMIŞTI - bkz. README'deki ilgili
       not). `overscroll-behavior: contain` KALDIRILINCA (varsayılan
       davranış "auto"), panel sonuna gelen kaydırma artık .sheet ve
       .app'in (overflow:hidden olsa da zincirlemeyi ENGELLEMİYOR, sadece
       kendi taşmasını gizliyor) ÜZERİNDEN body'e zincirleniyor - footer
       artık hem masaüstünde (imleç panelin üzerindeyken dahi) hem
       mobilde (parmakla kaydırırken) EK bir adım gerekmeden doğal olarak
       ortaya çıkıyor. Playwright'ta gerçek `mouse.wheel()`/dokunmatik
       sürükleme simülasyonuyla doğrulandı (bkz. README). */
  /* (2026-09-30 devamı, kullanıcı isteği verbatim: "kartların baş tarafına
     dönsün" - araba akordeon slaytından geri dönüşün YANLIŞ yere kaydığı
     sorununun KÖK NEDENİ) Tarayıcının otomatik "scroll anchoring" (CSS
     Scroll Anchoring Spec) özelliği: #accordion-slide (büyük, tam ekran
     içerik) gizlenip #mode-panels (BÜYÜK bir blok - TÜM rota kartları)
     AYNI anda görünür olunca, tarayıcı "kullanıcı içerik kaymasın" diye
     scrollTop'u KENDİLİĞİNDEN (js/app.js'teki BİZİM açık scrollTo()
     çağrımızdan BAĞIMSIZ, bazen ondan SONRA/ÜZERİNE binerek) değiştiriyordu -
     canlı Playwright testinde bu, hesaplanan doğru hedefin ~280px ALTINA
     sıçramaya (scrollTop 969 → 1248) yol açtığını doğruladı. `overflow-
     anchor: none` bu otomatik düzeltmeyi KAPATIYOR - artık scrollTop'u
     SADECE js/app.js'teki scrollPaneIntoView()'ın açık scrollTo()
     çağrıları belirliyor. */
  overflow-anchor: none;
  /* Üst padding KONTEYNERDE değil, ilk çocuk olan .trip-head'de (aşağıda) -
     böylece mod sekmesi sticky olunca (bkz. .mode-bar, artık tüm genişliklerde) tam tepeye,
     boşluksuz yaslanabiliyor. Konteynerde padding-top olsaydı sticky öge
     her zaman o kadar boşluk bırakırdı (CSS'in bilinen sticky+padding sorunu). */
  padding: 0 15px 40px;
  flex: 1;
}

/* ---------------------------------------------------------------- */
/* Breadcrumb + başlık + form                                        */
/* ---------------------------------------------------------------- */
.breadcrumb ol { display:flex;flex-wrap:nowrap;overflow-x:auto;white-space:nowrap;padding:0;-webkit-overflow-scrolling:touch;margin-top:56px;gap:10px;height:50px;width:100%;align-items:center;font-size:13px;list-style: none; }
.breadcrumb li:not(:last-child)::after { content: '/'; margin-left: 6px; }
.breadcrumb a { color: var(--ink-3); text-decoration: none; }
.breadcrumb a:hover { text-decoration: underline; }

.route-top {padding: 12px; border-radius: 8px; margin-bottom: 5px}
.route-top p {line-height: 1.32;}
h1#page-title { font-size: 24px; margin: 5px 0; font-weight: 700; color: var(--ink); text-wrap: balance; }
.lead { color: var(--ink-2); font-size: 0.92rem; line-height: 1.5; margin: 0 0 14px; max-width: 60ch; }

.trip-form { display: flex; flex-direction: column; gap: 10px; margin-bottom: 16px; }
.trip-route { display: grid; grid-template-columns: 1fr; align-items: center; gap: 5px; position: relative; }
.place-field {
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: 10px;
  padding: 8px 12px; display: flex; flex-direction: column; gap: 2px; min-width: 0; position: relative;
}
.place-field__label { font-size: 10px; color: var(--ink-3); font-weight: 500; text-transform: uppercase; letter-spacing: .02em; }
.place-field__input { font: 600 17px/1.2 var(--font-display); color: var(--ink); border: 0; padding: 0; background: transparent; width: 100%; }
.place-field__input:focus { outline: none; }

.autocomplete-list {
  position: absolute; top: 100%; left: 4px; right: 4px; z-index: 900;
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
  box-shadow: var(--shadow-card); margin-top: 4px; overflow: hidden;
}
.autocomplete-item { display: flex; align-items: center; gap: 10px; width: 100%; text-align: left; padding: 10px 14px; border: 0; background: none; font-family: inherit; font-size: 15.4px; cursor: pointer; }
.autocomplete-item:hover, .autocomplete-item.is-active { background: var(--surface-2); }
/* (27. tur, kullanıcı isteği: "autocomplete ye icon da ekleyelim") Öneri
   satırındaki ikon - .hub-card__link .icon/.sched-list__route .icon gibi
   projedeki diğer liste-içi küçük ikonlarla AYNI boyut/renk yaklaşımı
   (küçük, dikey ortalanmış, metinle aynı satırda). */
.autocomplete-item__icon { flex: none; display: flex; color: var(--ink-3); }
.autocomplete-item__icon .icon { width: 16px; height: 16px; }
.autocomplete-item__text { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.search-btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 8px;
  border: 0; background: var(--navy); color: #fff; font-weight: 700; padding: 11px 16px;
  border-radius: 10px; cursor: pointer; font-family: inherit;
}
.search-btn:hover { background: #163a5f; }

@media (max-width:480px){
  .route-card__expand-label span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
}

.swap-btn {
  width: 40px; height: 40px; border-radius: 50%; border: 1px solid var(--line-strong);
  background: var(--surface); color: var(--car); display: grid; place-items: center; cursor: pointer; flex-shrink: 0;
  padding: 0; font: inherit; text-decoration: none; transition: transform .25s ease, background .15s;
}
.swap-btn:hover { background: var(--car-soft); }
.swap-btn:active { transform: rotate(180deg); }
/* Nereden / Nereye alt alta; swap düğmesi iki alanın ortasında, sağa dayalı */
.trip-route .swap-btn { position: relative; z-index: 10; width: 40px; height: 40px; margin: -20px 12px -20px auto; transform: rotate(90deg); transition: none; }
.trip-route .swap-btn:active { transform: rotate(270deg); }

.trip-options { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.date-field, .stepper { border: 1px solid var(--line-strong); border-radius: 10px; padding: 8px 12px; display: flex; flex-direction: column; gap: 4px; background: var(--surface); }
.date-field input { border: 0; font-size: 1rem; font-weight: 700; color: var(--ink); font-family: inherit; padding: 0; background: transparent; width: 100%; }
.stepper__controls { display: flex; align-items: center; justify-content: space-between; }
.stepper__controls button { width: 28px; height: 28px; border-radius: 50%; border: 1px solid var(--line-strong); background: var(--surface-2); color: var(--navy); cursor: pointer; display: grid; place-items: center; padding: 0; }
.stepper__controls button:disabled { opacity: .4; cursor: not-allowed; }
.stepper__controls output { font-weight: 700; min-width: 5.5ch; text-align: center; }

/* ---------------------------------------------------------------- */
/* Ulaşım türü sekmeleri                                              */
/* ---------------------------------------------------------------- */
/* (2026-10-01, 40. tur 3. devam, madde 2, kullanıcı isteği: "tüm araç
   seçeneklerinde detay sayfasından geri dönüş ... hepsi aynı sistem
   olacak") KÖK NEDEN BULUNDU: `.mode-bar`'ın "position: sticky; top: 0"
   kuralı eskiden SADECE @media (max-width: 860px) (mobil) içindeydi -
   masaüstünde (>860px) mod sekmeleri hiç sabitlenmiyordu. js/app.js'teki
   scrollPaneIntoView()'ın anchor'lı dalı (geri dönüşte tıklanan kartın
   başına kaydırma) matematiksel olarak SADECE mod çubuğu gerçekten sticky
   olup "yapışıp durduğunda" doğru sonuç verir - aksi halde (masaüstünde
   olduğu gibi) kart ile mod çubuğu arasındaki GÖRECELİ mesafe kaydırma
   miktarından BAĞIMSIZ sabit kalır (ikisi de birlikte kayar), bu yüzden
   hesaplanan hedef her zaman FAZLA kaydırıyordu - canlı Playwright testiyle
   doğrulandı (1280px genişlikte araba kartı geri dönüşünde bile ~100px,
   2. karta dönüşte çok daha fazla sapma ölçüldü - otobüs/tren/uçak için
   sıfırdan eklenen AYNI mekanizma bu yüzden hiç doğru çalışamazdı). Kalıcı
   çözüm: mod çubuğunu TÜM genişliklerde sticky yapmak - hem kaydırma
   matematiğini doğru kılıyor hem de masaüstünde uzun bir liste
   kaydırılırken sekmelerin her an erişilebilir kalması gibi bir kullanım
   kolaylığı ekliyor (aşağıdaki .mode-bar kuralına taşındı, mobil
   @media bloğundaki eski kopyası kaldırıldı - bkz. o bloktaki not).
   min-height SABİT: sekme sayısı 1 (sadece Araç) ya da 4 olsun, çubuğun
   yüksekliği hep aynı kalır - tek sekme genişçe (100%) yayılsa da asla
   dikeyde büyümez (sticky olunca ekranı kaplamasın diye önemli). */
.mode-bar { position: sticky; top: 0; z-index: 50; background: var(--surface); margin: 0 -15px; padding: 0 14px;}
.mode-tabs { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; border-bottom: 1px solid var(--line-strong); min-height: 60px; margin-top: 22px; }
.mode-tab {
  --mode: var(--car);
  background: none; border: 0; border-bottom: 4px solid transparent; cursor: pointer;
  display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 1px; padding: 10px 4px 8px;
  color: var(--ink-2); font-family: inherit; text-decoration: none; border-radius: 10px 10px 0 0;
  transition: background .15s, color .15s;
}
.mode-tab[data-tab-mode="bus"]   { --mode: var(--bus);   --mode-soft: var(--bus-soft); }
.mode-tab[data-tab-mode="train"] { --mode: var(--train); --mode-soft: var(--train-soft); }
.mode-tab[data-tab-mode="plane"] { --mode: var(--plane); --mode-soft: var(--plane-soft); }
.mode-tab[data-tab-mode="taxi"]  { --mode: var(--taxi);  --mode-soft: var(--taxi-soft); }
.mode-tab[data-tab-mode="airbus"] { --mode: var(--plane); --mode-soft: var(--plane-soft); }
.mode-tab__icon--duo { display: inline-flex; align-items: center; gap: 2px; }
.mode-tab[data-tab-mode="transit"] { --mode: var(--transit); --mode-soft: var(--transit-soft); }
.mode-tab[data-tab-mode="sea"] { --mode: var(--sea); --mode-soft: var(--sea-soft); }
.mode-tab[data-tab-mode="suburban"] { --mode: var(--suburban); --mode-soft: var(--suburban-soft); }
.mode-tab[hidden] { display: none; }
/* (16. tur) Taksi sekmesi bir <button> (bkz. index.php notu) - .mode-tab
   sınıfı zaten background/border/font'u sıfırladığı için <a> ile GÖRSEL
   olarak birebir aynı görünür, ekstra bir reset gerekmiyor. */
.mode-tab:hover { background: rgba(15,31,43,.05); }
.mode-tab.is-active, .mode-tab[aria-selected="true"] { color: var(--mode); border-bottom-color: var(--mode); background: none; }
.mode-tab__icon { color: var(--mode); }
.mode-tab__label { font-size: 0.85rem; font-weight: 600; }
.mode-tab__time { font-size: 0.76rem; color: inherit; opacity: 0.85; }

/* ---------------------------------------------------------------- */
/* Rota listesi başlığı ve kartları                                   */
/* ---------------------------------------------------------------- */
.route-list-head { margin: 20px 0; }
.route-list-head h2 { font-size: 1.15rem; margin: 0 0 4px; color: var(--ink); }
.route-list-head p { color: var(--ink-2); font-size: 0.86rem; margin: 0; }

.route-list { display: grid; gap: 12px; margin-top: 14px; }

/* (23. tur, kullanıcı isteği, madde 1) 22. turda eklenen ".car-alternatives"
   sınıfı (araç bloğunu sekme çubuğunun DIŞINA taşıyordu) KALDIRILDI - araç
   içeriği artık tekrar normal bir .mode-panel (bkz. index.php), bu yüzden
   ayrı bir sarmalayıcı sınıfa gerek kalmadı; .route-list-head/.route-list
   zaten genel kurallarla stillenir. */

/* (24. tur, kullanıcı isteği, madde 1: "bu h2 yi kaldıralım") Sekme
   çubuğunun üstünde duran "... Ulaşım Seçenekleri" <h2>'si TAMAMEN
   kaldırıldı (bkz. index.php - hem heading hem onu içeren $hasTabbedModes
   koşullu bloğun heading kısmı silindi, sekme çubuğunun KENDİSİ ve
   $hasTabbedModes koşulu AYNEN korundu). O heading'in ".mode-bar__title"
   kuralı (margin: 22px 0 10px) sağladığı üst boşluk artık YOK - "Rota ara"
   butonuyla sekme çubuğu arasında boşluk KALMASIN diye (orphaned
   spacing/wrapper hatası) o 22px'lik üst boşluk .mode-bar__title'dan
   .mode-bar'ın KENDİSİNE taşındı (aşağıda) - böylece GÖRSEL boşluk
   BİREBİR AYNI kalıyor, sadece taşıyan sınıf değişti. .mode-bar__title
   kuralı artık index.php'de HİÇ kullanılmadığından kaldırıldı. */
/* NOT: bu boşluk BİLEREK .mode-bar'a (dış div) DEĞİL, .mode-tabs'a (aşağıda,
   satır ~161) eklendi - .mode-bar (artık tüm genişliklerde sticky, bkz.
   yukarıdaki ".mode-tabs" bölümü) "margin: 0 -20px" ile TÜM kenar
   boşluklarını SIFIRLIYOR (edge-to-edge sticky çubuk için, bilerek) -
   .mode-bar'a top-margin eklenseydi bu kural onu EZER, gap sadece bazı
   genişliklerde görünür, diğerlerinde KAYBOLURDU (orphaned-spacing
   hatasının kendisi, tam olarak İSTENMEYEN
   durum). .mode-tabs o mobil kuralın kapsamı DIŞINDA olduğundan boşluk her
   iki genişlikte de TUTARLI kalıyor. */

.route-card {
  background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--radius-md);
  overflow: hidden; position: relative; cursor: pointer;
  transition: border-color .15s, box-shadow .15s;
}
.route-card:hover { border-color: var(--mode); }
.route-card--selected { border-color: var(--mode); box-shadow: 0 0 0 1px var(--mode), var(--shadow); background: linear-gradient(var(--mode-soft), var(--surface) 90px); }

.route-card__top { display: grid; grid-template-columns: auto 1fr auto; gap: 12px; align-items: flex-start; padding: 14px 14px 8px; }
.route-card__badges { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; width: fit-content;}
.route-card__badge, .road-sign {
  display: inline-grid; place-items: center; min-width: 44px; max-width: 160px; padding: 3px 8px;
  background: var(--mode); color: #fff; border-radius: 5px;
  box-shadow: inset 0 0 0 2px var(--mode), inset 0 0 0 3.5px #fff;
  font: 700 12px/1.35 var(--font-display); letter-spacing: .02em;
  /* (17. tur) Google-stili birleşik rozet ("İstanbul-İzmir Otoyolu ·
     O-5/E881") tek bir kısa koddan (ör. "D-565") çok daha uzun olabilir -
     eskiden rozet hiç sarmıyordu (kısa kodlar için sorun değildi), uzun
     birleşik metin artık okunaklı kalması için ortalanmış 2 satıra kadar
     sarabiliyor; kısa/tek kod rozetler (çoğunluk) bu değişiklikten
     GÖRSEL OLARAK etkilenmez (zaten max-width'in altında kalırlar). */
  white-space: normal; text-align: center; word-break: break-word;
}
/* (14. tur, madde 4) .route-card__swatch (rozetin üstündeki küçük renkli
   daire) KALDIRILDI - kartın sol kenarındaki border-left (aşağıda,
   `.route-card[style*="--route-color"]`) ZATEN aynı rengi taşıyordu,
   dairesel gösterge gereksiz bir tekrardı. */
.route-card__badge--sample { background: var(--ink-3); box-shadow: none; }

.route-card__title { font: 600 15px/1.1 var(--font-display); margin: 0 0 3px; color: var(--ink); display: flex; align-items: start; gap: 8px; }
/* (17. tur, madde 3) Taksi kartı başlığındaki ikon - diğer bilet
   kartlarındaki `.ticket__mono` ile AYNI görsel dil (renkli, yuvarlak
   köşeli rozet arka planı + beyaz ikon), sadece `.route-card__title`
   bağlamına uyarlanmış boyut/hizalama. `--route-color` her route-card'ta
   zaten inline style olarak tanımlı (taksi kartında `--taxi`). */
.route-card__title-icon { width: 26px; height: 26px; border-radius: 8px; display: grid; place-items: center; flex: none; background: var(--route-color, var(--taxi)); color: #fff; }
.route-card__title-icon .icon { width: 15px; height: 15px; }
.route-card__desc { font-size: 13px; color: var(--ink-2); margin: 0; line-height: 1.4; }

.route-card__metrics { display: flex; flex-direction: column; align-items: flex-end; white-space: nowrap; text-align: right; }
.route-card__duration { font: 700 17px/1.1 var(--font-display); color: var(--mode); }
.route-card__distance { font-size: 13px; color: var(--ink-2); }

.tag-list, .route-card__tags { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 14px 12px; margin: 0; }
.tag {
  font-size: 12px; font-weight: 500; padding: 3px 10px; border-radius: 999px;
  background: var(--surface-2); border: 1px solid var(--line); color: var(--ink-2);
}
.tag--primary, .tag--accent { background: var(--mode); border-color: var(--mode); color: #fff; }

/* Ücretli geçiş ve yakıt maliyeti: her biri ayrı "disclosure" (yerli
   <details>/<summary>, ama referans tasarımın disclosure/collapse
   görünümüyle re-skin edildi). Yol tarifi dökümü (adım adım liste + kondanse
   "Rota özeti" zaman çizelgesi) KOMPLE KALDIRILDI (kullanıcı isteği,
   2026-09-28).
   (12. tur, kullanıcı isteği: "Ücretli geçiş varsa yakıt acordionu ile alt
   alta değilde yan yana yazdıralım... Amaç araba kartının yüksekliğini
   düşürmek") Ücretli geçiş YOKSA tek accordion (Yakıt maliyeti) TAM
   GENİŞLİK kalır (route-card__accordions, grid-template-columns: 1fr).
   VARSA ise .route-card__accordions--split 2 EŞİT SÜTUNA döner - iki
   accordion yan yana, aralarında dikey bir ayraç çizgisiyle - kartın dikey
   yüksekliğini belirgin şekilde azaltır. 480px altı (dar mobil) okunabilirlik
   için tek sütuna geri düşer (bkz. @media aşağıda). */
/* (2026-10-02, 42. tur) .taxi-type-switch - İstanbul gibi birden fazla
   taksi tipi (Sarı/Turkuaz/Siyah VİP) eşleşen güzergahlarda, üst kısım
   (süre/mesafe) ile ücret dökümü arasına yerleşen tip seçici chip grubu.
   TEK tipli illerde (RenderHelpers::renderTaxiCard() $multiType=false)
   hiç BASILMAZ, bu kural o durumda devreye girmez. */
.taxi-type-switch { padding: 10px 14px 12px; border-top: 1px solid var(--line); }
.route-card__accordions { display: grid; grid-template-columns: 1fr; border-top: 1px solid var(--line); padding:10px}
.taxi-type-switch + .route-card__accordions { border-top: 0; }
.route-card__accordions--split { grid-template-columns: 1fr 1fr; }

.route-card__expand { border-top: 1px solid var(--line); }
.route-card__accordions .route-card__expand { border-top: 0; }
.route-card__accordions--split .route-card__expand {
  display: flex; 
}
.route-card__accordions--split .route-card__expand:first-child { border-right: 1px solid var(--line); }
.route-card__accordions--split .route-card__expand.route-card__expand--toll { border-top: 0; }
.route-card__accordions--split .route-card__expand-body { flex: 1; }
/* (2026-09-30 devamı, kullanıcı isteği verbatim: "araba kartı mobilde yakıt
   ve geçiş alt alta gelmiş yan yana yazsın") Dar mobil ekranda (480px altı)
   ikisini TEK sütuna (alt alta) düşüren eski kural KALDIRILDI - artık
   masaüstüyle AYNI, her zaman yan yana 2 sütun. Bu accordion'lar artık
   içeride açılıp kart yüksekliğini ARTIRMIYOR (tıklanınca tam ekran slayta
   geçiyor, bkz. js/app.js openAccordionSlide()) - yani "dar ekranda yan
   yana sıkışık görünür" endişesi (eski stacking kuralının asıl sebebi)
   artık geçerli değil, metin `.route-card__expand-label span` üzerindeki
   `text-overflow` ile (aşağıdaki mobil kural) güvenle kısaltılıyor. */

/* (14. tur, madde 3, kullanıcı isteği: "yakıt ve ücretli geçiş alanı çok
   saçma açıldığında tam alanı kaplasın") Yan yana (2 sütunlu) kompakt
   görünüm SADECE ikisi de KAPALIYKEN anlamlı - biri açılınca (js/app.js
   wireAccordionSplit(), native 'toggle' event'iyle .is-expanded ekler)
   açılan içerik yarım genişliğe sıkışmasın diye konteyner TEK SÜTUNA
   (tam genişlik) döner; ayraç çizgisi de bu durumda anlamsız olduğundan
   kaldırılır. İkisi de kapanınca otomatik olarak kompakt yan yana düzene
   geri döner (class kaldırılır). */
.route-card__accordions--split.is-expanded { grid-template-columns: 1fr; }
.route-card__accordions--split.is-expanded .route-card__expand:first-child { border-right: 0; }
.route-card__accordions--split.is-expanded .route-card__expand.route-card__expand--toll { border-top: 1px solid #EBCB84; }

.route-card__expand summary {
  display: flex; align-items: center; gap: 5px; cursor: pointer; list-style: none;width: 100%;
  padding: 11px 14px; background: var(--surface-2); font-weight: 500; font-size: 14px; color: var(--ink);line-height: 1;
}
.route-card__expand summary::-webkit-details-marker { display: none; }
.route-card__expand summary > span:first-of-type { flex: 1; }
/* (2026-09-28, kullanıcı isteği) İkon + etiket sıkıca birlikte, SOLA dayalı;
   fiyat + ok işareti sağda. Etiket wrapper'ı kendi içinde ayrı bir flex
   grubu olduğu için genişleyen boşluk sadece bu grupla değer arasında kalır. */
.route-card__expand-label { display: flex; align-items: center; gap: 5px; min-width: 0; }
.route-card__expand summary .disclosure__value { font-size: 14px; color: var(--mode); white-space: nowrap; font-weight: 600; }
/* (2026-09-30 devamı, kullanıcı isteği verbatim: "> işareti olsun") Bu
   accordion artık kartın İÇİNDE hiç açılmıyor - tıklanınca tam ekran bir
   slayta geçiyor (bkz. js/app.js openAccordionSlide()), yani aşağı bakan
   bir "katlanır menü" oku artık YANLIŞ bir ipucu veriyordu (kullanıcı
   "aşağı açılacak" bekliyor ama ekran DEĞİŞİYOR). Ok artık HER ZAMAN sağa
   (">") bakan, diğer ileri-gezinme oklarıyla (ör. .poi-item__go,
   .compare-card__chevron - chevronRight ikonu) AYNI anlamı taşıyan sabit
   bir gösterge - "açık/kapalı" durumuna göre dönmüyor (details.open zaten
   bilerek hiç true olmuyor, bkz. js/app.js notu). */
.route-card__expand summary::after {
  content: ''; width: 16px; height: 16px; flex: none;
  background: currentColor; color: var(--ink-3);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M9 6l6 6-6 6'/%3E%3C/svg%3E") center/contain no-repeat;
}
.route-card__expand-body { padding: 5px; font-size: 0.86rem; color: var(--ink-2); background: var(--surface); }

.route-card__expand--toll { border-top: 1px solid #EBCB84; }
.route-card__expand--toll summary { background: #FFF6E0; color: #6A4600; }

/* (15. tur, kullanıcı isteği: "feribot ile diyoruz güzel ama hangi feribot
   ücreti nedir bu bilgiler önemli") "Feribot ile" etiketi taşıyan bir
   rotada, `ferry_crossings` tablosundan (varsa) bulunan işletmeci/ücret
   bilgisi - mevcut `.notice`/`.sample-data-warning` görsel diliyle tutarlı,
   kompakt tek bir blok (ayrı bir accordion'a gerek yok, sadece birkaç
   alan). Yakıt/ücretli-geçiş accordion alanının HEMEN ÜSTÜNDE, etiketlerin
   altında - kartın var olan dikey akışına eklenir, yeniden tasarım DEĞİL. */
.ferry-note {
  display: flex; gap: 8px; align-items: flex-start;
  margin: 0 14px 10px; padding: 9px 11px;
  background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-sm);
  font-size: 0.82rem; color: var(--ink-2);
}
.ferry-note__icon { color: var(--mode); flex: none; margin-top: 1px; }
.ferry-note__body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ferry-note__body strong { color: var(--ink); font-size: 0.86rem; }
.ferry-note__meta { color: var(--ink-2); }

/* (madde 7, masaüstü turu) Köprü/yol adı + HEMEN ALTINDA giriş/çıkış
   (ikincil, küçük yazı) + SAĞDA tutar; en altta dip toplam satırı. */
.toll-breakdown { display: flex; flex-direction: column; gap: 4px; }
.toll-row { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; font-size: 0.86rem; padding: 7px 0; border-bottom: 1px dashed #EBDCB2; }
.toll-row:last-of-type { border-bottom: 0; }
.toll-row__main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.toll-row__name { font-weight: 600; color: var(--ink); }
.toll-row__sub { font-size: 0.78rem; color: var(--ink-2); }
.toll-row__sub--muted { color: var(--ink-3); font-style: italic; }
.toll-row__amt { white-space: nowrap; flex-shrink: 0; }
.toll-row--total { border-top: 1px dashed #E9CE8A; border-bottom: 0; margin-top: 4px; padding-top: 10px; font-weight: 700; color: var(--ink); align-items: center; }
/* (17. tur, madde 4) Taksi kartında köprü/otoyol satırı varsa araya giren
   "Taksimetre tahmini" ara toplamı - nihai `.toll-row--total`'dan daha az
   vurgulu (henüz TOPLAM değil, sadece örnek tarife kısmının ara toplamı). */
.toll-row--subtotal { color: var(--ink-2); font-weight: 600; align-items: center; }

.fuel-calc { display: flex; flex-direction: column; gap: 14px; position: relative; border-radius: 8px; border:1px solid #ccc; padding: 12px 10px}

/* (2026-09-28, kullanıcı isteği "menü tutulup yukarı aşağı çekilebilsin")
   Panelin en üstünde, mobil alt-çekmece grip'iyle (.sheet__grip) AYNI görsel
   dil: küçük bir tutamaç çubuğu. Tıklama <details>'i zaten aç/kapar; bu ek
   olarak js/app.js (wireFuelGrips) üzerinden pointerdown/move/up ile
   sürükleyerek aç/kapatma da ekler - click-to-toggle davranışı BOZULMADAN. */
.fuel-calc__grip {
  display: flex; justify-content: center; align-items: center; width: 100%;
  padding: 2px 0 6px; margin: -4px 0 -2px; border: 0; background: none; cursor: grab; touch-action: none;
}
.fuel-calc__grip:active { cursor: grabbing; }
.fuel-calc__grip-bar { width: 36px; height: 4px; border-radius: 999px; background: var(--line-strong); display: block; }

/* Yakıt formu: derli toplu, etiketli grid - eskiden tek satıra sıkışan
   stepper'lar yerine 2 sütunlu, her alanın kendi kutucuğu var (madde: "yakıt
   tablosu daha şık bir tasarımda ve derli toplu görünsün"). */
.fuel-calc__inputs { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px 10px; }
.fuel-calc__field {
  display: flex; flex-direction: column; gap: 4px;
  background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 8px 9px;
}
.fuel-calc__field input {
  width: 100%; border: 1px solid var(--line-strong); border-radius: 6px; padding: 6px 7px;
  font-family: inherit; font-size: 13px; font-weight: 500;
  color: var(--ink); background: var(--surface);
}
.fuel-calc__note { font-size: 0.74rem; color: var(--ink-3); margin: 0; }

/* (2026-09-30, 36. tur devamı) Görseldeki her kutunun altındaki açıklayıcı
   yardım metni ("100 km'de kullanılan yakıt miktarı" gibi) ve alan etiketi. */
.fuel-calc__field-label { font-size: 11.5px; font-weight: 700; color: var(--ink-2); text-transform: uppercase; letter-spacing: .02em; }
.fuel-calc__field-hint { font-size: 11px; color: var(--ink-3); line-height: 1.3; }

/* "Yakıt Türü" segmentli buton grubu - görseldeki 4 pilli seçici. Altındaki
   gerçek <select data-fuel-type> (tek doğruluk kaynağı) görsel olarak
   gizlenir ama DOM'da/erişilebilirlikte kalır (js/app.js recalc mantığı hâlâ
   ona bakar). */
.fuel-calc__field-group { display: flex; flex-direction: column; gap: 6px; }
.fuel-calc__pills { display: flex; flex-wrap: wrap; gap: 4px; }
.fuel-calc__pill {
  display: inline-flex; align-items: center; gap: 0px; padding: 10px; border-radius: 999px;
  border: 1px solid var(--line-strong); background: var(--surface); color: var(--ink-2);
  font: 600 12.5px/1 var(--font-body); cursor: pointer; transition: background .15s ease, color .15s ease, border-color .15s ease;
}
.fuel-calc__pill:hover { border-color: var(--mode); }
.fuel-calc__pill:focus-visible { outline: 2px solid var(--navy); outline-offset: 2px; }
.fuel-calc__pill.is-active { background: var(--mode); border-color: var(--mode); color: #fff; }
.fuel-calc__pill .icon { width: 15px; height: 15px; flex: none; }
/* (2026-09-30, 36. tur devamı, kullanıcı isteği: "amacım marka/firmasına
   göre de filtreletmek kullanıcı sadece opetten alıyor olabilir") Şehir +
   yakıt tipine göre gerçek (örnek işaretli) marka fiyatlarını gösteren
   seçici - js/app.js (wireFuelCalculators/loadFuelBrands) tarafından
   php/api_fuel_price.php'den doldurulur ve veri gelene kadar/gelmezse
   (`data-fuel-brand-wrap[hidden]`) hiç gösterilmez. Diğer input kutularıyla
   (`.fuel-calc__field input`) AYNI görsel dilde, gerçek bir <select>. */
.fuel-calc__brand-select {
  width: 100%; border: 1px solid var(--line-strong); border-radius: 6px; padding: 6px 7px;
  font-family: inherit; font-size: 14px; font-weight: 500; color: var(--ink); background: var(--surface);
}
.fuel-calc__type-select {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden;
  clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* Vurgulu toplam bandı - görseldeki açık mavi "Toplam tahmini yakıt
   maliyeti" bandı: hesap makinesi ikonu + formül metni (canlı güncellenir,
   bkz. js/app.js recalc()) + kalın tutar. */
.fuel-calc__banner {
  display: flex; align-items: center; gap: 7px; padding: 10px;
  background: var(--mode-soft); border: 1px solid var(--line-strong); border-radius: var(--radius-md);
}
.fuel-calc__banner-icon { flex: none; color: var(--mode); display: flex; }
.fuel-calc__banner-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.fuel-calc__banner-text span { font-size: 12px; font-weight: 700; color: var(--ink); }
.fuel-calc__banner-text small { font-size: 11px; color: var(--ink-2); }
.fuel-calc__banner-amt { flex: none; font: 700 1rem/1 var(--font-display); color: var(--ink); white-space: nowrap; }
/* (madde 8, masaüstü turu) Elektrik seçilince görünen "Menzil (km)" alanı -
   diğer alanlarla aynı görünümde, sadece js/app.js tarafından hidden/görünür yapılır. */
.fuel-calc__charge-note { font-size: 0.78rem; color: var(--warn); font-weight: 600; margin: -6px 0 0; }

/* Sonuç şeridi: toplam / kişi başı / km başı TEK bir çerçeve içinde,
   hücreler arası ince ayraçla - eskiden 3 AYRI kutuydu, artık derli toplu
   tek şerit (madde: "daha şık... derli toplu görünsün"). */
.fuel-calc__result-strip {
  display: flex; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-md); overflow: hidden;
}
.fuel-calc__cell {
  flex: 1; display: flex; flex-direction: column; align-items: center; gap: 2px; text-align: center;
  padding: 10px 6px; border-left: 1px solid var(--line); min-width: 0;
}
.fuel-calc__cell:first-child { border-left: 0; }
.fuel-calc__cell strong { font: 700 15px/1.2 var(--font-display); color: var(--mode); }
.fuel-calc__cell span { font-size: 12px; color: var(--ink-2); }
@media (max-width: 380px) {
  .fuel-calc__inputs { grid-template-columns: 1fr; }
  .fuel-calc__result-strip { flex-direction: column; }
  .fuel-calc__cell { border-left: 0; border-top: 1px solid var(--line); flex-direction: row-reverse; justify-content: space-between; text-align: left; padding: 7px 10px; }
  .fuel-calc__cell:first-child { border-top: 0;}
}

/* (2026-10-04, 48. tur 23. devam, kullanıcı isteği verbatim: "şu elektrik
   hesabında ac/dc eklemiştik ya kodları hesaplamayı kaldıralım") 48. tur
   3/4. devamda eklenen ".ev-charge*" kural seti (AC/DC maliyet/süre
   hesabını gösteren bölümün kendi stilleri) TAMAMEN KALDIRILDI - o bölüm
   index.php'den de kaldırıldığı için bu kurallar artık hiçbir elemente
   uygulanmayan ölü CSS olurdu. İstasyon başına AC/DC şarj noktası SAYISI
   (pois.ac_count/dc_count) artık ayrı bir bölüm/kart DEĞİL - mevcut
   `.poi-popup__row` (harita kartı) ve POI liste satırının `<small>`
   alt başlığı (js/app.js poiSubtitle()) İÇİNE, AYNI stille eklendi; bu
   yüzden burada yeni bir CSS kuralı GEREKMEDİ. */

/* (2026-09-30, 36. tur devamı, kullanıcı isteği: "rota kart sistemini de
   görseldeki hale getirelim açılan menüler (yakıt, geçiş) görseldeki gibi
   olsun") Yakıt ve Ücretli geçiş accordion'larının İKİSİ de artık AYNI
   "panel-card" kabuğunu paylaşıyor: ikon+başlık+açıklama üst satırı + sağda
   X kapat butonu - görseldeki iki panelin ortak çerçevesi. İçerik (fuel-calc
   ya da toll-table) bu kabuğun İÇİNDE, değişmeden kalıyor. */
.panel-card { display: flex; flex-direction: column; gap: 5px; }
.panel-card__header { display: flex; align-items: flex-start; gap: 10px; }
.panel-card__header-icon {
  flex: none; width: 34px; height: 34px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  background: var(--mode-soft); color: var(--mode);
}
.panel-card__header-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 1px; }
.panel-card__header-text strong { font: 700 0.95rem/1.25 var(--font-display); color: var(--ink); }
.panel-card__header-text span { font-size: 11.5px; color: var(--ink-2); }
.panel-card__close {
  flex: none; width: 26px; height: 26px; border-radius: 50%; border: 1px solid var(--line-strong);
  background: var(--surface); color: var(--ink-2); display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.panel-card__close:hover { background: var(--surface-2); color: var(--ink); }
.panel-card__total {
  display: flex; align-items: center; gap: 8px; padding: 10px 12px;
  background: var(--mode-soft); border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
}
.panel-card__total-label { flex: 1 1 auto; font-size: 12px; font-weight: 700; color: var(--ink); }
.panel-card__total-amt { flex: none; font: 700 .9rem/1.1 var(--font-display); color: var(--ink); white-space: nowrap; }
.panel-card__actions { display: flex; justify-content: flex-end; gap: 8px; }

/* Genel amaçlı düğme sınıfları - proje genelinde "Rota ara" gibi ayrı,
   sayfaya özgü stiller vardı; bu panel-card içindeki İptal/Hesapla/Kapat
   gibi ikincil eylemler için küçük, tutarlı bir buton çifti. */
.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  border-radius: var(--radius-sm); border: 1px solid transparent; cursor: pointer;
  font-family: inherit; font-weight: 700; line-height: 1; transition: background .15s ease, border-color .15s ease;
}
.btn--sm { padding: 8px 14px; font-size: 12.5px; }
.btn--primary { background: var(--mode); border-color: var(--mode); color: #fff; }
.btn--primary:hover { filter: brightness(0.94); }
.btn--ghost { background: var(--surface); border-color: var(--line-strong); color: var(--ink-2); }
.btn--ghost:hover { background: var(--surface-2); color: var(--ink); }

/* Ücretli geçiş tablosu - görseldeki "Geçiş Noktası / Mesafe (km) / Ücret"
   tablosuna görsel olarak benzer, ANCAK "Mesafe (km)" sütunu BİLİNÇLİ OLARAK
   YOK: `$alt['toll_breakdown']` içinde geçiş noktası başına bir mesafe
   alanı hiç bulunmuyor (HERE API bunu vermiyor) - proje ilkesi gereği
   olmayan bir veri UYDURULMADI, yerine gerçekten var olan Giriş/Çıkış
   bilgisi kullanıldı. Bkz. README'deki bu turun notu. */
.toll-table { width: 100%; border-collapse: separate; border-spacing: 0; overflow: hidden; font-size: 0.82rem; border: 1px solid #ccc; border-radius: var(--radius-sm);}
.toll-table th {
  text-align: left; font-size: 10.5px; text-transform: uppercase; letter-spacing: .03em; color: var(--ink-3);
  font-weight: 700; padding: 3px 8px 6px; border-bottom: 1px solid var(--line);
}
.toll-table td { padding: 10px; border-bottom: 1px dashed var(--line); vertical-align: top; line-height: 1.3}
.toll-table tr:last-child td { border-bottom: 0; }
.toll-table__name { font-weight: 600; color: var(--ink); }
.toll-table__entryexit { color: var(--ink-2); font-size: 0.78rem; }
.toll-table__amt { text-align: right; white-space: nowrap; font-weight: 700; color: var(--ink); }
.toll-table__muted { color: var(--ink-3); font-style: italic; }
@media (max-width: 380px) {
  .toll-table { font-size: 0.76rem; }
  .toll-table th:nth-child(2), .toll-table td:nth-child(2) { display: none; }
}

/* ---------------------------------------------------------------- */
/* Yükleniyor / bildirim / SSS                                       */
/* ---------------------------------------------------------------- */
.loading { color: var(--ink-2); font-size: 0.9rem; padding: 20px 0; text-align: center; }
.notice {
  display: flex; gap: 10px; align-items: flex-start;
  background: #FFF6E0; border: 1px solid #EBCB84; color: #5B4300;
  padding: 10px 12px; border-radius: 10px; margin: 14px 0; font-size: 14px;
}
.sample-data-warning {
  display: flex; gap: 8px; align-items: flex-start;
  color: #6A4600; background: #FFF6E0; border: 1px solid #EBCB84; border-radius: var(--radius-sm);
  padding: 9px 12px; font-size: 0.82rem;
}
.sample-data-warning .icon { flex: none; margin-top: 1px; color: #A15C00; }

/* =====================================================================
   Yolculuk maliyeti karşılaştırma listesi — SSS'den HEMEN ÖNCE (madde 5)
   (2026-09-30, 36. tur devamı, kullanıcı isteği verbatim: "Karşılaştırma
   tablosunu görseldeki hale getirsene tıklayınca ilgili tab menüye
   geçsin") Eski <table> tasarımı TAMAMEN kaldırılıp kullanıcının
   paylaştığı referans görüntüdeki kart listesiyle değiştirildi: her mod
   kendi tıklanabilir kartı - solda renkli dairesel ikon, ortada mod adı +
   rozet/açıklama, sağda maliyet ve süre, en sağda ok işareti. Kartların
   tıklanınca ilgili mod sekmesine geçmesi js/app.js wireCompareCards()
   ile sağlanıyor (bkz. o dosyadaki not).
   ===================================================================== */
.compare { margin-top: 26px; border-top: 1px solid var(--line-strong); padding-top: 16px; }
.compare h2 { font-size: 1.1rem; color: var(--ink); margin: 0 0 4px; }
.compare__lead { color: var(--ink-2); font-size: 0.86rem; margin: 0 0 12px; line-height: 1.5; }

/* (2026-10-01, 41. tur 6. devam) Yolcu sayısı + gidiş-dönüş kontrolleri -
   js/app.js wireCompareControls() kartları bu girdilere göre CANLI
   günceller (sayfa yenilenmez). */
.compare-controls {
  display: flex; flex-wrap: wrap; align-items: center; gap: 14px;
  margin: 0 0 14px; padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--radius-md);
  background: var(--surface-2);
}
.compare-controls__field { display: flex; align-items: center; gap: 6px; font-size: 0.8rem; color: var(--ink-2); font-weight: 600; }
.compare-controls__field input[type="number"] {
  width: 56px; padding: 4px 6px; border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
  font: inherit; color: var(--ink); background: var(--surface);
}
.compare-controls__field--toggle { cursor: pointer; }
.compare-controls__field--toggle input[type="checkbox"] { width: 16px; height: 16px; accent-color: var(--navy); cursor: pointer; }
.compare-controls__label { white-space: nowrap; }
.compare-controls__hint { flex: 1 1 100%; margin: 0; font-size: 0.74rem; color: var(--ink-3); }
.compare-controls__hint:empty { display: none; }

/* (2026-10-01, 41. tur 6. devam) Araba/Taksi gibi araç-başı maliyetli
   modlarda, yolcu sayısı 1'den fazla girilince gösterilen "kişi başı"
   bilgi notu - js/app.js wireCompareControls() dolduruyor. */
.compare-card__passenger-note { font-size: 0.66rem; color: var(--ink-3); line-height: 1.35; white-space: normal; }
/* (2026-10-01, 41. tur 6. devam) `.compare-card__badges`'in `display:flex`
   kuralı, tarayıcının `[hidden]` için varsayılan (çok düşük öncelikli,
   user-agent) `display:none` kuralını EZEBİLİR - bu yüzden `[hidden]`
   burada AÇIKÇA (author stylesheet içinde) tekrarlanıyor, aksi halde
   js/app.js'in rozet gizleme/gösterme toggle'ı görünürde etkisiz kalırdı. */
.compare-card__badges[hidden], .compare-card__tagline[hidden], .compare-card__passenger-note[hidden], .compare__badge[hidden] { display: none; }

/* (2026-09-30, 36. tur devamı) CSS Grid'in sabit piksel sütunları dar
   mobil genişlikte (~350-390px) sığmayacağından, kartlar KASITLI olarak
   flexbox + flex-wrap ile kuruldu: masaüstünde ikon/isim/maliyet/süre/ok
   tek satırda; dar ekranda DOĞAL olarak (media query GEREKMEDEN) isim
   bloğu kendi satırına, maliyet+süre bir alt satıra sarar - bkz. aşağıdaki
   @media bloğundaki KÜÇÜK ek ayarlar (sadece boşluk/hizalama, düzen
   TAMAMEN flex-wrap'in kendisiyle çözülüyor). */
.compare-list__head {
  display: flex; align-items: center; gap: 10px; padding: 0 14px 8px;
  font-size: 0.72rem; text-transform: uppercase; letter-spacing: .03em; color: var(--ink-3); font-weight: 700;
}
/* (2026-09-30, 36. tur devamı, kullanıcı isteği verbatim: "font
   boyutlarını küçülterek yüklediğim görseli oluştur. Alt sıraya kayma
   olmasın ona göre ayarlamalısın. Mobil de başlıklar (ulaşım, vs)
   olmalı.") KÖK NEDEN: önceki turdaki boyutlar (48px ikon, 1.05rem isim,
   130px/110px sabit maliyet/süre sütunları + 14px boşluklar) toplamda
   panelin gerçek genişliğinden (~460-500px, haritanın yanındaki dar
   sütun) DAHA GENİŞTİ - flex-wrap bu yüzden HER ZAMAN devreye girip
   maliyet+süreyi bir alt satıra düşürüyordu (istenmeyen davranış). Ayrıca
   mobilde başlık satırı `display:none` ile TAMAMEN gizlenmişti. Düzeltme:
   ikon/font/boşluk/sütun genişlikleri küçültüldü - masaüstünde VE
   mobilde (~350px) TEK bir kural seti ile (medya sorgusu GEREKMEDEN)
   satır artık sarmıyor; mobil başlık satırı da (aşağıdaki @media bloğunda)
   artık gizlenmiyor, sadece biraz daha kompakt bir versiyonu gösteriliyor. */
.compare-list__head span { display: flex; align-items: center; gap: 4px; }
.compare-list__head span:first-child { flex: 1 1 auto; margin-left: 46px; }
.compare-list__head span:nth-child(2) { flex: 0 0 95px; }
.compare-list__head span:nth-child(3) { flex: 0 0 95px; }
.compare-list { display: flex; flex-direction: column; gap: 8px; }

.compare-card {
  display: flex; flex-wrap: nowrap; align-items: center; gap: 8px;
  padding: 10px 12px; border: 1px solid var(--line-strong); border-radius: var(--radius-md);
  background: var(--surface); cursor: pointer; transition: box-shadow .15s ease, transform .15s ease;
}
.compare-card:hover { box-shadow: 0 2px 10px rgba(15,31,43,.08); }
.compare-card:focus-visible { outline: 2px solid var(--navy); outline-offset: 2px; }
.compare-card:active { transform: scale(.995); }
/* En hızlı ve/veya en ucuz olan kart(lar) - referans görselde uçak
   satırının açık mavi zeminiyle AYNI fikir: o modun kendi rengiyle
   uyumlu, hafif bir "-soft" zemin. */
.compare-card--best { background: var(--mode-soft); border-color: var(--line-strong); }

.compare-card__icon {
  width: 36px; height: 36px; border-radius: 50%; display: flex; align-items: center; justify-content: center;
  color: #fff; flex: none;
}
.compare-card__icon .icon { width: 16px; height: 16px; }
.compare-card__icon[data-compare-icon="car"] { background: var(--compare-car); }
.compare-card__icon[data-compare-icon="bus"] { background: var(--compare-bus); }
.compare-card__icon[data-compare-icon="train"] { background: var(--compare-train); }
.compare-card__icon[data-compare-icon="plane"], .compare-card__icon[data-compare-icon="airbus"] { background: var(--compare-plane); }
.compare-card__icon[data-compare-icon="taxi"] { background: var(--compare-taxi); }
.compare-card__icon[data-compare-icon="transit"] { background: var(--transit); }
.compare-card__icon[data-compare-icon="sea"] { background: var(--sea); }
.compare-card__icon[data-compare-icon="suburban"] { background: var(--suburban); }

.compare-card__body { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.compare-card__name { font: 700 0.86rem/1.2 var(--font-display); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.compare-card__tagline { font-size: 0.68rem; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.compare-card__badges { display: flex; flex-wrap: nowrap; gap: 4px; }
.compare__badge {
  display: inline-flex; align-items: center; gap: 2px; font-size: 10px; font-weight: 600; line-height: 1;
  padding: 4px 6px; border-radius: 999px; background: var(--mode); color: #fff; white-space: nowrap;
}
.compare__badge--cheap { background: #2B9348; }

.compare-card__cost {
  flex: 0 0 92px; display: flex; align-items: center; gap: 4px;
  font: 700 0.86rem/1.2 var(--font-display); color: var(--ink); white-space: nowrap;
}
.compare-card__cost .icon { width: 13px; height: 13px; color: var(--ink-3); flex: none; }
.compare-card__no-price {
  display: flex; align-items: center; gap: 3px; font: 600 0.68rem/1.2 var(--font-body); color: var(--ink-3); white-space: normal;
}

.compare-card__duration { flex: 0 0 80px; display: flex; flex-direction: column; gap: 0; }
.compare-card__duration-value { display: flex; align-items: center; gap: 3px; font-size: 0.8rem; font-weight: 700; color: var(--ink); white-space: nowrap; }
.compare-card__duration-value .icon { width: 12px; height: 12px; color: var(--ink-3); flex: none; }
.compare-card__duration small { color: var(--ink-3); font-size: 0.62rem; }

.compare-card__chevron { flex: none; color: var(--ink-3); display: flex; align-items: center; justify-content: center; }
.compare-card__chevron .icon { width: 13px; height: 13px; }

/* (2026-10-02, 41. tur 14. devam, kullanıcı isteği verbatim: "Bu sitede
   adsense reklamı kullanacağım...") Reklam yerleşimi kapsayıcısı - bkz.
   RenderHelpers::renderAdSlot() doc yorumu. Sabit min-height, reklam
   script'i YÜKLENMEDEN önce de (veya $config['ads']['enabled'] false
   olduğu için hiç basılmadığında) yer ayırarak ani sayfa kaymasını (CLS)
   azaltır/engeller. `.ad-slot__label` ("Reklam") organik içerikten
   AYIRT EDİLEBİLİRLİK için - küçük, göze batmayan ama okunaklı. */
.ad-slot { margin: 22px 0; padding: 10px; border: 1px solid var(--line); border-radius: 10px; background: var(--surface); min-height: 310px; display: flex; flex-direction: column; align-items: center; gap: 6px; }
.ad-slot__label { font-size: 10.5px; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; color: var(--ink-3); align-self: center; }
.ad-slot .adsbygoogle { width: 100%; }
/* (2026-10-30) Rota sayfaları (index.php) için alçak reklam kutusu: .ad-slot--route */
.ad-slot.ad-slot--route { min-height: 100px; margin: 14px 0; padding: 6px 10px; gap: 4px; }
.ad-slot.ad-slot--route .ad-slot__label { font-size: 10px; }
@media (max-width: 640px) { .ad-slot.ad-slot--route { min-height: 90px; margin: 10px 0; } }


/* "İlgili Rotalar" iç link bloğu - RouteCacheService::getPopularRoutesFrom()
   ile GERÇEK route_cache.hits verisine dayalı (bkz. index.php notu).
   Her iki kolon da (kalkış/varış ilinden popüler rotalar) veri YOKSA
   PHP tarafında hiç basılmıyor - burada boş durum CSS'i YOK, çünkü
   boş bir .related-routes__col DOM'a hiç girmiyor. */
.related-routes { margin-top: 25px; padding-top: 16px; }
.related-routes #related-routes-title { font-size: 1.2rem; color: var(--ink); margin: 0 0 12px; font-weight: 600;}
.related-routes__grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
.related-routes__col p { font-size: 0.96rem; color: var(--ink-2); margin: 0 0 10px; font-weight: 600; }
.related-routes__col ul { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.related-routes__col a { display: block; padding: 8px 10px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; color: var(--ink); text-decoration: none; font-size: 0.86rem; }
.related-routes__col a:hover { border-color: var(--line-strong); background: var(--surface-2); }
/* (2026-10-04, 48. tur 33. devam) 32. devamda eklenen linksiz/düz-metin
   ".related-routes__text" varyantı (üst İL'e "düşme"/fallback satırları
   için) kullanıcının "tamam vazgeçtim hiç link yoksa o kolonu
   oluşturmasın varsa oluştursun" kararıyla birlikte KALDIRILDI - bkz.
   index.php + RouteCacheService.php'deki aynı tarihli notlar. Fallback
   kavramının kendisi silindiği için bu kurala artık GEREK YOK. */
.related-routes__city-link { margin: 14px 0 0; font-size: 0.88rem; }
.related-routes__city-link a { color: var(--car); font-weight: 600; text-decoration: none; }
.related-routes__city-link a:hover { text-decoration: underline; }
@media (max-width: 640px) {
  .breadcrumb ol {margin-top: 0;margin-bottom: 0}
  .related-routes__grid { grid-template-columns: 1fr; }
  .route-card__expand summary {max-width: 170px}
}

/* (2026-10-04, 48. tur 24. devam) Yeni sehirler.php (MOD A liste / MOD B
   tekil şehir sayfası) için GERÇEK stil - ayrı bir .ah- önekli dosya
   AÇILMADI (anasayfa.css'in aksine, bu basit bir liste/metin sayfası,
   kendi CSS dosyasını HAK ETMİYOR), doğrudan bu paylaşılan style.css'e,
   mevcut .site-container/design token'ları kullanarak eklendi. */
.city-page-hero { padding: 28px 0 8px; }
.city-page-hero h1 { font-size: 1.5rem; color: var(--ink); margin: 0 0 6px; }
.city-page-hero p { color: var(--ink-2); font-size: 0.92rem; margin: 0; }
.city-list-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 10px; padding: 18px 0 40px; }
.city-list-grid a { display: block; padding: 12px 14px; background: var(--surface); border: 1px solid var(--line); border-radius: 10px; color: var(--ink); text-decoration: none; font-weight: 600; font-size: 0.9rem; }
.city-list-grid a:hover { border-color: var(--car); color: var(--car); }
.city-hub-section { margin: 22px 0; }
.city-hub-section h2 { font-size: 1.05rem; color: var(--ink); margin: 0 0 10px; }
.city-hub-list { list-style: none; margin: 0 0 30px; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 8px; }
.city-hub-list a { display: block; padding: 10px 12px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; color: var(--ink); text-decoration: none; font-size: 0.88rem; }
.city-hub-list a:hover { border-color: var(--line-strong); background: var(--surface-2); }
.city-hub-empty { color: var(--ink-3); font-size: 0.88rem; margin: 0 0 30px; }

.faq { margin-top: 25px; padding-top: 16px; }
.faq h2 { font-size: 1.1rem; color: var(--ink); margin-bottom: 15px}
.faq details { background: var(--surface); border: 1px solid var(--line); border-radius: 10px; margin: 8px 0; }
.faq summary {
  cursor: pointer; font-weight: 600; font-size: 0.92rem; padding: 12px 14px; list-style: none;
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
}
.faq summary::-webkit-details-marker { display: none; }
/* (2026-10-02, 41. tur 9. devam, kullanıcı isteği verbatim: "birde açma
   kapa işlemine + koyalım kapatırken x olsun") Kapalıyken "+", açıkken
   "×" - saf CSS (`details[open]` seçicisi), JS GEREKMEDİ. */
.faq summary::after {
  content: '+'; flex: none; font-size: 1.3rem; font-weight: 400; line-height: 1; color: var(--ink-3);
}
.faq details[open] summary::after { content: '×'; }
/* (24. tur, kullanıcı isteği, madde 2: "sorular h3 etiketi alsın") Soru
   metni artık <summary> içinde çıplak metin DEĞİL, kendi <h3>'ü (SEO/
   heading-outline semantiği için) - ama <h3>'ün TARAYICI VARSAYILANI
   (kalın+büyük font, dikey margin) burada İSTENMİYOR: <summary> zaten
   kendi font-weight/font-size/padding'ini tanımlıyor (yukarısı), h3
   BUNU DEVRALSIN diye sıfırlanıyor - accordion'un GÖRSEL STİLİ (tıklanabilir
   satır, ok işareti, kart görünümü) BİREBİR AYNI kalıyor, sadece semantik
   etiket değişti. */
.faq summary h3 { margin: 0; font: inherit; color: inherit; display: inline; }
.faq p { color: var(--ink-2); font-size: 0.88rem; padding: 0 14px 12px; margin: 0; }

.panel-foot { margin-top: 24px; font-size: 0.74rem; color: var(--ink-3); padding-bottom: 20px; }

/* ---------------------------------------------------------------- */
/* Footer (13. tur, kullanıcı isteği: "tasarıma footer ve linkler ekleyelim") */
/*                                                                    */
/* (2026-10-03, 48. tur 7. devam, kullanıcı isteği verbatim: "Öncelikle    */
/* footer header gibi ekranın tam altında olsun. Aşağıya indiğimde footer  */
/* ekranın %100 kaplasın. Yani harita header ile footer içinde kalacak     */
/* şekle getirelim.") KÖK SORUN: footer `.sheet__scroll` İÇİNDE (sol 520px */
/* panelin kendi iç scroll alanının EN SONU) render ediliyordu - bu yüzden */
/* (a) sadece sol paneli aşağı kaydırınca görünüyordu, sağdaki harita       */
/* sütununun ALTINDA HİÇ yoktu, (b) tam genişlik değil, 520px'lik panelle   */
/* SINIRLIYDI. ÇÖZÜM: footer artık `.app`'in (header+sheet+harita satırı)  */
/* bir KARDEŞİ, index.php'nin gövdesinde `.app`'ten SONRA, `</body>`'den    */
/* hemen önce (bkz. index.php) - `.app` kendi sabit yüksekliğini           */
/* (calc(100vh - 56px)) KORUDUĞU için (DEĞİŞTİRİLMEDİ) harita+panel ilk     */
/* ekranı TAM dolduruyor, footer'a ulaşmak için sayfanın TAMAMINI aşağı     */
/* kaydırmak gerekiyor - tıpkı header'ın her zaman en üstte sabit kalması   */
/* GİBİ, footer de her zaman "sayfanın gerçek sonu" ve TAM GENİŞLİKTE.      */
/* Renk paleti `anasayfa-tasarim.html` (47. tur onaylı tasarım) ile BİREBİR */
/* aynı koyu lacivert tema - header'ın tersine (beyaz) footer koyu, iki     */
/* bölge arasında net bir "sayfa bitti" hissi veriyor.                      */
/* ---------------------------------------------------------------- */
 
.site-footer { background: var(--navy); color: #cfdcf0; padding: 30px 0 18px; font-size: 15px; }
.site-container {width: 100%; margin: 0 auto;  padding: 0 50px;}
.footer-grid { display: grid; grid-template-columns: 1.8fr 1fr 1fr 1fr 1fr; gap: 28px; }
.site-footer .logo-text strong, .site-footer .logo-text strong span { color: #fff; }
.site-footer .logo-text small { color: #aebfd8; }
.footer-about p { margin: 12px 0 16px; max-width: 360px; }
.socials {
    display: flex;
    align-items: center;
    gap: 9px;
    margin-top: 18px;
}

.socials a {
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    border: 1px solid rgba(255,255,255,.15);
    border-radius: 8px;
    color: #a9bdce;
    transition: .2s ease;
}

.socials svg {
    width: 20px;
    height: 20px;
    display: block;
    fill: currentColor;
}

.socials a:hover {
    color: #fff;
    border-color: rgba(255,255,255,.35);
}
/* (2026-10-20) footer sosyal ikonları: resmi SVG dosyası maske, renk currentColor (üzerine gelince beyaz) */
.socials__ic { width: 17px; height: 17px; display: block; background: currentColor; -webkit-mask: var(--ic) center / contain no-repeat; mask: var(--ic) center / contain no-repeat; }
.socials__tx { font-size: 11px; font-weight: 600; }
.footer-col .footer-title { font-family: 'Inter', sans-serif; font-size: 14px; color: #fff; margin-bottom: 10px; font-weight: 600}
.footer-col ul {list-style: none; padding: 0}
.footer-col li { margin-bottom: 8px; }
.site-footer a { color: inherit; text-decoration: none; }
.site-footer a:hover { color: #fff; }
.footer-bottom { display: flex; justify-content: space-between; align-items: center; gap: 12px; flex-wrap: wrap; border-top: 1px solid rgba(255,255,255,.12); margin-top: 22px; padding-top: 14px; font-size: 12px;}
.footer-bottom ul { display: flex; gap: 14px; list-style: none;}
.footer_name { font: 700 22px/1.05 var(--font-display); letter-spacing: -0.02em; color: #fff; }
.footer_tagline { font: 500 14px var(--font-body); color: #aebfd8; margin-top: 2px; white-space: nowrap; }

    /* ========== Responsive ========== */
    @media (max-width: 992px) {
      .site-container {padding: 0 30px;}
      .footer-grid { grid-template-columns: repeat(3, 1fr); }
      .footer-about { grid-column: 1 / -1; }
      .footer-bottom ul {padding: 0}
    }

    @media (max-width: 560px) {
      .footer-grid { grid-template-columns: 1fr 1fr; }
      .footer-bottom { flex-direction: column; align-items: center; text-align:center; }
    }

/* ---------------------------------------------------------------- */
/* Harita alanı                                                      */
/* ---------------------------------------------------------------- */
.map-area { position: relative; flex: 1; min-width: 0; background: #DDE5EB; }
#map { position: absolute; inset: 0; }

/* (19. tur, kullanıcı isteği: "arama yaptıktan sonra direkt harita
   çalışmasın Rota ara tuşuna basılsın") Boş/varsayılan arama formu
   durumunda (bkz. index.php $isDefaultLanding, js/app.js initMap()'in
   koşullu çağrısı) Leaflet HİÇ başlatılmıyor - #map bu statik yer
   tutucuyla dolu kalıyor: canlı/etkileşimli bir harita YOK, sadece
   "henüz arama yapılmadı" bilgisini veren inert bir kutu. */
.map-placeholder {
  position: absolute; inset: 0; display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 10px;
  color: var(--ink-3); text-align: center; padding: 24px;
}
.map-placeholder .icon { width: 28px; height: 28px; opacity: .55; }
.map-placeholder p { margin: 0; font-size: 14px; max-width: 240px; color: #333; }

.app--map-fullscreen .sheet { display: none; }
.app--map-fullscreen .map-area { position: fixed; inset: 0; z-index: 2000; }

.map-tools { position: absolute; top: 10px; z-index: 500; display: flex; gap: 10px; flex-wrap: wrap; max-width: calc(100% - 32px); }
.map-tools--right { right: 14px; }
.chip {
  background: var(--surface); color: var(--ink-2); border: 1px solid var(--line-strong); border-radius: 999px;
  padding: 9px 16px; font-weight: 600; font-size: 0.85rem; cursor: pointer; box-shadow: var(--shadow-card);
  display: inline-flex; align-items: center; gap: 6px;
}
.chip[aria-pressed="true"] { background: var(--navy); border-color: var(--navy); color: #fff!important; }
.chip:disabled { opacity: 0.6; cursor: wait; }

/* (16. tur, kullanıcı isteği: "haritadaki tam ekran butonda yazmasın sadece
   icon yeterli") Metin ekrandan tamamen kaldırılmıyor - erişilebilirlik
   (ekran okuyucu) için DOM'da kalıyor, sadece görsel olarak gizleniyor;
   buton da metin olmadan simetrik/yuvarlak bir ikon-buton görünümü alıyor. */
.chip--icon-only { padding: 9px; width: 38px; height: 38px; justify-content: center; }
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}

/* POI katman butonları (Yakıt/Dinlenme/Gezilecek yer/Radar) - rota
   seçeneklerinin ALTINDA, KARE kutucuklar halinde 3'lü (dar ekranda 2'li)
   bir ızgarada, taşan butonlar ALT ALTA yeni satıra geçiyor. */
.poi-toggle-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin: 18px 0; }
.poi-toggle-row .chip {
  aspect-ratio: 1 / 1; width: auto; height: auto;
  flex-direction: column; align-items: center; justify-content: center; font-weight: 500; color: #333;
  text-align: center; line-height: 1.3; padding: 10px 6px; border-radius: 18px; font-size: 1rem; gap: 6px;
}
@media (max-width: 420px) { .poi-toggle-row { grid-template-columns: repeat(2, 1fr); } }

/* (madde 2, masaüstü turu) Masaüstünde (≥861px) POI butonları haritanın
   ÜSTÜNDE yüzer (Google Maps referansı) - mobilde bu değişmez, sheet
   içindeki kare kutucuk ızgarası (yukarısı) aynen kalır. İki kopya aynı
   `data-poi-types` değerlerini taşır; app.js ikisini senkron tutar. */
.poi-toggle-row--floating { display: none; }
@media (min-width: 861px) {
  #map-tools { display: none; }
  .poi-toggle-row--floating {
    display: flex; flex-wrap: wrap; gap: 8px;
    position: absolute; top: 16px; left: 16px; right: 190px; z-index: 500;
  }
  .poi-toggle-row--floating .chip {
    aspect-ratio: auto; width: auto; height: auto; flex-direction: row;
    border-radius: 999px; padding: 10px 16px 10px 14px; font-size: 0.85rem; gap: 8px;
  }
}

.poi-pin { width: 28px; height: 28px; border-radius: 50%; background: #fff; border: 2px solid var(--amber); display: grid; place-items: center; box-shadow: var(--shadow-card); color: var(--navy); }
.poi-pin .icon { width: 15px; height: 15px; }

.map-pin { width: 30px; height: 30px; border-radius: 50% 50% 50% 0; transform: rotate(-45deg); background: var(--mode, var(--navy)); display: grid; place-items: center; box-shadow: 0 2px 6px rgba(0,0,0,0.3); border: 2.5px solid #fff; }
.map-pin span { transform: rotate(45deg); color: #fff; font-weight: 700; font-size: 0.85rem; }
.map-pin--stop { background: var(--amber); width: 22px; height: 22px; }

.toast {
  position: fixed; bottom: 20px; left: 50%; transform: translateX(-50%);
  background: var(--navy); color: #fff; padding: 10px 18px; border-radius: 999px;
  font-size: 0.85rem; opacity: 0; pointer-events: none; transition: opacity 0.2s ease;
}
.toast.is-visible { opacity: 1; }

/* =====================================================================
   Bilet kartı (otobüs/tren/uçak) — boarding-pass görünümü, CSS mask ile
   perforasyon kesikleri
   ===================================================================== */
.ticket {
  --foot-h: 70px;
  background: var(--surface); border: 1px solid var(--line-strong); border-top: 5px solid var(--mode);
  border-radius: var(--radius-md); display: flex; flex-direction: column; overflow: visible;
  -webkit-mask:
    radial-gradient(circle 9px at 0 calc(100% - var(--foot-h)), #0000 97%, #000) left / 51% 100% no-repeat,
    radial-gradient(circle 9px at 100% calc(100% - var(--foot-h)), #0000 97%, #000) right / 51% 100% no-repeat;
  mask:
    radial-gradient(circle 9px at 0 calc(100% - var(--foot-h)), #0000 97%, #000) left / 51% 100% no-repeat,
    radial-gradient(circle 9px at 100% calc(100% - var(--foot-h)), #0000 97%, #000) right / 51% 100% no-repeat;
}
.ticket__main { padding: 12px 14px 14px; display: flex; flex-direction: column; gap: 6px; }
.ticket__head { display: flex; justify-content: space-between; align-items: center; gap: 8px; font-size: 13px; font-weight: 600; }
.ticket__brand { display: flex; align-items: start; gap: 8px; min-width: 0; }
/* (2026-09-30, madde 5) Kullanıcının paylaştığı referans görseldeki gibi
   biraz daha belirgin/"logo kutusu" hissi versin diye büyütüldü
   (26px -> 34px) - işlevi DEĞİŞMEDİ (hâlâ sadece moda göre renklenen
   jenerik bir ikon kutusu).
   (2026-10-02, 41. tur 18. devam, kullanıcı isteği verbatim: "Otobüs, tren,
   uçak ta icon yerine küçük resimleri yerleştirelim şık dursun")
   transport_operators.image doluysa aynı 34x34 kutunun içine artık GERÇEK
   bir işletmeci logosu (<img class="ticket__mono ticket__mono--img">)
   yerleştirilebiliyor - .ticket__mono--img alttaki renkli arka planı/SVG
   ikonunu değil, resmi kutuya sığdırıyor. Şu an için hiçbir operatörde bu
   alan dolu DEĞİL (gerçek logo UYDURULMADI, sadece altyapı hazır) - o
   yüzden mevcut veriyle site hâlâ eski ikon kutusunu gösteriyor. */
.ticket__mono { width: 34px; height: 34px; border-radius: 8px; display: grid; place-items: center; flex: none; background: var(--mode); color: #fff; }
.ticket__mono .icon { width: 18px; height: 18px; }
.ticket__mono.ticket__mono--img { background: #fff; object-fit: cover; }
/* (aynı tur) transport_operators.address/phone/email doluysa görünen,
   boşken HİÇBİR ŞEY render etmeyen (bkz. RenderHelpers::renderServiceCard())
   küçük iletişim satırı. */
.ticket__op-contact { font-size: 11.5px; color: var(--ink-3); line-height: 1.4; }
.ticket__code { color: var(--ink-3); font-weight: 500; white-space: nowrap; }
/* (2026-10-02, 41. tur 14. devam, kullanıcı isteği verbatim: "Otobüs,
   tren, uçak sekmelerine tıkladığımda seferlere de en ucuz, en kısa
   ibareleri eklensin.") `.sched-row__badge`in ("EN UCUZ", sefer detay
   listesinde) pembe/yeşil dolgu desenini tekrar eden küçük rozetler -
   sadece BİRDEN FAZLA seçenek varken ve gerçekten o seçenek o kritere
   göre en iyiyse basılıyor (bkz. RenderHelpers::renderServiceCard() doc
   yorumu), UYDURULMUŞ/her zaman görünen bir rozet DEĞİL. */
.ticket__best-badges { display: flex; gap: 6px; flex-wrap: wrap; }
.ticket__best-badge { font-size: 11px; font-weight: 700; letter-spacing: .02em; color: #fff; border-radius: 999px; padding: 2px 9px; white-space: nowrap; }
.ticket__best-badge--cheap { background: var(--ok); }
.ticket__best-badge--fast { background: var(--mode); }
.ticket__times { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 10px; }
.ticket__time { display: flex; flex-direction: column; }
.ticket__time time { font: 700 24px/1 var(--font-display); font-variant-numeric: tabular-nums; }
.ticket__time small { font-size: 12px; color: var(--ink-2); margin-top: 3px; max-width: 15ch; }
.ticket__time--end { align-items: flex-end; text-align: right; }
.ticket__span { display: flex; flex-direction: column; align-items: center; font-size: 12px; color: var(--ink-2); gap: 3px; }
.ticket__span span, .sched-row__span span {display: flex; align-items: center; gap: 5px}
.ticket__span i { display: block; width: 100%; height: 2px; background: var(--mode); position: relative; opacity: .6; font-style: normal; }
.ticket__span i::before, .ticket__span i::after { content: ''; position: absolute; top: -3px; width: 8px; height: 8px; border-radius: 50%; background: var(--mode); }
.ticket__span i::before { left: 0; } .ticket__span i::after { right: 0; }
/* (madde 4) Kalkış saati kaydı olmayan seçenek - saat/varış saati bloğu
   YERİNE sade "Yaklaşık {süre}" satırı, aynı bilet ailesinde. */
.ticket__times--duration-only { display: block; }
.ticket__duration-only { display: flex; align-items: center; gap: 8px; font-size: 15px; color: var(--ink); font-weight: 600; }
.ticket__duration-only strong { font: 700 20px/1 var(--font-display); }
.ticket__duration-only-icon { display: inline-flex; color: var(--mode); }
.ticket__features { display: flex; flex-wrap: wrap; gap: 5px; }
.ticket__features span { font-size: 12px; padding: 2px 9px; border-radius: 999px; background: var(--surface-2); border: 1px solid var(--line); color: var(--ink-2); }
/* (2026-09-30, 36. tur, madde 3: "gerçek zamanla seferleri kontrol edip
   şayet sefer saati yoksa uyarı versin") Bugün için kalan kalkışı olmayan
   bir bilet kartında, RenderHelpers::resolveNextDeparture() 'yarın'a ait
   saati döndürdüğünde bu uyarı basılır - kullanıcı saatin hangi güne ait
   olduğunu yanlış anlamasın diye. */
.ticket__tomorrow-warn { margin-top: 6px; font-size: 12px; padding: 5px 10px; border-radius: 8px; background: var(--amber-soft, #FBEEDA); color: var(--amber-dark, #8a5a00); border: 1px solid var(--amber, #A75B00); }
/* (2026-09-30, kullanıcı isteği: otobüs/uçak için kayıtlı sefer yoksa
   hub tabanlı "tahmini süre" kartı) .ticket'ın temel görünümünü kullanır,
   sadece alt bilgi notu ve (uçakta) mesafe satırı için ek stil - fiyat/
   "Sefer detaylarına git" alanı HİÇ basılmadığından (bkz. RenderHelpers::
   renderEstimateCard) .ticket__foot burada kullanılmıyor, kart doğal
   olarak bilet kartlarından daha kısa/sade görünür. */
.estimate-card .ticket__distance,
.estimate-card__distance { font-size: 13px; color: var(--ink-2); display: flex; align-items: center; gap: 6px; margin-top: 8px; }
.estimate-card__note { font-size: 12.5px; color: var(--ink-2); line-height: 1.5; margin-top: 10px; padding-top: 10px; border-top: 1px dashed var(--line); }
.ticket__foot { height: 52px; border-top: 2px dashed var(--line-strong); margin: 0 12px; display: flex; justify-content: space-between; align-items: center; gap: 8px; }
.ticket__price { display: flex; flex-direction: column; min-width: 0; }
.ticket__price strong { font: 700 20px/1.1 var(--font-display); color: var(--mode); }
.ticket__price small { font-size: 12.5px; color: var(--ink-2); }
.ticket__side { display: flex; flex-direction: column; align-items: flex-end; gap: 2px; font-size: 12px; white-space: nowrap; }
.badge { display: inline-block; font-size: 12px; font-weight: 600; padding: 1px 8px; border-radius: 999px; background: #E1F3E8; color: var(--ok); }

/* "Sefer detaylarına git" - Rome2Rio slaytını açan buton (madde 6) */
.ticket__sched-link { border: 0; background: none; color: var(--mode); font: inherit; font-weight: 600; font-size: 14px; padding: 0; cursor: pointer; text-align: right; }
.ticket__sched-link:hover { text-decoration: underline; }

/* =====================================================================
   (madde 6, masaüstü turu) Rome2Rio tarzı "Kalkışlar" listesi - bir bilet
   kartındaki "Sefer detaylarına git"e tıklanınca mode-panels'in YERİNE
   kayan bir slayt (POI slaytıyla aynı swapPane() mekanizması).
   ===================================================================== */
.sched-slide { padding-bottom: 16px; }
.sched-list__head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 10px; margin-bottom: 20px; }
.sched-list__route { display: flex; align-items: center; gap: 8px; font: 500 17px/1.2 var(--font-display); color: var(--ink); }
.sched-list__route .icon { color: var(--mode); }
/* (2026-09-30, kullanıcı isteği, madde 4 - verbatim: "Tüm seferleri gör
   butonu kaldır. Kalkış Sayısını Yolcu yanına yerleştir ve Sırala ve
   filtre yan yana gelsin. Sırala labeli tarih deki gibi üstünde olsun.
   Toplamda 2 satırlık alanda hepsi olsun.") Eskiden Tarih/Yolcu +
   "N kalkış"/"Tüm seferleri gör" + Sırala/Filtrele TOPLAM 3-4 satıra
   yayılıyordu (bkz. README'deki eski not). Artık TAM 2 satır:
   `.sched-list__row1` = Tarih + Yolcu + Kalkış (üçü de AYNI `.sched-field`
   kalıbı - küçük büyük harf etiket üstte, değer altta); `.sched-list__row2`
   = Sırala (artık `.sched-field` ile AYNI etiket-üstte düzeninde) +
   Filtrele, yan yana. "Tüm seferleri gör" butonu TAMAMEN kaldırıldı. */
.sched-list__row1, .sched-list__row2 { display: flex; gap: 8px; flex-wrap: wrap; align-items: flex-end; margin-bottom: 10px; }
.sched-field { display: flex; flex-direction: column; gap: 2px; font-size: 11px; color: var(--ink-3); font-weight: 600; text-transform: uppercase; letter-spacing: .02em; }
.sched-field input { border: 1px solid var(--line-strong); border-radius: 8px; padding: 6px 8px; font: inherit; font-size: 0.86rem; color: var(--ink); background: var(--surface-2); width: 9em; }
/* "Kalkış" artık düzenlenebilir bir alan DEĞİL (statik metin) ama diğer
   iki `.sched-field` ile GÖRSEL olarak birebir aynı hizada duracak şekilde
   - değeri bir `<input>` yerine düz metin/`<span data-sched-count>`. */
.sched-field--static { justify-content: flex-start; }
.sched-field--static span { font: 600 0.86rem/1 var(--font-body); color: var(--ink); text-transform: none; letter-spacing: normal; padding: 6px 0; }
/* (12. tur, madde 7, kullanıcı isteği: "Filtreler de daha toplu olsun şık
   bir şekilde tasarla") Sırala <select> + bir "Filtrele" disclosure düğmesi
   (bkz. .sched-filters-toggle) yan yana. Chip gruplarının KENDİSİ
   (fonksiyonelliği, data-*-filter attribute'ları) HİÇ değişmedi - sadece
   varsayılan olarak katlanmış (.sched-list__filter-panel[hidden]) bir
   panele taşındı, düğmeye basınca açılır. */
.sched-filters-toggle {
  display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--line-strong);
  background: var(--surface); color: var(--ink-2); font: inherit; font-weight: 600; font-size: 0.8rem;
  padding: 6px 12px; border-radius: 8px; cursor: pointer; height: 33px;
}
.sched-filters-toggle:hover { background: var(--surface-2); }
.sched-filters-toggle[aria-expanded="true"] { background: var(--navy); border-color: var(--navy); color: #fff; }
.sched-list__filter-panel {
  display: flex; flex-direction: column; gap: 15px; margin: 0 0 15px;
  padding: 10px 8px; background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-md);
}
/* (2026-09-28, madde 3: filtreler/sıralama artık GERÇEKTEN çalışıyor -
   bkz. js/app.js wireScheduleListControls) chip--filter tıklanabilir bir
   toggle butonuna dönüştü - basılı durum, .chip[aria-pressed="true"] ile
   AYNI navy vurgu kuralını (satır ~379) paylaşıyor, ayrı bir stil YOK. */
.chip--filter { background: var(--surface); font-size: 0.72rem; padding: 9px; box-shadow: none; border: 1px solid var(--line); cursor: pointer; }
.chip-group { display: inline-flex; gap: 4px; flex-wrap: wrap; }
/* (2026-09-30) `.sched-sort` artık `.sched-field` ile AYNI etiket-üstte
   dikey düzeni kullanıyor (eskiden "↓ Sırala" etiketi select'in SOLUNDA,
   tek satırdaydı) - sadece select'in kendi (pill şeklindeki) görünümü
   korunuyor. */
.sched-sort select {
  border: 1px solid var(--line-strong); border-radius: 8px; padding: 6px 10px; font: inherit; font-size: 0.8rem;
  color: var(--ink); background: var(--surface-2); cursor: pointer; text-transform: none; letter-spacing: normal;
}
.sched-list__date-note { display: flex; gap: 6px; align-items: flex-start; color: var(--ink-3); font-size: 0.76rem; margin: -6px 0 12px; }
.sched-list__date-note .icon { flex: none; margin-top: 1px; }
.sched-empty { color: var(--ink-2); font-size: 0.86rem; padding: 14px 0; text-align: center; }
/* Kalkış saati kaydı olmayan sefer (madde 4) - saat yerine "Yaklaşık {süre}". */
.sched-row__time--duration-only { color: var(--ink-2); font-weight: 600; }

/* (2026-09-30 devamı, kullanıcı isteği verbatim: "otobüs kartı sefer
   detaylarındaki tasarımı yapmamışsın") Sefer detayı listesindeki her satır
   artık bilet kartıyla (.ticket, bkz. yukarısı) AYNI görsel dili kullanıyor -
   logo kutusu + firma adı üstte, saat çizgisi (kalkış şehri - süre - varış
   şehri) ortada, altta durak bilgisi + fiyat. `.ticket__mono`/`.ticket__span`
   gibi AYNI tasarım kalıplarını burada `.sched-row__*` adlarıyla (liste
   bağlamında biraz daha kompakt boyutlarda) tekrar tanımlıyoruz - class
   adları farklı ama görsel dil birebir aynı olacak şekilde ölçüldü. */
.sched-rows { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.sched-row {
  padding: 12px 14px; border: 1px solid var(--line-strong); border-radius: var(--radius-md); background: var(--surface);
  display: flex; flex-direction: column; gap: 10px;
}
.sched-row--cheapest { border-color: var(--ok); background: #F1FAF4; }
/* (2026-10-02, 41. tur 17. devam) .sched-ad-slot - RenderHelpers::
   renderScheduleList() tarafından .sched-rows listesine eklenen reklam
   <li>'si. .sched-row DEĞİL (satır değil) ama aynı flex listenin bir
   üyesi - .sched-rows zaten 10px `gap` veriyor, bu yüzden içindeki
   .ad-slot'un kendi 22px dikey margin'i burada FAZLALIK/çift boşluk
   yaratırdı - sıfırlıyoruz ki liste içinde diğer satırlarla tutarlı
   aralıkla otursun. */
.sched-ad-slot { list-style: none; }
.sched-ad-slot .ad-slot { margin: 0; }
.sched-row__head { display: flex; align-items: center; gap: 8px; }
.sched-row__mono { width: 28px; height: 28px; border-radius: 7px; display: grid; place-items: center; flex: none; background: var(--mode); color: #fff; }
.sched-row__mono .icon { width: 15px; height: 15px; }
/* (2026-10-02, 43. tur, kullanıcı isteği verbatim: "image resimleri sefer
   detaylarında gelmiyor orada da gelsin.") .ticket__mono--img ile AYNI
   kural - operator_image doluysa bu kutunun içine gerçek logo oturuyor. */
.sched-row__mono.sched-row__mono--img { background: #fff; object-fit: cover; }
.sched-row__brand { display: flex; flex-direction: column; min-width: 0; flex: 1; }
.sched-row__brand strong { font-size: 0.88rem; font-weight: 700; color: var(--ink); }
.sched-row__brand small { font-size: 0.74rem; font-weight: 400; color: var(--ink-2); }
.sched-row__badge { font-size: 10.5px; font-weight: 700; letter-spacing: .03em; color: #fff; background: var(--ok); border-radius: 999px; padding: 2px 8px; white-space: nowrap; flex: none; }
.sched-row__times { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: 8px; }
.sched-row__time { display: flex; flex-direction: column; }
.sched-row__time time { font: 700 19px/1 var(--font-display); font-variant-numeric: tabular-nums; }
.sched-row__time time sup { color: var(--amber); font-size: 0.6em; }
.sched-row__time small { font-size: 11px; color: var(--ink-2); margin-top: 1px; max-width: 14ch; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.sched-row__time--end { align-items: flex-end; text-align: right; }
.sched-row__span { display: flex; flex-direction: column; align-items: center; font-size: 12px; color: var(--ink-2); gap: 3px; white-space: nowrap; }
.sched-row__span i { display: block; width: 100%; height: 2px; background: var(--mode); position: relative; opacity: .6; font-style: normal; min-width: 32px; }
.sched-row__span i::before, .sched-row__span i::after { content: ''; position: absolute; top: -3px; width: 7px; height: 7px; border-radius: 50%; background: var(--mode); }
.sched-row__span i::before { left: 0; } .sched-row__span i::after { right: 0; }
.sched-row__times--duration-only { grid-template-columns: none; display: flex; align-items: center; gap: 8px; font-size: 14px; color: var(--ink); font-weight: 600; }
.sched-row__duration-only-icon { display: inline-flex; color: var(--mode); }
/* (36. tur, madde 3: "sefer detaylarında gün seçeneği yarın olarak
   listelesin") Her tarifeli satırın kalkış saati şu anki gerçek saatten
   önceyse bu tekrarlanan seferin bir sonraki gerçekleşmesi yarındır.
   (2026-09-30 devamı, gerçek hata düzeltmesi) Eskiden saat çizelgesinin
   SAĞ ÜST köşesine mutlak konumlanıyordu - bu, AYNI köşedeki varış
   saatiyle ÇAKIŞIYORDU (canlı ekran görüntüsünde "13:30" rozetin ALTINDA
   kalıp okunmuyordu). Artık normal akışta, üst satırda "EN UCUZ" rozetiyle
   AYNI konumda - hiçbir zaman saat metniyle aynı alanı paylaşmıyor. */
.sched-row__day { flex: none; font-size: 10px; font-weight: 600; color: var(--ink-2); background: var(--surface-2); border-radius: 999px; padding: 2px 8px; white-space: nowrap; }
.sched-row__day--tomorrow { color: #fff; background: var(--amber, #A75B00); }
.sched-row__foot { display: flex; justify-content: space-between; align-items: center; gap: 5px; padding-top: 5px; border-top: 1px dashed var(--line); }
.sched-row__meta { font-size: 0.78rem; color: var(--ink-2); }
.sched-row__price { font: 700 17px/1.1 var(--font-display); color: var(--mode); white-space: nowrap; }

/* =====================================================================
   (madde 4, masaüstü turu) Özel başlangıç/varış işaretçileri - Leaflet'in
   varsayılan pin'i/harf rozeti yerine, SVG ikon (araç/konum) + yer adı
   etiketi. bkz. js/app.js pin() - artık L.divIcon içine bu markup basılıyor.
   ===================================================================== */
.map-marker { display: flex; align-items: center; gap: 6px; white-space: nowrap; transform: translateY(-6px); }
.map-marker__icon {
  width: 34px; height: 34px; border-radius: 50%; background: var(--mode, var(--navy)); color: #fff;
  display: grid; place-items: center; box-shadow: 0 2px 8px rgba(0,0,0,0.35); border: 2.5px solid #fff; flex: none;
}
/* (2026-09-30, 36. tur, kullanıcı isteği: "harita da varış iconu konum
   rengi beyaz olsun şuan siyah") ikon glifi (currentColor) --navy (koyu
   lacivert, neredeyse siyah GÖRÜNÜYORDU) yerine beyaz - amber arka plan
   ile kontrast hâlâ yeterli, sadece "siyah gibi" algılanan koyu ton
   kaldırıldı. Arka plan (amber) DEĞİŞMEDİ - başlangıç/varış ayrımı hâlâ
   renkle de yapılıyor, sadece glif rengi. */
.map-marker--end .map-marker__icon { background: var(--amber); color: #fff; }
.map-marker__icon .icon { width: 18px; height: 18px; }
.map-marker__label {
  background: #fff; color: var(--ink); font: 600 12.5px/1.2 var(--font-body); padding: 4px 10px;
  border-radius: 999px; box-shadow: var(--shadow-card); border: 1px solid var(--line-strong);
}

/* Biletin altındaki "tüm sefer saatlerini gör" — native <details> içinde */
.ticket__expand { margin: 4px 14px 14px; border-top: 1px solid var(--line); }
.ticket__expand summary {
  display: flex; align-items: center; gap: 6px; cursor: pointer; list-style: none;
  padding: 10px 2px 2px; font-size: 13px; font-weight: 600; color: var(--mode);
}
.ticket__expand summary::-webkit-details-marker { display: none; }
.ticket__expand summary::after {
  content: ''; width: 14px; height: 14px; margin-left: 2px;
  background: currentColor;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E") center/contain no-repeat;
  transition: transform .2s ease;
}
.ticket__expand[open] summary::after { transform: rotate(180deg); }
.departure-list { list-style: none; margin: 10px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.departure { display: flex; align-items: baseline; gap: 10px; padding: 10px 12px; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface-2); }
.departure__time { font-size: 1.1rem; font-weight: 700; color: var(--ink); font-variant-numeric: tabular-nums; }
.departure__arrow { color: var(--ink-3); }
.departure__arrive { font-size: 1rem; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.departure__arrive sup { font-size: 0.65rem; color: var(--amber); font-weight: 700; margin-left: 2px; }
.departure__days { font-size: 0.74rem; color: var(--ink-3); }
.departure__price { margin-left: auto; font-size: 0.95rem; color: var(--ink); font-weight: 600; }

/* =====================================================================
   Terminal/istasyon/havalimanı erişimi — "kapıdan kapıya değil" gerçeği
   ===================================================================== */
.hub-card {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px;
  background: var(--mode-soft); border-radius: var(--radius-md); padding: 12px 14px; margin: 16px 0 10px;
}
.hub-card__icon { width: 40px; height: 40px; border-radius: 10px; display: grid; place-items: center; background: var(--mode); color: #fff; flex: none; }
.hub-card__text { display: flex; flex-direction: column; min-width: 0; font-size: 14px; flex: 1 1 160px; }
.hub-card__text strong { color: var(--ink); }
.hub-card__name-link { color: inherit; text-decoration: underline; text-decoration-color: var(--line-strong); text-underline-offset: 3px; }
.hub-card__name-link:hover { color: var(--mode); text-decoration-color: var(--mode); }
/* (2026-09-28, kullanıcı isteği) hub kartı artık bir link taşıyor: koordinatı
   olan terminaller için Google Haritalar'da yol tarifi (yeni sekmede).
   (2026-10-03, 48. tur 8. devam, kullanıcı isteği verbatim: "Ayrıca from
   ve to hub larına /duraklar/ kategorisinde link ekleyelim.") İKİNCİ bir
   link ("Tüm duraklar") eklenince dar genişliklerde (ör. mobil sheet
   ~360px) ikon+metin+İKİ pil-buton tek satıra SIĞMIYORDU - `flex-wrap:
   nowrap` + `align-items:center` yüzünden metin 3 satıra kayarken
   butonlar bu 3 satırlık yüksekliğin TAM ORTASINA ("align-items:center")
   hizalanıp metnin 2. satırının ÜSTÜNE BİNİYORDU (gerçek, Playwright'ta
   görülen bir çakışma hatası). Çözüm: İKİ linki TEK bir flex item'da
   (.hub-card__actions) grupla - artık .hub-card'ın `flex-wrap:wrap`'ı
   sayesinde sığmadığında bu TEK blok bir alt satıra düşüyor (metnin
   üstüne binmeden), sığdığında ise eskisi gibi sağda yan yana duruyor. */
.hub-card__actions { display: flex; flex-wrap: wrap; gap: 8px; margin-left: auto; }
.hub-card__link {
  display: inline-flex; align-items: center; gap: 3px;
  padding: 7px 12px; border-radius: 999px; background: var(--surface); border: 1px solid var(--line-strong);
  color: var(--mode); font-size: 12.5px; font-weight: 600; text-decoration: none; white-space: nowrap;
}
.hub-card__link:hover { background: var(--mode-soft); border-color: var(--mode); }
.hub-card__link .icon { color: var(--mode); }

.access-block { margin: 0 0 18px; }
.access-block h3 { font-size: 15px; margin: 0 0 4px; color: var(--ink); }
/* (2026-09-30, kullanıcı isteği: "<h3> altına ... gidişi anlatan metin
   ekleyelim. h3 başlığı boş kalmamış olur.") H3'ün hemen altına, hub
   kartının eski "{label} · {hub_type}"/km alt satırının yerini alan doğal
   bir açıklama cümlesi (bkz. index.php - RenderHelpers::renderHubCard()
   artık bunu basmıyor). */
.access-block__desc { font-size: 13px; color: var(--ink-2); margin: 0 0 10px; }

/* =====================================================================
   Slayt geçişleri (POI listesi) — YUMUŞAK crossfade + kayma
   Eskiden: sert `hidden` toggle (anında kesme) + SADECE giren panelde
   keyframe animasyonu. Bu, "ekran gidip geliyor" hissi veriyordu, çünkü
   1) çıkan panel HİÇ animasyonsuz aniden kayboluyor, panel yüksekliği
      bir anda değişiyordu (reflow sıçraması),
   2) app.js'teki scrollIntoView({behavior:'smooth'}) bu ani sıçramanın
      ÜSTÜNE ikinci, çakışan bir kaydırma animasyonu daha ekliyordu.
   Şimdi: hem çıkan hem giren panelde transition (opacity + transform),
   panel değişimi app.js'te iki adımda yapılıyor (önce çıkanı soldur,
   sonra DOM'dan çıkar + gireni kaydır) - bkz. swapPane() içindeki not.
   ===================================================================== */
/* (12. tur, kullanıcı isteği: "Slayt geçişleri çok agresif geçiş sonrasında
   direkt kart alanına atıyor daha ux odaklı geçiş sağlayalım") Eskiden: TEK
   bir ease eğrisi + AYNI süre (240ms) hem çıkışta hem girişte, küçük (14px)
   bir kayma - bu, JS'in exit->DOM swap->enter sırasını (bkz. swapPane())
   sert/mekanik hissettiriyordu ("bitince direkt karta atıyor"). Şimdi:
   ÇIKIŞ hızlı+ease-in (180ms, "hızlıca aradan çekil"), GİRİŞ daha yavaş+
   belirgin ease-out (300ms, cubic-bezier "expo-out" - bir yere YERLEŞİYOR
   hissi) - ikisi de hafif ölçek (scale) ile birlikte, klasik "materyal"
   panel geçişi. js/app.js PANE_TRANSITION_MS artık ÇIKIŞ süresiyle (180ms)
   BİREBİR eşleşiyor - DOM takası tam çıkış animasyonu bittiğinde olur,
   sonra giriş animasyonu kendi (daha yavaş/yumuşak) eğrisiyle oynar. Giren
   panel HER ZAMAN üstten (scrollIntoView) başlar - bkz. swapPane() notu. */
.mode-panels, .poi-slide, .sched-slide, .mode-panel, .accordion-slide {
  transition: opacity .3s cubic-bezier(.16,1,.3,1), transform .3s cubic-bezier(.16,1,.3,1);
  opacity: 1; transform: none;
  will-change: opacity, transform;
}
.mode-panels.is-leaving, .poi-slide.is-leaving, .sched-slide.is-leaving, .mode-panel.is-leaving, .accordion-slide.is-leaving {
  transition-duration: .18s;
  transition-timing-function: cubic-bezier(.4,0,1,1);
  opacity: 0; transform: translateX(-16px) scale(.99);
}
.mode-panels.is-entering, .poi-slide.is-entering, .sched-slide.is-entering, .mode-panel.is-entering, .accordion-slide.is-entering {
  opacity: 0; transform: translateX(16px) scale(.99);
}
.mode-panels.is-entering-back, .poi-slide.is-entering-back, .sched-slide.is-entering-back, .mode-panel.is-entering-back, .accordion-slide.is-entering-back {
  opacity: 0; transform: translateX(-16px) scale(.99);
}
/* Geriye dönük uyum: eski slide-in-right/left sınıf adları hâlâ
   kullanılıyorsa da (ör. başka bir yerden çağrılırsa) sorunsuz çalışsın. */
.slide-in-right, .slide-in-left { opacity: 1; transform: none; }
/* (12. tur) Eskiden bu kural SADECE .mode-panels/.poi-slide'ı kapsıyordu -
   .sched-slide/.mode-panel unutulmuştu, yani sefer detayı slaytında
   prefers-reduced-motion HİÇ etkisi olmuyordu. Artık dördü de aynı anda
   devre dışı bırakılıyor - js/app.js da ayrıca aynı tercihi kontrol edip
   animasyon BEKLEMESİNİ (setTimeout süresini) atlıyor, bu kural onunla
   ÇAKIŞMAZ/çift devre dışı bırakmaz (bkz. swapPane() içindeki not). */
@media (prefers-reduced-motion: reduce) {
  .mode-panels, .poi-slide, .sched-slide, .mode-panel, .accordion-slide { transition: none !important; }
}

/* POI slaytı KAPANDIĞINDA sheet aniden küçülüp "sıçramasın" diye - rota
   listesiyle kıyaslanabilir bir minimum yükseklik tutuyoruz (madde 4:
   "tam alanı kapsasın"). Böylece panel, önceki (rota) panelden çok daha
   kısa kalıp altında boşluk bırakmıyor / sheet birden çökmüyor. */
.poi-slide:not([hidden]) { min-height: min(60vh, 420px); display: flex; flex-direction: column; }
.poi-slide .poi-list { flex: 1; }

.slider__back {
  display: inline-flex; align-items: center; gap: 6px; border: 0; background: var(--surface); color: #444;
  font: inherit; font-weight: 500; font-size: 1rem; padding:7px 0; border-radius: 9px; cursor: pointer; margin: 8px 0 20px;
}

/* (2026-09-30 devamı, kullanıcı isteği: "Araba akordeonları olmamış slayt
   şeklinde komple otobüs gibi açılıp seçeneklere dön olarak geri dönecek")
   Akordeon (yakıt/ücretli geçiş) tam ekran slaytı - poi-slide/sched-slide
   ile AYNI görsel dil; içeriğin kendisi (.route-card__expand-body içindeki
   .panel-card) JS tarafından buraya TAŞINDIĞI için burada ekstra bir iç
   düzen kuralına gerek yok, .panel-card zaten esnek (flex) bir yapı. */
.accordion-slide { padding-bottom: 16px; }

/* POI liste slaytı */
.poi-slide { padding-bottom: 16px; }
.poi-slide__title { font-size: 1.15rem; margin: 6px 0 10px; color: var(--ink); }
/* (2026-10-01, 41. tur 5. devam, kullanıcı isteği verbatim: "Yakıt & Şarj
   altına da kalkış noktasından uzaklıkları belirtilmiştir diye yazı
   ekleyelim") Liste sıralaması artık kalkış noktasına göre (bkz.
   js/app.js renderPoiMarkers() doc yorumu) - bu küçük, sessiz bir not
   bunu açıklıyor; sadece uzaklığı GERÇEKTEN hesaplanabilen bir liste
   açıkken görünür (js tarafında toggle ediliyor). */
.poi-slide__note { font-size: 0.78rem; color: var(--ink-2); margin: -4px 0 10px; }
/* (2026-10-02, 41. tur 13. devam, kullanıcı isteği verbatim: "yerler
   listesine üst tarafa select ile 25,50,100,200 ... koyup ona göre
   listelesin") Liste kısaysa JS bu satırı hiç göstermez (bkz.
   js/app.js openPoiSlide()) - UYDURULMUŞ/gereksiz bir kontrol yok. */
.poi-slide__limit-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin: 2px 0 10px; font-size: 0.82rem; color: var(--ink-2); }
.poi-slide__limit-row select {
  border: 1px solid var(--line-strong); border-radius: 8px; padding: 6px 10px; font: inherit; font-weight: 600;
  color: var(--ink); background: var(--surface);
}
.poi-list { list-style: none; margin: 12px 0 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.poi-item {
  width: 100%; display: flex; align-items: center; gap: 12px; text-align: left; padding: 12px 14px;
  border: 1px solid var(--line-strong); border-radius: var(--radius-md); background: var(--surface); cursor: pointer; font: inherit;
}
.poi-item:hover, .poi-item:focus-visible { border-color: var(--car); background: var(--car-soft); outline: none; }
.poi-item__icon { width: 36px; height: 36px; flex-shrink: 0; border-radius: 50%; background: var(--surface-2); display: grid; place-items: center; color: var(--ink-2); }
/* (2026-10-01, 41. tur, madde 2: "listede ise svg icon yerine image
   kullanlamı") `.poi-item__icon` (yuvarlak, inline <svg>) yerine liste
   artık bir `<img>` kullanıyor (bkz. js/app.js poiImageDataUri()) -
   görsel dili korumak için benzer boyut ama köşeleri yuvarlatılmış bir
   kare ("küçük bir fotoğraf kartı" hissi, tam bir daire DEĞİL). */
.poi-item__image { width: 44px; height: 44px; flex-shrink: 0; border-radius: var(--radius-sm, 8px); object-fit: cover; background: var(--surface-2); }
.poi-item__text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1; }
.poi-item__text strong { font-size: 0.92rem; color: var(--ink); }
.poi-item__text small { font-size: 0.76rem; color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* (41. tur 5. devam, kullanıcı isteği verbatim: "km yazsak süper olur")
   Kalkış noktasına uzaklık - varsa (gerçek bir kalkış koordinatı
   hesaplanabildiyse, bkz. js/app.js) her satırın sağında küçük bir
   rozet; hesaplanamadıysa (nadiren - kalkış koordinatı yoksa) hiç
   basılmıyor, UYDURULMUŞ bir değer gösterilmiyor. */
.poi-item__distance { flex-shrink: 0; font-size: 0.74rem; font-weight: 600; color: var(--ink-2); background: var(--surface-2); border-radius: 999px; padding: 3px 9px; white-space: nowrap; }
.poi-item__go { color: var(--ink-3); }
.poi-empty { color: var(--ink-2); font-size: 0.88rem; padding: 12px 0; }

/* (41. tur 5. devam, kullanıcı isteği verbatim: "haritadaki renklerde
   farklı olsun") Harita üzerindeki küçük POI iğnesi (.poi-pin) eskiden
   TEK bir sabit renkteydi (amber kenarlık, lacivert ikon - tüm türler
   için aynı) - artık her tür kendi rengini taşıyor. Renk paleti js/app.js
   içindeki POI_IMAGE_COLORS (liste/popup görselleriyle AYNI palet) ile
   BİREBİR eşleşiyor - tek bir yerde tanımlı renk sistemi, tutarlı. */
.poi-pin--fuel { border-color: #F5A623; color: #B36E00; }
.poi-pin--ev_charging { border-color: #2FB673; color: #1A7A4C; }
.poi-pin--rest_area { border-color: #4C8BF5; color: #2B5FC7; }
.poi-pin--attraction { border-color: #D9607E; color: #A83A56; }
.poi-pin--speed_camera { border-color: #8F6AE0; color: #6442B0; }

/* (2026-10-01, 41. tur, madde 2 + 4) Harita işaretçisi popup'ı - artık
   sadece "ad + açıklama" değil, brand/city/district/phone/address alanları
   da (varsa) gösteriliyor; madde 4 gereği resim SADECE 'attraction'
   popup'ında (.poi-popup--with-image), benzin/EV/dinlenme/radar'da YOK -
   bkz. js/app.js poiPopupHtml(). Leaflet'in kendi .leaflet-popup-content
   kapsayıcısının varsayılan max-width'i bu kartlar için dar kalabildiğinden
   buradaki genişlik bilinçli olarak biraz artırıldı. */
.poi-popup { display: flex; flex-direction: column; gap: 6px; min-width: 180px; max-width: 100%; font-size: 0.82rem; }
.poi-popup--with-image { gap: 8px; }
.poi-popup__image { width: 100%; height: 88px; border-radius: var(--radius-sm, 8px); object-fit: cover; background: var(--surface-2); }
.poi-popup__title { font-size: 0.92rem; color: var(--ink); }
.poi-popup__brand { font-size: 0.78rem; color: var(--ink-2); }
.poi-popup__row { display: flex; align-items: flex-start; gap: 6px; color: var(--ink-2); line-height: 1.3; }
.poi-popup__row .icon { flex-shrink: 0; margin-top: 1px; color: var(--ink-3); }
.poi-popup__row a { color: var(--car); text-decoration: none; }
.poi-popup__row a:hover { text-decoration: underline; }
.poi-popup__row--address { padding-left: 19px; } /* ikon genişliği (13px) + gap (6px) ile hizalı, adres satırının kendi ikonu yok */
.poi-popup__row--desc { padding-left: 0; font-style: italic; }

/* (2026-10-02, 41. tur 12. devam, kullanıcı isteği verbatim, bir ekran
   görüntüsüyle birlikte: "gezilecek yerler haritadaki kart tasarımını
   görseldeki gibi istiyorum") "Gezilecek yer" (attraction) popup'ı artık
   AYRI bir kart tasarımı - bkz. js/app.js attractionPopupHtml(). Leaflet'in
   kendi .leaflet-popup-content-wrapper'ının varsayılan dolgusu (padding)
   fotoğrafın tam genişlikte/kenardan kenara basılmasına izin vermediği
   için, SADECE bu popup tipine (className: 'poi-popup-leaflet--attraction'
   - bkz. renderPoiMarkers()) özel olarak sıfırlanıyor; diğer POI
   popup'ları (.poi-popup, yukarıda) buna dokunulmadan AYNEN kalıyor. */
.leaflet-popup.poi-popup-leaflet--attraction .leaflet-popup-content-wrapper {
  padding: 0; border-radius: 16px; overflow: hidden; box-shadow: 0 10px 28px rgba(15, 31, 43, 0.22);
}
.leaflet-popup.poi-popup-leaflet--attraction .leaflet-popup-content { margin: 0; }
.leaflet-popup.poi-popup-leaflet--attraction .leaflet-popup-tip-container { display: none; }

/* (41. tur 13. devam, kullanıcı isteği: "yol tarifi ve paylaş kalsın")
   Kart genişliği eskiden 4 aksiyona göre (290px) ayarlanmıştı - artık
   sadece 2 aksiyon olduğu için biraz daraltıldı. */
.poi-popup--attraction { display: flex; flex-direction: column; width: 100%; font-size: 0.82rem; gap: 0; }
.poi-popup__hero { position: relative; width: 100%; height: 140px; background: var(--surface-2); }
.poi-popup__hero-img { width: 100%; height: 100%; object-fit: cover; display: block; }
.poi-popup__hero-badge {
  position: absolute; top: 10px; left: 10px; display: inline-flex; align-items: center; gap: 4px;
  background: #D9607E; color: #fff; font-size: 0.72rem; font-weight: 600; padding: 4px 10px 4px 8px;
  border-radius: 999px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.22);
}
.poi-popup__hero-badge .icon { width: 11px; height: 11px; }
.poi-popup__hero-close {
  position: absolute; top: 8px; right: 8px; width: 26px; height: 26px; border-radius: 50%; border: 0;
  background: rgba(255, 255, 255, 0.92); color: var(--ink); display: grid; place-items: center; cursor: pointer;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.25); padding: 0;
}
.poi-popup__hero-close:hover { background: #fff; }
.poi-popup__hero-close .icon { width: 13px; height: 13px; }

.poi-popup--attraction .poi-popup__body { padding: 12px 14px 14px; display: flex; flex-direction: column; gap: 8px; }
.poi-popup--attraction .poi-popup__title {
  display: flex; align-items: center; gap: 6px; font: 700 1rem/1.25 var(--font-display, inherit); color: var(--ink);
}
.poi-popup--attraction .poi-popup__title .icon { flex-shrink: 0; width: 14px; height: 14px; color: #D9607E; }
.poi-popup__tags { display: flex; flex-wrap: wrap; gap: 6px; }
.poi-popup__tag {
  display: inline-flex; align-items: center; gap: 4px; background: #FDEAF0; color: #A83A56; font-size: 0.74rem;
  font-weight: 600; padding: 3px 9px; border-radius: 999px;
}
.poi-popup__tag .icon { width: 11px; height: 11px; }
.poi-popup--attraction .poi-popup__row { font-size: 0.8rem; }
.poi-popup__divider { height: 1px; background: var(--line); margin: 2px 0; }
/* (41. tur 13. devam, kullanıcı isteği: "yol tarifi ve paylaş kalsın")
   Eskiden 4 eşit dar sütundu (Yol Tarifi/Kaydet/Paylaş/Detaylar) - artık
   sadece 2 aksiyon olduğu için her biri YATAY bir satır (ikon solda,
   etiket sağında), daha ferah/okunaklı - dar dikey sütunlara gerek
   kalmadı. */
.poi-popup__actions--compact { display: flex; align-items: center; gap: 8px; }
.poi-popup__action {
  display: flex; flex-direction: row; align-items: center; justify-content: center; gap: 6px; flex: 1 1 0; min-width: 0;
  border: 1px solid #ccc; background: var(--surface-2); color: var(--ink-2); font: inherit; font-size: 0.78rem; font-weight: 600;
  cursor: pointer; padding: 8px 10px; text-decoration: none; text-align: center; border-radius: 10px; white-space: nowrap;
}
.poi-popup__action:hover, .poi-popup__action:focus-visible { background: var(--surface); box-shadow: inset 0 0 0 1px var(--line-strong); color: var(--ink); outline: none; }
.poi-popup__action .icon { width: 16px; height: 16px; flex-shrink: 0; }
.poi-popup__action span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.poi-popup__action--primary { background: var(--car); color: #fff!important; }
.poi-popup__action--primary:hover, .poi-popup__action--primary:focus-visible { background: var(--car); box-shadow: none; color: #fff; filter: brightness(0.92); }

/* ---------------------------------------------------------------- */
/* Mobil: alt çekmece (bottom sheet)                                  */
/* ---------------------------------------------------------------- */
@media (max-width: 860px) {
  /* (2026-10-03, 48. tur 8. devam) Eski ".site-header > .site-nav {
     display:none }" kuralı buradan KALDIRILDI - artık gereksiz: header
     yeniden tasarımıyla `.site-nav` zaten TÜM genişliklerde (bkz.
     yukarıdaki .site-header__panel bölümü) varsayılan olarak panel
     içinde/gizli, ayrıca mobile-özel bir gizleme kuralına gerek yok. */
  .app { flex-direction: column; height: calc(100dvh - 56px); position: relative; }
  .map-area { position: absolute; inset: 0; }
  .sheet {
    position: absolute; left: 0; right: 0; bottom: 0; width: auto;
    border-right: 0; border-top-left-radius: var(--radius-lg); border-top-right-radius: var(--radius-lg);
    box-shadow: 0 -4px 20px rgba(0,0,0,0.15);
    max-height: 88dvh; height: 70dvh; transition: height 0.2s ease;
    z-index: 600;
  }
  .sheet.is-dragging { transition: none; }
  .leaflet-top, .leaflet-bottom { z-index: 550; }
  .sheet[data-state="half"] { height: 53dvh; }
  .sheet[data-state="full"] { height: 88dvh; }
  .sheet[data-state="collapsed"] { height: 120px; }
  .sheet__grip { display: flex; justify-content: center; padding: 10px; border: 0; background: none; width: 100%; cursor: grab; touch-action: none; }
  .sheet__grip-bar { width: 40px; height: 4px; border-radius: 999px; background: var(--line-strong); display: block; }

  /* Mod sekmeleri (Araç/Otobüs/Tren/Uçak) aşağı kaydırırken üstte sabit
     (sticky) kalır - rota listesi altından kayarken sekmeye her an dokunulabilir.
     Sekme sayısı 1 (sadece Araç) ya da 4 olsa da YÜKSEKLİK HER ZAMAN AYNI
     sabit değerde kalır (bkz. .mode-tabs min-height) - tek sekmeyken bile
     ekranı kaplayacak şekilde büyümez, normal ince bir çubuk olarak kalır.
     Üst padding artık .trip-head'de olduğu için (bkz. yukarısı) sticky
     olunca boşluksuz, tam tepeye yaslanarak yapışıyor. (2026-10-01, 40. tur
     3. devam, madde 2) `.mode-bar`'ın sticky kuralı buradan kaldırıldı -
     artık yukarıdaki (mobil olmayan) genel ".mode-tabs" bölümünde,
     TÜM genişlikler için TEK bir kural olarak tanımlı - bkz. oradaki not
     (kök neden: masaüstünde sticky OLMAMASI, geri dönüş kaydırma
     matematiğini bozuyordu). */
  .route-card__top { display: flex; grid-template-columns: 1fr auto; }
  .route-card__badges { grid-column: 1 / -1; flex-direction: row; }

  /* (2026-09-28 mobil turu) Masaüstü turunun mobilde eksik bıraktığı
     detaylar: özel harita işaretçileri (A/B pini) dar ekranda biraz daha
     küçük - aksi halde etiketli pin haritanın önemli bir kısmını kaplıyor. */
  .map-marker__icon { width: 28px; height: 28px; }
  .map-marker__icon .icon { width: 15px; height: 15px; }
  .map-marker__label { font-size: 11.5px; padding: 3px 8px; max-width: 46vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* Rome2Rio "Kalkışlar" listesi sheet genişliğinde taşmasın - tarih/yolcu
     alanları ve filtre chip'leri tek sütuna/alta sarsın, satır aralığı
     mobilde biraz daralsın (dokunma hedefleri yine ≥44px yükseklikte). */
  .sched-list__head { flex-direction: column; align-items: stretch; }
  .sched-list__row1, .sched-list__row2 { width: 100%; flex-wrap: nowrap; }
  .sched-field .tarih {width: 135px}
  .sched-field .yolcu {width: 90px}
  /* Mobilde dar alanda "Kalkış" etiketi/değeri diğer ikinden daha az yer
     kaplasın (sayı genelde tek/iki haneli) - Tarih/Yolcu'ya göre daha az
     büyüsün, satır taşmasın. */
  .sched-field--static { flex: 0 0 auto; min-width: 52px; }
  .sched-row { padding: 12px; }

  /* (2026-09-30, 36. tur devamı) Yolculuk maliyeti karşılaştırma kartları:
     kullanıcı "Mobil de başlıklar (ulaşım, vs) olmalı" dedi - önceki
     turda burada `display:none` ile TAMAMEN gizlenmişti, bu artık
     KALDIRILDI. Ana `.compare-card` tanımı (yukarıda) zaten tek satıra
     sığacak şekilde küçültüldüğü için burada sadece en dar mobil
     genişliklerde (~350px) ekstra sıkıştırma yapılıyor; satır sarması
     hâlâ olmuyor (nowrap korunuyor), sadece boşluklar/genişlikler biraz
     daha daralıyor ve başlık satırı kart genişliğine göre hizalanıyor. */
  .compare-list__head { gap: 3px; padding: 0 10px 6px; font-size: 0.62rem; }
  .compare-list__head span:first-child { margin-left: 38px; }
  .compare-list__head span:nth-child(2) { flex-basis: 90px; }
  .compare-list__head span:nth-child(3) { flex-basis: 90px; }
  .compare-card { padding: 9px 10px; gap: 6px; }
  .compare-card__icon { width: 32px; height: 32px; }
  .compare-card__icon .icon { width: 14px; height: 14px; }
  .compare-card__cost { flex-basis: 78px; font-size: 0.78rem; }
  .compare-card__duration { flex-basis: 68px; }
  .compare-card__duration-value { font-size: 0.74rem; }
  .compare-card__name { font-size: 0.8rem; }
  .compare-card__tagline { font-size: 0.64rem; }
  /* (2026-09-30, 37. tur, kullanıcı bildirimi verbatim: "mobilde 2 tane
     ise (en uygun vs) alt alta yazsın") KÖK NEDEN: bir kartta 2 rozet
     (ör. "⚡ En hızlı" + "🍃 En ucuz") olduğunda `.compare-card__badges`
     (yukarıdaki ana tanım) `flex-wrap: nowrap` kullanıyordu - iki rozet
     yan yana .compare-card__body'nin (min-width:0, esnek) genişliğini
     aşıyor, bu da TÜM satırı (icon+body+maliyet+süre+ok - .compare-card
     kendisi de nowrap) sıkıştırıp ekran görüntüsündeki "776 ₺" ve süre
     metninin kenetlenmiş görünmesine yol açıyordu. Çözüm: SADECE mobilde
     (masaüstünde 2 rozet yan yana rahatlıkla sığıyor, değiştirilmedi),
     2+ rozet varsa dikey (alt alta) istifleniyor - kart genişliği kadar
     yer kaplıyor, komşu sütunları artık sıkıştırmıyor. */
  .compare-card__badges { flex-direction: column; align-items: flex-start; gap: 3px; }

  /* Terminal/istasyon/havalimanı kartı: mobilde linkler tam genişlikte.
     (2026-09-30) ".hub-card__dist" kuralı kaldırıldı - o span artık hiç
     basılmıyor (bkz. RenderHelpers::renderHubCard()'ın 2026-09-30 notu).
     (2026-10-03, 48. tur 8. devam) Linkler artık TEK bir sarmalayıcıda
     (.hub-card__actions, bkz. yukarıdaki AYNI tarihli ana not) - eski
     ".hub-card__link { margin-left:0 }" kuralı ARTIK O sarmalayıcıya
     taşındı; her link KENDİ İÇİNDE ortalanır, sarmalayıcı mobilde tam
     genişlik kaplayıp bir alt satıra düşer. */
  .hub-card__actions { margin-left: 0; width: 100%; }
  .hub-card__link { flex: 1 1 auto; justify-content: center; }
  
/* (108. tur) Mobil: araç dışı sekmelerde (otobüs/tren/uçak) harita zaten
   alt çekmecenin arkasında; sonuç listesinin altından sızan +/- ve
   "Leaflet | © OpenStreetMap" şeridini gizle. Harita görünür olduğu
   (araç/taksi/yürüyüş) sekmelerde atıf aynen kalır. */
  #app[data-mode="bus"] .leaflet-control-container,
  #app[data-mode="train"] .leaflet-control-container,
  #app[data-mode="plane"] .leaflet-control-container,
  #app[data-mode="bus"] .map-tools--right,
  #app[data-mode="train"] .map-tools--right,
  #app[data-mode="plane"] .map-tools--right { display: none; }
}

/* =====================================================================
   Renkli rotalar: kartın sol şeridi ve nokta, haritadaki çizgiyle AYNI renk
   (renk PHP'de RenderHelpers::ROUTE_COLORS'ta tanımlı, --route-color olarak gelir)
   ===================================================================== */
.route-card[style*="--route-color"]:hover,
.route-card--selected[style*="--route-color"] { border-color: var(--route-color); }

/* =====================================================================
   Dizin sayfaları: /rotalar/, /sehirler/, /kesfet/
   (2026-10-03, 48. tur 7. devam, kullanıcı isteği verbatim: "Bu sayfaları
   da şimdi inşa edelim") - header'daki Rotalar/Şehirler/Keşfet linklerinin
   hedefi. `.app`'in harita/panel kromundan BAĞIMSIZ, sade/dikey akışlı
   sayfalar - sitenin geri kalanıyla AYNI renk/tipografi tokenleriyle.
   ===================================================================== */
.directory-page { max-width: 1100px; margin: 0 auto; padding: 36px 20px 64px; }
.directory-hero h1 { font: 700 28px var(--font-display); color: var(--navy); letter-spacing: -0.01em; margin-bottom: 10px; }
.directory-hero p { color: var(--ink-2); max-width: 62ch; font-size: 0.95rem; }
.directory-section { margin-top: 40px; }
.directory-section h2 { font: 700 20px var(--font-display); color: var(--navy); margin-bottom: 6px; }
.directory-section__intro { color: var(--ink-2); font-size: 0.86rem; margin: 0 0 16px; max-width: 70ch; }

/* (2026-10-03, 48. tur 8. devam, kullanıcı isteği verbatim: "sayfaları
   beğenmedim iptal et") KÖK SORUN (bu turda bulunan GERÇEK bir hata):
   rotalar.php (artık silindi) burada ".route-list" adını, index.php'de
   ZATEN ÇOK ÖNCEDEN (rota kartları listesi, #route-list, bkz. yukarıda
   satır ~374 ".route-list { display:grid; ... }") KULLANILAN GERÇEK bir
   sınıf adıyla ÇAKIŞACAK şekilde YENİDEN TANIMLAMIŞTI (display:flex) -
   CSS kademesi (cascade) gereği bu İKİNCİ/SONRAKİ tanım kazanıyordu, yani
   sayfanın ASIL rota sonucu kartları listesi SESSİZCE grid'den flex'e
   dönüşmüştü (görsel olarak fark edilmemiş olabilir ama gerçek bir
   regresyon). rotalar.php silinince bu çakışan ikinci tanım de KALDIRILDI
   - ayrıca .city-grid/.attraction-grid/.attraction-card/.badge--sample
   SADECE silinen sehirler.php/kesfet.php tarafından kullanılıyordu, artık
   ölü kod oldukları için kaldırıldı. .city-group/.city-group__letter ve
   .directory-* sınıfları KORUNDU - yeni duraklar.php bunları (ve mevcut,
   index.php'de de kullanılan .hub-card'ı) yeniden kullanıyor. */
.city-group { margin-bottom: 22px; }
.city-group__letter { display: block; font: 700 13px var(--font-display); color: var(--ink-3); margin-bottom: 8px; }
.city-group .hub-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); gap: 12px; align-items: start; }
.hub-card-wrap { position: relative; }
.hub-card-wrap__badge {
  display: inline-block; margin-top: 6px; font-size: 0.68rem; font-weight: 600;
  padding: 2px 9px; border-radius: 999px; background: var(--ink-3); color: #fff;
}

.directory-empty { padding: 20px; border: 1px dashed var(--line-strong); border-radius: var(--radius-md); color: var(--ink-2); font-size: 0.88rem; }

@media(max-width:480px){
.sheet[data-state="half"] { height: 70dvh; }
}
/* ===== (48. tur 59. devam) Tren sekmesi: "Tren Saatleri" (TCDD GTFS, tarihe göre) ===== */
.tt { margin: 4px 0 16px; }
.tt__title { margin: 0 0 10px; font-size: 17px; font-weight: 700; color: var(--ink); }
.tt__nav { display: flex; align-items: flex-end; gap: 8px; flex-wrap: wrap; margin-bottom: 12px; }
.tt__date { display: flex; flex-direction: column; gap: 2px; font-size: 12px; color: var(--ink-3); }
.tt__date input { font: inherit; font-size: 15px; color: var(--ink); padding: 7px 10px; border: 1px solid var(--line-strong); border-radius: var(--radius-sm); background: var(--surface); min-height: 38px; }
.tt__step { font: inherit; font-size: 14px; font-weight: 600; color: var(--ink-2); background: var(--surface); border: 1px solid var(--line-strong); border-radius: var(--radius-sm); padding: 8px 12px; min-height: 38px; cursor: pointer; }
.tt__step:hover:not(:disabled) { background: var(--surface-2); color: var(--ink); }
.tt__step:disabled { opacity: .4; cursor: default; }
.tt__body { transition: opacity .15s; }
.tt__body.is-loading { opacity: .45; pointer-events: none; }
.tt__meta { margin: 0 0 8px; font-size: 14px; color: var(--ink-2); }
.tt__empty { margin: 8px 0; padding: 14px; border: 1px dashed var(--line-strong); border-radius: var(--radius-md); color: var(--ink-2); background: var(--surface-2); }
.tt__note { margin: 10px 0 0; font-size: 12.5px; color: var(--ink-3); }
.tt__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.tt-row { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-md); overflow: hidden; transition: box-shadow .15s, border-color .15s; }
.tt-row.is-selected { border-color: var(--mode, var(--ink-3)); box-shadow: 0 0 0 1px var(--mode, var(--ink-3)); }
.tt-row__main { all: unset; box-sizing: border-box; display: grid; grid-template-columns: 5px 1fr auto; grid-template-areas: "bar name side" "bar sub side" "bar times side"; column-gap: 12px; row-gap: 2px; width: 100%; padding: 9px 14px 9px 0; cursor: pointer; }
.tt-row__main:hover { background: var(--surface-2); }
.tt-row__main:focus-visible { outline: 2px solid var(--navy); outline-offset: -2px; }
.tt-row__bar { grid-area: bar; background: var(--mode, var(--ink-3)); border-radius: 0 3px 3px 0; }
.tt-row__times { grid-area: times; font-size: 23px; line-height: 1.15; color: var(--ink); font-variant-numeric: tabular-nums; }
.tt-row__times strong { font-weight: 700; }
.tt-row__times i { font-style: normal; color: var(--ink-3); padding: 0 5px; }
.tt-row__times sup { font-size: 12px; font-weight: 700; color: #b3261e; margin-left: 2px; }
.tt-row__name { grid-area: name; font-size: 16px; font-weight: 700; color: var(--ink); }
.tt-row__gone { font-style: normal; font-size: 11px; font-weight: 700; letter-spacing: .02em; text-transform: uppercase; color: var(--ink-3); background: var(--surface-2); border: 1px solid var(--line); border-radius: 999px; padding: 1px 7px; margin-left: 6px; vertical-align: 2px; }
.tt-row__sub { grid-area: sub; font-size: 13.5px; color: var(--ink-2); }
.tt-badge { display: inline-block; font-size: 11.5px; font-weight: 700; padding: 1px 7px; border-radius: 4px; color: #fff; background: var(--mode, var(--ink-3)); margin-right: 4px; vertical-align: 1px; }
.tt-row__side { grid-area: side; text-align: right; align-self: stretch; display: flex; flex-direction: column; gap: 2px; white-space: nowrap; }
.tt-row__side b { font-size: 16px; font-weight: 700; color: var(--ink); }
/* (2026-10-18) Tasarım: solda sefer adı > rozet/numara > saatler; sağda süre, ara durak, fiyat, "Tren saatleri" */
.tt-row__price { display: block; font-size: 18px; font-weight: 700; line-height: 1.15; color: var(--pri, #0b6bcb); font-variant-numeric: tabular-nums; }
.tt-row__side small { font-size: 12.5px; color: var(--ink-3); margin-bottom: auto; }
/* kalkmış seferler pasif */
.tt-row.is-past { background: var(--surface-2); }
.tt-row.is-past .tt-row__bar { background: var(--line-strong); }
.tt-row.is-past .tt-row__times, .tt-row.is-past .tt-row__name, .tt-row.is-past .tt-row__sub, .tt-row.is-past .tt-row__side b { color: var(--ink-3); }
.tt-row.is-past .tt-badge { background: var(--line-strong); }
.tt-row.is-past .tt-row__times strong { font-weight: 600; }
/* durak çizelgesi */
.tt-stops { list-style: none; margin: 0; padding: 4px 16px 14px 18px; border-top: 1px solid var(--line); background: var(--surface); }
.tt-stops[hidden] { display: none; }
.tt-stop { display: grid; grid-template-columns: 18px 1fr 54px 54px; align-items: center; column-gap: 6px; min-height: 30px; font-size: 14px; color: var(--ink-2); position: relative; }
.tt-stop__a, .tt-stop__d { text-align: right; font-variant-numeric: tabular-nums; }
.tt-stop__a { color: var(--ink-3); }
.tt-stop__d { font-weight: 700; color: var(--ink); }
.tt-stop--head { min-height: 22px; font-size: 11.5px; text-transform: uppercase; letter-spacing: .03em; color: var(--ink-3); }
.tt-stop--head .tt-stop__a, .tt-stop--head .tt-stop__d, .tt-stop--head .tt-stop__n { color: var(--ink-3); font-weight: 600; }
.tt-stop__dot { position: relative; align-self: stretch; }
.tt-stop__dot::before { content: ""; position: absolute; left: 50%; top: 0; bottom: 0; width: 2px; margin-left: -1px; background: var(--mode, var(--line-strong)); opacity: .45; }
.tt-stop--head .tt-stop__dot::before, .tt-stop--head .tt-stop__dot::after { display: none; }
.tt-stop--head + .tt-stop .tt-stop__dot::before { top: 50%; }
.tt-stop:last-child .tt-stop__dot::before { bottom: 50%; }
.tt-stop__dot::after { content: ""; position: absolute; left: 50%; top: 50%; width: 9px; height: 9px; margin: -4.5px 0 0 -4.5px; border-radius: 50%; background: var(--surface); border: 2px solid var(--mode, var(--ink-3)); }
.tt-stop.is-key { color: var(--ink); font-weight: 700; }
.tt-stop.is-key .tt-stop__dot::after { background: var(--mode, var(--ink-3)); }
.tt-stop__day { font-weight: 400; font-size: 11.5px; color: var(--ink-3); }
@media (max-width: 480px) {
  .tt-row__times { font-size: 24px; }
  .tt-row__price { font-size: 17px; }
  .tt__step { padding: 8px 10px; }
}

/* ===== (48. tur 61. devam) Tren saatleri: satırdaki "Tren saatleri ›" bağlantısı + yan geçişle açılan durak/saat çizelgesi ===== */
.tt-row__more { display: block; margin-top: 3px; font-size: 13px; font-weight: 700; color: var(--car, #0B57A4); }
.tt-row__main:hover .tt-row__more { text-decoration: underline; }
.tt-detail { padding: 4px 0 8px; }
.tt-detail__head { display: grid; grid-template-columns: 1fr auto; grid-template-areas: "name side" "sub side" "times side"; column-gap: 12px; row-gap: 6px; padding: 12px 14px; border: 1px solid var(--line); border-left: 5px solid var(--mode, var(--ink-3)); border-radius: var(--radius-md); background: var(--surface); margin-bottom: 12px; }
.tt-detail__name { grid-area: name; margin: 0; font-size: 16px; font-weight: 700; color: var(--ink); }
.tt-detail__sub { grid-area: sub; font-size: 13.5px; color: var(--ink-2); }
.tt-detail__sum { display: contents; }
.tt-detail__times { grid-area: times; font-size: 23px; line-height: 1.15; color: var(--ink); font-variant-numeric: tabular-nums; }
.tt-detail__times strong { font-weight: 700; }
.tt-detail__times i { font-style: normal; color: var(--ink-3); padding: 0 5px; }
.tt-detail__times sup { font-size: 12px; font-weight: 700; color: #b3261e; margin-left: 2px; }
.tt-detail__side { grid-area: side; text-align: right; align-self: stretch; display: flex; flex-direction: column; gap: 2px; white-space: nowrap; }
.tt-detail__side b { font-size: 16px; font-weight: 700; color: var(--ink); }
.tt-detail__side small { font-size: 12.5px; color: var(--ink-3); margin-bottom: auto; }
.tt-detail .tt-stops { border: 1px solid var(--line); border-radius: var(--radius-md); padding: 10px 14px 14px; }

.tt-detail__buy { display: block; width: 100%; border: 0; cursor: pointer; font: inherit; text-align: center; padding: 12px 14px; margin: 0 0 6px; border-radius: var(--radius-md); background: var(--mode, var(--ink)); color: #fff; font-weight: 700; text-decoration: none; }
.tt-detail__buy:hover { filter: brightness(1.08); }
.tt-detail__buyhint { margin: 0 0 12px; font-size: 12.5px; color: var(--ink-3); text-align: center; }


/* Tren sefer detayı: fiyat notunun altındaki reklam (RenderHelpers::renderTrainTimes, slot 'train_detail') */
.tt-detail > .ad-slot { margin: 14px 0 18px; }

/* Otobüs listesi: takipli çıkış düğmesi (RenderHelpers::renderScheduleList, data-go) */
.sched-go { display: block; width: 100%; border: 0; cursor: pointer; font: inherit; text-align: center; padding: 12px 14px; margin: 0 0 6px; border-radius: var(--radius-md); background: var(--mode, var(--ink)); color: #fff; font-weight: 700; }
.sched-go:hover { filter: brightness(1.08); }
.sched-go__hint { margin: 0 0 16px; font-size: 12.5px; color: var(--ink-3); text-align: center; }

/* Araba dışı sekmelerde (otobüs/tren/uçak) yalnız "Gezilecek yerler" katman butonu (varış yeri). */
#app:not([data-mode="car"]) .chip--layer:not([data-poi-types="attraction"]) { display: none; }
.poi-pin--parking { border-color: #1F7A8C; color: #14606F; }

/* Uçak/otobüs: hub adı */
.ticket__hub,.sched-row__hub{display:block;font-size:.72rem;line-height:1.25;color:var(--ink-2,#5b6472);font-weight:500;margin-top:2px}

/* Yürüme kartı + CO2 satırı */
.walk-card__body{padding:4px 14px 14px;display:grid;gap:8px;font-size:.92rem}
.walk-card__kcal strong{font-size:1.05rem}
.walk-card__weight{display:flex;align-items:center;gap:8px;color:var(--ink-2,#5b6472)}
.walk-card__weight input{width:76px;padding:6px 8px;border:1px solid var(--line-strong);border-radius:8px;font:inherit;background:var(--surface);color:var(--ink)}
.walk-card__note{margin:0;font-size:.78rem;color:var(--ink-3,#7a8494)}
.walk-card__eco{margin:0}
.compare-card__eco{display:block;margin-top:3px;font-size:.78rem;color:#2E7D32;font-weight:600}
@media (prefers-color-scheme:dark){.compare-card__eco{color:#6fcf7a}}

/* Son güncelleme notu; kayıt olmayan harita katman düğmeleri gizli */
.update-note{display:flex;align-items:flex-start;gap:6px;margin:8px 0;padding:8px 12px;border-radius:10px;background:var(--surface-2,#f3f6fa);color:var(--ink-2,#5b6472);font-size:.84rem;line-height:1.35}
.update-note .icon{flex:none;margin-top:2px}
.chip--layer[hidden],.poi-toggle-row[hidden]{display:none!important}

/* Aktarmalı tren seçenekleri (satırlar .tt-row ile ortak) */
.tt-stop--leg { min-height: 30px; font-weight: 700; color: var(--ink); grid-template-columns: 18px 1fr; margin-top: 6px; }
.tt-stop--xfer { display: block; margin: 6px 0; padding: 6px 10px; border-radius: 8px; background: var(--surface-2); font-size: 13px; color: var(--ink-2); min-height: 0; }

/* Uzun sefer listeleri: ilk 6 öğe + "Tümünü göster", her 3 öğede reklam */
.is-collapsed { display: none !important; }
.list-ad { list-style: none; }
.list-ad .ad-slot { margin: 0; }
.list-more { list-style: none; display: flex; justify-content: center; margin-top: 4px; }
.list-more__btn { padding: 10px 22px; border: 1px solid var(--line-strong); border-radius: 999px; background: var(--surface); color: var(--ink); font: 600 14px/1 var(--font-body, inherit); cursor: pointer; }
.list-more__btn:hover { background: var(--surface-2); }

/* (94. tur) Paylaş / Yazdır */
.page-actions { display: flex; align-items: center; gap: 5px; margin: 8px 0 4px; flex-wrap: wrap; }
.page-actions__btn { display: inline-flex; align-items: center; gap: 6px; padding: 6px 12px; font: inherit; font-size: 0.82rem; font-weight: 600; color: var(--ink, #0f1f2b); background: transparent; border: 1px solid var(--line-strong, #cfd8dc); border-radius: 999px; cursor: pointer; }
.page-actions__msg { font-size: 0.8rem; color: #2E7D32; }

@media print {
  @page { size: A4; margin: 8mm; }
  /* Gizlenenler (mode-bar/sekmeler BİLEREK görünür bırakıldı) */
  #map, .map, .leaflet-container, .trip-form, .page-actions, #saved-routes, .faq, .share-menu, .report-dialog,
  .swap-btn, .related-routes, .sheet__grip, .ad-slot, .list-ad, .list-more, footer, .search-btn, .poi-toggle-row, .chip--layer,
  .site-nav, .site-header__actions, .header-actions, .slider__back, .tt-detail__buy, .compare__lead, .ticket__tomorrow-warn, 
  .site-header__search, .breadcrumb, .tt-detail__buyhint, .mode-access, .access-block { display: none !important; }
  .site-header { display: block !important; position: static !important; height: auto !important; padding: 0 !important; box-shadow: none !important; border-bottom: 1px solid #ccc; margin-bottom: 6px; }
  .site-header .brand { display: flex !important; }
  html, body { background: #fff !important; height: auto !important; min-height: 0 !important; overflow: visible !important; }
  /* 2. sayfaya geçmeme nedeni: .app { height: calc(100vh - 56px); overflow: hidden } */
  .app { display: block !important; height: auto !important; min-height: 0 !important; overflow: visible !important; }
  .map-area { display: none !important; }
  .sheet, .sheet__scroll { position: static !important; transform: none !important; height: auto !important; max-height: none !important; overflow: visible !important; width: auto !important; max-width: none !important; box-shadow: none !important; padding: 0 !important; }
  .mode-panel[hidden] { display: none !important; }
  .is-collapsed { display: revert !important; }
  .compare-card__icon .icon {fill: #222}
  .ticket__span i,.ticket__span i::before, .ticket__span i::after {background: #222}
  a { color: inherit; text-decoration: none; } 

  /* Kompakt aralıklar */
  body { font-size: 11.5px !important; line-height: 1.3 !important; }
  .sheet__scroll :is(div, section, article, p, ul, ol, li, h1, h2, h3, h4, table, header, nav) { margin-block: 2px !important; }
  .sheet__scroll :is(section, article, .route-card, .tt-row, .sched-row, .compare-card, .walk-card) { padding-block: 4px !important; }
  .sheet__scroll h1 { font-size: 17px !important; }
  .sheet__scroll h2 { font-size: 14px !important; }
  .sheet__scroll h3 { font-size: 12.5px !important; }
  .sheet__scroll .icon { width: 14px !important; height: 14px !important; }
  /* Kartlar iki sayfa arasında ortadan bölünmesin */
  .route-card, .tt-row, .sched-row, .compare-card, .walk-card, li, tr, figure { break-inside: avoid; page-break-inside: avoid; }
  h1, h2, h3 { break-after: avoid; }
}

/* Favoriler / Son gezdiklerim (anasayfa) */
.saved-list { margin: 0 0 14px; }
.saved-list h3 { font-size: 0.95rem; margin: 0 0 6px; }
.saved-list ul { list-style: none; margin: 0; padding: 0; display: flex; flex-wrap: wrap; gap: 8px; }
.saved-list li { display: inline-flex; align-items: center; border: 1px solid var(--line-strong, #cfd8dc); border-radius: 999px; background: #fff; }
.saved-list a { padding: 6px 12px; font-size: 0.85rem; color: #0f1f2b; text-decoration: none; }

.page-actions { position: relative; z-index: 500; }
.share-menu { position: absolute; top: 100%; left: 0; z-index: 500; display: flex; flex-direction: column; min-width: 190px; margin-top: 4px; padding: 6px; background: #fff; border: 1px solid var(--line-strong, #cfd8dc); border-radius: 12px; box-shadow: 0 8px 24px rgba(15,31,43,.18); }
.share-menu a, .share-menu button { display: block; padding: 8px 10px; font: inherit; font-size: 0.88rem; color: inherit; text-align: left; text-decoration: none; background: none; border: 0; border-radius: 8px; cursor: pointer; }
.share-menu a:hover, .share-menu button:hover { background: rgba(15,31,43,.07); }
.saved-routes { margin-top: 10px; text-align: left; }
.saved-routes .saved-list { margin: 0 0 8px; }
.saved-routes .saved-list p { font-size: 0.8rem; font-weight: 600; opacity: .8; margin-bottom: 5px}

/* Hata bildir penceresi */
.report-dialog { width: min(440px, calc(100vw - 32px)); padding: 0; border: 0; border-radius: 14px; box-shadow: 0 16px 48px rgba(15,31,43,.3); color: var(--ink, #0f1f2b); }
.report-dialog::backdrop { background: rgba(15,31,43,.45); }
.report-dialog__form { display: flex; flex-direction: column; gap: 10px; padding: 18px; }
.report-dialog #report-title { margin: 0; font-size: 1.1rem; }
.report-dialog__hint { margin: 0; font-size: 0.85rem; opacity: .8; }
.report-dialog label { display: flex; flex-direction: column; gap: 4px; font-size: 0.85rem; font-weight: 600; }
.report-dialog select, .report-dialog textarea { font: inherit; font-weight: 400; padding: 8px; border: 1px solid var(--line-strong, #cfd8dc); border-radius: 8px; }
.report-dialog__hp { position: absolute; left: -9999px; width: 1px; height: 1px; opacity: 0; }
.report-dialog__status { margin: 0; font-size: 0.85rem; color: #2E7D32; }
.report-dialog__status.is-error { color: #b00020; }
.report-dialog__actions { display: flex; justify-content: flex-end; gap: 8px; }
.report-dialog__send { background: #0b57a4; color: #fff; border-color: #0b57a4; }
.report-dialog__send:disabled { opacity: .6; cursor: default; }

/* (108. tur) Header arama paneli (arama ikonuna tıklanınca açılır) */
.site-header { position: fixed; top: 0; width: 100%} /* (2026-10-11) tüm genişliklerde yapışkan header; header-search (absolute) buna göre konumlanır */
.header-search { position: absolute; left: 0; right: 0; top: 100%; z-index: 1095; background: var(--surface); border-bottom: 1px solid var(--line-strong); box-shadow: 0 8px 20px rgba(15,31,43,.12); padding: 12px 20px; }
.header-search[hidden] { display: none; }
.header-search__form { display: flex; gap: 10px; align-items: flex-end; max-width: 760px; margin: 0 auto; }
.header-search__field { position: relative; flex: 1 1 0; min-width: 0; }
.header-search__field label { display: block; font-size: 11px; font-weight: 700; text-transform: uppercase; letter-spacing: .04em; color: var(--ink-3); margin-bottom: 4px; }
.header-search__field input { width: 100%; box-sizing: border-box; border: 1px solid var(--line-strong); border-radius: 10px; padding: 10px 12px; font: 400 15px/1.2 var(--font-body); color: var(--ink); background: var(--surface-2); }
.header-search__field input:focus { outline: 2px solid var(--car); outline-offset: 0; background: var(--surface); }
.header-search__submit { flex: none; height: 41px; }
@media (max-width: 640px) {
  .header-search { padding: 12px 16px; }
  .header-search__form { flex-direction: column; align-items: stretch; }
  .header-search__submit { width: 100%; }
}
@media print { .header-search { display: none !important; } }

/* (108. tur) Header arama butonu: açıkken lupa -> X */
.icon-btn .icon-btn__close { display: none; }
.icon-btn[aria-expanded="true"] svg:not(.icon-btn__close) { display: none; }
.icon-btn[aria-expanded="true"] .icon-btn__close { display: block; }
.icon-btn[aria-expanded="true"] { background: #eef6fc; color: #087bea; }

/* (108. tur) Header arama: input başı konum ikonu, buton arama ikonu */
.header-search__input { position: relative; }
.header-search__input > .icon { position: absolute; left: 11px; top: 50%; transform: translateY(-50%); width: 16px; height: 16px; color: var(--ink-3); pointer-events: none; }
.header-search__input > input { padding-left: 34px; }
.search-btn .icon { width: 16px; height: 16px; flex: none; }
/* Masaüstü: panel header ÇUBUĞUNUN İÇİNDE açılır (logo solda kalır, menü gizlenir, sağdaki butonlar yerinde) */
@media (min-width: 801px) {
  .header-search { top: 0; bottom: 0; left: 25%; right: 80px; width: auto; display: flex; align-items: center; padding: 0 12px; border: 0; box-shadow: none; background: var(--surface); }
  .header-search[hidden] { display: none; }
  .header-search__form { max-width: none; width: 100%; margin: 0; align-items: center; gap: 8px; }
  .header-search__field label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; margin: 0; }
  .header-search__field input { padding-top: 4px; padding-bottom: 5px; padding-left: 35px; height: 45px}
  .header-search__submit { height: 45px; }
}

/* (108. tur) Statik sayfalar (sayfa.php) */
.static-page { max-width: 820px; padding-top: 12px; padding-bottom: 48px; }
.static-page h1 { font-size: 1.6rem; margin: 6px 0 14px; color: var(--ink); }
.static-page h2 { font-size: 1.15rem; margin: 26px 0 8px; color: var(--ink); }
.static-page p, .static-page li { line-height: 1.65; color: var(--ink-2); font-size: 0.97rem; }
.static-page ul { padding-left: 20px; margin: 8px 0; }
.static-page li { margin-bottom: 6px; }
.static-page a { color: var(--car); }
.static-updated { font-size: 0.85rem; color: var(--ink-3); margin: 0 0 12px; }
.static-contact { margin: 14px 0 6px; }
.static-contact__mail { display: inline-block; padding: 12px 18px; border: 1px solid var(--line-strong); border-radius: 12px; font-weight: 700; font-size: 1.05rem; text-decoration: none; background: var(--surface-2); }
.static-faq details { border: 1px solid var(--line-strong); border-radius: 12px; padding: 0 16px; margin-bottom: 10px; background: var(--surface); }
.static-faq summary { cursor: pointer; padding: 14px 0; font-weight: 600; color: var(--ink); list-style-position: outside; }
.static-faq details[open] summary { border-bottom: 1px solid var(--line); margin-bottom: 10px; }
.static-faq details p { margin: 0 0 14px; }
.footer-bottom ul { display: flex; flex-wrap: wrap; gap: 6px 18px; list-style: none; margin: 0; padding: 0; }

/* ===== (2026-10-11) Rota sayfası, masaüstü: TEK sayfa kaydırması =====
   Sol panel içerik kadar uzar (iç kaydırma yok), harita header'ın altına yapışık (sticky) ve pencere boyunda kalır;
   aşağı inildikçe harita da ekranda aşağı gelir ve sayfa sonunda footer görünür. Mobil (alt çekmece) değişmedi. */
@media (min-width: 861px) {
  .app { height: auto; overflow: visible; align-items: flex-start; }
  .sheet { align-self: stretch; }
  .sheet__scroll { overflow: visible; }
  .map-area { position: sticky; top: 56px; height: calc(100vh - 56px); flex: 1; align-self: flex-start; }
  .mode-bar { top: 56px; }
  .app--map-fullscreen .map-area { position: fixed; inset: 0; height: auto; }
}

/* (2026-10-12) Son gezdiklerim / favoriler: her kayıt sağ üstte x ile silinir */
.saved-list li.saved-list__item { position: relative; }
.saved-list li.saved-list__item a { padding-right: 24px; }
.saved-list__rm { position: absolute; top: -7px; right: -7px; width: 20px; height: 21px; padding: 0; border: 1px solid var(--line-strong, #cfd8dc); border-radius: 50%; background: #fff; color: #5b6b7a; font: 700 12px/1 var(--font-body, sans-serif); cursor: pointer; display: flex; align-items: center; justify-content: center; }
.saved-list__rm:hover { background: #fdeaea; color: #b00020; border-color: #e5a3a3; }

/* (2026-10-12) Hata / İstek bildir penceresi: yeni yapı */
.report-dialog { width: min(480px, calc(100vw - 24px)); max-height: calc(100vh - 24px); overflow: hidden; }
.report-dialog__form { gap: 0; padding: 0; max-height: calc(100vh - 24px); }
.report-dialog__header { display: flex; align-items: flex-start; gap: 12px; padding: 16px 16px 12px; border-bottom: 1px solid var(--line, #e3e8ee); }
.report-dialog__icon { flex: none; width: 40px; height: 40px; display: flex; align-items: center; justify-content: center; border-radius: 10px; background: #fff4e5; color: #b26a00; }
.report-dialog__heading { flex: 1; min-width: 0; }
.report-dialog__heading h2 { margin: 0 0 2px; font-size: 1.1rem; }
.report-dialog__close { flex: none; width: 36px; height: 36px; border: 0; border-radius: 50%; background: transparent; font-size: 1.6rem; line-height: 1; color: #5b6b78; cursor: pointer; }
.report-dialog__close:hover { background: #eef2f6; color: #0f1f2b; }
.report-dialog__body { display: flex; flex-direction: column; gap: 12px; padding: 14px 16px; overflow-y: auto; }
.report-dialog input[type="text"], .report-dialog input[type="email"] { font: inherit; font-weight: 400; padding: 8px; border: 1px solid var(--line-strong, #cfd8dc); border-radius: 8px; width: 100%; box-sizing: border-box; }
.report-dialog select, .report-dialog textarea { width: 100%; box-sizing: border-box; }
.report-dialog textarea { resize: vertical; min-height: 96px; }
.report-dialog select:focus, .report-dialog textarea:focus, .report-dialog input:focus { outline: 2px solid #0b57a4; outline-offset: 1px; }
.report-dialog__optional, .report-dialog__required { display: inline-block; margin-left: 6px; font-size: .72rem; font-weight: 600; color: #6b7a86; }
.report-dialog__required { color: #b00020; }
.report-dialog__counter { align-self: flex-end; font-size: .75rem; font-weight: 400; color: #6b7a86; }
.report-dialog__contact { border: 1px solid var(--line, #e3e8ee); border-radius: 8px; padding: 8px 10px; }
.report-dialog__contact summary { cursor: pointer; font-size: .85rem; font-weight: 600; }
.report-dialog__contact label { margin-top: 8px; }
.report-dialog__field-hint, .report-dialog__privacy { margin: 6px 0 0; font-size: .75rem; color: #6b7a86; }
.report-dialog__privacy { margin: 0; }
.report-dialog__status[hidden] { display: none; }
.report-dialog__actions { padding: 12px 16px; border-top: 1px solid var(--line, #e3e8ee); background: #fafbfc; }
@media (max-width: 520px) { .report-dialog__actions { flex-direction: column-reverse; } .report-dialog__actions > * { width: 100%; justify-content: center; } }

/* (2026-10-12) Varış durağından şehre "nasıl giderim" link kartı + maliyet üstü hub blokları */
.hub-out { position: relative; display: flex; align-items: center; gap: 14px; margin: 16px 0 4px; padding: 14px 16px; border: 1px solid var(--line, #e3e8ee); border-radius: 14px; background: linear-gradient(135deg, #f6f9ff 0%, #fff 70%); color: inherit; text-decoration: none; box-shadow: 0 1px 2px rgba(15,35,70,.04); transition: border-color .15s, box-shadow .15s, transform .15s; }
.hub-out__link { color: inherit; text-decoration: none; }
.hub-out__link::after { content: ''; position: absolute; inset: 0; border-radius: 14px; }
.hub-out__link:focus { outline: none; }
.hub-out__icon { flex: none; width: 44px; height: 44px; display: flex; align-items: center; justify-content: center; border-radius: 12px; background: var(--car-soft, #e8f0ff); color: var(--car, #1A56DB); }
.hub-out__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.hub-out__title { margin: 0; font-size: 1rem; line-height: 1.3; font-weight: 700; color: var(--ink); }
.hub-out__sub { font-size: .8rem; color: var(--ink-3, #6b7a86); }
.hub-out__go { flex: none; display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; color: var(--car, #1A56DB); }
.mode-access { margin: 18px 0 8px; }
.mode-access[hidden] { display: none; }
.mode-access .access-block + .access-block { margin-top: 20px; }

/* (2026-10-12) Kalkış / varış noktaları (maliyet karşılaştırmasının üstü) */
.hub-points { margin: 4px 0 0; }
.hub-points__title { margin: 0 0 12px; font-size: 1.05rem; font-weight: 700; color: var(--ink); }
.hub-points__list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: row; gap: 5px; justify-content: space-between;}
.hub-points__list li { width: 50%;border: 1px solid #ccc;  border-radius: 8px;}
.hub-points__item { display: flex; align-items: center; gap: 5px; padding: 12px; border-radius: 14px; background: #FFF; color: var(--ink); text-decoration: none; transition: box-shadow .15s, transform .15s; }
.hub-points__icon { flex: none; display: flex; align-items: center; justify-content: center; color: #0B57A4}
.hub-points__name { font-size: .9rem; font-weight: 600; border-bottom: 1px solid rgba(15,31,43,.35); line-height: 1.2; }

/* (2026-10-14) Durak çifti kartları (rota sayfası otobüs/uçak sekmesi) + firma filtresi */
.pair-list { display: flex; flex-direction: column; gap: 8px; margin: 14px 0; }
.pair-card { position: relative; display: flex; align-items: center; gap: 14px; padding: 16px; border: 1px solid var(--line, #e3e8ee); border-radius: 14px; background: var(--surface, #fff); box-shadow: 0 1px 2px rgba(15,35,70,.04); transition: border-color .15s, box-shadow .15s, transform .15s; }
.pair-card:hover, .pair-card:focus-within { border-color: var(--car, #1A56DB); box-shadow: 0 8px 22px rgba(26,86,219,.12); }
.pair-card__icon { flex: none; width: 46px; height: 46px; display: flex; align-items: center; justify-content: center; border-radius: 12px; background: var(--car-soft, #e8f0ff); color: var(--car, #1A56DB); }
.pair-card__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.pair-card__title { margin: 0; font-size: 1.02rem; line-height: 1.3; font-weight: 700; color: var(--ink); }
.pair-card__meta { margin: 0; display: flex; flex-wrap: wrap; gap: 4px 14px; font-size: .82rem; color: var(--ink-2, #4a5a68); }
.pair-card__meta span { display: inline-flex; align-items: center; gap: 5px; }
.pair-card__ops { margin: 0; font-size: .78rem; color: var(--ink-3, #6b7a86); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pair-card__ops em { font-style: normal; font-weight: 600; }
.pair-card__badge { position: absolute; top: -9px; left: 16px; padding: 2px 10px; border-radius: 999px; background: var(--car, #1A56DB); color: #fff; font-size: .68rem; font-weight: 700; }
.pair-card__btn { flex: none; min-height: 40px; padding: 0 14px; border: 0; border-radius: 10px; background: transparent; color: var(--car, #1A56DB); font: inherit; font-size: 2.4rem; font-weight: 500; cursor: pointer; white-space: nowrap; }
.pair-card__btn::after { content: ''; position: absolute; inset: 0; border-radius: 14px; } /* tüm kart tıklanabilir */
.pair-card__btn:focus-visible { outline: 2px solid var(--car, #1A56DB); outline-offset: 2px; }
@media (max-width: 640px) {
  .pair-card { flex-wrap: wrap; }
  .pair-card__btn { width: 100%; background: var(--car-soft, #e8f0ff); }
}
.page-actions--bottom { margin: 24px 0 8px; z-index: 0}

/* (2026-10-14) Firma seçimi (Yolcu'nun solunda) */
.sched-field--op[hidden] { display: none; }
.sched-op-select { max-width: 13em; border: 1px solid var(--line-strong); border-radius: 8px; padding: 6px 8px; font: inherit; font-size: 0.86rem; color: var(--ink); background: var(--surface-2); text-transform: none; letter-spacing: normal; }

/* (2026-10-14) Otobüs/uçak panelindeki kartlar sekme rengini kullanır (bus kahve, plane mavi) */
.mode-panel[data-mode-panel="bus"]   { --mode: var(--bus);   --mode-soft: var(--bus-soft); }
.mode-panel[data-mode-panel="train"] { --mode: var(--train); --mode-soft: var(--train-soft); }
.mode-panel[data-mode-panel="plane"] { --mode: var(--plane); --mode-soft: var(--plane-soft); }
.mode-panel .pair-card:hover, .mode-panel .pair-card:focus-within { border-color: var(--mode); box-shadow: 0 8px 22px rgba(15,35,70,.12); }
.mode-panel .pair-card__icon { background: var(--mode); color: #fff; }
.mode-panel .pair-card__badge { background: var(--mode); }
.mode-panel .pair-card__btn { color: var(--mode); }
.mode-panel .pair-card__btn:focus-visible { outline-color: var(--mode); }
.mode-panel .hub-out { background: var(--mode-soft); }
.mode-panel .hub-out:hover { border-color: var(--mode); box-shadow: 0 8px 22px rgba(15,35,70,.12); }
.mode-panel .hub-out__icon { background: var(--mode); color: #fff; }
.mode-panel .hub-out__go { color: var(--mode); }
.page-actions--bottom .share-menu { top: auto; bottom: 100%; margin: 0 0 4px; }

/* (2026-10-15) Toplu Taşıma sekmesi (js/transit-plan.js): özet kartları .ticket, ayrıntı #sched-slide-transit, rota ana haritada */
.tp { --tp-line: #E1E9F3; --tp-ink: #0E2A47; --tp-mut: #5b6b7e; }
.tp__when { display: flex; flex-wrap: wrap; gap: 10px; align-items: end; margin: 0 0 12px; }

/* (2026-10-30) Kalkış zamanı: Google Haritalar tarzı. [Şimdi çık ▾] ........ Seçenekler / altında Tarih ve Saat (tarih önce) */
.tp-form { margin: 0 0 12px; }
.tp__top { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 8px 12px; margin: 0 0 10px; }
.tp-when { position: relative; display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 34px 0 12px; border-radius: 12px; background: #F1F3F4; color: var(--ink, #202124); font-weight: 600; cursor: pointer; }
.tp-when::after { content: ""; position: absolute; right: 13px; top: 50%; margin-top: -2px; border: 5px solid transparent; border-top-color: currentColor; pointer-events: none; }
.tp-when__ico { flex: none; }
.tp-when select { -webkit-appearance: none; appearance: none; border: 0; background: transparent; color: inherit; font: inherit; padding: 10px 0; min-height: 44px; cursor: pointer; outline: none; }
.tp-when:focus-within { box-shadow: 0 0 0 2px var(--mode, #00796B); }
.tp-filters { display: contents; }
.tp-filters[hidden] { display: none; }
.tp__top .tp-opts__toggle { margin-left: auto; min-height: 40px; padding: 0 4px; border: 0; border-radius: 8px; background: none; color: var(--mode, #00796B); font-weight: 600; font-size: .95rem; }
.tp__top .tp-opts__toggle .tp-opts__ico { display: none; }
.tp__top .tp-opts__toggle:hover, .tp__top .tp-opts__toggle.is-open { text-decoration: underline; }
.tp__fields { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 22px; margin: 0 0 4px; }
.tp__fields[hidden] { display: none; }
.tp-fld { display: inline-flex; align-items: center; gap: 6px; min-height: 42px; border-bottom: 1px solid #9AA0A6; color: var(--ink, #202124); }
.tp-fld:focus-within { border-bottom-color: var(--mode, #00796B); }
.tp-fld__pick { position: relative; display: inline-flex; align-items: center; gap: 8px; font-weight: 500; }
.tp-fld__pick svg { flex: none; }
.tp-fld__pick input[type="date"] { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
.tp-fld__pick input[type="time"] { border: 0; background: transparent; font: inherit; color: inherit; padding: 0; min-height: 0; width: 6.4em; outline: none; }
.tp-fld__pick input[type="time"]::-webkit-calendar-picker-indicator { display: none; }
.tp-fld__arrows { display: inline-flex; }
.tp-fld__arrows button { display: grid; place-items: center; width: 24px; height: 32px; border: 0; background: none; color: #5F6368; cursor: pointer; border-radius: 6px; }
.tp-fld__arrows button:hover { background: #F1F3F4; color: var(--ink, #202124); }
@media (max-width: 420px) { .tp__fields { gap: 4px 14px; } }

/* (2026-10-30) Ortak kalkış/varış zamanı seçici (js/trip-time.js) */
.trip-time { margin: 10px 0 12px; }
.tt-bar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px 12px; }
/* menü kırpılmasın / diğer öğelerin üstünde açılsın (eski ad .tt-row, demiryolu satır stiliyle çakışıyordu: overflow:hidden menüyü gizliyordu) */
.trip-time { position: relative; z-index: 30; overflow: visible; }
/* Varış saati: kartın etiket satırının sağında küçük rozet (ayrı satır yok) */
.tag-list .eta-chip { margin-left: auto; display: inline-flex; align-items: baseline; gap: 6px; padding: 3px 9px; border-radius: 6px; background: var(--surface-2, #F1F5F9); color: var(--ink-2, #5b6472); font-size: 13px; line-height: 1.3; white-space: nowrap; }
.eta-chip b { color: var(--ink, #202124); font-size: 15px; font-weight: 700; font-variant-numeric: tabular-nums; }
.eta-chip sup { font-size: 10px; font-weight: 700; color: #b3261e; margin-left: 1px; }
.eta-chip .eta-chip__d { font-size: 12px; }
.eta-chip.is-warn { background: #FFF4E5; color: #8A5300; }
/* (30o) kontrol sekmenin başlık+açıklamasının altında; toplu taşımada "Rota seçenekleri" düğmesiyle yan yana */
.mode-panel > .trip-time, .route-list-head + .trip-time { margin: 0 0 14px; }
.tp-form { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 10px; margin: 0 0 12px; justify-content: space-between;}
.tp-form .trip-time { margin: 0; }
.tp-form .tp-filters { display: contents; }
.tp-form .tp-filters[hidden] { display: none; }
.tp-form .tp-opts__toggle { min-height: 44px; border-radius: 12px; }
.tt-menu { position: relative; display: inline-block; }
.tt-pill { display: inline-flex; align-items: center; gap: 8px; min-height: 44px; padding: 0 14px; border: 0; border-radius: 12px; background: #F1F3F4; color: var(--ink, #202124); font: inherit; font-weight: 600; cursor: pointer; }
.tt-pill:hover { background: #E8EAED; }
.tt-pill:focus-visible, .tt-fld__btn:focus-visible { outline: 2px solid var(--mode, #00796B); outline-offset: 2px; }
.tt-pill[aria-expanded="true"] .tt-caret { transform: rotate(180deg); }
.tt-caret { transition: transform .15s; }
.tt-pop { position: absolute; z-index: 70; top: 100%; left: 0; min-width: 210px; max-height: 280px; overflow: auto; margin: 6px 0 0; padding: 6px 0; list-style: none; background: #fff; border: 1px solid #E3E8EF; border-radius: 12px; box-shadow: 0 8px 28px rgba(32, 33, 36, .22); }
.tt-pop[hidden] { display: none; }
.tt-pop li { margin: 0; }
.tt-pop button { display: block; width: 100%; padding: 10px 18px; border: 0; background: none; color: var(--ink, #202124); font: inherit; text-align: left; cursor: pointer; font-variant-numeric: tabular-nums; }
.tt-pop button:hover, .tt-pop button:focus-visible { background: #F1F3F4; outline: none; }
.tt-pop button[aria-selected="true"] { background: rgba(0, 121, 107, .10); color: var(--mode, #00796B); font-weight: 700; }
.tt-pop--times { min-width: 120px; }
.tt-fields { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 22px; margin: 8px 0 0; }
.tt-fields[hidden] { display: none; }
.tt-fld { position: relative; display: inline-flex; align-items: center; gap: 6px; min-height: 42px; border-bottom: 1px solid #9AA0A6; color: var(--ink, #202124); }
.tt-fld:focus-within { border-bottom-color: var(--mode, #00796B); }
.tt-fld__pick { position: relative; display: inline-flex; align-items: center; gap: 8px; font-weight: 500; }
.tt-fld__btn { padding: 0; border: 0; background: none; color: inherit; font: inherit; font-weight: 500; font-variant-numeric: tabular-nums; cursor: pointer; }
.tt-fld__pick svg { flex: none; }
.tt-fld__pick input[type="date"] { position: absolute; inset: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; }
.tt-fld__arrows { display: inline-flex; }
.tt-fld__arrows button { display: grid; place-items: center; width: 24px; height: 32px; border: 0; background: none; color: #5F6368; cursor: pointer; border-radius: 6px; }
.tt-fld__arrows button:hover { background: #F1F3F4; color: var(--ink, #202124); }
.route-card__eta { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; margin: 2px 0 8px; padding: 7px 10px; border-radius: 8px; background: var(--surface-2, #F3F6FA); color: var(--ink-2, #5b6472); font-size: .88rem; }
.route-card__eta b { color: var(--ink, #202124); font-variant-numeric: tabular-nums; }
.route-card__eta .eta__k { font-size: .78rem; }
.route-card__eta .eta__d { font-size: .8rem; }
.route-card__eta .eta__warn, .ticket__tt.is-warn, .ticket__tt-empty { color: #8A5300; }
.route-card__eta.is-warn { background: #FFF4E5; }
.route-card__fuelnote { margin: 6px 0 0; padding: 7px 10px; border-radius: 8px; background: #FFF8E1; color: #6B5300; font-size: .82rem; line-height: 1.4; }
.compare-card__fuelnote { display: block; margin-top: 3px; font-size: .7rem; color: #8A6D00; font-weight: 600; }
.ticket__tt { margin: 8px 0 0; font-size: .82rem; color: var(--ink-2, #5b6472); }
.ticket__tt-empty { margin: 0; padding: 10px 0; font-size: .9rem; }
@media (max-width: 420px) { .tt-fields { gap: 4px 14px; } }
.tp__when label { display: grid; gap: 4px; font-size: .85rem; font-weight: 600; }
.tp__when select, .tp__when input { min-height: 40px; padding: 6px 10px; border: 1px solid #D6E0EC; border-radius: 10px; font: inherit; background: #fff; }
.tp__hint, .tp__note { color: var(--tp-mut); font-size: .88rem; margin: 10px 0; }

.tp-filters { display: flex; gap: 8px; overflow-x: auto; padding: 2px 0 12px; scrollbar-width: none; }
.tp-filters[hidden] { display: none; }
.tp-filters::-webkit-scrollbar { display: none; }
.tp-filter { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 8px; min-height: 38px; padding: 0 14px; border: 1px solid #D6E0EC; border-radius: 999px; background: #fff; color: var(--tp-ink); font: inherit; font-weight: 600; font-size: .9rem; cursor: pointer; transition: background .15s, border-color .15s, color .15s; }
.tp-filter:hover { border-color: var(--mode, #C62828); }
.tp-filter.is-active { background: var(--mode, #C62828); border-color: var(--mode, #C62828); color: #fff; }
.tp-filter__n { min-width: 20px; padding: 0 6px; border-radius: 999px; background: var(--mode-soft, #FDECEC); color: var(--mode, #C62828); font-size: .78rem; line-height: 20px; text-align: center; }
.tp-filter.is-active .tp-filter__n { background: rgba(255,255,255,.22); color: #fff; }

.tp-ticket { cursor: pointer; transition: box-shadow .2s, outline-color .2s; outline: 2px solid transparent; outline-offset: -2px; }
.tp-ticket.is-selected { outline-color: var(--mode, #C62828); }
.tp-ticket .ticket__price strong { font-size: 15px; }
.tp-bar { display: flex; gap: 2px; height: 8px; border-radius: 99px; overflow: hidden; background: #EDF2F8; margin: 5px 0 2px; }
.tp-bar__seg { min-width: 3px; background: #455A64; }
.tp-bar__seg--walk { background: #B8C4D2; }
.tp-bar__seg--wait { background: repeating-linear-gradient(45deg, #F5C451 0 4px, #FBE3A1 4px 8px); }
.tp-badges { display: inline-flex; flex-wrap: wrap; gap: 5px; }
.tp-badge { display: inline-block; padding: 1px 7px; border-radius: 6px; color: #fff; font-size: .78rem; font-weight: 700; text-align: center; line-height: 1.5; }

.tp-detail { padding: 4px 2px 16px; }
.tp-nav { display: flex; align-items: center; justify-content: center; gap: 14px; padding: 4px 0 10px; }
.tp-nav__btn { width: 38px; height: 38px; display: grid; place-items: center; border: 1px solid #D6E0EC; border-radius: 50%; background: #fff; color: var(--tp-ink); cursor: pointer; }
.tp-nav__btn:disabled { opacity: .35; cursor: default; }
.tp-nav__label { font-weight: 700; font-size: .9rem; font-variant-numeric: tabular-nums; min-width: 3.5em; text-align: center; }
.tp-pane--next { animation: tpNext .32s cubic-bezier(.3,.8,.3,1) both; }
.tp-pane--prev { animation: tpPrev .32s cubic-bezier(.3,.8,.3,1) both; }
@keyframes tpNext { from { opacity: 0; transform: translateX(36px); } to { opacity: 1; transform: none; } }
@keyframes tpPrev { from { opacity: 0; transform: translateX(-36px); } to { opacity: 1; transform: none; } }
.tp-slide__head { display: grid; gap: 8px; margin-bottom: 10px; }
.tp-slide__title { font-size: 1.1rem; }
.tp-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.tp-chip { padding: 2px 10px; border-radius: 999px; background: var(--mode-soft, #FDECEC); color: var(--mode, #C62828); font-size: .8rem; font-weight: 600; }

.tp-tl { list-style: none; margin: 0; padding: 0; }
.tp-st { position: relative; display: flex; gap: 14px; padding: 0 0 18px; --c: #B8C4D2; }
.tp-st::before { content: ''; position: absolute; left: 17px; top: 36px; bottom: 0; width: 3px; border-radius: 3px; background: var(--c); }
.tp-st--walk::before { background: repeating-linear-gradient(to bottom, #B8C4D2 0 4px, transparent 4px 9px); width: 2px; left: 18px; }
.tp-st--end::before { display: none; }
.tp-st__dot { flex: 0 0 auto; width: 36px; height: 36px; display: grid; place-items: center; border-radius: 50%; background: #F1F5FA; color: #4a5a6e; z-index: 1; }
.tp-st__dot--ride { color: #fff; }
.tp-st__dot--end { background: #D32F2F; color: #fff; font-size: .8rem; }
.tp-st__body { display: grid; gap: 4px; min-width: 0; padding-top: 5px; font-size: .94rem; }
.tp-st__title { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.tp-st__meta { color: var(--tp-mut); font-size: .86rem; }
.tp-st__meta b { color: var(--tp-ink); }
/* Kalkış çizelgesi: geçmiş saatler pasif, binilecek sefer vurgulu */
.tp-tt { margin-top: 6px; }
.tp-tt__list { list-style: none; margin: 8px 0 0; padding: 4px 2px; display: flex; flex-wrap: wrap; gap: 6px; max-height: 190px; overflow-y: auto; position: relative; }
.tp-tt__list[hidden] { display: none; }
.tp-tt__t { min-width: 54px; padding: 5px 8px; text-align: center; font-size: .84rem; font-weight: 600; font-variant-numeric: tabular-nums; border: 1px solid var(--line, #e3ebf5); border-radius: 8px; background: var(--surface, #fff); color: var(--tp-ink, #0f1f2b); }
.tp-tt__t.is-past { color: #9aa7b6; background: #f4f6f9; border-color: #edf0f4; text-decoration: line-through; font-weight: 500; }
.tp-tt__t.is-next { background: var(--navy, #0e2a47); border-color: var(--navy, #0e2a47); color: #fff; }
.tp-wait { display: inline-block; margin-left: 4px; padding: 1px 8px; border-radius: 999px; background: #FFF4D6; color: #7A5600; font-weight: 600; }
.tp-toggle { display: inline-flex; align-items: center; gap: 6px; width: fit-content; min-height: 32px; padding: 0 10px; border: 1px solid #D6E0EC; border-radius: 8px; background: #fff; color: var(--tp-ink); font: inherit; font-size: .86rem; font-weight: 600; cursor: pointer; }
.tp-toggle svg { transition: transform .2s; }
.tp-toggle.is-open svg { transform: rotate(180deg); }
.tp-stops { list-style: none; margin: 4px 0 2px; padding: 0 0 0 4px; border-left: 3px solid var(--c); display: grid; }
.tp-stops li { position: relative; padding: 4px 0 4px 14px; font-size: .86rem; }
.tp-stops li::before { content: ''; position: absolute; left: -11px; top: 50%; width: 9px; height: 9px; margin-top: -4.5px; border-radius: 50%; background: #fff; border: 2px solid var(--c); }
.tp-stops__t { display: inline-block; min-width: 3.2em; margin-right: 8px; color: var(--tp-mut); font-variant-numeric: tabular-nums; }
.tp-pin span { display: grid; place-items: center; width: 26px; height: 26px; border-radius: 50%; color: #fff; font-weight: 800; font-size: .8rem; border: 2px solid #fff; box-shadow: 0 2px 6px rgba(0,0,0,.3); }
@media (prefers-reduced-motion: reduce) { .tp-pane--next, .tp-pane--prev { animation: none; } }

.tp-bar__seg--taxi { background: #F9A825; }
.tp-st--taxi .tp-st__dot { background: #FFF3CD; color: #8a5a00; }
.tp-st--taxi::before { background: repeating-linear-gradient(to bottom, #F9A825 0 6px, transparent 6px 10px); }

/* toplu taşıma: maliyet akordeonu */
.tp-cost { margin: 10px 0 12px; border: 1px solid var(--mode-soft, #FDECEC); border-radius: 12px; background: #fff; overflow: hidden; }
.tp-cost__sum { display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 10px 14px; cursor: pointer; list-style: none; font-weight: 600; color: var(--mode, #C62828); }
.tp-cost__sum::-webkit-details-marker { display: none; }
.tp-cost__sum::after { content: '▾'; margin-left: 6px; transition: transform .2s; }
.tp-cost[open] .tp-cost__sum::after { transform: rotate(180deg); }
.tp-cost__list { list-style: none; margin: 0; padding: 0 14px 4px; }
.tp-cost__row { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-top: 1px solid rgba(0,0,0,.07); font-size: .9rem; }
.tp-cost__row small { display: block; color: #6b7280; font-size: .78rem; }
.tp-cost__row em { font-style: normal; font-weight: 600; white-space: nowrap; }
.tp-cost__row--sum { font-weight: 700; border-top: 2px solid rgba(0,0,0,.15); }
.tp-cost__note { margin: 0; padding: 0 14px 12px; color: #6b7280; font-size: .78rem; }

/* toplu taşıma: Rota seçenekleri paneli (Tercih / Rotalar) */
.tp-opts__toggle { display: inline-flex; align-items: center; gap: 8px; min-height: 38px; padding: 0 14px; border: 1px solid #D6E0EC; border-radius: 999px; background: #fff; color: var(--tp-ink); font: inherit; font-weight: 600; font-size: .9rem; cursor: pointer; }
.tp-opts__toggle:hover, .tp-opts__toggle.is-open { border-color: var(--mode, #C62828); color: var(--mode, #C62828); }
.tp-opts__ico { display: inline-flex; }
.tp-filters { flex-wrap: wrap; overflow: visible; }
.tp-opts { flex: 1 1 100%; margin-top: 10px; padding: 16px; border: 1px solid #E3E8EF; border-radius: 14px; background: #fff; }
.tp-opts__head { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; }
.tp-opts__title { margin: 0; font-size: 1.1rem; font-weight: 600; }
.tp-opts__close { border: 0; background: none; color: var(--mode, #C62828); font: inherit; font-weight: 600; cursor: pointer; }
.tp-opts__cols { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
@media (max-width: 520px) { .tp-opts__cols { grid-template-columns: 1fr; } }
.tp-opts__col { border: 0; margin: 0; padding: 0; min-width: 0; }
.tp-opts__col legend { padding: 0; margin-bottom: 10px; font-weight: 700; font-size: 1rem; }
.tp-opt { position: relative; display: flex; align-items: center; gap: 10px; padding: 8px 0; cursor: pointer; }
.tp-opt input { position: absolute; opacity: 0; width: 0; height: 0; }
.tp-opt__box, .tp-opt__radio { flex: 0 0 22px; height: 22px; border: 2px solid #5f6b7a; background: #fff; box-sizing: border-box; display: grid; place-items: center; }
.tp-opt__box { border-radius: 4px; }
.tp-opt__radio { border-radius: 50%; }
.tp-opt input:checked + .tp-opt__box { background: var(--mode, #C62828); border-color: var(--mode, #C62828); }
.tp-opt input:checked + .tp-opt__box::after { content: ''; width: 5px; height: 10px; border: solid #fff; border-width: 0 2px 2px 0; transform: rotate(45deg) translate(-1px, -1px); }
.tp-opt input:checked + .tp-opt__radio { border-color: var(--mode, #C62828); }
.tp-opt input:checked + .tp-opt__radio::after { content: ''; width: 10px; height: 10px; border-radius: 50%; background: var(--mode, #C62828); }
.tp-opt input:focus-visible + .tp-opt__box, .tp-opt input:focus-visible + .tp-opt__radio { outline: 2px solid var(--mode, #C62828); outline-offset: 2px; }
.tp-opt__ico { display: inline-flex; color: #5f6b7a; }
.tp-opt__txt { font-size: .95rem; }
/* detay slaytı: seçenek açıklaması */
.tp-desc { text-align: center; padding: 0 0 10px; }
.tp-desc__kinds { display: flex; justify-content: center; align-items: center; flex-wrap: wrap; gap: 6px; }
.tp-desc__ride { display: inline-flex; align-items: center; gap: 6px; }
.tp-desc__ico { display: inline-flex; color: #5f6b7a; }
.tp-desc__plus { color: #8a94a3; font-weight: 700; }
.tp-desc__txt { margin: 6px 0 0; color: #5f6b7a; font-size: .85rem; }

/* Uçak + havalimanı servisi birleşimi (php/AirBusCombo.php) */
.ab-list { display: grid; gap: 12px; }
.ab-item { background: var(--surface); border: 1px solid var(--line); border-radius: 14px; overflow: hidden; }
.ab-head { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 12px 16px; background: var(--surface-2); cursor: pointer; list-style: none; }
.ab-item[open] > .ab-head { border-bottom: 1px solid var(--line); }
.ab-total { display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px 8px; }
.ab-total strong { font-size: 1.1rem; color: var(--ink); }
.ab-total > span:not(.ab-badge) { font-size: 0.8rem; color: var(--ink-2); }
.ab-badge { font-size: 0.68rem; font-weight: 700; padding: 2px 8px; border-radius: 999px; }
.ab-badge--fast { background: var(--car-soft); color: var(--car); }
.ab-badge--cheap { background: #E3F4E8; color: #1E6B35; }
.ab-price { font-size: 1.05rem; font-weight: 800; color: var(--ink); white-space: nowrap; }
.ab-line { list-style: none; margin: 0; padding: 14px 16px 12px; }
.ab-node { position: relative; display: grid; grid-template-columns: 52px 1fr; gap: 0 24px; padding-bottom: 14px; }
.ab-node::before { content: ""; position: absolute; left: 63px; top: 8px; width: 2px; bottom: -8px; background: var(--line-strong); }
.ab-node--start::after, .ab-node--end::after { content: ""; position: absolute; left: 58px; top: 7px; width: 12px; height: 12px; border-radius: 50%; background: var(--surface); border: 3px solid currentColor; box-sizing: border-box; }
.ab-node--plane { color: var(--car); } .ab-node--bus { color: var(--bus); }
.ab-node--plane::before { background: var(--car); } .ab-node--bus::before { background: var(--bus); }
.ab-node--end::before { display: none; }
.ab-node--end { padding-bottom: 6px; }
.ab-time { font-weight: 700; font-size: 0.98rem; color: var(--ink); font-variant-numeric: tabular-nums; text-align: right; }
.ab-body { display: grid; gap: 12px; }
.ab-place { font-size: 0.92rem; font-weight: 600; color: var(--ink); display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.ab-day { font-size: 0.66rem; font-weight: 700; color: var(--ink-2); background: var(--surface-2); border: 1px solid var(--line); border-radius: 999px; padding: 1px 7px; }
.ab-sub { font-size: 0.8rem; color: var(--ink-2); }
.ab-sub b { color: currentColor; }
.ab-node--plane .ab-sub b { color: var(--car); } .ab-node--bus .ab-sub b { color: var(--bus); }
.ab-wait { list-style: none; margin: 0 0 14px 76px; }
.ab-wait span { display: inline-block; font-size: 0.82rem; color: var(--ink-2); background: var(--surface-2); border: 1px dashed var(--line-strong); border-radius: 999px; padding: 5px 10px; }
.ab-note { font-size: 0.78rem; color: var(--ink-2); margin: 12px 0 0; }
@media (max-width: 480px) { .ab-head { padding: 10px 12px; } .ab-line { padding: 12px 12px 10px; } .ab-node { grid-template-columns: 46px 1fr; gap: 0 20px; } .ab-node::before { left: 55px; } 
    .ab-node--start::after, .ab-node--end::after { left: 50px; } .ab-wait { margin-left: 66px; } }

/* ---- planlayıcı: tür sekmeleri ve kart vurguları (Deniz yolu / Marmaray) ---- */
.tp-ticket--sea { --mode: #00897B; border-left: 5px solid #00897B; }
.tp-ticket--rail { --mode: #EF6C00; border-left: 5px solid #EF6C00; }
.tp-cat { display: inline-block; padding: 2px 9px; border-radius: 999px; font-size: .74rem; font-weight: 700; color: #fff; white-space: nowrap; }
.tp-cat--sea { background: #00897B; }
.tp-cat--rail { background: #EF6C00; }

/* (2026-10-18) Sefer listesi üst satırı: Firma | Yolcu | Sırala | Filtre ikonu TEK satırda (mobilde de sarmaz). Filtrele artık yalnız ikon. */
.sched-list__row1 { flex-wrap: nowrap; }
.sched-list__row1 .sched-field--op { flex: 1 1 0; min-width: 0; }
.sched-list__row1 .sched-op-select { width: 100%; max-width: 100%; min-width: 0; }
.sched-list__row1 .sched-field--pax input { width: 3.6em; }
.sched-list__row1 .sched-field--sort { flex: 0 1 auto; min-width: 0; }
.sched-sort-select { max-width: 8.5em; min-width: 0; border: 1px solid var(--line-strong); border-radius: 8px; padding: 6px 6px; font: inherit; font-size: 0.82rem; color: var(--ink); background: var(--surface-2); text-transform: none; letter-spacing: normal; font-weight: 600; height: 33px; }
.sched-filters-toggle--icon { padding: 6px 9px; flex: none; }
/* (2026-10-18) Uçak + Servis: akordeon sefer kartları, operatör logoları */
.ab-head::-webkit-details-marker { display: none; }
.ab-head::marker { content: ""; }
.ab-head:focus-visible { outline: 2px solid var(--navy); outline-offset: -2px; }
.ab-head__r { display: flex; align-items: center; gap: 8px; }
.ab-chev { display: inline-flex; color: var(--ink-3); transition: transform .18s; }
.ab-item[open] .ab-chev { transform: rotate(90deg); }
.ab-logos { display: inline-flex; gap: 4px; align-self: center; }
.ab-logo { display: inline-flex; align-items: center; justify-content: center; width: 26px; height: 26px; border-radius: 7px; background: var(--surface); border: 1px solid var(--line); flex: none; overflow: hidden; }
.ab-logo--img img { width: 100%; height: 100%; object-fit: contain; display: block; }
.ab-logo--plane { color: var(--car); background: var(--car-soft); border-color: transparent; }
.ab-logo--bus { color: var(--bus); background: var(--bus-soft); border-color: transparent; }
.ab-opline { display: flex; align-items: center; gap: 8px; margin-top: 2px; }
.ab-opline .ab-logo { width: 24px; height: 24px; }
.ab-list + .hub-out, .ab-combo > .hub-out { margin: 0 0 12px; }
.ab-list { margin-bottom: 12px; }
/* (2026-10-18) Toplu taşıma/deniz kartı: işletmeci logosu + vapur (hat) adı */
.ticket__mono--logo { background: #fff; border: 1px solid var(--line); overflow: hidden; }
.ticket__mono--logo img { width: 100%; height: 100%; object-fit: contain; display: block; }
.tp-badge-name { align-self: center; font-size: .92rem; font-weight: 600; color: var(--ink-1); }
/* (2026-10-18) Hat rozeti + hat adı üstte tek satır, "En hızlı" altında; ertesi güne sarkan varış etiketi */
.tp-brand__text { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; min-width: 0; }
.tp-brand__text .tp-badges { flex-wrap: nowrap; }
.tp-brand__text .tp-badge-name { white-space: normal; line-height: 1.25; }
.ticket__nextday { font-size: 11px; font-weight: 700; color: #b3261e; margin-left: 3px; vertical-align: super; }
/* ===== Toplu taşıma detay: profesyonel biniş adımı + ayrı saat slaytı ===== */
.tp-ride__name { margin-left: 8px; font-weight: 600; color: #374151; font-size: .95rem; }
.tp-ride__grid { display: grid; grid-template-columns: 78px 1fr; gap: 6px 12px; margin: 10px 0 8px; padding: 10px 12px; background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 12px; font-size: .9rem; }
.tp-ride__grid dt { color: #6b7280; font-size: .8rem; text-transform: uppercase; letter-spacing: .03em; align-self: center; }
.tp-ride__grid dd { margin: 0; color: #111827; min-width: 0; overflow-wrap: anywhere; }
.tp-ride__grid dd em { font-style: normal; color: #6b7280; }
.tp-ttlink { display: flex; align-items: center; gap: 10px; width: 100%; margin-top: 8px; padding: 10px 12px; background: #fff; border: 1px solid var(--c, #cbd5e1); border-radius: 12px; cursor: pointer; text-align: left; color: #111827; font: inherit; }
.tp-ttlink:hover { background: #f8fafc; }
.tp-ttlink__ico { display: inline-flex; color: var(--c, #475569); }
.tp-ttlink__txt { flex: 1; display: flex; flex-direction: column; line-height: 1.25; }
.tp-ttlink__txt small { color: #6b7280; font-size: .8rem; }
.tp-ttlink > svg:last-child { color: #94a3b8; }
.tp-alt { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin-top: 10px; }
.tp-alt__l { font-size: .78rem; color: #6b7280; margin-right: 2px; }
.tp-alt__c { padding: 2px 9px; border-radius: 999px; background: #f1f5f9; color: #334155; font-size: .8rem; font-weight: 600; }
.tp-cost--bottom { margin: 14px 0 4px; }
/* saat slaytı */
.tp-tv__bar { margin-bottom: 8px; }
.tp-tv__back { display: inline-flex; align-items: center; gap: 4px; padding: 6px 10px 6px 4px; background: none; border: 0; cursor: pointer; font: inherit; font-weight: 600; color: #374151; }
.tp-tv__head { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border-radius: 14px; background: #fff; border: 1px solid #e5e7eb; border-left: 4px solid var(--c, #475569); }
.tp-tv__txt { display: flex; flex-direction: column; min-width: 0; line-height: 1.3; }
.tp-tv__txt span { color: #6b7280; font-size: .85rem; }
.tp-tv__legend { display: flex; gap: 16px; margin: 12px 2px 8px; font-size: .8rem; color: #6b7280; }
.tp-tv__legend span { display: inline-flex; align-items: center; gap: 6px; }
.tp-tv__legend i { width: 14px; height: 14px; border-radius: 4px; background: #f1f5f9; border: 1px solid #e2e8f0; }
.tp-tv__legend i.is-next { background: #16a34a; border-color: #16a34a; }
.tp-tv__legend i.is-past { opacity: .5; }
.tp-tv__grid { background: #fff; border: 1px solid #e5e7eb; border-radius: 14px; overflow: hidden; }
.tp-tv__row { display: grid; grid-template-columns: 52px 1fr; border-top: 1px solid #eef2f7; }
.tp-tv__row:first-child { border-top: 0; }
.tp-tv__h { display: flex; align-items: center; justify-content: center; background: #f8fafc; font-weight: 700; font-size: 1.05rem; color: #111827; border-right: 1px solid #eef2f7; }
.tp-tv__mins { display: flex; flex-wrap: wrap; gap: 6px; padding: 10px; }
.tp-tv__m { min-width: 56px; padding: 5px 8px; text-align: center; border-radius: 8px; background: #f1f5f9; color: #111827; font-weight: 600; font-variant-numeric: tabular-nums; }
.tp-tv__m.is-past { opacity: .4; text-decoration: line-through; }
.tp-tv__m.is-next { background: #16a34a; color: #fff; opacity: 1; text-decoration: none; box-shadow: 0 0 0 3px rgba(22,163,74,.2); }

/* Sabit boyutlu reklam (config ads.placements.*.mobile/desktop): mobil/masaüstü boyutu CSS değişkenlerinden */
.ad-slot--fixed { align-items: center; }
.ad-slot__fixed { width: var(--ad-wd); height: var(--ad-hd); max-width: 100%; }
@media (max-width: 640px) { .ad-slot__fixed { width: var(--ad-wm); height: var(--ad-hm); } .ad-slot--fixed { min-height: 0; } }
/* Deniz seferi kartı: aktarma bilgisi "En hızlı" rozetinin yanında */
.tp-transfer { display: inline-flex; align-items: center; padding: 3px 10px; border-radius: 999px; background: #e6f4ea; color: #1e6b3a; font-size: .78rem; font-weight: 600; line-height: 1.2; }
.tp-badge-name--sea { font-size: .9rem; font-weight: 600; }

/* Mobil: yakınlaştırma (+/−) düğmeleri gizli (parmakla sıkıştırarak yakınlaştırılır); atıf satırı küçük ve tek satır.
   OpenStreetMap atfı lisans (ODbL) gereği tamamen kaldırılmaz; Leaflet bayrağı/öneki gizlenir. */
@media (max-width: 768px) {
  .leaflet-control-zoom { display: none !important; }
  .leaflet-control-attribution { font-size: 9px; line-height: 1.3; padding: 0 4px; max-width: 70vw; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; background: rgba(255,255,255,.65); }
  .leaflet-control-attribution a[href*="leafletjs"], .leaflet-control-attribution .leaflet-attribution-flag, .leaflet-control-attribution .leaflet-control-attribution__sep { display: none; }
}

/* Sefer listesi slaytı: başlığın sağında Paylaş butonu */
.sched-list__head { flex-direction: row !important; flex-wrap: nowrap; align-items: center; }
.sched-list__route { min-width: 0; }
.page-actions--head { margin: 0; flex: 0 0 auto; }
.page-actions--head .page-actions__btn { padding: 6px 12px; font-size: .83rem; border: 1px solid var(--line); border-radius: 999px; background: var(--surface); }
.page-actions--head .share-menu { left: auto; right: 0; }

/* marka-baglantisi-20261027: bağlantı yalnız marka adında; ::after ile tüm logo alanı tıklanır */
.brand{position:relative}
.brand .brand__link,.brand .brand__link:hover{color:inherit;font:inherit;letter-spacing:inherit;text-decoration:none}
.brand .brand__link::after{content:"";position:absolute;inset:0}
.brand .brand__link:focus-visible{outline:none}
.brand .brand__link:focus-visible::after{outline:3px solid var(--amber,#F5A800);outline-offset:2px;border-radius:4px}

/* pw-widgets-20261027: paylaş düğmesi + "son doğrulama / hatalı bilgi bildir" kartı */
.pw-share{position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px;z-index:5}
.pw-card{display:flex;align-items:center;justify-content:space-between;gap:12px 16px;flex-wrap:wrap;margin:18px 0 12px;padding:14px 16px;background:var(--surface-2,#f4f7f8);border:1px solid var(--line,#e1e8eb);border-radius:14px}
.pw-card__body{flex:1 1 260px;min-width:0}
.pw-card__date,.pw-card__text{margin:0;font-size:.88rem;line-height:1.5;color:var(--ink-2,#425866)}
.pw-card__date{color:var(--ink,#0f1f2b);margin-bottom:2px}
.pw-card__btn{display:inline-flex;align-items:center;padding:9px 16px;font-size:.88rem;font-weight:700;color:var(--ink,#0f1f2b);background:var(--surface,#fff);border:1px solid var(--line-strong,#cfd8dc);border-radius:999px;text-decoration:none;white-space:nowrap}
.pw-card__btn:hover{background:rgba(15,31,43,.06)}
@media print{.pw-share,.pw-card__btn{display:none}}

/* pw-hero-20261027: Paylaş hero'da; doğrulama kartı beyaz + ikon */
.pw-hero-row{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;margin:0 0 8px}
.pw-hero-row .dk-hero__loc{margin-bottom:0}
.pw-share--hero{margin:0;z-index:2}
.pw-share--hero .page-actions__btn{background:#fff;color:var(--ink,#0f1f2b);border-color:#fff;padding:7px 14px;font-size:.88rem}
.pw-share--hero .page-actions__btn:hover{background:#eef3f8}
.pw-share--hero .page-actions__msg{color:#bff0cf}
.pw-card{background:#fff}
.pw-card__body{display:flex;align-items:flex-start;gap:10px}
.pw-card__icon{flex:none;display:inline-flex;margin-top:2px;color:var(--car,#1D72D8)}
.pw-card__txt{min-width:0}

/* Arama önerileri hero'nun altında kesilmesin */
section.ah-hero, section.cp-hero, section.dk-hero { overflow: visible; }
section.ah-hero:focus-within, section.cp-hero:focus-within, section.dk-hero:focus-within { z-index: 40; }

/* (2026-10-28) yama_2026-10-28d: tüm haritalarda atıf satırı yalnız "Leaflet | © OpenStreetMap" metni (Leaflet bağlantısı ve bayrağı yok) */
.leaflet-control-attribution a[href*="leafletjs"], .leaflet-control-attribution .leaflet-attribution-flag, .leaflet-control-attribution .leaflet-control-attribution__sep { display: none; }
.leaflet-control-attribution::before { content: "Leaflet"; }

.compare-card__icon[data-compare-icon="walk"]{background:#2E7D32}
.compare-card__icon[data-compare-icon="minibus"]{background:#7B4FD6}

/* yama_2026-10-29c: yalnız tarih kartı */
.pw-card--date{justify-content:flex-start}
.pw-card--date .pw-card__body{display:flex;align-items:center;gap:12px;flex:0 1 auto}
.pw-card--date .pw-card__date{margin:0}

/* (2026-10-31) Ilgili Rotalar basliklari */
.related-routes__title { font-size: 1.2rem; font-weight: 600; color: var(--ink); margin: 0 0 12px; line-height: 1.3; }
.related-routes .related-routes__col-title { font-size: .96rem; font-weight: 600; color: var(--ink-2); margin: 0 0 10px; }

.compare-card__icon[data-compare-icon="airport"] { background: var(--compare-bus); }
