
/* D-07-11 (07-05, Task 1) — self-hosted font-face bloklari (asagida). Google Fonts CDN
   iki ucuncu taraf istegi yapiyordu (fonts.googleapis.com CSS + fonts.gstatic.com
   dosya), preconnect yalnizca ikincisine vardi (render-bloklayan ekstra DNS+TLS
   turu). Font DEGERLERI degismiyor (design-handoff.md:199, PROJECT.md), yalnizca
   teslim mekanizmasi. unicode-range degerleri Google Fonts CSS API'sinin GERCEK
   donusunden ayristirildi (PD-07-21) — elle yazilmadi. src: url() KOK-MUTLAK
   yazildi (/assets/fonts/...) cunku bu dosya build.mjs'in rewriteAssetPaths()
   hattindan GECMIYOR (statik olarak /assets/css/site.css'ten servis ediliyor,
   CSS url() gorece kendi konumuna cozulur — assets/css/ icinden "assets/fonts/"
   yazmak /assets/css/assets/fonts/'a coker, olcumle bulundu). */
/* PD-07-22 — fallback-metrik eslemesi OLCULEREK yapildi (tablo degerinden
   kopyalanmadi). Gercek headless Chrome'da (http sunucusu uzerinden,
   'Helvetica Neue' yigindan GECICI cikarilarak) olculdu: Archivo/sistem-
   sans-serif genislik orani 1,0032 (Archivo ~%0,32 daha genis) -> size-
   adjust=99,68%; canvas fontBoundingBoxAscent/Descent (100px, 'Hxgjpqy')
   fallback icin ascent=92%/descent=23%, Archivo icin ascent=88%/descent=21%
   -> ascent-override/descent-override FALLBACK degerlerine (92%/23%)
   ayarlandi, boylece swap anindaki satir kutusu degismiyor. Alti Archivo
   bloguna da AYNI degerler uygulandi (hhea/OS2 metrik tablosu agirliklar
   arasinda paylasilir, glif anahat degil). */
