/* Khartoum Wire - kamuya acik site.
   Renk ve font degiskenleri icin bkz. tokens.css. Onceden buraya @import
   ediliyordu (sıralı, render-blocking ikinci istek); artık tokens.css bu
   dosyadan once ayri bir <link> ile HTML head'inde geliyor (SEO fix). */

* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0; background: var(--bg); color: var(--ink);
  font-family: var(--font-sans); font-size: 16px; line-height: 1.6;
}

/* ---------- Tipografi hiyerarsisi ----------
   Basliklar sistem serifi (bkz. tokens.css --font-display), govde ve butun UI
   ogeleri sistem sans'i. Agirlik 700: Georgia'da 800 kesim yok, tarayici
   sentezler ve harfler bulanir. Harf araligi -.015em; sans icin dogru olan
   -.03em bir serifte harfleri birbirine yapistiriyor. */
h1, h2, h3, h4 {
  font-family: var(--font-display); font-weight: 700; color: var(--ink);
  letter-spacing: -.015em; line-height: 1.12; text-wrap: balance;
}
::selection { background: var(--ink); color: var(--ink-invert); }
.wires h4{ letter-spacing: .1em; }

img { max-width: 100%; display: block; }
a { color: inherit; text-decoration: none; transition: color var(--dur) var(--ease); }
a:hover { color: var(--gold); }
/* Govde metnindeki bag rengi TASIYAMAZ: palet tek renkli, hover'da yalnizca
   bir ton aciliyor. Isareti alt cizgi veriyor (WCAG 1.4.1: renk tek gosterge
   olamaz), harflerin altina degmesin diye offset'li. */
.article-body a, .promo a, .form-note a {
  text-decoration: underline; text-underline-offset: 3px;
  text-decoration-thickness: 1px; text-decoration-color: var(--ink-3);
}
.article-body a:hover, .promo a:hover, .form-note a:hover { text-decoration-color: currentColor; }
/* Odak: golge yok, gorunur outline */
a:focus-visible, button:focus-visible, input:focus-visible {
  outline: 2px solid var(--gold); outline-offset: 2px;
}
.wrap { max-width: var(--wrap); margin: 0 auto; padding: 0 24px; }

/* Yalnizca ekran okuyucular icin */
.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;
}
/* Icerige atla: odaklanana kadar gizli */
.skip-link {
  position: absolute; left: 8px; top: -60px; z-index: 100;
  background: var(--gold); color: var(--on-gold); padding: 0 16px;
  display: inline-flex; align-items: center; min-height: 44px;
  font-size: 13px; font-weight: 700; border-radius: var(--radius);
}
.skip-link:focus { top: 8px; color: var(--on-gold); }

/* Ayrac: gazete sutunlarindaki ince cizgilerin karsiligi.
   Bloklar renkli kutuya sarilmaz, <hr> ile ayrilir. */
hr { border: 0; height: 0; margin: 0; }
.rule { border-top: 1px solid var(--line); }

/* Butonlar: dolgun hap bicimi, hafif yukselme animasyonu */
.btn-cta, .btn-ghost {
  display: inline-flex; align-items: center; justify-content: center; min-height: 44px;
  padding: 0 20px; border-radius: var(--radius-s);
  font-family: var(--font-sans); font-size: 13px; font-weight: 700;
  letter-spacing: -.01em; border: 1px solid transparent; cursor: pointer;
  transition: background var(--dur) var(--ease), transform var(--dur) var(--ease),
              box-shadow var(--dur) var(--ease), color var(--dur) var(--ease);
}
.btn-cta { background: var(--gold); color: var(--on-gold) !important; }
.btn-cta:hover { background: var(--gold-hi); transform: translateY(-2px); box-shadow: var(--shadow); }
.btn-cta:active { transform: translateY(0); }
.btn-ghost { background: none; border-color: currentColor; }
.btn-ghost:hover { color: var(--gold); transform: translateY(-2px); }

/* ---------- Masthead ---------- */
.masthead { position: relative; background: var(--dark); }
/* The wire (DESIGN.md sections 1 and 7): a gold hairline under the masthead
   that draws left to right once on load. Replaces the grey border-bottom. */