@font-face{font-family:Archivo;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/archivo-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;size-adjust:99.68%;ascent-override:92%;descent-override:23%}
@font-face{font-family:Archivo;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/archivo-400-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;size-adjust:99.68%;ascent-override:92%;descent-override:23%}
@font-face{font-family:Archivo;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/archivo-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;size-adjust:99.68%;ascent-override:92%;descent-override:23%}
@font-face{font-family:Archivo;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/archivo-500-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;size-adjust:99.68%;ascent-override:92%;descent-override:23%}
@font-face{font-family:Archivo;font-style:normal;font-weight:600;font-display:swap;src:url(/assets/fonts/archivo-600-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;size-adjust:99.68%;ascent-override:92%;descent-override:23%}
@font-face{font-family:Archivo;font-style:normal;font-weight:600;font-display:swap;src:url(/assets/fonts/archivo-600-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;size-adjust:99.68%;ascent-override:92%;descent-override:23%}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/ibmplexmono-400-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:400;font-display:swap;src:url(/assets/fonts/ibmplexmono-400-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/ibmplexmono-500-latin.woff2) format('woff2');unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"IBM Plex Mono";font-style:normal;font-weight:500;font-display:swap;src:url(/assets/fonts/ibmplexmono-500-latin-ext.woff2) format('woff2');unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}

*,*::before,*::after{box-sizing:border-box}
:root{--pady:64px;--maxw:1440px;--pad:max(var(--pady),calc((100% - var(--maxw))/2));--c3:repeat(3,1fr);--c2:1fr 1fr;--c4:repeat(4,1fr);--r:4px;--rb:6px;--ease:cubic-bezier(.2,.6,.2,1);--pat-ink:repeating-linear-gradient(90deg,rgba(24,48,72,.055) 0 1px,transparent 1px 36px);--pat-gold:repeating-linear-gradient(90deg,rgba(180,156,120,.11) 0 1px,transparent 1px 36px);--focus-color:#8A6A44}
body{margin:0;background:#F4F4F1;-webkit-font-smoothing:antialiased}
h1,h2,h3,h4,p{margin:0}
button{font:inherit;font-family:inherit;border:0;background:none;color:inherit;cursor:pointer;text-align:left}
a{color:#8A6A44;text-decoration:none}
/* A11Y-02 (07-02, Task 3) — odak halkasi rengi ARTIK TEK renk degil, ZEMINE
   GORE degisen bir custom property (--focus-color). OLCULDU: #B49C78
   (onceki tek deger) acik zemin (#F4F4F1/#FFFFFF) uzerinde yalnizca ~2.4:1
   veriyor -- WCAG 1.4.11 (non-text contrast, >=3:1) esiginin ALTINDA. Bu
   handoff'un KENDI kuralinin (design-handoff.md:129 -- #8A6A44 ACIK zemin,
   #B49C78 KOYU zemin) odak halkasina hic uygulanmamis olmasindan kaynaklanan
   bir hataydi (D-07-06'nin mega-menu hover duzeltmesiyle AYNI kok neden,
   farkli yuzey). --focus-color varsayilani ACIK-zemin degeri #8A6A44
   (5.4:1, handoff'ta zaten olculu); asagidaki KOYU-zemin konteynerlerde
   (footer, mega menu paneli, karusel kontrolleri) #B49C78'e YENIDEN
   TANIMLANIR. Yeni bir hex ICAT EDILMEDI -- ikisi de handoff'un mevcut
   paletinden. 09-03'te (D-09-18) `[data-carousel]` bu listeye EKLENDİ, çünkü
   artık kabın İÇİNDEKİ kontrol düğmeleri (oklar) kendi opak `#0F2233` kap
   zemini üzerinde duruyor — açık-zemin varsayılanı `#8A6A44` bu koyu zeminde
   ≈3.27:1'e düşüyordu (07-REVIEW HG-01). ⚠ Bu tek satırlık ekleme --focus-color
   custom property'sini [data-carousel]'in KENDİSİNE ve TÜM torunlarına
   miras bırakır — ÖLÇÜLDÜ, bu iki yerde YANLIŞ: (1) kabın kendi tabindex=0
   halkası section'ın açık zeminine karşı görünür kalmalı (kabın DIŞI hâlâ
   açık — ilk paragrafın gerekçesi kabın KENDİSİ için hâlâ geçerli), (2)
   nokta kümesi düğmeleri kendi opak `#B49C78` zemin ÜZERİNDE duruyor —
   brass halka brass zemin üzerinde 1:1 (görünmez). İki hedefli düzeltme
   aşağıda: kabın kendi odağı açık-zemin varsayılanına GERİ döner, nokta
   düğmeleri KENDİ koyu glif rengine (#1A1408, zaten kullanılan bir hex)
   geçer — 6.85:1 (aynı glif/zemin oranı, UI-SPEC tablosu). Ok düğmeleri
   hiçbir ek kural almadan [data-carousel]'den miras aldığı brass'ı korur
   (kendi ebeveyni kabın koyu `#0F2233` zemini, 6.26:1, ÖLÇÜLÜ HG-01 tablosu). */
a:focus-visible,button:focus-visible,[tabindex]:not([tabindex="-1"]):focus-visible,summary:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid var(--focus-color);outline-offset:3px}
footer,[data-megapanel],[data-carousel]{--focus-color:#B49C78}
[data-carousel]:focus-visible{--focus-color:#8A6A44}
[data-dot]{--focus-color:#1A1408}

@keyframes uvB{0%,28%{opacity:0}33%,61%{opacity:1}66%,100%{opacity:0}}
@keyframes uvC{0%,61%{opacity:0}66%,95%{opacity:1}100%{opacity:0}}
@keyframes uvClip{from{clip-path:inset(0 0 100% 0)}to{clip-path:inset(0 0 0 0)}}
@keyframes uvUp{from{opacity:0;transform:translateY(20px)}to{opacity:1;transform:none}}
@keyframes uvPanel{from{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:none}}

[data-reveal]{transition:transform .75s var(--ease)}
[data-pre]{transform:translateY(22px)}
[data-reveal="in"]{transform:none}

/* Harf harf başlık inişi (REV5-01). Mevcut [data-reveal] mekanizmasının aynı
   disiplinini izler: GÖRÜNÜRLÜK OPAKLIĞA BAĞLANMAZ (CLAUDE.md hareket kuralı) —
   yalnızca transform sürülür. Harfleri saran <span>'ler DOM'da KALICI DEĞİLDİR;
   assets/js/site.js animasyon biter bitmez başlığı orijinal metnine döndürür,
   bu yüzden a11y ağacında kalıcı bir harf yığını oluşmaz.
   ⚠ Maskeleme (overflow:hidden) descender'ları (g/y/p) keser; padding+negatif
   margin çifti alt tarafta alan açar ve düzeni AYNI yükseklikte tutar (CLS 0).
   ⚠ .uv-word inline-block + nowrap: harf başına <span> her harfi bir satır
   kırılma noktası yapardı ve kelimeler ortadan bölünürdü — kelime bütünlüğü
   bu sarmalayıcıyla korunur.
   ⚠ vertical-align:top ZORUNLU: inline-block öğeler varsayılan olarak baseline'a
   oturur ve satıra descender payı ekler — ÖLÇÜLDÜ, başlık kutusu bölünmüşken
   38px'ten 44px'e çıkıyordu (görünür bir layout sıçraması / CLS riski). */
[data-letters]{overflow:hidden;padding-bottom:.16em;margin-bottom:-.16em}
[data-letters] .uv-word{display:inline-block;white-space:nowrap;vertical-align:top}
[data-letters] .uv-ltr{display:inline-block;vertical-align:top;transform:translateY(-118%);transition:transform .52s var(--ease)}
[data-letters] .uv-ltr--in{transform:none}
/* İkinci kemer: JS reduced-motion altında zaten hiç bölmez, ama global
   transition:none kuralı bölünmüş bir başlığı yakalarsa harfler maskenin
   ARKASINDA donup kaybolurdu — burada bitiş durumu koşulsuz sabitlenir. */
@media(prefers-reduced-motion:reduce){[data-letters]{overflow:visible}[data-letters] .uv-ltr{transform:none !important}}

[data-tile]{display:block;color:#14181C}
[data-media]{overflow:hidden;border-radius:var(--r);position:relative}
[data-mediaimg]{position:absolute;inset:0;background-size:cover;transition:transform .8s var(--ease)}
/* REV-02 (Plan 02.1-03 Task 1e, UI-SPEC § 1 kok neden): asagidaki dort
   :hover kurali eskiden etikete degil ATTRIBUTE'A bagliydi ([data-x]:hover).
   Hedefsiz <a>'lari <span>/<div>'e cevirmek CSS'i degistirmezse span/div
   fare uzerine gelindiginde HALA link gibi tepki verirdi (ok kaymasi, alt
   cizgi acilmasi, satir ici kaymasi) -- "aktif gorunme" sikayetini yarim
   cozerdi. Dort kural artik `a[data-x]:hover` ile etikete kilitli; TABAN
   kurallar (data-tile, data-uline, data-row-link -- asagida degismedi)
   kilitlenmez, aksi halde demote edilen ogelerin duzeni bozulurdu. */
a[data-tile]:hover [data-mediaimg]{transform:scale(1.05)}
[data-arrow]{display:inline-block;transition:transform .3s var(--ease)}
a[data-tile]:hover [data-arrow],a[data-link]:hover [data-arrow]{transform:translateX(6px)}

[data-card]{transition:transform .3s var(--ease)}
[data-card]:hover{background:#E8E8E3;transform:translateY(-3px)}

[data-uline]{background-image:linear-gradient(#B49C78,#B49C78);background-size:0 1px;background-repeat:no-repeat;background-position:0 100%;transition:background-size .4s var(--ease)}
a[data-uline]:hover{background-size:100% 1px}

[data-row-link]{transition:padding-left .3s var(--ease)}
/* D-07-06 (07-02, A11Y-01) — #8A6A44 (2,72:1) KOYU zemin [data-megapanel]
   (#183048) uzerinde AA'nin altindaydi; handoff'un kendi kurali
   (design-handoff.md:129) #8A6A44'u ACIK zemin rengi olarak tanimliyor,
   koyu zeminde kullanimi kuralin ihlaliydi. #B49C78 (5,12:1) ayni
   bilesenin (Ribbon cizgisi, odak halkasi) zaten tasidigi accent'e
   donuyor, yeni hex icat edilmedi. */
a[data-row-link]:hover{padding-left:10px;color:#B49C78}

[data-btn]{display:inline-flex;align-items:center;justify-content:center;gap:9px;border-radius:var(--rb);font-weight:500;font-size:15px;line-height:1;padding:16px 26px;transition:transform .2s var(--ease),border-color .2s var(--ease)}
[data-btn]:active{transform:translateY(1px)}
[data-btn="solid"]{background:#183048;color:#fff}
[data-btn="solid"]:hover{background:#0F2233}
[data-btn="outline"]{border:1px solid #14181C;color:#14181C;padding:15px 26px}
[data-btn="outline"]:hover{background:#14181C;color:#fff}
[data-btn="brass"]{background:#B49C78;color:#1A1408}
[data-btn="brass"]:hover{background:#C9AE85}
[data-btn="onDark"]{border:1px solid rgba(255,255,255,.45);color:#fff;padding:15px 26px}
[data-btn="onDark"]:hover{background:#fff;color:#183048;border-color:#fff}
[data-btn="sm"]{padding:12px 20px;font-size:14px}

[data-chip]{transition:border-color .22s var(--ease)}
[data-chip]:hover{border-color:#183048}

[data-megapanel]{display:none}
[data-megapanel="open"]{display:block;animation:uvPanel .22s var(--ease) both}
[data-mega-caret]{transition:transform .22s var(--ease)}
[data-menu-btn]{display:none}
[data-menu-panel]{display:none}
[data-accpanel]{display:none}
[data-cap]{animation-fill-mode:both}

@media (max-width:1300px){:root{--c3:repeat(2,1fr);--c4:repeat(2,1fr)}}
@media (max-width:1100px){
:root{--c2:1fr}
[data-nav]{display:none !important}
[data-megapanel]{display:none !important}
[data-menu-btn]{display:flex !important}
[data-hidesm]{display:none !important}
[data-row]{flex-direction:column !important;gap:44px !important}
[data-row2]{flex-direction:column !important;gap:32px !important}
[data-side]{width:100% !important;border-left:0 !important;padding-left:0 !important}
[data-herogrid]{grid-template-columns:1fr !important;gap:32px !important}
[data-herofacts]{flex-direction:row !important;flex-wrap:wrap;gap:32px !important;text-align:left !important}
}
@media (max-width:820px){
:root{--pady:24px;--c3:1fr;--c4:1fr}
[data-h1]{font-size:38px !important}
[data-h2]{font-size:27px !important}
[data-cap]{font-size:14.25px !important;max-width:300px}
.uv-ribbon--lg{--uv-ribbon-size:36px}
}
@media (max-width:520px){:root{--pady:18px}[data-h1]{font-size:31px !important}[data-h2]{font-size:23px !important}.uv-ribbon--lg{--uv-ribbon-size:28px}.uv-ribbon{gap:24px}[data-carousel]{height:auto !important;min-height:0 !important;aspect-ratio:4/5}}
@media (prefers-reduced-motion: reduce){*{animation:none !important;transition:none !important}[data-pre],[data-reveal]{transform:none !important}}

/* Uretimde geri acilan gecisler - prototipte kare ilerlemedigi icin kapaliydi */
[data-slide]{transition:opacity .7s var(--ease)}
[data-card]{transition:transform .3s var(--ease),background .3s var(--ease)}
@media (prefers-reduced-motion: reduce){
  [data-slide],[data-card]{transition:none !important}
}
[data-btn-sm="1"]{padding:11px 18px;font-size:14px}

/* Cross-Listing Ribbon (Faz 2, SERV-02 — imza bileşeni). Sayfa şablonuna
   inline stil yazılmaz; boyut yalnızca .uv-ribbon--lg/--md/--sm sınıflarıyla
   ifade edilir. Orta çizginin background bildirimi tek ve koşulsuzdur — hiçbir
   @media(prefers-reduced-motion) veya animasyon dalı onu değiştirmez
   (pazarlık dışı kural, design-handoff.md). */
.uv-ribbon{display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:40px}
.uv-ribbon__side{display:flex;flex-direction:column;gap:4px}
.uv-ribbon__side--right{text-align:right}
.uv-ribbon__label{font:500 11px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.16em;text-transform:uppercase;color:#8A6A44}
.uv-ribbon__ticker{font:500 var(--uv-ribbon-size,46px) 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.04em;font-variant-numeric:tabular-nums;line-height:1}
.uv-ribbon__city{font-weight:400;font-size:14px;color:#5D666E}
.uv-ribbon__line{height:1px;background:#B49C78}
.uv-ribbon--lg{--uv-ribbon-size:46px}
.uv-ribbon--md{--uv-ribbon-size:28px}
.uv-ribbon--sm{--uv-ribbon-size:16px}

/* Requirements & eligibility — TBC hücre + yatay kaydırma sarmalayıcısı
   (Faz 2, UI-D-03, § Component Specifications 3). .uv-tbc, 1px dashed
   "beklemede" desenini taşır. ⚠ 02.1-01 (D-2.1-01/02): ana sayfanın
   "AWAITING SPK APPROVAL" rozeti, taşıdığı Mercanlar kartıyla BİRLİKTE
   ana sayfadan kaldırıldı — bu sınıf artık o (silinen) örneğe atıf
   yapmıyor, kendi footer "Dubai coming soon" kullanımına (02.1-05) hazır
   kalıyor. .uv-tablescroll <table> semantiğini bozmadan dar ekranda
   klavyeyle kaydırılabilir bölge sağlar; odak halkası global
   a:focus-visible,button:focus-visible kuralına takılmaz (sarmalayıcı bir
   <div>, buton/link değil) — bu yüzden ayrıca tanımlanır (07-02: artık
   generic [tabindex]:not([tabindex="-1"]):focus-visible kuralı da bunu
   kapsıyor ve yüksek özgüllüğü nedeniyle kazanıyor — bu satır var()'a
   çevrildi, iki kural aynı değeri üretir, tutarlılık için korunur). */
.uv-tbc{display:inline-flex;align-items:center;gap:6px;padding:3px 9px;border:1px dashed #5D666E;border-radius:var(--rb);font:500 10.5px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.08em;color:#5D666E;text-decoration:none}
/* A11Y-01 (07-02) — OLCULDU: .uv-tbc'nin varsayilan #5D666E rengi (acik
   zemin icin, 5.31:1) footer'in koyu navy zemininde (#183048) yeniden
   kullanildiginda 2,31:1'e duser. footer.html'deki "Dubai coming soon"
   rozeti bu sinifi KOYU zeminde miras aliyor; requirements tablosundaki
   (acik zemin) ve Contact sayfasindaki (acik zemin) kullanimlar etkilenmez.
   Duzeltme footer'in KENDI mevcut ikincil metin rengine (#A9B4C0, 6,42:1 —
   footer.html'nin her yerinde zaten kullanili) donuyor, yeni hex icat
   edilmedi. */
footer .uv-tbc{color:#A9B4C0;border-color:#A9B4C0}
.uv-tablescroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
.uv-tablescroll:focus-visible{outline:2px solid var(--focus-color);outline-offset:3px}

/* Selected experience — kayıt sayısına göre esneyen ızgara + boş-durum satırı
   + statü rozeti varyantları (Faz 2, D-10/D-12, § Component Specifications 2).
   1–2 kayıt sola hizalı doğal genişlikte kalır (var(--c3) tek kayıtla "eksik
   içerik deliği" gibi okunmasın diye — CONTEXT.md D-12), 3+ kayıt mevcut
   var(--c3) ızgarasına döner, 0 kayıt kart-olmayan tek satıra düşer.
   .uv-txstatus--completed rengi ana sayfanın tek kalan rozet örneğinden
   birebir alınır (src/pages/home.html satır 120). ⚠ 02.1-01 (D-2.1-01/04):
   --ongoing (oxblood kenarlık) ve --awaiting (dashed kenarlık) varyantları
   artık HİÇBİR üretilen HTML'de referans edilmiyor — build.mjs'in yeni yayın
   koşulu (loadTransactions()) tamamlanmamış statüleri hiç basmıyor. Sınıflar
   kasıtlı olarak SİLİNMEDEN korunuyor (UI-SPEC § 6: enum + olası Faz 3 filtre
   etiketleri için ölü ama kasıtlı kod, geri dönüş maliyeti ihmal edilebilir). */
.uv-expgrid{display:grid;grid-template-columns:var(--c3);gap:16px}
.uv-expgrid[data-experience-count="1"],.uv-expgrid[data-experience-count="2"]{grid-template-columns:repeat(auto-fit,minmax(320px,420px));justify-content:start}
.uv-expgrid[data-experience-count="0"]{display:block}
.uv-emptyrow{border:1px solid #DEDEDA;padding:32px;text-align:center;font-weight:400;font-size:14px;line-height:1.55;color:#5D666E}
.uv-txstatus{display:inline-block;padding:4px 10px;font:500 10.5px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.1em;border-radius:var(--rb)}
.uv-txstatus--completed{background:#183048;color:#fff}
.uv-txstatus--ongoing{border:1px solid #6B2130;color:#6B2130}
.uv-txstatus--awaiting{border:1px dashed #5D666E;color:#5D666E}

/* İşlem listesi satırı (Faz 3, Task 1, D-03-13/14/18, 03-UI-SPEC.md
   § Component 2/3/4). Kartsız, saç teli ayraçlı liste — masaüstünde tek
   satır flex, <=1100px'te dikey akış (TX-05, hiçbir alan düşürülmez),
   <=520px'te rol+rozet karşılıklı hizalanır. Monogram (izin yokken) ve
   gelecekteki <img> (izin geldiğinde) AYNI 76x40 kutuyu paylaşır, kutu
   çerçevesi/boyutu hiçbir dalda değişmez (TX-04, "düzen bozulmaz"). */
.uv-txrow{display:flex;gap:20px;padding:22px 0;border-bottom:1px solid #DEDEDA;align-items:center}
.uv-txrow[hidden]{display:none}
.uv-txrow__logo{width:76px;height:40px;border:1px solid #DEDEDA;background:#fff;border-radius:var(--r);flex:none;display:flex;align-items:center;justify-content:center;font:500 14px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.02em;color:#5D666E}
.uv-txrow__logo img{width:100%;height:100%;object-fit:contain;padding:6px}
.uv-txrow__company{width:230px}
.uv-txrow__company h2{font-weight:500;font-size:19px;line-height:1.2;letter-spacing:-.012em}
.uv-txrow__sub{font:400 11.5px 'IBM Plex Mono',ui-monospace,monospace;color:#5D666E;margin-top:5px;text-transform:uppercase}
.uv-txrow .uv-ribbon--sm{margin-top:5px}
.uv-txrow__summary{flex:1;min-width:200px;font-weight:400;font-size:15.5px;color:#5D666E}
.uv-txrow__meta{width:120px;font:400 12px/1.5 'IBM Plex Mono',ui-monospace,monospace;color:#5D666E}
.uv-txrow__role{width:170px;font-weight:400;font-size:14px;color:#5D666E}
.uv-txrow .uv-txstatus{width:150px;text-align:right}
@media(min-width:1101px){.uv-txrow__head{display:contents}
/* UAT-01: `summary` boş olan kayıtta şablon `uv:itemif item.hasSummary` ile
   `.uv-txrow__summary`'yi HİÇ basmaz — ama o span `flex:1` taşır, yani
   meta/rol/rozeti sağa iten esnek boşluğun KENDİSİDİR. Yokken sağ sütunlar
   sola çöküyordu (1440px'te 486px kayma, `gersan-elektrik` satırında ölçüldü).
   `margin-left:auto` boşluğu meta'nın soluna devreder: özet VARSA `flex:1`
   zaten tüm boşluğu yuttuğu için bu değer 0'a çözülür (davranış değişmez),
   YOKSA hizayı kurtarır. Yalnızca satır yönünde geçerli — ≤1100px'te düzen
   `column`'a döner ve `margin-left` çapraz eksene düşerdi (TX-05'i bozardı),
   o yüzden kapsam bilinçli olarak bu medya sorgusudur. */
.uv-txrow__meta{margin-left:auto}}
/* WINDOWS #10 / D-07-16 (07-03): 1101-1179px bandında özeti OLAN satırda
   `.uv-txrow__summary`'nin `min-width:200px` tabanı (satır 198) sağ
   sütunları itiyordu — ÖLÇÜLDÜ (gerçek Chrome, iframe viewport, düzeltme
   ÖNCESİ): 1101px=47px, 1120px=35px, 1150px=16px, 1180px=0px (1180px'te
   zaten sıfıra iniyor, bant üstte doğal olarak kapanıyor). Kapatmanın
   REDDEDİLEN iki yolu: TX-05'in kilitli 1100px kırılma noktasını
   değiştirmek (tamamlanmış bir gereksinimi bozar) ve `gersan-elektrik`
   kaydına özet yazmak (eski siteden birebir metin + proje sahibi sözü
   gerektirir, olgu yok). Üçüncü yol: taban YALNIZCA bu dar bantta 0'a
   çekilir — `@media(min-width:1101px)` bloğunun (yukarıda) `margin-left:
   auto` kuralına DOKUNULMAZ, özeti OLMAYAN satırın hizası (UAT-01, 486px
   sürüklenme düzeltmesi) tamamen ona bağlı kalır. `min-width:0`, mevcut
   `@media(max-width:1100px)` bloğunun (aşağıda, satır 218) zaten kullandığı
   değerdir — yeni bir sihirli sayı icat edilmedi (PD-07-14). Bu blok
   `@media(min-width:1101px)` bloğunun ARDINA yazılır ki kaskad sırası
   belirleyici olsun. Ölçülen SONUÇ (behavior-smoke W1/W2,
   tools/behavior-smoke.html): dört genişlikte de fark 0px'e indi, W2'nin
   1100/1200px sınır davranışı (margin-left:auto mekanizması) değişmedi. */
@media(min-width:1101px) and (max-width:1179px){.uv-txrow__summary{min-width:0}}
@media(min-width:521px){.uv-txrow__foot{display:contents}}
@media(max-width:1100px){
.uv-txrow{flex-direction:column;align-items:stretch;gap:12px;padding:24px 0}
.uv-txrow__head{display:flex;justify-content:space-between;align-items:flex-start;gap:14px}
.uv-txrow__company{width:auto}
.uv-txrow__summary{min-width:0}
.uv-txrow__meta,.uv-txrow__role{width:auto}
.uv-txrow .uv-txstatus{width:auto;text-align:left}
}
@media(max-width:520px){
.uv-txrow__foot{display:flex;justify-content:space-between;align-items:center;gap:12px}
}

/* Filtre çip şeridi (Faz 3, Task 1, D-03-06/07/08, 03-UI-SPEC.md
   § Component 1). `hidden` niteliği ÜRETİLEN HTML'de baştan var (JS yoksa
   şerit hiç görünmez, ziyaretçi tam listeyi görür) — `.uv-txfilters[hidden]
   {display:none}` kuralı BURADA ZORUNLU: `.uv-txfilters{display:flex}` bir
   yazar-stil kuralıdır ve tarayıcının `[hidden]{display:none}` UA kuralını
   ezer, bu satır olmadan `hidden` şerit ekranda kalırdı (.uv-txrow[hidden]
   ile aynı gerekçe, satır 156). */
.uv-txfilters{display:flex;gap:26px;flex-wrap:wrap;align-items:center;padding:0 var(--pad) 24px;border-bottom:1px solid #14181C}
.uv-txfilters[hidden]{display:none}
.uv-txfilter-group{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.uv-txfilter-group--market{margin-left:auto}
.uv-txfilter-group__label{font:500 10.5px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.14em;color:#5D666E;text-transform:uppercase}
.uv-chip{
  display:inline-flex;align-items:center;justify-content:center;
  min-height:44px;                       /* A11Y-03 — prototipin 8px 14px paddingi tek başına ~32px verir */
  padding:8px 14px;
  border:1px solid #C9C9C4;border-radius:var(--rb);
  font-weight:500;font-size:13.5px;
  transition:border-color .22s var(--ease),background .22s var(--ease),color .22s var(--ease)
}
.uv-chip:hover{border-color:#183048}
.uv-chip[aria-pressed="true"]{border-color:#183048;background:#183048;color:#fff}
.uv-txcount{font:400 13px/1.5 'IBM Plex Mono',ui-monospace,monospace;color:#5D666E;padding:14px var(--pad) 0}
@media(prefers-reduced-motion:reduce){.uv-chip{transition:none}}

/* İkinci işlem liste görünümü — sol filtre sütunu + kutu ızgarası
   (Faz 13, `13-01`, D-13-05/D-13-06, REV2-10). Proje sahibinin işaret ettiği
   strandhanson.co.uk/all-transactions yerleşimi. Mevcut `.uv-txrow` satır
   listesi DEĞİŞMEDEN yaşamaya devam eder — bu sınıflar onunla hiç kesişmez.
   Yatay sınır `--pad` formülünden gelir (D-14-01); sayfaya elle max-width
   VERİLMEZ. Yeni kırılma noktası icat edilmez: 1300/1100 mevcut değerlerdir
   ve kutu ızgarası global bir kolon token'ı kullanır (D-13-06, D-14-11).
   ⚠ 2026-08-26 (proje sahibi kararı): kutular büyüsün ve liste "daha dolu"
   görünsün diye ızgara SABİT iki kolona geçti. Global token KULLANILMADI ve
   hiçbir token'a DOKUNULMADI (global tanım değişse ana sayfa da etkilenirdi):
   ölçüldü, hiçbir mevcut token istenen 2/2/1 davranışını vermiyor —
   `--c3` 3/2/1 (>1300 / <=1300 / <=820), `--c2` 2/1 (>1100 / <=1100).
   `--c2` denendi ve 821-1100px bandında tek kolona düştüğü için REDDEDİLDİ.
   Bileşene özel kural + mevcut 820 kırılma noktası seçildi. Ölçülen etki:
   >1300px 3→2 kolon, 1101-1300px değişmedi (2), 821-1100px değişmedi (2),
   <=820px değişmedi (1). */
.uv-txgrid{display:grid;grid-template-columns:auto 1fr;gap:40px;align-items:start}
/* Savunma kuralı (D-12 disiplini, insights.html'in `data-insempty` yorumunun
   emsali): kayıt yoksa `<aside>`'ın İÇİ hiç basılmaz — element BOŞ kalır.
   `:empty` onu ızgaradan çıkarır ve `auto` kolonu 0'a iner, kutular tam
   genişliğe yayılır. Kolon genişliği bu yüzden `280px` DEĞİL `auto`dur:
   sabit değer boş aside'da bile 280px'lik ölü bir kolon bırakırdı.
   `hasChips === !isEmpty` olduğu için bugün yapısal olarak tetiklenemez. */
.uv-txgrid__side{width:280px;position:sticky;top:24px;display:flex;flex-direction:column}
.uv-txgrid__side:empty{display:none}
/* `.uv-txfilters` ile AYNI gerekçe (satır ~295): `display:flex` yazar-stili
   tarayıcının `[hidden]{display:none}` UA kuralını ezer, bu satır olmadan
   JS çalışmadığında gizli filtre bloğu ekranda kalırdı. */
.uv-txgrid__filters{display:flex;flex-direction:column;gap:26px}
.uv-txgrid__filters[hidden]{display:none}
/* İKİ konteyner arası boşluk (REV6-02'de ölçülerek bulundu). Sektör ekseni
   KENDİ koşullu konteynerinde yaşar (şablon motoru iç içe `uv:if`
   desteklemiyor, 13-02 BULGU-01) ve `.uv-txgrid__side` bir `gap` taşımadığı
   için konteynerler BİTİŞİK duruyordu: grup İÇİ boşluk 26px iken
   MARKET'ın son kalemiyle SECTOR başlığı arası ölçülen 4px'ti. Kusur
   REV6-02'den ESKİDİR — eski çiplerin kenarlıkları görsel ayrımı sağladığı
   için göze batmıyordu, kutular sadeleşince ortaya çıktı. Değer grup içi
   boşlukla AYNI (26px) seçildi: yeni bir ritim icat edilmiyor. */
.uv-txgrid__filters + .uv-txgrid__filters{margin-top:26px}
.uv-txgrid__group{display:flex;flex-direction:column;align-items:stretch;gap:0}
.uv-txgrid__group .uv-txfilter-group__label{margin-bottom:6px}
/* REV6-02 (2026-08-26, proje sahibi kararı) — filtreler `.uv-chip` butonundan
   onay kutusuna döndü ve seçim ÇOKLU oldu (grup içi OR, gruplar arası AND).
   ⚠ `.uv-chip` kuralına DOKUNULMADI: o sınıfı Insights sayfası da kullanıyor
   (src/pages/insights.html, `data-inschip` ad alanı) ve Insights TEK EKSENLİDİR
   (INS-02) — orada tek seçim doğrudur. Ayrı bir sınıf açmak, bu değişikliğin
   ikinci bir sayfaya sessizce sızmasını yapısal olarak imkânsız kılar.

   ⚠ Dokunma hedefi (A11Y-03, `tools/a11y-audit.mjs` `auditTarget()`): kapı
   elemanın KENDİ `getBoundingClientRect()` kutusunu ölçer, `::before`
   genişletmesini GÖRMEZ ve 44x44'ün altındaki her etkileşimli öğeyi ihlal
   sayar. Faz 14 (`14-03`) bunun tersini denedi ve `ihlal sayisi` 0 → 2 oldu.
   Doğru kurulum iletişim formunun rıza kutusundakiyle AYNI: kontrol 44x44
   kalır (kenarlıksız, saydam), GÖRÜNÜR kare `::before` ile 18px'e iner.

   ⚠ `margin-right:-26px` bir hizalama numarası DEĞİL, ölçünün doğrudan
   sonucudur: 44px'lik isabet kutusunun görünür 18px'lik kareden ARTAN kısmı
   tam olarak 26px'tir. Negatif kenar boşluğu bu görünmez artığı düzenden
   çıkarır; böylece kare grubun sol kenarına hizalanır ve etiketle arasındaki
   boşluk `gap` değerinin KENDİSİ olur (10px), örtük bir artıktan türemez.
   Yatay isabet alanı KÜÇÜLMEZ — yalnızca akış içindeki ilerleme küçülür. */
.uv-txcheck{display:flex;align-items:center;gap:10px;cursor:pointer;font-weight:500;font-size:13.5px;line-height:1.3;color:#14181C}
.uv-txcheck input[type="checkbox"]{-webkit-appearance:none;appearance:none;margin:0 -26px 0 0;width:44px;height:44px;flex:0 0 44px;border:0;background:none;position:relative;cursor:pointer}
.uv-txcheck input[type="checkbox"]::before{content:"";position:absolute;left:0;top:50%;width:18px;height:18px;transform:translateY(-50%);border:1px solid #C9C9C4;border-radius:var(--r);background:#fff;transition:border-color .22s var(--ease),background .22s var(--ease)}
.uv-txcheck:hover input[type="checkbox"]::before{border-color:#183048}
.uv-txcheck input[type="checkbox"]:checked::before{border-color:#183048;background:#183048}
/* Tik işareti kareyle AYNI eksende konumlanır (`left:0` + yarım kare kaydırma),
   çünkü kare artık ortalanmış değil sola yaslanmıştır. */
.uv-txcheck input[type="checkbox"]:checked::after{content:"";position:absolute;left:6px;top:50%;width:4px;height:8px;margin-top:-5px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}
@media(prefers-reduced-motion:reduce){.uv-txcheck input[type="checkbox"]::before{transition:none}}
/* Geri alma kontrolü. `min-height:44px` a11y-audit'in ihlal eşiğidir (metin
   bağlantısı istisnası `<a>` içindir, bu bir `<button>`). `[hidden]` koruması
   `.uv-txfilters[hidden]` ile aynı gerekçeye sahiptir: yazar-stili `display`
   bildirimi tarayıcının UA `[hidden]{display:none}` kuralını ezer, bu satır
   olmadan kontrol seçim yokken de ekranda kalırdı. */
.uv-txclear{display:inline-flex;align-items:center;align-self:flex-start;min-height:44px;margin-top:14px;padding:0;border:0;background:none;font:500 12.5px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.02em;color:#8A6A44;text-decoration:underline;text-underline-offset:3px;cursor:pointer}
.uv-txclear[hidden]{display:none}
.uv-txgrid__count{padding:22px 0 0}
.uv-txgrid__boxes{display:grid;grid-template-columns:repeat(2,1fr);gap:20px;align-content:start}
/* 821-1100px bandı: filtreler yatay şeride döner ve kutular kolonun tamamını alır.
   Bu bantta TEK kolon ÖLÇÜLDÜ ve reddedildi (840px genişlikte kutu, ticker şeridi
   seyreliyor, "daha dolu görünsün" hedefine ters). Yeni kırılma noktası icat
   EDİLMEZ: 820 mevcut değerdir. */
@media (max-width:820px){.uv-txgrid__boxes{grid-template-columns:1fr}}
.uv-txbox{border:1px solid #DEDEDA;border-radius:var(--r);background:#fff;padding:30px;display:flex;flex-direction:column;gap:12px;min-height:300px}
.uv-txbox[hidden]{display:none}
.uv-txbox__logo{width:88px;height:48px;border:1px solid #DEDEDA;background:#fff;border-radius:var(--r);flex:none;display:flex;align-items:center;justify-content:center;font:500 14px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.02em;color:#5D666E;margin-bottom:10px;overflow:hidden}
.uv-txbox__logo img{width:100%;height:100%;object-fit:contain;padding:6px}
.uv-txbox__company{font-weight:500;font-size:19px;line-height:1.2;letter-spacing:-.012em}
/* İşlem KARTI logo yuvası — ana sayfa vitrini (REV6-01, 2026-08-26) VE hizmet/
   pazar sayfalarının Seçilmiş İşlemler kartları (quick `260902-ud5`,
   2026-09-02). ⚠ İkinci yüzey sonradan geldi: o kartlarda şablona SABİT
   yazılmış, veriye hiç bağlı olmayan bir 54x34 `LOGO` yer tutucusu vardı ve
   canlıda 14 sayfada 26 kez basılıyordu — REV6-01 iki yüzeyi düzeltmiş,
   ÜÇÜNCÜSÜNÜ atlamıştı (yer-tutucu-iki-yuzeyde-olabilir dersinin üçüncü
   vakası). Ölçüler ZATEN aynıydı, yeni sınıf açılmadı: ikisi de
   `resolveTransactionRecord()` besliyor ve aynı üç kademeli sözleşmeyi
   paylaşıyor, yani bunlar farklı bileşenler değil AYNI bileşenin iki yeridir.
   `.uv-txbox__logo`'nun küçük ikizi — AYNI üç kademeli sözleşmeyi paylaşır
   (izinli logo → <img>, yoksa monogram). Ayrı bir sınıf, çünkü `uv-txbox`
   işlemler sayfasının kutu ad alanıdır ve `build-selftest` S42 sayaçları o
   dizgeye bağlıdır; `.uv-ribbon--sm` gibi bir değiştirici kurmak S42'nin
   ölçtüğü ad alanını iki yüzeye yayardı. Ölçüler ana sayfada ZATEN vardı —
   satır içi 54x34 yer tutucudan devralındı, İCAT EDİLMEDİ; tek fark
   monogramın 9px "LOGO" metni yerine 11px iki harf taşıması. */
.uv-txcard__logo{width:54px;height:34px;border:1px solid #DEDEDA;background:#fff;border-radius:var(--r);flex:none;display:flex;align-items:center;justify-content:center;font:500 11px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.02em;color:#5D666E;overflow:hidden}
.uv-txcard__logo img{width:100%;height:100%;object-fit:contain;padding:4px}
/* Sektör satırı — yalnızca `hasSector` olan kayıtta basılır (D-13-08).
   ⚠ Bu yorum "bugün hiçbir kayıtta sektör yok" diyordu ve BAYATLADI: sektör
   değerleri quick `260826-ijm`'de girdi. Mutlak sayı yazılmıyor — sektör
   taşıyan kayıt sayısı veriye bağlıdır, koda değil. */
.uv-txbox__sector{font:500 10.5px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.14em;color:#8A6A44;text-transform:uppercase}
.uv-txbox__meta{display:flex;flex-wrap:wrap;gap:6px;font:400 11.5px/1.5 'IBM Plex Mono',ui-monospace,monospace;color:#5D666E;text-transform:uppercase}
.uv-txbox__role{font-weight:400;font-size:14px;line-height:1.5;color:#5D666E;margin-top:auto;padding-top:16px;border-top:1px solid #DEDEDA}
.uv-txbox .uv-ribbon--sm{margin:0}
/* ≤1100px: sol sütun yatay şeride döner. ⚠ `.uv-txgrid__group .uv-chip`
   kuralı REV6-02'de SİLİNDİ — ızgara artık `.uv-chip` basmıyor, o birleşim
   yapısal olarak oluşamaz (ölü seçici bırakmak sonraki okuyucuyu yanıltırdı).
   Yerine gelen `gap` satır kuralı gerekli: taban `gap` masaüstü dikey liste
   için 0'a indi, yatay dizilimde 0 kutuları birbirine yapıştırırdı. */
@media(max-width:1100px){.uv-txgrid{grid-template-columns:1fr;gap:28px}.uv-txgrid__side{width:auto;position:static}.uv-txgrid__filters{flex-direction:row;flex-wrap:wrap;gap:26px}.uv-txgrid__group{flex-direction:row;align-items:center;flex-wrap:wrap;gap:0 20px}.uv-txgrid__group .uv-txfilter-group__label{margin-bottom:0}.uv-txgrid__count{padding-top:14px}}

/* Forward-looking statements bandı (Faz 2, COMP-02, § Component
   Specifications 4). Footer'ın koyu tam-bleed feragat bandıyla BİLİNÇLİ
   OLARAK yarışmaz: dar okuma kolonu, açık zemin, gövde fontu (mono değil).
   margin-top footer'a "yapışmamayı" sağlar (en az 2xl/48px). D16 denetimi
   çıktıda data-fls="1" işaretini arar — bu sınıf yalnızca görsel muameledir,
   zorunluluk denetimi ondan bağımsız çalışır. */
.uv-fls{max-width:680px;background:#F1F1EE;border-top:1px solid #DEDEDA;font-weight:400;font-size:14px;line-height:1.55;color:#5D666E;margin-top:48px;padding:22px 24px 24px}

/* About "How we work" ızgarası + "What we do not do" uyum bloğu + kapanış
   bandı (Faz 4, CORP-01/COMP-05, 04-UI-SPEC.md § Sayfa Sözleşmeleri →
   About). Prototipin satır 266-289 birebir değer kaynağı (D-04-02);
   .uv-about-step hücresi height TANIMLAMAZ — uzun TR metni hücreyi büyütür,
   kırpmaz (04-CONTEXT.md Specific Ideas). checkD16() About'u kapsamadığı
   için (yalnızca page:"service" + route.data) .uv-about-closing data-fls
   işareti İSTEMEZ — bu bir konumlandırma ifadesi, uyum bandı değil
   (D-04-07). .uv-about-nodo'nun #6B2130 sol kenarı işlevsel-etiket kuralının
   değil, prototipin onaylı görsel imzasının bir parçasıdır (04-UI-SPEC.md
   § Color, bilinçli istisna). */
.uv-about-steps{display:grid;grid-template-columns:var(--c2);gap:1px;background:#DEDEDA;border:1px solid #DEDEDA;border-radius:var(--r);overflow:hidden}
.uv-about-step{background:#fff;padding:26px}
.uv-about-nodo{border-left:2px solid #6B2130;padding:4px 0 4px 24px}
.uv-about-closing{background:#183048;background-image:var(--pat-gold);border-top:2px solid #B49C78;padding:76px var(--pad)}

/* Contact ofis ızgarası + Dubai satırı (Faz 4, CORP-02, 04-UI-SPEC.md § Sayfa
   Sözleşmeleri → Contact, UI-D-08/09). `--c2` kullanılır, footer'ın 4 kolonlu
   `--c4` ızgarası değil (UI-D-08). `.uv-office` height TANIMLAMAZ — en uzun
   adres (İstanbul, TR) doğal olarak akar, komşu kartla taban hizası
   zorlanmaz. `.uv-office--hq`'nun etiket rengi footer'daki mevcut merkez/şube
   vurgusunu açık zemine taşır (UI-D-09); diğer üç kart ve Dubai satırı muted
   kalır. `.uv-office-tbc` adres paragrafı taşımaz — sınıfın kendisi eksikliği
   iletir. */
.uv-offices{display:grid;grid-template-columns:var(--c2);gap:24px}
.uv-office{background:#fff;border:1px solid #DEDEDA;border-radius:var(--r);padding:28px}
.uv-office__label{font:500 11px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.16em;text-transform:uppercase;color:#5D666E;margin-bottom:12px}
.uv-office--hq .uv-office__label{color:#8A6A44}
.uv-office__addr{font-weight:400;font-size:14.5px;line-height:1.65;color:#5D666E}

/* LinkedIn ikonu (Faz 10, `10-02`, D-10-14/UI-D-10-03/10). Hover/odak geri
   bildirimi opacity ile verilir — `prefers-reduced-motion` altındaki global
   `*{transition:none!important}` kuralı (satır 154) bunu bedelsiz söndürür,
   ayrı bir reduced-motion kuralı YAZILMAZ. Odak halkası için de ek kural
   yok: footer zaten satır 66'daki koyu-zemin `--focus-color` listesinde. */
.uv-linkedin{transition:opacity .22s var(--ease)}
.uv-linkedin:hover,.uv-linkedin:focus-visible{opacity:.72}
.uv-office-tbc{margin-top:24px;display:flex;align-items:center;gap:10px;border:1px dashed #5D666E;border-radius:var(--r);padding:18px 24px}

/* Ofisler bandı (Faz 10, `10-04`, M-16/REV2-16, UI-D-10-04..07). Bölüm zemini
   home.html'in hedef seçici bölümüyle (satır 70) BİREBİR aynı desen —
   `.uv-offices-band` yeni bir zemin İCAT ETMEZ (UI-D-10-05). Izgara `var(--c3)`
   kullanır — beş kart ÷ 3 = 3+2 en az yetim hücreyi üretir, STATE.md'nin
   altı-kart emsalinin beşe indirgenmiş hâli (UI-D-10-04); `--c3` ≤1300px'te
   zaten `repeat(2,1fr)`'e, ≤820px'te `1fr`'e çöktüğü için (satır 133/147)
   ızgara için sıfır yeni breakpoint gerekir. Fotoğrafsız medya zemini koyu
   navy + `--pat-gold` (UI-D-10-06) — "PHOTOGRAPH — LONDON" türü bir yer
   tutucu metin katmanı KASITLI OLARAK EKLENMEZ (Faz 9'un sadeleştirme ruhu).
   Açıklama `max-height:0;opacity:0` ile başlar ve HER ZAMAN DOM'dadır
   (`display:none` KULLANILMAZ, D-10-20) — hover/`:focus-within` aynı kural
   setini tetikler; ≤820px'te (mevcut breakpoint, satır 146) açıklama
   koşulsuz açık sabitlenir, hover taklidi yapılmaz. `prefers-reduced-motion:
   reduce` için yeni kural YAZILMAZ — mevcut global `*{transition:none
   !important}` (satır 154) yukarıdaki tüm `transition` bildirimlerini
   otomatik söndürür, açılış/kapanış anlık olur. Odak halkası: kart açık
   zeminde, varsayılan `--focus-color:#8A6A44` bedelsiz uygulanır. */
.uv-offices-band{background:#fff;background-image:var(--pat-ink);border-top:1px solid #DEDEDA;border-bottom:1px solid #DEDEDA;padding:88px var(--pad)}
.uv-obgrid{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:24px}
/* Faz 14 (14-02, D-14-04, REV3-02): bant TEK SATIRDIR ve satır kart sayısına
   sabitlenmez — `grid-auto-flow:column` sütun sayısını VERİDEN alır, bu yüzden
   `data/offices.json`'a kayıt eklemek/çıkarmak CSS'e dokunmadan çalışır (S40'ın
   parametriklik iddiası CSS'te de korunur; `repeat(5,1fr)` yazmak onu kırardı).
   Sarma yalnızca mevcut kırılma noktalarında olur, yeni breakpoint icat edilmedi. */
@media(max-width:1300px){.uv-obgrid{grid-auto-flow:row;grid-template-columns:repeat(2,1fr)}}
@media(max-width:1100px){.uv-obgrid{grid-template-columns:1fr}}
.uv-obcard{display:block;background:#fff;border:1px solid #DEDEDA;border-radius:var(--r);overflow:hidden;color:#14181C}
.uv-obcard__media{aspect-ratio:1/1;transition:aspect-ratio .35s var(--ease);background:#183048;background-image:var(--pat-gold)}
.uv-obcard__body{padding:20px 22px 24px}
.uv-obcard__city{font-weight:500;font-size:22px;line-height:1.2;letter-spacing:-.014em;margin-bottom:8px}
.uv-obcard__desc{font-weight:400;font-size:14.5px;line-height:1.6;color:#5D666E;max-height:0;opacity:0;overflow:hidden;transition:max-height .35s var(--ease),opacity .35s var(--ease)}
.uv-obcard__cta{font-weight:500;font-size:15px;color:#14181C}
.uv-obcard__cta [data-arrow]{color:#8A6A44}
.uv-obcard:hover .uv-obcard__media,.uv-obcard:focus-within .uv-obcard__media{aspect-ratio:2/1}
.uv-obcard:hover .uv-obcard__desc,.uv-obcard:focus-within .uv-obcard__desc{max-height:120px;opacity:1;margin-bottom:12px}
.uv-obcard:hover [data-uline],.uv-obcard:focus-within [data-uline]{background-size:100% 1px}
/* ≤820px (mevcut breakpoint değeri, satır 146'daki bloğun aynı koşulu — sıfır
   yeni breakpoint) — açıklama koşulsuz açık, hover taklidi yok (D-10-20).
   `.uv-obcard__desc`/`.uv-obcard__media` ile AYNI özgüllükte olduğu için bu
   kural KASITLI olarak satır 382/379'daki varsayılan bildirimlerden SONRA
   yazıldı — kaynak sırası eşit özgüllükte kazananı belirler; erken 820px
   bloğuna eklenseydi geç gelen varsayılan bildirim onu ezerdi (ölçülen bulgu,
   ilk deneme yanlış sıradaydı). */
@media(max-width:820px){.uv-obcard__desc{max-height:120px;opacity:1;margin-bottom:12px}.uv-obcard__media{aspect-ratio:2/1}}

/* İletişim formu (Faz 11, `11-01`, tracer; genişletme `11-02`) — YENİ HEX
   İCAT EDİLMEDİ (D-07-06). Izgara `.uv-offices`/`.uv-about-steps` ile AYNI
   `grid-template-columns: var(--c2)` token'ını kullanır (PD-11-01) — bu,
   ≤1100px'te tek koluna iner (satır 135'teki mevcut kırılma noktası, yeni
   bir eşik İCAT EDİLMEDİ). Odak halkası için YENİ kural YAZILMAZ: satır
   65'teki global `input`/`select`/`textarea` `:focus-visible` kuralı form
   alanlarını zaten kapsıyor (ölçüldü). Alan gövdesi `.uv-office` kartının
   (satır 345) birebir aynı görsel dilini taşır: `#DEDEDA` kenarlık + beyaz
   zemin + `var(--r)` yarıçap. Hata/uyarı metni rengi `#6B2130` —
   `.uv-txstatus--ongoing`/`.uv-about-nodo`'da ZATEN var, yeni hex DEĞİLDİR
   (PD-11-02); durum bölgesinin rıza hatası değiştiricisine VE yeni alan
   başına hata yuvalarına (`.uv-form__err`) uygulanır. `transition:` bildiren
   HİÇBİR kural YOKTUR — görünürlük YALNIZCA `hidden` özniteliğiyle yönetilir
   (`hidden`-only disiplini, `insights.js`/`transactions.js` deseni +
   CLAUDE.md hareket kuralı) — bu kısıt `--dump-dom` headless modunun
   `transition:` taşıyan hiçbir CSS özelliğini `getComputedStyle` üzerinden
   yansıtmaması nedeniyle de zorunludur (Faz 10 O1/O2 ölçümü); geçişli bir
   kural yazılsaydı 11-05'in form senaryoları CSSOM melez desenine düşmek
   zorunda kalırdı. `--full` değiştiricisi `11-02`'de `--wide`'a yeniden
   adlandırıldı (plan artefakt tablosunun kendi adlandırması, davranış
   AYNI — yalnızca message/consent/actions satırlarının sınıf adı). */
.uv-form__grid{display:grid;grid-template-columns:var(--c2);gap:24px}
.uv-form__field--wide{grid-column:1/-1}
.uv-form__field label{display:block;font:500 11px 'IBM Plex Mono',ui-monospace,monospace;letter-spacing:.16em;text-transform:uppercase;color:#5D666E;margin-bottom:8px}
/* `.uv-form__opt` — "İsteğe bağlı" rozeti, aynı etiketin İÇİNDE, aynı
   rengi (#5D666E, satırdan miras) korur ama mono/büyük-harf/harf-aralığı
   vurgusunu KALDIRIR — zorunlu alanlarla görsel karışıklık önlenir. */
.uv-form__opt{font-weight:400;text-transform:none;letter-spacing:normal;margin-left:6px}
.uv-form__field input,.uv-form__field select,.uv-form__field textarea{width:100%;min-height:44px;font:inherit;font-size:15px;color:#14181C;background:#fff;border:1px solid #DEDEDA;border-radius:var(--r);padding:12px 14px}
.uv-form__field textarea{resize:vertical}
/* `.uv-form__err` — alan başına hata yuvası (Task 1c). Görünürlük YALNIZCA
   `hidden` özniteliğiyle yönetilir (element `hidden` iken tarayıcı
   varsayılanı zaten `display:none`'dır); burada YALNIZCA `hidden`
   DEĞİLKEN uygulanacak gövde stili tanımlanır — `transition` YOK. */
.uv-form__err{display:block;margin-top:6px;font-size:13px;line-height:1.5;color:#6B2130}
.uv-form__consent{display:flex;align-items:flex-start;gap:10px;font-weight:400;font-size:14.5px;line-height:1.6;color:#5D666E}
.uv-form__consentlabel{display:flex;align-items:flex-start;gap:10px}
/* A11Y-03/T-07-09 (dokunma hedefi, ölçüldü): yerel `<input type="checkbox">`
   varsayılan olarak ~13x13px — WCAG 2.5.5/`tools/a11y-audit.mjs`'in 44x44px
   eşiğinin ALTINDA. `appearance:none` ile öğenin KENDİSİ 44x44px'e
   büyütülür (`a11y-audit`'in `getBoundingClientRect()` ölçtüğü asıl kutu bu
   — çevresine dolgu eklemek yetmez, öğenin öz boyutu ölçülüyor). Onay
   işareti `::after` ile kutunun içinde ortalanır; zemin/kenarlık
   `.uv-form__field`in aynı diliyle (`#DEDEDA`/`var(--r)`), işaretli hâlde
   kenarlık mevcut `#8A6A44` odak rengiyle vurgulanır — yeni hex İCAT
   EDİLMEDİ (D-07-06). */
/* Faz 14 (14-03, D-14-08, REV3-07): kutu GÖRSEL olarak 22px'e indi, dokunma
   hedefi 44px'de KALDI — ama ilk deneme TERS kurulmuştu (kontrolün kendisi
   22px, hedef alanı `::before` ile 44px'e genişletilmiş) ve `a11y-audit`
   bunu ÖLÇÜMLE reddetti: `ihlal sayisi` 0 → 2 (`input#contact-consent —
   22x22px < 44x44px`, iki dilde). Kapı elemanın KENDİ kutusunu ölçüyor,
   pseudo-element genişletmesini görmüyor — ve haklı: yardımcı teknolojiler
   ve tarayıcı isabet testi de aynı kutuya bakar. Doğru kurulum tersidir:
   kontrol 44×44px kalır (kenarlıksız ve saydam), GÖRÜNÜR 22px kare
   `::before` ile ortalanır. İşaret (`::after`) da merkeze göre konumlanır.
   Küçültürken hedef alanını küçültmek WCAG 2.5.8 ve A11Y-04 disiplinini
   bozardı. */
.uv-form__consent input[type="checkbox"]{-webkit-appearance:none;appearance:none;margin:0;width:44px;height:44px;flex:0 0 44px;border:0;background:none;position:relative;cursor:pointer}
.uv-form__consent input[type="checkbox"]::before{content:"";position:absolute;left:50%;top:50%;width:22px;height:22px;transform:translate(-50%,-50%);border:1px solid #DEDEDA;border-radius:var(--r);background:#fff}
.uv-form__consent input[type="checkbox"]:checked::before{border-color:#8A6A44}
.uv-form__consent input[type="checkbox"]:checked::after{content:"";position:absolute;left:50%;top:50%;width:5px;height:10px;margin:-7px 0 0 -3px;border:solid #8A6A44;border-width:0 2px 2px 0;transform:rotate(45deg)}
/* D-11-22(a) (11-02, Task 3f) — honeypot gizlemesi KONUMLANDIRMA
   tabanlıdır: `position:absolute` alanı `.uv-form__grid`'in akışından
   (ve grid yerleşiminden — mutlak konumlu grid öğeleri ızgara akışına
   katılmaz) tamamen ÇIKARIR, ardından 1×1px'lik sıfıra yakın ölçü +
   `overflow:hidden` + `left:-9999px` ile görünür alanın dışına taşınır.
   `display:none`/`visibility:hidden` KULLANILMAZ — bazı botlar bu iki
   kuralı okuyup honeypot alanını atlar, konumlandırma tabanlı gizleme bu
   sınıf botlara karşı da işler. */
.uv-form__hp{position:absolute;width:1px;height:1px;overflow:hidden;left:-9999px}
/* A11Y-03 ölçümü (tools/a11y-audit.mjs): dokunma hedefi denetimi kontrolün
   KENDİ `getBoundingClientRect()` sonucuna bakar, sarmalayıcının kırpma
   kutusuna DEĞİL — kontrol tarayıcının 44x44px altındaki varsayılan boyutunu
   (153x21) korursa gerçek bir A11Y-TARGET ihlali olarak SAYILIR (sarmalayıcı
   1x1'e kırpsa da). Kontrolün kendi kutusunu 44x44'e büyütmek bu yanlış
   pozitifi giderir; görünürlüğü DEĞİŞTİRMEZ çünkü sarmalayıcı zaten hem
   `overflow:hidden` hem `left:-9999px` taşıyor — büyütülmüş kutu ekranda
   HİÇBİR ZAMAN görünmez. */
.uv-form__hp input{width:44px;height:44px}
/* D-11-08 üçüncü kademe (11-02, Task 1e) — JS'siz bant, `.uv-office-tbc`
   (satır 357) ile AYNI kesikli-kenarlık bildirim kutusu dilini kullanır;
   içindeki `<a>` global `a{color:#8A6A44}` kuralından rengi zaten alır,
   ayrı bir kural YAZILMADI. */
.uv-form__noscript{margin-bottom:24px;display:flex;flex-wrap:wrap;align-items:center;gap:10px;border:1px dashed #5D666E;border-radius:var(--r);padding:16px 20px;font-weight:400;font-size:14.5px;line-height:1.6;color:#5D666E}
.uv-form__noscript p{margin:0}
[data-contact-status]{margin-top:24px;font-weight:400;font-size:14.5px;line-height:1.6;color:#5D666E}
[data-contact-status] a{color:#8A6A44;text-decoration:underline}
[data-contact-status].uv-form__status--error{color:#6B2130}