.masthead::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 1px;
  background: var(--gold); transform-origin: left center;
  animation: wire-draw .9s var(--ease) both;
}
@keyframes wire-draw { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes dot-pulse { 0%, 100% { transform: scale(1); } 40% { transform: scale(1.4); } }
/* Broadsheet masthead: date | centred wordmark + motto | search. The two side
   columns are equal (1fr) so the wordmark sits on the page's true centre
   whatever the date or search box measure. */
.masthead .wrap {
  display: grid; grid-template-columns: 1fr auto 1fr; align-items: center;
  gap: 24px; padding-top: 22px; padding-bottom: 20px;
}
.brand { grid-column: 2; display: flex; flex-direction: column; align-items: center; gap: 8px; }
.masthead .search { justify-self: end; }
.masthead .topdate { justify-self: start; }
.logo { display: flex; align-items: center; gap: 13px; min-height: 44px; }
/* Brand mark: an inline <svg> written by site.js markHTML() - a hairline in ink
   and a gold dot (assets/img/mark.svg holds the same shapes for the favicon and
   the panel). It is inline, not a CSS mask, because a mask is one colour and
   the dot has to be gold. The dot pulses once on load. */
.logo-mark { flex: 0 0 auto; width: 34px; height: 34px; overflow: visible; }
.logo-mark .wire { fill: var(--ink); }
.logo-mark .pulse {
  fill: var(--gold); transform-box: fill-box; transform-origin: center;
  animation: dot-pulse 1.2s var(--ease) .4s 1 both;
}.logo b {
  font-family: var(--font-display); font-size: 1.75rem; font-weight: 700;
  letter-spacing: -.02em; line-height: 1; color: var(--ink);
  /* Iki satira BOLUNMESIN. Bolundugunde isaret iki satirin ortasinda asili
     kaliyor ve kilit dagiliyor; olculdu, 790px'te "KHARTOUM" ve "WIRE" alt
     alta dusuyordu (isaret olmadan da dusuyordu - bu yeni bir sorun degil,
     isaret onu gorunur hale getirdi). Yer motto'dan aciliyor, asagiya bak. */
  white-space: nowrap;
}
/* Iki tonlu logo, renk olmadan: ikinci kelime bir kademe geri cekiliyor. */
.logo b em { font-style: normal; font-weight: 400; color: var(--ink-2); }
.brand .motto {
  margin: 0; font-size: 11px; text-transform: uppercase; letter-spacing: .2em;
  color: var(--ink-3); text-align: center;
  /* Flanking hairlines: the motto reads as a dateline under the nameplate. */
  display: flex; align-items: center; gap: 14px; white-space: nowrap;
}
.brand .motto::before, .brand .motto::after {
  content: ''; width: 28px; height: 1px; background: var(--line);
}
.topdate {
  font-size: 12.5px; letter-spacing: .02em; color: var(--ink-3); white-space: nowrap;
}
.search {
  display: flex; align-items: center; gap: 8px; border: 1px solid var(--line);
  border-radius: var(--radius); padding: 0 12px; min-height: 46px; /* 46 = a 44px input + the 1px border each side */
  background: var(--bg-2); min-width: 280px;
  transition: border-color var(--dur) var(--ease);
}
.search:hover { border-color: var(--ink-3); }
/* The input has no outline of its own (the wrapper is the visible control), so the
   wrapper carries the full gold focus ring of DESIGN.md section 4. */
.search:focus-within { border-color: var(--gold); outline: 2px solid var(--gold); outline-offset: 3px; }
.search-icon {
  width: 16px; height: 16px; flex: 0 0 auto; fill: none; stroke: var(--ink-3);
  stroke-width: 1.8; stroke-linecap: round;
}
/* The "/" hint: only where there is a keyboard-and-mouse pointer, and gone
   while the box has focus. aria-hidden in the markup: the shortcut is a
   convenience, not the only way in. */
.search-key {
  display: none; flex: 0 0 auto; font: 600 11px/1 var(--font-sans); color: var(--ink-3);
  border: 1px solid var(--line); border-radius: var(--radius-s); padding: 3px 6px;
}
@media (hover: hover) and (pointer: fine) { .search-key { display: inline-block; } }
.search:focus-within .search-key { display: none; }
.search input { border: 0; background: none; outline: none; font-size: 14px; width: 100%; font-family: inherit; align-self: stretch; }

/* ---------- Ana menu / mega menu ---------- */
.mainnav {
  border-bottom: 1px solid var(--line); background: var(--bg);
  position: sticky; top: 0; z-index: 40;
}
.nav-list {
  display: flex; align-items: stretch; justify-content: center; gap: var(--space-m);
  list-style: none; margin: 0; padding: 0;
}
.nav-item { position: static; }
.nav-link {
  display: flex; align-items: center; justify-content: center; gap: 5px; min-height: 44px; min-width: 44px; padding: 0;
  font-family: var(--font-sans); font-size: 13px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .08em; white-space: nowrap;
  color: var(--ink); background: none; border: 0; border-bottom: 3px solid transparent;
  cursor: pointer;
}
.nav-link:hover, .nav-link.on { color: var(--gold); border-bottom-color: var(--gold); }
.caret { font-size: 9px; opacity: .8; }

/* Panel: tam genislik, cerceve yerine tek 1px alt cizgi */
.mega {
  position: absolute; left: 0; right: 0; top: 100%;
  background: var(--bg); border-top: 1px solid var(--line);
  border-bottom: 1px solid var(--line);
  padding: var(--space-m) 0; visibility: hidden; opacity: 0;
}
.has-mega:hover .mega, .has-mega:focus-within .mega, .has-mega.open .mega {
  visibility: visible; opacity: 1;
}
.has-mega:hover > .nav-link, .has-mega:focus-within > .nav-link, .has-mega.open > .nav-link {
  color: var(--gold); border-bottom-color: var(--gold);
}
/* Esc ile kapatildiginda hover/odak yeniden acmasin */
.has-mega.suppressed .mega { visibility: hidden; opacity: 0; }
.mega-cols { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: var(--space-m); }
.mega-col-wide { grid-column: span 2; }
.mega-title {
  font-family: var(--font-sans); font-size: 11px; font-weight: 700;
  text-transform: uppercase; letter-spacing: .12em; color: var(--ink-3);
  margin: 0 0 12px; padding-bottom: 8px; border-bottom: 1px solid var(--line);
}
.mega ul { list-style: none; margin: 0; padding: 0; }
.mega li { margin-bottom: 7px; }
.mega li a { font-size: 13.5px; color: var(--ink-2); }
.mega li a:hover { color: var(--gold); }
.mega-letters li a { display: grid; gap: 2px; }
.mega-letters b {
  font-size: 10px; letter-spacing: .12em; text-transform: uppercase; color: var(--ink-3);
}
.mega-letters span { font-family: var(--font-display); font-size: 14.5px; color: var(--ink); }
.mega-feature { display: grid; grid-template-columns: 92px minmax(0, 1fr); gap: 12px; margin-bottom: 16px; }
.mega-feature img { aspect-ratio: 3/2; object-fit: cover; }
.mega-feature-title {
  display: block; font-family: var(--font-display); font-size: 15px;
  line-height: 1.25; color: var(--ink);
}
.mega-note { font-size: 13px; color: var(--ink-3); margin: 0 0 14px; }

/* ---------- Ulke cekmecesi ----------
   Eskiden burada iki ayri ulke arayuzu vardi: menude genis bir "Regions" mega
   paneli ve menunun altinda yatay kayan bir ulke seridi. Alti ulke icin ikisi
   de fazlaydi. Simdi tek bir cekmece, sagdan aciliyor, her satirda bayrak ve
   ad, en altta "All stories".

   Gizlemek icin [hidden] degil visibility kullaniliyor: display:none'dan
   aciliste gecis animasyonu calismaz; visibility hem erisilebilirlik agacindan
   cikarir hem de transform ile birlikte gecis yapabilir. */
.cekmece-perde {
  position: fixed; inset: 0; z-index: 60; background: rgba(0, 0, 0, .62);
  opacity: 0; visibility: hidden;
  transition: opacity var(--dur) var(--ease), visibility 0s linear var(--dur);
}
.cekmece-perde.acik {
  opacity: 1; visibility: visible;
  transition: opacity var(--dur) var(--ease), visibility 0s;
}
.cekmece {
  position: fixed; top: 0; right: 0; bottom: 0; z-index: 61;
  width: min(360px, 88vw); display: flex; flex-direction: column;
  background: var(--bg); border-left: 1px solid var(--line);
  transform: translateX(100%); visibility: hidden;
  transition: transform var(--dur) var(--ease), visibility 0s linear var(--dur);
}
.cekmece.acik {
  transform: none; visibility: visible;
  transition: transform var(--dur) var(--ease), visibility 0s;
}
.cekmece-bas {
  display: flex; align-items: center; gap: 12px;
  padding: 22px 24px; border-bottom: 1px solid var(--line);
}
.cekmece-baslik {
  font-family: var(--font-sans); font-size: 12px; font-weight: 700;
  letter-spacing: .16em; text-transform: uppercase; margin: 0; color: var(--ink-3);
}
.cekmece-kapat {
  margin-left: auto; background: none; border: 0; cursor: pointer;
  color: var(--ink-3); font-size: 15px; line-height: 1; padding: 6px;
  transition: color var(--dur) var(--ease);
}
.cekmece-kapat:hover { color: var(--ink); }
.cekmece-liste { list-style: none; margin: 0; padding: 0; overflow-y: auto; flex: 1; }
/* Group label (Sudan / Neighbours): a plain <li> inside the one list. */
.cekmece-grup {
  font: 700 11px/1.2 var(--font-sans); letter-spacing: .14em; text-transform: uppercase;
  color: var(--ink-3); padding: 18px 20px 8px;
}
.cekmece-grup:first-child { padding-top: 8px; }
.cekmece-liste a {
  display: flex; align-items: center; gap: 14px; padding: 15px 24px;
  border-bottom: 1px solid var(--line-2);
  font-family: var(--font-display); font-size: 19px; color: var(--ink);
  transition: background var(--dur) var(--ease);
}
.cekmece-liste a:hover { background: var(--bg-2); }
.cekmece-ok { margin-left: auto; color: var(--ink-3); font-size: 14px; }
.cekmece-liste a:hover .cekmece-ok { color: var(--ink); }
/* Bayrak orani 3:2 degil - her bayragin kendi orani var; kutu sabit, gorsel
   iceride kirpilmadan oturuyor. Ince cerceve, beyaz alanli bayraklar (Sudan,
   Somali) siyah zeminde kenarsiz kalmasin diye. */
.bayrak {
  width: 30px; height: 20px; object-fit: cover; flex: 0 0 auto;
  border: 1px solid var(--line); background: var(--bg-2);
}
.cekmece-tumu {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 18px 24px; border-top: 1px solid var(--line);
  font-family: var(--font-sans); font-size: 12px; font-weight: 700;
  letter-spacing: .12em; text-transform: uppercase; color: var(--ink);
}
.cekmece-tumu:hover { background: var(--bg-2); }
/* Countries: the last item of the centred menu, set off by a hairline (it opens
   a drawer, not a page). On phones it is pinned right instead - see 700px. */
.nav-sag { margin-left: 0; padding-left: var(--space-m); border-left: 1px solid var(--line); }

/* ---------- Genel yapi ---------- */
.grid { display: grid; gap: var(--space-l); }

/* Kategori etiketi: dolgulu hap rozet */
/* Kategori etiketi: hap degil, hairline cerceveli kare rozet. Tek renkli
   palette dolgu tasiyamiyor - cerceve tasiyor. */
.kicker {
  font-family: var(--font-sans); font-size: 10.5px; font-weight: 700;
  letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2);
  background: none; border: 1px solid var(--line); padding: 3px 9px;
  border-radius: var(--radius-s); display: inline-block; margin-bottom: 10px;
}
.byline {
  font-family: var(--font-sans); font-size: 12.5px; line-height: 1.5;
  color: var(--ink-3); margin-top: 10px;
}
.byline b { color: var(--ink-2); font-weight: 600; }
.dek {
  font-family: var(--font-sans); color: var(--ink-2); font-size: 15px;
  line-height: 1.6; margin: 8px 0 0;
}

/* ---------- Manset ---------- */
.hero { padding: var(--space-m) 0 var(--space-l); }

.lead h1 {
  font-size: clamp(30px, 4.2vw, 46px); line-height: 1.1; margin: 12px 0 0;
  letter-spacing: -.015em;
}
.lead .dek { font-size: 17px; margin-top: 12px; }

/* Gorsel cercevesi: yuvarlatilmis, tasmayi kirpar; icerideki gorsel hover'da
   hafifce yakinlasir. Kirpma <img>'in kendisinde degil kapsayicida yapilir. */
.lead a, .mini > a, .card a, .listrow > a, .vid > a, .mega-feature {
  display: block; overflow: hidden; border-radius: var(--radius);
  background: var(--bg-2);
}
.card a, .mini > a { border-radius: var(--radius); }
.lead img, .mini img, .card img, .listrow img, .vid img, .mega-feature img {
  aspect-ratio: 3/2; object-fit: cover; width: 100%;
  transition: transform .45s var(--ease);
}
.lead a:hover img, .mini > a:hover img, .card a:hover img,
.listrow > a:hover img, .vid > a:hover img, .mega-feature:hover img {
  transform: scale(1.045);
}

.mini { display: grid; grid-template-columns: 108px minmax(0, 1fr); gap: 14px; }
.mini h3 { font-size: 17px; line-height: 1.26; margin: 4px 0 0; }

.card h3 { font-size: 22px; line-height: 1.2; margin: 10px 0 0; }
/* Kart izgaralari: ayrac cizgisi yok, bosluk ve hareket tasiyor */
.cards-3{ display: grid; column-gap: var(--space-s); row-gap: var(--space-m); }
.cards-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }

/* Kart hover: siyah zeminde "yukselme" golgesiz calismiyor - golge zaten
   gorunmuyor, kart sebepsiz kayiyordu. Hareketi gorselin kendi yakinlasmasi
   tasiyor (yukaridaki .card a:hover img). Cerceveli kutular (.nl-card) hala
   yukseliyor: onlar nesne, kartlar icerik. */
.card, .vid { transition: opacity var(--dur) var(--ease); }

/* ---------- Son dakika rayi ----------
   Yuvarlatilmis, hafif dolgulu yuzey. */
.wires {
  background: var(--bg-2); border: 1px solid var(--line);
  border-radius: var(--radius); padding: 20px 22px;
}
.wires h4 {
  display: flex; align-items: center; gap: 8px;
  margin: 0 0 14px; font-size: 12.5px; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink);
}
/* Tek renkli paletteki tek hue: canli isareti. Baska hicbir yerde kullanma -
   her yerde kullanilan bir renk hicbir sey soylemez. */
.wires h4::before {
  content: ''; width: 7px; height: 7px; border-radius: 50%;
  background: var(--live); flex: 0 0 auto;
}
.wires li { list-style: none; padding: 12px 0; border-top: 1px solid var(--line-2); font-size: 14.5px; line-height: 1.45; }
.wires li:first-child { border-top: 0; padding-top: 0; }
.wires ul { margin: 0; padding: 0; }
.wires .meta { display: block; font-size: 11.5px; color: var(--ink-3); margin-top: 5px; }

/* ---------- Newsletter promo ----------
   The one raised block (DESIGN.md section 4): --bg-2 fill, hairline, a 2px gold
   rule on top. It replaces the shared template's inverted (white) slab. */
.promo {
  background: var(--bg-2); color: var(--ink); padding: var(--space-s);
  border: 1px solid var(--line); border-top: 2px solid var(--gold); border-radius: var(--radius);
}
.promo h3 { font-size: 1.5rem; margin: 0 0 10px; color: inherit; }
.promo p { font-size: .875rem; line-height: 1.6; margin: 0 0 8px; color: var(--ink-2); }
.promo ul { padding-left: 18px; margin: 14px 0 18px; font-size: .84rem; color: var(--ink-2); }
.promo li { margin-bottom: 6px; }
.promo-wrap { max-width: 720px; }

/* Sign-up form inside .promo. Colour is never the only state signal - the
   message text says what happened. */
.promo-form { margin: var(--space-xs) 0 0; }
.promo-form label { display: block; font-size: 12px; font-weight: 700; letter-spacing: .04em; margin: 0 0 6px; }
.promo-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; }
.promo-form input[type="email"] {
  font-family: inherit; font-size: 16px; /* 16px: iOS Safari zooms smaller fields */
  color: var(--ink); background: var(--bg); border: 1px solid var(--line);
  border-radius: var(--radius-s); padding: 0 12px; min-height: 46px; min-width: 0; width: 100%;
}
.promo-form input[type="email"]:hover { border-color: var(--ink-3); }
.promo-form input[type="email"]:focus-visible { border-color: var(--gold); }
.promo-form input[type="email"][aria-invalid="true"] { border-color: var(--warn); }
.promo .promo-form .btn-cta[disabled] { opacity: .55; cursor: default; transform: none; }
.promo .promo-msg { font-size: 13px; line-height: 1.5; margin: 10px 0 0; }
.promo .promo-msg:empty { display: none; }
.promo .promo-msg-bad { font-weight: 700; }
.promo p.promo-fine { font-size: 12px; margin: 10px 0 0; }

/* ---------- Bolum bloklari ----------
   Bloklar renkli seritlerle degil, aralarina konan <hr class="rule"> ile ayrilir. */
.band { padding: var(--space-l) 0; }
/* .nl-card artik kutu degil: zemin/kenarlik/padding yok, ayrac izgaradan gelir. */
.nl-card .code {
  font-family: var(--font-sans); font-size: 10px; font-weight: 700; letter-spacing: .1em;
  text-transform: uppercase; color: var(--ink-invert);
  background: var(--ink); padding: 4px 10px; border-radius: var(--radius-s);
  display: inline-block; margin-bottom: 10px;
}
.nl-card h3 { font-size: 19px; margin: 0 0 8px; line-height: 1.24; }
.nl-card p { font-size: 13.5px; line-height: 1.6; color: var(--ink-2); margin: 0; }

.vid { position: relative; }
/* Play dugmesi ve sure rozeti karta degil GORSELE sabitlenir; kart gorselden
   uzun oldugu icin rozet kartin altina dusuyordu. */
.vid > a { position: relative; display: block; }
.vid img { aspect-ratio: 3/2; object-fit: cover; }
.vid .play {
  position: absolute; inset: 0; display: flex; align-items: center; justify-content: center;
}
.vid .play span {
  width: 52px; height: 52px; border-radius: 50%; background: rgba(0, 0, 0, .55);
  backdrop-filter: blur(4px);
  border: 2px solid rgba(255, 255, 255, .9); color: #fff;
  display: flex; align-items: center; justify-content: center;
  font-size: 16px; padding-left: 3px;
  transition: transform var(--dur) var(--ease), background var(--dur) var(--ease);
}
.vid > a:hover .play span { transform: scale(1.12); background: var(--gold); color: var(--on-gold); }
.vid .dur {
  position: absolute; right: 10px; bottom: 10px; background: rgba(0, 0, 0, .74); color: #fff;
  font-size: 11px; font-weight: 600; padding: 3px 9px; border-radius: var(--radius-s);
}
/* Tiklandiginda posterin yerine gecen oynatici (adim 41a). Poster ile AYNI
   olculeri tutuyor - 3/2, tam genislik - yoksa kart tiklama aninda ziplar ve
   seritteki komsu kartlari kaydirir. Zemin siyah cunku klip yuklenirken o
   kare bos kaliyor ve --bg-2 acik temada beyaz bir flas veriyordu. */
.klip-oynatici {
  display: block; width: 100%; aspect-ratio: 3/2; background: #000;
  border-radius: var(--radius);
}
.vid h4 { font-size: 15.5px; line-height: 1.26; margin: 10px 0 4px; }
.vid .meta { font-size: 11.5px; color: var(--ink-3); }

/* ---------- Makale sayfasi ---------- */
/* ---- Story page: DESIGN.md sections 4-5. The markup contract is shared with
   opencms/site/story.jsp (server render) and site.js articleHTML (client
   render): header.story-head > p.story-strip + h1 + p.lede + p.story-byline,
   then figure.article-figure, then div.article-body. Keep the three in step. */
.article { max-width: 1100px; margin: 0 auto; padding: var(--space-m) 0 var(--space-s); }
.story-head { max-width: 860px; }
/* The desk strip: one hairline-ruled row, kicker (gold) left, time right. */
.story-strip {
  display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap;
  gap: 4px 16px; min-height: 44px; margin: 0 0 var(--space-s); padding: 6px 0;
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
.story-strip .kicker { border: 0; padding: 0; margin: 0; background: none; color: var(--gold); }
.story-time { font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-2); }
.article h1 {
  font-size: clamp(1.875rem, 1.3rem + 2.4vw, 3rem); line-height: 1.12; margin: 0 0 16px;
  letter-spacing: -.015em;
}
.article .lede {
  font-family: var(--font-display); font-size: 1.25rem; line-height: 1.45;
  color: var(--ink-2); margin: 0 0 var(--space-s);
}
/* Ruled byline: a hairline above, items joined by a middle dot. No avatar, no
   author card (the shared template's authorbox is gone). */
.story-byline {
  display: flex; flex-wrap: wrap; align-items: center; margin: 0 0 var(--space-m);
  padding-top: 14px; border-top: 1px solid var(--line);
  font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-3);
}
.story-byline > * + *::before { content: '\00b7'; margin: 0 .65em; color: var(--ink-3); }
.story-byline .author-name { color: var(--ink); font-weight: 700; }
.article-end-text { flex: 1; min-width: 220px; }
.empty-state { padding: var(--space-l) 0; color: var(--ink-3); }

.promo + .wires, .wires + .promo { margin-top: var(--space-s); }

.article-hero {
  aspect-ratio: 16/9; object-fit: cover; width: 100%;
  border-radius: var(--radius); margin-bottom: var(--space-s);
}
/* Hero gorsel + fotograf kredisi (ROADMAP #14). Tarayicinin <figure> icin
   verdigi 1em 40px varsayilan bosluk resmi metin sutunundan iceri kaydirirdi,
   o yuzden sifirlaniyor. Alt bosluk figure'e geciyor: gorselin kendi
   margin-bottom'u kalsaydi kredi satiri resimden bir --space-s uzakta durur,
   ustteki resimle degil asagidaki paragrafla ilgili gorunurdu. */
.article-figure { margin: 0 0 var(--space-m); }
.article-figure .article-hero { margin-bottom: 6px; }
.photo-credit { margin: 0; font-size: 12px; line-height: 1.5; color: var(--ink-3); }
/* Reading column (DESIGN.md section 3): serif 19px/1.7 at 720px, left aligned,
   never justified. The hero figure above it is wider on purpose. */
.article-body, .share, .article-end, .tagrow { max-width: 720px; }
.article-body {
  font-family: var(--font-display); font-size: 1.1875rem; line-height: 1.7;
  color: var(--ink-2);
}
.article-body p { margin: 0 0 22px; }
.article-end {
  margin-top: var(--space-m); padding: var(--space-s);
  background: var(--bg-2); border: 1px solid var(--line); border-radius: var(--radius);
  display: flex; align-items: center; gap: 18px; flex-wrap: wrap;
}
.article-end h2 { font-size: 19px; margin: 0 0 4px; }
.article-end p { color: var(--ink-2); font-size: 13.5px; margin: 0; }
.tagrow { display: flex; flex-wrap: wrap; gap: 8px; margin: var(--space-s) 0; }
.tag {
  font-family: var(--font-sans); font-size: 12px; font-weight: 600;
  letter-spacing: 0; text-transform: none;
  background: none; border: 1px solid var(--line); padding: 0 12px;
  display: inline-flex; align-items: center; min-height: 44px;
  border-radius: var(--radius-s); color: var(--ink-2);
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease),
              border-color var(--dur) var(--ease);
}
.tag:hover { background: var(--gold); border-color: var(--gold); color: var(--on-gold); }

/* Share row (after the article body). Monochrome like the rest of the
   palette - no network brand colours (HANDOFF 11). 40px targets clear the
   24px WCAG 2.2 minimum comfortably on touch screens. */
.share {
  display: flex; align-items: center; flex-wrap: wrap; gap: 10px 14px;
  margin: var(--space-s) 0; padding: 14px 0;
  border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
}
.share-label {
  font-family: var(--font-sans); font-size: 12px; font-weight: 600;
  letter-spacing: .1em; text-transform: uppercase; color: var(--ink-2); margin: 0;
}
.share-list { display: flex; flex-wrap: wrap; gap: 8px; list-style: none; margin: 0; padding: 0; }
.share-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 44px; height: 44px; padding: 0; cursor: pointer;
  background: none; border: 1px solid var(--line); border-radius: var(--radius-s);
  color: var(--ink-2); font: inherit;
  transition: background var(--dur) var(--ease), color var(--dur) var(--ease),
              border-color var(--dur) var(--ease);
}
.share-btn:hover { background: var(--gold); border-color: var(--gold); color: var(--on-gold); }
.share-btn:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
.share-status { font-size: 13px; color: var(--ink-2); }
.share-status:empty { display: none; }

.article-related {
  max-width: 1100px; margin: 0 auto; padding: var(--space-l) 0 var(--space-xl);
}
/* Block title (DESIGN.md section 4): small caps label with a hairline running out to the right. */
.block-title {
  display: flex; align-items: center; gap: 14px; margin: 0 0 var(--space-xs);
  font: 700 .75rem/1.2 var(--font-sans); letter-spacing: .14em; text-transform: uppercase; color: var(--ink);
}
.block-title::after { content: ''; flex: 1; height: 1px; background: var(--line); }
/* Desk list: headline rows with a hairline between them, no images. */
.desk-list { list-style: none; margin: 0; padding: 0; max-width: 720px; }
.desk-item + .desk-item { border-top: 1px solid var(--line-2); }
.desk-item a {
  display: grid; grid-template-columns: auto minmax(0, 1fr); column-gap: 14px; row-gap: 2px;
  align-items: baseline; min-height: 44px; padding: 12px 0;
}
.desk-item .kicker { border: 0; padding: 0; margin: 0; color: var(--gold); grid-row: 1 / span 2; }
.desk-title { font-family: var(--font-display); font-size: 1.1875rem; font-weight: 700; line-height: 1.25; color: var(--ink); }
.desk-item time { grid-column: 2; font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-3); }
.desk-item a:hover .desk-title { text-decoration: underline; text-decoration-color: var(--gold); text-underline-offset: .2em; }

/* ---------- Bolum sayfasi ---------- */

/* No coloured band (DESIGN.md section 8): a page heading is spacing and type, the
   hairline below it is the only divider. */
.pagehead { padding: var(--space-m) 0; border-bottom: 1px solid var(--line); }
.pagehead h1 {
  font-size: clamp(28px, 3.4vw, 40px); margin: 0;
  display: flex; align-items: center; gap: 16px;
}
/* Ulke sayfasinin basligindaki bayrak: satir yuksekligiyle olceklenir,
   basligin yaninda durur - kucuk bir rozet degil, baslik kadar agir. */
.bayrak-buyuk { width: 54px; height: 36px; }
.pagehead p { color: var(--ink-3); margin: 8px 0 0; font-size: 15px; }
/* ---- F7 pages (markup contract with the section.html session) ----
   Desk / country / search heading: a ruled strip (kicker left, count right)
   then the h1, no coloured band. */
.pagehead.desk-head { background: none; border-bottom: 0; padding: var(--space-m) 0 var(--space-s); }
.desk-head .story-strip { margin-bottom: var(--space-s); }
.desk-count { font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-2); }
.desk-head h1 { font-size: clamp(1.875rem, 1.3rem + 2.4vw, 3rem); letter-spacing: -.015em; line-height: 1.12; }
.desk-head .lede { font-family: var(--font-display); font-size: 1.25rem; line-height: 1.45; color: var(--ink-2); margin: 12px 0 0; max-width: 860px; }
/* ONE column of headline rows: no aside, no rail. */
.desk-list-wide { max-width: 860px; padding-bottom: var(--space-xl); }
/* Masthead page: staff as hairline rows (no avatars, no author cards). */
.staff-list { list-style: none; margin: 0 0 var(--space-m); padding: 0; max-width: 720px; }
.staff-item { padding: 14px 0; border-top: 1px solid var(--line-2); }
.staff-item .author-name { color: var(--ink); font-weight: 700; }
.staff-item .byline-city { font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-3); }
.staff-item .byline-city::before { content: '\00b7'; margin: 0 .65em; }
/* Generic F7 bits: a block heading with a count on the right (the .block-title
   hairline still fills the gap), a plain vertical-spacing block instead of the
   old coloured bands, the page lede on text pages, and a margin reset. */
.block-head { display: flex; align-items: center; gap: 14px; margin: 0 0 var(--space-xs); }
.block-head .block-title { flex: 1; margin: 0; }
.page-block { padding: var(--space-l) 0 0; }
.pagehead .lede { font-family: var(--font-display); font-size: 1.25rem; line-height: 1.45; color: var(--ink-2); margin: 12px 0 0; max-width: 860px; }
.byline-flat { margin: 0; }

/* ---------- Home: the Sudan briefing board (DESIGN.md section 5) ----------
   Markup from site.js boardHTML() / stories.jsp ssBoard(). No right rail, no
   three-column block, no bento: a lead, four desk tiles, a strip for the
   neighbours, a row of smaller desks, the latest list. */
.board { padding: var(--space-m) 0 0; }
.board > .lead, .board > section { margin-bottom: var(--space-l); }
.lead {
  display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
  gap: var(--space-m); align-items: center;
}
.lead-noimg { display: block; max-width: 860px; }
.lead-img { display: block; overflow: hidden; background: var(--bg-3); border-radius: var(--radius); }
.lead-img img { display: block; width: 100%; aspect-ratio: 3 / 2; object-fit: cover; transition: transform .5s var(--ease); }
.lead-img:hover img { transform: scale(1.02); }
.lead .kicker { border: 0; padding: 0; margin: 0 0 12px; background: none; color: var(--gold); }
.lead h1 {
  font-size: clamp(2rem, 1.2rem + 3.2vw, 3.5rem); line-height: 1.08; letter-spacing: -.015em; margin: 0 0 14px;
}
.lead h1 a {
  background: linear-gradient(currentColor, currentColor) 0 100% / 0 2px no-repeat;
  transition: background-size .3s var(--ease);
}
.lead h1 a:hover, .lead h1 a:focus-visible { background-size: 100% 2px; }
.lead .dek { font-family: var(--font-display); font-size: 1.25rem; line-height: 1.45; color: var(--ink-2); margin: 0 0 14px; max-width: 60ch; }

.tiles { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); border-top: 1px solid var(--line); }
.tile { padding: var(--space-s) var(--space-s) var(--space-s) 0; }
.tile + .tile { border-left: 1px solid var(--line); padding-left: var(--space-s); }
.tile-title { font: 700 .75rem/1.2 var(--font-sans); letter-spacing: .14em; text-transform: uppercase; margin: 0 0 8px; }
.tile-title a { display: inline-flex; align-items: center; min-height: 44px; color: var(--gold); }
.tile-title a:hover { color: var(--gold-hi); }
.tile-lead { font-size: 1.5rem; line-height: 1.2; margin: 0 0 8px; }
.tile-lead a { display: flex; align-items: center; min-height: 44px; }
.tile .dek { font-size: .9375rem; line-height: 1.5; color: var(--ink-2); margin: 0 0 8px; }
.tile .byline { margin: 0; }
.tile-heads { list-style: none; margin: 14px 0 0; padding: 0; }
.tile-heads li { border-top: 1px solid var(--line-2); padding: 10px 0; }
.tile-heads a {
  display: flex; align-items: center; min-height: 44px;
  font-family: var(--font-display); font-weight: 700; line-height: 1.3;
}
.tile-heads a:hover { color: var(--gold-hi); }
.tile-heads time { display: block; font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-3); }

.border-list { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--line); }
.border-row {
  display: grid; grid-template-columns: 220px minmax(0, 1fr) auto; align-items: center;
  column-gap: var(--space-s); border-bottom: 1px solid var(--line-2);
}
.border-country {
  display: inline-flex; align-items: center; gap: 10px; min-height: 44px;
  font: 700 .8125rem/1.2 var(--font-sans); letter-spacing: .06em; text-transform: uppercase; color: var(--ink-2);
}
.border-country:hover { color: var(--gold-hi); }
.border-head { display: flex; align-items: center; min-height: 44px; font-family: var(--font-display); font-weight: 700; line-height: 1.3; }
.border-head:hover { color: var(--gold-hi); }
.border-row time { font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-3); white-space: nowrap; }

.desk-cols { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-m); }
.desk-col-title { margin: 0 0 4px; font: 700 .75rem/1.2 var(--font-sans); letter-spacing: .14em; text-transform: uppercase; }
.desk-col-title a { display: inline-flex; align-items: center; min-height: 44px; color: var(--gold); }
.desk-col-title a:hover { color: var(--gold-hi); }
.desk-item.plain a { grid-template-columns: minmax(0, 1fr); }
.desk-item.plain time { grid-column: 1; }

.latest-list { list-style: none; margin: 0; padding: 0; max-width: 860px; }
.latest-list li { border-top: 1px solid var(--line-2); }
.latest-list a {
  display: grid; grid-template-columns: 7.5rem minmax(0, 1fr); column-gap: var(--space-s);
  align-items: baseline; min-height: 44px; padding: 12px 0;
}
.latest-list time { font: 400 .8125rem/1.4 var(--font-sans); color: var(--ink-3); }
.latest-title { font-family: var(--font-display); font-size: 1.1875rem; font-weight: 700; line-height: 1.25; }
.latest-list a:hover .latest-title { text-decoration: underline; text-decoration-color: var(--gold); text-underline-offset: .2em; }

@media (max-width: 1024px) {
  .lead { grid-template-columns: 1fr; }
  .tiles { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .tile { padding-right: var(--space-s); }
  .tile:nth-child(odd) { border-left: 0; padding-left: 0; }
  .tile:nth-child(n+3) { border-top: 1px solid var(--line); }
  .desk-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .tiles { grid-template-columns: 1fr; }
  .tile, .tile + .tile { border-left: 0; padding-left: 0; padding-right: 0; }
  .tile + .tile { border-top: 1px solid var(--line); }
  .border-row { grid-template-columns: 1fr; padding: 4px 0 10px; }
  .desk-cols { grid-template-columns: 1fr; }
  .latest-list a { grid-template-columns: 1fr; row-gap: 2px; }
}
.staff-bio { display: block; margin-top: 4px; font-family: var(--font-display); color: var(--ink-2); line-height: 1.5; }
.listrow { display: block; padding: var(--space-s) 0; }
.listrow + .listrow { border-top: 1px solid var(--line-2); }
.listrow h3 { font-size: 1.5rem; line-height: 1.2; margin: 8px 0 0; }

/* ---------- Alt bilgi ---------- */
footer.site { background: var(--dark); color: var(--on-dark); padding: var(--space-xl) 0 var(--space-m); }
/* Alt bilgi TEMADAN BAGIMSIZ koyu (--dark: #000). Marka kilidi bu yuzden
   kendi rengini burada aliyor:
   - .logo b global olarak var(--ink) veriyor; acik temada bu SIYAH, yani
     kelime siyah zeminde siyah kaliyordu. Renk .logo'ya yaziliyor ki
     isaretin currentColor'i ile kelime ayni beyazi paylassin, b de onu
     miras alsin (kendi kurali daha ozgul oldugu icin acikca iptal ediliyor).
   - em de ayni sebepten --ink-3 yerine --on-dark-2 aliyor. Koyu temada iki
     token ayni degerde (#8b8d93), yani orada hicbir sey degismiyor; acik
     temada --ink-3 siyah zeminde 4.0:1'e dusuyordu, --on-dark-2 6.3:1 veriyor
     (AA, degismez kural 3). */
footer.site .logo { color: #fff; }
footer.site .logo b { color: inherit; }
footer.site .logo b em { color: var(--on-dark-2); }
footer.site a { color: var(--on-dark); }
footer.site a:hover { color: #fff; }
footer.site .cols { display: grid; grid-template-columns: 1.4fr 1fr 1fr 1fr; gap: 30px; }
/* h2, not h5: the footer follows the page's h1/h2/h3, and jumping to h5
   skips levels (Lighthouse heading-order, ROADMAP 7.1). Looks unchanged. */
footer.site h2 {
  color: #fff; font-family: var(--font-sans); font-weight: 700;
  font-size: 12px; line-height: 1.4; letter-spacing: .1em; text-transform: uppercase; margin: 0 0 14px;
}
footer.site ul { list-style: none; padding: 0; margin: 0; font-size: 13.5px; }
footer.site li { margin: 0; }
/* 44px rows: the footer links are the thumb targets at the end of every page. */
footer.site li a { display: inline-flex; align-items: center; min-height: 44px; min-width: 44px; }
footer.site .fine {
  border-top: 1px solid rgba(255, 255, 255, .12); margin-top: 30px; padding-top: 18px;
  font-size: 12.5px; color: var(--on-dark-2); display: flex; gap: 16px; flex-wrap: wrap;
}
/* ---------- Duyarli ---------- */
@media (max-width: 1000px) {
  /* The date goes and the search box may shrink: the centred wordmark
     (~305px) plus two equal side columns needs the right column to hold the
     240px box, which is true down to 900px (see the next query). */
  .topdate { display: none; }
  .search { min-width: 0; width: 240px; }
  .search input { min-width: 0; }
  .mega-cols { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .mega-col-wide { grid-column: span 3; }
  
  .cards-3{ grid-template-columns: repeat(2, minmax(0, 1fr)); }
  footer.site .cols { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 900px) {
  /* Below 900px the three columns no longer fit: the wordmark keeps the first
     row and the search box takes the second, centred. */
  .masthead .wrap { grid-template-columns: 1fr; justify-items: center; gap: 16px; }
  .brand { grid-column: 1; }
  .masthead .search { justify-self: center; width: 100%; max-width: 480px; }
}
@media (max-width: 700px) {
  .masthead .wrap { padding-top: 16px; padding-bottom: 14px; gap: 14px; }
  /* The nowrap motto (~340px with its rules) was wider than the 327px a 375px
     phone leaves, so it widened the grid column and pushed the wordmark off
     centre. On phones it wraps, without the flanking rules. */
  .brand { min-width: 0; max-width: 100%; }
  .brand .motto { font-size: 10px; letter-spacing: .14em; white-space: normal; }
  .brand .motto::before, .brand .motto::after { display: none; }
  .masthead .wrap { grid-template-columns: minmax(0, 1fr); }

  /* Menu: baslik seridi yatay kayar, mega panel tek sutuna duser ve
     dokunmayla (:focus-within) acilir; panel kendi icinde kayar. */
  .nav-list { overflow-x: auto; gap: 18px; justify-content: flex-start; }
  /* Ulkeler dar ekranda kayan seridin sonunda kalip gorunmez oluyordu.
     Konumlandirilmis ata .mainnav .wrap oldugu icin buton kaydirma
     kutusundan cikar ve sagda sabit durur; serit altindan kayar. */
  .mainnav .wrap { position: relative; padding-right: 122px; }
  .nav-sag {
    position: absolute; right: 24px; top: 0; bottom: 0; margin: 0;
    display: flex; align-items: center; background: var(--bg);
    padding-left: 14px; border-left: 0;
  }
  /* The strip scrolls under this button. The old cue was a black box-shadow,
     invisible on the black ground, so the last item read as cut off
     ("NEWSLETT") rather than scrollable. A fade into the ground reads as
     "more this way". */
  .nav-sag::before {
    content: ''; position: absolute; right: 100%; top: 0; bottom: 0; width: 36px;
    background: linear-gradient(to right, transparent, var(--bg)); pointer-events: none;
  }
  .mega { max-height: 72vh; overflow-y: auto; padding: var(--space-s) 0; }
  .mega-cols { grid-template-columns: 1fr; gap: var(--space-s); }
  .mega-col-wide { grid-column: span 1; }
  .mega-col { border-top: 1px solid var(--line-2); padding-top: 14px; }
  .mega-col:first-child { border-top: 0; padding-top: 0; }

  .cards-3{ grid-template-columns: 1fr; row-gap: var(--space-m); }
  .listrow { grid-template-columns: 1fr; }
  .mini { grid-template-columns: 96px minmax(0, 1fr); }
  .masthead .search { max-width: none; }
  /* The wordmark is nowrap and ~9.23x its font size wide, so a fixed 30px
     needed 277px: more than the 235px a 320px phone leaves beside the mark,
     and more than the 275px at 360px. It pushed the page sideways. It now
     scales with the viewport: 100vw minus the 48px wrap padding and the 37px
     mark + gap, over 9.6 for slack. 30px from ~375px up, 24.5px at 320px. */
  .logo b { font-size: min(30px, calc((100vw - 85px) / 9.6)); }
  .logo-mark { width: 27px; height: 27px; }
  .logo { gap: 10px; }

  /* The box's 7px padding was outside the input, so a tap near the top or
     bottom of the visible box focused nothing (a 21px input in a 42px box).
     The input takes the padding and gives it back as a negative margin: its
     tappable box grows to 35px while the layout, and the box's 42px height
     (set by the icon), stay exactly as they were. Moving the padding off the
     box instead shrank it to 37px and the whole header by 4px - measured. */
  .search input { padding: 7px 0; margin: -7px 0; }

  /* Footer: the brand column's minimum width is the nowrap wordmark (315px),
     so "1fr 1fr" became 315px + 68px + gap inside a 327px wrap and pushed
     Sections and Company off-screen. Every page scrolled sideways at 375px
     (scrollWidth 438), and a phone then zooms the whole page out to fit. The
     brand takes its own row; the link columns share the rows below. */
  footer.site .cols { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
  footer.site .cols > :first-child { grid-column: 1 / -1; }
  /* 18px-tall links 7px apart; the padding makes each a 30px tap target. */
  footer.site li { margin-bottom: 0; }
  footer.site li a { display: inline-block; padding: 6px 0; }

}

/* ==========================================================================
   Yerlesim revizyonu - simetrik kart dizisi yerine asimetrik editoryal yapi
   ========================================================================== */

/* ---------- Dispatch strip ----------
   Replaces the red scrolling "Breaking" ticker (2026-10-09). Quiet and static:
   a label, the three newest stories as time + headline cells divided by
   hairlines, and a link to the wire page. No red block - the only --live
   element left is the pulsing dot in the label (DESIGN.md: "wire pulse"). */
.dispatch { background: var(--bg-2); border-bottom: 1px solid var(--line); }
.dispatch .wrap { display: flex; align-items: stretch; gap: 0; }
.dispatch-label {
  flex: 0 0 auto; display: flex; align-items: center; gap: 9px; margin: 0;
  padding-right: 20px; font: 700 11px/1 var(--font-sans); letter-spacing: .16em;
  text-transform: uppercase; color: var(--ink); white-space: nowrap;
}
.dispatch-dot {
  width: 7px; height: 7px; border-radius: 50%; background: var(--live); flex: 0 0 auto;
  animation: dot-pulse 2.4s var(--ease) infinite;
}
.dispatch-list {
  flex: 1; min-width: 0; display: flex; list-style: none; margin: 0; padding: 0;
}
.dispatch-list li { flex: 1 1 0; min-width: 0; border-left: 1px solid var(--line); }
.dispatch-list a {
  display: flex; align-items: baseline; gap: 10px; height: 100%; min-height: 52px;
  padding: 9px 18px; font-size: 13px; line-height: 1.35; color: var(--ink-2);
}
.dispatch-list a:hover { color: var(--ink); }
.dispatch-list time {
  flex: 0 0 auto; font: 700 10.5px/1.35 var(--font-sans); letter-spacing: .06em;
  text-transform: uppercase; color: var(--ink-3); white-space: nowrap;
}
.dispatch-title {
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden; min-width: 0;
}
.dispatch-list a:hover .dispatch-title { text-decoration: underline; text-underline-offset: 3px; }
.dispatch-all {
  flex: 0 0 auto; display: flex; align-items: center; min-height: 44px; padding-left: 18px;
  border-left: 1px solid var(--line); font: 700 11px/1 var(--font-sans);
  letter-spacing: .12em; text-transform: uppercase; color: var(--ink); white-space: nowrap;
}
.dispatch-all:hover { color: var(--gold-hi); }
@media (max-width: 1000px) {
  /* Two cells fit; the third would squeeze headlines to a few words. */
  .dispatch-list li:nth-child(n+3) { display: none; }
}
@media (max-width: 700px) {
  /* Phone: the label and "All" go, the strip becomes one swipeable row of
     cells wide enough to read (the list scrolls, the page does not). */
  .dispatch-label, .dispatch-all { display: none; }
  .dispatch-list { overflow-x: auto; scroll-snap-type: x proximity; scrollbar-width: none; }
  .dispatch-list::-webkit-scrollbar { display: none; }
  .dispatch-list li:nth-child(n+3) { display: block; }
  .dispatch-list li { flex: 0 0 78%; scroll-snap-align: start; }
  .dispatch-list li:first-child { border-left: 0; }
}

/* Reserve the header's height until site.js draws it (ROADMAP 7.1).
   #chrome-top is empty in the served HTML and chrome() fills it only after
   the JSON data loads, while <main>'s static skeleton paints at once - so the
   header arrived 208px tall ABOVE content already on screen and pushed it
   all down. Lighthouse desktop measured CLS 1.0 on / and 0.78 on a story.
   Heights measured 2026-09-10 in iframes of each width: 208 at 701px and up,
   250 at 412-700, 270 at 320-360. :empty stops matching the moment chrome()
   writes into the div, so the real header always wins. If the header changes
   height (a new row, the dispatch strip gone), re-measure and update these four.
   Re-measured 2026-10-09 after the centred-masthead / dispatch-strip
   redesign: 210 above 900px, 272 at 701-900 (search on its own row),
   257 at 341-700, 273 at 340 and below. The old 172/214/234 were for the
   one-row masthead and the scrolling ticker. */
#chrome-top:empty { min-height: 210px; }
@media (max-width: 900px) { #chrome-top:empty { min-height: 272px; } }
@media (max-width: 700px) { #chrome-top:empty { min-height: 257px; } }
@media (max-width: 340px) { #chrome-top:empty { min-height: 273px; } }

/* ...and keep <main> unpainted until the same moment. Reserving the header
   alone halved CLS (desktop 1.0 -> 0.52); the rest was <main>'s own static
   skeleton - section headings, empty boxes, on a story the server-rendered
   text - painting first and then being pushed down as the data filled in
   above it. Every page calls chrome() and fills its content in the SAME task,
   so while #chrome-top is still empty the content is not ready either; an
   invisible element's movement is not a layout shift.
   The animation is the safety net: if JavaScript or the data fails,
   visibility comes back after 3s by itself, so no page can stay blank. The
   500 page ships a non-empty #chrome-top on purpose and is never hidden. */
#chrome-top:empty ~ main { visibility: hidden; animation: ucs-reveal 0s linear 3s forwards; }
@keyframes ucs-reveal { to { visibility: visible; } }
@media (prefers-reduced-motion: reduce) {
  .dispatch-dot { animation: none; }
}

/* ---------- Blok basliklari: numarali, saga hizali eylem ---------- */

/* ---------- On sayfa: gazete on sayfasi ----------
   Fotografin uzerine binen tam genislikte manset kaldirildi. Basligin
   okunurlugu her seferinde fotografa bagliydi ve perdeyi koyulastirmaktan
   baska caresi yoktu. Yeni duzen: solda gorsel + ALTINDA olabildigince buyuk
   baslik, sagda ince bir cizgiyle ayrilmis "Latest" sutunu, altta uc metin
   sutunu. Kutu yok, golge yok, koseler duz - ayrimi cizgiler yapiyor. */
.front { padding: var(--space-m) 0 var(--space-l); }

.byline-ters { color: rgba(255, 255, 255, .72); }
.byline-ters b { color: #fff; }

/* ---------- Bento: kasitli olarak esit olmayan kartlar ---------- */

/* ---------- Yatay kayan serit ---------- */
/* Dispatch seridi: HER IKI temada da koyu bant.
   Onceki tanim --ink zeminliydi, yani "sayfanin tersi": acik temada siyah,
   koyu temada BEYAZ. Siyah sayfada bu, serit boyunca dev bir beyaz levha
   uretiyordu ve ayni sayfadaki bulten kutusu da ters donuk oldugu icin iki
   beyaz blok yan yana dusuyordu. Sayfada tek bir ters blok kaliyor (.promo);
   bu serit artik tam siyah bir yuzey - koyu temada sayfadan (#0a0a0b) bir
   ton daha koyu, acik temada eskisi gibi koyu bant. */
.band-koyu { background: var(--dark); color: var(--on-dark); }
.band-koyu h1,
.band-koyu h2,
.band-koyu h3,
.band-koyu h4{ color: var(--gold); }

.band-koyu .byline, .band-koyu .byline-ters { color: var(--on-dark-2); opacity: 1; }
.rail-pencere { overflow-x: auto; scroll-snap-type: x mandatory; padding-bottom: 6px; }
.rail {
  display: grid; grid-auto-flow: column; grid-auto-columns: minmax(260px, 300px);
  gap: var(--space-s); padding: 0 max(24px, calc((100vw - var(--wrap)) / 2 + 24px));
}
.rail-kart { scroll-snap-align: start; }
.rail-kart h3 { font-size: 17px; margin: 12px 0 0; line-height: 1.25; }
.band-koyu .rail-kart h3 a { color: var(--gold); }
.band-koyu .rail-kart h3 a:hover { color: var(--on-dark); }

/* ---------- Akis + yapiskan yan kolon ---------- */

.yan { display: grid; gap: var(--space-s); align-content: start; position: sticky; top: 88px; }

/* ---------- Bulten izgarasi ---------- */
.nl-izgara { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-s); }
.nl-card {
  background: var(--card); border: 1px solid var(--line); border-radius: var(--radius);
  padding: 22px 24px; transition: border-color var(--dur) var(--ease), transform var(--dur) var(--ease);
}
.nl-card:hover { border-color: var(--gold); transform: translateY(-3px); }

/* ---------- Bulten kayit formu ---------- */
/* Sitedeki TEK form. Yer tutucu (placeholder) etiket yerine kullanilmiyor:
   yer tutucu yazilmaya baslaninca kayboluyor ve ekran okuyucularin bir kismi
   hic okumuyor - her alanin gorunur bir <label>'i var. */
.nl-form { display: grid; gap: var(--space-xs); max-width: 560px; margin: var(--space-s) 0 0; }
.nl-field { display: grid; gap: 8px; }
.nl-field > label { font-size: 13px; font-weight: 700; letter-spacing: .04em; color: var(--ink); }
.nl-form input[type="email"] {
  font-family: inherit; font-size: 16px; color: var(--ink);
  background: var(--card); border: 1px solid var(--line-2); border-radius: var(--radius-s);
  padding: 12px 14px; width: 100%;
  transition: border-color var(--dur) var(--ease);
}
/* 16px kucultulmuyor: iOS Safari 16px'ten kucuk bir alana odaklaninca sayfayi
   otomatik yakinlastiriyor ve geri uzaklastirmiyor. */
.nl-form input[type="email"]:hover { border-color: var(--gold); }
.nl-form input[type="email"][aria-invalid="true"] { border-color: var(--warn); }

/* fieldset/legend, not a div with a heading: a screen reader then announces
   "Which letters?" with every checkbox it reads out. legend cannot be a grid
   item reliably across engines, so the grid is the inner wrapper. */
.nl-fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.nl-fieldset legend {
  font-size: 13px; font-weight: 700; letter-spacing: .04em; color: var(--ink);
  padding: 0; margin: 0 0 10px;
}
.nl-choices { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; }
.nl-check {
  display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: 10px; align-items: start;
  font-size: 14px; color: var(--ink-2); cursor: pointer;
}
.nl-check input { width: 18px; height: 18px; margin: 1px 0 0; accent-color: var(--gold); }
.nl-check b { display: block; font-size: 12px; letter-spacing: .1em; text-transform: uppercase; color: var(--ink-3); }

.nl-form .btn-cta { justify-self: start; border: 0; cursor: pointer; font-family: inherit; }
.nl-form .btn-cta[disabled] { opacity: .55; cursor: default; transform: none; }

.form-note { font-size: 13px; line-height: 1.5; color: var(--ink-3); margin: 8px 0 0; }
/* Durum kutulari: renk TEK gosterge degil - her birinin metni de durumu
   soyluyor, renk korlugu icin (WCAG 1.4.1). */
.form-msg {
  font-size: 14px; line-height: 1.5; border-radius: var(--radius-s);
  padding: 12px 14px; border: 1px solid var(--line-2); margin: var(--space-xs) 0 0;
}
.form-msg-ok { border-color: var(--ok); color: var(--ink); background: var(--bg-3); }
.form-msg-bad { border-color: var(--warn); color: var(--ink); background: var(--bg-3); }
.form-msg:empty { display: none; }

@media (max-width: 700px) {
  .nl-choices { grid-template-columns: 1fr; }
}

/* ---------- Duyarli ---------- */
@media (max-width: 1000px) {
  /* Manset ve yan sutun alt alta; dikey cizgi yatay cizgiye doner. */
  
  
  
  
  
  
  .yan { position: static; }
  /* Buyuk kart ve sag sutun alt alta; sutun artik esit satirlara bolunmez */
  
  
  
  
}
@media (max-width: 700px) {
  
  
  .nl-izgara { grid-template-columns: 1fr; }
  
  
  
  
  /* The 1000px rule makes the third card span two columns. Left in force
     here, that created an implicit second column and squeezed cards 1 and 2
     side by side at 91px and 236px. Reset it, and the spacing it added. */
  
  
  .rail { grid-auto-columns: minmax(230px, 82vw); padding: 0 24px; }
}

/* Yatay kayan seritlerde kaydirma cubugunu gizle - kaydirma calismaya devam eder.
   Windows'ta kalici gorunen gri cubuk tasarimi bozuyordu. */
.rail-pencere,
.nav-list,
.cekmece-liste{
  scrollbar-width: none; -ms-overflow-style: none;
}
.cekmece-liste::-webkit-scrollbar,
.rail-pencere::-webkit-scrollbar,
.nav-list::-webkit-scrollbar{ width: 0; height: 0; }

/* Cipa ile hedeflenen kayitlar (wire notu, bulten, video, etkinlik).
   Bu kayitlarin kendi sayfasi yok; ticker / rail / mega menu bir liste
   sayfasindaki karta "#..." ile atliyor.

   scroll-margin-top SART: .mainnav sticky (top: 0) oldugu icin tarayicinin
   atladigi kart serigin ALTINDA kalirdi ve okuyucu neye atlandigini gormezdi.
   Deger serit yuksekliginden biraz buyuk.

   :target vurgusu, uzun bir listede hangi kayda gelindigini soyleyen tek
   isaret; rengi --brand'den geliyor, dosyada renk sabiti yok (HANDOFF 11). */
:target { scroll-margin-top: 96px; }
.listrow:target, .nl-card:target, .card:target, .rail-kart:target {
  outline: 2px solid var(--gold);
  outline-offset: 6px;
  border-radius: var(--radius);
}

/* ---------- Cerez rizasi (site.js, consent module) ----------
   Nothing analytics/marketing loads before a choice is saved. Reject and
   Accept are the same size and weight on purpose - neither is styled as the
   "expected" answer. .consent-prefs is hidden by default and toggled via
   inline style from site.js (display:grid), which is also why the class
   carries no display rule of its own here. */
.consent-banner {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 500;
  background: var(--dark-2); border-top: 1px solid var(--line);
  padding: var(--space-xs) 0;
}
.consent-banner .wrap { display: flex; flex-wrap: wrap; gap: var(--space-xs) var(--space-s); align-items: center; justify-content: space-between; }
.consent-banner p { margin: 0; font-size: 14px; line-height: 1.5; color: var(--on-dark); max-width: 620px; }
.consent-banner a { color: #fff; }
.consent-actions { display: flex; flex-wrap: wrap; gap: 10px; }
.consent-actions button {
  font-family: inherit; font-size: 14px; font-weight: 700; letter-spacing: .01em;
  padding: 10px 18px; border-radius: var(--radius-s); cursor: pointer;
}
.consent-actions .btn-cta { background: var(--gold); color: var(--on-gold); border: 0; }
.consent-actions .btn-cta:hover { background: var(--gold-hi); }
.consent-actions .btn-ghost { background: none; color: var(--on-dark); border: 1px solid var(--on-dark-2); }
.consent-actions .btn-ghost:hover { color: #fff; border-color: #fff; }
.consent-prefs { display: none; grid-template-columns: 1fr; gap: 12px; max-width: 620px; margin: var(--space-xs) auto 0; padding: var(--space-xs) 24px 0; border-top: 1px solid var(--line-2); }
.consent-prefs .nl-check { color: var(--on-dark); grid-template-columns: 18px minmax(0, 1fr); }
.consent-prefs .nl-check input:disabled { opacity: .6; }
.consent-prefs .nl-check b { display: block; color: #fff; }
.consent-prefs .nl-check span { display: block; }
.consent-reopen {
  position: fixed; left: var(--space-xs); bottom: var(--space-xs); z-index: 500;
  font-family: inherit; font-size: 12px; font-weight: 700; letter-spacing: .04em;
  color: var(--on-dark); background: var(--dark-2); border: 1px solid var(--line);
  border-radius: var(--radius-pill); padding: 8px 14px; cursor: pointer; opacity: .8;
}
.consent-reopen:hover { opacity: 1; }
@media (max-width: 700px) {
  .consent-banner .wrap { flex-direction: column; align-items: stretch; }
  .consent-actions { justify-content: stretch; }
  .consent-actions button { flex: 1; }
}

/* ---------- Late additions (F5 follow-ups) ---------- */
/* "All stories ->" in a block heading is a link: give it a real target. */
a.desk-count { display: inline-flex; align-items: center; min-height: 44px; }
a.desk-count:hover { color: var(--gold-hi); }

/* ---------- Motion: tier L1 (DESIGN.md section 7) ----------
   One soft entrance on first paint. It is set on the CONTAINER that persists
   (#board on the home page, .article on story pages), not on the cards: the
   scripts replace the cards' markup once the feed has loaded, and a card-level
   animation would restart and flash. Reduced motion is switched off globally in
   tokens.css. */
@keyframes rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }
.board, .article { animation: rise .45s var(--ease) both; }

/* ---------- Phone nav: fit, do not clip ----------
   Home (the logo is the home link) and All (every list page links to all
   stories) are hidden under 700px, and the labels are a little tighter, so
   Sudan / Topics / Newsletters fit beside the pinned Countries button instead
   of ending mid-word. */
@media (max-width: 700px) {
  .nav-list { gap: 14px; }
  .nav-list > li:first-child, .nav-list > li:nth-child(5) { display: none; }
  .nav-link { font-size: 12px; letter-spacing: .04em; }
}
