/* Kronometre görünümü — kronometre.html'den ayrıldı (denetim § 5.7 / madde 29).
   AYRI DOSYA + UZUN ÖMÜRLÜ ÖNBELLEK: sayfanın kendisi her açılışta taze
   iniyor (öğrenci eski sürümde kalmasın), ama görünüm ve yazılım değişmedikçe
   telefonda duruyor. Adres sonundaki ?v=… damgası deploy'da otomatik
   güncelleniyor (scripts/frontend-surum-damgala.mjs) — damga değişmeden
   içerik değişemez, yani 'öğrencide eski dosya kaldı' tuzağı kapalı. */

        /* ═══ ODA RENK DİLİ — TEK PALET (28 Ağustos 2026) ═══════════════════
           Dört renk, dört anlam. Aynı yeşil dört dosyada elle yazılıydı;
           kızılı kaldırırken dosyaları tek tek dolaşmak gerekti ve birini
           atlasak kimse fark etmezdi. Artık tek kaynak.

             --ss-var       BİRİ VAR (online). Kalabalıkla DEĞİŞMEZ — üç kişi
                            de otuz kişi de aynı yeşil (kullanıcı kararı).
             --ss-var-acik  aynı yeşilin yazı tonu ("molada")
             --ss-ortak     ORTAK SAAT sürüyor (altın)
             --ss-ortak-kisik  aynı saatin mola fazı — renk değil SES değişir
             --ss-dinlenme  İLAN EDİLMİŞ dinlenme (ay mavisi) — moladan ayrı
             --ss-yok       yokluk (sönük)

           🔴 KIRMIZI YOK. Varlık anlatan hiçbir yerde kızıl kullanılmaz
           (sembol defteri, 4. korkuluk: kırmızı aciliyet yasak).
           ⚠️ Kullanan dosyalar `var(--ss-var, #7FC79A)` biçiminde YEDEKLİ
           yazar: kronometre.css yüklenmeyen bir sayfada da renk doğru çıksın. */
        :root {
            --ss-var: #7FC79A;
            --ss-var-hale: rgba(127, 199, 154, .6);
            --ss-var-acik: #9fe0b8;
            --ss-var-dolgu: rgba(127, 199, 154, .12);
            --ss-var-cizgi: rgba(127, 199, 154, .38);
            --ss-ortak: #F5D67B;
            --ss-ortak-kisik: #e0cb96;
            --ss-dinlenme: #8FB4D9;
            --ss-yok: rgba(255, 255, 255, .28);
        }

        :root {
            --primary: #4facfe;
            --success: #00f2fe;
            --warning: #f59e0b;
            --danger: #ef4444;
            --glass-bg: rgba(15, 23, 42, 0.35);
            --glass-border: rgba(255, 255, 255, 0.15);
        }

        body {
            font-family: var(--ss-yazi, system-ui, sans-serif);
            margin: 0; color: white; height: 100vh; overflow: hidden;
            display: flex; justify-content: center; align-items: center;
            background: #0a0e1a;
            background-image:
                radial-gradient(at 0% 0%, hsla(253,16%,7%,1) 0, transparent 50%), 
                radial-gradient(at 50% 0%, hsla(225,39%,30%,0.3) 0, transparent 50%), 
                radial-gradient(at 100% 0%, hsla(339,49%,30%,0.3) 0, transparent 50%);
        }

        /* Üst Butonlar: solda disiplin rozeti, sağda mod butonları (flex — hiçbir genişlikte çakışmaz) */
        .top-buttons {
            position: fixed; top: 15px; width: 100%; padding: 0 15px;
            display: flex; align-items: center; gap: 8px; z-index: 100; box-sizing: border-box;
        }
        .top-buttons .mode-btns { display: flex; gap: 8px; margin-left: auto; }
        .glass-btn {
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border);
            color: #cbd5e1; padding: 7px 10px; border-radius: 10px; cursor: pointer;
            backdrop-filter: blur(10px); font-size: 0.72em; font-weight: 600; transition: all 0.3s ease;
            text-transform: uppercase; letter-spacing: 0.5px; white-space: nowrap;
        }
        @media (min-width: 768px) {
            .glass-btn { padding: 8px 14px; font-size: 0.8em; }
        }
        .glass-btn:hover { background: rgba(255,255,255,0.15); color: white; transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0,0,0,0.2); }

        @keyframes float {
            0% { transform: translateY(0px) scale(1); }
            50% { transform: translateY(-30px) scale(1.05); }
            100% { transform: translateY(0px) scale(1); }
        }
        /* ISIK KATMANI — dekoratif lekeleri KIRPAR.
           Lekeler position:absolute, body ise position:static olduğu için konumlanma
           referansları body değil sayfanın en dışıydı; body'nin overflow:hidden'ı onları
           kesmiyordu. Sonuç: telefonda sayfa 475px'e genişliyor (ekran 375px) ve parmakla
           yana kaydırılabiliyordu — kart sola kayıp düzen bozuluyordu.
           html'e overflow-x:hidden koymak ÇÖZMÜYOR (ölçüldü: kayma yine 100px).
           Doğru çözüm: lekeleri kırpan sabit bir katmanın içine almak.
           z-index katmanda durduğu için lekeler içeriğin arkasında kalmaya devam eder. */
        .isik-katmani { position: fixed; inset: 0; overflow: hidden; z-index: -1; pointer-events: none; }
        .blob { position: absolute; border-radius: 50%; filter: blur(70px); opacity: 0.45; animation: float 12s ease-in-out infinite; }
        .blob.green { width: 350px; height: 350px; background: #00f2fe; top: -100px; right: -100px; animation-delay: 0s; }
        .blob.blue { width: 450px; height: 450px; background: #4facfe; bottom: -150px; left: -100px; animation-delay: -6s; }

        .container { 
            /* GÖRELİ KAP: yaprak (alkış listesi) mutlak konumlanabilsin diye.
               28 Ağu'da AYRI bir `.container { position: relative }` bloğundaydı;
               bekçi çakışma diye bağırdı. Özellikleri çakışmıyordu — ekran
               bozuk değildi — ama ayrı durması kırılgandı: buraya `position`
               yazan biri onu sessizce ezerdi. */
            position: relative;
            background: var(--glass-bg); 
            /* blur(30px) → blur(14px): sayaç her saniye değiştiği için tarayıcı bu buzlu
               cam katmanını saniyede bir YENİDEN hesaplıyordu. Yarıdan aza indirildi;
               arkadaki zemin sabit degrade olduğu için görsel fark neredeyse yok. */
            backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px);
            /* ÜSTTE NEFES PAYI (24 Ağu gecesi, kullanıcı: "hoş geldin yazısı
               en üstte sınırda, ikonlar sıkışıyor"). Köşe ikonları sabit ve
               ekranın tepesinde duruyor; kısa telefonlarda kartın üst kenarı
               onlara değiyordu. Üst dolgu büyüdü, yan ve alt dolgu kısıldı —
               net kayıp yok, üstteki sıkışıklık gitti. */
            padding: 30px 20px 14px; border-radius: 28px;
            box-shadow: 0 20px 50px rgba(0, 0, 0, 0.4), inset 0 0 0 1px rgba(255,255,255,0.1); 
            text-align: center; width: 90%; max-width: 420px;
            z-index: 1; max-height: 90vh; overflow-y: auto; overflow-x: hidden; transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
        }

        /* MİNİ MOD STİLLERİ */
        .container.mini-mode {
            display: flex !important; flex-direction: column; justify-content: center;
            padding: 40px 20px;
        }
        .container.mini-mode .hide-in-mini { display: none !important; }
        .container.mini-mode #timer { font-size: min(5.5em, 16vw); margin: 30px 0; text-shadow: 0 0 30px rgba(0, 242, 254, 0.8); }

        .avatar-wrapper { position: relative; width: 100px; height: 100px; margin: 0 auto 15px auto; }
        
        .progress-ring {
            width: 100%; height: 100%; border-radius: 50%;
            background: conic-gradient(var(--success) var(--progress, 0%), rgba(255,255,255,0.05) 0deg);
            display: flex; justify-content: center; align-items: center;
            box-shadow: 0 0 20px rgba(0, 242, 254, 0.2); transition: background 1s ease;
        }

        .avatar-inner {
            width: 86px; height: 86px; background: rgba(15, 23, 42, 0.4); 
            backdrop-filter: blur(10px); border-radius: 50%;
            display: flex; justify-content: center; align-items: center;
            font-size: 40px; cursor: pointer; transition: 0.3s;
            border: 2px solid rgba(255,255,255,0.15); box-shadow: inset 0 0 20px rgba(0,0,0,0.3);
        }
        
        .progress-text {
            position: absolute; top: -5px; right: -10px; width: 45px; height: 45px; 
            border-radius: 50%; background: rgba(15, 23, 42, 0.8); 
            backdrop-filter: blur(10px); border: 1px solid rgba(255,255,255,0.2);
            display: flex; justify-content: center; align-items: center;
            font-size: 12px; font-weight: bold; color: white; z-index: 2; transition: all 0.3s ease;
        }

        .avatar-selector {
            display: none; position: absolute; top: 110px; left: 50%; transform: translateX(-50%);
            background: rgba(15, 23, 42, 0.95); padding: 10px; border-radius: 12px;
            border: 1px solid var(--primary); z-index: 10; gap: 10px; width: max-content;
        }
        .avatar-selector span { font-size: 26px; cursor: pointer; transition: 0.2s; padding: 5px; }

        h2 { margin: 0 0 2px 0; font-size: 1.04em; font-weight: 500; color: #e2e8f0; }
        /* ——— Kimlik satırı (Kyron dili · üç kat mimarisi D1) ———
           "Sessiz Saat · Kyron" parlak mavi ve iri duruyordu; kutucuklar susunca
           ekranın en yüksek sesi o oldu. Marka adının bağırması gerekmiyor —
           öğrenci zaten hangi ekranda olduğunu biliyor. Ad KALIYOR (bilinçli bir
           karardı, Kyron'un tanınması için) ama fısıltı ağırlığına iniyor. */
        .subtitle { font-size: 0.76em; font-weight: 600; color: #6d80a0;
            letter-spacing: 0.06em; margin-bottom: 7px; }
        .subtitle-desc { font-size: 0.75em; color: #94a3b8; display: block; font-weight: normal; margin-top: 3px; }

        /* ── Masa şeridi ──────────────────────────────────────────────
           Masası olmayan öğrenciye kutu göstermiyoruz: sessiz bir davet.
           Masası olanda rozet canlanır (yeşil nokta + çalışan sayısı). */
        /* ═══ 🗓️ GÜN ÇERÇEVESİ — sınava kalan gün (14 Ağu) ═══
           ⚠️ Sembol dili korkuluğu: "kırmızı aciliyet, geri sayım korkusu
           yasak." Bu satır bu yüzden ürünün EN SESSİZ öğesidir — masa
           şeridinden bile soluk. Kural olarak: kırmızı YOK, büyük punto YOK,
           çerçeve YOK, animasyon YOK. Sayı bir uyarı değil, bir çerçevedir.
           Rakamlar sabit genişlikte: her gün bir azalırken satır oynamasın. */
        #gun-cercevesi { display: flex; align-items: center; gap: 8px; width: fit-content;
            max-width: 100%; margin: -2px auto 14px; padding: 2px 4px;
            font-size: 0.7em; line-height: 1.3; color: #6b7f9e;
            font-variant-numeric: tabular-nums; }
        #gun-cercevesi[hidden] { display: none; }
        #gun-cercevesi #gun-cercevesi-metin { min-width: 0; overflow: hidden;
            text-overflow: ellipsis; white-space: nowrap; }
        /* "tahmini" notu daha da soluk: tarih resmîleşince bu ek kaybolur. */
        #gun-cercevesi .tahmini { opacity: .62; }
        /* 🔴 PARMAK PAYI EKSİ MARJLA AÇILIR (7 Eyl, ölçüldü: 18x15 idi).
           Bu çarpı dar bir SATIRIN içinde; üstüne serilen görünmez bir pay
           komşu yazının dokunuşunu yerdi. Onun yerine düğmenin KENDİSİ
           büyütülüyor (padding), eksi marj da satırın hizasını bozmuyor:
           görünen boyut aynı kalıyor, dokunulan alan 44'e çıkıyor. */
        #gun-cercevesi #gun-cercevesi-kapat { flex: none; background: none; border: none;
            color: inherit; opacity: .38; cursor: pointer; font-size: 1em; line-height: 1;
            padding: 12px; margin: -12px -8px; transition: opacity .18s; }
        #gun-cercevesi #gun-cercevesi-kapat:hover { opacity: .85; }

        /* ═══ A4: MASA ŞERİDİ = KİMLİK SATIRI ═══
           Kapsül çerçevesi kalktı; şerit artık selamın altındaki ince satır ve
           "Sessiz Saat · Kyron"un yerine geçiyor (ikisi aynı anda görünmez).
           Böylece bir satır eksiliyor ve masa bilgisi bağırmadan duruyor. */
        #masa-serit { display: none; align-items: center; gap: 7px; text-decoration: none;
            margin: -2px auto 7px; padding: 2px 6px; border-radius: 99px; max-width: 100%;
            font-size: 0.74em; line-height: 1.3; width: fit-content;
            color: #8fa2bf; background: none; border: 1px solid transparent;
            transition: background .18s, border-color .18s, color .18s; }
        #masa-serit:hover { color: #cfe0f5; }
        /* Masa satırı görünüyorsa marka satırı susar — tek satır kuralı. */
        .container.masa-var .subtitle { display: none; }
        #masa-serit #masa-nokta { flex: none; width: 7px; height: 7px; border-radius: 50%;
            background: var(--ss-yok, rgba(255,255,255,0.28)); transition: background .2s, box-shadow .2s; }
        #masa-serit #masa-metin { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        #masa-serit .ok { flex: none; opacity: .5; }
        /* ═══ "DEĞİŞTİR" (16 Ağu) — şerit artık geçiş kapısı ═══════════════
           Masa değiştirmenin tek yolu başka bir sayfaya gidip dönmekti; oysa
           "nerede görünüyorum" sorusu tam da burada soruluyor. Küçük ve sağda:
           satırın anlamını bastırmadan "buna dokunulur" der. */
        /* 🔴 28 Ağu, kullanıcı: "değiştir yazısı çok yer kaplıyor, ikon kalsın."
           Şeritte artık üç şey var (yer · kapı · değiştir); yazı düşünce üçü de
           rahat sığıyor. Anlamı `aria-label` taşıyor — ekran okuyucu kaybetmez. */
        #masa-serit .degis { flex: none; margin-left: 3px; font-size: 1.05em; opacity: .62;
            padding: 2px 7px; border-radius: 99px; border: 1px solid rgba(255,255,255,0.14);
            white-space: nowrap; line-height: 1.15; }
        #masa-serit:hover .degis { opacity: 1; border-color: rgba(255,255,255,0.3); }
        /* PERDE HÂLİ — "Kendi başıma". Nokta içi boş bir halka: yanan bir ışık
           değil, çekilmiş bir perde. Satır soluk ama KAYBOLMAZ; öğrenci kendi
           hâlini görebilmeli. */
        #masa-serit.yalniz { color: #8fa2bf; cursor: pointer; }
        #masa-serit.yalniz #masa-nokta { background: transparent;
            border: 1px solid rgba(255,255,255,0.32); box-shadow: none; }
        /* Boş hâl: çerçevesiz, soluk — ekranın enerjisini çalmasın. */
        #masa-serit.bos { background: transparent; border-color: transparent; color: #7f93b3; }
        #masa-serit.bos #masa-nokta { display: none; }
        #masa-serit.bos:hover { color: #cfe0f5; background: rgba(255,255,255,0.05); }
        /* Canlı hâl: birileri çalışıyor. A4'te çerçeve YOK — satır kimlik satırıdır,
           kapsül değil; canlılığı nokta ve metnin parlaklığı taşır. Çerçeve yalnız
           ortak ritim sürerken açılır (aşağıda) — vurgulanmayı hak eden tek an o. */
        #masa-serit.canli { color: #cfe0f5; border-color: transparent; }
        #masa-serit.canli #masa-nokta { background: var(--ss-var, #7FC79A); box-shadow: 0 0 8px var(--ss-var-hale, rgba(127,199,154,.6)); }
        /* Ortak ritim: masanın randevusu sürüyor — şerit tempoyu gösterir.
           Altın = birlikte çalışma, yeşil = birlikte mola. Sayı akarken göz
           takip edebilsin diye rakamlar sabit genişlikte. */
        /* OCAĞIN KÖZÜ — yalnız "N kişi çalışıyor" hâlinde. Masa ekranındaki
           közle aynı işaret: masa ortak ateşin başıdır, kişi arttıkça köz
           parlar (hale JS'ten gelir). Randevu/ritim hâllerinde köz YOKTUR —
           orada konuşan söz, ateş değil. */
        /* ═══ ŞERİDİN RENK DİLİ — İKİ KANAL (28 Ağu kullanıcı kararı) ═══════
           Eskiden tek satırda üç haber birden renk yarıştırıyordu ve iki kural
           kırılmıştı: (1) YEŞİL iki anlam taşıyordu — nokta yeşilse "biri
           çalışıyor", şerit yeşilse "ortak mola"; (2) KÖZ kızıla kaçıyordu,
           oysa üründe kırmızı aciliyet YASAK (sembol defteri, 4. korkuluk) —
           kullanıcı da "bazen kırmızı oluyor" diye takıldı.

           Artık iki ayrı kanal, hiç çakışmıyor:
             · NOKTA  = KİM VAR.  yeşil: biri var · sönük: kimse yok ·
                        içi boş halka: perde ("kendi başıma")
             · ÇERÇEVE+YAZI = ORTAK SAAT. altın: sürüyor · nötr: yok

           🔒 Kalabalıkla renk DEĞİŞMEZ (kullanıcı kararı): üç kişi de otuz kişi
           de aynı yeşil. Sayıyı metin söylüyor; rengin işi "var mı yok mu".
           Bu yüzden köz gradyanı ve --koz-hale büyümesi KALDIRILDI. */
        #masa-serit.ocak #masa-nokta { background: var(--ss-var, #7FC79A); box-shadow: 0 0 8px var(--ss-var-hale, rgba(127,199,154,.6)); }

        /* ORTAK SAAT = ALTIN. Mola da aynı saatin parçasıdır: renk değişmez,
           yalnız SESİ ALÇALIR. Hangi fazda olduğunu zaten metin söylüyor
           ("çalışma 12:04" / "mola 04:31") — rengi de konuşturmak gereksiz
           bir ikinci dil olurdu. */
        #masa-serit.ritim { color: var(--ss-ortak, #F5D67B); border-color: rgba(245,214,123,0.42);
            background: rgba(245,214,123,0.10); font-variant-numeric: tabular-nums;
            padding: 4px 12px; }
        #masa-serit.ritim.molada { color: var(--ss-ortak-kisik, #e0cb96); border-color: rgba(245,214,123,0.24);
            background: rgba(245,214,123,0.05); }
        /* Nokta ortak saatte de KİM VAR'ı söyler — altına dönmez. */
        #masa-serit.ritim #masa-nokta { background: var(--ss-var, #7FC79A); box-shadow: 0 0 8px var(--ss-var-hale, rgba(127,199,154,.6)); }

        /* ═══ SESSİZ ALKIŞ (28 Ağu) ═══════════════════════════════════════
           Üç parça: şeritteki KAPI (dokunulur sayı) · şeridin altındaki
           TESLİM SATIRI · dokununca inen YAPRAK.
           🔑 Kilitli kural: hiçbirinde SAYI yok — "kaç alkış aldın" hiçbir
           yerde toplanmaz. Yalnız ad, yalnız satır. */

        /* 🔴 31 Ağu — sayı artık AYRI DÜĞME DEĞİL (kullanıcı kararı):
           ad + sayı bütünleşik tek hedef, şeridin tamamı masa yaprağını
           açıyor; yer değiştirmenin kapısı yalnız ⇄. Çerçeve/çip kalktı;
           kimlik duruyor (yaprak açıkken renk yine buraya vurulur). */
        #masa-serit #alkis-kapi { white-space: nowrap; }
        #masa-serit #alkis-kapi.acik { color: #e8d5a8; }

        /* Teslim satırı: şeridin ALTINDA, kendi yerinde. Sağında ✕ —
           kapatmak "gördüm" demektir ve satır bir daha gelmez. Kapatılmazsa
           12 sn sonra çekilir ve BİR SONRAKİ EŞİKTE yine gelir (açılış ·
           duraklama · mola · kayıt ekranı). Çalışma sürerken asla. */
        #alkis-satir[hidden] { display: none !important; }
        #alkis-satir {
            display: flex; align-items: center; gap: 8px;
            /* Dolgu ölçünün İÇİNDE sayılır — yoksa uzun isim listesi kartın
               dışına taşıyor (masam.css'te aynı tuzağa düşülmüştü). */
            box-sizing: border-box;
            width: fit-content; max-width: 100%;
            margin: -2px auto 9px; padding: 6px 6px 6px 11px; border-radius: 99px;
            font-size: 0.76em; line-height: 1.35; color: #b79a63;
            background: rgba(212,175,106,0.09); border: 1px solid rgba(212,175,106,0.28);
            animation: alkis-in .32s ease both;
        }
        @keyframes alkis-in { from { opacity: 0; transform: translateY(-4px); } to { opacity: 1; transform: none; } }
        @media (prefers-reduced-motion: reduce) { #alkis-satir { animation: none; } }
        #alkis-satir > svg { width: 14px; height: 14px; flex: none; color: #e8d5a8; }
        /* İsimler YAN YANA akar, sıra ALKIŞ SIRASI (ilk alkışlayan başta).
           Sığmazsa sonu yumuşakça solar — sert bir "..." devamın KESİLDİĞİNİ
           söyler, solma DEVAM ETTİĞİNİ. Eşiği biz koymuyoruz, ekran koyuyor. */
        #alkis-satir .adlar { min-width: 0; flex: 0 1 auto; }
        #alkis-satir .adlar.kesik {
            white-space: nowrap; overflow: hidden;
            -webkit-mask-image: linear-gradient(90deg, #000 78%, transparent 100%);
            mask-image: linear-gradient(90deg, #000 78%, transparent 100%);
        }
        #alkis-satir .ac { flex: none; cursor: pointer; color: #8fa2bf; font-size: 1.05em; line-height: 1; padding: 0 2px; }
        #alkis-satir .kapat {
            flex: none; width: 20px; height: 20px; border-radius: 50%; padding: 0; cursor: pointer;
            display: flex; align-items: center; justify-content: center;
            background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12);
            color: #8fa2bf; font-family: inherit; font-size: 11px; line-height: 1;
        }

        /* ARKASI BULANIR — yaprak açıkken göz listeye düşsün, kadran geride
           kalsın. Bulanıklık yalnız kadrana ve düğmesine; yaprağın kendisi
           kabın DIŞ katmanında olduğu için etkilenmez. */
        /* 🔴 28 Ağu, kullanıcı: "bütün kronometre bulanlansın." Önce yalnız
           kadran bulanıyordu; ekranın geri kalanı (program, kutular, şeritler)
           net kalınca yaprak havada duruyor gibi görünüyordu.
           Kabın BÜTÜN çocukları bulanır — yalnız İKİSİ hariç: yaprağın kendisi
           ve şerit (kapı orada, dokunulur kalmalı). */
        .container.alkis-yaprakli > *:not(#alkis-yaprak):not(#masa-serit) {
            filter: blur(3px); opacity: .38;
            pointer-events: none;
        }
        .container > * { transition: filter .22s ease, opacity .22s ease; }
        @media (prefers-reduced-motion: reduce) {
            .container.alkis-yaprakli > *:not(#alkis-yaprak):not(#masa-serit) {
                filter: none; opacity: .35;
            }
        }

        /* Kayıt penceresindeki yuva. Kayıt ekranı üste binen bir pencere;
           şeridin altındaki satır onun ARKASINDA kalır. Aynı satır burada
           yeniden basılır — kartların ÜSTÜNDE, sola yaslı. */
        #alkis-kayit[hidden] { display: none !important; }
        #alkis-kayit { margin: 0 0 12px; text-align: left; }
        #alkis-kayit #alkis-satir, #alkis-kayit #alkis-satir-kayit { margin: 0; }
        /* Kayıt penceresinde satır SARAR: yer bol, isim kesmenin sebebi yok. */
        #alkis-satir-kayit {
            /* Izgara: el · isimler · ✕. İsimler SARAR, el ve ✕ kendi
               sütunlarında kalır. (Sarmalı bir flex satırda el yalnız başına
               bir satıra düşüyordu — çizilip görüldü, 28 Ağu.) */
            display: grid; grid-template-columns: auto 1fr auto;
            align-items: start; gap: 4px 8px;
            box-sizing: border-box; max-width: 100%;
            padding: 8px 8px 8px 12px; border-radius: 14px;
            font-size: 0.76em; line-height: 1.45; color: #b79a63;
            background: rgba(212,175,106,0.09); border: 1px solid rgba(212,175,106,0.28);
        }
        #alkis-satir-kayit[hidden] { display: none !important; }
        #alkis-satir-kayit > svg { width: 14px; height: 14px; color: #e8d5a8; margin-top: 2px; }
        #alkis-satir-kayit .adlar { min-width: 0; }
        #alkis-satir-kayit .kapat {
            flex: none; width: 20px; height: 20px; border-radius: 50%; padding: 0; cursor: pointer;
            display: flex; align-items: center; justify-content: center;
            background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.12);
            color: #8fa2bf; font-family: inherit; font-size: 11px; line-height: 1;
        }

        /* Yaprak: şeridin altında yüzer, KADRANI İTMEZ. Kapanınca ekran hiç
           değişmemiş gibi kalır — öğrenci "nereye gittim ben" demesin. */
        #alkis-yaprak[hidden] { display: none !important; }
        #alkis-yaprak {
            /* ⚠️ Ekranın geneli ORTALI (kadran ekranın efendisi). Yaprak bir
               LİSTE — ortalanırsa adlar sallanır, göz sütun bulamaz. Hizayı
               burada açıkça soldan veriyoruz; miras alınan ortalama sızmasın. */
            text-align: left; box-sizing: border-box;
            /* 🔴 28 Ağu, canlı prova: yaprak akışın İÇİNDEYDİ, açılınca kadranı
               aşağı itiyor ve ekran boy değiştiriyordu ("bu tasarım hoş değil").
               Artık MUTLAK: kendi yerinde durur ama yer kaplamaz — kadran
               kımıldamaz, arkasında sessizce bulanır. */
            position: absolute; z-index: 60;
            left: 50%; transform: translateX(-50%);
            width: calc(100% - 32px); max-width: 300px;
            margin: 0; padding: 12px 12px 8px; border-radius: 15px;
            background: #10151f; border: 1px solid rgba(212,175,106,0.26);
            box-shadow: 0 18px 40px rgba(0,0,0,0.55);
            /* 🔴 28 Ağu, canlı prova: yaprak SAĞA KAYIYOR, yarısı ekran dışında
               kalıyordu. Sebep: ortak `alkis-in` animasyonu `transform`
               yazıyor ve `both` dolgusuyla son kareyi (transform:none)
               kalıcı kılıyordu — yani merkezleyen translateX(-50%) siliniyordu.
               Ders: bir öğe transform ile konumlanıyorsa, ona uygulanan HER
               animasyon o transform'u kendi karelerinde TAŞIMAK zorundadır. */
            animation: alkis-yaprak-in .22s ease both;
        }
        @keyframes alkis-yaprak-in {
            from { opacity: 0; transform: translateX(-50%) translateY(-5px); }
            to   { opacity: 1; transform: translateX(-50%); }
        }
        @media (prefers-reduced-motion: reduce) {
            #alkis-yaprak { animation: none; transform: translateX(-50%); }
        }
        #alkis-yaprak .ay-bas {
            font-size: 0.66em; letter-spacing: .8px; text-transform: uppercase;
            color: #5f6b80; margin-bottom: 4px;
        }
        /* ── 30 Ağu · YAPRAK MASAYI ÇİZER (K24) ────────────────────────
           Satır listesi yerine masanın kendisi. Altında iki satır: kaç kişi
           çalışıyor (sayı METİNDE, ışıkta değil) ve dokunulan kişi. */
        #alkis-yaprak .ay-ozet {
            text-align: center; font-size: 0.72em; color: #94a3b8; margin-top: 4px;
        }
        #alkis-yaprak .ay-ozet b { color: #cfe0f5; font-weight: 600; }
        #alkis-yaprak .ay-ipucu {
            text-align: center; font-size: 0.66em; color: #5f6b80; margin-top: 2px;
        }
        #alkis-yaprak .ay-satir.ay-secili {
            margin-top: 6px; padding-top: 9px; border-top: 1px solid rgba(255,255,255,0.07);
            border-bottom: none;
        }
        #alkis-yaprak .ay-kaydir { max-height: 220px; overflow-y: auto; -webkit-overflow-scrolling: touch; }
        #alkis-yaprak .ay-satir {
            display: flex; gap: 10px; align-items: center; padding: 8px 1px;
            border-bottom: 1px solid rgba(255,255,255,0.06);
        }
        #alkis-yaprak .ay-satir:last-child { border-bottom: none; }
        /* Harf kutusu HÂLİ söyler: altın çalışıyor, yeşil molada.
           (Masa listesindeki kutunun aynısı, yalnız küçültülmüş.) */
        #alkis-yaprak .ay-harf {
            flex: 0 0 30px; height: 30px; border-radius: 10px;
            display: flex; align-items: center; justify-content: center;
            font-size: 0.8em; font-weight: 700;
            color: #e8d5a8; background: rgba(212,175,106,0.13); border: 1px solid rgba(212,175,106,0.4);
        }
        #alkis-yaprak .ay-harf.molada {
            color: #9fe0b8; background: rgba(127,199,154,0.12); border-color: rgba(127,199,154,0.38);
        }
        #alkis-yaprak .ay-ic { min-width: 0; flex: 1; text-align: left; }
        #alkis-yaprak .ay-ad { font-size: 0.86em; font-weight: 600; color: #e2e8f0;
            overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        #alkis-yaprak .ay-alt { font-size: 0.72em; color: #94a3b8; margin-top: 1px; }
        #alkis-yaprak .ay-alt.molada { color: var(--ss-var-acik, #9fe0b8); }
        /* Alkış düğmesi. Verilmiş alkış SÖNMEZ, dolu kalır — geri alma yok. */
        #alkis-yaprak .ay-ver {
            flex: none; width: 30px; height: 30px; border-radius: 50%; padding: 0; cursor: pointer;
            display: flex; align-items: center; justify-content: center;
            background: transparent; border: 1px solid rgba(255,255,255,0.12); color: #6d7c96;
            transition: color .18s, border-color .18s, background .18s;
        }
        #alkis-yaprak .ay-ver svg { width: 14px; height: 14px; display: block; }
        #alkis-yaprak .ay-ver.verildi {
            color: #e8d5a8; border-color: rgba(212,175,106,0.4); background: rgba(212,175,106,0.13); cursor: default;
        }
        /* ✋ ALKIŞ ANI (28 Ağu, canlı prova: "yavaş ve hafif, daha belirgin
           olmalı"). Üç şey aynı anda: el zıplar, çevresine bir halka açılır,
           satır bir an altınla dolar. Kısa — 520 ms; bu bir EŞİK anı, çalışma
           anı değil (Kyron kuralıyla çelişmiyor). */
        @keyframes alkis-el {
            0%   { transform: scale(1) rotate(0deg); }
            22%  { transform: scale(.82) rotate(-12deg); }
            48%  { transform: scale(1.35) rotate(9deg); }
            70%  { transform: scale(1.05) rotate(-4deg); }
            100% { transform: scale(1) rotate(0deg); }
        }
        @keyframes alkis-halka {
            0%   { transform: scale(.6); opacity: .9; border-width: 2px; }
            100% { transform: scale(2.6); opacity: 0; border-width: 1px; }
        }
        @keyframes alkis-satir-parla {
            0%   { background: rgba(212,175,106,.30); }
            100% { background: transparent; }
        }
        #alkis-yaprak .ay-ver.patla svg { animation: alkis-el .52s cubic-bezier(.34,1.56,.64,1) both; }
        #alkis-yaprak .ay-ver.patla::after {
            content: ''; position: absolute; inset: -2px; border-radius: 50%;
            border: 2px solid rgba(212,175,106,.85); pointer-events: none;
            animation: alkis-halka .52s ease-out both;
        }
        #alkis-yaprak .ay-ver { position: relative; }
        #alkis-yaprak .ay-satir.patla { animation: alkis-satir-parla .6s ease-out both; border-radius: 10px; }
        @media (prefers-reduced-motion: reduce) {
            #alkis-yaprak .ay-ver.patla svg,
            #alkis-yaprak .ay-ver.patla::after,
            #alkis-yaprak .ay-satir.patla { animation: none; }
        }

        /* Bugün seni alkışlayanlar — satırı kapatsan da burada durur. */
        #alkis-yaprak .ay-gelen {
            display: flex; align-items: center; gap: 8px;
            margin-top: 8px; padding: 8px 10px; border-radius: 11px;
            background: rgba(212,175,106,0.08); border: 1px solid rgba(212,175,106,0.22);
            font-size: 0.74em; color: #b79a63; line-height: 1.45;
        }
        #alkis-yaprak .ay-gelen svg { width: 13px; height: 13px; flex: none; color: #e8d5a8; }

        /* Uçan el + varış halkası — yolu JS hesaplar, biçimi burada. */
        #alkis-yaprak .ay-ucan {
            position: absolute; z-index: 5; pointer-events: none;
            width: 22px; height: 22px; color: #f0dcae;
            filter: drop-shadow(0 0 8px rgba(212,175,106,.75));
        }
        #alkis-yaprak .ay-ucan svg { width: 100%; height: 100%; display: block; }
        #alkis-yaprak .ay-halka {
            position: absolute; z-index: 4; pointer-events: none;
            width: 34px; height: 34px; border-radius: 50%;
            border: 2px solid rgba(240,220,174,.9);
            box-shadow: 0 0 14px rgba(212,175,106,.5);
        }
        /* El değdiği an harf kutusu altınla dolar. */
        #alkis-yaprak .ay-harf.degdi {
            background: rgba(212,175,106,.42); border-color: #f0dcae; color: #1a1408;
            box-shadow: 0 0 18px rgba(212,175,106,.6);
            transition: background .2s ease, color .2s ease, box-shadow .2s ease;
        }
        /* Hak bitti satırı — kapı ARTIK ALTINDA duruyor, kaybolmuyor. */
        #alkis-yaprak .ay-bitti-satir {
            margin-top: 8px; padding: 8px 10px; border-radius: 11px;
            background: rgba(212,175,106,.07); border: 1px solid rgba(212,175,106,.2);
            font-size: 0.74em; color: #b79a63; font-style: italic; text-align: center;
        }

        #alkis-yaprak .ay-dip {
            margin-top: 6px; padding-top: 8px; border-top: 1px solid rgba(255,255,255,0.07);
            display: flex; align-items: center; justify-content: space-between; gap: 8px;
            font-size: 0.72em; color: #5f6b80;
        }
        #alkis-yaprak .ay-git { color: #94a3b8; cursor: pointer; }
        /* Hak bitti: eller SİLİNİR (sönük değil, YOK) ve yerinde tek cümle kalır.
           "yarın yeniden" bilerek var — sınır geçici, kaybedilmiş bir şey değil. */
        #alkis-yaprak .ay-bitti { color: #b79a63; font-style: italic; }
        #alkis-yaprak .ay-bos { font-size: 0.78em; color: #5f6b80; padding: 6px 1px; }

        /* ODAKTA HİÇBİRİ YOK: sayaç çalışırken alkış ne gösterilir ne verilir.
           Bu ekranın efendisi kadran (16 Ağu kuralının aynısı). */
        /* 🔴 31 Ağu — YAPRAK VE SAYI ODAKTA DA GÖRÜNÜR (kullanıcı kararı).
           Bu satır JS'teki kararı sessizce EZİYORDU: kod "çalışırken de
           açılsın" diyor, biçim `display:none !important` ile kapatıyordu.
           Ekranda görünen: "başlat dediğimde yaprak yine açılmıyor".
           🔒 `#alkis-satir` GİZLİ KALIR ve bu kilitli bir kural: alkışı ALAN
           kişi onu çalışırken görmez (sessiz alkışın tanımı). Kendi açtığın
           yaprak başka şeydir — onu öğrenci bilerek açar. */
        .container.focus-layout #alkis-satir { display: none !important; }

        /* KISA HÂL — odak ekranı. Satır aynı satır, yalnız daha alçak sesle
           konuşur: sayaç ekranın efendisidir, şerit onun altında bir fısıltı.
           Ritim hâlinin altın çerçevesi de yumuşar; yoksa çalışırken göz
           sayaç yerine şeride kayıyordu. */
        .container.focus-layout #masa-serit { font-size: 0.68em; opacity: .78;
            margin: -4px auto 12px; }
        .container.focus-layout #masa-serit.ritim { padding: 3px 10px;
            background: rgba(245,214,123,0.07); border-color: rgba(245,214,123,0.28); }
        .container.focus-layout #masa-serit.ritim.molada {
            background: rgba(127,199,154,0.07); border-color: rgba(127,199,154,0.28); }
        .container.focus-layout #masa-serit:hover { opacity: 1; }

        /* Ritim uyarısı: masa faz değiştirdi. Sayaca DOKUNMAZ, yalnız haber
           verir (31 Tem kullanıcı kararı). Ekranın ortasını kapatmasın diye
           şeridin hemen altında, tek satır. */
        #ritim-uyari { display: flex; align-items: center; gap: 10px; width: fit-content; max-width: 100%;
            margin: -4px auto 12px; padding: 9px 12px 9px 15px; border-radius: 14px;
            font-size: 0.82em; line-height: 1.35; color: #12192B; background: #F5D67B;
            box-shadow: 0 6px 22px rgba(245,214,123,.22); animation: ritimGir .28s ease-out; }
        #ritim-uyari.molada { background: #9FE0B8; }
        #ritim-uyari button { flex: none; border: 0; background: rgba(18,25,43,.12); color: #12192B;
            width: 22px; height: 22px; border-radius: 50%; cursor: pointer; font-size: 12px; line-height: 1; padding: 0; }
        #ritim-uyari button:hover { background: rgba(18,25,43,.22); }
        /* "geç" düğmesi — çipin içindeki tek eylem. Yuvarlak kapat düğmesinden
           ayrılsın diye hap biçiminde ve koyu: haber pasif, bu değil. */
        #ritim-uyari #ritim-uyari-eylem { width: auto; height: auto; border-radius: 99px;
            padding: 4px 12px; font-size: 0.92em; font-weight: 600; letter-spacing: .2px;
            background: rgba(18,25,43,.86); color: #F5D67B; }
        #ritim-uyari #ritim-uyari-eylem:hover { background: #12192B; }
        #ritim-uyari.molada #ritim-uyari-eylem { color: #9FE0B8; }
        #ritim-uyari #ritim-uyari-eylem[hidden] { display: none; }
        @keyframes ritimGir { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }
        @media (prefers-reduced-motion: reduce) { #ritim-uyari { animation: none; } }

        /* ═══ MOLA KARTI — üç kaynağın tek yüzü (16 Ağu 2026) ═══════════════
           Masanın, sınıfın ve kişisel ritmin molası AYNI kartı açar. Sayaca
           dokunan tek şey öğrencinin parmağı; kart yalnız sorar.

           İKİ BOY: ilk 10 saniye BÜYÜK (kaçırılmasın), sonra ŞERİT (molaya
           katılmayanın ekranını kaplamasın). Şeritte de düğme durur — karar
           geç de verilebilir. */
        #mola-karti { width: fit-content; max-width: 100%; margin: -4px auto 12px;
            padding: 12px 14px; border-radius: 16px; text-align: left;
            background: rgba(127,199,154,0.10); border: 1px solid rgba(127,199,154,0.42);
            color: #dce8fa; animation: ritimGir .28s ease-out; }
        #mola-karti[hidden] { display: none; }
        /* Mola bitti hâli: renk "izin"den "davet"e döner (kehribar). */
        #mola-karti.bitti { background: rgba(245,214,123,0.10); border-color: rgba(245,214,123,0.45); }
        #mola-karti .mk-ust { display: flex; align-items: center; gap: 8px; }
        #mola-karti .mk-nokta { flex: none; width: 8px; height: 8px; border-radius: 50%;
            background: #7FC79A; box-shadow: 0 0 10px rgba(127,199,154,.7); }
        #mola-karti.bitti .mk-nokta { background: #F5D67B; box-shadow: 0 0 10px rgba(245,214,123,.7); }
        #mola-karti .mk-baslik { font-size: 0.95em; font-weight: 600; color: #eaf2ff; }
        #mola-karti .mk-sayi { font-size: 0.95em; font-variant-numeric: tabular-nums;
            color: #9fe0b8; font-weight: 600; }
        #mola-karti.bitti .mk-sayi { color: #F5D67B; }
        #mola-karti .mk-x { margin-left: auto; flex: none; border: 0; background: rgba(255,255,255,.06);
            color: #7f93b3; width: 22px; height: 22px; border-radius: 50%; cursor: pointer;
            font-size: 11px; line-height: 1; padding: 0; }
        #mola-karti .mk-x:hover { color: #cfe0f5; background: rgba(255,255,255,.12); }
        /* Açıklama yalnız İLK karşılaşmada var (16 Ağu); gizlendiğinde kart
           başlık + düğme olarak kalsın diye boşluk düğmelerin üstünde durur. */
        #mola-karti .mk-alt { font-size: 0.8em; color: #9fb3d1; margin: 6px 0 0; line-height: 1.4; }
        #mola-karti .mk-alt[hidden] { display: none; }
        #mola-karti .mk-dugmeler { display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
            margin-top: 10px; }
        #mola-karti button { cursor: pointer; font: inherit; }
        #mola-karti .mk-birincil { border: 0; border-radius: 10px; padding: 9px 15px;
            font-size: 0.85em; font-weight: 700; background: #7FC79A; color: #08301B; }
        #mola-karti.bitti .mk-birincil { background: #F5D67B; color: #12192B; }
        #mola-karti .mk-ikincil { border: 1px solid rgba(255,255,255,.14); border-radius: 10px;
            padding: 8px 13px; font-size: 0.8em; background: transparent; color: #9fb3d1; }
        #mola-karti .mk-ikincil:hover { color: #dce8fa; border-color: rgba(255,255,255,.28); }
        /* ŞERİT HÂLİ: tek satır — açıklama susar, düğmeler küçülüp yana geçer. */
        #mola-karti.durgun { padding: 8px 12px; border-radius: 999px;
            display: flex; align-items: center; gap: 10px; }
        #mola-karti.durgun .mk-alt { display: none; }
        #mola-karti.durgun .mk-ust { gap: 7px; }
        #mola-karti.durgun .mk-x { margin-left: 0; order: 3; }
        #mola-karti.durgun .mk-dugmeler { gap: 6px; margin-top: 0; }
        #mola-karti.durgun .mk-birincil { padding: 5px 11px; font-size: 0.78em; border-radius: 999px; }
        #mola-karti.durgun .mk-ikincil { display: none; }
        @media (prefers-reduced-motion: reduce) { #mola-karti { animation: none; } }

        /* "Numaranı bağla" kartı — yalnız misafire görünür, kapatılabilir (7 gün). */
        #kart-davet { display: flex; align-items: center; gap: 10px; margin: 0 0 6px;
            padding: 9px 12px; background: rgba(37,211,102,0.07);
            border: 1px solid rgba(37,211,102,0.25); border-radius: 12px;
            font-size: 0.8em; color: #cfe0f5; text-align: left; }
        #kart-davet[hidden] { display: none; }
        #kart-davet .metin { flex: 1; min-width: 0; line-height: 1.35; }
        #kart-davet .metin b { display: block; color: #eaf2ff; font-size: 1.02em; }
        #kart-davet button { cursor: pointer; font: inherit; }
        #kart-davet-bagla { flex: none; background: #25D366; color: #042A14; border: 0;
            border-radius: 9px; padding: 8px 13px; font-weight: 700; }
        #kart-davet-bagla:disabled { opacity: .5; cursor: wait; }
        #kart-davet-kapat { flex: none; background: none; border: 0; color: #7f93b3;
            font-size: 1.05em; padding: 4px; }
        #kart-davet-kapat:hover { color: #cfe0f5; }
        /* ÇAKIŞMA HÂLİ: aynı kutu, BAŞKA anlam. Yeşil bu tasarımda "WhatsApp
           kanalı" demek (davet, bağlanma); uyarıyı da yeşil bırakmak "her şey
           yolunda" diye okunurdu. Kehribar: dur-bak, ama alarm değil. */
        #kart-davet[data-cakisma="1"] { background: rgba(245,158,11,0.09);
            border-color: rgba(245,158,11,0.40); }
        #kart-davet[data-cakisma="1"] #kart-davet-bagla { background: rgba(245,158,11,0.16);
            color: #FCD34D; border: 1px solid rgba(245,158,11,0.5); }
        /* E-posta ile giriş satırı — kartın altında, sessiz bir metin bağlantısı. */
        #eposta-giris-satir { text-align: center; font-size: 0.78em; color: #7f93b3; margin: -2px 0 8px; }
        #eposta-giris-satir[hidden] { display: none; }
        #eposta-giris-satir button { background: none; border: 0; padding: 0 2px; font: inherit; color: #cfe0f5;
            text-decoration: underline; text-underline-offset: 3px; cursor: pointer; }
        #eposta-giris-satir button:hover { color: #ffffff; }

        /* "NE ÇALIŞACAKSIN?" KARTI SÖKÜLDÜ (24 Ağu gecesi, kullanıcı):
           katlanan kapak kalktı, kutular hep açık duruyor. Stilleri de gitti. */
        /* ═══ C4 · SIRAYLA BASAMAK (1 Ağu: sıra artık ZORUNLU) ═══
           Yalnız sıradaki adım tam görünür; sonraki BOŞ kutular sessiz bekler
           ve AÇILMAZ — dokunulursa sıradaki kutu kısa bir ışıkla kendini
           gösterir (kod: renderCustomDropdown → siradakiniGoster).
           Solukluk opacity İLE DEĞİL: yarı saydam kutu alttaki kronometre
           verileriyle üst üste okunuyordu (kullanıcı canlıda yakaladı) ve
           opacity alt ağacın tamamını ezdiği için içinden açılan liste de
           soluk kalıyordu. Bunun yerine OPAK sessiz stil: zemin dolu, yalnız
           yazı/çerçeve kısık. Dolu kutu bekliyor olsa da normal görünür ve
           açılabilir — seçim görünsün, değiştirilebilsin. */
        #secim-alani .bekliyor .dropdown-selected:not(.has-value) {
            background: #141C2E; color: #55637D;
            border-color: rgba(255, 255, 255, 0.05);
            backdrop-filter: none; -webkit-backdrop-filter: none;
        }
        #secim-alani .bekliyor .dropdown-selected:not(.has-value):hover {
            color: #6B7B99; border-color: rgba(255, 255, 255, 0.08);
        }
        /* Bekleyene dokunuldu → sıradaki kendini gösterir: sarsıntı yok,
           camgöbeği kısa ışık (listelerin çerçevesiyle aynı dil). */
        #secim-alani .sirada-vurgu .dropdown-selected {
            border-color: rgba(0, 242, 254, 0.55);
            box-shadow: 0 0 0 1px rgba(0, 242, 254, 0.22), 0 0 16px rgba(0, 242, 254, 0.16);
        }

        /* ⚠️ BURADA ANİMASYON YOK — BİLEREK.
           Önce `max-height` + `overflow` ile katlanıyordu. O kurulumda açılan
           ders/konu listesi (position:absolute) KIRPILAN bir kabın dışına taşmak
           zorundaydı ve bu, `.container`daki backdrop-filter ile birleşince
           tarayıcıda listenin ZEMİNİNİ düşürüyordu: liste saydam görünüyor,
           altındaki "Çalışma türü seç", "BİTİR", "BAŞLAT" içinden okunuyordu
           (kullanıcı canlıda yakaladı).
           Çözüm kırılganlığın kaynağını kaldırmak: kap artık hiç kırpmıyor,
           dolayısıyla listenin "kaçması" gereken bir sınır da yok. Kaybedilen
           0,3 sn'lik kayma; kazanılan, listenin her yerde opak çıkması. */
        #secim-alani { display: none; }
        #secim-alani.acik { display: block; }

        .custom-dropdown { position: relative; width: 100%; margin-bottom: 12px; }

        /* ═══ GÜNÜN NABZI — blok arası tek satır (24 Ağu gecesi) ═══════════
           Masa şeridiyle aynı dil: çerçeveli, ince, bağırmayan tek satır.
           Solda günün toplamı, sağda ders başına mini çubuk. Çalışma
           başlayınca gizlenir (odak ekranına öğe eklenmez). */
        #gun-nabiz {
            display: flex; align-items: center; gap: 9px; width: 100%;
            padding: 6px 11px; margin: 0 0 7px; border-radius: 99px; cursor: pointer;
            border: 1px solid rgba(255,255,255,.08); background: rgba(255,255,255,.025);
            font-family: inherit; font-size: .72em; color: #8fa2bf; overflow: hidden;
        }
        #gun-nabiz[hidden] { display: none; }
        .container.focus-layout #gun-nabiz { display: none; }
        /* ═══ ANALİZ EKRANINDA DERS ŞERİDİ YOK (3 Eyl, kullanıcı) ═════════
           Analiz tek amaçlı bir ekran: elinde bir hata listesi var, onu
           çözmeye geldin. "Bugün hangi derse kaç dakika" o an sorulan soru
           değil; ekranı kalabalıklaştırıyordu. Normal seçim ekranında
           DURUYOR — orada "bugün ne yaptım?"ın evi o satır. */
        .container.analiz-secili #gun-nabiz,
        .container.analysis-mode #gun-nabiz { display: none; }
        #gun-nabiz .gn-top { font-weight: 800; color: #cbd5e1; white-space: nowrap; letter-spacing: .2px; }
        #gun-nabiz .gn-ayrac { width: 1px; height: 11px; background: rgba(255,255,255,.12); flex: none; }
        /* ═══ NABIZ ŞERİDİ: ÇUBUKLAR YANA BÜYÜDÜ (25 Ağu, kullanıcı isteği)
           Çubuklar 22px SABİT genişlikteydi — şeridin sağında bol boşluk
           dururken oran okunamıyordu ("FİZ ▬ BİY ▬ MAT ▬▬"). Artık esnek:
           boş kalan genişliği üç ders paylaşıyor ve çubuk kalınlaştı
           (4 → 7). Ders adı da bir tık büyüdü. Şerit yine TEK SATIR ve
           yuvarlak çerçevesini koruyor. */
        #gn-cubuklar { display: flex; align-items: center; gap: 11px; flex: 1; min-width: 0; overflow: hidden; }
        #gn-cubuklar .gn-d {
            display: inline-flex; align-items: center; gap: 6px;
            flex: 1 1 0; min-width: 0; font-size: 1em; letter-spacing: .3px;
        }
        #gn-cubuklar .gn-c {
            display: block; flex: 1; min-width: 24px; height: 8px; border-radius: 4px;
            background: rgba(255,255,255,.10); position: relative; overflow: hidden;
        }
        #gn-cubuklar .gn-c i { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 4px; background: var(--success); }
        #gn-cubuklar .gn-c i.tam { background: #34d399; }
        #gun-nabiz .gn-ok { flex: none; color: #5b6b86; font-size: .9em; }

        /* ═══ ANALİZ KARTI (3 Eyl) ═══════════════════════════════════════
           Üç kat: kip adı · ders·konu · hata sayısı. Altında vazgeçme düğmesi.
           Kart çerçevesizdir — kadranın altında ikinci bir kutu, ekranı
           kalabalıklaştırırdı; kat kat yazı zaten kendi hiyerarşisini kuruyor. */
        #analysis-banner { text-align: center; margin: 2px 0 16px; }
        #analysis-banner .ab-kip {
            font-size: .68em; letter-spacing: .16em; text-transform: uppercase;
            color: rgba(255, 213, 79, .62); font-weight: 700;
        }
        #analysis-banner .ab-ad {
            font-size: .98em; font-weight: 700; color: #FFD54F; line-height: 1.35;
            margin-top: 3px; text-wrap: balance;
        }
        #analysis-banner .ab-sayi { font-size: .78em; color: #8fa2bf; margin-top: 3px; }
        /* Vazgeçme kehribar DEĞİL: ekranın altın ışığıyla yarışmaz, ama artık
           yazı değil düğme — dokunulacağı belli, dokunma alanı geniş. */
        #analysis-banner #btn-exit-analysis {
            flex: none; width: auto; margin-top: 11px; padding: 7px 20px;
            border-radius: 999px; font-size: .76em; font-weight: 600; letter-spacing: .04em;
            background: rgba(255, 255, 255, .05); border: 1px solid rgba(255, 255, 255, .16);
            color: #a9b8d0;
        }
        #analysis-banner #btn-exit-analysis:not(:disabled):hover {
            background: rgba(255, 255, 255, .1); color: #e2e8f0; transform: none; box-shadow: none;
        }

        /* ── GÜN DÖKÜMÜ — üç yerde aynı çizim (nabız yaprağı · kayıt ekranı) ── */
        .gun-dokum { border: 1px solid var(--glass-border); border-radius: 13px; padding: 9px 12px; }
        .gun-dokum .gd-bas {
            font-size: .62em; letter-spacing: 1.1px; text-transform: uppercase;
            color: #7f8ea8; font-weight: 700; margin-bottom: 7px;
        }
        .gun-dokum .gd-bas b { color: var(--success); letter-spacing: .4px; font-size: 1.15em; }
        /* ═══ KATLANIR DÖKÜM (3 Eyl, kullanıcı) ══════════════════════════
           "Bu kısım açılır kapanır olsun, isteyen detaya baksın — kalabalığı
           giderelim." Başlık artık bir kapı: kapalıyken tek satır (bugün kaç
           dakika), açıkken ders ders döküm. Kapı KAPALI doğar; kayıt ekranına
           bakan öğrencinin ilk sorusu "kaydım doğru mu", "hangi derse kaç
           dakika" değil. */
        .gun-dokum.katlanir { padding: 0; }
        .gun-dokum .gd-kapi {
            display: flex; align-items: center; gap: 8px; width: 100%;
            padding: 10px 12px; margin: 0; border: 0; border-radius: 13px;
            background: none; cursor: pointer; text-align: left;
            font-family: inherit; font-size: .62em; letter-spacing: 1.1px;
            text-transform: uppercase; color: #7f8ea8; font-weight: 700;
        }
        .gun-dokum .gd-kapi:not(:disabled):hover { transform: none; box-shadow: none; background: rgba(255,255,255,.03); }
        .gun-dokum .gd-kapi .gd-ok { margin-left: auto; font-size: 1.5em; line-height: 1; transition: transform .2s ease; }
        .gun-dokum.kapali .gd-kapi .gd-ok { transform: rotate(-90deg); }
        .gun-dokum .gd-govde { padding: 0 12px 10px; }
        .gun-dokum.kapali .gd-govde { display: none; }
        /* ═══ DERS ÇUBUKLARI YANA BÜYÜDÜ (25 Ağu, kullanıcı isteği) ══════
           Çubuk satırın ortasında ince bir çizgiydi; asıl bilgi O ve iki
           yandaki metinler ondan çok yer alıyordu. Ders adı ve kalan süre
           daraltıldı, boşluk kısıldı — kazanılan genişliğin tamamı çubuğa
           gitti. Çubuk da kalınlaştı (5 → 8): uzaktan bakışta oran okunsun. */
        .gd-sat { display: flex; align-items: center; gap: 7px; font-size: .74em; color: #cbd5e1; padding: 5px 0; }
        .gd-sat .gd-ad { width: 92px; flex: none; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .gd-sat .gd-cub { flex: 1; height: 8px; border-radius: 4px; background: rgba(255,255,255,.08); position: relative; overflow: hidden; }
        .gd-sat .gd-cub i { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 4px; background: var(--success); }
        .gd-sat .gd-cub i.tam { background: #34d399; }
        /* Hedefsiz ders: ölçülecek bir oran yok, o yüzden çubuk da yok.
           Satırlar hizada dursun diye yerinde ince bir noktalı iz kalır. */
        .gd-sat .gd-cub.hedefsiz { background: none; height: 0; border-top: 1px dotted rgba(255,255,255,.16); border-radius: 0; }
        #gn-cubuklar .gn-c.hedefsiz { background: none; border-bottom: 1px dotted rgba(255,255,255,.20); border-radius: 0; }
        .gd-sat .gd-kal { width: 62px; flex: none; text-align: right; font-size: .92em; color: #7f8ea8; white-space: nowrap; }
        .gd-sat .gd-kal.ok { color: #34d399; }
        /* Kayıt ekranındaki kopya: TOPLAM şeridinin hemen altında durur. */
        #gun-seyri { margin: 0 0 4px; }
        #gun-seyri[hidden] { display: none; }

        /* ═══ HEDEF LİSTESİ — doğrudan görünen hedefler (24 Ağu gecesi) ════
           Açılır kutunun yerini aldı: gününün dersleri ekranda, seçmek için
           kutu açmak yok. Serbest çalışma ayrı bir öbekte ve sönük durur —
           programın parçası değil, yanındaki kapı. */
        #hedef-listesi { margin: 0 0 8px; }
        #hedef-listesi[hidden] { display: none; }
        .container.focus-layout #hedef-listesi { display: none; }
        #hedef-listesi .hl-bas,
        #duzelt-govde .hl-bas {
            font-size: .62em; letter-spacing: 1.4px; text-transform: uppercase;
            color: #7f8ea8; font-weight: 500; margin: 0 2px 5px; text-align: left;
        }
        #hedef-listesi .hl-kume,
        #duzelt-govde .hl-kume { display: flex; flex-direction: column; gap: 5px; }
        #hedef-listesi .hl-kume.serbest,
        #duzelt-govde .hl-kume.serbest { margin-top: 7px; }

        /* ═══ SERBEST ÇALIŞMA AÇILIR-KAPANIR (24 Ağu, kullanıcı kararı) ═══
           Programı olan öğrencide kapalı doğar: ekranın kahramanı bugünün
           programı. Başlık `hl-bas`ın (BUGÜNÜN PROGRAMI) sesiyle konuşur —
           yeni bir görsel dil değil, aynı fısıltı; farkı dokunulabilir olması
           ve sonunda bir ok taşıması. */
        #hedef-listesi .hl-serbest-bas,
        #duzelt-govde .hl-serbest-bas {
            /* Üst karta yapışıyordu: başlık programın parçası gibi duruyordu.
               Program öbeği ile serbest kapısı arasına gerçek bir nefes kondu
               (25 Ağu, kullanıcı bulgusu). */
            display: flex; align-items: center; gap: 6px; width: 100%;
            background: none; border: none; padding: 16px 2px 5px; cursor: pointer;
            font-family: inherit; font-size: .62em; letter-spacing: 1.2px;
            text-transform: uppercase; color: #7f8ea8; font-weight: 500; text-align: left;
            transition: color .25s ease;
        }
        #hedef-listesi .hl-serbest-bas:hover,
        #duzelt-govde .hl-serbest-bas:hover,
        #hedef-listesi .hl-serbest-bas.acik,
        #duzelt-govde .hl-serbest-bas.acik { color: #9db0cc; }
        /* Ok: iki çizgiden bir ▾. Açılınca yarım tur döner — kapının açıldığı
           tek hareket burada, gerisi sessiz. */
        /* Başlığın solundaki liste ikonu: "buradan kendi konunu seçebilirsin". */
        #hedef-listesi .hl-serbest-bas .hls-ik,
        #duzelt-govde .hl-serbest-bas .hls-ik { display: flex; }
        #hedef-listesi .hl-serbest-bas .hls-ik svg,
        #duzelt-govde .hl-serbest-bas .hls-ik svg { width: 13px; height: 13px; display: block; }
        #hedef-listesi .hl-serbest-bas span:not(.hls-ik),
        #duzelt-govde .hl-serbest-bas span:not(.hls-ik) { flex: 1; }
        #hedef-listesi .hl-serbest-bas i,
        #duzelt-govde .hl-serbest-bas i {
            width: 7px; height: 7px; border-right: 1.6px solid currentColor;
            border-bottom: 1.6px solid currentColor; border-radius: 1px;
            transform: translateY(-2px) rotate(45deg); transition: transform .28s ease;
        }
        #hedef-listesi .hl-serbest-bas.acik i,
        #duzelt-govde .hl-serbest-bas.acik i { transform: translateY(1px) rotate(-135deg); }
        #hedef-listesi .hl-kume.serbest.kapali,
        #duzelt-govde .hl-kume.serbest.kapali { display: none; }
        #hedef-listesi .hl-serbest-bas + .hl-kume.serbest,
        #duzelt-govde .hl-serbest-bas + .hl-kume.serbest { margin-top: 0; }
        #hedef-listesi .hl-kume.sonuk,
        #duzelt-govde .hl-kume.sonuk { opacity: .55; }
        /* ═══ KART YAZISI DAHA ZARİF (25 Ağu, kullanıcı bulgusu) ═════════
           "Harfler çok net görünüyor." Doğruydu: bütün satır 600 ağırlıkta ve
           tek renkteydi — ders adı da, ekli haber de aynı sesle bağırıyordu.
           Artık satırda İKİ ses var:
             · DERS  → 600 ağırlık, açık gri (okunacak olan)
             · ekler → 400 ağırlık, kısık gri ("· konuları bitti" gibi haberler)
           Harfler nefes alsın diye satır aralığı, harf aralığı ve iç boşluk
           bir tık açıldı. */
        #hedef-listesi .hl-satir,
        #duzelt-govde .hl-satir {
            position: relative; display: flex; align-items: center; gap: 9px; width: 100%;
            padding: 10px 13px; border-radius: 12px; cursor: pointer; text-align: left;
            border: 1px solid rgba(255,255,255,.10); background: rgba(255,255,255,.035);
            font-family: inherit; font-size: .855em; font-weight: 400; color: #dbe4f0;
            letter-spacing: .006em; line-height: 1.3;
            overflow: hidden; transition: border-color .18s ease, background .18s ease;
        }
        /* ═══ HEPSİ İNCE (25 Ağu, kullanıcı kararı) ══════════════════════
           "Tüm yazıları ince yapsan daha zarif olacak sanki." Ders adı da
           400 ağırlığa indi; ayrım artık KALINLIKTAN değil IŞIKTAN geliyor —
           ders açık, ek kısık. Yayınevi dizgisi mantığı: tek ağırlık, iki ton.
           Harf aralığı bir tık açıldı ki incelik cılızlığa dönüşmesin. */
        #hedef-listesi .hl-ad b,
        #duzelt-govde .hl-ad b { font-weight: 400; letter-spacing: .012em; color: #e8eef7; }
        /* "· konuları bitti", "· Türev" gibi ekler: aynı satırda ama daha kısık. */
        #hedef-listesi .hl-konu,
        #duzelt-govde .hl-konu { font-weight: 400; color: #8fa0ba; }
        #hedef-listesi .hl-satir.secili .hl-konu,
        #duzelt-govde .hl-satir.secili .hl-konu { color: #9ed4e6; }
        #hedef-listesi .hl-satir:active,
        #duzelt-govde .hl-satir:active { transform: scale(.995); }
        /* 25 Ağu: satır artık üç parça (ders · işaret · konu) — kırpma
           `hl-ad`ta değil KONUDA yapılıyor, yoksa işaret de kırpılırdı. */
        #hedef-listesi .hl-ad,
        #duzelt-govde .hl-ad { flex: 1; min-width: 0; display: flex; align-items: center; }
        /* ═══ HEDEF SÜRESİ DE YAZAR (25 Ağu, kullanıcı isteği) ═══════════
           Satır "33 dk kaldı" diyordu ama NEDEN 33 olduğunu söylemiyordu —
           öğrenci hedefin 40 mı 60 mı olduğunu bilmeden kalanı ölçemez.
           Kalan üstte (karar bilgisi), hedef altta ve kısık (bağlam). */
        #hedef-listesi .hl-sag,
        #duzelt-govde .hl-sag {
            flex: none; font-size: .82em; font-weight: 400; color: #93a5c0;
            white-space: nowrap; text-align: right; line-height: 1.25;
        }
        #hedef-listesi .hl-sag small,
        #duzelt-govde .hl-sag small {
            display: block; font-size: .84em; font-weight: 400; color: #64748b; letter-spacing: .02em;
        }
        /* ═══ SÜRE ARTIK YAN YANA (25 Ağu ikinci tur) ════════════════════
           "60 dk kaldı" üstte, "60 dk hedef" altta yazıyordu; hiç
           çalışılmamış derste ikisi de AYNI sayıydı — satır aynı şeyi iki
           kez söylüyordu. Artık tek satır: büyük sayı yapılanı (ya da
           hedefi), kısık kuyruk bağlamı taşıyor — "25 / 60 dk". */
        #hedef-listesi .hl-sag b,
        #duzelt-govde .hl-sag b { font-weight: 800; color: #cfe0f5; font-size: 1.12em; }
        #hedef-listesi .hl-sag i,
        #duzelt-govde .hl-sag i {
            font-style: normal; font-size: .88em; color: #64748b; margin-left: 3px;
        }
        #hedef-listesi .hl-sag.ok,
        #duzelt-govde .hl-sag.ok { color: #34d399; }
        #hedef-listesi .hl-sag.ok small,
        #duzelt-govde .hl-sag.ok small { color: #5f7a6f; }
        #hedef-listesi .hl-sag.ok i,
        #duzelt-govde .hl-sag.ok i { color: #5f7a6f; }
        /* KONU SIRASI KURULMAMIŞ DERS: yeşil "tamam" değil, altın bir DAVET.
           Satır kapalı görünür ama tıklanır — konu sayfasına götürür. */
        /* ═══ KONUŞAN İŞARET (25 Ağu) ═══════════════════════════════════
           Tirenin yerini alan işaret. İki hâli var, RENK ayırıyor:
             · altın üçgen  → bu konu sırada, hiç dokunulmadı (taze iş)
             · çelik ikon   → daha önce oturuldu; ikon EN SON ne yapıldığını
                              söyler (yarım kalmış iş)
           İkonlar tür seçme kartlarının kendisi (`PK_TUR_SVG`) — öğrenci
           onları zaten tanıyor, yeni bir alfabe öğretmiyoruz. */
        #hedef-listesi .hl-ad b,
        #duzelt-govde .hl-ad b { flex: none; white-space: nowrap; }
        #hedef-listesi .hl-konu,
        #duzelt-govde .hl-konu {
            min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
        }
        #hedef-listesi .hl-ek,
        #duzelt-govde .hl-ek { flex: none; white-space: nowrap; }
        #hedef-listesi .hl-im,
        #duzelt-govde .hl-im { flex: none; margin: 0 5px 0 8px; }
        #hedef-listesi .hl-im.sira,
        #duzelt-govde .hl-im.sira { color: #d4af6a; font-weight: 700; font-size: .9em; }
        #hedef-listesi .hl-im.tur,
        #duzelt-govde .hl-im.tur { width: 14px; height: 14px; color: #6f9fd0; display: block; }
        #hedef-listesi .hl-im.tur svg,
        #duzelt-govde .hl-im.tur svg {
            width: 100%; height: 100%; fill: none; stroke: currentColor;
            stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round;
        }
        /* Kapalı satırlarda işaret de sönsün — satırın hâliyle uyumlu. */
        #hedef-listesi .hl-satir.bitti .hl-im,
        #duzelt-govde .hl-satir.bitti .hl-im,
        #hedef-listesi .hl-satir.sirasiz .hl-im,
        #duzelt-govde .hl-satir.sirasiz .hl-im { opacity: .6; }

        #hedef-listesi .hl-sag.kur,
        #duzelt-govde .hl-sag.kur { color: #d4af6a; }
        #hedef-listesi .hl-sag.kur small,
        #duzelt-govde .hl-sag.kur small { color: #8a7442; }
        #hedef-listesi .hl-satir.sirasiz,
        #duzelt-govde .hl-satir.sirasiz { opacity: .82; border-left: 2px solid rgba(212,175,106,.5); }
        #hedef-listesi .hl-satir.sirasiz .hl-ad b,
        #duzelt-govde .hl-satir.sirasiz .hl-ad b { color: #b9a887; }
        /* Çubuk satırın DİBİNDE ince bir iz: ayrı bir öğe gibi durmasın. */
        #hedef-listesi .hl-cubuk,
        #duzelt-govde .hl-cubuk { position: absolute; left: 0; right: 0; bottom: 0; height: 2px; background: rgba(255,255,255,.05); }
        #hedef-listesi .hl-cubuk i,
        #duzelt-govde .hl-cubuk i { position: absolute; left: 0; top: 0; bottom: 0; background: var(--success); opacity: .75; }
        #hedef-listesi .hl-cubuk i.tam,
        #duzelt-govde .hl-cubuk i.tam { background: #34d399; opacity: .9; }
        #hedef-listesi .hl-satir.secili,
        #duzelt-govde .hl-satir.secili { border-color: rgba(0,242,254,.45); background: rgba(0,242,254,.09); color: #dff4fb; }
        /* ✅ TAMAMLANAN HEDEF SÖNÜK AMA DOKUNULUR (29 Ağu, kullanıcı kararı).
           `pointer-events: none` asıl engeldi: satır sönük görünüp hiç tepki
           vermiyordu — görünen ama ölü öğe (panjur tuzağı). Hedef bir TAVAN
           değil bir sözdür; öğrenci aynı derse daha çok çalışmak isteyebilir.
           Sönüklük "bugünlük sözünü tuttun" der, kapıyı kapatmaz. */
        #hedef-listesi .hl-satir.bitti,
        #duzelt-govde .hl-satir.bitti { opacity: .52; }
        #hedef-listesi .hl-satir.bitti:active,
        #duzelt-govde .hl-satir.bitti:active { opacity: .75; }
        #hedef-listesi .hl-satir.hl-serbest,
        #duzelt-govde .hl-satir.hl-serbest { border-style: dashed; background: transparent; color: #9db0cc; font-weight: 500; }
        #hedef-listesi .hl-satir.hl-serbest.secili,
        #duzelt-govde .hl-satir.hl-serbest.secili { border-style: solid; }

        /* ═══ TÜR KUTULARI — ÇALIŞMA · SORU ÇÖZÜMÜ (24 Ağu gecesi) ═════════
           Açılır listenin yerini iki kutu aldı; tür kartlarıyla aynı dil.
           Seçili kutu camgöbeği yanar; ÇALIŞMA'nın alt satırı seçilen alt
           türü söyler ("· video izliyorum"). */
        #tur-kutulari { display: flex; gap: 8px; }
        #tur-kutulari[hidden] { display: none; }
        .tk-kutu {
            flex: 1; display: flex; flex-direction: column; align-items: center; gap: 1px;
            padding: 7px 8px 6px; border-radius: 13px; cursor: pointer; text-align: center;
            border: 1px solid rgba(255,255,255,.10); background: rgba(255,255,255,.03);
            font-family: inherit; transition: border-color .18s ease, background .18s ease;
        }
        .tk-kutu b { font-size: .78em; font-weight: 800; letter-spacing: .9px; color: #cbd5e1; line-height: 1.25; }
        .tk-kutu small { font-size: .64em; color: #7f8ea8; line-height: 1.2; }
        .tk-kutu:active { transform: scale(.98); }
        .tk-kutu.secili { border-color: rgba(0,242,254,.45); background: rgba(0,242,254,.09); }
        .tk-kutu.secili b { color: #8ef0ff; }
        .tk-kutu.secili small { color: #9adfe8; }
        .tk-kutu:disabled { opacity: .4; pointer-events: none; }
        /* ——— Seçiciler (Kyron dili · renk anayasası) ———
           Eskiden TERS kuruluydu: BOŞ kutu camgöbeği, kalın ve parlak bağırıyor;
           doldurulmuş kutu ise sessizleşiyordu. Yani ekranda en çok bağıran şey
           "henüz seçmedin" bilgisiydi ve dört kutu aynı anda bunu yapıyordu.
           Artık tersi: boş kutu sakin bir davet, dolu kutu net okunur.
           Altın burada YOK — altın yalnız Kyron konuşunca (tek altın kart kuralı). */
        /* 🔻 OK İŞARETİ (7 Eyl 2026, gezinti raporu 3. madde) ─────────────
           Kutu 420x74'lük boş bir levhaydı: dokununca bir liste açılacağını
           söyleyen HİÇBİR işaret yoktu. Anayasa: "düğmeye benzeyen
           dokunulabilir olmalıdır" — tersi de doğru, dokunulabilen
           dokunulabilir GÖRÜNMELİ (panjur tuzağının kardeşi).
           Ok bir ÇİZİM (maske değil, kendi kutusunda döner): liste açılınca
           yukarı bakar, kapanınca aşağı. Yazının üstüne binmesin diye sağda
           yer ayrılıyor. */
        .dropdown-selected {
            position: relative;
            padding: 14px 40px 14px 14px; border-radius: 12px; background: rgba(255, 255, 255, 0.03);
            color: #8fa2bf; font-weight: 500; border: 1px solid rgba(255, 255, 255, 0.09);
            cursor: pointer; text-align: left; font-size: 0.95em; backdrop-filter: blur(10px);
            transition: all 0.3s ease; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
        }
        .dropdown-selected::after {
            content: ''; position: absolute; right: 15px; top: 50%;
            width: 9px; height: 9px; margin-top: -6px;
            border-right: 2px solid #7f8ea8; border-bottom: 2px solid #7f8ea8;
            border-radius: 1px;
            transform: rotate(45deg); transform-origin: center;
            transition: transform .2s ease, border-color .2s ease;
            pointer-events: none;
        }
        .custom-dropdown.acik .dropdown-selected::after {
            transform: rotate(-135deg); margin-top: -2px; border-color: #c3d0e4;
        }
        .dropdown-selected.disabled::after { opacity: .5; }
        .dropdown-selected:hover { border-color: rgba(255, 255, 255, 0.2); color: #b6c6de; }
        .dropdown-selected.has-value {
            background: rgba(255, 255, 255, 0.05); color: #E8EDF7; font-weight: 600; border-color: var(--glass-border);
        }
        .dropdown-selected.disabled { opacity: 0.5; cursor: not-allowed; }
        /* 🔴 ÇERÇEVE PALETİMİZDE YOKTU (7 Eyl): `var(--primary)` = #4facfe,
           kaçak mavi. Zemin de hazır kütüphane grisiydi (#1e293b). İkisi de
           ürünün lacivertine çekildi.
           🔼 YUKARI DA AÇILIR: kutu ekranın dibindeyken liste AŞAĞI açılıyor
           ve 20 dersin iki buçuğu görünüyordu. `.yukari` sınıfı JS'ten gelir —
           aşağıda yer yoksa liste kutunun ÜSTÜNE çıkar. */
        .dropdown-list {
            display: none; position: absolute; top: 100%; left: 0; right: 0; z-index: 99;
            background: #131c2e; border-radius: 12px; border: 1px solid rgba(255,255,255,0.14);
            max-height: 200px; overflow-y: auto; margin-top: 5px; box-shadow: 0 10px 28px rgba(0,0,0,0.55);
        }
        .dropdown-list.yukari {
            top: auto; bottom: 100%; margin-top: 0; margin-bottom: 5px;
            box-shadow: 0 -10px 28px rgba(0,0,0,0.55);
        }
        .dropdown-item { padding: 12px 14px; color: white; cursor: pointer; text-align: left; border-bottom: 1px solid rgba(255,255,255,0.05); font-size: 0.9em; }
        .dropdown-item:last-child { border-bottom: none; }
        /* Neon camgöbeği vurgu kalktı (7 Eyl): camgöbeği DURUM rengi oldu,
           bir satırın üstünde durmak bir durum değil. */
        .dropdown-item:hover { background: rgba(255, 255, 255, 0.06); }
        .dropdown-item.disabled { color: #64748b; cursor: not-allowed; }
        .dropdown-item.disabled:hover { background: none; }

        input { 
            width: 100%; padding: 14px; border-radius: 12px; 
            background: rgba(255, 255, 255, 0.05); color: white; 
            border: 1px solid var(--glass-border); margin-bottom: 12px; 
            font-size: 1.1em; outline: none; box-sizing: border-box;
            backdrop-filter: blur(10px); -webkit-appearance: none; appearance: none;
            text-align: center; transition: all 0.3s ease;
        }
        input:focus { border-color: var(--primary); background: rgba(255, 255, 255, 0.1); box-shadow: 0 0 15px rgba(0, 242, 254, 0.3); }
        input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }

        /* Sürenin nefesi. İki değişiklik: rengi altına döndü (kadranda tek canlı ışık)
           ve periyodu 2,5 sn'den 4,5 sn'ye çıkarıldı — Kyron'un halka nefesiyle
           (kyron.css → kyron-nefes) AYNI ritim. Süre ve Kyron artık birlikte soluk alır.
           Büyüme de kısıldı (1.02 → 1.008): 41 dakika göz ucunda duran bir yazının
           nabız atması yorucuydu. */
        @keyframes pulse-timer {
            0% { text-shadow: 0 0 18px rgba(245, 214, 123, 0.28); transform: scale(1); }
            50% { text-shadow: 0 0 34px rgba(245, 214, 123, 0.6), 0 0 9px rgba(245, 214, 123, 0.3); transform: scale(1.008); }
            100% { text-shadow: 0 0 18px rgba(245, 214, 123, 0.28); transform: scale(1); }
        }
        /* Sayaç fontu dar ekranda vw ile sınırlanır — taşıp yatay kaydırma/kesik rakam yaratmasın */
        #timer { font-size: min(4.8em, 15vw); margin: 15px 0; font-weight: 300; letter-spacing: 3px; font-variant-numeric: tabular-nums; text-shadow: 0 0 18px rgba(245, 214, 123, 0.35); transition: all 0.4s ease; max-width: 100%; }
        #timer.running { animation: pulse-timer 4.5s ease-in-out infinite; font-weight: 400; color: #fff; }

        /* ÇALIŞMA DÜZENİ: blok sürerken ekran sadeleşir — kartlar/listeler gizli, sayaç büyük */
        .container.focus-layout #greeting, .container.focus-layout .subtitle,
        .container.focus-layout #pending-analysis-box, .container.focus-layout #analysis-banner,
        .container.focus-layout #dropdown-wrapper-target, .container.focus-layout #dropdown-wrapper-type,
        /* Niyet ve gün çerçevesi de odak ekranında susar: çalışırken ekranda
           yalnız süre + tek fısıltı kalır. Geri sayımın çalışma sırasında
           görünmesi ayrıca korkuluğa da aykırı olurdu. */
        .container.focus-layout #dun-niyet, .container.focus-layout #hy-hafta,
        .container.focus-layout #gun-cercevesi,
        /* Masa şeridi çalışırken de ekranda kalıyordu — kendi kuralımıza aykırıydı
           (odak ekranında yalnız süre + tek fısıltı). Masanın haberi çalışırken
           yine ulaşır: faz değişimi ve "biri oturdu" ÇİP olarak süzülür (#ritim-uyari),
           yani kesmeyen yol açık, sürekli duran satır kapalı. */
        /* 🔴 15 Ağu ONARIMI — KÜME SATIRI SUSMUYORDU. Masa şeridi odakta
           gizleniyor, kavuşma satırı gizlenmiyordu; sonuç: ekran sadeleşince
           geriye tek konuşan olarak SINIF kalıyordu ve öğrenci "hep öğretmen
           masasındayım" sanıyordu (canlı test bulgusu). İki satır tek kural
           (masa↔küme denklik). Haber yolu yine açık: faz değişimi çip olarak
           süzülüyor. */
        /* 🔴 16 Ağu (akşam) — ŞERİT ARTIK ODAKTA DA KALIYOR, KISALARAK.
           Gizleme kararı "odakta yalnız süre + tek fısıltı" kuralından
           çıkmıştı ama bir bedeli vardı: öğrenci çalışmaya başlar başlamaz
           NEREDE OLDUĞUNU göremiyordu. Kullanıcı: "kronometreyi
           başlattığımda bu bilgi gidiyor… kişi nerede olduğunu bilsin."
           Uzlaşma: satır kalır, içi küçülür — yer · faz · geri sayım ·
           "değiştir". Kişi sayısı ve "+N yer canlı" rozeti GİTMEZ, düşer
           (metni JS kısaltıyor): çalışan öğrencinin ekranında sürekli
           değişen bir sayı, tam da kaçındığımız şey. */
        .container.focus-layout #custom-target-inputs, .container.focus-layout #btn-day-end,
        .container.focus-layout #secim-alani,
        .container.focus-layout #btn-hesap { display: none !important; }
        /* Analiz seçildiğinde kutuları enterAnalysisUI zaten gizliyor; kartın da
           susması gerek — yoksa boş bir "Ne çalışacaksın?" ekranda kalırdı. */
        .container.analiz-secili #secim-alani { display: none !important; }

        /* TEK DOKUNUŞLA DEVAM kartı (denetim 24) — hedef seçicinin üstünde,
           onunla yarışmayan yeşil bir "devam" tonunda. */
        /* IZGARA (flex değil) BİLEREK: "Matematik TYT · Üslü Sayılar · Soru Çözümü"
           375px'te tek satıra sığmıyor. Flex'te ya tür kırpılıyordu ya ▶ alt
           satıra düşüyordu; ızgarada etiket üstte, içerik+▶ altta yan yana ve
           içerik iki satıra SARIYOR — tür asla kesilmiyor (kaldığın yerin tür
           bilgisi, yerin kendisi kadar önemli). */
        /* ⭐ EKRANIN TEK ALTIN KARTI (Kyron dili · D3).
           Bu kart Kyron'un HATIRLAMASIDIR: "dün buradaydın, ben tuttum." Bu yüzden
           yeşilden altına döndü ve başında onun göz-izini taşıyor — ekranda altın
           taşıyan başka kart YOK, olursa imza değerini kaybeder.
           İz ::before ile çiziliyor çünkü .kust'un metnini JS her açılışta
           yeniden yazıyor ("dün" / "bugün" ayrımı) ve çocukları siliyor. */
        /* "Kaldığın yer" kartı 24 Ağu gecesi söküldü — stilleri de gitti. */
        #dun-niyet { width: 100%; display: grid; grid-template-columns: auto 1fr auto;
            align-items: center; column-gap: 8px; text-align: left;
            background: rgba(255, 255, 255, 0.035); border: 1px solid rgba(255, 255, 255, 0.10);
            border-radius: 12px; padding: 10px 13px; margin-bottom: 10px; cursor: pointer;
            font: inherit; color: #cbd5e1; transition: background 0.18s ease, transform 0.12s ease; }
        #dun-niyet:hover { background: rgba(255, 255, 255, 0.07); }
        #dun-niyet:active { transform: scale(0.995); }
        #dun-niyet .kust { grid-column: 1; grid-row: 1; font-size: 0.76em;
            color: #8fa2bf; font-weight: 600; white-space: nowrap; }
        #dun-niyet .kalt { grid-column: 2; grid-row: 1; min-width: 0; font-size: 0.83em;
            font-weight: 600; line-height: 1.35;
            white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
        #dun-niyet .kalt .ikincil { color: #8fa2bf; font-weight: 400; }
        #dun-niyet .kok { grid-column: 3; grid-row: 1; font-size: 1.05em; color: #8fa2bf; }
        /* HAFTANIN YÜZÜ satırı — niyet satırıyla AYNI biçim, altın tonda.
           Aynı yerde duran iki satır aynı dili konuşsun; ayıran tek şey renk,
           çünkü biri yarını, öteki geçmiş haftayı anlatıyor. */
        #hy-hafta { width: 100%; display: grid; grid-template-columns: auto 1fr auto;
            align-items: center; column-gap: 8px; text-align: left;
            background: rgba(212, 175, 106, 0.07); border: 1px solid rgba(212, 175, 106, 0.26);
            border-radius: 12px; padding: 10px 13px; margin-bottom: 10px; cursor: pointer;
            font: inherit; color: #e8d5a8; transition: background 0.18s ease, transform 0.12s ease; }
        #hy-hafta:hover { background: rgba(212, 175, 106, 0.13); }
        #hy-hafta:active { transform: scale(0.995); }
        #hy-hafta .kust { grid-column: 1; grid-row: 1; font-size: 0.76em;
            color: #b99b62; font-weight: 600; white-space: nowrap; }
        #hy-hafta .kalt { grid-column: 2; grid-row: 1; min-width: 0; font-size: 0.83em;
            font-weight: 600; line-height: 1.35;
            white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
        #hy-hafta .kok { grid-column: 3; grid-row: 1; font-size: 1.05em; color: rgba(212,175,106,.7); }
        /* Odakta selamlama ve köşe ikonları gizli — üst dolgu geri iner. */
        .container.focus-layout { padding-top: 22px; }
        .container.focus-layout #timer { font-size: min(5.6em, 16vw); margin: 22px 0 14px; }
        .container.focus-layout .avatar-wrapper { width: 72px; height: 72px; margin-bottom: 10px; }
        .container.focus-layout .avatar-inner { width: 60px; height: 60px; font-size: 28px; }
        .container.focus-layout .progress-text { width: 36px; height: 36px; font-size: 10px; top: -4px; right: -8px; }
        .container.focus-layout #focus-info { display: flex; }
        #odak-serit #focus-info { flex: 0 1 auto; min-width: 0; }
        .container.focus-layout.analysis-mode #timer { color: #ffd54f; text-shadow: 0 0 20px rgba(255, 193, 7, 0.45); }

        /* ——— KONU SATIRI (24 Ağu 2026) ———
           Eskiden "ders · konu — tür · kitap" yazan tek satırdı; uzun olduğu
           için SAĞA SOLA KAYIYORDU (kayma kaldırıldı, .fi-kayar söküldü).
           Artık üç parça: konu adı · (şartlı) tür · iki araç ikonu.
           Çerçevesiz durur — sahneyi süreye bırakır. */
        /* 29 Ağu: satır ekranın üstünden ODAK ŞERİDİNE taşındı; artık kendi
           kabı yok, şeridin ortasında yaşıyor. */
        #focus-info {
            display: none; align-items: center; gap: 7px;
            font-size: 0.72em; color: #7f8ea8;
            background: none; border: 0; border-radius: 0;
            padding: 0; margin: 0; min-width: 0; flex: 0 1 auto;
            transition: opacity 0.6s ease;
        }
        .container.focus-layout #focus-info { display: flex; }
        /* ── UZUN AD: ŞERİT UYANIKKEN BİR TUR AKAR, SONRA DURUR ──────────
           24 Ağu'da kayan yazı SÖKÜLMÜŞTÜ (sürekli hareket odağı yiyordu).
           29 Ağu'da kullanıcı geri istedi ama koşullu: kayma yalnız şerit
           UYANIKKEN çalışır. Şerit dokunulmayınca 4 sn'de soluyor ve
           `controls-dim` gelince bu kural düşüyor → yazı başa döner, DURUR.
           Yani çalışan öğrencinin ekranında kıpırdayan bir şey kalmıyor;
           "Kyron çalışma sürerken kıpırdamaz" ilkesi korunuyor.
           `.kayar` sınıfını JS takar — YALNIZ ad kaba sığmıyorsa. */
        #focus-info .fi-ad {
            color: #a9b8d0; font-weight: 600;
            white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
            min-width: 0; max-width: 42vw;
        }
        /* KİP KELİMESİ (29 Ağu): deneme ve analizde şeridin ikinci yarısı.
           Tür hapının yerini tutar ama DÜĞMEYE BENZEMEZ — çerçevesi ve oku
           yok, çünkü dokunulacak bir şey değil (ölü düğme tuzağı). Küçük
           harf: bir başlık değil, durumun adı. */
        #focus-info .fi-kip {
            font-size: 0.9em; font-weight: 600; color: #7f8ea8;
            letter-spacing: .02em; white-space: nowrap; flex: none;
        }
        #focus-info .fi-kip.analiz { color: #ffd54f; }
        /* 🔴 2 Eyl · KAYAN OLAN İÇ METİN, KUTU DEĞİL. Eskiden `.fi-ad`'ın
           kendisi kayıyordu; transform kutuyu da taşıdığı için uzun ad
           şeridin dışına çıkıyor, sağdaki hap ekrandan taşıyordu. */
        #focus-info .fi-ad .fi-ic { display: inline-block; white-space: nowrap; }
        /* ═══ KESİK AD ARTIK SÖNEREK BİTER (3 Eyl, ekran denetimi) ════════
           Kayan yazıda üç nokta bilerek kaldırılıyor (nokta kayan metnin
           üstünde durur, kirletir). Ama animasyon bittikten sonra da clip
           kalıyordu; ekranda "Tarih ve Zaman (Tarih Bilimine" diye ortadan
           kesilmiş, parantezi açık kalmış bir cümle duruyordu.
           Üç noktanın yerine SAĞ KENARDA SÖNME kondu: yazı kaybolarak
           biter, yani "devamı var" der. Hem kayarken hem dururken doğru. */
        .container.focus-layout:not(.controls-dim) #focus-info .fi-ad.kayar {
            text-overflow: clip;
            -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 22px), transparent 100%);
            mask-image: linear-gradient(to right, #000 calc(100% - 22px), transparent 100%);
        }
        .container.focus-layout:not(.controls-dim) #focus-info .fi-ad.kayar .fi-ic {
            animation: fi-kay 9s ease-in-out 1 both;
        }
        @keyframes fi-kay {
            0%, 14%   { transform: translateX(0); }
            48%, 60%  { transform: translateX(var(--fi-kay, 0px)); }
            96%, 100% { transform: translateX(0); }
        }
        @media (prefers-reduced-motion: reduce) {
            .container.focus-layout:not(.controls-dim) #focus-info .fi-ad.kayar {
                text-overflow: ellipsis;
            }
            .container.focus-layout:not(.controls-dim) #focus-info .fi-ad.kayar .fi-ic {
                animation: none;
            }
        }
        /* Araçlar: kaynak (altın — bu üründe kitaplık rengi) ve not (gri).
           Sönükse dokunulmaz: analizde kaynak, deneme akarken not, molada ikisi. */
        /* ⚠️ İKİ KAP (29 Ağu): ikonlar şeridin DIŞINA taşındı (#odak-araclar).
   Seçiciler yalnız #focus-info diyordu; taşınınca butonlar stilsiz kaldı ve
   2 piksele ezildi — ekranda duruyor ama dokunulamaz hâle geliyordu.
   Ölçüm prova sayfasında yakalandı. */
/* 🔑 ARALIK 6 DEĞİL 22 (7 Eyl): her düğmenin görünmez payı 11 px dışa
   taşıyor; 6 px aralıkta iki komşunun payı birbirini yiyordu. */
#focus-info .fi-arac, #odak-araclar .fi-arac { display: inline-flex; gap: 22px; flex: none; }
        #focus-info .fi-d, #odak-araclar .fi-d {
            width: 24px; height: 24px; padding: 0; border-radius: 50%;
            display: inline-flex; align-items: center; justify-content: center;
            border: 1px solid rgba(255,255,255,.09); background: rgba(255,255,255,.03);
            color: #8fa2bf; cursor: pointer; transition: background .2s ease, border-color .2s ease;
        }
        #focus-info .fi-d svg, #odak-araclar .fi-d svg { width: 15px; height: 15px; display: block; }
        #focus-info .fi-d.kaynak, #odak-araclar .fi-d.kaynak { color: #d7bd8c; border-color: rgba(212,175,106,.26); }
        #focus-info .fi-d:active, #odak-araclar .fi-d:active { background: rgba(255,255,255,.09); }
        #focus-info .fi-d:disabled, #odak-araclar .fi-d:disabled { opacity: .3; pointer-events: none; }

/* ═══ KAYNAK NABZI (5 Eylül 2026, kullanıcı kararı) ═══════════════════════
   Kaynağı kayıtlı olmayan ya da ölçüsü eksik derste ikon DURAKLAMADA bir kez
   nabız atar. Altın tondan çıkmaz — 🔴 kırmızı ve 🟢 yeşil oda paletinin
   kendi anlamlarını taşır, burada kullanılmaz.
   🔒 Yalnız ikon büyür; şerit ve düğmeler kıpırdamaz (Kyron'un "çalışma
   sürerken hareket yok" kuralının kardeşi — zaten duraklamadayız). */
#odak-araclar .fi-d.kaynak.nabiz {
    animation: ss-kaynak-nabzi 1.6s ease-in-out infinite;
}
@keyframes ss-kaynak-nabzi {
    0%, 100% { box-shadow: 0 0 0 0 rgba(212, 175, 106, 0); transform: scale(1);
               border-color: rgba(212, 175, 106, 0.26); }
    50%      { box-shadow: 0 0 0 7px rgba(212, 175, 106, 0.12); transform: scale(1.12);
               border-color: rgba(212, 175, 106, 0.85); }
}
@media (prefers-reduced-motion: reduce) {
    /* Hareketi kısan telefonda nabız ATMAZ ama ikon yine ayırt edilir:
       kural düşmez, biçimi değişir. */
    #odak-araclar .fi-d.kaynak.nabiz { animation: none;
        border-color: rgba(212, 175, 106, 0.85); background: rgba(212, 175, 106, 0.12); }
}
/* İpucu — bir kez öğretir, sonra susar. Şeridin altında, ortada. */
#kaynak-ipucu {
    margin: 8px auto 0; max-width: 320px; padding: 8px 12px; border-radius: 12px;
    font-size: 0.78em; line-height: 1.45; text-align: center; color: #e8d5a8;
    background: rgba(212, 175, 106, 0.09); border: 1px solid rgba(212, 175, 106, 0.3);
}
#kaynak-ipucu[hidden] { display: none !important; }
/* Kontroller sönerken ipucu da söner (şeridin nefesiyle aynı defter). */
.container.focus-layout.controls-dim #kaynak-ipucu { opacity: .3; }

        /* ═══ GÖZ-İZİ ŞERİTTEN KALKTI (3 Eyl, kullanıcı) ═════════════════
           Analiz fısıltısının başında iki altın çubuk (Kyron'un göz izi)
           duruyordu. Kullanıcı: "konunun yanında iki nokta var, onu ilgili
           tüm yerlerde kaldır — bu, yalnız kronometre kadranında olmalı."
           TEK RUH kuralının en temiz hâli: gözler ekranda BİR yerde yaşar,
           o da kadranın merkezi. Kip artık yalnız RENKLE konuşuyor. */
        #focus-info.analysis .fi-ad { color: #ffd54f; }

        /* Analiz bekleyenler listesi taşıyorsa alt kenarı söner: "devamı var"
           demenin en sessiz yolu (3 Eyl · ekran denetimi). */
        #pending-list.kaydirilir {
            -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 24px), transparent 100%);
            mask-image: linear-gradient(to bottom, #000 calc(100% - 24px), transparent 100%);
        }
        /* ═══ MOLA MUHASEBESİ SEÇİM EKRANINDAN KALKTI (3 Eyl, kullanıcı) ═══
           "Mola bilgisine de gerek yok — sadece mola tıkladığında görünmeli."
           Doğru yer zaten vardı: molaya basınca çıkan kart, hakkı ve süreyi
           çok daha ayrıntılı söylüyor. Seçim ekranı öğrenciye "bugün fazladan
           3 mola verdin" diye başlamamalı; oraya oturan öğrenci başlamaya
           geldi, muhasebeye değil.
           🔑 Öğe DURUYOR ve JS onu beslemeye devam ediyor — sayı ölmedi, yalnız
           ekrandan çekildi; geri istenirse tek satırlık iş. */
        #daily-breaks { display: none; font-size: 0.78em; color: #64748b; margin: 4px 0 0; min-height: 1.2em; transition: color 0.3s ease; }
        #daily-breaks.warn { color: #ffd54f; }
        /* ═══ MOLA SATIRI KIRMIZI DEĞİL (3 Eyl, ekran denetimi) ═══════════
           Ekrandaki TEK kırmızı buydu ve söylediği şey bir tehlike değil,
           bir muhasebeydi: "bugün bir mola fazladan verdin". Kırmızı, oda
           dilinde zaten yasaklı; burada da yanlış korku üretiyordu.
           Kehribara indi — uyarır ama bağırmaz. */
        #daily-breaks.over { color: #f0a35e; }
        @keyframes flash-line { 0%, 100% { opacity: 1; } 50% { opacity: 0.25; } }
        #daily-breaks.flash { animation: flash-line 0.7s ease 2; }

        /* ——— Mola fısıltısı (Kyron dili · sükûnet) ———
           Kutu ve emoji kalktı: mola bir uyarı değil, ekranın sana söylediği
           sakin bir cümle. İşareti metnin başında CSS çiziyor — ✅/⚠️ yerine
           göz grameri: iyi haber HİLAL (bayram gözü), hak aşımı İZ (Kyron'un
           kendisi söylüyor). Metni JS her molada yeniden yazdığı için işaret
           ::before olmak zorunda. */
        #pause-hint { display: none; font-size: 0.8em; border-radius: 0; padding: 2px 12px;
            margin: -2px auto 12px; line-height: 1.5; max-width: 40ch; background: none; border: 0; }
        #pause-hint.ok { display: block; color: #8fa2bf; }
        #pause-hint.warn { display: block; color: #d9bb6a; }
        /* 3 Eyl: `.warn` buradan çıktı — uyarı satırının başındaki göz-izi de
           kalktı (gerekçe #focus-info.analysis'in üstünde). Hilal duruyor:
           o Kyron'un gözü değil, "rahat ol" işareti. */
        #pause-hint.ok::before {
            content: ""; display: inline-block; vertical-align: -1px; margin-right: 7px;
            width: 13px; height: 9px;
        }
        /* hilal — "mola hakkın var, rahat ol" */
        #pause-hint.ok::before {
            background-color: #7BD8A0;
            -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 13'%3E%3Cpath d='M2 11 Q11 -3 20 11' fill='none' stroke='%23000' stroke-width='3.4' stroke-linecap='round'/%3E%3C/svg%3E") center/contain no-repeat;
                    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 22 13'%3E%3Cpath d='M2 11 Q11 -3 20 11' fill='none' stroke='%23000' stroke-width='3.4' stroke-linecap='round'/%3E%3C/svg%3E") center/contain no-repeat;
        }
        /* (göz-izi 3 Eyl'de söküldü — gözler yalnız kadranda yaşar) */

        /* ═══ MOLAYA SÜRE KOY — sarkan satır (27 Ağu 2026) ═══════════════════
           Ritim kurmamış öğrencinin molasının SONU YOKTU: duraklat → sessizlik →
           dönünce "n dakika mola verdin". Kimse "döndün mü?" demiyordu.
           Bu satır pause-hint'in ALTINA SARKAR (kullanıcı kararı 27 Ağu):
           ince bir iz aşağı iner, ucunda üç rakam durur. Dokunulan rakam
           molanın sonu olur. DOKUNMAK ZORUNLU DEĞİL — dokunulmazsa bugünkü
           davranış aynen sürer, mola açık uçlu kalır. */
        #mola-sure { position: relative; max-width: min(320px, 92%); margin: 6px auto 12px; }
        #mola-sure[hidden] { display: none !important; }
        /* Sarkan iz (.ms-ip) 29 Ağu'da SÖKÜLDÜ: bağlandığı cümle kutunun
           içine taşınmıştı, ip boşluktan sarkıyordu. Üst boşluk da kalktı. */
        #mola-sure .ms-govde { border: 1px solid rgba(245,214,123,.26);
            background: rgba(245,214,123,.055); border-radius: 15px; padding: 9px 12px 10px;
            text-align: center; }
        /* ═══ TEK KUTU, ÜÇ SATIR (29 Ağu) ═══════════════════════════════
           soru · rakamlar · tek not. Not satırı DURUMA GÖRE renk değiştirir:
           hakkın varsa sakin gri (günlük döküm), hak üstündeyse kehribar
           (puan uyarısı). Öğrencinin o an sorduğu soru tek: bu mola bana
           neye mal olur? Cevap tek satırda. */
        #mola-sure .ms-not { display: block; font-size: 0.64em; color: #7f93b3;
            margin-top: 9px; line-height: 1.45; }
        #mola-sure .ms-not:empty { display: none; }
        #mola-sure .ms-not.uyari { color: #E9C88A; }
        #mola-sure.sayiyor .ms-not { display: none; }
        #mola-sure .ms-soru { display: block; font-size: 0.72em; color: #9fb3d1;
            margin-bottom: 8px; line-height: 1.4; }
        #mola-sure .ms-secim { display: flex; gap: 7px; justify-content: center; }
        /* 🔒 44 px kuralı: dokunmatik hedef küçültülmez. */
        #mola-sure .ms-dk { flex: 0 0 auto; min-width: 52px; min-height: 44px; padding: 4px 10px;
            border-radius: 13px; cursor: pointer; font-family: inherit;
            background: rgba(255,255,255,.05); border: 1px solid rgba(245,214,123,.3);
            color: #e8d9a8; display: flex; flex-direction: column; align-items: center;
            justify-content: center; gap: 1px; transition: background .2s ease, color .2s ease,
            border-color .2s ease; }
        #mola-sure .ms-dk b { font-size: 0.86em; font-weight: 700; line-height: 1;
            font-variant-numeric: tabular-nums; }
        #mola-sure .ms-dk small { font-size: 0.62em; font-weight: 500; opacity: .6; letter-spacing: .04em; }
        #mola-sure .ms-dk:hover { background: rgba(245,214,123,.16); }
        #mola-sure .ms-dk[aria-pressed="true"] { background: #F5D67B; color: #12192B; border-color: #F5D67B; }
        #mola-sure .ms-dk[aria-pressed="true"] small { opacity: .72; }
        /* GERİ SAYIM HÂLİ: üç rakam gider, tek satır kalır. */
        #mola-sure.sayiyor .ms-govde { display: flex; align-items: center; gap: 9px;
            justify-content: center; padding: 8px 12px; border-radius: 999px; }
        #mola-sure.sayiyor .ms-soru { margin: 0; font-size: 0.74em; color: #c9d8ec; }
        #mola-sure .ms-kalan { font-size: 0.86em; font-weight: 700; color: #F5D67B;
            font-variant-numeric: tabular-nums; letter-spacing: .5px; }
        /* ✕ düğmesinin (.ms-kaldir) stilleri 29 Ağu'da SİLİNDİ — düğme aynı
           gün kaldırılmıştı: molayı bitiren zaten DEVAM ET. */
        #mola-sure:not(.sayiyor) .ms-kalan { display: none; }
        #mola-sure.sayiyor .ms-secim { display: none; }

        /* ═══ MOLA BİTTİ — EKRANIN IŞIĞI DÖNER (27 Ağu 2026, kullanıcı kararı) ═══
           iPhone'da Safari titreşimi HİÇ desteklemiyor; mola bitişinin tek
           taşıyıcısı ekrandı ve ekran da yalnız bir kart açıyordu. Artık
           EKRANIN KENDİSİ konuşuyor: gecenin lacivertine kehribar bir ışık
           düşer. Hiçbir şey HAREKET ETMEZ — yalnız renk değişir, yani
           "Kyron çalışma sürerken kıpırdamaz" kuralı bozulmaz.

           🔴 SÖNMEZ: bir kez yanıp bitmez, öğrenci DEVAM ET'e basana kadar
           yanıp söner (kullanıcı kararı). Ritim: bir GÜÇLÜ nefes, ardından üç
           kısık soluk, sonra yine güçlü — mutfaktan dönen öğrenci dakikalar
           sonra baktığında da ekranın onu beklediğini görür, ama ekran bu
           süre boyunca alarma dönüşmez.

           mix-blend-mode: screen → ışık yalnız EKLENİR; yazının üstünü
           örtmez, karanlık yerleri ısıtır. Perde tıklamayı da yutmaz. */
        #mola-perde { position: fixed; inset: 0; z-index: 9000; pointer-events: none;
            opacity: 0; mix-blend-mode: screen;
            background: radial-gradient(circle at 50% 42%, rgba(245,214,123,.42),
                rgba(245,214,123,.16) 46%, rgba(201,169,79,.05) 70%, transparent 85%); }
        #mola-perde.yaniyor { animation: mola-perde-nefes 13s ease-in-out infinite; }
        @keyframes mola-perde-nefes {
            0%, 100% { opacity: .16; }
            6%  { opacity: .95; }   /* güçlü nefes */
            14% { opacity: .16; }
            26% { opacity: .40; }   /* kısık soluklar */
            38% { opacity: .16; }
            50% { opacity: .40; }
            62% { opacity: .16; }
            74% { opacity: .40; }
            86% { opacity: .16; }
        }
        /* Hareket azaltma: nefes yok ama HABER VAR — sabit, kısık bir ışık kalır. */
        @media (prefers-reduced-motion: reduce) {
            #mola-perde.yaniyor { animation: none; opacity: .34; }
            #mola-sure .ms-dk { transition: none; }
        }

        #discipline-badge { display: none; align-items: center; gap: 6px; cursor: pointer; background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); border-radius: 10px; padding: 8px 12px; font-size: 0.8em; font-weight: 600; letter-spacing: 0.5px; backdrop-filter: blur(10px); color: #cbd5e1; white-space: nowrap; }
        /* PC/tablet: rozet küçücük kalmasın */
        @media (min-width: 768px) {
            #discipline-badge { font-size: 1.05em; padding: 10px 18px; border-radius: 12px; gap: 8px; }
        }
        #discipline-badge.good { color: #69f0ae; border-color: rgba(105,240,174,0.4); }
        #discipline-badge.mid { color: #ffd54f; border-color: rgba(255,193,7,0.4); }
        #discipline-badge.low { color: #ff8a80; border-color: rgba(244,67,54,0.4); }

        .controls { display: flex; justify-content: center; gap: 12px; margin: 2px 0 4px; }
        /* Ana düğmenin bekleyişi — altın hâleyle, Kyron'un nefes temposunda (4,5 sn).
           Eskiden 2 sn'lik camgöbeği nabızdı; ekranda ondan hızlı atan başka şey
           yoktu ve sakin bir sayfada acele ettiriyordu. */
        @keyframes pulse-btn {
            0% { box-shadow: 0 0 0 0 rgba(245, 214, 123, 0.38); }
            70% { box-shadow: 0 0 0 12px rgba(245, 214, 123, 0); }
            100% { box-shadow: 0 0 0 0 rgba(245, 214, 123, 0); }
        }
        button { 
            flex: 1; padding: 16px 0; border: none; border-radius: 14px; 
            cursor: pointer; font-size: 0.85em; font-weight: 700; letter-spacing: 1px;
            background: rgba(255,255,255,0.08); color: white; border: 1px solid var(--glass-border);
            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
        }
        button:not(:disabled):hover { transform: translateY(-3px); box-shadow: 0 8px 20px rgba(0,0,0,0.3); background: rgba(255,255,255,0.15); }
        button:not(:disabled):active { transform: translateY(0); }
        
        /* ═══ ANA DÜĞME: KYRON'UN KÜRESİ ═══
           Gradyan kyron.css'teki .kyron-kure ile BİREBİR aynı — logo, karakter ve
           ana düğme tek ışık olsun diye. "Her dokunuş Kyron'a dokunuş": başlamak
           artık camgöbeği bir eylem değil, ona uzanmak. Yazı gece rengi, yani
           altın kürenin üstündeki gözlerle aynı renk. */
        #btn-start {
            background: radial-gradient(circle at 50% 32%, #FBE7A8 0%, #F5D67B 48%, #C9A94F 100%);
            color: #0B1220; border: none;
        }
        #btn-start:not(:disabled) { animation: pulse-btn 4.5s infinite; }
        #btn-start:not(:disabled):hover {
            animation: none; transform: translateY(-3px) scale(1.02);
            /* background BİLEREK tekrar yazılıyor: genel `button:hover` kuralı
               beyaz bir zemin basıp küreyi siliyordu (dokunmatikte fark edilmiyordu). */
            background: radial-gradient(circle at 50% 30%, #FDEFC4 0%, #F7DC92 48%, #D2B45C 100%);
            box-shadow: 0 10px 25px rgba(245, 214, 123, 0.35);
        }

        /* Analiz kipinde küre kehribara döner — "ANALİZE BAŞLA" da o ışığın parçası.
           .analiz-secili seçim ekranı için (enterAnalysisUI), .analysis-mode blok
           başladıktan sonrası için (enterFocusLayout). */
        .container.analiz-secili #btn-start,
        .container.analysis-mode #btn-start {
            background: radial-gradient(circle at 50% 32%, #FFE9A8 0%, #FFD54F 48%, #D9A93B 100%);
        }
        .container.analiz-secili #btn-start:not(:disabled),
        .container.analysis-mode #btn-start:not(:disabled) { animation: pulse-btn-analiz 4.5s infinite; }
        @keyframes pulse-btn-analiz {
            0% { box-shadow: 0 0 0 0 rgba(255, 213, 79, 0.38); }
            70% { box-shadow: 0 0 0 12px rgba(255, 213, 79, 0); }
            100% { box-shadow: 0 0 0 0 rgba(255, 213, 79, 0); }
        }

        /* BİTİR kırmızıydı — oysa bitirmek tehlikeli bir iş değil, çalışmanın
           KAYDEDİLDİĞİ an. Kırmızı burada yanlış bir korku üretiyordu; sessiz
           ikincil düğmeye indi. (Gerçekten geri dönülmez işler — masadan ayrılma
           gibi — kendi uyarı rengini korur.) */
        #btn-end { background: rgba(255, 255, 255, 0.04); border-color: var(--glass-border); color: #8fa2bf; }
        #btn-end:not(:disabled):hover { background: rgba(255, 255, 255, 0.1); color: #cbd5e1; box-shadow: 0 8px 20px rgba(0, 0, 0, 0.3); }
        
        button:disabled { cursor: not-allowed; opacity: 0.3; transform: none; animation: none; box-shadow: none; }

        .inputs { display: none; margin-top: 15px; }
        input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button { -webkit-appearance: none; margin: 0; }
        input[type=number] { -moz-appearance: textfield; appearance: textfield; }
        ::-webkit-scrollbar { width: 0; height: 0; background: transparent; }
        * { scrollbar-width: none; -ms-overflow-style: none; }
        .grid-inputs { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 10px; margin-bottom: 15px; }
        .input-group label { font-size: 0.75em; font-weight: 700; color: #94a3b8; display: block; margin-bottom: 8px; text-transform: uppercase; text-align: center; letter-spacing: 1px; }
        
        #loading-overlay { position: fixed; top:0; left:0; width: 100%; height:100%; background: #0f172a; display: flex; justify-content: center; align-items: center; z-index: 1000; flex-direction: column; gap: 15px;}
        .spinner { width: 40px; height: 40px; border: 4px solid rgba(255,255,255,0.1); border-top: 4px solid var(--primary); border-radius: 50%; animation: spin 1s linear infinite; }
        
        #completed-overlay, #closed-overlay { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(15, 23, 42, 0.95); backdrop-filter: blur(10px); color: white; z-index: 9999; justify-content: center; align-items: center; text-align: center; flex-direction: column; padding: 20px; box-sizing: border-box; overflow-y: auto; }

        /* Tüm açılır ekranlar STANDART: arkası tam bulanık, kart ortada kabartma.
           margin:auto + overlay scroll = uzun içerikte bile kart kesilmez, ortalama bozulmaz. */
        /* ═══ PERDE EKRANI SİLMEZ, ÖNÜNE GEÇER (3 Eyl, ekran denetimi) ═══
           Perde %92 koyuluk + 18 px bulanıklıktı; yani arkadaki ekran tamamen
           yok oluyordu. Açılan kart boşlukta asılı bir kutu gibi duruyor,
           üstünde kocaman siyah bir alan kalıyordu — "alttan çıkan çekmece"
           hissi kayboluyordu. Koyuluk indi; bulanıklık aynı kaldı, yani
           arkadaki yazı yine okunmaz, ama nerede olduğun görünür. */
        .modal-overlay {
            display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%;
            background: rgba(15, 23, 42, 0.74); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px);
            z-index: 10000; justify-content: center; align-items: center; padding: 20px;
            box-sizing: border-box; overflow-y: auto;
        }
        .modal-box {
            background: #1e293b; padding: 25px; border-radius: 20px; margin: auto;
            border: 1px solid var(--glass-border); text-align: center; max-width: 320px; width: 100%;
            box-sizing: border-box;
            box-shadow: 0 18px 50px rgba(0,0,0,0.65), inset 0 0 0 1px rgba(255,255,255,0.06);
        }
        .modal-box h3 { margin: 0 0 10px 0; font-size: 1.3em; }
        .modal-box p { color: #cbd5e1; font-size: 0.95em; margin-bottom: 25px; line-height: 1.4; }
        .modal-btns { display: flex; gap: 10px; }
        .modal-btns button { padding: 12px; }

        /* Tablet/PC: veri-giriş modalını biraz küçült ve tam ortala (telefon DEĞİŞMEZ). */
        @media (min-width: 768px) {
            #data-inputs .modal-box { max-width: 360px; padding: 18px 20px; }
            #data-inputs #modal-timer-display { font-size: 1.2em; }
            #data-inputs #stats-grid .pk-num { font-size: 1em; }
        }

        /* Kısa ekran / klavye açıkken: veri modalı sıkışır, KAYDET her zaman görünür kalır */
        @media (max-height: 720px) {
            #data-inputs .modal-box { padding: 14px 16px; }
            #data-inputs .kayit-kart { margin-bottom: 12px; }
            #data-inputs #stats-grid .pk-num { font-size: 1em; }
            #data-inputs #modal-timer-display { font-size: 1.1em; }
            #data-inputs #btn-submit-next { padding: 13px 0; }
        }

        @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }

        @media screen and (orientation: landscape) and (max-height: 600px) {
            .container:not(.mini-mode) { 
                max-width: 95%; display: grid; grid-template-columns: 1fr 1fr; 
                gap: 10px; padding: 15px; align-items: center; position: relative;
            }
            .container:not(.mini-mode) #greeting, .container:not(.mini-mode) .subtitle { display: none !important; }
            /* Yatay ekranda ızgara öğesi artık kutuların KENDİSİ değil, onları
               saran #secim-alani (D4 sarmalayıcısı). Kutular sarmalayıcının
               içinde alt alta akar; kart da tam genişlik alır. */
            .container:not(.mini-mode) #secim-alani { grid-column: 1 / 3; }
            .container:not(.mini-mode) #dropdown-wrapper-target,
            .container:not(.mini-mode) #dropdown-wrapper-type { margin: 0 0 8px; }
            .container:not(.mini-mode) #timer { grid-column: 1 / 3; grid-row: 2; font-size: 6em; margin: 0; text-align: center; position: relative; }
            .container:not(.mini-mode) .avatar-wrapper { 
                display: block !important; position: absolute; right: 10%; top: 45%; 
                transform: translateY(-50%); width: 60px; height: 60px; margin: 0; z-index: 5;
            }
            .container:not(.mini-mode) .avatar-inner { width: 50px; height: 50px; font-size: 24px; }
            .container:not(.mini-mode) .progress-text { width: 30px; height: 30px; font-size: 10px; top: -5px; right: -5px; }
            .container:not(.mini-mode) .controls { grid-column: 1 / 3; grid-row: 3; margin: 0; }
            .container:not(.mini-mode) .inputs { grid-column: 1 / 3; grid-row: 4; margin-top: 5px; }
            .container:not(.mini-mode) .grid-inputs { margin-bottom: 10px; }
            .container:not(.mini-mode) #focus-info,
            .container:not(.mini-mode) #daily-breaks,
            .container:not(.mini-mode) #pause-hint,
            .container:not(.mini-mode) #pending-analysis-box,
            .container:not(.mini-mode) #btn-day-end { grid-column: 1 / 3; }
        }

        /* ================= YENİ TASARIM · FAZ 1 (görsel kabuk) ================= */
        /* Kyron artık kyron.css'te tanımlı (gözler, kürel gövde, ritüeller).
           Burada yalnız kadranın içindeki ölçüsü ayarlanır. */
        .kmark { display: block; }

        /* Alt navigasyon barı — üstteki rozet/butonların yerini alır */
        /* Alt bar: yüzen kapsül (native gibi) — aktif sekme genişleyen vurgulu pill */
        .navbar {
            position: fixed; left: 50%; bottom: calc(14px + env(safe-area-inset-bottom, 0px));
            transform: translateX(-50%); z-index: 95;
            display: flex; align-items: center; gap: 4px; padding: 6px; border-radius: 32px; box-sizing: border-box;
            background: rgba(18, 24, 40, 0.92); backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px);
            border: 1px solid rgba(255, 255, 255, 0.08); box-shadow: 0 12px 30px -8px rgba(0, 0, 0, 0.6);
        }
        .nav-i {
            display: flex; flex-direction: row; align-items: center; gap: 0; cursor: pointer;
            color: #8595b0; font-size: 12px; font-weight: 600; letter-spacing: 0.2px;
            background: none; border: none; padding: 11px 13px; flex: none; border-radius: 24px; text-transform: none;
            transition: background 0.25s ease, color 0.25s ease, padding 0.25s ease;
        }
        .nav-i:hover { color: #cbd5e1; transform: none; box-shadow: none; }
        .nav-i svg { width: 22px; height: 22px; flex: none; }
        .nav-i .nav-lbl { max-width: 0; overflow: hidden; white-space: nowrap; opacity: 0;
            transition: max-width 0.25s ease, opacity 0.2s ease, margin 0.25s ease; }
        .nav-i.active { color: var(--success); background: rgba(0, 242, 254, 0.14); padding: 11px 15px; }
        .nav-i.active .nav-lbl { max-width: 110px; opacity: 1; margin-left: 7px; }
        /* Disiplin nav içinde: eski üst-rozet kutu stilleri sıfırlanır; renk sınıfları korunur */
        #discipline-badge.nav-i { flex-direction: row; align-items: center; gap: 0; background: none; border: none; box-shadow: none; }
        #discipline-badge.nav-i.active { background: rgba(0, 242, 254, 0.14); }
        #discipline-badge.good { color: #69f0ae; }
        #discipline-badge.mid  { color: #ffd54f; }
        #discipline-badge.low  { color: #ff8a80; }
        #discipline-badge #disc-badge-score { font-weight: 700; }
        .container { margin-bottom: 84px; }
        body.mini .navbar { display: none; }
        /* Bir seçim listesi açıkken alt bar çekilir (gerekçe kronometre.js →
           listeAcikIsaretle): bar listenin üstünü örtüyordu. */
        body.liste-acik .navbar { opacity: 0; pointer-events: none; }
        .navbar { transition: opacity .18s ease; }

        /* Yuvarlak kontroller: tek büyük düğme BAŞLAT↔DURAKLAT + yanda BİTİR */
        .controls { align-items: center; gap: 28px; }
        .primary-slot { position: relative; display: grid; }
        .primary-slot > button { grid-area: 1 / 1; }
        .controls button {
            flex: none; border-radius: 50%; padding: 6px; letter-spacing: 0.5px;
            display: flex; align-items: center; justify-content: center; text-align: center;
        }
        #btn-start, #btn-pause { width: 98px; height: 98px; font-size: 0.74em; line-height: 1.18; }
        #btn-end { width: 68px; height: 68px; font-size: 0.7em; }
        /* Toggle: koşarken DURAKLAT görünür (btn-pause aktif), yoksa BAŞLAT/DEVAM (btn-start) */
        .primary-slot #btn-pause:disabled { display: none; }
        .primary-slot #btn-pause:not(:disabled) ~ #btn-start { display: none; }

        /* ——— Duraklat düğmesindeki Kyron izi ———
           Duraklat işareti (⏸) zaten iki dik çubuktur; yani Kyron'un gözleriyle
           aynı şeydir. Düğmenin üstüne o izi koyuyoruz: yazının üstünde altın
           iki çubuk. TEK RUH KURALI — canlı Kyron her an merkezdekidir; buradaki
           onun işaretidir, yalnız dokunulunca kırpar (.iz-kirp).

           Neden ::before? Buton metni JS'te yedi ayrı yerde innerText ile
           yazılıyor ve her yazım çocukları siler. Sözde-eleman o yazımlardan
           etkilenmez — iz asla kaybolmaz. */
        /* ═══ DURAKLAT'TAKİ KYRON İZİ SÖKÜLDÜ (24 Ağu akşamı, kullanıcı) ═══
           Düğmenin üstünde altın iki çubuk vardı — Kyron'un işareti. Kullanıcı
           telefonda gördü: "duraklatta da 2 göz var, onu kaldıralım; sadece
           kronometremizde göz olması yeterli." TEK RUH kuralı zaten bunu
           söylüyordu, iz onu zayıflatıyormuş. Düğme yalnız yazı.
           `kyronIzKirp()` çağrıları duruyor ama düğmede kırpacak iz yok —
           kart izleri de bu turda söküldü (kart kalktı). */
        @keyframes kyron-iz-kirpma { 50% { transform: scaleY(.1); } }

        /* 2 nokta pager (kaydır → mini) */
        /* 2 nokta pager: tıklanabilir (PC'de tık, telefonda dokunuş) — görünür nokta ::before, hit-alanı geniş */
        .pager { display: flex; justify-content: center; gap: 4px; margin-top: 10px; }
        .pager i { cursor: pointer; padding: 9px 7px; display: flex; align-items: center; justify-content: center; }
        .pager i::before { content: ''; width: 7px; height: 7px; border-radius: 50%; background: rgba(255, 255, 255, 0.20); transition: 0.3s; }
        body:not(.mini) .pager i:nth-child(1)::before,
        body.mini .pager i:nth-child(2)::before { background: var(--success); width: 20px; border-radius: 5px; }
        .pager i:hover::before { background: rgba(255, 255, 255, 0.5); }
        .container.mini-mode .pager { margin-top: 22px; }
        /* ═══ MİNİ KİPTE HAZIR OLMAYAN BAŞLAT ALTIN GÖRÜNMEZ ══════════════
           (3 Eyl, ekran denetimi) Ders seçilmemişken düğme yine altın küre
           çiziliyor, üstüne %30 saydamlık biniyordu: mavi zeminin üstünde
           çamur/haki bir top. Ne altın ne sönük — "bozuk" gibi duruyordu.
           Hazır olmayan düğme artık altın taklidi yapmaz, sessiz bir halka
           olur; altın yalnız gerçekten başlanabildiğinde yanar. */
        .container.mini-mode #btn-start:disabled {
            background: rgba(255, 255, 255, .05); color: #8fa2bf;
            border: 1px solid var(--glass-border); opacity: .6;
        }

        /* ================= FAZ 2 · Kadran A (tik halkası + yay + ibre) ================= */
        .dial { position: relative; width: min(204px, 55vw); aspect-ratio: 1 / 1; margin: 4px auto 14px; }
        /* ═══ SEÇİM EKRANINDA KADRAN DAHA KÜÇÜK (24 Ağu gecesi) ═══════════
           Orada kadranın içinde SAYI yok (D2 kuralı: süre BAŞLAT'la doğar) —
           Kyron'un evi ve altın yay duruyor. 204 px'lik çember, altındaki
           hedef listesini ekranın dışına itiyordu. Çalışma başlayınca
           (.focus-layout) yine büyüyor: orada kahraman süredir. */
        /* ═══ KADRAN BÜYÜDÜ (25 Ağu, kullanıcı kararı) ═══════════════════
           152 px küçük kalıyordu: ekranın kahramanı Kyron'un kadranı ama göz
           önce listeye kayıyordu. Üç ölçünün EN KÜÇÜĞÜ alınır:
             · 214 px → tavan (dev telefonlarda kadran şişmesin)
             · 52vw   → dar telefonlarda genişliğin yarısını geçmesin
             · 30vh   → KISA telefonlarda (SE gibi) altındaki liste ekran
                        dışına itilmesin — yükseklik de söz sahibi.
           Küre ve kıvrımlı yazı yüzdeyle bağlı olduğu için kendiliğinden
           büyür; hiçbir ölçü elle güncellenmez. */
        .container:not(.focus-layout):not(.mini-mode) .dial { width: min(214px, 52vw, 30vh); margin: 0 auto 8px; }

        /* ═══ KADRAN KAPISI — "KÜRE EVE DÖNER" (25 Ağu, kullanıcı kararı) ═══
           Seçim ekranının en alt sırası (BİTİR + BAŞLAT) komple kalktı:
             · BİTİR orada zaten pasifti — bitirilecek iş yok.
             · BAŞLAT ise ZATEN Kyron'un küresiydi; gradyanı .kyron-kure ile
               birebir aynı ("her dokunuş Kyron'a dokunuş").
           Küre aşağıdan kalkıp kadranın merkezine, gözlerin altına yerleşti.
           Kazanç ~90 px — sıkıştırma turunun devamı.

           HAREKET KURALI (Kyron): küre SÜREKLİ kıpırdamaz. Eski düğmedeki
           sonsuz nabız (pulse-btn) buraya TAŞINMADI; küre yalnız eşikte
           bir kez doğar (kk-dogus) ve sonra durur. Duran ama davet eden işaret.

           Kapı kapalıyken (hedef/tür eksik) küre HİÇ belirmez ve gözler bir
           tık kısılır: "henüz değil". Dokunuş yine de boşa gitmez —
           siradakiniGoster() eksik kutuyu ışıldatır (bkz. kronometre.js). */
        #kadran-kapi {
            /* z-index 3: yayın ÜSTÜNDE ama Kyron'un ALTINDA (.kyron-merkez z-index 4).
               Gözler kürenin üstüne oturur; dokunuşu yine kapı alır çünkü seçim
               ekranında .dial-core pointer-events: none. */
            position: absolute; inset: 0; z-index: 3; padding: 0;
            background: none; border: none; border-radius: 50%;
            cursor: pointer; -webkit-tap-highlight-color: transparent;
        }
        /* Çalışma/duraklama düzeninde kapı yok: orada merkez SÜRENİN.
           (Alt sıra da o anda geri geliyor — BİTİR + DURAKLAT.) */
        .container.focus-layout #kadran-kapi { display: none; }
        /* Kapalı kadranın fısıltısı — sönük, tek satır, kadranın ALTINDA. */
        #kadran-fisilti {
            text-align: center; font-size: .74em; color: #5d6b86;
            letter-spacing: .3px; margin: -6px 0 12px;
        }
        #kadran-fisilti[hidden] { display: none; }
        .container.focus-layout #kadran-fisilti { display: none; }
        #kadran-kapi .kk-kure {
            /* %66: kadranın altın yayı küreyi çepeçevre GÖRÜNÜR bırakır —
               küre yayı yutarsa kadran "sarı bir top" olur, kimlik kaybolur. */
            position: absolute; left: 50%; top: 50%; width: 66%; aspect-ratio: 1 / 1;
            transform: translate(-50%, -50%) scale(.82); border-radius: 50%;
            background: radial-gradient(circle at 50% 32%, #FBE7A8 0%, #F5D67B 48%, #C9A94F 100%);
            box-shadow: 0 0 22px rgba(245, 214, 123, .38);
            opacity: 0; pointer-events: none;
            transition: opacity .45s ease, transform .45s cubic-bezier(.3, 1.2, .4, 1);
        }
        /* Yazı kürenin ALT yarısında: gözler üstte, ad altta. Üç yüzü de taşır
           (BAŞLAT · DEVAM ET · ANALİZE BAŞLA) — metni kronometre.js #btn-start'tan
           okur, yani tek kaynak. İki satırlık yüz için white-space: pre-line. */
        /* Yazı kürenin ALT KIVRIMINDA — düz satır değil, yay. Kadranın yayı,
           küre ve yazı aynı merkezi paylaşır; ekran tek bir kıvrımdan konuşur.
           Ölçüler viewBox biriminde (100 = kadranın çapı), yani kadran küçülünce
           yazı da onunla küçülür — hiçbir telefonda taşmaz. */
        #kadran-kapi .kk-yazi {
            position: absolute; inset: 0; width: 100%; height: 100%;
            opacity: 0; pointer-events: none; transition: opacity .45s ease .12s;
            overflow: visible;
        }
        #kadran-kapi .kk-yazi text {
            fill: #0B1220; font-family: inherit; font-size: 7px; font-weight: 700;
            letter-spacing: 2px;
        }
        /* Uzun yüz (ANALİZE BAŞLA) yayı taşırmasın: bir kademe kısılır. */
        #kadran-kapi .kk-yazi.uzun text { font-size: 5.6px; letter-spacing: 1px; }
        .container.kadran-kapi-acik:not(.focus-layout) #kadran-kapi .kk-kure {
            opacity: 1; transform: translate(-50%, -50%) scale(1);
            animation: kk-dogus 1.2s ease;
        }
        .container.kadran-kapi-acik:not(.focus-layout) #kadran-kapi .kk-yazi { opacity: 1; }
        /* Eşik parlaması — BİR KEZ. Sonsuz nabız bilerek yok. */
        @keyframes kk-dogus {
            0%   { box-shadow: 0 0 0 0 rgba(245, 214, 123, 0), 0 0 10px rgba(245, 214, 123, .2); }
            45%  { box-shadow: 0 0 0 9px rgba(245, 214, 123, .16), 0 0 28px rgba(245, 214, 123, .55); }
            100% { box-shadow: 0 0 0 0 rgba(245, 214, 123, 0), 0 0 22px rgba(245, 214, 123, .38); }
        }
        /* Analiz kipinde küre kehribara döner — mod ayrı afişle değil ışıkla
           anlatılır (eski #btn-start kuralının aynısı). */
        .container.analiz-secili #kadran-kapi .kk-kure,
        .container.analysis-mode #kadran-kapi .kk-kure {
            background: radial-gradient(circle at 50% 32%, #FFE9A8 0%, #FFD54F 48%, #D9A93B 100%);
        }

        /* ——— Kapı açıkken Kyron kürenin ÜSTÜNE oturur ———
           Gözler küçülür (küre 74%, gözler ona göre ölçülür) ve altın zeminde
           gece rengine döner: bu, motorun ritüellerde kullandığı "bedenlenmiş"
           yüzün aynısı. `!important` kyron.js'in satır içi ölçeğini yener;
           :not(.kyron-bedenli) ile GÜN MÜHRÜ ritüeline dokunulmaz. */
        .container.kadran-kapi-acik:not(.focus-layout):not(.mini-mode) .dial-core #current-avatar:not(.kyron-bedenli) {
            transform: translateY(-2px) scale(1.35) !important;
            margin-bottom: 6px !important;
        }
        .container.kadran-kapi-acik:not(.focus-layout):not(.mini-mode) .dial-core #current-avatar:not(.kyron-bedenli) .kyron-g { fill: #0B1220; }
        .container.kadran-kapi-acik:not(.focus-layout):not(.mini-mode) .dial-core #current-avatar:not(.kyron-bedenli) .kyron-hilal { stroke: #0B1220; }
        .container.kadran-kapi-acik:not(.focus-layout):not(.mini-mode) .dial-core #current-avatar:not(.kyron-bedenli) .kyron-gozler { filter: none; }
        /* İmza (adın fısıltısı) küreyle aynı yeri paylaşıyor — kapı açıkken susar. */
        .container.kadran-kapi-acik:not(.focus-layout):not(.mini-mode) .kyron-imza-ad { display: none; }
        /* Kapı kapalıyken gözler bir tık kısık: "henüz değil" (tarif gerektirmeyen işaret). */
        .container:not(.focus-layout):not(.mini-mode):not(.kadran-kapi-acik) .dial-core #current-avatar { opacity: .8; }

        /* Dokunuşu KAPI alır: merkezdeki gözler/yazılar tıklamayı yutmasın.
           (Seçim ekranında dial-core içinde tıklanacak bir şey zaten yok.) */
        .container:not(.focus-layout):not(.mini-mode) .dial-core { pointer-events: none; }

        /* ═══ SEÇİM EKRANINDA ALT SIRA YOK ═══
           #btn-start DOM'da duruyor (iki yerden programatik tıklanıyor) —
           yalnız GÖRÜNMÜYOR. Çalışma başlayınca (.focus-layout) sıra geri gelir:
           orada BİTİR de DURAKLAT da gerekli. */
        .container:not(.focus-layout):not(.mini-mode) .controls { display: none; }
        /* Tik halkaları 24 Ağu gecesi söküldü — süstü, bir şey söylemiyordu. */
        /* ═══ HALKANIN IŞIĞI KARE İÇİNE HAPSOLMASIN (3 Eyl, kullanıcı) ═══
           Kullanıcı: "çemberin etrafında bir kare görüntüsü var, kesilmiş gibi
           duruyor." Doğruydu ve sebebi şuydu: yayın parlaması bir gölge
           (`drop-shadow`) ve gölge, çizimin kutusundan taşıyor. SVG kutuları
           varsayılan olarak taşanı KESER — yani ışık, çemberin etrafında
           görünmez bir karenin kenarında birden bitiyordu.
           Benzetme: lambanın hâlesi duvara vurmuş gibi. Kutu artık taşmayı
           kesmiyor; ışık kendi yumuşaklığıyla sönüyor. */
        .dial-arc { position: absolute; inset: 0; width: 100%; height: 100%; transform: rotate(-90deg); overflow: visible; }
        .dial-arc .track { fill: none; stroke: rgba(255,255,255,0.05); stroke-width: 4.5; }
        .dial-arc .fill { fill: none; stroke: url(#kyg); stroke-width: 4.5; stroke-linecap: round;
            filter: drop-shadow(0 0 6px rgba(245,214,123,0.5)); transition: stroke-dashoffset 0.9s linear; }
        /* GÜNÜN IŞIK HALKASI SÖKÜLDÜ (24 Ağu gecesi, kullanıcı kararı):
           kadranın dış kenarındaki ince altın iz. Kullanıcı tanımadı —
           "onlar neydi?" diye sordu. Tarif gerektiren gösterge konuşmuyordur.
           kyron.js'teki gunIzi() kancası duruyor ama artık bir öğeye bağlı
           değil; çağrıldığında sessizce hiçbir şey yapmıyor. */
        /* ═══ İBRE KADRANIN ORTASINA GİRMEZ (3 Eyl, ekran denetimi) ═══════
           İbre kadranın kenarından TAM MERKEZE kadar uzanıyordu ve gradyanın
           parlak ucu merkezdeydi. Merkezde ise artık iki şey var: Kyron'un
           gözleri ve dev sayaç. Sonuç, "00:01:48"in içinden geçen ince bir
           çizgiydi — ölçüldü, gözlerle 44 px üst üste biniyordu; ekranda
           çatlak gibi duruyordu.
           Çözüm: kutunun GEOMETRİSİ değişmedi (dönme ekseni hâlâ merkez,
           yani açı hesabı aynı kaldı) — yalnız boyanan kısım kısaldı.
           Görünen iz artık kutunun üst üçte biri, yani halkanın kenarında
           duran kısa bir çentik. Merkez Kyron'a ve sayıya ayrıldı. */
        .dial-needle {
            position: absolute; left: 50%; top: 9%; width: 3px; height: 41%; transform-origin: bottom center;
            transform: translateX(-50%) rotate(0deg); border-radius: 3px; display: none;
            background: none; box-shadow: none;
            transition: transform 0.9s linear;
        }
        .dial-needle::before {
            content: ''; position: absolute; left: 0; right: 0; top: 0; height: 34%;
            border-radius: 3px;
            background: linear-gradient(to bottom, #F5D67B, rgba(245,214,123,0));
            box-shadow: 0 0 10px rgba(245,214,123,0.55);
        }
        /* Analiz modunda kadranın canlı ışığı KEHRİBARA döner — mod, ayrı bir
           afişle değil ışığın rengiyle anlaşılır (Kyron dili: analiz = kehribar). */
        .container.analysis-mode .dial-needle::before {
            background: linear-gradient(to bottom, #FFD54F, rgba(255,213,79,0)); box-shadow: 0 0 10px rgba(255,213,79,0.55);
        }
        .container.analysis-mode .dial-arc .fill { filter: drop-shadow(0 0 6px rgba(255,213,79,0.5)); }
        /* HEDEFSİZ MOD (serbest/analiz): ibre her saniye 6° atlıyor. 0.9 sn'lik geçişle
           birleşince gölgeli öğe SÜREKLİ animasyon hâlinde kalıyor ve ekran takılıyormuş
           gibi hissettiriyordu. Burada saat gibi TIK atsın: tek ucuz boyama, akıcı his. */
        .dial-needle.tik { transition: none; }
        .dial-needle.tik::before { box-shadow: 0 0 6px rgba(0,242,254,0.45); }
        /* ibre görünürlüğü artık JS'te yönetilir (hedefli: ilerleme açısı; hedefsiz: saniye ibresi) */
        /* İbrenin ekseni SÖKÜLDÜ: kadranın kalbi artık Kyron. Turkuaz nokta tam
           gözlerin altına düşüyor ve bakışı kirletiyordu. İbrenin merkezdeki ucu
           kendi gradyanıyla zaten parlak, eksen vurgusuna gerek yok.
           (Eleman DOM'da duruyor — JS referansları ve düzen bozulmasın diye.) */
        .dial-hub { display: none; }
        .dial-core { position: absolute; inset: 0; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 2px; text-align: center; }
        /* Kyron'un evi. Ölçek ve alt boşluk kyron.js'ten gelir (duruma göre değişir);
           burada yalnız kabın kendisi tanımlı — sabit boyut VERİLMEZ, yoksa
           gözler büyürken kırpılır. */
        .dial-core #current-avatar { background: none; border: none; box-shadow: none; cursor: default; }
        /* Kyron'un imzası (kyron.css) kadranın dar merkezinde duruyor: burada
           yalnız konumunu sıkılaştırıyoruz, saatin üstüne binmesin. */
        .dial-core .kyron-imza-ad { font-size: 9px; letter-spacing: 3px; }
        /* Sayaç artık kadranın merkezinde */
        #timer { font-size: min(2.05em, 10.5vw); margin: 0; letter-spacing: 1px; }
        /* "Hedefe X dk": kadranın altın ışığıyla aynı ailede, ama kısık —
           süreyle yarışmayan bir alt satır. (Eskiden neon camgöbeğiydi.) */
        .dial-core #progress-text {
            position: static; width: auto; height: auto; background: none; border: none; backdrop-filter: none;
            font-size: 0.78em; font-weight: 600; color: #D4BC7D; margin-top: 5px; display: none;
        }
        .dial-core #progress-text.analysis { color: #ffd54f; }
        /* ═══ SAAT KİMİN (28 Ağu) ═══════════════════════════════════════════
           · #gun-toplam — "bugün 3sa 30dk": kim yönetirse yönetsin akan tek
             sayı. Yeşil ▸ sayaç koşarken sürenin nefesiyle AYNI ritimde
             (sure-gizli-nefes, 4,5 sn) soluk alır — yeni hareket dili yok.
           · .sahip-esik — kural satırının eşik sözü: devirde/iadede bir kez
             altın konuşur, 4 sn sonra sakinleşir. */
        .dial-core #gun-toplam {
            font-size: 0.66em; color: #7f93b3; margin-top: 3px;
            font-variant-numeric: tabular-nums; letter-spacing: 0.3px;
        }
        .dial-core #gun-toplam[hidden] { display: none; }
        .dial-core #gun-toplam .akis {
            color: #9fe0b8; animation: sure-gizli-nefes 4.5s ease-in-out infinite;
        }
        .dial-core #progress-text.sahip-esik {
            display: block; color: #F5D67B; animation: sahip-esik-giris 0.5s ease;
        }
        @keyframes sahip-esik-giris { from { opacity: 0; transform: translateY(3px); } }
        @media (prefers-reduced-motion: reduce) {
            .dial-core #gun-toplam .akis { animation: none; }
            .dial-core #progress-text.sahip-esik { animation: none; }
        }
        /* Odanın daveti (Vaka 5): seçim ekranında kürenin altında tek satır. */
        #oda-davet {
            font-size: 0.74em; color: #8fd0ff; text-align: center;
            margin: -4px auto 10px; line-height: 1.4;
            font-variant-numeric: tabular-nums;
        }
        #oda-davet[hidden] { display: none !important; }
        /* Oturum kartında yer dökümü: "30 dk kendi ritmin · 60 dk Molasızlar". */
        .od-yerler {
            font-size: 0.78em; color: #8fd0ff; margin-top: 5px; line-height: 1.45;
        }
        /* Kayıt ekranı: akşamın hikâyesi — toplamın hemen altında, mavi fısıltı. */
        #kayit-yerler {
            font-size: 0.74em; color: #8fd0ff; text-align: right;
            margin: -12px 0 12px; line-height: 1.5;
        }
        #kayit-yerler[hidden] { display: none; }
        /* ═══ SÜRE DOLDU · SIRADAKİ KONU (25 Ağu) ══════════════════════════
           İki satır, iki ayrı gerçek: üstte DERSİN dakikası bitti (altın,
           kesin), altta sıradaki KONU hâlâ açık (kısık, davet).
           Konfeti burada patlamaz — o yalnız eşik O OTURUMDA geçilirse.
           "Tamamlandı" sözü hiç geçmez: o söz konuya saklı. */
        .dial-core #progress-text.doldu {
            display: flex !important; flex-direction: column; align-items: center; gap: 2px;
            line-height: 1.3;
        }
        .dial-core #progress-text.doldu b { font-weight: 700; color: #ffd97a; }
        .dial-core #progress-text.doldu i {
            font-style: normal; font-size: .84em; font-weight: 500; color: #93a5c0; letter-spacing: .02em;
        }
        .container:not(.focus-layout) .dial-core #progress-text.doldu b { color: #d9c489; }

        /* ═══ SIFIR GÖSTERME (düzen kuralı D2) ═══
           Seçim ekranında sayaç 00:00:00'da duruyordu: hiçbir şey söylemiyor ama
           ekranın en büyük alanını tutuyor, üstelik Kyron'un göz çubuklarıyla yan
           yana gelince "duraklatılmış bir iş var" yanılgısı veriyordu.
           Süre artık BAŞLAT'la DOĞAR — seçim ekranının kahramanı saat değil
           Kyron'un selamıdır ("önce varlık, sonra araç" sırası).

           Kapsam bilerek dar: yalnız seçim ekranı. focus-layout (çalışan ya da
           duraklamış blok — sayfa yeniden açıldığında yarım blok da buraya girer)
           ve mini mod (çıplak sayaç ekranı) DOKUNULMADAN kalır. */
        .container:not(.focus-layout):not(.mini-mode) #timer { display: none; }
        /* Süre doğarken bir kez süzülür; sonraki saniyeler sakin akar. */
        .container.focus-layout #timer { animation: sure-dogar .55s ease both; }
        @keyframes sure-dogar { from { opacity: 0; transform: translateY(5px); } }

        /* Hedef satırı seçim ekranında FISILTIDIR: gözlerin altında tek ince satır,
           kartlarla yarışmaz. Çalışırken (focus-layout) canlı yeşil hâline döner. */
        .container:not(.focus-layout) .dial-core #progress-text {
            font-size: 0.62em; font-weight: 500; letter-spacing: 0.04em;
            color: #7f8ea8; margin-top: 8px; text-shadow: none;
        }

        /* Focus (çalışırken): kadran + sayaç büyür, butonlar aşağı iner */
        /* ═══ HALEYE YER AÇILDI (3 Eyl, kullanıcı) ═══════════════════════
           "Çemberin etrafında bir kare görüntüsü var, kesilmiş gibi duruyor;
           oranında düzeltilmesi lazım." Ölçüldü ve haklıydı:
             kartın iç genişliği 335 px · kadran 332 px
           Yani halka kartın kenarına dayanmıştı ve KART yatayda taşanı kesiyor
           (`overflow: hidden auto` — dikey kaydırma için şart). Halkanın altın
           parlaması kartın kenarına gelince düz bir çizgiyle bitiyordu; göz
           bunu "çemberin etrafındaki kare" olarak okuyor.
           Benzetme: mumun ışığı duvara dayanmış, hâlesi duvarda kesilmiş.
           Kadran 332 → 296 px'e indi: her iki yanda ~20 px nefes kaldı, ışık
           kendi yumuşaklığıyla sönüyor. Sayaç KÜÇÜLMEDİ (kendi ölçüsü var),
           yani ekranın kahramanı yine süre. */
        .container.focus-layout .dial { width: min(296px, 79vw); margin: 12px auto 4px; }
        .container.focus-layout #timer { font-size: min(3.35em, 16.5vw); margin: 0; letter-spacing: 1px; }
        /* ——— Kyron hiyerarşisi (kurgu 9) ———
           Çalışırken saat kahraman: süre büyük, Kyron kısık ve küçük.
           Duraksayınca sıra Kyron'a geçer: süre bir kademe geri çekilir,
           gözler büyüyüp sana bakar. .kyron-sakin sınıfını kyron.js yalnız
           çalışma sürerken kadrana yazar. */
        .container.focus-layout .dial:not(.kyron-sakin) #timer { font-size: min(2.6em, 13vw); opacity: .82; }
        #timer { transition: font-size .6s ease, opacity .6s ease; }
        .container.focus-layout .controls { margin-top: 30px; margin-bottom: 4px; transition: opacity 0.6s ease; }
        /* Odak: çalışırken hareketsizlikte Bitir/Duraklat solar (bilinçaltı "bırak" telkini olmasın); ekrana dokununca gelir */
        /* ═══ SÖNÜKLÜK TEK KATMAN (3 Eyl, ekran denetimi) ═════════════════
           Eskiden opaklık SIFIRDI: düğmeler yok oluyordu. Altlarındaki bant
           da bomboş kaldığı için ekran "yarım yüklenmiş" gibi duruyordu ve
           öğrenci bloğu nasıl bitireceğini hatırlamak zorundaydı.
           Artık bir TABAN var: görünür ama arka planda dururlar.
           🔒 Korkuluk aynen duruyor — `pointer-events: none` yerinde, yani
           ilk dokunuş yalnız uyandırır, yanlışlıkla bitirme olmaz. */
        .container.focus-layout.controls-dim .controls { opacity: .22; pointer-events: none; }

        /* ═══ UYANIK HÂL GERÇEKTEN UYANIK (3 Eyl, ekran denetimi) ═════════
           Dokununca düğmeler geliyordu ama kendileri de sönüktü: dolgu
           beyazın %8'i, çerçevesi %15'i. Yani "uyandırdım" ile "uyanmadı"
           birbirinden ayırt edilemiyordu. Oysa duraklatınca DEVAM ET dolu
           altın bir küre oluyor — ürün yüksek kontrastı biliyor, yalnız
           çalışma hâlinde kullanmıyordu.
           DURAKLAT artık DEVAM ET ile aynı ışıktan konuşuyor (altın çerçeve);
           aynı düğmenin iki yüzü, aynı renk. BİTİR küçük ve sessiz kalır —
           hiyerarşi doğruydu, yalnız yazısı okunacak kadar açıldı. */
        .container.focus-layout #btn-pause {
            background: rgba(245, 214, 123, .13);
            border: 1.5px solid rgba(245, 214, 123, .52);
            color: #F3E4B4;
        }
        .container.focus-layout #btn-pause:not(:disabled):hover {
            background: rgba(245, 214, 123, .22); border-color: rgba(245, 214, 123, .75);
        }
        .container.focus-layout #btn-end {
            background: rgba(255, 255, 255, .10);
            border-color: rgba(255, 255, 255, .30);
            color: #C3D0E4;
        }

        /* ═══ KART ALT ÇUBUĞA KADAR İNER (3 Eyl, ekran denetimi) ══════════
           Çalışırken kart 647'nci pikselde bitiyor, alt çubuk 740'ta
           başlıyordu; aradaki 93 px ne kartın ne çubuğun — hiçbir şeyin.
           Telefonun altında bir kesik varmış gibi okunuyordu.
           Kart aşağı iniyor, blok da bir tık aşağı kayıyor: boşluk yok
           olmuyor, tek yığın olmaktan çıkıp üste ve alta bölünüyor.
           ⚠️ Yalnız UZUN ekranlarda: kısa telefonda zaten boşluk yok, orada
           dolgu eklemek içeriği ekranın dışına iterdi. */
        @media (min-height: 720px) {
            .container.focus-layout { padding-top: 54px; padding-bottom: 66px; }
        }
        /* Odak: kontrollerle birlikte "Hedefe X dk" + mola detayı satırı da solar (dokununca gelir) */
        .container.focus-layout #progress-text, .container.focus-layout #daily-breaks { transition: opacity 0.6s ease; }
        .container.focus-layout.controls-dim #progress-text,
        .container.focus-layout.controls-dim #daily-breaks { opacity: 0; }
        /* Ders fısıltısı da kontrollerle birlikte solar — 41 dakika boyunca
           ekranda okunacak tek şey süre kalsın. */
        /* 29 Ağu: konu satırı artık ODAK ŞERİDİNİN içinde. Ayrı ayrı solmak
           şeridi ikiye bölüyordu (ad kaybolup hap kalıyordu); solma kabın
           işi — #odak-serit tek parça hâlinde soluyor. */
        /* Solma ve dokunulabilirlik ARTIK KABIN işi (#odak-satir). */
        /* ═══ TAM SADELİK (24 Ağu akşamı, kullanıcı kararı) ═══════════════
           Dokunulmayınca ekranda SÜREDEN başka hiçbir şey kalmaz. Eskiden
           masa şeridi ve üç kutu (küçülmüş hâliyle) duruyordu; kullanıcı
           "onlar da gitsin, dokununca görsün" dedi. Hepsi aynı nefesi alır:
           4 saniye dokunulmazsa solar, ekrana dokununca birlikte gelir. */
        .container.focus-layout #masa-serit,
        .container.focus-layout #parca-serit { transition: opacity 0.6s ease; }
        .container.focus-layout.controls-dim #masa-serit { opacity: 0; pointer-events: none; }


        /* ═══ ODAK EKRANINDA GÜNLÜK ÖZET YOK ═══
           "⏱ Bugün 41 dk · ☕ 0 mola" satırı çalışırken ekranda duruyordu ama
           çalışan öğrencinin göz ucuyla aradığı şey bu değil. Aynı bilgi iki
           yerde zaten var: Oturum sekmesinde ve mola anında pause-hint'te
           (mola sayısı + hak durumu orada daha ayrıntılı). İkinci kez ekranda
           durması gürültüydü. Seçim ekranında KALIR — orada günün özeti anlamlı. */
        .container.focus-layout #daily-breaks { display: none; }
        #tap-hint { display: none; opacity: 0; text-align: center; font-size: 0.72em; color: #5d6b86; margin-top: 8px; letter-spacing: 0.3px; transition: opacity 0.5s ease; }
        /* Mini mod = çıplak sayaç: kadran süsleri gizli, sadece büyük sayaç */
        .container.mini-mode .dial { width: auto; aspect-ratio: auto; margin: 0; }
        .container.mini-mode .dial-arc,
        .container.mini-mode .dial-needle,
        .container.mini-mode .dial-hub,
        .container.mini-mode .dial-core #current-avatar,
        .container.mini-mode .dial-core #progress-text { display: none !important; }
        .container.mini-mode .dial-core { position: static; }

        /* ═══ ÇIPLAK SAYAÇ EKRANINDA DA İKİ UYDU (24 Ağu, kullanıcı isteği) ═══
           Kilit ve göz eskiden mini modda gizleniyordu (hide-in-mini); oysa
           öğrencinin ekranı kaydırıp yalnız sayacı bıraktığı an tam da "ekranda
           kalayım mı, süreyi göreyim mi" sorusunun sorulduğu andır. İkisi de
           kadranın köşesindeki SIRAYI koruyarak ekranın sağ üstüne taşınır. */
        .container.mini-mode #kilit-uydu {
            position: fixed; top: calc(16px + env(safe-area-inset-top)); right: 16px;
        }
        .container.mini-mode #sure-uydu {
            position: fixed; top: calc(16px + env(safe-area-inset-top) + 32px); right: 16px;
        }

        /* ═══ KAYDIRMA JESTİ — sayfa gerçekten kayar (24 Ağu, kullanıcı isteği) ═══
           Eskiden parmak kalkınca ekran bir anda mini moda "atlıyordu"; arada
           hiçbir hareket yoktu, yani kaydırdığın hissi hiç oluşmuyordu.
           Artık ekran PARMAĞI TAKİP EDER (.elde — geçiş kapalı, birebir),
           parmak kalkınca ya öbür sayfaya savrulur ya da yerine yaylanır. */
        .container.kaydiriliyor {
            transition: transform .3s cubic-bezier(.16, .84, .34, 1), opacity .24s ease;
            will-change: transform;
        }
        .container.kaydiriliyor.elde { transition: none; }
        @media (prefers-reduced-motion: reduce) {
            .container.kaydiriliyor { transition: none; }
        }

        /* Veri girişi: alta yaslı sayfa; klavye açılınca üstünde kalır (KAYDET hep görünür) */
        #data-inputs { align-items: flex-end; }

        /* ═══ YAZMA KİPİ — tuş takımı açıkken ekran sadeleşir (24 Ağu) ═══
           Tuş takımı açılınca altta yer tutan her şey çekilir; geriye YALNIZ
           yazdığın konu kartı kalır. Kart alta yaslı olduğu için kendiliğinden
           aşağı iner ve tuş takımının üstüne oturur — "yukarı itilme" hissi
           böyle bitiyor. Tamam'a basınca hepsi geri gelir. */
        #data-inputs.yazma-kipi #parca-kayit .pk-grup:not(.yazilan),
        #data-inputs.yazma-kipi #gun-seyri,
        #data-inputs.yazma-kipi #kayit-serit,
        #data-inputs.yazma-kipi #kayit-genisleme,
        #data-inputs.yazma-kipi #short-session-note,
        #data-inputs.yazma-kipi #sureli-doldu-not,
        #data-inputs.yazma-kipi #difficulty-hint,
        #data-inputs.yazma-kipi #btn-resume-timer,
        #data-inputs.yazma-kipi #btn-submit-next { display: none !important; }
        /* Yazarken konu kartının İÇİ de sadeleşir (25 Ağu, kullanıcı isteği):
           ekranda yalnız konu başlığı ve d/y/b kutuları kalır. Zorluk ve parça
           satırları "Tamam"la geri gelir — o an yazılan şey sayılardır. */
        #data-inputs.yazma-kipi #parca-kayit .pk-grup.yazilan .pk-satir,
        #data-inputs.yazma-kipi #parca-kayit .pk-grup.yazilan .pk-zor,
        #data-inputs.yazma-kipi #parca-kayit .pk-grup.yazilan .pk-bekleyecek,
        /* Tek blok kartı da aynı sadeleşmeyi yaşar: yazarken ekranda konu
           başlığı ve sayı kutuları kalır (4 Eyl · ADIM 3). */
        #data-inputs.yazma-kipi .kayit-kart .pk-satir,
        #data-inputs.yazma-kipi .kayit-kart .pk-zor { display: none !important; }
        /* Kalan kart "indi" gibi görünsün: tek, kısa bir iniş. */
        #data-inputs.yazma-kipi #parca-kayit .pk-grup.yazilan { animation: yk-inis .26s ease both; }
        @keyframes yk-inis { from { transform: translateY(-12px); opacity: .5; } }
        @media (prefers-reduced-motion: reduce) {
            #data-inputs.yazma-kipi #parca-kayit .pk-grup.yazilan { animation: none; }
        }
        #data-inputs .modal-box {
            margin: 0 auto; width: 100%; border-radius: 20px 20px 0 0;
            transition: margin-bottom 0.18s ease;
        }
        @media (min-width: 768px) {
            #data-inputs { align-items: center; }
            #data-inputs .modal-box { border-radius: 20px; }
        }

        /* Yatay (kısa) ekranda kadran taşmasın: sayaç artık kadranın içinde, eski #timer 6em kuralını ez */
        @media screen and (orientation: landscape) and (max-height: 600px) {
            .container:not(.mini-mode) .dial { grid-column: 1 / 3; grid-row: 2; width: min(150px, 30vh); margin: 2px auto; }
            .container:not(.mini-mode) #timer { font-size: 1.7em; }
            .container:not(.mini-mode) .pager { grid-column: 1 / 3; margin-top: 4px; }
        }

        /* ================= FAZ 3 · Sekme ekranları (Oturum + Disiplin) ================= */
        /* Ortak sekme perdesi: yumuşak açılış geçişi (fade + hafif yukarı kayma) */
        .tab-screen {
            position: fixed; left: 0; right: 0; top: 0; bottom: 0; z-index: 88;
            background: #0a0e1a; overflow-y: auto; padding: 22px 18px 96px; box-sizing: border-box; text-align: left;
            opacity: 0; visibility: hidden; transform: translateY(16px); pointer-events: none;
            transition: opacity 0.28s ease, transform 0.28s ease, visibility 0s linear 0.28s;
        }
        .tab-screen.show { opacity: 1; visibility: visible; transform: none; pointer-events: auto;
            transition: opacity 0.28s ease, transform 0.28s ease; }
        @media (prefers-reduced-motion: reduce) { .tab-screen { transition: none; } }
        /* ═══ ÜSTTE AÇILAN SEKME EKRANI (3 Eyl gecesi — kullanıcı bulgusu:
           "ekranı açınca sayfa arkada kalıyor") ═══════════════════════════
           Sekme ekranları 88. katmanda; kayıt perdesi 10060, kaydet ekranı
           10001. Yani perdenin içinden açılan kitaplık PERDENİN ALTINDA
           kalıyordu — öğrenci düğmeye basıyor, hiçbir şey olmuyor gibi
           görünüyordu (panjur tuzağının ta kendisi).
           🔑 Bu sınıf YALNIZ üstteki bir formdan açıldığında takılır ve
           kapanışta sökülür; normal sekme gezintisi 88'de kalır. */
        .tab-screen.ustte { z-index: 10070; }
        /* Oturum: üst özet SABİT, altındaki blok listesi kayar */
        #oturum-overlay { overflow: hidden; }
        #oturum-overlay .od-inner { display: flex; flex-direction: column; height: 100%; min-height: 0; }
        .od-top { flex: none; padding-bottom: 8px; }
        #oturum-overlay .od-plist { flex: 1; min-height: 0; overflow-y: auto; padding-top: 8px; padding-bottom: 4px; }
        @media (min-width: 768px) { .tab-screen { padding: 26px 26px 100px; } .tab-screen .od-inner, .tab-screen .disc-inner { max-width: 560px; margin: 0 auto; } }
        .od-title { font-size: 13px; letter-spacing: 2px; text-transform: uppercase; color: #5d6b86; font-weight: 700; }
        .od-sub { font-size: 12px; color: #5d6b86; margin-top: 3px; }
        .od-tiles { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; margin: 16px 0 6px; }
        .od-tile { background: rgba(255,255,255,0.03); border: 1px solid var(--glass-border); border-radius: 13px; padding: 12px 6px; text-align: center; }
        .od-tile .n { font-size: 20px; font-weight: 700; font-variant-numeric: tabular-nums; }
        .od-tile .n.c { color: var(--success); } .od-tile .n.a { color: var(--warning); } .od-tile .n.g { color: #69f0ae; }
        .od-tile .l { font-size: 10px; color: #5d6b86; margin-top: 3px; letter-spacing: 0.5px; }
        .od-timeline { display: flex; height: 12px; border-radius: 7px; overflow: hidden; margin: 16px 0 6px; gap: 2px; background: rgba(255,255,255,0.03); }
        .od-timeline i { display: block; min-width: 2px; }
        .od-timeline .w { background: linear-gradient(var(--success), var(--primary)); }
        .od-timeline .b { background: rgba(245,158,11,0.6); }
        .od-key { display: flex; gap: 16px; font-size: 11px; color: #94a3b8; margin-bottom: 16px; }
        .od-key span { display: inline-flex; align-items: center; gap: 6px; }
        .od-key .sw { width: 10px; height: 10px; border-radius: 3px; }
        .od-plist { display: flex; flex-direction: column; gap: 10px; }
        /* ══ BLOK KARTI — İKİ SATIR (30 Ağustos 2026, A1 kararı) ══════════
           Eski kart altı satırdı ve içinde aynı kalem iki kez vardı (sayaçsız
           işareti + düzenle düğmesi). Kullanıcı ikisini ayırt edemedi.

             1. satır → [no] süre · ders·konu · ⌥ konuyu kapat · ✎
             2. satır → saat · tür · zorluk · kaynak · ✍ sayaçsız
             3. satır → YALNIZ mola/düzeltme varsa

           🔒 Esneyen tek şey YAZI (ders adı ve gri döküm); düğmeler daima
           yerinde. Dar ekranda ilk kaybolan en az gerekli olandır — dokunulacak
           şeyler hep görünür. `min-width:0` + `ellipsis` bunun için şart:
           olmazsa flex satırı taşar ve düğmeler ekranın dışına çıkar. */
        /* ═══ KONU ÖBEĞİ (3 Eyl, kullanıcı) ══════════════════════════════
           Aynı konunun blokları tek bir kabın içinde. Ad, ölçü ve "konuyu
           kapat" öbeğin başında bir kez; kartlar sadeleşti. */
        /* 🔴 3 Eyl akşamı — BLOKLAR GÖRÜNMÜYORDU. `.od-plist` bir sütun flex
           kabı ve yüksekliği sınırlı bir kaydırıcının içinde; flex çocukları
           varsayılan olarak SIKIŞIR. Kartlar tek tek dizilirken bu fark
           edilmiyordu, öbekler uzayınca kutular ezildi ve `overflow: hidden`
           içeriği kesti: tek bloklu öbeklerde hiç satır görünmedi.
           `flex: none` = "boyumu içeriğim belirler". */
        .od-obek { flex: none; border: 1px solid var(--glass-border); border-radius: 15px;
            background: rgba(255,255,255,0.022); padding: 0 0 8px; overflow: hidden; }
        .od-obek.kapali { padding-bottom: 0; }
        .od-obek.kapali .od-obek-govde { display: none; }
        .od-obek.kapali .od-obek-bas { border-bottom: 0; }
        .od-obek-bas { display: flex; align-items: center; gap: 8px; cursor: pointer;
            padding: 10px 11px 9px; border-bottom: 1px solid rgba(255,255,255,.06);
            background: rgba(255,255,255,.022); }
        .od-obek-bas:hover { background: rgba(255,255,255,.045); }
        /* 🔴 3 Eyl gecesi — KAPALI SATIRDA AD OKUNMUYORDU. Ölçüldü: başlık
           337 px, "konuyu kapat" düğmesi tam 108 px yiyor ve konunun adına
           da 108 px kalıyordu (adın 228 px'e ihtiyacı var). Yani satırın
           EN AZ kullanılan eylemi, satırın ÖZNESİ kadar yer kaplıyordu.
           Kapalı öbek bir içindekiler satırıdır: konu · kaç blok · kaç dakika.
           Eylem, öbeği açan kişinindir — kapatma kararı da öyle. Kapalıyken
           çizilmiyor; açılınca yerinde. Ada kalan yer: 232 px. */
        .od-obek.kapali .od-obek-bas .od-cip { display: none; }
        .od-obek-bas:focus-visible { outline: 2px solid rgba(0,242,254,.55); outline-offset: -2px; }
        .od-obek-ok { flex: none; font-size: 15px; line-height: 1; color: #5d6b86;
            transition: transform .2s ease; }
        .od-obek.kapali .od-obek-ok { transform: rotate(-90deg); }
        .od-obek-ad { flex: 1; min-width: 0; overflow: hidden; white-space: nowrap;
            font-size: 12.5px; font-weight: 700; color: #e2e8f0; }
        .od-obek-ad > i { display: inline-block; font-style: normal; white-space: nowrap; }
        .od-obek-ad.kayar {
            -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
                    mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
        }
        .od-obek-ad.kayar > i { animation: pk-kay 9s ease-in-out 1 both; }
        .od-obek-olcu { flex: none; font-size: 10.5px; color: #5d6b86; font-variant-numeric: tabular-nums; }
        .od-obek .od-card { border: 0; background: none; border-radius: 0; padding: 8px 11px 4px; }
        .od-obek .od-card + .od-card { border-top: 1px dashed rgba(255,255,255,.06); padding-top: 9px; }
        .od-obek .od-card.on { border-color: transparent; }
        .od-obek .od-card.on .od-idx { background: var(--success); color: #05131f; }
        .od-ad.ince { font-weight: 500; color: #8fa2bf; }

        .od-card { background: rgba(255,255,255,0.03); border: 1px solid var(--glass-border); border-radius: 13px; padding: 9px 11px; }
        .od-card.on { border-color: rgba(0,242,254,0.4); }
        .od-r1 { display: flex; align-items: center; gap: 9px; }
        .od-idx { width: 22px; height: 22px; flex: 0 0 22px; border-radius: 7px; display: flex; align-items: center; justify-content: center;
            font-size: 11px; font-weight: 700; color: var(--success); background: rgba(0,242,254,0.1); border: 1px solid rgba(0,242,254,0.25); font-variant-numeric: tabular-nums; }
        .od-card.on .od-idx { background: var(--success); color: #05131f; }
        .od-sure { font-size: 15px; font-weight: 700; flex: none; font-variant-numeric: tabular-nums; }
        .od-sure.on { color: #69f0ae; }
        .od-ad { flex: 1; min-width: 0; font-size: 12.5px; color: #cbd5e1;
            overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .od-r2 { display: flex; align-items: center; gap: 7px; margin-top: 5px; padding-left: 31px; }
        .od-alt { flex: 1; min-width: 0; font-size: 11px; color: #5d6b86;
            overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .od-alt .od-kaynak { font-style: normal; color: #ecd6a8; }
        /* Satır içi küçük düğme — "konuyu kapat" ve "sayaçsız" aynı ailede.
           Eski tam genişlik düğme kartın yarısını kaplıyordu (30 Ağu). */
        .od-cip { flex: none; font-size: 10.5px; font-weight: 600; border-radius: 8px; padding: 3px 8px;
            border: 1px solid var(--glass-border); background: rgba(255,255,255,0.04); color: #9db0cc;
            white-space: nowrap; cursor: pointer; font-family: inherit; }
        .od-cip.sonuk { opacity: .55; cursor: default; }
        /* 🔑 DÜĞME İÇİNDE DÜĞME (7 Eyl, gezinti bulgusu B35) ─────────────────
           Öbek başlığının kendisi bir kapıdır (dokununca öbek açılır kapanır);
           "konuyu kapat" çipi o kapının İÇİNDE duruyordu. Çip yalnız ~21 px
           yüksekliğindeydi, satır ~40 px: aradaki ölü şerit kapıya gidiyordu.
           Çipin kenarına dokunan öğrenci konuyu kapatmak yerine öbeği açıp
           kapıyordu — bir dokunuşun iki sonucu.
           ÇÖZÜM: çipin dokunma alanı SATIRIN BOYU kadar. Kaplama kullanılmaz
           (dar satırda komşunun dokunuşunu yer — anayasa, ikon maddesi):
           dolgu büyür, eksi kenar payı satırın yüksekliğini yerinde tutar.
           ⚠️ 44 px burada ULAŞILAMAZ: satırın kendisi 40 px. Listeyi
           seyrekleştirmeden verilebilecek en büyük alan satırın boyudur. */
        .od-obek-bas .od-cip { padding: 8px 10px; margin: -8px 0; border-radius: 10px; }
        /* 🔒 İŞARET YALNIZ BAŞINA ÇİZİLMEZ: "sayaçsız" daima kelimesiyle.
           Çıplak kalem, düzenle düğmesiyle karışıyordu (kullanıcı bulgusu). */
        .od-cip.beyan { display: inline-flex; align-items: center; gap: 4px; color: #8fa3bd;
            border-color: rgba(255,255,255,0.13); background: none; font-weight: 500; cursor: help; }
        .od-cip:hover, .od-cip:focus-visible { color: #e2e8f0; border-color: rgba(255,255,255,0.28); outline: none; }
        .od-cip.sonuk:hover { color: #9db0cc; border-color: var(--glass-border); }
        .od-breaks { margin-top: 8px; padding-top: 8px; border-top: 1px dashed rgba(255,255,255,0.08); display: flex; flex-wrap: wrap; gap: 6px; }
        .od-brk { font-size: 11px; color: var(--warning); background: rgba(245,158,11,0.08); border: 1px solid rgba(245,158,11,0.28); border-radius: 20px; padding: 3px 9px; white-space: nowrap; }
        .od-brk.auto { color: #ff8a80; background: rgba(244,67,54,0.08); border-color: rgba(244,67,54,0.3); }
        /* 🗑 `.od-brk.none` (✓ molasız) ve `.od-brk.elle` (✍️ elle girildi)
           30 Ağu 2026'da SÖKÜLDÜ. Molasızlık bir yokluktur, satır hak etmez;
           "elle girildi" ise üst satırdaki "✍ sayaçsız" çipinin tekrarıydı.
           Geri koymadan önce kartın kaç satır olduğuna bak. */
        /* ✎ düzeltme izi (20 Ağu): bir uyarı değil, bir kayıt — sakin durur. */
        .od-brk.duzeltme { color: #c9b6e8; background: rgba(167,139,250,0.08); border-color: rgba(167,139,250,0.28); }
        /* ORTAK MOLA (16 Ağu): kehribar değil MAVİ — uyarı ailesinden değil.
           Masayla birlikte ara vermek bir leke değil, birlikteliğin işareti;
           "hak üstü" hesabına da girmiyor. */
        .od-brk.ortak { color: #8ec5ff; background: rgba(96,165,250,0.08); border-color: rgba(96,165,250,0.30); }
        .od-empty { text-align: center; color: #5d6b86; padding: 40px 20px; font-size: 14px; }

        /* ══ DİSİPLİN EKRANI (20 Ağu 2026 — baştan kuruldu) ═══════════════
           Eski ekran tek bir rakam + bir yafta ("🏆 Elit İstikrar") + kesinti
           listesi gösteriyordu. Rakam 100'de kilitliydi, yafta da onu övüyordu.
           Yeni ekran ÜÇ AYRI SORUYU ayrı ayrı gösteriyor; toplam skor bunların
           ağırlıklı ortalaması. Yafta YOK: her ölçü kendi cümlesini söylüyor. */

        /* Pencere seçici — 7 / 14 / 30. Tek tuş, sayfa yenilenmez. */
        .dsp-pencere { display: flex; gap: 4px; margin: 14px 0 4px; padding: 3px;
            background: rgba(255,255,255,0.03); border: 1px solid var(--glass-border); border-radius: 11px; }
        .dsp-pencere button { flex: 1; height: 34px; border: none; background: none; border-radius: 9px;
            color: #8fa3bd; font-size: 12.5px; font-weight: 600; cursor: pointer; transition: all 0.16s ease;
            font-family: inherit; letter-spacing: 0.3px; }
        .dsp-pencere button.on { background: rgba(79,172,254,0.16); box-shadow: inset 0 0 0 1px rgba(79,172,254,0.35); color: #cfe6ff; }

        /* Toplam skor — ortada, büyük, sabit genişlikli rakamla (zıplamasın). */
        .dsp-skor { text-align: center; margin: 22px 0 20px; }
        .dsp-skor .n { font-size: 58px; font-weight: 700; line-height: 1; font-variant-numeric: tabular-nums; color: #e8eefc; }
        .dsp-skor .n.yok { font-size: 34px; color: #5d6b86; }
        .dsp-skor .alt { font-size: 12px; color: #5d6b86; margin-top: 9px; }

        .dsp-liste { display: flex; flex-direction: column; gap: 10px; }

        /* Ölçü kartı — kitaplık/oturum kartlarıyla AYNI cam dili. */
        .dsp-kart { background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.15);
            border-radius: 13px; padding: 15px 16px 14px; cursor: pointer; transition: border-color 0.16s ease; }
        .dsp-kart:hover, .dsp-kart:active { border-color: rgba(0,242,254,0.35); }
        .dsp-ust { display: flex; align-items: baseline; gap: 9px; }
        .dsp-ad { font-size: 14px; font-weight: 700; color: #dce6f7; }
        .dsp-deger { margin-left: auto; font-size: 26px; font-weight: 700; font-variant-numeric: tabular-nums; color: #e8eefc; }
        .dsp-ok { color: #5d6b86; font-size: 15px; margin-left: 8px; }

        /* Olgunlaşmamış ölçü: sarı rozet + solgun rakam. Değer YİNE görünür
           (öğrenci sözünü tuttuysa %100'ünü görsün), ama skora kısmi katılır. */
        .dsp-rozet { font-size: 10px; font-weight: 700; letter-spacing: 0.3px; padding: 2px 7px; border-radius: 20px;
            color: #ffd54f; background: rgba(255,213,79,0.10); border: 1px solid rgba(255,213,79,0.32); white-space: nowrap; }
        /* SAKİN ROZET (25 Ağu): olgunlaşmış ölçünün "kaç günde ölçüldü"
           bilgisi. Sarı rozet bir UYARI ("henüz 3/7 gün"); bu ise bir
           BİLGİ — o yüzden aynı biçim, sakin renk. */
        .dsp-rozet.sakin { color: #9fb3c8; background: rgba(159,179,200,0.08);
            border-color: rgba(159,179,200,0.22); font-weight: 600; }
        /* Ölçünün neyi ölçemediğini söyleyen satır. Kırmızı YOK, ünlem YOK. */
        .dsp-not { margin-top: 7px; font-size: 11px; line-height: 1.5; color: #7d8ea3; }
        .dsp-kart.ham .dsp-deger { color: #9aa7bd; }

        .dsp-serit { height: 8px; border-radius: 6px; background: rgba(255,255,255,0.06); overflow: hidden; margin: 11px 0 9px; }
        .dsp-serit i { display: block; height: 100%; border-radius: 6px; background: linear-gradient(90deg,#4facfe,#00f2fe); }
        .dsp-cumle { font-size: 12.5px; color: #8fa3bd; line-height: 1.45; }

        /* Ölçüsü olmayan hâl: kesikli çerçeve, NE BEKLEDİĞİNİ söyler.
           🔴 Sıfır YAZMAZ, suçlamaz — ölçülmemiş bir şey kusur değildir. */
        .dsp-kart.kapali { border-style: dashed; border-color: rgba(255,255,255,0.13); background: none; cursor: default; }
        .dsp-kart.kapali:hover { border-color: rgba(255,255,255,0.13); }
        .dsp-kart.kapali .dsp-ad { color: #7c8ba3; }
        .dsp-kart.kapali .dsp-cumle { color: #5d6b86; }

        .dsp-notlar { border-top: 1px solid rgba(255,255,255,0.08); margin-top: 18px; padding-top: 14px;
            font-size: 11.5px; color: #5d6b86; line-height: 1.6; }

        /* ── DETAY PERDESİ: bir ölçüye dokununca gün gün liste ── */
        /* fixed (absolute DEĞİL): ana ekran kayan bir kutu; absolute perde kaydırma
           yüksekliğine yapışıp yarım kalıyordu. */
        .dsp-detay { position: fixed; inset: 0; background: #0a0e1a;
            padding: 22px 18px 100px; box-sizing: border-box; overflow-y: auto;
            opacity: 0; visibility: hidden; transition: opacity 0.18s ease; z-index: 90; }
        .dsp-detay.show { opacity: 1; visibility: visible; }
        @media (min-width: 768px) { .dsp-detay > div { max-width: 560px; margin: 0 auto; } }
        .dsp-geri { background: none; border: 1px solid rgba(255,255,255,0.14); color: #8fa3bd; border-radius: 9px;
            padding: 6px 12px; font-size: 12px; cursor: pointer; font-family: inherit; margin-bottom: 16px; }
        .dsp-oruntu { font-size: 13px; color: #cfe6ff; background: rgba(79,172,254,0.08);
            border: 1px solid rgba(79,172,254,0.22); border-radius: 11px; padding: 11px 13px; margin: 14px 0; line-height: 1.5; }
        .dsp-gunler { display: flex; flex-direction: column; gap: 2px; }
        .dsp-gun { display: flex; align-items: baseline; gap: 10px; padding: 9px 11px; border-radius: 9px;
            font-size: 12.5px; background: rgba(255,255,255,0.02); }
        .dsp-gun .t { color: #b9c6dc; min-width: 118px; }
        .dsp-gun .s { margin-left: auto; font-variant-numeric: tabular-nums; color: #8fa3bd; }
        /* Süreklilik detayında İKİ FARKLI "boş" ayrı görünür: */
        .dsp-gun.yok { opacity: 0.42; }                                   /* program yok — sayılmıyor */
        .dsp-gun.gelmedi { background: rgba(244,67,54,0.07); }            /* program vardı, gelinmedi */
        .dsp-gun.gelmedi .s { color: #ff8a80; }
        .dsp-gun.tamam .s { color: #69f0ae; }

        /* ── KAYDI DÜZELT: kalem + alt perde (16 Ağu 2026) ────────────────
           Kalem kartın KENARINDA durur ve sessizdir. Kayıt düzeltmek övünülecek
           bir iş değil; ekranda bağırmamalı ama arandığında bulunmalı. Dokununca
           mavi olur (ekranın "sıra sende" rengi). Süren blokta hiç çizilmez —
           orada henüz kayıt yoktur (kronometre.js: odCollectBlocks). */
        .od-kalem {
            width: 26px; height: 26px; flex: none; border-radius: 8px;
            background: none; border: 1px solid rgba(255,255,255,0.14);
            color: #8fa3bd; display: flex; align-items: center; justify-content: center;
            cursor: pointer; transition: all 0.18s ease; padding: 0;
        }
        .od-kalem:hover, .od-kalem:active { color: var(--success); border-color: rgba(0,242,254,0.45); }

        #duzelt-perde {
            position: fixed; inset: 0; z-index: 10060; display: none;
            background: rgba(3, 7, 18, 0.62); backdrop-filter: blur(2px);
            align-items: flex-end; justify-content: center;
        }
        #duzelt-perde.show { display: flex; }
        .dz-govde {
            width: 100%; max-width: 460px; margin: 0 8px 8px;
            background: rgba(17, 25, 42, 0.98);
            border: 1px solid rgba(255,255,255,0.14); border-radius: 20px;
            padding: 14px 14px 12px; max-height: 88vh; overflow-y: auto;
            box-shadow: 0 -14px 40px rgba(0,0,0,0.55);
        }
        .dz-tut { width: 36px; height: 4px; border-radius: 2px; background: rgba(255,255,255,0.2); margin: 0 auto 12px; }
        .dz-baslik { font-size: 15px; font-weight: var(--yz-baslik); color: #fff; }
        .dz-baslik.dz-orta { text-align: center; line-height: 1.5; }
        .dz-alt { font-size: 11.5px; color: #5d6b86; margin: 3px 0 14px; }
        .dz-aciklama { font-size: 12.5px; color: #8fa3bd; text-align: center; line-height: 1.6; margin: 10px 0 14px; }
        .dz-not {
            font-size: 12px; color: #ffce5c; background: rgba(245,158,11,0.08);
            border: 1px solid rgba(245,158,11,0.3); border-radius: 12px;
            padding: 9px 11px; margin-bottom: 12px; line-height: 1.5;
        }
        .dz-uyari-ikon {
            width: 40px; height: 40px; margin: 4px auto 10px; border-radius: 50%;
            background: rgba(245,158,11,0.12); border: 1px solid rgba(245,158,11,0.4);
            color: var(--warning); font-size: 21px; font-weight: 700;
            display: flex; align-items: center; justify-content: center;
        }
        .dz-alan { margin-bottom: 12px; }
        .dz-alan label { display: block; font-size: 10px; letter-spacing: 1.2px; color: #5d6b86; margin-bottom: 6px; }
        .dz-alan select, .dz-serbest input {
            width: 100%; box-sizing: border-box; background: rgba(255,255,255,0.04);
            border: 1px solid rgba(255,255,255,0.14); border-radius: 11px;
            padding: 10px 11px; color: #fff; font-family: inherit; font-size: 13.5px;
        }
        .dz-serbest { display: flex; gap: 7px; margin-top: 7px; }
        /* ── Perdedeki ders/konu seçicileri ────────────────────────────────
           Ana ekranın seçicileriyle AYNI sınıflar (.dropdown-*) kullanılıyor —
           iki ekran tek dilden konuşsun diye. Buradaki tek fark açılma biçimi:
           liste AKIŞ İÇİNDE açılıyor (position:static). Sebebi somut: perde
           kaydırılabilir bir kutu (overflow-y:auto) ve absolute konumlanan bir
           liste o kutunun kenarında KIRPILIR — telefonda son seçenekler
           görünmez olurdu. Akışta açılınca perde kendisi uzuyor. */
        .dz-secici { margin-bottom: 8px; }
        .dz-secici:last-child { margin-bottom: 0; }
        .dz-secici .dropdown-list {
            position: static; margin-top: 6px; max-height: 210px;
            /* Çerçeve camgöbeğiydi (7 Eyl): camgöbeği DURUM rengi, bir kutunun
               kenarı durum değildir. Ana ekrandaki listeyle aynı kenar.
               🔒 SEÇİLİ SATIR camgöbeği KALIYOR — o gerçekten bir durum. */
            border-color: rgba(255, 255, 255, 0.14); box-shadow: none;
        }
        .dz-secici .dropdown-item { padding: 11px 13px; font-size: 0.88em; }
        /* Seçili satır listede işaretli: uzun listede "neredeydim" sorusu kalmasın. */
        .dz-secici .dropdown-item.dz-secili { color: var(--success); background: rgba(0, 242, 254, 0.06); }
        /* Ok işaretine sağda yer: ana ekrandaki kutunun aynısı (7 Eyl). */
        .dz-secici .dropdown-selected { padding: 12px 38px 12px 13px; font-size: 0.9em; }
        /* Serbest seçimden tanımlı derslere dönüş — kutu değil, sessiz bir yol. */
        .dz-geri {
            background: none; border: none; color: #8fa3bd; font-family: inherit;
            font-size: 12px; padding: 2px 0 8px; cursor: pointer; text-align: left; display: block;
        }
        .dz-geri:hover { color: var(--success); }
        /* SÜRE KİLİTLİ (3 Eyl): geçmiş günün kaydında süre bir kutu değil,
           okunacak bir satırdır. Düğmeye benzemez — dokunulamaz olduğu
           görünüşünden bellidir; altındaki satır nedenini söyler. */
        .dz-kilitli-sure {
            display: flex; flex-direction: column; gap: 3px;
            padding: 10px 13px; border-radius: 12px;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.08);
            color: #cbd5e1; font-size: 1.05em; font-weight: 600;
        }
        .dz-kilitli-sure span { font-size: 0.7em; font-weight: 400; color: #7c8aa5; }
        .dz-sure { display: flex; align-items: center; gap: 8px; }
        .dz-sure button {
            width: 38px; height: 38px; flex: none; border-radius: 11px;
            background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.14);
            color: #cbd5e1; font-size: 19px; cursor: pointer; padding: 0;
        }
        .dz-sure button:active { background: rgba(255,255,255,0.12); }
        .dz-sorular { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; }
        .dz-sayi { border: 1px solid rgba(255,255,255,0.14); border-radius: 11px; padding: 7px 4px; text-align: center; }
        .dz-sayi input {
            width: 100%; background: none; border: none; color: #fff; text-align: center;
            font-family: inherit; font-size: 16px; font-weight: 700; padding: 0;
            font-variant-numeric: tabular-nums;
        }
        .dz-sayi input:focus { outline: none; }
        .dz-sayi span { display: block; font-size: 11px; color: #5d6b86; margin-top: 2px; }
        .dz-sayi:nth-child(1) { border-color: rgba(105,240,174,0.3); }
        .dz-sayi:nth-child(1) input { color: #69f0ae; }
        .dz-sayi:nth-child(2) { border-color: rgba(239,68,68,0.3); }
        .dz-sayi:nth-child(2) input { color: #ff8a80; }
        .dz-hata { font-size: 12px; color: #ff8a80; text-align: center; margin-bottom: 10px; line-height: 1.5; }
        /* ═══ KAYNAK + AYRAÇ TEK BLOK (3 Eyl gecesi, kullanıcı kararı) ═══════
           "Kitabın adı yanına ayraç koy." Eskiden araya KAYNAK ZORLUĞU
           giriyordu: kitabın adı yukarıda, sayfası aşağıda kalıyor, ikisi bir
           arada okunamıyordu. Kitap ile sayfası TEK ŞEYDİR. */
        /* KAYNAK + AYRAÇ TEK SATIR: ad solda ve küçük, sayfa sağda. Dar
           ekranda kısalan şey YAZI — kutular daima yerinde. */
        /* Parçalı kayıtta toplam sayfa — tek blok yolundaki prosedürün aynısı. */
        .pk-num.pk-toplam { width: 74px; }
        .pk-toplam-yaz {
            padding: 7px 10px; border-radius: 9px; cursor: pointer; white-space: nowrap;
            font-family: inherit; font-size: 0.8em; font-weight: 600;
            color: var(--ktp-altin-yazi, #e8d5a8); background: rgba(212, 175, 106, 0.14);
            border: 1px solid rgba(212, 175, 106, 0.36);
        }
        .pk-toplam-yaz:active { transform: scale(.97); }

        /* 🔴 KAYNAK VE ARALIK AYRI SATIRDA (7 Eylül 2026, kullanıcı bulgusu).
           İkisi YAN YANA duruyordu: sayfa kutuları (baş → son · toplam) sabit
           genişlikteydi, kitabın adına kalan yer eziliyordu ve uzun ad
           okunmuyordu. Kaynak bu kartın kimliğidir, aralık onun ayrıntısı —
           önce kim olduğu yazılır, sonra kaçtan kaça. */
        .dz-kaynak-blok { display: flex; flex-direction: column; align-items: stretch; gap: 8px; }
        .dz-kaynak-blok > #dz-kaynak-kap { min-width: 0; }
        .dz-kaynak-blok > #dz-ayrac-kap {
            display: flex; flex-wrap: wrap; align-items: center; gap: 5px;
        }
        /* Cephe çipleri ("Nereden devam ettin?") kutularla aynı satıra
           binmesin: ikisi de tam satır ister. */
        #dz-ayrac-kap > .ktp-cephe-sor,
        #dz-ayrac-kap > .ktp-cepheler { flex: 1 0 100%; }
        /* ═══ KAYNAK SATIRI BURADA DEĞİL (4 Eylül 2026) ═══════════════════
           Satırın ölçüsü `kitaplik.css` → `.ks-sat` ailesine taşındı: satırı
           çizen tek yer artık kitaplığın merkezî çizicisi. Eskiden dört kayıt
           yüzeyinden ikisi buradaki `.dz-kaynak-*` ölçüsünü, biri parçalı
           listenin `.pk-pil` ölçüsünü kullanıyordu — aynı iş, üç ayrı ölçü.
           Kap (`.dz-kaynak-blok`) burada kalır: yerleşim bu ekranın işidir,
           satırın görünüşü merkezin. */
        /* Sayfa kutuları: satıra sığsın diye dar. */
        .dz-saat.dz-sy { width: 52px; padding: 8px 4px; text-align: center; }
        .dz-saat.dz-sy.gen { width: 68px; }
        .dz-sy-yaz {
            flex: none; padding: 8px 10px; border-radius: 9px; cursor: pointer;
            font-family: inherit; font-size: 0.78em; font-weight: 600; white-space: nowrap;
            color: var(--ktp-altin-yazi, #e8d5a8); background: rgba(212, 175, 106, 0.14);
            border: 1px solid rgba(212, 175, 106, 0.36);
        }
        .dz-sy-yaz:active { transform: scale(.97); }
        .dz-ek { font-style: normal; font-weight: 400; color: #5d6b86; }
        .dz-ek.ister { color: #b99a63; }
        /* Blok içi etiket: dışarıdaki `label`dan bir tık kısık — bu bir alt
           başlık, yeni bir bölüm değil. */
        .dz-ic-etiket {
            display: block; margin-bottom: 6px;
            font-size: 0.66em; letter-spacing: 0.09em; text-transform: uppercase;
            color: #5d6b86; font-weight: 600;
        }
        .dz-ic-etiket i { font-style: normal; font-weight: 400; color: #5d6b86; }
        .dz-ic-etiket i.ister { color: #b99a63; }

        /* Toplam sayfa YERİNDE yazılır: kutu + düğme yan yana, uyarının içinde. */
        .dz-eksik-form { flex: none; display: flex; align-items: center; gap: 6px; }
        .dz-eksik-form input {
            width: 74px; text-align: center; padding: 7px 8px; font-size: 1em;
        }
        .dz-eksik-form button { padding: 7px 11px; }
        .dz-eksik.ince { flex-wrap: wrap; }
        /* ═══ EKSİK SATIRI — uyarı + eksiğin giderildiği yere kapı (3 Eyl) ═══
           İki yerde çıkar: derste hiç kitap yokken · kitabın toplam sayfası
           yazılı değilken. 🔒 KIRMIZI YOK — bu bir suçlama değil, bir eksik.
           Altın, kitaplığın "dokunulmamış tel" rengiyle aynı dilden konuşuyor. */
        .dz-eksik {
            display: flex; align-items: center; gap: 10px; padding: 10px 12px;
            border-radius: 12px; font-size: 0.78em; line-height: 1.45;
            background: rgba(212, 175, 106, 0.06);
            border: 1px solid rgba(212, 175, 106, 0.2);
        }
        .dz-eksik span { flex: 1; min-width: 0; color: #b0bdd0; }
        .dz-eksik button {
            flex: none; padding: 7px 12px; border-radius: 9px; cursor: pointer;
            font-family: inherit; font-size: 0.94em; font-weight: 600; white-space: nowrap;
            color: #e8d5a8; background: rgba(212, 175, 106, 0.14);
            border: 1px solid rgba(212, 175, 106, 0.36);
        }
        .dz-eksik button:active { transform: scale(.97); }
        /* Sayfa satırının altındaki hâli daha kısık: orada asıl iş sayı yazmak. */
        .dz-eksik.ince { margin-top: 8px; padding: 8px 10px; font-size: 0.73em; }
        .dz-eksik.ince button { padding: 6px 10px; }

        /* "Devam" kapalıyken NEDENİ yazılır — sessiz ölü düğme olmasın. */
        .dz-neden {
            margin-bottom: 7px; text-align: center;
            font-size: 0.75em; color: #7c8aa5;
        }
        /* ALTIN = İLERLET (7 Eyl): "Düzeltmeyi kaydet" ve elle girişteki
           "Devam"/"Kaydet" bu sınıftan doğar. Kayıt kartındaki KAYDET ile
           AYNI renk — iki ekran aynı kartı çiziyorsa aynı sözü de vermeli. */
        .dz-birincil {
            width: 100%;
            background: var(--ss-eylem-dolgu, rgba(212,175,106,.16));
            border: 1px solid var(--ss-eylem-cizgi, rgba(212,175,106,.48));
            color: var(--ss-eylem-yazi, #E8D5A8);
            border-radius: 12px; padding: 12px 0; font-family: inherit;
            /* Ana düğme de ince (maket §4): kalınlık "bak bana" demenin en
               ucuz yolu ve tek başına duran bir düğmenin buna ihtiyacı yok. */
            font-size: 14px; font-weight: var(--yz-baslik); letter-spacing: .03em;
            cursor: pointer; margin-bottom: 8px;
        }
        .dz-birincil:disabled { opacity: 0.6; cursor: default; }
        .dz-satir { display: flex; gap: 8px; }
        .dz-ikincil, .dz-tehlike {
            flex: 1; border-radius: 12px; padding: 10px 0; font-family: inherit;
            font-size: 13px; font-weight: var(--yz-baslik); cursor: pointer; background: none;
        }
        .dz-ikincil { border: 1px solid rgba(255,255,255,0.14); color: #cbd5e1; }
        .dz-tehlike { border: 1px solid rgba(239,68,68,0.35); color: #ff8a80; }
        .dz-tehlike.dz-dolu { background: rgba(239,68,68,0.15); border-color: rgba(239,68,68,0.45); }

        /* ═══ ELLE GİRİŞ (19 Ağu 2026) — kapı satırı + perdenin ek parçaları ═══
           Perde düzeltme perdesinin TA KENDİSİ (#duzelt-perde, .dz-*): aynı
           seçiciler, aynı kutular, aynı düğmeler. Burada yalnız bu ekrana
           özgü olanlar var: çip sırası (bugün/dün · kolay/orta/zor), özet
           satırı, "yazıldı" onayı. */
        /* 20 Ağu: ana ekrandaki `#elle-giris-kapi` satırı ve kendi biçimi
           SÖKÜLDÜ — kapı profile taşındı ve orada ortak `.hs-kapi` iskeletini
           kullanıyor (profil kapıları tek biçim kuralı). Odak kipinde gizleme
           kuralına da gerek kalmadı: profil zaten çalışma sürerken açılmıyor. */

        /* Oturum sekmesinin altındaki ikinci kapı: defterin bittiği yerde, sessiz. */
        /* SAYAÇSIZ ÇALIŞTIM — 25 Ağu: listenin altından ÜSTE taşındı ve
           kendi ikonuna kavuştu. Kesikli çerçeve KALIYOR: bu bir beyan,
           ölçüm değil — çerçeve de öyle söylüyor. */
        .od-elle {
            /* flex:none ŞART — genel button kuralı flex:1 veriyor, liste sütununda
               düğme boşluğu doldurup devleşiyordu. */
            display: flex; align-items: center; gap: 11px; flex: none; width: 100%;
            margin: 2px 0 12px; padding: 11px 13px;
            background: rgba(212,175,106,0.045); border: 1px dashed rgba(212,175,106,0.30);
            border-radius: 13px; color: #c2b291; font-family: inherit; cursor: pointer; text-align: left;
        }
        .od-elle:hover { color: #e8d5a8; border-color: rgba(212,175,106,0.55); background: rgba(212,175,106,0.09); }
        .od-elle svg { flex: none; color: #d4af6a; }
        .od-elle .od-elle-yz { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
        .od-elle .od-elle-yz b { font-size: 12.8px; font-weight: 700; color: #e8d5a8; }
        .od-elle .od-elle-yz i { font-style: normal; font-size: 11px; line-height: 1.45; color: #8b9bb2; }
        .od-elle .od-elle-ok { flex: none; font-size: 15px; color: #8a7442; }

        .dz-cipler { display: flex; gap: 7px; }
        /* BEŞLİ CETVEL (4 Eyl, kullanıcı kararı: "hepsi YAN YANA").
           Beş kademe TEK SATIRDA durur — sarmak cetveli iki parçaya bölüyor,
           göz "üstteki üç, alttaki iki" diye okuyordu; oysa bu tek bir
           ölçektir ve sırası soldan sağa okunmalı. Sığdırmanın bedeli yazı
           boyu: 10,5px ve dar boşluk. */
        .dz-cipler.bes { flex-wrap: nowrap; gap: 4px; }
        .dz-cipler.bes .dz-cip {
            flex: 1 1 0; min-width: 0; font-size: 10.5px; padding: 9px 1px;
            letter-spacing: -0.2px; white-space: nowrap;
        }
        .dz-cip {
            flex: 1; padding: 9px 0; border-radius: 11px; cursor: pointer;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.14);
            color: #cbd5e1; font-family: inherit; font-size: 13px; font-weight: 600;
        }
        .dz-cip.secili { color: var(--success); border-color: rgba(0, 242, 254, 0.45); background: rgba(0, 242, 254, 0.07); }
        .dz-cip:disabled { opacity: 0.45; cursor: default; }
        /* Gün çipinde tarih alt satırı (22 Ağu): gece 04:00 devri yüzünden
           "Dün" tek başına yanıltıcı — tarih hangi defteri söyler. */
        .dz-cip.dz-gun small { display: block; margin-top: 2px; font-size: 10.5px; font-weight: 400; color: #5d6b86; }
        .dz-cip.dz-gun.secili small { color: #8fa3bd; }
        /* ══ ✍ SAYAÇSIZ İZİ (27 Ağu) — üç ekranda aynı ══════════════════════
           Düzeltme kalemiyle (.gc-duzelt / .od-kalem) KARIŞMASIN diye kasten
           farklı: iz KUTUSUZ ve sönük durur, kalem kutulu ve dokunulur. İkisi
           aynı satırda yan yana gelebilir (dünün elle kaydı).
           Ceza değil etiket: renk uyarı kırmızısı değil, satırın kendi kısığı. */
        .ss-beyan {
            display: inline-flex; align-items: center; justify-content: center;
            color: #7d8ca6; cursor: help; flex: none; vertical-align: -2px;
        }
        .ss-beyan:hover, .ss-beyan:focus-visible { color: #cbd5e1; outline: none; }
        .ss-beyan-not {
            margin: 4px 0 2px; padding: 7px 10px; border-radius: 9px;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.08);
            font-size: 11px; color: #8fa3bd; line-height: 1.5; text-align: left;
        }

        /* SAPMA UYARISI (27 Ağu): süreye belirgin dokunuşta ne olacağını
           KAYDETMEDEN ÖNCE söyler. Kırmızı DEĞİL — bu bir hata değil, bir
           sonuç bildirimi. Ilık altın: ürünün "dikkat et" değil "bilesin"
           rengi. `.dz-hata` ile karışmasın diye ayrı sınıf. */
        .dz-sapma {
            margin-top: 9px; padding: 9px 12px; border-radius: 10px;
            background: rgba(212, 175, 106, 0.07); border: 1px solid rgba(212, 175, 106, 0.28);
            font-size: 11.5px; color: #e8d5a8; line-height: 1.55;
        }
        .dz-sapma b { color: #fff; font-weight: 700; }

        /* Dün seçilince kural önden söylenir — sakin bilgi satırı, uyarı değil. */
        .dz-bilgi {
            margin-top: 9px; padding: 8px 11px; border-radius: 10px;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.08);
            font-size: 11.5px; color: #8fa3bd; line-height: 1.5;
        }
        /* Geçmiş dökümünde düzeltme kalemi (gc-row bir <button>, bu span).
           🔴 23 AĞU — ADI DEĞİŞTİ: `.gc-kalem` idi, `.gc-duzelt` oldu.
           "Kalem" kelimesi bu ekranda İKİ ANLAMA geliyordu: burada YAZI
           GEREÇİ (düzeltme simgesi), "Bu hafta" sayfasında ise DÖKÜM
           SATIRI (kalem = madde, `.gc-kalemler` listesinin çocuğu). İki ayrı
           iş aynı adı alınca bu kural oradaki satırlara da uygulandı ve
           her ders satırı 22×22 pikselik bir kutuya sıkıştı — yazılar üst
           üste bindi, sayfa okunmaz oldu. Kullanıcı bildirdi.
           Aynı adı bir daha kullanma; bekçi: scripts/bekci-sinif-cakismasi.mjs */
        .gc-duzelt {
            display: inline-flex; align-items: center; justify-content: center;
            width: 22px; height: 22px; margin-left: 6px; border-radius: 7px;
            color: #8fa3bd; background: rgba(255,255,255,0.05); cursor: pointer; vertical-align: -5px;
        }
        .gc-duzelt:hover, .gc-duzelt:focus-visible { color: #e2e8f0; background: rgba(255,255,255,0.11); outline: none; }
        /* Ekran 2'nin başındaki özet: neyi kaydediyoruz — tek satır, dokununca geri. */
        .dz-ozet {
            display: block; width: 100%; box-sizing: border-box; text-align: left;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.10);
            border-radius: 12px; padding: 9px 12px; margin-bottom: 14px;
            color: #e2e8f0; font-family: inherit; font-size: 12.5px; font-weight: 600; cursor: pointer;
            overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
        }
        .dz-ozet i { font-style: normal; color: #8fa3bd; font-weight: 400; }
        /* Elle girişte başlama saati — yalnız günün ilk kaydında sorulur. */
        .dz-saat {
            width: 100%; box-sizing: border-box; text-align: center;
            background: none; border: 1px solid rgba(255,255,255,0.14); border-radius: 11px;
            padding: 10px 0; color: #fff; font-family: inherit; font-size: 15px; font-weight: 700;
            font-variant-numeric: tabular-nums;
        }
        .dz-saat:focus { outline: none; border-color: rgba(0, 242, 254, 0.45); }
        .dz-saat::-webkit-calendar-picker-indicator { filter: invert(0.7); cursor: pointer; }

        .dz-sure input {
            flex: 1; min-width: 0; text-align: center; font-size: 15px; font-weight: 700; color: #fff;
            background: none; border: 1px solid rgba(255,255,255,0.14); border-radius: 11px; padding: 9px 0;
            font-family: inherit; font-variant-numeric: tabular-nums;
        }
        .dz-sure input:focus { outline: none; border-color: rgba(0, 242, 254, 0.45); }
        /* "Bu konuyu bitirdim" — kaydet ekranındaki rozetin küçük kardeşi. */
        .dz-bitti {
            display: flex; align-items: center; gap: 8px; width: 100%; box-sizing: border-box;
            background: none; border: 1px solid rgba(255,255,255,0.12); border-radius: 12px;
            padding: 9px 12px; margin-bottom: 12px; color: #8fa3bd; font-family: inherit;
            font-size: 12.5px; cursor: pointer; text-align: left;
        }
        .dz-bitti::before { content: ""; width: 14px; height: 14px; border-radius: 4px; border: 1px solid rgba(255,255,255,0.3); flex: none; }
        .dz-bitti[aria-pressed="true"] { color: #F5D67B; border-color: rgba(245, 214, 123, 0.45); }
        .dz-bitti[aria-pressed="true"]::before { background: #F5D67B; border-color: #F5D67B; }
        /* Onay: kısa, tek satır, sonra perde kendi kapanır. Kutlama YOK — elle
           giriş bir eşik değil (Kyron kıpırdamaz). */
        .dz-yazildi { text-align: center; padding: 18px 6px 14px; color: #69f0ae; font-size: 13.5px; font-weight: 600; line-height: 1.6; }
        .dz-yazildi small { display: block; color: #8fa3bd; font-weight: 400; font-size: 12px; margin-top: 4px; }

        /* Geçmiş gün dökümünün altındaki kilit notu — kuralı bir kez öğretir. */
        .gc-kilit {
            display: flex; align-items: flex-start; gap: 7px; margin-top: 10px;
            padding-top: 9px; border-top: 1px dashed rgba(255,255,255,0.08);
            font-size: 11px; color: #5d6b86; line-height: 1.5; text-align: left;
        }
        .gc-kilit svg { flex: none; margin-top: 1px; }

        /* ================= GEÇMİŞ sekmesi (koçsuz öğrencinin kendi tarihi) =================
           Tasarım kuralı: PUAN YOK, KIYAS YOK, GRAFİK YOK (tek istisna ısı şeridi).
           Ekran "ne kadar biriktirdim" sorusuna üç sayıyla cevap verir; gerisi
           merak edene açılır. Üst özet sabit durur, altı kayar (Oturum ile aynı dil). */
        #gecmis-overlay { overflow: hidden; }
        #gecmis-overlay .od-inner { display: flex; flex-direction: column; height: 100%; min-height: 0; }
        #gecmis-overlay .gc-scroll { flex: 1; min-height: 0; overflow-y: auto; padding-top: 10px; padding-bottom: 6px; }
        /* Buradaki sayılar Oturum sekmesindekinden UZUN ("108s 22dk", "1.291"):
           aynı 20px'te kutuya sığmayıp iki satıra taşıyordu. */
        #gecmis-overlay .od-tile .n { font-size: 18px; white-space: nowrap; }

        /* Isı şeridi: 12 hafta × 7 gün. Sayı yok, yorum yok — yalnız desen.
           "Ben aslında düzenliyim" ya da "hafta sonları kayboluyorum" tek bakışta. */
        /* grid-auto-COLUMNS şart: yalnız satır sayısını vermek sütunları "auto"
           bırakıyor, kareler aspect-ratio yüzünden şişip 12 hafta ekrana sığmıyordu.
           Kare SABİT 13px — tam genişliğe yayılınca 45px'lik dev kutular çıkıyor ve
           çoğu boş olan bir ızgara ekranın yarısını yiyor. Küçük kare desen okutur,
           büyük kare boşluğu bağırtır. */
        .gc-heat { display: grid; grid-auto-flow: column; grid-template-rows: repeat(7, 13px);
            grid-auto-columns: 13px; gap: 3px; margin: 14px 0 10px; justify-content: center; }
        .gc-heat i { display: block; width: 13px; height: 13px; border-radius: 3px;
            background: rgba(255,255,255,0.045); cursor: pointer; }
        /* BEŞ kademe (20 Ağu) — eşikler öğrencinin kendi zirvesine göre hesaplanır,
           renkler de o beş dilimi taşır. Üç kademede 8,5 saatlik gün ile 2 saatlik
           gün aynı renkteydi. */
        .gc-heat i.l1 { background: rgba(0, 242, 254, 0.16); }
        .gc-heat i.l2 { background: rgba(0, 242, 254, 0.30); }
        .gc-heat i.l3 { background: rgba(0, 242, 254, 0.46); }
        .gc-heat i.l4 { background: rgba(0, 242, 254, 0.64); }
        .gc-heat i.l5 { background: rgba(0, 242, 254, 0.85); }
        .gc-heat i.sec { outline: 2px solid var(--primary); outline-offset: 1px; }
        .gc-heat i.bos { cursor: default; }
        .gc-legend { display: flex; align-items: center; justify-content: center; gap: 6px; font-size: 11px; color: #5d6b86; }
        .gc-legend i { width: 10px; height: 10px; border-radius: 3px; display: inline-block;
            background: rgba(255,255,255,0.045); }
        .gc-legend i.l1 { background: rgba(0, 242, 254, 0.16); }
        .gc-legend i.l2 { background: rgba(0, 242, 254, 0.30); }
        .gc-legend i.l3 { background: rgba(0, 242, 254, 0.46); }
        .gc-legend i.l4 { background: rgba(0, 242, 254, 0.64); }
        .gc-legend i.l5 { background: rgba(0, 242, 254, 0.85); }

        /* Ders satırı: kapalı gelir, dokununca konuları açılır. 40 satırla açılan
           bir ekran "sade" değildir — derinlik isteyene bir dokunuş uzakta. */
        .gc-row { width: 100%; background: rgba(255,255,255,0.03); border: 1px solid var(--glass-border);
            border-radius: 13px; padding: 11px 13px; margin-bottom: 8px; text-align: left;
            color: inherit; font: inherit; cursor: pointer; display: block; }
        .gc-row:hover { border-color: rgba(0,242,254,0.28); }
        .gc-rtop { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; }
        .gc-name { font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
        .gc-val { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; color: var(--success); flex: none; }
        .gc-sub { font-size: 11.5px; color: #5d6b86; margin-top: 3px; }
        .gc-bar { height: 4px; border-radius: 3px; background: rgba(255,255,255,0.06); margin-top: 8px; overflow: hidden; }
        .gc-bar i { display: block; height: 100%; background: linear-gradient(90deg, var(--success), var(--primary)); }
        .gc-topics { margin-top: 9px; padding-top: 9px; border-top: 1px dashed rgba(255,255,255,0.08); display: none; }
        .gc-row.open .gc-topics { display: block; }
        .gc-topic { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px;
            font-size: 12px; color: #94a3b8; padding: 4px 0; }
        .gc-topic .gc-alt { display: block; font-size: 11px; color: #5d6b86; margin-top: 1px; }
        /* ">" ŞART: torunları da kapsayan seçici, sol sütundaki .gc-alt'ı da
           vuruyordu — alt satır üst satırdan parlak çıkıyor, hiyerarşi ters dönüyordu. */
        .gc-topic > span:last-child { color: #cbd5e1; font-variant-numeric: tabular-nums; flex: none; }
        .gc-more { background: none; border: none; color: var(--primary); font: inherit; font-size: 12.5px;
            cursor: pointer; padding: 8px 4px; display: block; margin: 0 auto; }
        .gc-note { font-size: 11.5px; color: #5d6b86; text-align: center; padding: 14px 8px 4px; line-height: 1.5; }
        .gc-note a { color: var(--primary); text-decoration: none; }
        .gc-sec { font-size: 12px; letter-spacing: 1.4px; text-transform: uppercase; color: #5d6b86;
            font-weight: 700; margin: 18px 0 9px; }

        /* ZİRVE KARTLARI (M1): altın = birikimin rengi (kitaplık tasarım diliyle
           aynı üçlü: #d4af6a / #8a7442 / #e8d5a8). Turkuazla yarışmaz, yanında
           sessiz durur. Kıyas yok, bayrak yok — dağ ve tepesinde küçük bir ışık. */
        .gc-zirve { display: flex; align-items: center; gap: 12px; margin-bottom: 8px;
            padding: 11px 13px; border-radius: 13px;
            background: linear-gradient(135deg, rgba(212,175,106,0.10), rgba(212,175,106,0.03));
            border: 1px solid rgba(212,175,106,0.32); }
        .gc-zirve svg { flex: none; }
        .gc-zirve .z1 { font-size: 10px; font-weight: 800; letter-spacing: 1.4px;
            text-transform: uppercase; color: #e8d5a8; }
        .gc-zirve .z2 { font-size: 15.5px; font-weight: 800; color: #fff; margin-top: 1px;
            font-variant-numeric: tabular-nums; }
        .gc-zirve .z3 { font-size: 12px; color: #8fa3bd; margin-top: 1px;
            font-variant-numeric: tabular-nums; }

        /* BOŞ ÖLÇÜM KARTI (22 Ağu): rekor henüz kurulmadı. Aynı çerçeve,
           SÖNÜK ışık — kart kaybolsa öğrenci böyle bir rekorun varlığını
           öğrenemezdi. Kırmızı ve uyarı dili YOK: bu bir eksiklik değil,
           henüz doldurulmamış bir yer. */
        .gc-zirve.bos { background: rgba(255,255,255,0.03);
            border-color: rgba(212,175,106,0.14); }
        .gc-zirve.bos svg { opacity: 0.42; }
        .gc-zirve.bos .z1 { color: #9c8f74; }
        .gc-zirve.bos .z2 { color: #8fa3bd; font-size: 13.5px; font-weight: 700; }
        .gc-zirve.bos .z3 { color: #6b7c94; }
        /* ── BULANIK REKOR (25 Ağu) ─────────────────────────────────
           Rekoru olmayan kartın RAKAM YERİ bulanıktır; sembol ve başlık
           keskin kalır. Uydurma sayı YOK — blok işareti "burada bir şey
           olacak" der. Gizem katmak için: kaybolan karttan iyidir, çünkü
           öğrenci hedefi görüyor.
           ⚠️ `filter` bazı eski Android WebView'lerde çalışmıyor; o yüzden
           renk de soluk seçildi — bulanıklık gitse bile okunur bir sayı
           sanılmaz (blok işaretinin okunacak bir şeyi yok). */
        /* ZİRVE KARTLARI AYNA IZGARASINDA (25 Ağu): sınıflar `ay-kart`'ın
           kendisi — ikinci bir görsel dil yok. Yalnız iki ek gerekiyor:
           kilitli kartta sembol sönsün (Aynan'ın kilidi yazı rengini
           değiştiriyor, bizim semboller kendi altınını taşıyor) ve
           bulanık rakam kutusu yerini bulsun. */
        .ay-kart.kilit svg { opacity: 0.45; }
        .ay-kart .z-gizli {
            display: inline-block; filter: blur(4.5px); opacity: 0.5;
            letter-spacing: 2px; color: #cbd5e1; user-select: none;
        }
        .gc-zirve.bos .z-gizli {
            display: inline-block; filter: blur(4.5px); opacity: 0.5;
            letter-spacing: 2px; color: #cbd5e1; user-select: none;
        }
        /* Kilit cümlesi: kapı değil geri sayım. Kırmızı YOK, ünlem YOK. */
        .gc-zirve-kilit {
            margin: 2px 0 12px; padding: 10px 12px; border-radius: 12px;
            background: rgba(212,175,106,0.06); border: 1px solid rgba(212,175,106,0.18);
            font-size: 12.5px; line-height: 1.6; color: #b9a887;
        }
        .gc-zirve-kilit b { color: #e8d5a8; }

        /* ÖLÇÜM NOTU — atletizm benzetmesi (kullanıcı kararı, 22 Ağu).
           Katlanır: merak eden açar. Kapalıyken tek satır, açıkken iki
           paragraf; ekranın kalabalığını artırmıyor. */
        .gc-bilgi { margin: 14px 0 4px; padding: 0; border-radius: 12px;
            background: rgba(255,255,255,0.035); border: 1px solid rgba(255,255,255,0.07); }
        .gc-bilgi > summary { list-style: none; cursor: pointer; padding: 11px 13px;
            font-size: 12px; font-weight: 700; color: #8fa3bd; }
        .gc-bilgi > summary::-webkit-details-marker { display: none; }
        .gc-bilgi > summary::after { content: '›'; float: right; opacity: .6;
            transition: transform .18s ease; display: inline-block; }
        .gc-bilgi[open] > summary::after { transform: rotate(90deg); }
        .gc-bilgi[open] > summary { color: #cbd5e1; }
        .gc-bilgi p { margin: 0 13px 11px; font-size: 12.5px; line-height: 1.62; color: #8fa3bd; }
        .gc-bilgi p b { color: #cbd5e1; font-weight: 700; }

        /* SON 4 HAFTA (M1): gezinti çubuğu + "Bu hafta" çapası. Çapa altınla
           İŞARETLİDİR, yargı değil konum — düşük hafta kızarmaz, çubuklar
           yalnız oran anlatır. */
        .gc-gez { display: flex; justify-content: space-between; align-items: center;
            margin: 2px 2px 8px; font-size: 11.5px; color: #5d6b86;
            font-variant-numeric: tabular-nums; }
        .gc-gez button { background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border);
            color: #cbd5e1; border-radius: 8px; padding: 3px 10px; font: inherit;
            font-size: 12px; cursor: pointer; }
        .gc-gez button[disabled] { opacity: 0.35; cursor: default; }
        .gc-row.gc-bu .gc-name { color: #e8d5a8; }
        .gc-row.gc-bu .gc-bar i { background: linear-gradient(90deg, #8a7442, #d4af6a); }

        /* KENDİ DÖNEMİN (M1): iki tarih kutusu + hızlı seçim düğmeleri.
           color-scheme:dark — tarayıcının takvim penceresi de karanlık açılsın. */
        .gc-aralik { display: flex; gap: 8px; margin-bottom: 8px; }
        .gc-aralik label { flex: 1; font-size: 9px; letter-spacing: 1.2px;
            text-transform: uppercase; color: #5d6b86; font-weight: 700; }
        .gc-aralik input[type=date] { display: block; width: 100%; box-sizing: border-box;
            margin-top: 3px; padding: 8px 10px; font: inherit; font-size: 13px;
            color: white; background: rgba(255,255,255,0.05);
            border: 1px solid var(--glass-border); border-radius: 10px;
            color-scheme: dark; font-variant-numeric: tabular-nums; }
        .gc-chips { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 10px; }
        .gc-chip { font: inherit; font-size: 11px; padding: 4px 10px; border-radius: 20px;
            border: 1px solid var(--glass-border); color: #8fa3bd;
            background: rgba(255,255,255,0.04); cursor: pointer; }
        .gc-chip.sec { border-color: rgba(0,242,254,0.4); color: var(--success);
            background: rgba(0,242,254,0.07); }

        /* HEDEF–FARK–TEMPO (M1): uyum halkası + plan/gerçek çift çubukları.
           Plan kesikli kutu, gerçekleşen dolu çubuk; taşan çalışma kızarmaz,
           kutunun dışına sakince taşar. Davet kilit ekranı değil, kapı tarifi. */
        .gc-uyum { display: flex; align-items: center; gap: 14px; margin-bottom: 10px; }
        .gc-halka { position: relative; width: 86px; height: 86px; flex: none; }
        .gc-yuzde { position: absolute; inset: 0; display: flex; flex-direction: column;
            align-items: center; justify-content: center; font-weight: 800; font-size: 19px;
            font-variant-numeric: tabular-nums; }
        .gc-yuzde small { font-size: 8.5px; font-weight: 700; letter-spacing: 1.2px; color: #5d6b86; }
        .gc-uyum-yazi { font-size: 12.5px; color: #b7c3d8; line-height: 1.55; }
        .gc-uyum-yazi b { color: white; font-variant-numeric: tabular-nums; }
        .gc-uyum-yazi span { color: #5d6b86; font-size: 11.5px; }
        /* ── UYUM KALEMLERİ (20 Ağu) — altı satır, her biri kendi rengiyle.
           Kaçan ve Bekleyen'in rengi YOK: ikisi de bir emek değil, bir boşluk;
           renkle vurgulamak onları suçlama gibi okuturdu. */
        .gc-uyum-cumle { font-size: 12.5px; color: #b7c3d8; line-height: 1.6;
            padding: 10px 12px; margin: 2px 0 12px; border-radius: 12px;
            background: rgba(255,255,255,0.035); border: 1px solid rgba(255,255,255,0.07); }
        .gc-uyum-cumle b { color: #fff; font-variant-numeric: tabular-nums; }
        .gc-kalemler { margin-bottom: 6px; }
        .gc-kalem { padding: 8px 0; border-bottom: 1px solid rgba(255,255,255,0.05); }
        .gc-kalem:last-child { border-bottom: none; }
        .gc-kalem .ust { display: flex; align-items: center; gap: 8px; font-size: 12.5px; }
        .gc-kalem .im { flex: none; width: 9px; height: 9px; border-radius: 3px; }
        .gc-kalem .im.bos { background: rgba(255,255,255,0.10); }
        .gc-kalem .ad { flex: 1; min-width: 0; color: #cbd5e1; }
        .gc-kalem .dk { color: #fff; font-weight: 600; font-variant-numeric: tabular-nums; }
        .gc-kalem .ic { margin: 4px 0 0 17px; font-size: 11.5px; color: #6b7a94; line-height: 1.5; }
        .gc-cift { margin-bottom: 8px; }
        .gc-cift .b { display: flex; justify-content: space-between; font-size: 12px;
            margin-bottom: 3px; color: #cbd5e1; }
        .gc-cift .b span:last-child { color: #8fa3bd; font-variant-numeric: tabular-nums; }
        .gc-cift .c { position: relative; height: 10px; }
        .gc-cift .c i { position: absolute; left: 0; display: block; }
        .gc-cift .c .p { top: 0; bottom: 0; border-radius: 5px;
            background: rgba(212,175,106,0.14); border: 1px dashed rgba(212,175,106,0.4);
            box-sizing: border-box; }
        .gc-cift .c .g { top: 2px; bottom: 2px; border-radius: 4px;
            background: linear-gradient(90deg, var(--primary), var(--success)); }
        .gc-tempo { margin-top: 10px; }
        .gc-tempo .t { font-size: 12px; color: #b7c3d8; margin-top: 4px;
            font-variant-numeric: tabular-nums; }
        .gc-tempo .iyi { color: #34d399; font-weight: 700; }
        /* ═══ ODAK AYNASI (M2, 11 Ağu 2026) ═══════════════════════════
           Kartlar sakin durur: kırmızı yok, ok yok, rozet yok. Kıyas satırı
           kartın altında sessiz bir dipnot — aynanın işi göstermek. */
        /* ═══ GELGİT BAŞLIĞI (22 Ağu akşamı) ══════════════════════════════
           Geri düğmesi gövdedeydi, pencere seçici hemen altındaydı: üst üste
           iki şerit, dağınık bir giriş. İkisi de başlığa alındı — geri okla
           solda, başlık ortada, pencereler tek satır altta. */
        .od-top-gelgit {
            display: grid; grid-template-columns: auto 1fr; column-gap: 11px;
            align-items: center;
        }
        .od-top-gelgit .gg-geri { grid-row: 1 / span 2; }
        .od-top-gelgit .od-title { grid-column: 2; }
        .od-top-gelgit .od-sub { grid-column: 2; }
        /* ⚠️ Şerit başlığa taşınınca oradaki `flex: 1` mirasına girdi ve
           düğmeler eşit genişliğe gerilip yazıları alt satıra kırıldı
           ("15 / gün"). Genişlik yazının kendisi kadar olmalı; sığmazsa
           şerit yana kayar, satır atlamaz. */
        /* Pencere seçici: bugün 375 px telefonda TAM SINIRDA duruyor (343/343).
           Taşmıyor — ama yana kayma + gizli kaydırma çubuğu bırakılsaydı,
           telefonun yazı boyu ayarı büyüdüğünde ya da beşinci bir pencere
           eklendiğinde "Tüm zamanlar" sessizce erişilemez olurdu. Sekme
           şeridinde 22 Ağu'da düzeltilen kusurun aynısı. Satıra inmek
           görünümü bugün DEĞİŞTİRMİYOR (sığdığı için hiç sarmıyor), yalnız
           sessiz kırılmayı imkânsız kılıyor. */
        .od-top-gelgit .ay-pencere {
            grid-column: 1 / -1; margin: 11px 0 0; flex-wrap: wrap;
        }
        .od-top-gelgit .ay-pencere button { flex: 0 0 auto; white-space: nowrap; }
        /* Geri: 44 px dokunma alanı, içinde ince bir ok. */
        .gg-geri {
            width: 44px; height: 44px; border-radius: 50%; cursor: pointer;
            display: flex; align-items: center; justify-content: center;
            background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.1);
            color: #a9bcd4; font-family: inherit; font-size: 20px; line-height: 1;
            padding: 0 2px 3px 0;   /* "‹" karakteri optik olarak yukarı-sağa kaçıyor */
        }
        .gg-geri:hover { background: rgba(79,172,254,0.14); color: #dceaff; }

        .ay-pencere { display: flex; gap: 6px; flex-wrap: wrap; margin: 2px 0 12px; }
        .ay-pencere button {
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border);
            color: #93a3bd; border-radius: 999px; padding: 6px 13px; cursor: pointer;
            font-family: inherit; font-size: 12px;
        }
        .ay-pencere button.sec {
            background: rgba(79,172,254,0.14); border-color: rgba(79,172,254,0.5); color: #d6ecff; font-weight: 600;
        }
        .ay-izgara { display: grid; gap: 10px; }
        @media (min-width: 620px) { .ay-izgara { grid-template-columns: 1fr 1fr; } }
        .ay-kart {
            position: relative; overflow: hidden; display: flex; flex-direction: column; gap: 7px;
            background: rgba(18,27,45,0.55); border: 1px solid rgba(255,255,255,0.075);
            border-radius: 16px; padding: 14px 15px 15px;
        }
        .ay-kart::after {
            content: ""; position: absolute; inset: 0 0 auto 0; height: 1px;
            background: linear-gradient(90deg, transparent, rgba(212,175,106,0.35), transparent);
        }
        .ay-kart.kilit { border-style: dashed; border-color: rgba(255,255,255,0.13); background: rgba(18,27,45,0.32); }
        .ay-bas { display: flex; align-items: center; gap: 9px; color: #ffd97a; }
        .ay-kart.kilit .ay-bas { color: #9aa8c0; }
        .ay-bas svg { width: 20px; height: 20px; flex: 0 0 auto; }
        .ay-bas h4 { margin: 0; font-size: 14px; font-weight: 600; }
        .ay-oku { font-size: 19px; font-weight: 600; color: #e6ecf7; line-height: 1.15; font-variant-numeric: tabular-nums; }
        .ay-oku small { font-size: 12px; color: #8ea0bd; font-weight: 400; margin-left: 6px; }
        .ay-kart p { margin: 0; font-size: 12.5px; color: #8ea0bd; line-height: 1.5; }
        .ay-kart p b { color: #dbe4f2; font-weight: 600; }
        .ay-kiyas {
            font-size: 11.5px; color: #5d6b86; font-variant-numeric: tabular-nums;
            border-top: 1px dashed rgba(255,255,255,0.07); padding-top: 7px; margin-top: auto;
        }
        .ay-rozet {
            align-self: flex-start; font-size: 10.5px; letter-spacing: 1px; text-transform: uppercase;
            color: #6c7b96; border: 1px solid rgba(255,255,255,0.12); border-radius: 999px; padding: 3px 8px;
        }
        .ay-satir {
            display: flex; justify-content: space-between; gap: 10px; font-size: 12.5px;
            padding: 5px 0; border-bottom: 1px dashed rgba(255,255,255,0.06); color: #b6c4da;
        }
        .ay-satir:last-child { border-bottom: none; }
        .ay-satir b { color: #e6ecf7; font-variant-numeric: tabular-nums; }
        /* ═══ GELGİT (22 Ağu 2026) — aynanın kardeşi, iki kart ═══════════
           Pencere şeridi ve kilit kartı aynanın sınıflarını paylaşıyor
           (.ay-pencere / .ay-kart.kilit): iki ekran tek dilden konuşsun.
           Buradakiler yalnız Gelgit'e özgü olanlar. */
        .gg-uyari {
            display: flex; gap: 11px; align-items: flex-start; padding: 12px 14px;
            border-radius: 14px; margin-bottom: 10px;
            background: linear-gradient(135deg, rgba(255,217,122,0.09), rgba(79,172,254,0.05));
            border: 1px solid rgba(255,217,122,0.28);
        }
        .gg-uyari svg { width: 22px; height: 22px; flex: none; color: #ffd97a; margin-top: 1px; }
        .gg-uyari p { margin: 0; font-size: 12px; color: #c6d2e4; line-height: 1.6; }
        .gg-uyari p b { color: #ffd97a; }
        .gg-kart {
            position: relative; overflow: hidden;
            background: rgba(18,27,45,0.55); border: 1px solid rgba(255,255,255,0.075);
            border-radius: 16px; padding: 14px 16px 12px; margin-bottom: 10px;
        }
        .gg-ust { font-size: 12px; color: #8ea0bd; line-height: 1.5; }
        .gg-ust b { color: #dbe4f2; }
        /* Terazi: ortada kendi ortalaması, iki yanda kartların puanı. */
        .gg-terazi { position: relative; height: 56px; margin: 14px 4px 6px; }
        .gg-cizgi {
            position: absolute; left: 0; right: 0; top: 26px; height: 3px; border-radius: 2px;
            background: linear-gradient(90deg, rgba(79,172,254,0.5), rgba(255,255,255,0.12) 50%, rgba(255,217,122,0.6));
        }
        .gg-mrk { position: absolute; left: 50%; top: 16px; width: 2px; height: 23px; background: rgba(255,255,255,0.45); }
        .gg-mrkyazi {
            position: absolute; left: 50%; top: 43px; transform: translateX(-50%);
            font-size: 10px; color: #8ea0bd; white-space: nowrap;
        }
        .gg-pin { position: absolute; top: 19px; transform: translateX(-50%); text-align: center; }
        .gg-pin i { display: block; width: 15px; height: 15px; border-radius: 50%; margin: 0 auto; }
        .gg-pin b { display: block; font-size: 12px; font-weight: 700; margin-top: -36px; font-variant-numeric: tabular-nums; }
        .gg-pin small { display: block; font-size: 9px; color: #5d6b86; margin-top: 20px; white-space: nowrap; }
        .gg-olculer { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 14px; }
        .gg-op {
            flex: 1; min-width: 100px; padding: 7px 8px; border-radius: 10px; text-align: center;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.07);
        }
        .gg-oa { font-size: 9px; color: #5d6b86; text-transform: uppercase; letter-spacing: 0.4px; }
        .gg-od { font-size: 13px; font-weight: 700; color: #dbe4f2; font-variant-numeric: tabular-nums; margin-top: 2px; }
        .gg-kb { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
        .gg-kb svg { width: 40px; height: 24px; flex: none; }
        .gg-kb h4 { margin: 0; font-size: 13.5px; font-weight: 700; }
        .gg-rz {
            margin-left: auto; font-size: 11px; font-weight: 700; padding: 3px 10px;
            border-radius: 999px; background: rgba(255,255,255,0.05); font-variant-numeric: tabular-nums;
        }
        .gg-kalt { font-size: 11px; color: #5d6b86; margin: 0 0 4px; }
        .gg-bolum {
            font-size: 9px; letter-spacing: 0.9px; text-transform: uppercase;
            color: #5d6b86; margin: 11px 0 5px;
        }
        .gg-cips { display: flex; flex-wrap: wrap; gap: 5px; }
        .gg-cip {
            font-size: 11.5px; padding: 4px 10px; border-radius: 999px; color: #ffe4b0;
            border: 1px solid rgba(212,175,106,0.4); background: rgba(212,175,106,0.07);
        }
        .gg-cip.ders { color: #a9bdd9; border-color: rgba(79,172,254,0.3); background: rgba(79,172,254,0.06); }
        .gg-cip i { font-style: normal; font-size: 9px; color: #5d6b86; margin-left: 4px; }
        .gg-os { display: flex; align-items: center; gap: 9px; padding: 3px 0; }
        .gg-oa2 { width: 78px; flex: none; font-size: 11px; color: #a9bdd9; }
        .gg-ob { flex: 1; height: 13px; position: relative; max-width: 180px; }
        .gg-ray { position: absolute; left: 0; right: 0; top: 6px; height: 2.5px; border-radius: 2px; background: rgba(255,255,255,0.08); }
        .gg-rt { position: absolute; top: 2px; width: 1.5px; height: 10px; background: rgba(255,255,255,0.4); }
        .gg-nk { position: absolute; top: 3px; width: 8px; height: 8px; border-radius: 50%; transform: translateX(-50%); }
        .gg-od2 { flex: 1; font-size: 10.5px; color: #8ea0bd; font-variant-numeric: tabular-nums; }
        .gg-od2 b { font-size: 11.5px; }
        .gg-gunler { display: flex; gap: 4px; flex-wrap: wrap; }
        .gg-gg {
            padding: 4px 9px; border-radius: 8px; font-size: 10.5px; color: #8ea0bd;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.06);
        }
        .gg-gg b { color: #dbe4f2; }
        .gg-gg.one { border-color: rgba(255,217,122,0.5); color: #ffd97a; background: rgba(255,217,122,0.07); }
        .gg-gg.one b { color: #ffd97a; }
        /* Boş bölüm yerine SEBEBİ yazılır — bu satır o sebebin yeri. */
        .gg-yok { font-size: 10.5px; color: #4a586f; font-style: italic; line-height: 1.5; }
        .gg-dip {
            font-size: 10.5px; color: #5d6b86; line-height: 1.7;
            padding: 10px 2px 4px; border-top: 1px dashed rgba(255,255,255,0.07);
        }

        .ay-kusak { display: flex; align-items: flex-end; gap: 3px; height: 46px; margin-top: 2px; }
        .ay-kusak i {
            flex: 1; display: block; border-radius: 2px 2px 0 0;
            background: linear-gradient(180deg, rgba(79,172,254,0.75), rgba(79,172,254,0.18));
        }
        .ay-kusak i.tepe { background: linear-gradient(180deg, #ffd97a, rgba(212,175,106,0.25)); }
        .ay-kusak-et {
            display: flex; justify-content: space-between; font-size: 10.5px; color: #5d6b86;
            font-variant-numeric: tabular-nums; margin-top: 3px;
        }

        .gc-davet { text-align: center; color: #8fa3bd; font-size: 12.5px;
            padding: 18px 14px; border: 1px dashed rgba(255,255,255,0.15);
            border-radius: 14px; background: rgba(255,255,255,0.02); line-height: 1.6; }
        .gc-davet b { color: #cbd5e1; }

        /* YIL KARNESİ (M1 tacı): "Senin Gökyüzün". Altın daima IŞIK, asla
           yaldız; su yolu bordürü YALNIZ bu çerçevede — her karta yayılıp
           değerini eritmez. Kıyas yok: iki gökyüzü yan yana konmaz. */
        .gc-karne { border-radius: 18px; overflow: hidden; margin-bottom: 10px;
            background: linear-gradient(180deg, #0b1226 0%, #090d1c 60%, #0b1020 100%);
            border: 1px solid rgba(212,175,106,0.45);
            box-shadow: inset 0 0 40px rgba(20,30,70,0.35);
            padding: 12px 12px 10px; }
        .gc-suyolu { display: block; width: 100%; height: 14px; opacity: 0.85; }
        .gc-suyolu.ters { transform: scaleY(-1); }
        .gc-karne .ic { padding: 6px 4px; }
        .gc-karne .bas { text-align: center; margin-bottom: 8px; }
        .gc-karne .bas .ad { font-size: 19px; font-weight: 800; color: #e8d5a8; }
        .gc-karne .bas .alt { font-size: 11.5px; color: #8fa3bd; margin-top: 2px;
            font-variant-numeric: tabular-nums; }
        #gc-gok { display: block; width: 100%; border-radius: 10px; margin-bottom: 10px; }
        .gc-karne .satirlar { font-size: 12.5px; color: #c7d2e4; }
        .gc-karne .satirlar .s { display: flex; justify-content: space-between; gap: 10px;
            padding: 6px 2px; border-bottom: 1px solid rgba(212,175,106,0.12); }
        .gc-karne .satirlar .s:last-child { border-bottom: 0; }
        .gc-karne .satirlar .s span:last-child { font-weight: 700; color: white;
            font-variant-numeric: tabular-nums; text-align: right; }
        .gc-karne .muhur { text-align: center; margin-top: 10px; }
        .gc-karne .muhur .m { font-size: 11px; color: #8fa3bd; margin-top: 4px; }
        .gc-karne .od-tiles { margin: 0 0 10px; }

        /* SEKME ÇUBUĞU (M1 sayfalı düzen): her sayfanın kendi işareti.
           Seçili sekme turkuaz ışıkla belirir — buton kalabalığı değil,
           defter ayracı.

           🔴 22 AĞU — YANA KAYMA SÖKÜLDÜ, ŞERİT ARTIK SATIRA İNİYOR.
           Eskiden tek satırda yana kayıyordu ve kaydırma çubuğu BİLEREK
           gizliydi (`scrollbar-width: none`). Telefonda parmakla itilebildiği
           için sorun görünmüyordu; masaüstünde kutu 560 pikselle sınırlı,
           yedi sekme ~710 piksel yer istiyor ve fareyle kaydırmanın HİÇBİR
           yolu yok — "Aynan" ve "Kendi dönemin" ekranın sağında kalıp
           erişilemez oluyordu. Yani sayfa vardı, kapısı yoktu.

           Çözüm kaydırmayı iyileştirmek değil, taşmayı bitirmek: satır
           dolunca alta iner. Hiçbir sekme gizlenmez, iki cihazda da aynı
           davranır, tek satır JavaScript gerekmez. */
        .gc-tabs { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }
        /* Öbek kesmesi (3 Eyl): manzara sekmeleriyle zaman sekmeleri aynı
           satıra karışmasın. Görünmez — yalnız satırı bitirir, yer kaplamaz. */
        .gc-tab-ara { flex-basis: 100%; height: 0; margin: -3px 0; }
        .gc-tab { display: flex; align-items: center; gap: 5px; flex: none;
            font: inherit; font-size: 11px; font-weight: 700; letter-spacing: 0.2px;
            color: #8fa3bd; background: rgba(255,255,255,0.04);
            border: 1px solid var(--glass-border); border-radius: 20px;
            padding: 6px 10px; cursor: pointer; white-space: nowrap;
            transition: color 0.2s ease, border-color 0.2s ease, background 0.2s ease; }
        .gc-tab svg { width: 14px; height: 14px; flex: none; }
        .gc-tab.sec { color: white; border-color: rgba(0,242,254,0.45);
            background: rgba(0,242,254,0.08);
            box-shadow: 0 0 12px rgba(0,242,254,0.12); }
        .gc-tab.sec svg { color: var(--success); }
        .gc-tab:focus-visible { outline: 2px solid rgba(0,242,254,0.6); outline-offset: 1px; }

        /* Günü bitir: sağ üst köşede sade yuvarlak ikon (isme değmesin diye sadece moon) */
        #btn-day-end {
            position: fixed; top: calc(20px + env(safe-area-inset-top, 0px)); right: 14px; z-index: 96; width: 40px; height: 40px; flex: none;
            align-items: center; justify-content: center; gap: 0; padding: 0; border-radius: 50%; cursor: pointer;
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); color: #cbd5e1;
            backdrop-filter: blur(10px); transition: background 0.2s ease, color 0.2s ease;
        }
        #btn-day-end:not(:disabled):hover { background: rgba(255,255,255,0.12); transform: none; box-shadow: none; }
        #btn-day-end svg { color: #ffd54f; flex: none; }
        #btn-day-end span { display: none; }
        @media (min-width: 768px) { #btn-day-end { top: calc(22px + env(safe-area-inset-top, 0px)); right: 18px; width: 44px; height: 44px; } }
        /* Selamlama üst köşedeki butona değmesin */
        #greeting { padding: 0 48px; }

        /* HESAP (cihazlar + çıkış) — "günü bitir"in sol üstteki ikizi (denetim 4.4).
           Alt bar dolu (4 sekme); ortak bilgisayarda çıkış menü kazmayı değil
           görünür bir düğmeyi hak ediyor. */
        #btn-hesap {
            position: fixed; top: calc(20px + env(safe-area-inset-top, 0px)); left: 14px; z-index: 96; width: 40px; height: 40px;
            display: flex; align-items: center; justify-content: center; padding: 0;
            border-radius: 50%; cursor: pointer;
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); color: #cbd5e1;
            backdrop-filter: blur(10px); transition: background 0.2s ease;
        }
        #btn-hesap:hover { background: rgba(255,255,255,0.12); }
        @media (min-width: 768px) { #btn-hesap { top: calc(22px + env(safe-area-inset-top, 0px)); left: 18px; width: 44px; height: 44px; } }

        /* ═══ GÜN HÂLİ İKONU — hesabın yanındaki ikiz (8 Ağu 2026) ═══
           Alt bar dolu (6 düğme); yeni bir sekme eklemek yerine üst köşedeki
           ikinci küçük kapı. Odak ürünüyüz: sönük durur, çalışırken gizlenir. */
        /* Hesabın YANINA değil ALTINA: selamlama satırı üst köşedeki 48px'lik
           boşluğa göre ayarlı; yana ikinci düğme koymak "Hoş geldin, X" yazısının
           üstüne biner. Dikey ikili hem çakışmaz hem aynı köşeyi paylaşır. */
        #btn-gunhali {
            position: fixed; top: calc(66px + env(safe-area-inset-top, 0px)); left: 14px; z-index: 96; width: 40px; height: 40px;
            display: flex; align-items: center; justify-content: center; padding: 0;
            border-radius: 50%; cursor: pointer;
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); color: #cbd5e1;
            backdrop-filter: blur(10px); transition: background 0.2s ease;
        }
        #btn-gunhali:hover { background: rgba(255,255,255,0.12); }
        /* Bugün hiç işaretlenmediyse yanan bekleme noktası — uyarı değil, hatırlatma. */
        #gunhali-nokta {
            position: absolute; top: 6px; right: 6px; width: 7px; height: 7px; border-radius: 50%;
            background: #ffc107; box-shadow: 0 0 8px rgba(255,193,7,0.8);
        }
        /* ⚠️ `hidden` işareti KİMLİK seçicisine yenilir: tarayıcının
           [hidden]{display:none} kuralı bu bloktaki display:flex'in altında
           kalıyor. Pilot kapısı ikonu hidden ile kapatıyor — bu satır olmazsa
           kapı "kapalı" sanılır ama ikon ekranda DURUR (9 Ağu'da yakalandı). */
        #btn-gunhali[hidden] { display: none !important; }
        .container.focus-layout #btn-gunhali { display: none !important; }
        @media (min-width: 768px) { #btn-gunhali { top: calc(74px + env(safe-area-inset-top, 0px)); left: 18px; width: 44px; height: 44px; } }

        /* ── SAYAÇ AYARI İKONU (15 Ağu) ─────────────────────────────────
           ⚠️ 3 Eyl (ekran denetimi + kullanıcı): SOLDAN SAĞA taşındı.
           Sol köşede üç yuvarlak alt alta diziliyor, sağ köşede tek bir ay
           duruyordu; karşılama yazısı ortada sıkışıyordu. Üstelik soldaki
           üçü aynı aileden değildi — hesap bir kimlik kapısı, gün hâli
           günlük bir soru, sayaç ayarı ise bloğun ayarı.
           Yeni düzen iki-iki: SOLDA "sen"le ilgili olanlar (hesabın, bugünkü
           hâlin), SAĞDA ayarlar (günü bitir · sayaç ayarı). Aynı boy, aynı
           cam, aynı sükûnet — yalnız yeri değişti. */
        #btn-sayac-ayar {
            position: fixed; top: calc(66px + env(safe-area-inset-top, 0px)); right: 14px; z-index: 96; width: 40px; height: 40px;
            display: flex; align-items: center; justify-content: center; padding: 0;
            border-radius: 50%; cursor: pointer;
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); color: #cbd5e1;
            backdrop-filter: blur(10px); transition: background 0.2s ease, border-color 0.2s ease;
        }
        #btn-sayac-ayar:hover { background: rgba(255,255,255,0.12); }
        #btn-sayac-ayar[hidden] { display: none !important; }
        .container.focus-layout #btn-sayac-ayar { display: none !important; }
        /* Analizde ritim/süre ayarı yok — ikon da yok. (Aynı anda "günü bitir"
           de gizleniyor; sağ sütun boş kalıyor, boş yuva kalmıyor.) */
        .container.analiz-secili #btn-sayac-ayar { display: none !important; }
        @media (min-width: 768px) { #btn-sayac-ayar { top: calc(74px + env(safe-area-inset-top, 0px)); right: 18px; width: 44px; height: 44px; } }
        /* 🔑 Artık sağ sütunda ve "günü bitir"in altında: gün hâlinin açık ya
           da kapalı olması yerini DEĞİŞTİRMEZ (eski kardeş seçicisi kalktı).
           "Günü bitir" gizliyken bile yuva sabit — ikon zıplamaz. */
        /* Bir ayar açıkken ikon kendini belli eder: çerçevesi mavileşir ve
           köşesinde nokta yanar. Satır kalktığı için öğrencinin "ritmim var mı?"
           sorusunun tek cevabı bu — bekçisi olmayan özellik olmasın. */
        #btn-sayac-ayar.sa-acik { border-color: rgba(79,172,254,0.55); color: #dcebfa; }
        #sayac-ayar-nokta {
            position: absolute; top: 6px; right: 6px; width: 7px; height: 7px; border-radius: 50%;
            background: #4facfe; box-shadow: 0 0 8px rgba(79,172,254,0.8);
        }
        #sayac-ayar-nokta[hidden] { display: none; }

        /* ── SAYAÇ AYARI PANELİ ─────────────────────────────────────────────
              Dokunmatik ölçüler: her düğme en az 44 px. Sayı klavyeyle değil
              − / + ile değişiyor (kullanıcı kararı 15 Ağu). */
        /* Panel kendi içinde kayar: başlık üstte, Tamam altta sabit (22 Ağu).
           "Kendim" tempo + devir hedefi birlikte açıkken içerik telefon
           ekranını aşıyor ve Tamam düğmesi görünmez oluyordu. */
        #sayac-ayar .sa-kutu {
            max-width: 396px; text-align: left; padding: 18px 18px 18px;
            display: flex; flex-direction: column;
            max-height: calc(100vh - 40px); max-height: calc(100dvh - 40px);
        }
        #sayac-ayar .sa-govde {
            flex: 1 1 auto; min-height: 0; overflow-y: auto;
            /* Kayan alanın kenarı kutunun dolgusuna değmesin. */
            margin-right: -6px; padding-right: 6px;
            /* Alt kenarda soluklaşma: "aşağıda devamı var" demenin sessiz yolu.
               Kaydırma bitince gölge de biter (background-attachment: local). */
            background:
                linear-gradient(#1e293b 30%, rgba(30,41,59,0)) top / 100% 22px no-repeat local,
                linear-gradient(rgba(30,41,59,0), #1e293b 70%) bottom / 100% 22px no-repeat local,
                radial-gradient(farthest-side at 50% 0, rgba(0,0,0,0.35), rgba(0,0,0,0)) top / 100% 12px no-repeat scroll,
                radial-gradient(farthest-side at 50% 100%, rgba(0,0,0,0.35), rgba(0,0,0,0)) bottom / 100% 12px no-repeat scroll;
        }
        /* BAŞLIK — ikon + iki satır (22 Ağu). "Sayaç ayarı" teknik bir menü
           gibi okunuyordu; burası öğrencinin KENDİ ritmini kurduğu yer. */
        .sa-baslik {
            display: flex; align-items: flex-start; gap: 11px;
            padding-bottom: 14px; margin-bottom: 16px;
            border-bottom: 1px solid rgba(255,255,255,0.08);
        }
        .sa-bas-sim { flex: 0 0 auto; color: #ffd97a; opacity: 0.92; margin-top: 1px; }
        .sa-bas-sim svg { width: 26px; height: 26px; display: block; }
        .sa-bas-yazi { flex: 1 1 auto; min-width: 0; }
        .sa-bas-yazi b {
            display: block; font-size: 1.04em; font-weight: 700; color: #ffd97a; letter-spacing: 0.2px;
        }
        .sa-bas-yazi small {
            display: block; margin-top: 3px; font-size: 0.75em; color: #8595b0; line-height: 1.45;
        }
        .sa-baslik button {
            flex: 0 0 auto; background: none; border: none; color: #64748b; font-size: 1.05em;
            cursor: pointer; padding: 2px 4px; line-height: 1; align-self: center;
        }
        .sa-baslik button:hover { color: #cbd5e1; }
        .sa-bolum { margin-bottom: 14px; }
        .sa-bolum[hidden] { display: none; }

        /* ══ KATLANIR SATIRLAR (22 Ağu, kullanıcı kararı) ══════════════════════
           Bölümler alt alta akınca ekran kalabalık okunuyordu. Artık her ayar
           bir satır: solda adı ve tek kelimelik hâli, sağda o anki değeri.
           Kapalıyken satır 50 px; panelin tamamı her ekrana rahat sığıyor. */
        .sa-satirlar { display: flex; flex-direction: column; gap: 7px; }
        .sa-satir {
            border-radius: 13px; background: rgba(255,255,255,0.035);
            border: 1px solid rgba(255,255,255,0.075);
            transition: background 0.18s ease, border-color 0.18s ease;
        }
        .sa-satir[hidden] { display: none; }
        .sa-satir.acik {
            background: rgba(79,172,254,0.09); border-color: rgba(79,172,254,0.3);
        }
        .sa-satir-bas {
            display: flex; align-items: center; gap: 10px; width: 100%;
            min-height: 50px; padding: 8px 12px; border: none; background: none;
            border-radius: 13px; cursor: pointer; text-align: left;
            color: inherit; font-family: inherit; font-size: 1em;
        }
        .sa-satir-ad {
            flex: 1 1 auto; min-width: 0; font-size: 0.86em; color: #c4d2e4; line-height: 1.25;
        }
        .sa-satir-ad small {
            display: block; font-size: 0.78em; color: #7f8ea3; margin-top: 1px;
        }
        .sa-satir-ad small:empty { display: none; }
        .sa-satir-deg {
            flex: 0 0 auto; font-size: 0.87em; font-weight: 600; color: #dcebfa;
            font-variant-numeric: tabular-nums; white-space: nowrap;
        }
        /* Ok, açık satırda aşağı döner — "burası açıldı" demenin sessiz yolu.
           Kyron kuralı: hareket yalnız eşikte, bu bir eşiktir. */
        .sa-satir-ok {
            flex: 0 0 auto; width: 9px; height: 9px; margin-left: 2px;
            border-right: 1.7px solid #55637d; border-bottom: 1.7px solid #55637d;
            transform: rotate(-45deg); transition: transform 0.18s ease, border-color 0.18s ease;
        }
        .sa-satir.acik .sa-satir-ok {
            transform: rotate(45deg) translate(-2px, -2px); border-color: #8fc7ff;
        }
        @media (prefers-reduced-motion: reduce) {
            .sa-satir, .sa-satir-ok { transition: none; }
        }
        .sa-satir-ic { padding: 0 12px 12px; }
        .sa-satir-ic[hidden] { display: none; }
        /* Satırın içindeki ilk sayaç başlığa yapışmasın. */
        .sa-satir-ic > .sa-sayac:first-child { margin-top: 0; }
        .sa-yz {
            font-size: 0.66em; font-weight: 700; letter-spacing: 1.1px; text-transform: uppercase;
            color: #6c7b96; margin-bottom: 8px;
        }
        .sa-yz-ara { margin-top: 16px; }
        .sa-secenekler { display: flex; gap: 6px; flex-wrap: wrap; }
        .sa-sec {
            flex: 1 1 auto; min-width: 72px; min-height: 44px; padding: 10px 10px;
            border-radius: 12px; cursor: pointer;
            background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.14);
            color: #94a3b8; font-family: inherit; font-size: 0.9em; font-weight: 600;
            font-variant-numeric: tabular-nums;
            transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
        }
        .sa-sec[aria-pressed="true"] {
            background: rgba(79,172,254,0.18); border-color: rgba(79,172,254,0.55); color: #dcebfa;
        }

        /* İKİ SATIRLI SEÇENEK KARTLARI — ad + ne olduğu (22 Ağu).
           "25/5" tek başına kimseye bir şey söylemiyordu; altındaki kelime
           öğrencinin seçimi denemeden anlamasını sağlıyor. */
        .sa-kipler .sa-sec, .sa-tempolar .sa-sec {
            display: flex; flex-direction: column; align-items: center; justify-content: center;
            gap: 2px; min-height: 54px; padding: 8px 6px;
        }
        .sa-kipler .sa-sec b, .sa-tempolar .sa-sec b {
            font-size: 0.97em; font-weight: 700; line-height: 1.1;
        }
        .sa-kipler .sa-sec small, .sa-tempolar .sa-sec small {
            font-size: 0.68em; font-weight: 500; opacity: 0.72; line-height: 1.1; letter-spacing: 0.1px;
        }
        .sa-tempolar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 6px; }
        .sa-tempolar .sa-sec { min-width: 0; }
        /* Dört tempo TELEFONDA DA tek sıra (22 Ağu). Eşik 400 px'ti; sıradan
           bir telefonda ikinci sıraya düşüyor ve panele bedava 58 px ekliyordu.
           314 px'lik panelde dört kutu 74 px eder — "50/10" ve altındaki
           kelime rahat sığıyor. Yalnız gerçekten dar ekranda ikiye iner. */
        @media (max-width: 330px) {
            .sa-tempolar { grid-template-columns: repeat(2, 1fr); }
        }
        .sa-sec-duz { min-height: 44px; }
        /* Altı ton iki sütun: dört tempo kutusuyla aynı ölçü ailesinde kalsın. */
        .sa-ses-tonlar { display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px; }
        .sa-ses-tonlar .sa-sec { min-width: 0; min-height: 44px; font-size: 0.84em; }
        /* Açıklama satırı: seçilenin ne yapacağını tek cümleyle söyler. */
        .sa-not { font-size: 0.75em; color: #7f8ea3; margin-top: 7px; line-height: 1.42; }

        /* Artı/eksi sayaç: büyük rakam ortada, iki yanında dokunmatik düğmeler. */
        .sa-sayac {
            display: flex; align-items: center; gap: 10px; margin-top: 10px;
            background: rgba(255,255,255,0.04); border: 1px solid rgba(255,255,255,0.1);
            border-radius: 14px; padding: 8px;
        }
        .sa-adim {
            flex: 0 0 auto; width: 46px; height: 46px; border-radius: 12px; cursor: pointer;
            background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.14);
            color: #cbd5e1; font-family: inherit; font-size: 1.4em; font-weight: 600; line-height: 1;
            transition: background 0.15s ease, color 0.15s ease;
        }
        .sa-adim:hover { background: rgba(79,172,254,0.16); color: #dcebfa; }
        /* Sınıra dayanınca düğme söner — "daha fazlası yok" der, hata vermez. */
        .sa-adim:disabled { opacity: 0.3; cursor: default; background: rgba(255,255,255,0.04); }
        .sa-deger { flex: 1 1 auto; text-align: center; line-height: 1.15; }
        .sa-deger b {
            display: block; font-size: 1.7em; font-weight: 700; color: #e2e8f0;
            font-variant-numeric: tabular-nums;
        }
        .sa-deger span { font-size: 0.72em; color: #7f8ea3; }

        /* ÖZET ŞERİDİ — panelin cevabı (22 Ağu). Gelgit kapısıyla aynı dil
           (mavi→altın), ama dokunulmaz: yalnız hesabı gösterir. */
        .sa-ozet {
            display: flex; align-items: center; gap: 12px;
            margin: 0 0 16px; padding: 11px 14px; border-radius: 14px;
            background: linear-gradient(135deg, rgba(79,172,254,0.11), rgba(212,175,106,0.07));
            border: 1px solid rgba(79,172,254,0.2);
        }
        .sa-ozet[hidden] { display: none; }
        .sa-ozet-sol { flex: 0 0 auto; line-height: 1.15; }
        .sa-ozet-et {
            display: block; font-size: 0.6em; font-weight: 700; letter-spacing: 1px;
            text-transform: uppercase; color: #7f90ab;
        }
        .sa-ozet-sol b {
            display: block; margin-top: 2px; font-size: 1.32em; font-weight: 700;
            color: #ffd97a; font-variant-numeric: tabular-nums; white-space: nowrap;
        }
        .sa-ozet-sag {
            flex: 1 1 auto; min-width: 0; font-size: 0.75em; color: #a4b6cf; line-height: 1.5;
            border-left: 1px solid rgba(255,255,255,0.1); padding-left: 12px;
        }
        /* Sayı ile birimi ayrı satıra düşmesin ("30 / dk mola" okunmaz olur). */
        .sa-ozet-sag i { font-style: normal; color: #dceaff; font-weight: 600; white-space: nowrap; }

        /* ── ZAMAN ŞERİDİ — ritmin gösterimi (22 Ağu akşamı) ─────────────────
           Aynı kap, başka yüz: burada akşamın kendisi çizilir. Şeridin dili
           kadranınkiyle aynı (mavi = çalışma); mola BOŞLUK DEĞİL, taralı —
           mola da günün bir parçası, ama çalışma değil. */
        .sa-ozet-serit { display: block; }
        /* ═══ ŞERİT YENİLENDİ (25 Ağu, kullanıcı: "çok amatör görünüyor") ═══
           Eski hâli tek parça, keskin köşeli, üstünde sert mavi bir çizgi
           olan bir kutuydu; molalar 45° taralı bir doku. Yakından bakınca
           "çizim" gibi değil "tablo" gibi duruyordu.
           Yeni hâli: her blok KENDİ yuvarlak hapı, aralarında gerçek boşluk;
           mola artık desen değil, iki hap arasındaki NEFES (ince altın nokta).
           Böylece şerit bir akşamın ritmini anlatan bir tesbihe benziyor —
           ürünün dili (sükûnet, sembol) buraya da geliyor. */
        .sa-serit {
            display: flex; align-items: stretch; gap: 0; height: 40px;
            padding: 3px; border-radius: 13px;
            background: rgba(255,255,255,0.035);
            border: 1px solid rgba(255,255,255,0.055);
        }
        .sa-serit i {
            font-style: normal; display: flex; align-items: center; justify-content: center;
            min-width: 0; overflow: hidden;
            /* flex-basis SIFIR olmalı: aksi hâlde blokların içindeki rakam
               genişliğe karışır ve mola payı olduğundan dar çıkar (22 Ağu
               provasında ölçüldü: 12px yerine 14,6px olmalıydı). Genişliği
               yalnız süre belirlesin. */
            flex-basis: 0; flex-shrink: 1;
        }
        .sa-sr-is {
            border-radius: 9px;
            background: linear-gradient(180deg, rgba(79,172,254,0.34), rgba(79,172,254,0.15));
            box-shadow: inset 0 1px 0 rgba(160,215,255,.45), 0 1px 4px rgba(0,0,0,.22);
            font-size: 0.66em; color: #dcebfa; font-weight: 700; letter-spacing: .2px;
            font-variant-numeric: tabular-nums;
        }
        /* MOLA = NEFES. Desen yok; ortada tek bir altın nokta ve iki yanında
           boşluk. Mola günün bir parçası ama çalışma değil — sessiz duruyor. */
        .sa-sr-mola { position: relative; }
        .sa-sr-mola::after {
            content: ""; position: absolute; left: 50%; top: 50%;
            width: 3px; height: 3px; margin: -1.5px 0 0 -1.5px;
            border-radius: 50%; background: rgba(212,175,106,0.75);
        }
        /* Saat ekseni: üç nokta, üçü de şeridin gerçek yerine denk gelsin diye
           ızgarayla hizalanıyor (space-between ortayı tam ortaya koymuyor). */
        .sa-eksen {
            display: grid; grid-template-columns: 1fr 1fr 1fr; margin-top: 7px;
            font-size: 0.68em; color: #7f8ea3; font-variant-numeric: tabular-nums;
        }
        .sa-eksen span:nth-child(2) { text-align: center; }
        .sa-eksen span:nth-child(3) { text-align: right; }
        .sa-sr-alt {
            display: flex; align-items: baseline; justify-content: space-between; gap: 10px;
            margin-top: 11px; padding-top: 10px; border-top: 1px dashed rgba(255,255,255,0.13);
        }
        .sa-sr-alt b {
            font-size: 1.45em; font-weight: 700; color: #ffd97a;
            font-variant-numeric: tabular-nums; white-space: nowrap;
        }
        .sa-sr-alt span { font-size: 0.74em; color: #a4b6cf; text-align: right; line-height: 1.5; }
        .sa-sr-alt i { font-style: normal; color: #dceaff; font-weight: 600; white-space: nowrap; }

        /* ALTIN = İLERLET (7 Eyl): burası kaçak mavinin (#4facfe) en görünür
           yeriydi — paletimizde olmayan bir renk, üstelik "bunu yap"
           düğmesinde. Kaldırıldı; ölçü `dugme.css`ten geliyor. */
        .sa-tamam {
            flex: 0 0 auto;
            width: 100%; min-height: 46px; margin-top: 4px; border-radius: 14px; cursor: pointer;
            background: var(--ss-eylem-dolgu, rgba(212,175,106,.16));
            border: 1px solid var(--ss-eylem-cizgi, rgba(212,175,106,.48));
            color: var(--ss-eylem-yazi, #E8D5A8);
            font-family: inherit; font-size: 0.95em; font-weight: 700;
        }
        .sa-tamam:hover { background: var(--ss-eylem-dolgu-koyu, rgba(212,175,106,.26)); }

        /* "Kendim" iki sayacı YAN YANA — her ekranda (22 Ağu). Alt alta
           dizildiklerinde tek başlarına 118 px alıp paneli taşırıyorlardı;
           yan yana 58 px. Panel 396 px geniş, iki sayaca da yeter.
           ⚠️ `:not([hidden])` ŞART: kimlik seçicisi tarayıcının kendi
           `[hidden] { display:none }` kuralını yener ve GİZLİ bölümü açar.
           Provada tam bu oldu — panel bir anda 54 px büyüdü. */
        #sa-kendim-bolum:not([hidden]) {
            display: grid; grid-template-columns: 1fr 1fr; gap: 8px;
        }
        #sa-kendim-bolum .sa-sayac { margin-top: 7px; gap: 4px; padding: 5px 4px; }
        #sa-kendim-bolum .sa-deger b { font-size: 1.3em; }
        #sa-kendim-bolum .sa-deger span { font-size: 0.66em; line-height: 1.25; }

        /* ══ TELEFON: PANEL TEK EKRANA SIĞSIN (22 Ağu, kullanıcı bulgusu) ══
           Panel masaüstünde rahat duruyordu ama telefonda 253 px taşıyordu;
           öğrenci ayarı görmek için kaydırmak zorundaydı. Ölçüldü (390×660):
           içerik 691 px, görünen 438 px.

           Yaklaşım: hiçbir bilgi ATILMADI, hiçbir dokunma alanı 44 px'in
           altına inmedi. Kısılan şey yalnız BOŞLUK — bölüm araları, dolgular,
           satır yükseklikleri. Kısa ekranda (yatay telefon, klavye açık)
           ikinci kademe devreye girer.

           🔒 44 px kuralı: .sa-sec ve .sa-adim burada KÜÇÜLTÜLMEZ.

           ⚠️ KOŞUL HEM BOY HEM EN: önce yalnız boya bakıyordu ve uzun
           telefonda (390×844, adres çubuğu gizliyken) sıkıştırma HİÇ
           devreye girmiyordu — "Kendim" orada 128 px taşıyordu. Aranan
           şey "kısa ekran" değil "telefon"; genişlik onu daha doğru söylüyor. */
        @media (max-height: 780px), (max-width: 480px) {
            #sayac-ayar { padding: 12px; }
            #sayac-ayar .sa-kutu {
                padding: 14px 14px 14px;
                max-height: calc(100vh - 24px); max-height: calc(100dvh - 24px);
            }
            .sa-baslik { padding-bottom: 10px; margin-bottom: 10px; gap: 9px; }
            .sa-bas-sim svg { width: 22px; height: 22px; }
            .sa-bas-yazi b { font-size: 0.98em; }
            .sa-bas-yazi small { font-size: 0.72em; margin-top: 2px; }

            .sa-bolum { margin-bottom: 8px; }
            .sa-yz { margin-bottom: 6px; }
            .sa-not { margin-top: 5px; font-size: 0.73em; line-height: 1.36; }

            /* ⛔ 22 Ağu akşamı KALKAN KURALLAR: katlanır satırlardan önce
               telefonda iki açıklama "Kendim" açıkken gizleniyordu, yer
               yetmediği için. Artık açıklamalar zaten kapalı satırların
               içinde duruyor — gizlemeye gerek kalmadı, bilgi de kaybolmuyor.
               Kalabalığı yapıyı düzelterek çözmek, bilgi saklayarak
               çözmekten iyidir. */

            .sa-satirlar { gap: 6px; }
            .sa-satir-bas { min-height: 48px; padding: 7px 11px; }
            .sa-satir-ic { padding: 0 11px 11px; }

            .sa-kipler .sa-sec, .sa-tempolar .sa-sec { min-height: 46px; padding: 6px 4px; }
            .sa-kipler .sa-sec b, .sa-tempolar .sa-sec b { font-size: 0.9em; }
            .sa-kipler .sa-sec small, .sa-tempolar .sa-sec small { font-size: 0.64em; }

            .sa-sayac { margin-top: 7px; padding: 5px; gap: 8px; }
            .sa-adim { width: 44px; height: 44px; }
            .sa-deger b { font-size: 1.45em; }

            .sa-ozet { margin-bottom: 8px; padding: 9px 12px; }
            .sa-serit { height: 36px; }
            .sa-eksen { margin-top: 5px; font-size: 0.64em; }
            .sa-sr-alt { margin-top: 8px; padding-top: 8px; }
            .sa-sr-alt b { font-size: 1.3em; }

            .sa-tamam { min-height: 46px; margin-top: 0; }
        }
        /* İkinci kademe — kısa telefon (eski Android, 640 px sınıfı).
           Buradaki kısıntıların TAMAMI boşluktan: tek bir açıklama, tek bir
           düğme küçülmedi. 360×640'ta 38 px açık vardı, tam o kadar kazanıldı. */
        @media (max-height: 700px) {
            #sayac-ayar .sa-kutu { padding: 12px; }
            .sa-baslik { padding-bottom: 8px; margin-bottom: 8px; }
            .sa-bolum { margin-bottom: 6px; }
            .sa-yz { margin-bottom: 5px; }
            .sa-not { margin-top: 4px; }
            .sa-kipler .sa-sec, .sa-tempolar .sa-sec { min-height: 44px; }
            .sa-sayac { padding: 4px; margin-top: 6px; }
            .sa-ozet { padding: 8px 11px; margin-bottom: 6px; }
            .sa-serit { height: 32px; }
            .sa-eksen { margin-top: 4px; }
            .sa-sr-alt { margin-top: 6px; padding-top: 6px; }
            .sa-satirlar { gap: 5px; }
            .sa-satir-bas { min-height: 46px; padding: 6px 11px; }
        }
        /* Üçüncü kademe — çok kısa ekran (klavye açık, yatay telefon). */
        @media (max-height: 620px) {
            .sa-baslik small { display: none; }        /* başlığın kendisi kalır */
            .sa-kipler .sa-sec, .sa-tempolar .sa-sec { min-height: 44px; }
            .sa-serit { height: 30px; }
            .sa-satir-bas { min-height: 44px; }
        }

        /* Gün hâli kartı: dört satır tikleme + iki satır not. Tek dokunuş,
           kapat — çalışmayı bölmeme kuralının arayüz karşılığı. */
        #gunhali-modal .gh-satir { margin-bottom: 12px; }
        #gunhali-modal .gh-satir label {
            display: block; font-size: 0.64em; font-weight: 700; letter-spacing: 1.2px;
            color: #6c7b96; margin-bottom: 6px;
        }
        /* ═══ 10'LUK ÇUBUK (21 Ağu 2026, akşam cilası) ═══════════════════
           Üç basamaklı düğmelerin yerine. Çubuk BOŞ başlar: dokunulmadıkça
           sayı "—" ve gönderilmez. Dolgu `--dolu` değişkeninden akar (JS
           yazar) — tarayıcıların yerel ::-moz-range-progress / IE dolgusu
           birbirini tutmuyor, tek kaynak bu.
           Renk yargı DEĞİL, konum: düşükte mavi, yüksekte altın — aynanın
           dilinin aynısı. Eski .gh-secenekler kuralları aşağıda duruyor
           (eski önbellekten açılan sekme onlarsız bozuk görünürdü). */
        #gunhali-modal .gh-cubuk {
            --dolu: 0%;
            display: flex; align-items: center; gap: 13px;
            padding: 9px 12px; border-radius: 14px;
            background: rgba(255,255,255,0.02);
            border: 1px solid rgba(255,255,255,0.06);
            transition: border-color .2s, background .2s;
        }
        #gunhali-modal .gh-cubuk.dolu {
            background: rgba(79,172,254,0.05);
            border-color: rgba(79,172,254,0.22);
        }
        #gunhali-modal .gh-ray { position: relative; flex: 1; height: 26px; }
        /* Kademe işaretleri: 10 basamak olduğu görünsün, sayı okumaya gerek kalmasın. */
        #gunhali-modal .gh-tikler {
            position: absolute; left: 9px; right: 9px; top: 17px;
            display: flex; justify-content: space-between; pointer-events: none;
        }
        #gunhali-modal .gh-tikler i {
            width: 2px; height: 2px; border-radius: 50%;
            background: rgba(255,255,255,0.16); display: block;
        }
        #gunhali-modal .gh-cubuk.dolu .gh-tikler i { background: rgba(255,255,255,0.10); }
        #gunhali-modal .gh-cubuk input[type="range"] {
            position: relative; z-index: 1;
            -webkit-appearance: none; appearance: none;
            width: 100%; height: 26px; margin: 0; background: none; outline: none; cursor: pointer;
        }
        /* Ray — WebKit */
        #gunhali-modal .gh-cubuk input[type="range"]::-webkit-slider-runnable-track {
            height: 6px; border-radius: 3px; border: none;
            background:
                linear-gradient(90deg, #4facfe 0%, #7ecbff 45%, #ffd97a 100%)
                    left / var(--dolu) 100% no-repeat,
                rgba(255,255,255,0.09);
        }
        #gunhali-modal .gh-cubuk input[type="range"]::-webkit-slider-thumb {
            -webkit-appearance: none; appearance: none;
            width: 18px; height: 18px; border-radius: 50%; margin-top: -6px;
            background: #f2f7ff; border: 2px solid rgba(255,255,255,0.3);
            box-shadow: 0 1px 6px rgba(0,0,0,0.45); cursor: pointer;
            transition: transform .12s, border-color .2s, box-shadow .2s;
        }
        #gunhali-modal .gh-cubuk.dolu input[type="range"]::-webkit-slider-thumb {
            border-color: #fff; box-shadow: 0 0 0 5px rgba(79,172,254,0.16), 0 1px 8px rgba(0,0,0,0.5);
        }
        #gunhali-modal .gh-cubuk input[type="range"]:active::-webkit-slider-thumb { transform: scale(1.15); }
        /* Ray — Firefox */
        #gunhali-modal .gh-cubuk input[type="range"]::-moz-range-track {
            height: 6px; border-radius: 3px; border: none; background: rgba(255,255,255,0.09);
        }
        #gunhali-modal .gh-cubuk input[type="range"]::-moz-range-progress {
            height: 6px; border-radius: 3px;
            background: linear-gradient(90deg, #4facfe, #7ecbff 60%, #ffd97a);
        }
        #gunhali-modal .gh-cubuk:not(.dolu) input[type="range"]::-moz-range-progress { background: none; }
        #gunhali-modal .gh-cubuk input[type="range"]::-moz-range-thumb {
            width: 16px; height: 16px; border-radius: 50%;
            background: #f2f7ff; border: 2px solid rgba(255,255,255,0.3);
            box-shadow: 0 1px 6px rgba(0,0,0,0.45); cursor: pointer;
        }
        #gunhali-modal .gh-cubuk.dolu input[type="range"]::-moz-range-thumb { border-color: #fff; }
        /* Sayı rozeti — dokununca dolar, üstüne basınca temizlenir. */
        #gunhali-modal .gh-deger {
            width: 52px; flex: none; text-align: center; cursor: default;
            padding: 5px 0; border-radius: 10px;
            background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.07);
            font-size: 16px; font-weight: 700; color: #4a586f; font-variant-numeric: tabular-nums;
            transition: color .2s, border-color .2s, background .2s;
        }
        #gunhali-modal .gh-cubuk.dolu .gh-deger {
            color: #e6ecf7; cursor: pointer;
            background: rgba(79,172,254,0.08); border-color: rgba(79,172,254,0.3);
        }
        #gunhali-modal .gh-deger small { font-size: 10px; color: #5d6b86; font-weight: 400; }

        /* Duygu listesini düzenleme — uzun basış GÖRÜNMEZ bir yoldu (21 Ağu).
           Düzenle deyince kendi kelimelerinin üstünde ✕ çıkar. */
        #gunhali-modal .gh-duzenle {
            float: right; background: none; border: none; padding: 0; cursor: pointer;
            color: #8fa3bd; font-family: inherit; font-size: 11px; letter-spacing: 0; text-transform: none;
        }
        #gunhali-modal .gh-duzenle:hover { color: var(--primary); }
        #gunhali-modal .gh-duzenle.acik { color: var(--primary); font-weight: 600; }
        /* NİÇİN DOLDURUYORUM şeridi — perdenin en üstü (22 Ağu).
           Gelgit kapısıyla aynı dil (ay + dalga, mavi→altın), ama kapı DEĞİL:
           dokunulmaz, yalnız anlatır. */
        #gunhali-modal .gh-nicin {
            display: flex; align-items: flex-start; gap: 10px;
            margin: 0 0 15px; padding: 10px 12px; border-radius: 13px;
            background: linear-gradient(135deg, rgba(79,172,254,0.09), rgba(212,175,106,0.06));
            border: 1px solid rgba(79,172,254,0.16);
        }
        #gunhali-modal .gh-nicin-sim { flex: 0 0 auto; color: #ffd97a; opacity: 0.9; }
        #gunhali-modal .gh-nicin-sim svg { width: 26px; height: 26px; display: block; }
        #gunhali-modal .gh-nicin p {
            margin: 0; font-size: 0.79em; line-height: 1.55; color: #b7c7dd;
        }
        #gunhali-modal .gh-nicin b { color: #dceaff; font-weight: 600; }
        #gunhali-modal .gh-nicin span {
            display: block; margin-top: 5px; font-size: 0.94em; color: #7f90ab;
        }

        /* ✕'in çıpası HER çipte olmalı (22 Ağu onarımı). Bu kural bir tek
           .gh-kendim'e bakıyordu; oysa 21 Ağu'da ✕ hazır kelimelere de
           eklendi. Hazır çipte `position: relative` olmayınca ✕ mutlak
           konumu en yakın konumlanmış ataya (perdeye) göre alıyor ve
           kelimenin üstünde değil, satırın en sağındaki boşlukta beliriyordu
           — her ekran boyutunda (telefon · tablet · masaüstü). */
        #gunhali-modal .gh-cipler.duzenle button[data-kelime] { padding-right: 26px; position: relative; }
        #gunhali-modal .gh-cipler.duzenle .gh-sil {
            position: absolute; right: 6px; top: 50%; transform: translateY(-50%);
            width: 15px; height: 15px; border-radius: 50%; border: none; padding: 0; cursor: pointer;
            background: rgba(239,68,68,0.85); color: #fff; font-size: 10px; line-height: 15px;
        }
        /* Düzenleme kipinde ÇIKARILANLAR şeridi — geri eklenebilir. */
        #gunhali-modal .gh-geri-serit {
            flex-basis: 100%; display: flex; flex-wrap: wrap; align-items: center; gap: 6px;
            margin-top: 8px; padding-top: 8px; border-top: 1px dashed rgba(255,255,255,0.1);
        }
        #gunhali-modal .gh-geri-serit > span { font-size: 11px; color: #5d6b86; }
        #gunhali-modal .gh-geri {
            padding: 4px 10px; border-radius: 999px; cursor: pointer; font-family: inherit; font-size: 11.5px;
            background: none; border: 1px dashed rgba(79,172,254,0.45); color: #8fc7ff;
        }
        #gunhali-modal .gh-geri:hover { background: rgba(79,172,254,0.1); }

        /* ═══ ÜST ARAÇLAR — Gelgit ikonu + kapat (22 Ağu) ═════════════════
           Gelgit koca bir satırdı; ekranın yarısını "henüz açılmadı" demeye
           harcıyordu. Artık tek ikon: rozet KALAN GÜNÜ söyler, açıklama
           üstüne gelince balonda çıkar. */
        /* Perde genişledi (22 Ağu, kullanıcı isteği: "oradaki ekranı daha da
           genişlet"). 400 px'lik kutuda yazışma düzeni sıkışıyordu; defter
           artık yüksekliğini de ekrandan alıyor ve akış içeride kayıyor. */
        #gunhali-modal .gh-kutu {
            position: relative; max-width: 520px; text-align: left;
            display: flex; flex-direction: column;
            max-height: calc(100vh - 32px); max-height: calc(100dvh - 32px);
        }
        @media (max-width: 560px) { #gunhali-modal .gh-kutu { max-width: 100%; } }
        /* Defter açıkken kutu boyunu EKRANDAN alır — yazışma ekranı içeriğe
           göre büzülmez, alan hazır bekler. Masaüstünde 720 px'te durur,
           telefonda ekranı doldurur. */
        #gunhali-modal .gh-kutu.gh-kutu-defter {
            height: min(calc(100vh - 32px), 720px);
            height: min(calc(100dvh - 32px), 720px);
        }
        /* Tartı yüzeyi kendi içinde kayar; defter zaten akışıyla kayıyor. */
        #gunhali-modal #gh-tarti { overflow-y: auto; min-height: 0; }
        /* Başlıklar sağ üstteki araçların altına girmesin. */
        #gunhali-modal #gh-tarti > h3 { padding-right: 96px; }
        /* 🔒 İkisi de 44 px: dokunma alanı kuralı burada da geçerli
           (ilk denemede 34 px yapılmıştı, ölçüm yakaladı). Görünen daire
           küçük duruyor çünkü ikon 19-20 px; büyüyen şey parmağın yeri. */
        #gunhali-modal .gh-arac {
            position: absolute; top: 8px; right: 8px; z-index: 2;
            display: flex; align-items: center; gap: 2px;
        }
        #gunhali-modal .gh-x {
            width: 44px; height: 44px; border-radius: 50%; cursor: pointer;
            background: none; border: none; color: #64748b; font-size: 15px; line-height: 1;
            font-family: inherit;
        }
        #gunhali-modal .gh-x:hover { background: rgba(255,255,255,0.07); color: #cbd5e1; }

        #gunhali-modal .gh-gelgit-ikon {
            position: relative; width: 44px; height: 44px; border-radius: 50%; cursor: pointer;
            display: flex; align-items: center; justify-content: center;
            background: none; border: none; color: #8fc7ff; padding: 0; font-family: inherit;
        }
        #gunhali-modal .gh-gelgit-ikon svg { width: 21px; height: 21px; }
        #gunhali-modal .gh-gelgit-ikon[hidden] { display: none; }
        #gunhali-modal .gh-gelgit-ikon:hover { background: rgba(79,172,254,0.14); }
        #gunhali-modal .gh-gelgit-ikon.acik { color: #ffd97a; }
        /* Rozet: kaç gün kaldı. Eşik dolunca ✓ olur ve altına döner. */
        #gunhali-modal .gg-rozet {
            position: absolute; top: 5px; right: 4px; min-width: 15px; height: 15px;
            padding: 0 3px; box-sizing: border-box; border-radius: 999px;
            background: #4facfe; color: #06121f; font-size: 9.5px; font-weight: 700;
            line-height: 15px; text-align: center; font-variant-numeric: tabular-nums;
            border: 1.5px solid #1e293b;
        }
        #gunhali-modal .gh-gelgit-ikon.acik .gg-rozet { background: #ffd97a; }
        #gunhali-modal .gg-rozet[hidden] { display: none; }
        /* Açıklama balonu — yalnız ÜSTÜNE GELİNCE. Dokunmatikte hover yok;
           orada dokunuş zaten Gelgit'i açar, açıklama içeride yazılı. */
        #gunhali-modal .gg-balon {
            position: absolute; top: calc(100% + 8px); right: 0; width: 250px;
            padding: 9px 11px; border-radius: 11px; text-align: left;
            background: #0f1a2e; border: 1px solid rgba(79,172,254,0.3);
            box-shadow: 0 12px 30px -10px rgba(0,0,0,0.75);
            color: #b7c7dd; font-size: 11.5px; line-height: 1.5; font-weight: 400;
            opacity: 0; visibility: hidden; transform: translateY(-3px);
            /* `visibility` GEÇİŞE SOKULMAZ: geçişe girince görünürlük
               yumuşamayı bekliyor ve balon geç açılıyor. Yumuşamayı
               opaklık taşır, görünürlük anında değişir. */
            transition: opacity 0.16s ease, transform 0.16s ease;
            pointer-events: none;
        }
        #gunhali-modal .gh-gelgit-ikon:hover .gg-balon,
        #gunhali-modal .gh-gelgit-ikon:focus-visible .gg-balon {
            opacity: 1; visibility: visible; transform: translateY(0);
        }
        @media (prefers-reduced-motion: reduce) {
            #gunhali-modal .gg-balon { transition: none; }
        }
        /* Dokunmatikte balon hiç çıkmaz: parmak "hover" bırakır ve balon
           ekranda takılı kalırdı. */
        @media (hover: none) {
            #gunhali-modal .gg-balon { display: none; }
        }

        #gunhali-modal .gh-secenekler { display: flex; gap: 6px; }
        #gunhali-modal .gh-secenekler button {
            flex: 1; min-width: 0; padding: 9px 4px; border-radius: 10px; cursor: pointer;
            background: rgba(255,255,255,0.04); border: 1px solid var(--glass-border);
            color: #93a3bd; font-family: inherit; font-size: 0.78em; font-weight: 600;
            transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
        }
        #gunhali-modal .gh-secenekler button[aria-pressed="true"] {
            background: rgba(255,193,7,0.12); border-color: rgba(255,193,7,0.45); color: #ffd97a;
        }
        #gunhali-modal textarea {
            width: 100%; box-sizing: border-box; resize: none; margin-top: 2px;
            padding: 10px 12px; border-radius: 11px; line-height: 1.45;
            background: rgba(0,0,0,0.3); border: 1px solid var(--glass-border);
            color: #e9eefa; font-family: inherit; font-size: 0.85em;
        }
        #gunhali-modal textarea::placeholder { color: #61708c; }

        /* ═══ GÜN DEFTERİ (M2 · 11 Ağu 2026) ═══════════════════════════
           Gün BİR KEZ tartılır (çipli form), gün boyu YAZILIR (defter).
           İki yüzey aynı modalde: tartı doldurulmuşsa form hiç çizilmez. */

        /* Duygu çipleri: dört satırlık ölçek yerine bir avuç kelime.
           Kendi kelimesi maviyle ayrılır — hangisi onun, bakışta belli olur. */
        #gunhali-modal .gh-cipler { display: flex; flex-wrap: wrap; gap: 6px; }
        #gunhali-modal .gh-cipler button {
            padding: 7px 12px; border-radius: 999px; cursor: pointer;
            background: rgba(255,255,255,0.04); border: 1px solid var(--glass-border);
            color: #a9b8d1; font-family: inherit; font-size: 0.76em;
            transition: background 0.2s ease, border-color 0.2s ease, color 0.2s ease;
        }
        #gunhali-modal .gh-cipler button[aria-pressed="true"] {
            background: rgba(255,193,7,0.14); border-color: rgba(255,193,7,0.5);
            color: #ffd97a; font-weight: 600;
        }
        /* Tavan dolunca seçilmeyenler sönük: "üçü seçtin" yazısını okumaya gerek kalmasın. */
        #gunhali-modal .gh-cipler.dolu button:not([aria-pressed="true"]):not(.gh-kendi-ekle) { opacity: 0.4; }
        #gunhali-modal .gh-cipler button.gh-kendim { border-color: rgba(79,172,254,0.45); color: #a9c8ea; }
        #gunhali-modal .gh-cipler button.gh-kendim[aria-pressed="true"] {
            background: rgba(79,172,254,0.18); border-color: rgba(79,172,254,0.6); color: #d6ecff;
        }
        #gunhali-modal .gh-cipler button.gh-kendi-ekle { border-style: dashed; color: #7f90ab; }

        /* Kuralın kendisi ekranda: "bir kez doldurulur ve kapanır". */
        .gh-aciklama {
            margin: 12px 0 0; padding-left: 10px; font-size: 0.74em; line-height: 1.55;
            color: #7f90ab; border-left: 2px solid rgba(255,193,7,0.35);
        }
        .gh-aciklama b { color: #a9b8d1; font-weight: 600; }

        /* ═══ DEFTER — YAZIŞMA DÜZENİ (22 Ağu, "whatsapp gibi") ═══════════
           Üstte başlık, ortada akış, altta yazma çubuğu. Akış kendi içinde
           kayar ve en alta demirler; perde büyür ama taşmaz. */
        /* Defter kutunun boyunu doldurur; içinde büyüyen tek şey AKIŞ.
           Yoksa kutu ekranı kaplar ama yazışma alanı içerik kadar kalır ve
           altta koca bir boşluk açılır (22 Ağu provasında görüldü). */
        #gunhali-modal #gh-defter {
            display: flex; flex-direction: column; min-height: 0; flex: 1 1 auto;
        }
        .gh-defter-bas { flex: 0 0 auto; padding-right: 96px; margin-bottom: 10px; }
        .gh-defter-bas h3 { margin: 0; font-size: 1.05em; color: #ffd97a; }
        .gh-defter-bas p { margin: 2px 0 0; font-size: 0.78em; color: #8595b0; }

        .gh-akis {
            flex: 1 1 auto; min-height: 130px; overflow-y: auto;
            display: flex; flex-direction: column; gap: 8px;
            padding: 12px; border-radius: 14px;
            background: rgba(0,0,0,0.22); border: 1px solid rgba(255,255,255,0.06);
        }
        /* Boş defterde davet ortada durur — alta yaslanınca "bitti" gibi
           okunuyordu. Destekleyemeyen tarayıcıda eski yerinde kalır. */
        .gh-akis:has(.gh-akis-bos) { justify-content: center; }
        .gh-akis-bos {
            text-align: center; font-size: 0.76em; line-height: 1.6;
            color: #64748b; padding: 6px 10px;
        }
        /* Günün tartısı akışın İLK kaydı — öğrencinin notlarıyla aynı defterde
           olduğu görünsün diye. Ortada durur, balon değildir: bu bir olay. */
        .gh-tarti-kaydi {
            align-self: center; max-width: 92%; text-align: center;
            padding: 8px 13px; border-radius: 13px;
            background: rgba(255,193,7,0.08); border: 1px solid rgba(255,193,7,0.22);
        }
        .gh-tk-bas {
            display: block; font-size: 0.6em; font-weight: 700; letter-spacing: 1px;
            text-transform: uppercase; color: #8a7442; margin-bottom: 3px;
        }
        .gh-tk-duygu { display: block; font-size: 0.84em; color: #ffd97a; font-weight: 600; }
        /* Kronometrenin yazdığı kayıt (hedef tamamlandı). Öğrencinin balonu
           DEĞİL: ortada, sakin, kadranın mavisiyle — kimin yazdığı belli. */
        .gh-sistem-kaydi {
            align-self: center; max-width: 84%; text-align: center;
            padding: 8px 14px; border-radius: 13px;
            background: rgba(79,172,254,0.08); border: 1px solid rgba(79,172,254,0.2);
        }
        .gh-sk-bas {
            display: block; font-size: 0.6em; font-weight: 700; letter-spacing: 1px;
            text-transform: uppercase; color: #6f88a8; margin-bottom: 3px;
        }
        .gh-sk-yazi { display: block; font-size: 0.81em; color: #a9c8ea; line-height: 1.45; }
        .gh-sistem-kaydi time {
            display: block; margin-top: 3px; font-size: 0.66em; color: #62789a;
            font-variant-numeric: tabular-nums;
        }
        .gh-tk-olcek { display: block; font-size: 0.74em; color: #a4936a; margin-top: 2px; }

        /* Notlar sağa yaslı balonlar — yazan öğrenci, defter onun. */
        .gh-balon {
            align-self: flex-end; max-width: 86%;
            padding: 8px 11px 5px; border-radius: 14px 14px 4px 14px;
            background: rgba(79,172,254,0.16); border: 1px solid rgba(79,172,254,0.26);
        }
        .gh-balon-yazi {
            display: block; font-size: 0.83em; line-height: 1.5; color: #dce9fa;
            white-space: pre-wrap; overflow-wrap: anywhere;
        }
        .gh-balon time {
            display: block; text-align: right; margin-top: 2px;
            font-size: 0.62em; color: #7f9bbd; font-variant-numeric: tabular-nums;
        }

        /* Yazma çubuğu: alan solda büyür, yuvarlak gönder sağda sabit. */
        .gh-yazma {
            flex: 0 0 auto; display: flex; align-items: flex-end; gap: 8px; margin-top: 10px;
        }
        #gunhali-modal .gh-yazma textarea {
            flex: 1 1 auto; margin-top: 0; min-height: 44px; max-height: 132px;
            border-radius: 22px; padding: 12px 15px; overflow-y: auto;
        }
        .gh-gonder {
            flex: 0 0 auto; width: 44px; height: 44px; border-radius: 50%; cursor: pointer;
            display: flex; align-items: center; justify-content: center;
            background: var(--primary); border: none; color: #08131f;
        }
        .gh-gonder svg { width: 20px; height: 20px; }
        .gh-gonder:disabled { opacity: 0.4; cursor: default; }
        .gh-sayac {
            flex: 0 0 auto;
            display: flex; justify-content: flex-end; min-height: 13px;
            font-size: 0.68em; color: #6c7b96; margin-top: 4px;
        }
        .gh-kapi {
            flex: 0 0 auto;   /* esnek kolonda gerilip koca bir kutuya dönmesin */
            display: flex; align-items: center; justify-content: center; gap: 6px; cursor: pointer;
            min-height: 44px;  /* dokunma alanı kuralı buraya da uygulanır */
            margin-top: 12px; padding: 9px; border-radius: 11px; font-size: 0.76em; color: #8595b0;
            background: rgba(255,255,255,0.04); border: 1px solid var(--glass-border); width: 100%;
            font-family: inherit;
        }
        .gh-kapi:hover { background: rgba(255,255,255,0.09); color: #cbd5e1; }

        /* Defterim: geriye bakış. Son 30 gün açık, öncesi mühürlü. */
        #defterim-modal .modal-box { max-width: 440px; text-align: left; max-height: 84vh; overflow-y: auto; }
        .df-gun {
            border: 1px solid rgba(255,255,255,0.075); border-radius: 13px; padding: 11px 12px;
            margin-bottom: 9px; background: rgba(255,255,255,0.022);
        }
        .df-gun .df-bas { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }
        .df-gun .df-bas b { font-size: 0.84em; color: #dbe4f2; }
        .df-gun .df-bas i { font-style: normal; font-size: 0.72em; color: #6c7b96; margin-left: auto; }
        .df-cip {
            display: inline-block; font-size: 0.68em; padding: 2px 8px; border-radius: 999px; margin: 0 4px 4px 0;
            border: 1px solid rgba(212,175,106,0.35); color: #c8b489; background: rgba(212,175,106,0.07);
        }
        .df-gun p { margin: 5px 0 0; font-size: 0.79em; color: #b6c4da; line-height: 1.5; }
        .df-gun p time { color: #8a7442; margin-right: 6px; font-size: 0.92em; }
        /* Defterim haftalık katlar: 30 kart alt alta ekranı şişiriyordu. */
        .df-hafta { border: 1px solid rgba(255,255,255,0.07); border-radius: 13px; margin-bottom: 8px; overflow: hidden; }
        .df-hafta.acik { border-color: rgba(212,175,106,0.28); background: rgba(255,255,255,0.018); }
        .df-hafta-bas {
            width: 100%; display: flex; align-items: center; gap: 9px; cursor: pointer;
            background: rgba(255,255,255,0.03); border: none; padding: 11px 12px;
            font-family: inherit; text-align: left; color: #dbe4f2;
        }
        .df-hafta-bas:hover { background: rgba(255,255,255,0.06); }
        .df-hafta-bas .ok { color: #8a7442; font-size: 15px; transition: transform 0.18s ease; flex: 0 0 auto; }
        .df-hafta.acik .df-hafta-bas .ok { transform: rotate(90deg); }
        .df-hafta-bas b { font-size: 13px; font-weight: 600; }
        .df-hafta-bas i { font-style: normal; margin-left: auto; font-size: 11px; color: #6c7b96; }
        .df-hafta.acik .df-hafta-bas b { color: #ffd97a; }
        .df-hafta-ic { padding: 9px 9px 3px; }
        .df-hafta-ic .df-gun { background: rgba(0,0,0,0.18); }

        .df-muhur {
            display: flex; gap: 11px; align-items: flex-start; margin-bottom: 9px; padding: 12px 13px;
            border: 1px dashed rgba(212,175,106,0.32); border-radius: 13px;
            background: linear-gradient(180deg, rgba(212,175,106,0.05), rgba(0,0,0,0.12));
        }
        .df-muhur b { display: block; font-size: 0.82em; color: #c8b489; }
        .df-muhur span { font-size: 0.73em; color: #6c7b96; line-height: 1.45; }
        /* ✦ Yıl sonu hikâyesi — defterin başındaki mühürlü tomar. */
        #hk-kart {
            border: 1px solid rgba(212,175,106,0.3); border-radius: 16px; padding: 15px 16px; margin-bottom: 14px;
            background: radial-gradient(420px 180px at 50% -40%, rgba(212,175,106,0.16), transparent 70%),
                        linear-gradient(180deg, rgba(20,16,8,0.5), rgba(13,20,36,0.6));
        }
        #hk-kart .hk-ust { display: flex; align-items: center; gap: 12px; margin-bottom: 12px; }
        #hk-kart h4 { margin: 0; font-size: 15px; font-weight: 600; color: #ffd97a; }
        #hk-kart .hk-alt { font-size: 10.5px; letter-spacing: 1.2px; text-transform: uppercase; color: #8a7442; font-weight: 700; }
        .hk-sayaclar { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; margin-bottom: 12px; }
        .hk-kutu { background: rgba(0,0,0,0.28); border: 1px solid rgba(212,175,106,0.18); border-radius: 12px; padding: 9px 10px; }
        .hk-kutu b { display: block; font-size: 17px; color: #ffd97a; font-variant-numeric: tabular-nums; line-height: 1.1; }
        .hk-kutu span { font-size: 10.5px; color: #8ea0bd; }
        #hk-kart p { margin: 0 0 10px; font-size: 12.5px; color: #d6dcea; line-height: 1.6; }
        #hk-kart p.kucuk { font-size: 11.5px; color: #8ea0bd; }
        .hk-usluplar { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px; }
        .hk-usluplar button {
            background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border); color: #a9b8d1;
            border-radius: 999px; padding: 6px 13px; font-family: inherit; font-size: 12px; cursor: pointer;
        }
        .hk-usluplar button[aria-pressed="true"] {
            background: rgba(255,193,7,0.14); border-color: rgba(255,193,7,0.5); color: #ffd97a; font-weight: 600;
        }
        .hk-izin {
            display: flex; gap: 9px; align-items: flex-start; cursor: pointer;
            background: rgba(0,0,0,0.22); border: 1px solid rgba(255,255,255,0.09);
            border-radius: 12px; padding: 11px 12px; margin-bottom: 10px; font-size: 12px; color: #b6c4da; line-height: 1.5;
        }
        .hk-izin input { margin-top: 2px; accent-color: #ffd97a; flex: 0 0 auto; width: 18px; height: 18px; }
        /* İşaretlenince kutunun kendisi de yanar: tik küçük kalıyor, öğrenci
           "onayladım mı?" diye bakakalmasın. */
        .hk-izin.sec { border-color: rgba(255,193,7,0.5); background: rgba(255,193,7,0.08); color: #e2e8f4; }
        .hk-bekle {
            display: flex; gap: 9px; align-items: flex-start; font-size: 12px; line-height: 1.55; color: #8ea0bd;
            background: rgba(0,0,0,0.22); border: 1px dashed rgba(212,175,106,0.3);
            border-radius: 12px; padding: 11px 12px;
        }
        .hk-bekle svg { flex: 0 0 auto; margin-top: 1px; }
        .hk-bekle b { color: #c8b489; }
        .hk-yaz {
            width: 100%; border: none; border-radius: 12px; padding: 11px; cursor: pointer;
            background: linear-gradient(180deg, #ffd97a, #d4af6a); color: #161003; font-family: inherit;
            font-size: 13px; font-weight: 700;
        }
        .hk-yaz[disabled] { opacity: 0.6; cursor: default; }
        .hk-metin {
            white-space: pre-wrap; font-size: 13px; line-height: 1.75; color: #e2e8f4;
            background: rgba(0,0,0,0.2); border: 1px solid rgba(255,255,255,0.07);
            border-radius: 12px; padding: 14px 15px; margin-bottom: 10px;
        }
        .hk-imza { font-size: 11px; color: #6c7b96; margin-bottom: 10px; }

        .df-niye {
            margin-top: 12px; padding: 13px 14px; border-radius: 13px;
            background: rgba(255,255,255,0.028); border: 1px solid rgba(255,255,255,0.075);
        }
        .df-niye > b { display: block; font-size: 0.78em; color: #ffd97a; margin-bottom: 7px; }
        .df-niye p { margin: 0 0 8px; font-size: 0.775em; line-height: 1.62; color: #b3c1d8; }
        .df-niye p:last-child { margin-bottom: 0; }
        .df-niye p b { color: #dbe4f2; font-weight: 600; }

        .hs-blok { margin-top: 20px; }
        .hs-satir { display: flex; align-items: center; gap: 10px; padding: 11px 0;
            border-bottom: 1px solid rgba(255,255,255,0.06); }
        .hs-satir:last-child { border-bottom: 0; }
        .hs-satir .ad { flex: 1; min-width: 0; font-size: 13.5px; color: #e2e8f0; }
        .hs-satir .ad small { display: block; color: #5d6b86; font-size: 11.5px; margin-top: 2px; }
        .hs-satir .bu { flex: none; font-size: 10.5px; letter-spacing: 0.05em; text-transform: uppercase;
            color: #69f0ae; border: 1px solid rgba(105,240,174,0.35); border-radius: 99px; padding: 2px 8px; }
        .hs-dug { width: 100%; margin-top: 12px; padding: 13px; border-radius: 12px; cursor: pointer;
            font: inherit; font-size: 14px; font-weight: 700; border: 1px solid transparent; }
        .hs-dug.cik { background: rgba(239,68,68,0.12); border-color: rgba(239,68,68,0.45); color: #fca5a5; }
        .hs-dug.sade { background: rgba(255,255,255,0.04); border-color: var(--glass-border); color: #cbd5e1; }
        /* Numara bağlama: WhatsApp kanalının çerçeveli yeşili (oda.html .dugme.wa ile aynı dil). */
        .hs-dug.bagla { background: rgba(37,211,102,0.12); border-color: rgba(37,211,102,0.42); color: #6EE7A0; }
        .hs-kucuk { flex: none; background: rgba(255,255,255,0.05); border: 1px solid var(--glass-border);
            color: #cbd5e1; border-radius: 9px; padding: 6px 10px; font: inherit; font-size: 12px; cursor: pointer; }
        /* 🔴 PAYLAŞILAN SINIF EYLEM RENGİNİ EZİYORDU (7 Eyl provası, ekranda
           ölçüldü): `.hs-kucuk` ile `.ss-birincil` aynı ağırlıkta (0-1-0) ve
           bu dosya `dugme.css`ten SONRA yükleniyor — "Adın → Kaydet" altın
           sınıfını taşıdığı hâlde gri kalıyordu. İki sınıf birlikte yazılınca
           ağırlık artar ve eylem rengi kazanır.
           🔑 Ders: bir düğmeye sınıf takmak yetmez; o sınıfın CASCADE'de
           kazandığını ekranda ölç. */
        .hs-kucuk.ss-birincil {
            background: var(--ss-eylem-dolgu, rgba(212,175,106,.16));
            border-color: var(--ss-eylem-cizgi, rgba(212,175,106,.48));
            color: var(--ss-eylem-yazi, #E8D5A8);
        }
        .hs-kucuk.ss-birincil:hover { background: var(--ss-eylem-dolgu-koyu, rgba(212,175,106,.26)); }
        /* ── PROFİL KAPILARI — TEK BİÇİM (12 Ağu 2026) ─────────────────────
           Kapılar zamanla üç ayrı biçimde birikti: altın SVG kartlar, emoji'li
           düz düğmeler, katlanır kartlar. Artık her KAPI aynı iskeleti taşır:
           simge (sabit genişlik, büyük) + ad & açıklama + ok. Renk tonu
           (altın/mavi) kapının kendi kimliği; iskelet ortak. */
        .hs-bolum { margin: 20px 2px 8px; font-size: 10.5px; font-weight: 700;
            letter-spacing: 0.14em; text-transform: uppercase; color: #5d6b86; }
        /* Yuva: modüllerin kapı taktığı bölme. Kapısı olmayan bölme başlığıyla
           birlikte GİZLENİR — boş kategori ekranda durmaz. */
        .hs-yuva { display: none; }
        .hs-yuva:has(.hs-kapi) { display: block; }
        .hs-kapi { display: flex; align-items: center; gap: 11px; width: 100%;
            padding: 12px; margin-bottom: 10px; border-radius: 14px; cursor: pointer;
            background: rgba(255,255,255,0.04); border: 1px solid var(--glass-border);
            color: #cbd5e1; font-family: inherit; text-align: left; }
        .hs-kapi .simge { flex: none; width: 30px; font-size: 21px; line-height: 1; text-align: center; }
        /* 20 Ağu: kapı simgeleri artık ÇİZİLMİŞ (emoji değil) — kutunun içinde
           ortalanır, satır yüksekliğini kaydırmasın diye blok. */
        .hs-kapi .simge svg { display: block; margin: 0 auto; }
        .hs-kapi svg { flex: none; }
        .hs-kapi .ad { flex: 1; min-width: 0; font-size: 0.95em; font-weight: 600; }
        .hs-kapi .ad small { display: block; margin-top: 3px; font-size: 0.75em; font-weight: 400; color: #94a3b8; }
        .hs-kapi .ok { color: #64748b; }
        .hs-not { margin-top: 16px; font-size: 12px; color: #5d6b86; line-height: 1.5; }
        /* Ad satırı: kutu + Kaydet yan yana. Genel `input` kuralı ortalı ve alt
           boşluklu geliyor; burada satır içinde durduğu için ikisi de sıfırlanır. */
        /* Yer tutucu satırlar: hesap ekranı açılırken düzen hazır gelsin diye.
           Nefes alan solukluk — dönen çark koymuyoruz, bekleme çoğu zaman
           göz kırpması kadar sürüyor ve çark daha çok dikkat çekerdi. */
        .hs-iskelet { height: 14px; border-radius: 7px; margin-top: 14px;
            background: rgba(255,255,255,0.06); animation: hs-nefes 1.4s ease-in-out infinite; }
        .hs-iskelet.baslik { width: 42%; height: 11px; margin-top: 20px; }
        @keyframes hs-nefes { 0%,100% { opacity: 0.45; } 50% { opacity: 0.9; } }
        @media (prefers-reduced-motion: reduce) { .hs-iskelet { animation: none; } }

        .hs-ad-satir { display: flex; align-items: center; gap: 8px; margin-top: 10px; }
        .hs-ad-giris { flex: 1; min-width: 0; margin-bottom: 0 !important; text-align: left !important;
            padding: 11px 12px !important; font-size: 14px !important; }
        .hs-ad-satir .hs-kucuk { padding: 11px 14px; }

        /* Veri girişi sayfası cilası: üstte tutamaç + alt boşluk + yumuşak KAYDET gölgesi */
        #data-inputs .modal-box { position: relative; padding-top: 24px; padding-bottom: 18px; }
        #data-inputs .modal-box::before {
            content: ''; position: absolute; top: 9px; left: 50%; transform: translateX(-50%);
            width: 42px; height: 4px; border-radius: 3px; background: rgba(255,255,255,0.18);
        }
        /* ═══ KAYIT PERDESİNİN ÖLÇÜLERİ — SATIR İÇİNDEN DEFTERE (ADIM 4) ══
           Perdenin ölçüleri HTML'in içine serpilmişti: kutu genişliği bir
           yerde, kadranın rengi başka yerde, uyarı şeritlerinin ikisi ayrı
           ayrı ve neredeyse aynı. Satır içi ölçü hiçbir kurala uymaz — ne
           yazı ölçüsüne, ne dar ekran kurallarına; onları EZER. Bir gün
           "gövde ince olsun" denince değişmeyen tek yer orası olur.
           🔒 Perdede satır içi biçim kalmadı; tek istisna `display`, o da
           biçim değil DURUM (JS açıp kapıyor). Bekçi bunu ölçüyor. */
        #data-inputs .ky-kutu { max-width: 420px; text-align: left; padding: 22px; }
        #data-inputs .ky-ust {
            display: flex; justify-content: space-between; align-items: center; margin-bottom: 18px;
        }
        #btn-resume-timer {
            color: #94a3b8; font-size: 0.9em; cursor: pointer; font-weight: var(--yz-baslik);
            transition: color 0.2s; display: inline-flex; align-items: center; gap: 6px;
        }
        /* 🔒 KALIN YAZININ TEK YERİ: kadran. Rengi zaten o taşıyor; ekranın
           geri kalanı 300–500 arası ince kalır (maket §4). */
        #modal-timer-display {
            color: var(--success); font-size: 1.3em; font-weight: 800; letter-spacing: 2px;
            font-variant-numeric: tabular-nums; text-shadow: 0 0 10px rgba(0, 242, 254, 0.5);
        }
        /* İki uyarı şeridi tek kalıp: renk ailesi sınıfla seçilir. */
        #data-inputs .ky-not {
            display: none; font-size: 0.82em; border-radius: 10px; padding: 9px 12px;
            margin-bottom: 12px; text-align: center; line-height: 1.4; font-weight: var(--yz-govde);
        }
        #data-inputs .ky-not.altin {
            color: #e8d5a8; background: rgba(212, 175, 106, 0.08); border: 1px solid rgba(212, 175, 106, 0.35);
        }
        #data-inputs .ky-not.amber {
            color: #ffce5c; background: rgba(245, 158, 11, 0.08); border: 1px solid rgba(245, 158, 11, 0.3);
        }
        #data-inputs .ky-ipucu {
            display: none; font-size: 0.8em; color: #94a3b8; text-align: center;
            margin-bottom: 12px; font-weight: var(--yz-govde);
        }
        #data-inputs .ky-analiz { display: none; margin-bottom: 12px; }
        #data-inputs .ky-analiz label { display: block; margin-bottom: 8px; text-align: center; }
        /* Maketteki ana düğme de ince (500): kalınlık "bak bana" demenin en
           ucuz yolu ve ekranda tek başına duran bir düğmenin buna ihtiyacı
           yok — rengi zaten söylüyor. */
        /* ═══ ALTIN = İLERLET (7 Eyl 2026, kullanıcı kararı) ═══════════════
           🔴 ESKİ HÂL: neon camgöbeği dolgu + camgöbeği gölge. Ürünün en çok
           basılan düğmesiydi ve "ileri götüren düğme" rengini her ekranda
           değiştiriyordu (burada camgöbeği, kitaplıkta altın, ritim
           penceresinde mavi). Camgöbeği artık DURUM rengi: etkin sekme,
           ilerleme çubuğu, sayılar. Eylem altındır — kadranın BAŞLAT'ı gibi.
           Ölçü `dugme.css`ten gelir; buradaki tek iş boy ve yerleşim. */
        #btn-submit-next {
            background: var(--ss-eylem-dolgu, rgba(212,175,106,.16));
            border: 1px solid var(--ss-eylem-cizgi, rgba(212,175,106,.48));
            color: var(--ss-eylem-yazi, #E8D5A8);
            width: 100%; font-size: 1em; padding: 16px 0;
            font-weight: var(--yz-baslik); letter-spacing: .03em;
        }
        #btn-submit-next:hover:not(:disabled):not(.sonuk) {
            background: var(--ss-eylem-dolgu-koyu, rgba(212,175,106,.26));
        }
        #btn-submit-next { border-radius: 14px !important; box-shadow: none !important; }

        /* ═══ KAYIT KARTI — TEK BLOK YOLU (4 Eyl · ADIM 3) ═══════════════
           Ölçüler düzeltme perdesindeki `.dz-govde .pk-grup` ile BİREBİR:
           iki ekran aynı kartı çiziyorsa aynı boşlukları da almalı, yoksa
           "aynı kart" iddiası ilk bakışta çürür. */
        #data-inputs .kayit-kart { margin: 0 0 16px; }
        /* ⚠️ `.pk-ic`in kendi girintisi (soldan 48 px) EZİLMEZ: o ölçü
           ikonun genişliğinden geliyor, iç blok tür adının tam altına
           hizalanıyor. Ezersek "aynı kart" iddiası ilk bakışta çürür. */
        #data-inputs .kayit-kart .pk-dyb,
        #data-inputs .kayit-kart .pk-zor { min-height: 44px; }
        /* Etiket bölünmez: "D / Y / B" iki satıra düşünce satır yükseliyor ve
           kutular etiketin yanında yamuk duruyor (4 Eyl provasında görüldü). */
        #data-inputs .kayit-kart .pk-dyb > span:first-child,
        #data-inputs .kayit-kart .pk-zor > span:first-child { white-space: nowrap; }
        /* Parmak ölçüsü 44 px — kutu da çip de. Ölçü TEK yerde durduğu için
           kayıt ekranında da perdede de aynı (4 Eyl kilitli kararı).
           🔴 7 Eyl: burada GENİŞLİK de yazılıydı (54 px) ve ortak ölçüyü
           (48 px) eziyordu — aynı kutu iki ekranda iki boydaydı. "Ölçü tek
           yerde" cümlesi yazılıydı ama bir satır altında bozuluyordu.
           Yükseklik kalır (satırın kendi kuralı), GENİŞLİK ortak ölçüden. */
        #data-inputs .kayit-kart .pk-num { min-height: 44px; }
        #data-inputs .kayit-kart .pk-cip { min-height: 44px; }
        /* Beşli cetvel satıra sığmaz: etiket üstte kalır, çipler tam
           genişlik alta geçer. Kutular küçülmesin diye. */
        #data-inputs .kayit-kart .pk-zor.genis { display: block; }
        #data-inputs .kayit-kart .pk-zor.genis .pk-cipler { display: flex; margin-top: 7px; }
        #data-inputs .kayit-kart .pk-cipler.bes .pk-cip { flex: 1; padding: 8px 4px; text-align: center; font-size: .92em; }
        /* Kaynak hapı ile ayraç çalışma satırının sağında durur; sayfa satırı
           iç blokta, sayıların kardeşi olarak. */
        /* Hap TÜR ADINDAN ÇALMAZ: 4 Eyl provasında kitabın uzun adı satırı
           yiyip "Soru Çözümü"nü "Soru …"ya düşürmüştü. Şerit artık en çok
           yarım satır alır; kitabın tam adı zaten dokununca açılan yaprakta. */
        #data-inputs .kayit-kart #kayit-serit { display: inline-flex; flex: 0 1 auto; max-width: 44%; flex-wrap: wrap; gap: 6px; justify-content: flex-end; margin: 0; }
        #data-inputs .kayit-kart #kayit-serit[hidden] { display: none; }
        /* Haplar parçalı kayıttaki kaynak piliyle AYNI ölçüde: satırı yutan
           dev kutu değil, "boyum yazım kadar" (3 Eyl vakası). */
        #data-inputs .kayit-kart #kayit-serit > button {
            flex: 0 1 auto; max-width: 100%; height: 24px; padding: 0 10px;
            border-radius: 8px; font-size: .68em; letter-spacing: .2px;
        }
        /* İşlenen/toplam tek satırda okunur: "18 / 550" ikiye bölününce
           satır yükseliyor ve kutularla hizası kayıyor. */
        #data-inputs .kayit-kart .pk-sayfa .pk-bolu { white-space: nowrap; font-size: .84em; }
        #data-inputs .kayit-kart .pk-satir { gap: 8px; }
        #data-inputs #kayit-genisleme { margin: -8px 0 12px; }

        /* 🔴 ORTALI "SADE KART" SÖKÜLDÜ (4 Eyl · ADIM 3). d/y/b sorulmayan
           türler (Video İzleme, Konu Çalışması…) kendi ekranına sahipti: saat
           çemberi, büyük süre, ders·tür satırı. Aynı iş için ikinci bir dil.
           Artık o türler de aynı kartı görür — yalnız iç bloğu açılmaz. */

        /* Kendi sayı tuş takımı */
        .num-field.active { border-color: var(--primary) !important; box-shadow: 0 0 0 2px rgba(79,172,254,0.35); }
        /* z-düzeyi 10070: düzeltme/elle giriş perdesi 10060'ta duruyor ve tuş
           takımı artık ONA DA hizmet ediyor — altında kalırsa görünmez olur. */
        #num-keypad {
            position: fixed; left: 0; right: 0; bottom: 0; z-index: 10070; display: none;
            background: #0b0f1a; border-top: 1px solid var(--glass-border);
            padding: 8px 8px calc(10px + env(safe-area-inset-bottom, 0px)); box-sizing: border-box;
            box-shadow: 0 -8px 24px rgba(0,0,0,0.5);
        }
        #num-keypad.open { display: block; }
        #num-keypad .kp-bar { display: flex; align-items: center; gap: 8px; padding: 4px 8px 10px; max-width: 460px; margin: 0 auto; }
        #num-keypad .kp-label { flex: 1; text-align: center; }
        #num-keypad .kp-gez {
            flex: none; width: 34px; height: 34px; border-radius: 10px; cursor: pointer;
            border: 1px solid var(--glass-border); background: rgba(255,255,255,.04);
            color: #9db0cc; font-size: 1.15em; font-weight: 700; line-height: 1;
            display: flex; align-items: center; justify-content: center;
        }
        #num-keypad .kp-gez:disabled { opacity: .3; pointer-events: none; }
        #num-keypad .kp-gez:active { background: rgba(255,255,255,.09); }
        #num-keypad .kp-label { font-size: 0.82em; color: #8595b0; font-weight: 600; letter-spacing: 0.3px; }
        #num-keypad .kp-done { font-size: 0.85em; color: var(--success); font-weight: 700; padding: 7px 18px; border-radius: 10px; background: rgba(0,242,254,0.12); cursor: pointer; }
        #num-keypad .kp-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 7px; max-width: 460px; margin: 0 auto; }
        #num-keypad .kp-key {
            padding: 14px 0; text-align: center; font-size: 1.4em; font-weight: 600; border-radius: 12px;
            background: rgba(255,255,255,0.06); color: #e9eefa; border: none; cursor: pointer; font-variant-numeric: tabular-nums;
        }
        #num-keypad .kp-key:active { background: rgba(0,242,254,0.18); }
        #num-keypad .kp-key.kp-sub { font-size: 1.15em; color: #8595b0; background: rgba(255,255,255,0.03); }

        /* 04:00 gün-sınırı bildirimi (çalışan blok geceyi geçince) — kesmeyen üst toast */
        #boundary-toast {
            position: fixed; top: calc(12px + env(safe-area-inset-top, 0px)); left: 50%; transform: translateX(-50%);
            z-index: 97; max-width: 92%; width: max-content; display: none; cursor: pointer;
            background: rgba(245,158,11,0.14); border: 1px solid rgba(245,158,11,0.42); color: #ffce5c;
            font-size: 0.8em; font-weight: 600; padding: 10px 16px; border-radius: 12px; text-align: center; line-height: 1.45;
            backdrop-filter: blur(10px); box-shadow: 0 10px 28px -8px rgba(0,0,0,0.55);
        }
        #boundary-toast.show { display: block; animation: toastIn 0.35s ease; }
        @keyframes toastIn { from { opacity: 0; transform: translateX(-50%) translateY(-10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }

        /* ═══ DÜĞÜM VE SIRA — "Bu konuyu bitirdim" (8 Ağu 2026) ═══
           Kaydet ekranının içinde tek dokunuşluk işaret. Sönük duruyor: basılmadan
           önce bir davet, basıldıktan sonra altın bir mühür. Ayrı ekran YOK —
           çalışmayı bölmeme kuralının arayüz karşılığı. */
        /* 9 Ağu: tam genişlikte bir satır DEĞİL, küçük bir işaret. 4 Eyl
           (ADIM 3): yeri kart başlığı, görünümü `.pk-kb` — parçalı kayıt ve
           düzeltme kartındakiyle aynı sınıf. Buradaki tek şey metnin
           taşmaması. */
        #konu-bitti-btn .kb-metin { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

        /* Mühür bildirimi: kaydettikten sonra alt köşede 10 sn duran iz + geri al */
        #muhur-toast {
            position: fixed; left: 50%; transform: translateX(-50%);
            bottom: calc(78px + env(safe-area-inset-bottom, 0px));
            z-index: 10002; max-width: 92%; width: max-content; display: none;
            align-items: center; gap: 12px;
            background: rgba(20,26,40,0.92); border: 1px solid rgba(255,193,7,0.38); color: #ffd97a;
            font-size: 0.8em; font-weight: 600; padding: 10px 12px 10px 16px; border-radius: 13px; line-height: 1.4;
            backdrop-filter: blur(10px); box-shadow: 0 12px 30px -8px rgba(0,0,0,0.6);
        }
        /* Kapanış cümlesi İKİ SATIR (27 Ağu): üstte olay, altta Samanyolu
           sayısı. `innerText` satır sonu koyuyor; pre-line olmadan iki cümle
           tek satırda birbirine yapışıyordu. */
        #muhur-metin { white-space: pre-line; }
        #muhur-toast.show { display: flex; animation: muhurIn 0.4s ease; }
        #muhur-toast button {
            flex: 0 0 auto; background: rgba(255,255,255,0.06); border: 1px solid var(--glass-border);
            color: #cbd5e1; font-family: inherit; font-size: 0.95em; font-weight: 600;
            padding: 6px 11px; border-radius: 9px; cursor: pointer;
        }
        #muhur-toast button:active { background: rgba(255,255,255,0.14); }
        @keyframes muhurIn { from { opacity: 0; transform: translateX(-50%) translateY(10px); } to { opacity: 1; transform: translateX(-50%) translateY(0); } }

        /* ═══ ÇOKLU SINAV KAPISI (7 Ağu 2026 · 9 Ağu'da PROFİLE taşındı) ═══
           Başka bir sınavın dersini listeye ekleme. Artık çalışma ekranında
           değil profilde: bu bir AYAR, çalışmanın akışında durmamalı.
           Profilde saklanacak bir şey de değil — bağlantı orada okunur olsun. */
        #ek-ders-kapi { margin-top: 8px; }
        .ek-ders-link {
            background: none; border: none; padding: 4px 0; cursor: pointer;
            font-size: 0.86em; font-weight: 600; color: var(--primary); letter-spacing: 0.2px;
        }
        .ek-ders-link:hover { color: var(--primary); }
        .ek-ders-panel {
            display: flex; flex-wrap: wrap; gap: 7px; align-items: center; margin-top: 7px;
            padding: 10px; border-radius: 12px;
            background: rgba(255,255,255,0.04); border: 1px solid var(--glass-border);
        }
        .ek-ders-secim {
            flex: 1 1 130px; min-width: 0; padding: 8px 10px; border-radius: 9px;
            font-size: 0.82em; color: #e9eefa;
            background: rgba(0,0,0,0.35); border: 1px solid var(--glass-border);
        }
        .ek-ders-secim:disabled { opacity: 0.5; }
        /* 🔴 KUTU PROFİLİN DIŞINDA ASLA GÖRÜNMEZ (9 Ağu akşamı canlı vakası).
           Düğüm profil kapalıyken body'nin doğrudan çocuğu olarak bekliyor ve
           body bir FLEX KABI: görünür bir fazlalık çocuk kronometre kartını
           yana itiyor, alt bar kayıyor, ekranın solunda boşlukta bir
           "+ başka sınavın dersi" yazısı kalıyordu. Görünürlük artık YERE
           bağlı — kutu yalnız profildeki yuvasında çizilir. */
        body > #ek-ders-kapi { display: none !important; }
        .ek-ders-buton {
            padding: 8px 16px; border-radius: 9px; border: none; cursor: pointer;
            font-size: 0.82em; font-weight: 700; color: #06121f; background: var(--primary);
        }
        .ek-ders-buton:disabled { opacity: 0.4; cursor: default; }
        .ek-ders-not { flex-basis: 100%; font-size: 0.74em; color: #8595b0; min-height: 1em; }

        /* ═══ AÇIK KAPI — eşik anı (ilk girişte bir kez) ═════════════════════
           Varsayılan GİZLİ. <head>'deki tek satır, ilk giriş ise <html>'e
           `esik-var` sınıfını basar; kapı yalnız o zaman görünür. Böylece geri
           gelen öğrenci kapıyı bir an bile görmez, yeni gelen ekran titremesi
           yaşamaz. */
        .ak { display: none; }
        .esik-var .ak {
            display: flex; position: fixed; inset: 0; z-index: 200;
            align-items: center; justify-content: center; text-align: center;
            background: #070a12;
            transition: opacity 0.6s ease;
        }
        .ak-ic { padding: 24px; max-width: 340px; }
        .ak-kemer { width: 148px; height: 185px; display: block; margin: 0 auto 26px; }
        /* Altın: kadrandaki ilerleme yayıyla AYNI aile — ekranda tek ışık konuşur. */
        .ak-yay, .ak-sove {
            fill: none; stroke: #E9C255; stroke-width: 7; stroke-linecap: round;
        }
        /* transform-box/origin ŞART: SVG'de ölçek varsayılan olarak çizim
           başlangıcından (0,0) uygulanır — ışık merkezinden değil sol üst köşeden
           büyür ve ekranı yamuk doldururdu. */
        .ak-isik { fill: #FBE7A8; transform-box: fill-box; transform-origin: center; }
        .ak-soz { font-size: 1.5em; font-weight: 700; color: #f2f6ff; margin: 0 0 10px; letter-spacing: 0.5px; }
        .ak-alt { font-size: 0.92em; line-height: 1.65; color: #8d9cb8; margin: 0 0 30px; }
        .ak-gec {
            padding: 13px 42px; border-radius: 13px; border: none; cursor: pointer;
            font-family: inherit; font-size: 0.98em; font-weight: 700; letter-spacing: 0.5px;
            color: #06121f; background: #E9C255;
            transition: opacity 0.5s ease;
        }
        /* İlk iki saniye ATLANAMAZ: düğme görünmez ve tıklanamaz. Eşik onurlandırılır,
           geçilip gidilmez — bu bekleme törenin kendisidir. */
        .ak-gec:disabled { opacity: 0; pointer-events: none; }

        /* BELİRİŞ: kemer önce çizilir, ışık sonra doğar. Sıra anlamlıdır —
           önce kapı vardır, sonra içindeki ışık. */
        .esik-var .ak-yay, .esik-var .ak-sove {
            stroke-dasharray: 200; stroke-dashoffset: 200;
            animation: ak-ciz 1.5s ease forwards;
        }
        .esik-var .ak-sove { animation-delay: 0.35s; }
        .esik-var .ak-isik { opacity: 0; animation: ak-dogsun 1.1s ease 1.1s forwards; }
        .esik-var .ak-soz  { opacity: 0; animation: ak-bel 0.9s ease 1.4s forwards; }
        .esik-var .ak-alt  { opacity: 0; animation: ak-bel 0.9s ease 1.7s forwards; }
        @keyframes ak-ciz   { to { stroke-dashoffset: 0; } }
        @keyframes ak-dogsun{ from { opacity: 0; transform: scale(0.2); } to { opacity: 1; transform: none; } }
        @keyframes ak-bel   { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: none; } }

        /* GEÇİŞ: dokununca ışık büyüyüp ekranı doldurur — kronometre kemerin
           içindeki ışıktan doğar. Kapı bu ışığın içinde kaybolur. */
        .ak.gecildi { opacity: 0; pointer-events: none; }
        .ak.gecildi .ak-isik { animation: ak-buyu 0.75s cubic-bezier(.4,0,.2,1) forwards; }
        .ak.gecildi .ak-yay, .ak.gecildi .ak-sove, .ak.gecildi .ak-soz,
        .ak.gecildi .ak-alt, .ak.gecildi .ak-gec { opacity: 0; transition: opacity 0.3s ease; }
        @keyframes ak-buyu { to { transform: scale(26); opacity: 0; } }

        /* Hareket azaltma isteyene tören SUSAR ama KALIR: kapı durur, animasyon
           gitmez. İki saniyelik bekleme yine geçerli — o bekleme bir animasyon
           değil, eşiğin kendisi. */
        @media (prefers-reduced-motion: reduce) {
            .esik-var .ak-yay, .esik-var .ak-sove { stroke-dashoffset: 0; animation: none; }
            .esik-var .ak-isik, .esik-var .ak-soz, .esik-var .ak-alt { opacity: 1; animation: none; }
            .ak.gecildi .ak-isik { animation: none; }
        }

/* ═══════════════════════════════════════════════════════════════════════
   SÜRELİ KİP — M3 · Ölçme Ailesi, Bölüm 2 (11 Ağu 2026)

   Tek sayaç, iki yüz: motor İLERİ sayar, ekran kalanı gösterir.
   Renk kimliği: süre ÇALIŞMANIN rengidir (turkuaz/mavi) — kitap altınıyla
   yarışmaz. Altın yalnız SON dilimde devreye girer (sessiz işaret) ve
   Kyron kuralı korunur: çalışma sürerken renk dışında hiçbir şey kıpırdamaz.
   ═══════════════════════════════════════════════════════════════════════ */
/* 15 Ağu: teklif satırının biçimi SÖKÜLDÜ — ayar artık panelde.
   Kadranın süreli yüzü (aşağısı) yerinde: motor ve görünüm değişmedi. */

/* Sayaç altı etiketi: "KALAN · hedef 165 dk". Yayla aynı aileye alındı:
   mavi kalkınca bu satırın mavisi de yalnız kalıyordu (24 Ağu gecesi). */
#progress-text.sureli { color: #D4BC7D; }
#progress-text.sureli-son { color: #e8d5a8; }

/* Kadran yayı: süreli kipte kalan oranını çizer.
   🔴 MAVİ SÖKÜLDÜ (24 Ağu gecesi, kullanıcı): geri sayım başlayınca yay
   altından maviye (#4facfe) dönüyordu. "O mavi kısmı kaldır, bozuyor
   görüntüyü." Yay artık her kipte ALTIN kalıyor — tek renk, tek dil.
   Son dilimin koyu altın vurgusu duruyor (sessiz işaret). */
#dial.sureli-son #dial-fill { stroke: #d4af6a; }

/* Süre dolduğunda sayaç metni: bir kez yumuşakça altınlaşır, titremez. */
#timer.sureli-doldu { color: #e8d5a8; text-shadow: 0 0 14px rgba(212, 175, 106, 0.4); }

/* ═══════════════════════════════════════════════════════════════════════
   TEK RİTİM — kendi temposu (YPT karar 5 · 15 Ağu 2026)

   Süreli kipin KARDEŞİ: aynı yerde durur, aynı dili konuşur, aynı rengi
   (turkuaz/mavi = süre) kullanır. Ayrıştığı tek yer MOLA yüzü: mola
   çalışma değildir, o yüzden kadran ılık bir yeşile döner — uyarı değil,
   izin rengi. Kyron kuralı burada da geçerli: çalışma sürerken renk
   dışında hiçbir şey kıpırdamaz, hareket yalnız faz eşiğinde.
   ═══════════════════════════════════════════════════════════════════════ */
/* 15 Ağu: ritim satırı + serbest kutuları SÖKÜLDÜ — ayar artık panelde,
   sayılar klavyeyle değil − / + ile değişiyor. Kadranın ritim yüzü kalıyor. */

/* Sayaç altı etiketi: "KALAN · 50/10 · 2. tur" ya da "MOLA · 50/10". */
#progress-text.ritim { color: #7fb8e8; }
#progress-text.ritim-mola { color: #86c9a4; }

/* Kadran yayı: çalışmada süreli kiple aynı mavi, molada ılık yeşil. */
#dial.ritim #dial-fill { transition: stroke 1.2s ease; stroke: #4facfe; }
#dial.ritim-mola #dial-fill { stroke: #5fbd8d; }
#timer.ritim-mola { color: #9fd9ba; }

/* ── YOL TAŞLARI + GÖKYÜZÜ (13 Ağu) — kapı kapalıyken bu öğeler hiç çizilmez ── */

/* Seyir altyazısı: karne içinde, tuvalin hemen altında. Yer tutar ki
   yazı belirince sayfa zıplamasın. */
#gc-gok-altyazi { min-height: 20px; text-align: center; font-size: 13px;
    color: #e8d5a8; margin: -4px 0 8px; transition: opacity 0.4s; }

/* Kyron daveti: yeni taş doğduğunda tek satır — dürtme değil, davet. */
.gc-gok-davet { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
    background: rgba(212, 175, 106, 0.08); border: 1px solid rgba(212, 175, 106, 0.25);
    border-radius: 12px; padding: 10px 14px; margin-bottom: 10px;
    font-size: 13px; color: #e8d5a8; }

.gc-gok-dgm { font: 600 12.5px/1 inherit; color: #c7d2e4; background: none;
    border: 1px solid rgba(150, 175, 220, 0.25); border-radius: 999px;
    padding: 7px 12px; cursor: pointer; }
.gc-gok-dgm:hover { color: white; border-color: #8fa3bd; }
.gc-gok-dgm.soluk { color: #8fa3bd; border-color: transparent; }

.gc-gok-arac { display: flex; gap: 6px; flex-wrap: wrap; align-items: center;
    margin: 10px 0 4px; }
.gc-gok-yakinlik { margin-left: auto; display: flex; gap: 6px; }
.gc-gok-yakinlik .gc-gok-dgm { width: 32px; text-align: center; padding: 7px 0; }

/* Taş defteri: yalnız GEÇİLEN taşlar; sıradaki eşik burada da yok.
   22 Ağu: yana kayma yerine satıra iniyor. Bu sayfada kaydırma çubukları
   global olarak gizli (yukarıda `* { scrollbar-width: none }`), yani yatay
   kayan her şerit farede ULAŞILAMAZ oluyor. Bugün taş azken görünmüyordu;
   taşlar biriktikçe (her taş 116 px) şerit kaçınılmaz olarak taşacaktı ve
   öğrencinin en eski yol taşları sessizce ekran dışında kalacaktı. */
.gc-tas-serit { display: flex; flex-wrap: wrap; gap: 8px; padding: 4px 2px 10px; }
.gc-tas { flex: 0 0 auto; width: 116px; background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(150, 175, 220, 0.14); border-radius: 12px;
    padding: 12px 8px 10px; text-align: center; cursor: pointer; color: inherit; }
.gc-tas:hover { border-color: rgba(212, 175, 106, 0.5); }
.gc-tas svg { width: 44px; height: 44px; display: block; margin: 0 auto 5px; }
.gc-tas .ad { display: block; font-size: 12px; font-weight: 700; color: #e8d5a8; }
.gc-tas .tar { display: block; font-size: 11px; color: #8fa3bd; margin-top: 2px;
    font-variant-numeric: tabular-nums; }
.gc-tas-hikaye { background: rgba(255, 255, 255, 0.03);
    border: 1px solid rgba(212, 175, 106, 0.4); border-radius: 12px;
    padding: 14px 16px; margin: 2px 0 10px; }
.gc-tas-hikaye .b { font-size: 14px; font-weight: 800; color: #e8d5a8; margin-bottom: 4px; }
.gc-tas-hikaye p { font-size: 13px; color: #c7d2e4; margin: 4px 0 8px; }
.gc-tas-hikaye .tar { font-size: 11.5px; color: #8fa3bd; margin-bottom: 10px; }

/* Gün kartı: yıldıza dokununca — gövdeye asılır, dışına dokununca kapanır. */
#gc-gun-karti { position: fixed; z-index: 10011; min-width: 160px; max-width: 220px;
    background: #10182e; border: 1px solid #8a7442; border-radius: 12px;
    padding: 11px 13px; font-size: 13px; line-height: 1.5; color: #c7d2e4;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.5); }
#gc-gun-karti .t { font-size: 14px; font-weight: 800; color: #e8d5a8; margin-bottom: 2px; }
#gc-gun-karti .v b { color: white; font-variant-numeric: tabular-nums; }
#gc-gun-karti .olay { margin-top: 5px; padding-top: 5px;
    border-top: 1px dashed rgba(150, 175, 220, 0.2); color: #d4af6a; font-size: 12px; }
/* Konu kapanışı ILIK YEŞİL (27 Ağu): gökten gelen (taş, mühür) altındır;
   öğrencinin kendi kapattığı ayrı renkte durur — mola yeşilinin akrabası,
   altınla yarışmaz. Kıyas yok, sönme yok kuralı bozulmadan yeni bir olay. */
#gc-gun-karti .olay.konu { color: #9fd9ba; }

/* Tam ekran gök (13 Ağu prova dönüşü): büyütme artık burada yaşar. */
#gc-gok-tam { position: fixed; inset: 0; z-index: 10010; background: #070b18;
    display: flex; flex-direction: column; padding: 12px 10px;
    padding-top: calc(12px + env(safe-area-inset-top, 0px)); }
#gc-gok-tam .ust { display: flex; justify-content: space-between; align-items: center;
    padding: 2px 4px 10px; }
/* Uygulamanın genel düğme kuralı genişletiyor — burada düğme içeriği kadar. */
#gc-gok-tam .gc-gok-dgm { width: auto; flex: 0 0 auto; }
#gc-gok-tam .baslik { font-size: 16px; font-weight: 800; color: #e8d5a8; }
#gc-gok-tam-tuval { display: block; width: 100%; border-radius: 12px;
    touch-action: none; }
#gc-gok-tam .ipucu { text-align: center; font-size: 12px; color: #8fa3bd;
    margin-top: 10px; }
#gc-gok-tam .alt { position: absolute; right: 16px;
    bottom: calc(16px + env(safe-area-inset-bottom, 0px)); display: flex; gap: 6px; }
#gc-gok-tam .alt .gc-gok-dgm { width: 36px; text-align: center; padding: 9px 0;
    background: rgba(10, 16, 36, 0.85); }

/* Fotoğraf seçimi: iki satır, her biri ne işe yaradığını söyler. */
.gc-foto-menu { display: flex; flex-direction: column; gap: 6px; margin: 2px 0 8px; }
.gc-foto-menu[hidden] { display: none; }
.gc-foto-menu .gc-gok-dgm { text-align: left; }

/* Tam ekran seyir: altyazı tuvalin hemen altında, üst sağda düğme çifti. */
#gc-gok-tam .ust-sag { display: flex; gap: 8px; }
#gc-gok-tam-altyazi { min-height: 22px; text-align: center; font-size: 14px;
    color: #e8d5a8; margin-top: 8px; }

/* ═══════════════════════════════════════════════════════════════════════════
   PARÇALI OTURUM — görünüm (23 Ağu 2026)
   Bir oturum, birçok parça, tek kayıt ekranı. Eklenen her şey bugünkü
   kadranın, yuvarlak düğmelerin ve 4 sn'de solan kontrollerin diline
   yerleşir: kilit ve ＋ yok; kilit halkada uydu, GEÇ üçüncü yuvarlak,
   üç kutu kadranın altında. Ekranda kalıcı hiçbir şey artmaz.
   ⚠️ Yeni kimliklerin hepsinde [hidden] kalkanı var: bu dosyadaki genel
   seçiciler (.controls button{display:flex} gibi) tarayıcının
   [hidden]{display:none} kuralını ezebiliyor (9 Ağu dersi).
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Kilit uydusu ─────────────────────────────────────────────────────── */
#kilit-uydu {
    /* 🔴 İKİ UYDU 10 PX KAÇIKTI (7 Eyl provasında ölçüldü: kilit x=298,
       göz x=308). Aynı köşede, aynı ailede, tek sütunda durmalılar. Göz
       24 Ağu'da bilerek bir tık DIŞA alınmıştı (çemberin yayına biniyordu);
       hizalama o yüzden GÖZE göre yapıldı — kilit de dışa geldi, ikisi de
       çemberin dışında kaldı. */
    position: absolute; top: 4%; right: 0.5%; width: 26px; height: 26px; z-index: 3;
    border-radius: 50%; display: flex; align-items: center; justify-content: center;
    padding: 0; line-height: 1; cursor: pointer;
    background: rgba(10,14,26,.92); border: 1px solid var(--glass-border); color: #8496b3;
    transition: opacity .6s ease, box-shadow .3s ease, border-color .3s ease;
}
#kilit-uydu[hidden] { display: none !important; }
/* Emoji (🔓/🔒) 13 px'te iki ayrı şey söylemiyordu; çizgi ikon söylüyor. */
#kilit-uydu svg { width: 15px; height: 15px; display: block; }
#kilit-uydu.acik { color: #8ef0ff; border-color: rgba(0,242,254,.45); box-shadow: 0 0 10px rgba(0,242,254,.3); }
#kilit-uydu.kapali { color: #ffd54f; border-color: rgba(255,213,79,.5); box-shadow: 0 0 10px rgba(255,213,79,.3); }
#kilit-uydu.yanip { animation: kilit-yanip 1s ease-in-out 3; }
@keyframes kilit-yanip { 0%,100% { opacity: 1; transform: scale(1); } 50% { opacity: .25; transform: scale(.88); } }
/* Kontroller solunca kilit %18 iz olarak kalır — tamamen kaybolmaz. */
.container.focus-layout.controls-dim #kilit-uydu { opacity: .18; }
.container.focus-layout.controls-dim #kilit-uydu.yanip { opacity: 1; }

/* ═══ SÜRE UYDUSU — kilidin altında, aynı ölçüde (24 Ağu gecesi) ══════════
   Akan süreyi saklama Kyron'un gözlerinden alındı (orası çalışmıyordu ve
   keşfedilemezdi), kendi ikonuna kavuştu. Kapalı göz = süre gizli. */
#sure-uydu {
    /* Konum HALKAYA DEĞMEYECEK biçimde (24 Ağu gecesi, kullanıcı bulgusu):
       kilidin tam altına konunca çember aşağı doğru şiştiği için göz yayın
       üstüne biniyordu. Bir tık DIŞA ve yukarı alındı — ikisi de çemberin
       dışında, aynı köşede duruyor. */
    /* 🔴 ARALIK 3 PX'Tİ (7 Eyl provası): iki uydu neredeyse bitişikti ve
       hiçbirine 44'lük dokunma payı verilemiyordu — pay komşunun görünen
       dairesini yerdi. Aralık 18'e çıktı; ikisi de kendi payını alıyor,
       ikisi de hâlâ çemberin dışında. */
    position: absolute; top: calc(4% + 44px); right: 0.5%; width: 26px; height: 26px; z-index: 3;
    border-radius: 50%; display: flex; align-items: center; justify-content: center;
    padding: 0; cursor: pointer;
    background: rgba(10,14,26,.92); border: 1px solid var(--glass-border); color: #8496b3;
    transition: opacity .6s ease, box-shadow .3s ease, border-color .3s ease, color .3s ease;
}
#sure-uydu[hidden] { display: none !important; }
#sure-uydu svg { width: 15px; height: 15px; display: block; }
#sure-uydu.gizli { color: #F5D67B; border-color: rgba(245,214,123,.5); box-shadow: 0 0 10px rgba(245,214,123,.28); }
.container.focus-layout.controls-dim #sure-uydu { opacity: .18; }

/* Süre gizliyken rakamın yerini alan satır: ince, nefes alan tek kelime. */
#sure-gizli-yazi {
    font-size: .82em; font-weight: 300; letter-spacing: 2.4px; color: #b8a97a;
    animation: sure-gizli-nefes 4.5s ease-in-out infinite;
}
#sure-gizli-yazi[hidden] { display: none !important; }
#timer.eriyor { opacity: .2; filter: blur(2px); transition: opacity .26s ease, filter .26s ease; }
@keyframes sure-gizli-nefes { 0%,100% { opacity: .7; } 50% { opacity: 1; } }
.dial-core.sure-gizli #timer,
.dial-core.sure-gizli #progress-text { display: none !important; }
@media (prefers-reduced-motion: reduce) { #sure-gizli-yazi { animation: none; } }

#kilit-balon {
    position: absolute; top: calc(4% + 30px); right: 2%; width: min(210px, 70%); z-index: 4;
    background: rgba(20,26,40,.97); border: 1px solid var(--glass-border); border-radius: 12px;
    padding: 8px 10px; font-size: .72em; line-height: 1.45; color: #cbd5e1; text-align: left;
    box-shadow: 0 8px 24px rgba(0,0,0,.5);
}
#kilit-balon[hidden] { display: none !important; }
#kilit-balon b { color: #e8eefc; }

/* ── Akan süreyi sakla (Kyron'un gözleri) ─────────────────────────────── */
#current-avatar { cursor: pointer; }
/* "Akan süreyi gizle" 24 Ağu akşamı söküldü — kadranda süre hep görünür. */
#goz-ipucu {
    position: absolute; left: 0; right: 0; bottom: -22px; text-align: center;
    font-size: .66em; color: #a8b6cc; letter-spacing: .4px; pointer-events: none;
    animation: goz-ipucu 3s ease-in-out forwards;
}
#goz-ipucu[hidden] { display: none !important; }
#goz-ipucu b { color: #F5D67B; font-weight: 600; }
@keyframes goz-ipucu { 0% { opacity: 0; } 15% { opacity: 1; } 80% { opacity: 1; } 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
    #kilit-uydu.yanip { animation: none; }
}

/* ══ ŞERİT — SABİT ÜÇ KUTU ═══════════════════════════════════════════════
   Kaydırmalı üç sayfa denendi ve GERİ ALINDI (24 Ağu): "sağa sola hareketler
   sadeliği çok bozdu". Şerit tek işine döndü: ÇALIŞMA · TEST · ANALİZ.
   Kaynak · not · gündem · konu buradan çıktı (yerleri ayrı tasarım turunda).
   Kapalı hâl (hap) ve 20 sn'lik otomatik kısalma duruyor. */
/* ═══ ODAK ŞERİDİ (29 Ağu 2026) ══════════════════════════════════════
   Tür · süre · konu adı · araçlar TEK çubukta. Görünen kap burası; içindeki
   hap kendi çerçevesini bırakır ki iki ayrı hap gibi durmasın. */
/* Dış satır: [ şerit ] [ araçlar ] — araçlar şeridin DIŞINDA. */
#odak-satir {
    display: none; align-items: center; justify-content: center; gap: 7px;
    margin: 4px auto 0; max-width: 96%; transition: opacity .6s ease;
}
.container.focus-layout #odak-satir { display: flex; }
/* ⚠️ ÖZGÜLLÜK TUZAĞI (29 Ağu, ölçümle bulundu): burası
   `:has(#parca-serit:not([hidden]))` diyordu. `:has()` içindeki KİMLİK
   kuralın ağırlığına sayılır — bu satır iki kimlik ağırlığında oluyor ve
   aşağıdaki açık-kip kuralını (bir kimlik) sessizce eziyordu. Sonuç:
   açık kipte kap flex kalıyor, kutular büzülüyordu (287 px → 211 px).
   Kimliksiz yazıldı; iş aynı, ağırlığı dürüst. */
#odak-satir:has(.pk-hap) { display: flex; }
.container.focus-layout.controls-dim #odak-satir { opacity: .55; }
/* ŞERİDİN NEFESİ (29 Ağu): 5 dakikada bir 4 saniyeliğine tam görünür.
   YALNIZ şerit — düğmeler sönük kalır, yanlış dokunma riski doğmaz. */
.container.focus-layout.controls-dim.serit-nefes #odak-satir { opacity: 1; }
/* BAĞLAM SATIRI ŞERİTLE AYNI RİTİMDE (29 Ağu). Çalışırken `nefesli` olur:
   ekran sönünce o da söner, nefes anında şeritle birlikte belirir.
   Duraklamada `nefesli` düşer → satır kalıcı durur (hesap anı). */
#gun-toplam.nefesli { transition: opacity .6s ease; }
.container.focus-layout.controls-dim #gun-toplam.nefesli { opacity: 0; }
.container.focus-layout.controls-dim.serit-nefes #gun-toplam.nefesli { opacity: 1; }
/* 🔑 SÖNÜKKEN DE DOKUNULUR (29 Ağu arızası): şerit %55 görünürken
   `pointer-events:none` kalmıştı — ikonlar görünüyor ama ölüydü, dokunmak
   hiçbir şey açmıyordu. Görünen şey dokunulabilir olmalı (panjur dersi). */
.container.focus-layout.controls-dim #odak-satir { pointer-events: auto; }

#odak-serit {
    display: flex; align-items: center; justify-content: center; gap: 6px;
    padding: 4px 10px; min-width: 0; flex: 0 1 auto;
    border-radius: 99px; border: 1px solid rgba(0,242,254,.22);
    background: rgba(0,242,254,.05);
    /* Güvenlik ağı (2 Eyl): şeridin içinden hiçbir şey dışarı taşmaz —
       kayan ad da, uzun kip adı da kabın kenarında biter. */
    overflow: hidden; max-width: 100%;
}
/* Açık kipte kap düz bloğa döner ve kutuları taşır: orada kırpma kapanır. */
#odak-serit:has(.pk-kutular) { overflow: visible; }
/* ═══ AÇIK KİP — ŞERİDİN TAMAMI ÇEKİLİR (29 Ağu, eski davranışa dönüş) ══
   Hapa dokununca üç kutu açılır. Eski sürümde şerit o an tümüyle kaybolur,
   yerini kutular alırdı. İlk denemede konu adını ve araçları kutuların
   üstünde bıraktım — kullanıcı "hiç iyi olmadı" dedi ve haklıydı: seçim
   yaparken konu adına da araçlara da bakılmıyor, ikisi de gürültü.
   🔑 KURAL: açıkken ekranda YALNIZ üç kutu ve tutma çizgisi vardır.
   Şerit küçülünce (hap) konu adı ve araçlar kendiliğinden geri gelir. */
#odak-serit:has(.pk-kutular) {
    /* Açıkken kap DÜZ BLOK olur: satır dizilimindeyken genişliği içerik
       belirliyor ve kutular büzülüyordu (287 px → 211 px, ölçüldü).
       Blok olunca #parca-serit eski hâlindeki gibi %92'ye yayılır. */
    display: block; border: 0; background: none; padding: 0; width: 100%;
}
#odak-serit:has(.pk-kutular) #focus-info { display: none; }
/* ⚠️ ÖZGÜLLÜK (29 Ağu ölçümü): bu kural eskiden `#odak-satir:has(...)`
   diye yazılıydı ve `.container.focus-layout #odak-satir { display:flex }`
   ondan güçlü olduğu için HİÇ İŞLEMİYORDU. Sonuç sessizdi: açık kipte kap
   flex kalıyor, kutular içeriğe göre büzülüyordu — şerit 287 px yerine
   211 px'e düşmüş, yazılar alt satıra kaçtığı için kutular uzamıştı.
   Açık kipte kap eski ölçüsüne döner: genişliği #parca-serit'in kendi
   %92 kuralı belirler (eski davranışın aynısı). */
.container.focus-layout #odak-satir:has(.pk-kutular),
#odak-satir:has(.pk-kutular) { display: block; max-width: 100%; }
#odak-satir:has(.pk-kutular) #odak-araclar { display: none; }
#odak-araclar[hidden] { display: none !important; }
/* Şerit içindeki hap: çerçevesiz, zeminsiz — kap zaten çizili. */
/* Hap ve kabı şeridin İÇİNDE üst boşluk taşımaz: `margin: 2px auto 0`
   ÇALIŞMA yazısını konu adının 2 px altına düşürüyordu (kullanıcı gördü). */
#odak-serit .pk-hap { border: 0; background: none; margin: 0; padding: 0 2px; }
/* Hap satır içi bir öğe olduğu için altında satır boşluğu kalıyor ve
   ÇALIŞMA yazısı konu adından ~3 px aşağı düşüyordu (kullanıcı gördü).
   Kap hizalı dizilime alınınca boşluk kalkar. */
#odak-serit #parca-serit:has(.pk-hap) { display: flex; align-items: center; margin: 0; }
/* 🔴 "ÇALIŞMA · 06:18" İKİ SATIRA BÖLÜNMEZ (29 Ağu, kullanıcı gördü):
   sarma yüzünden yazı konu adının altına sarkıyordu. Dar yerde kısalması
   gereken KONU ADIDIR — o zaten üç noktayla kısalıyor ve kayabiliyor. */
.pk-hap .pk-t { white-space: nowrap; }
#odak-serit .pk-hap { flex: none; }
#odak-serit .fi-ad { flex: 0 1 auto; }
#odak-serit:has(.pk-kutular) #parca-serit { margin: 2px auto 0; }
#odak-serit .pk-hap.analiz { background: none; }
/* Analiz parçasında kabın rengi kehribara döner (dilin aynısı korunuyor). */
#odak-serit:has(.pk-hap.analiz) { border-color: rgba(255,213,79,.34); background: rgba(255,213,79,.06); }
#odak-serit #parca-serit[hidden] + #focus-info { padding-left: 0; }

#parca-serit { margin: 2px auto 0; max-width: 92%; transition: opacity .6s ease; }
#parca-serit[hidden] { display: none !important; }

.pk-kutular { display: flex; gap: 4px; }
.pk-kutu {
    flex: 1; min-width: 0; padding: 5px 3px; text-align: center; line-height: 1.3; cursor: pointer;
    font-size: .58em; font-weight: 700; letter-spacing: .6px; color: #6d7c96;
    background: rgba(255,255,255,.025); border: 1px solid var(--glass-border); border-radius: 9px;
    transition: background .25s ease, border-color .25s ease, color .25s ease;
    /* YÜKSEKLİK SABİT (24 Ağu gecesi, kullanıcı bulgusu): "soru çözümü ya da
       analiz butonuna iki kez basınca kutu biraz yukarı kayıyor." Kutunun
       içindeki yazı değişince (alt satır dolup boşalınca) şeridin boyu
       oynuyordu, altındaki her şey kayıyordu. Bu dört satır o onarım —
       AYRI bir `.pk-kutu` bloğundaydı, 24 Ağu'da buraya taşındı (bekçi
       çakışma diye bağırıyordu; özellikleri çakışmıyordu ama ayrı durmaları
       kırılgandı: ana bloğa `display` yazan biri onarımı sessizce öldürürdü). */
    min-height: 56px; display: flex; flex-direction: column;
    align-items: center; justify-content: center;
}
.pk-kutu .pk-sn { display: block; font-size: 1.25em; font-weight: 800; color: #9db0cc; margin-top: 1px; letter-spacing: .5px; font-variant-numeric: tabular-nums; }
.pk-kutu .pk-alt { display: block; font-size: .86em; color: #6d7c96; font-weight: 600; letter-spacing: .2px; margin-top: 1px; min-height: 1.1em; text-transform: none; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pk-kutu.dolu .pk-sn { color: #cbd5e1; }
.pk-kutu.aktif { background: rgba(0,242,254,.12); border-color: rgba(0,242,254,.4); color: var(--success); }
.pk-kutu.aktif .pk-sn { color: var(--success); }
.pk-kutu.aktif .pk-alt { color: #8ef0ff; }
.pk-kutu.analiz.aktif { background: rgba(255,213,79,.13); border-color: rgba(255,213,79,.45); color: #ffd54f; }
.pk-kutu.analiz.aktif .pk-sn, .pk-kutu.analiz.aktif .pk-alt { color: #ffd54f; }
.pk-kutu.pasif { opacity: .4; cursor: default; }
/* ═══ ANALİZ KİLİDİ — kutu sönük ama SEBEBİ OKUNUR (25 Ağu, kullanıcı bulgusu) ═══
   "Önce soru çöz" yazısı ANALİZ kutusunun içindeydi ama görünmüyordu: kilit
   `pasif` ile çiziliyordu ve `pasif` bütün kutuyu %40'a düşürüyordu — sebep de
   onunla birlikte sönüyordu. Kilit artık kendi sınıfında: kutu kısık, yazı
   okunur. (`pasif` yalnız RİTİM MOLASI için kaldı.) */
.pk-kutu.kilitli { opacity: .78; cursor: default; }
.pk-kutu.kilitli .pk-sn { color: #4d5871; }
.pk-kutu.kilitli .pk-alt { color: #9fb0c8; opacity: 1; font-weight: 700; }
.pk-kutu.yanip { animation: pk-yanip .6s ease-in-out 2; }
@keyframes pk-yanip { 50% { background: rgba(255,255,255,.12); } }

/* ═══ ANALİZ KİLİDİ AÇILDI — tek seferlik altın nefes (27 Ağu) ═══════════
   `pk-yanip`in kardeşi: aynı süre, aynı ritim, farklı renk. Beyaz nefes
   "bak buraya" der; altın nefes "ANALİZ açıldı" der — çünkü analiz kutusu
   seçilince zaten altın oluyor. Öğrenci neyin açıldığını renkten anlıyor.
   Yeni bir hareket dili DOĞMUYOR; var olanın rengi değişiyor. */
.pk-kutu.analiz.acildi { animation: pk-acildi .6s ease-in-out 2; }
@keyframes pk-acildi {
    50% { background: rgba(255,213,79,.16); border-color: rgba(255,213,79,.45); color: #ffd54f; }
}
@media (prefers-reduced-motion: reduce) {
    /* Hareket istemeyene parıltı YOK — ama kutu zaten açılmış durumda,
       bilgi kaybolmuyor (kilit yazısı silinmiş oluyor). */
    .pk-kutu.analiz.acildi, .pk-kutu.yanip { animation: none; }
}

/* ⚠️ Araç/konu sayfalarının (altın·mor) ve kaydırma göstergelerinin CSS'i
   SÖKÜLDÜ — kaydırmalı şerit geri alındı (24 Ağu). Yeniden gerekirse
   `_docs/kronometre-kaydirmali-serit-gelistirme-24agu26.html` maketinde duruyor. */

/* Şeridi kapatma kulpu (hap moduna) */
.pk-tut { display: flex; justify-content: center; align-items: center; padding: 5px 0 3px; min-height: 18px; cursor: pointer; }
.pk-tut i { width: 40px; height: 4px; border-radius: 2px; background: rgba(255,255,255,.16); pointer-events: none; }
.pk-tut:active i { background: rgba(255,255,255,.38); }
/* Kapalı hâl: tek hap */
.pk-hap {
    display: inline-flex; align-items: center; gap: 8px; margin: 2px auto 0; padding: 5px 12px; cursor: pointer;
    border-radius: 99px; border: 1px solid rgba(0,242,254,.3); background: rgba(0,242,254,.07);
    font-size: .62em; font-weight: 700; color: #8ef0ff; letter-spacing: .4px; max-width: 100%;
}
.pk-hap.analiz { border-color: rgba(255,213,79,.4); background: rgba(255,213,79,.08); color: #ffd54f; }
/* Üç noktanın (.pk-n) stilleri 29 Ağu'da SİLİNDİ — noktalar aynı gün
   kaldırılmıştı (kullanıcı kararı: şerit konu adını da taşıyor, yer ona
   lazım). Ekranda karşılığı olmayan kural bırakmıyoruz: sonraki turda
   "bu ne?" diye bakılıp yanlış onarıma yol açıyor. */
.pk-hap .pk-ok { font-size: .9em; opacity: .8; }
.pk-hap.yanip { animation: pk-yanip .6s ease-in-out 2; }
/* Analiz parçası sürerken kadran kehribar (mevcut analysis-mode dilinin aynısı). */
.container.focus-layout.parca-analiz #timer { color: #ffd54f; text-shadow: 0 0 20px rgba(255,193,7,.45); }
.container.focus-layout.parca-analiz .dial-arc .fill { filter: drop-shadow(0 0 6px rgba(255,213,79,.5)); }

/* ── GEÇ düğmesi + çember ─────────────────────────────────────────────── */
#btn-gec {
    width: 68px; height: 68px; font-size: .58em; line-height: 1.15; white-space: pre-line;
    border-style: dashed; background: rgba(255,255,255,.03); border-color: var(--glass-border);
    color: #8fa2bf; position: relative;
}
#btn-gec[hidden] { display: none !important; }
#btn-gec:not(:disabled):hover { background: rgba(255,255,255,.1); color: #cbd5e1; }
#btn-gec.acik { border-style: solid; border-color: rgba(0,242,254,.5); color: #caf9ff; background: rgba(0,242,254,.08); }
/* Kaynak seçiliyse kenarda altın nokta: "içeride bir şey var". */
#btn-gec .gec-nokta { position: absolute; top: 6px; right: 8px; width: 6px; height: 6px; border-radius: 50%; background: #d4af6a; box-shadow: 0 0 6px rgba(212,175,106,.8); }
@media (max-width: 340px) { #btn-gec, #btn-end { width: 56px; height: 56px; font-size: .62em; } }
#controls { position: relative; }
.container.focus-layout.cember-acik #btn-end,
.container.focus-layout.cember-acik .primary-slot { opacity: .35; pointer-events: none; }
#gec-cember { position: absolute; inset: 0; pointer-events: none; z-index: 5; }
#gec-cember[hidden] { display: none !important; }
.gc-uydu {
    position: absolute; width: 30px; height: 30px; margin: -15px 0 0 -15px; border-radius: 50%; pointer-events: auto;
    display: flex; align-items: center; justify-content: center; font-size: .82em; cursor: pointer; padding: 0;
    border: 1px solid var(--glass-border); background: rgba(10,14,26,.97); color: #9db0cc;
    box-shadow: 0 4px 12px rgba(0,0,0,.4); transition: transform .18s ease, opacity .18s ease;
    transform: translate(var(--gc-dx, 0), var(--gc-dy, 0)) scale(1);
}
#gec-cember.kapaniyor .gc-uydu { transform: translate(0,0) scale(.4); opacity: 0; }
.gc-uydu.kay { font-size: .58em; font-weight: 800; letter-spacing: .3px; color: #ecd6a8; border-color: rgba(212,175,106,.5); background: rgba(40,32,16,.97); }
.gc-uydu.kay.bos { color: #6d7c96; border-style: dashed; background: rgba(10,14,26,.97); font-weight: 600; }
.gc-uydu.konu { color: #8ef0ff; border-color: rgba(0,242,254,.45); font-size: .95em; }
.gc-uydu:active { transform: translate(var(--gc-dx, 0), var(--gc-dy, 0)) scale(.92); }

/* ═══ YAZI ÖLÇÜSÜ — KAYIT AİLESİNİN TEK DEFTERİ (4 Eyl · ADIM 4) ══════
   Kullanıcı kararı (maket §4): "Kalın yazı ekranı ağırlaştırıyordu."
   Yeni ölçü: başlıklar 500 · gövde 300 · sayılar 400–500 ve HİZALI RAKAM
   (12 ile 99 aynı genişlikte durur, sütun oynamaz).
   🔒 KALIN (700–800) YALNIZ TEK YERDE KALIR: kadranın süresi. Rengi zaten
   o taşıyor; başka her yerde kalınlık "bak bana" demekten başka iş görmüyor
   ve ekranda beş yerden birden bağırınca hiçbiri duyulmuyordu.

   Ölçü burada, kullanım her yerde `var(...)`: bir gün "gövde 300 fazla
   ince" denirse tek satır değişir, üç ekran birden döner. Değer `:root`ta
   çünkü kart ailesi üç ayrı kapta yaşıyor (kayıt perdesi · parçalı liste ·
   düzeltme perdesi) ve hiçbiri ötekinin içinde değil. */
:root {
    --yz-baslik: 500;   /* ad · tür adı · çip · düğme yazısı */
    --yz-govde: 300;    /* açıklama · not · etiket */
    --yz-sayi: 500;     /* süre · doğru/yanlış/boş · sayfa */
}

/* ── Parçalı kayıt ekranı ─────────────────────────────────────────────── */
#parca-kayit[hidden] { display: none !important; }
/* ═══ PARÇALI KAYIT EKRANI (24 Ağu akşamı — işçilik turu) ══════════════
   Kullanıcı: "kaydet kısmı tasarımını biraz daha güzelleştir, güzel bir
   işçilik yapıldığı belli olsun." Değişenler:
     • konu kartının başlığı ayrı bir şerit oldu (ince alt çizgi + toplam süre)
     • parça satırında emoji yerine çizgi ikon, ikon kendi yuvasında
     • d/y/b ve zorluk satırları girintili bir "iç blok"ta, sol kenarında
       ince bir çizgi — hangi parçaya ait olduğu göz ucuyla anlaşılıyor
     • en altta TOPLAM şeridi (kaç konu · kaç parça · toplam süre)              */
.pk-grup {
    background: linear-gradient(180deg, rgba(255,255,255,.045), rgba(255,255,255,.022));
    border: 1px solid var(--glass-border); border-radius: 16px;
    padding: 0 0 10px; margin: 0 0 10px; overflow: hidden;
}
.pk-grup-bas {
    font-weight: var(--yz-baslik); color: #e8eefc; font-size: .9em;
    display: flex; align-items: center; gap: 9px;
    padding: 11px 13px 10px; margin: 0;
    border-bottom: 1px solid rgba(255,255,255,.07);
    background: rgba(255,255,255,.022);
}
.pk-grup-bas .pk-grup-ad { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.pk-grup-bas .pk-grup-dk { flex: none; font-size: .92em; font-weight: var(--yz-sayi); color: var(--success); letter-spacing: .3px; font-variant-numeric: tabular-nums; }

/* ── GÜNDEM SAATİ (24 Ağu) — "buraya ne zaman dönelim?" ──────────────
   Çalışmanın ortasındaki çan kalktı; soru artık kapanışta, konunun
   satırında soruluyor. Boşken sessiz bir saat; kurulunca dolu yanar ve
   ne zamana yazıldığını yazar. */
.pk-gnd {
    flex: none; display: inline-flex; align-items: center; gap: 5px;
    height: 27px; padding: 0 9px; border-radius: 99px; cursor: pointer;
    border: 1px solid rgba(255,213,79,.3); background: transparent; color: var(--warning, #ffce5c);
    font-size: .82em; font-weight: var(--yz-baslik); transition: background .2s ease, border-color .2s ease;
}
.pk-gnd svg { width: 15px; height: 15px; display: block; }
.pk-gnd.dolu { background: rgba(255,213,79,.16); border-color: rgba(255,213,79,.6); }
.pk-gnd .pk-gnd-yazi { white-space: nowrap; }
.pk-gnd:active { background: rgba(255,213,79,.24); }

/* ── parça satırı ── */
.pk-satir {
    display: flex; justify-content: space-between; align-items: center; gap: 10px;
    padding: 9px 13px 8px; font-size: .84em; color: #9db0cc;
}
.pk-satir .pk-ad { flex: 1; min-width: 0; display: flex; align-items: center; gap: 9px; }
.pk-satir .pk-tur-ad { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #cbd5e1; font-weight: var(--yz-baslik); }
.pk-satir .pk-tur-ad small { color: #7f8ea8; font-weight: 400; }
.pk-ik {
    width: 26px; height: 26px; flex: none; border-radius: 9px;
    display: flex; align-items: center; justify-content: center;
    border: 1px solid rgba(255,255,255,.08); background: rgba(255,255,255,.035); color: #8395b1;
}
.pk-ik svg {
    width: 15px; height: 15px; display: block; fill: none; stroke: currentColor;
    stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
}
.pk-satir .pk-dk { color: #e8eefc; font-weight: var(--yz-sayi); white-space: nowrap; font-size: 1.02em; font-variant-numeric: tabular-nums; }
.pk-satir.atlandi { opacity: .42; }
.pk-satir.atlandi .pk-dk { color: #9db0cc; font-weight: var(--yz-govde); }
/* 🔴 3 Eyl akşamı — PİL SATIRI KAPLIYORDU. Genel `button { flex: 1 }` kuralı
   bu düğmeye de uygulanıyordu: kitabın adı için yapılmış küçük bir hap,
   satırın bütün boşluğunu yutup ortasında "KAR" yazan dev bir kutuya
   dönüşmüştü. `flex: none` = "boyum yazım kadar". */
.pk-pil {
    flex: none; max-width: 45%;
    display: inline-flex; align-items: center; justify-content: center; min-width: 34px; height: 24px; padding: 0 10px; cursor: pointer;
    border-radius: 8px; font-size: .66em; font-weight: var(--yz-baslik); letter-spacing: .2px;
    overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
    border: 1px solid rgba(212,175,106,.5); color: #ecd6a8; background: rgba(212,175,106,.1);
}
.pk-pil.bos { color: #6d7c96; border-color: var(--glass-border); border-style: dashed; background: transparent; font-weight: var(--yz-baslik); }

/* ── parçanın iç bloğu: d/y/b · zorluk · analiz ── */
.pk-ic {
    margin: 0 13px 4px 48px; padding: 2px 0 2px 11px;
    border-left: 2px solid rgba(255,255,255,.07);
}
.pk-dyb { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: .78em; color: #7f8ea8; padding: 5px 0; font-weight: var(--yz-govde); }
/* Satırın SAĞ sütunu: kutular/çipler yan yana. Kart içinde bu hizalama
   satır içi biçimle yazılıydı; perdeye taşınınca kural gerekti — ölçü artık
   bir SINIFTA duruyor, iki ekran da onu kullanıyor (4 Eyl). */
.pk-sag { display: inline-flex; align-items: flex-end; gap: 6px; }
/* ═══ HER HANENİN KENDİ ADI ÜSTÜNDE (7 Eyl 2026, kullanıcı kararı) ═════════
   🔴 ARIZA: satırın SOL ucunda tek bir "D / Y / B" etiketi, SAĞ ucunda üç
   kutu vardı ve arada ~200 px boşluk. Hangi kutunun hangisi olduğu yalnız
   okuma sırasına güveniyordu; yanlış haneye yazan öğrenci bunu göremiyordu.
   🔑 Ad hanenin ÜSTÜNDE durur — sayı kutularının anayasa maddesi. */
.pk-hane { display: inline-flex; flex-direction: column; align-items: stretch; gap: 3px; }
.pk-hane > i {
    font-style: normal; font-size: .82em; line-height: 1; text-align: center;
    color: #7f8ea8; font-weight: var(--yz-govde); letter-spacing: .01em;
}
.pk-hane > i.y { color: #c88; }
/* Gölge sıfır: yazılmış bir sayı değil, "dokunmazsan yok" demenin sessiz
   yolu. Öğrenci silmek zorunda kalmaz; ilk rakam gölgenin yerine geçer. */
.pk-dyb .pk-num::placeholder { color: #4b5772; opacity: 1; }
/* Satır içi ölçüler defterine alındı (ADIM 4): "8 piksel boşluk" gibi
   kararlar HTML'in içine yazılınca ne yazı ölçüsüne ne dar ekran kurallarına
   uyuyor — onları EZİYOR. Üç ek: aralık · bitişik · sola yaslı. */
.pk-kart-satir.aralikli, .pk-cipler.aralikli, .pk-kart-alt.aralikli { margin-top: 8px; }
.pk-kart-alt.bitisik { margin-bottom: 4px; }
.pk-dyb.solda { justify-content: flex-start; gap: 8px; }
.dz-aciklama.aralikli { margin: 0 0 12px; }
/* 🔑 PARMAK ÖLÇÜSÜ TEK YERDE (4 Eylül 2026, kullanıcı kararı): en çok
   dokunulan kutu en küçük hedef olamaz. Kutu 44 px — hem kayıt kartında hem
   perdede (sayaçsız giriş · düzeltme) aynı ölçü, çünkü aynı sınıf. */
.pk-dyb .pk-num {
    /* 🔴 ÜÇ AYRI BOY (7 Eyl, gezinti raporu 4. madde): temel 48 px'ti ama İKİ
       ekran onu eziyordu (kayıt kartı ve düzeltme perdesi 54 px). "Ölçü tek
       yerde" cümlesi yazılıydı, altında iki ezme duruyordu. Tek sayı: 54 —
       iki ekranın zaten kullandığı, parmağa daha yakın olan. */
    width: 54px; min-height: 44px; padding: 7px 4px; text-align: center;
    font-size: 1.08em; font-weight: var(--yz-sayi); font-variant-numeric: tabular-nums;
    border-radius: 11px; background: rgba(255,255,255,.05); border: 1px solid var(--glass-border);
    color: #e8eefc; caret-color: transparent; cursor: pointer; transition: border-color .18s ease;
}
.pk-dyb .pk-num.active { border-color: var(--success); box-shadow: 0 0 0 2px rgba(0,242,254,.12); }
.pk-dyb .pk-num.y { color: #f99; }
/* SAYFA SATIRI (3 Eyl) — parçalı kayıtta doğru/yanlış/boş satırının kardeşi.
   Aynı kutu ölçüsü, aynı hizalama; altın yalnız GEREKÇEDE ("koçun istiyor")
   konuşur, kutuları boyamaz. */
.pk-sayfa i { font-style: normal; }
/* Elle giriş + düzeltme: sayfa aralığı satırı (3 Eyl) — kaydet ekranındaki
   biçimin bu perdedeki karşılığı. Kutular dar, ok sessiz, ilerleme gri. */
.dz-sayfa-satir { display: flex; align-items: center; gap: 8px; }
.dz-sayfa-satir .dz-saat { flex: 0 0 84px; text-align: center; }
.dz-sayfa-satir .dz-ok { color: #64748b; }
.dz-sayfa-satir .dz-bolu { font-style: normal; font-size: .8em; color: #64748b; white-space: nowrap; }
.dz-sayfa-not { margin-top: 6px; font-size: .74em; color: #64748b; }
.dz-sayfa-not b { color: #cbb488; font-weight: var(--yz-baslik); }

/* DIŞ KAYNAK DETAYI (4 Eyl) — sayfa kutularının tam yerinde duran serbest
   etiket. Sayı kutusu DEĞİL: gerçek klavye ister, o yüzden geniş ve sola
   hizalı; caret görünür (öbürlerinde tuş takımı açıldığı için gizli). */
.pk-dyb .pk-detay {
    flex: 1 1 auto; min-width: 0; margin-left: 10px;
    padding: 7px 9px; font-size: .95em; font-family: inherit;
    border-radius: 9px; background: rgba(255,255,255,.05);
    border: 1px solid var(--glass-border); color: #e8eefc;
}
.pk-dyb .pk-detay::placeholder { color: #5b6a80; }
.pk-dyb .pk-detay:focus { outline: none; border-color: rgba(212,175,106,.45); }

.pk-sayfa-not { font-size: .72em; color: #64748b; padding: 0 0 6px 0; font-weight: var(--yz-govde); }
/* Kartın içindeki açıklama satırı — "en son 111. sayfa", "süre yalnız bugün
   düzeltilir" gibi. Sessiz durur: satırı şişirmez, kutuların dikkatini
   çalmaz (4 Eyl · üç ekranda aynı sınıf). */
.pk-not { font-size: .74em; color: #64748b; padding: 2px 0 7px; line-height: 1.5; font-weight: var(--yz-govde); }
/* ═══ EKSİK UYARISI — EKSİK OLAN KUTUNUN ALTINDA (4 Eyl kullanıcı kararı) ══
   "Pencere değil, düğmenin üstü de değil." Pencere hem işi keser hem YERİ
   söylemez: öğrenci pencereyi kapatıp eksik kutuyu arar. Uyarı kutunun
   altında dursa zaten görecekti.
   Sesi alçak: altın bir çizgi ve ince bir cümle. Kırmızı DEĞİL — eksik bir
   hata değil, henüz yazılmamış bir şey. */
.pk-eksik {
    display: flex; gap: 7px; padding: 0 0 8px; line-height: 1.5;
    font-size: .78em; font-weight: var(--yz-govde); color: #e6d5ac;
}
.pk-eksik[hidden] { display: none; }
.pk-eksik::before {
    content: ""; flex: none; width: 3px; border-radius: 2px; background: rgba(212,175,106,.5);
}
.pk-eksik b { color: #f0dfb6; font-weight: var(--yz-baslik); }
/* 🔒 ÖLÜ DÜĞME YOK: eksik varken KAYDET sönük ama DOKUNULUR — dokununca
   eksik kutuya götürür. Sebep zaten o kutunun altında yazılı. */
/* Kayıt ekranının alt yanı — yalnız "kayda devam" hâlinde doğar. Yıkıcı
   eylem KAYDET'in yanında değil ALTINDA ve sessiz durur: renk uyarır, boyut
   bağırmaz. Parmak kaymasıyla saatler silinmesin (maket §1). */
#data-inputs #kayit-alt-yan {
    display: flex; justify-content: space-between; align-items: center; margin-top: 6px;
}
#data-inputs #kayit-alt-yan[hidden] { display: none; }
#data-inputs .ky-tehlike {
    background: none; border: none; font-family: inherit; font-size: .86em;
    font-weight: var(--yz-govde); color: #9a7070; cursor: pointer; padding: 10px 2px;
}
#data-inputs .ky-tehlike:active { color: #c48a8a; }

/* ═══ 🔴 ONAY PENCERESİ HER ŞEYİN ÜSTÜNDE (4 Eyl · ekranda görüldü) ══════
   Ortak perde katmanı 10000; kayıt ekranı ise 10001'de duruyor. Kayıt
   ekranından açılan silme onayı bu yüzden ARKADA doğuyordu: pencere
   gerçekten açılıyor (DOM'da duruyor) ama ekranda hiç görünmüyor —
   öğrenci "1 dakikayı sil"e dokunuyor ve HİÇBİR ŞEY OLMUYOR sanıyor.
   Bu, deftere geçmiş bir tuzak (katman: üstten açılan ekran arkada kalır).
   🔒 Onay HER ZAMAN en üstte: bir soru sorulduysa görünmek zorundadır.
   Tuş takımının (10070) ALTINDA kalır — tuş takımı zaten kendi kapanır. */
#confirm-modal { z-index: 10065; }

/* Perdenin alt boşluğu SÜZÜLEREK kalkar (4 Eyl). Tuş takımı kapanınca 314
   piksellik boşluk bir anda siliniyordu ve kart aşağı DÜŞÜYORDU — kayıt
   ekranındaki kart bunu yıllardır yumuşak yapıyor (`.modal-box`ın kendi
   geçişi), perde yapmıyordu. Aynı davranış, iki yüzey. */
#duzelt-perde .dz-govde { transition: padding-bottom .18s ease; }

/* "Hazır değil" hâli TEK DİL: sönük gri (§1). Eylem rengi geldikten sonra
   çerçeve de sıfırlanmalı — yoksa sönük düğme altın çerçeveyle duruyor ve
   yarı hazır görünüyor (7 Eyl provasında ekranda ölçüldü). */
#btn-submit-next.sonuk, .dz-birincil.sonuk {
    background: rgba(255,255,255,.06); color: #8595b0; box-shadow: none;
    border-color: rgba(255,255,255,.12);
}
.pk-not b { color: #cbb488; font-weight: var(--yz-baslik); }
.pk-sayfa-not b { color: #cbb488; font-weight: var(--yz-baslik); font-style: normal; }
.pk-sayfa > span:first-child i { color: #b99a63; margin-left: 4px; }
.pk-sayfa .pk-ok, .pk-sayfa .pk-bolu { color: #64748b; font-size: .92em; }
.pk-zor { display: flex; align-items: center; justify-content: space-between; gap: 8px; font-size: .78em; color: #7f8ea8; padding: 5px 0; font-weight: var(--yz-govde); }
.pk-cipler { display: inline-flex; gap: 5px; }
.pk-cip {
    border-radius: 11px; padding: 5px 12px; min-height: 44px; font-size: .88em; font-weight: var(--yz-baslik);
    cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
    border: 1px solid var(--glass-border); background: rgba(255,255,255,.04); color: #9db0cc;
    transition: background .18s ease, border-color .18s ease;
}
.pk-cip.secili { background: rgba(0,242,254,.16); border-color: rgba(0,242,254,.55); color: #caf9ff; }
.pk-cip.secili.amber { background: rgba(255,213,79,.18); border-color: #ffd54f; color: #fff2c9; }
.pk-analiz-bilgi { font-size: .78em; color: #ffd54f; padding: 4px 0; }

/* ═══ "KONU BİTTİ" ARTIK BAŞLIK SATIRINDA (3 Eyl, kullanıcı) ═══════════
   Eskiden kartın altında tam genişlik bir kutuydu ve konunun adını bir kez
   daha yazıyordu. Şimdi ad · süre ile aynı satırda, gündem saatinin yanında
   küçük bir hap. Kelimesini taşır ("konu bitti") — işaret yalnız başına
   çizilmez kuralı yerinde. */
.pk-kb {
    flex: none; width: auto; display: inline-flex; align-items: center; gap: 6px;
    padding: 5px 10px; border-radius: 999px; cursor: pointer;
    font-family: inherit; font-size: .68em; font-weight: var(--yz-baslik); letter-spacing: .01em;
    border: 1px solid var(--glass-border); background: rgba(255,255,255,.035); color: #a9b8d0;
    transition: border-color .18s ease, background .18s ease, color .18s ease;
}
.pk-kb .kb-kare {
    flex: none; width: 14px; height: 14px; border-radius: 5px;
    border: 1.5px solid rgba(255,255,255,.28); background: rgba(255,255,255,.03);
    display: flex; align-items: center; justify-content: center; transition: .18s ease;
}
.pk-kb .kb-kare::after {
    content: '✓'; font-size: .62em; line-height: 1; color: #08111f; opacity: 0; transition: opacity .15s ease;
}
.pk-kb:not(:disabled):hover { transform: none; box-shadow: none; background: rgba(255,255,255,.08); }
.pk-kb[aria-pressed="true"] { background: rgba(255,213,79,.14); border-color: rgba(255,213,79,.55); color: #fff2c9; }
.pk-kb[aria-pressed="true"] .kb-kare { background: #ffd54f; border-color: #ffd54f; }
.pk-kb[aria-pressed="true"] .kb-kare::after { opacity: 1; }

/* Uzun ders·konu adı: bir tur akar, sonra başa döner ve DURUR.
   Sağ kenarda sönme "devamı var" der — üç nokta kayan yazıyı kirletirdi. */
.pk-grup-bas .pk-grup-ad { overflow: hidden; white-space: nowrap; min-width: 0; }
.pk-grup-bas .pk-grup-ad > i { display: inline-block; font-style: normal; white-space: nowrap; }
.pk-grup-bas .pk-grup-ad.kayar {
    -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
            mask-image: linear-gradient(to right, #000 calc(100% - 20px), transparent 100%);
}
.pk-grup-bas .pk-grup-ad.kayar > i { animation: pk-kay 9s ease-in-out 1 both; }
@keyframes pk-kay {
    0%, 16%   { transform: translateX(0); }
    50%, 64%  { transform: translateX(var(--pk-kay, 0px)); }
    96%, 100% { transform: translateX(0); }
}
@media (prefers-reduced-motion: reduce) {
    .pk-grup-bas .pk-grup-ad.kayar > i { animation: none; }
}
.pk-bekleyecek { font-size: .78em; color: #ffd54f; padding: 6px 13px 0; display: flex; align-items: center; gap: 7px; }
.pk-bekleyecek:empty { display: none; }
.pk-ik.kucuk { width: 20px; height: 20px; border-radius: 7px; border-color: rgba(255,213,79,.28); background: rgba(255,213,79,.08); color: #ffd54f; }
.pk-ik.kucuk svg { width: 13px; height: 13px; }

/* ── TOPLAM şeridi ── */
/* 🔴 TOPLAM ŞERİDİ KALDIRILDI (4 Eyl, kullanıcı kararı) — biçimi de gitti.
   "1 konu · 3 parça · 21 dk" diyordu; üçü de zaten ekranda (parça satırları
   ve kadran). Aynı gerçeğin iki evi olmaz. Geri gelmeyecek.
   ⚠️ `.pk-num.pk-toplam` BAŞKA BİR İŞ (kitabın toplam sayfa kutusu) — durur. */

/* ── Parçalı kart (konu değiştir · gündem · alt tür) ──────────────────── */
#parca-kart .pk-kart-bas { font-weight: 800; color: #e8eefc; font-size: .95em; margin-bottom: 6px; }
#parca-kart .pk-kart-alt { font-size: .8em; color: #94a3b8; line-height: 1.5; margin-bottom: 10px; }
#parca-kart .pk-kart-satir { display: flex; justify-content: space-between; align-items: center; gap: 8px; padding: 9px 0; border-bottom: 1px dashed rgba(255,255,255,.08); font-size: .86em; color: #cbd5e1; }
#parca-kart .pk-kart-satir:last-of-type { border-bottom: 0; }
#parca-kart .pk-kart-satir b { color: #e8eefc; }
#parca-kart .pk-kart-sec { flex: none; border-radius: 9px; padding: 5px 10px; font-size: .86em; font-weight: 700; cursor: pointer; border: 1px solid var(--glass-border); background: rgba(255,255,255,.05); color: #9db0cc; }
#parca-kart .pk-kart-sec.vurgu { background: rgba(0,242,254,.12); border-color: rgba(0,242,254,.45); color: #caf9ff; }
#parca-kart .pk-kart-dugmeler { display: flex; gap: 8px; margin-top: 12px; }

/* ── TÜR KARTLARI (24 Ağu akşamı) ────────────────────────────────────
   "Ne yapıyorsun?" sorusunun cevabı artık çip değil, kart. İki sütun,
   çizgi ikon, kalın ad, öğrencinin ağzından alt satır. Tek sayıda tür
   olduğunda sonuncusu iki sütunu kaplar ve yan yatar — boş yarım kutu
   kalmasın. */
#parca-kart .tur-izgara { display: grid; grid-template-columns: 1fr 1fr; gap: 7px; margin: 11px 0 2px; }
#parca-kart .tur-kart {
    display: flex; flex-direction: column; align-items: flex-start; gap: 6px;
    padding: 10px 11px 9px; border-radius: 13px; cursor: pointer; text-align: left;
    border: 1px solid rgba(255,255,255,.09); background: rgba(255,255,255,.028);
    font-family: inherit; position: relative; overflow: hidden;
    transition: border-color .18s ease, background .18s ease, transform .12s ease;
}
#parca-kart .tur-kart .tk-ik { width: 19px; height: 19px; flex: none; color: #8395b1; }
#parca-kart .tur-kart .tk-ik svg {
    width: 100%; height: 100%; display: block; fill: none; stroke: currentColor;
    stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
}
#parca-kart .tur-kart .tk-yz { display: flex; flex-direction: column; min-width: 0; }
#parca-kart .tur-kart .tk-yz b { font-size: .88em; font-weight: 700; color: #e8eefc; letter-spacing: .2px; line-height: 1.22; }
#parca-kart .tur-kart .tk-yz small { font-size: .7em; color: #7f8ea8; line-height: 1.28; }
#parca-kart .tur-kart:active { transform: scale(.98); }
#parca-kart .tur-kart.secili {
    border-color: rgba(0,242,254,.45); background: rgba(0,242,254,.085);
    box-shadow: inset 0 0 0 1px rgba(0,242,254,.10);
}
#parca-kart .tur-kart.secili .tk-ik { color: var(--success); }
#parca-kart .tur-kart.secili .tk-yz b { color: #8ef0ff; }
#parca-kart .tur-kart.secili::after {
    content: ''; position: absolute; top: 9px; right: 9px; width: 5px; height: 5px;
    border-radius: 50%; background: var(--success); box-shadow: 0 0 8px rgba(0,242,254,.85);
}
/* Tek sayıda kart: sonuncu iki sütunu kaplar ve yan yatar. */
#parca-kart .tur-izgara .tur-kart:last-child:nth-child(odd) {
    grid-column: span 2; flex-direction: row; align-items: center; gap: 10px; padding: 9px 11px;
}
#parca-kart .pk-kart-dugmeler button { flex: 1; border-radius: 12px; padding: 11px 0; font-size: .82em; font-weight: 800; letter-spacing: .5px; cursor: pointer; border: 1px solid var(--glass-border); background: rgba(255,255,255,.06); color: #cbd5e1; }
#parca-kart .pk-kart-dugmeler button.ana { background: var(--success); color: #07131f; border: 0; }
#parca-kart .pk-kart-dugmeler button:disabled { opacity: .5; }
#parca-kart .pk-cipler.genis .pk-cip { flex: 1; text-align: center; padding: 8px 0; }
#parca-kart .pk-cipler.genis { display: flex; }
#parca-kart .pk-kart-uyari { font-size: .78em; color: #ffb4b4; margin-top: 8px; }

/* ── Başlarken "konu bitti mi?" kartı ─────────────────────────────────── */
#konu-bitti-sor { text-align: left; background: rgba(255,193,7,.07); border: 1px solid rgba(255,193,7,.3); border-radius: 14px; padding: 10px 12px; margin: 0 0 10px; font-size: .82em; color: #cbd5e1; line-height: 1.45; }
#konu-bitti-sor[hidden] { display: none !important; }
/* Soru yalnız seçim ekranında yaşar: blok başlayınca kaybolur (23 Ağu). */
.container.focus-layout #konu-bitti-sor { display: none !important; }
#konu-bitti-sor .ks-bas { font-weight: 800; color: #e8eefc; display: block; margin-bottom: 2px; }
#konu-bitti-sor .ks-dugmeler { display: flex; gap: 6px; margin-top: 8px; }
#konu-bitti-sor .ks-dugmeler button { border-radius: 10px; padding: 6px 10px; font-size: .9em; font-weight: 700; cursor: pointer; border: 1px solid var(--glass-border); background: rgba(255,255,255,.04); color: #9db0cc; }
#konu-bitti-sor .ks-dugmeler button.evet { background: rgba(255,213,79,.18); border-color: #ffd54f; color: #fff2c9; }

/* KONU SIRASI KURULMAMIŞ DERS (25 Ağu) — sönük ama ÖLÜ DEĞİL.
   Öbür sönük satırlar tıklanmaz; bu satır tıklanır ve öğrenciyi o dersin
   konu sıralama sayfasına götürür. İmleç ve ince altın kenar bunu söylüyor:
   "burada yapılacak bir şey var" — yargı değil, davet. */
.dropdown-item.konu-kur {
    cursor: pointer;
    opacity: 0.78;
    border-left: 2px solid rgba(212, 175, 106, 0.55);
}
.dropdown-item.konu-kur:hover {
    opacity: 1;
    background: rgba(212, 175, 106, 0.10);
}

/* KONULARI BİTMİŞ DERS (25 Ağu) — satır İKİ İŞ yapıyor: metin hedefi seçer,
   sağdaki küçük düğme o dersin konu sıralama sayfasını açar. Düğme sessiz
   duruyor (çerçevesiz, altın yazı): asıl iş hâlâ hedefi seçmek; konu eklemek
   ikinci bir yol, dayatma değil. */
.dropdown-item.konu-ekle {
    display: flex; align-items: center; justify-content: space-between; gap: 10px;
}
.di-konu-ekle {
    flex: none; padding: 4px 9px; border-radius: 8px; cursor: pointer;
    font-family: inherit; font-size: 0.8em; font-weight: 700; white-space: nowrap;
    color: #e8d5a8; background: rgba(212, 175, 106, 0.10);
    border: 1px solid rgba(212, 175, 106, 0.32);
}
.di-konu-ekle:hover { background: rgba(212, 175, 106, 0.20); }

/* KONULARI BİTMİŞ DERSİN KAPISI (25 Ağu) — hedef satırının sağında küçük,
   sessiz bir davet. Asıl iş hâlâ hedefi seçmek; konu eklemek ikinci bir yol. */
#hedef-listesi .hl-konu-ekle,
        #duzelt-govde .hl-konu-ekle {
    flex: none; margin-left: 8px; padding: 3px 8px; border-radius: 7px; cursor: pointer;
    font-size: .74em; font-weight: 700; white-space: nowrap;
    color: #e8d5a8; background: rgba(212,175,106,.10); border: 1px solid rgba(212,175,106,.30);
}
#hedef-listesi .hl-konu-ekle:hover,
        #duzelt-govde .hl-konu-ekle:hover { background: rgba(212,175,106,.20); }

/* ═══ HAFTALIK TAKDİR KARTI — "haftanın yüzü" (28 Ağu 2026) ═══════════════
   Kartın iki yeri var: kronometrede pazar/pazartesi beliren karşılama satırı
   (`#hy-hafta`, niyet satırının yanında) ve Geçmişim → "Haftaların" sayfası.
   Kart hep "ne oldu"yu anlatır; yüzde, hedef, kıyas ve vaat GİRMEZ.
   Sınıf öneki `hy-` — paralel oturumlar tek CSS dosyasına yazdığı için ad
   çakışması ekranı sessizce bozuyor (23 Ağu "Bu hafta" vakası). */

/* Kart: gökyüzü fotoğrafının ekrandaki hâli — aynı gece, aynı altın.
   Sönük durmasın diye üç katman var: köşedeki büyük filigran sembol, üstteki
   rozet ve haftanın çubuk şeridi. Şerit süs değil — o haftanın parmak izi. */
/* ═══ GECE RENKLERİ (30 Ağu) — kartın rengi YÜZDEN gelir ═══════════════
   Hepsi gece ailesinden; ayıran şey sıcaklık. Alt alta dizilince sayfada
   renk ritmi doğuyor. `--hy-ton` göstergenin ve rozetin rengi. */
.hy-kart.gece-celik { --hy-gece-1: #101A2E; --hy-gece-2: #070C18; }
.hy-kart.gece-amber { --hy-gece-1: #1F1524; --hy-gece-2: #100A18; }
.hy-kart.gece-mor   { --hy-gece-1: #161232; --hy-gece-2: #08071A; }
.hy-kart.gece-yesil { --hy-gece-1: #0C1B22; --hy-gece-2: #060F16; }
.hy-kart.gece-bakir { --hy-gece-1: #20161A; --hy-gece-2: #120A0E; }

.hy-kart {
    --hy-ton: #E8D5A8; --hy-gece-1: #0D1329; --hy-gece-2: #070B18;
    position: relative; overflow: hidden;
    width: 100%; box-sizing: border-box;
    border-radius: 16px; padding: 18px 18px 16px;
    background:
        radial-gradient(120% 90% at 88% 8%, rgba(212,175,106,.13), transparent 58%),
        radial-gradient(1px 1px at 18% 22%, rgba(232,213,168,.5), transparent 60%),
        radial-gradient(1px 1px at 68% 14%, rgba(232,213,168,.34), transparent 60%),
        radial-gradient(1.5px 1.5px at 41% 31%, rgba(232,213,168,.6), transparent 60%),
        radial-gradient(1px 1px at 86% 40%, rgba(160,190,230,.4), transparent 60%),
        linear-gradient(180deg, var(--hy-gece-1) 0%, var(--hy-gece-2) 100%);
    border: 1px solid rgba(232, 213, 168, 0.20);
    box-shadow: 0 14px 34px rgba(4, 8, 20, .45), inset 0 1px 0 rgba(255,255,255,.045);
    text-align: left;
}
/* Filigran: yüzün sembolü, kartın sağ alt köşesinde büyük ve çok sönük. */
.hy-kart .hy-fon {
    position: absolute; right: -44px; bottom: -52px;
    color: var(--hy-ton); opacity: .05; pointer-events: none; line-height: 0;
}

/* ── DÖRT KALIP ──────────────────────────────────────────────────────
   Tören: gösterge kahraman, başlık büyük, rozet yok.
   Anlatı: gösterge solda dar sütun, metin sağda.
   Liste: içerik listenin kendisi. Sessiz: kısa kart. */
.hy-kart.kalip-toren .hy-baslik { font-size: 1.5em; line-height: 1.14; }
.hy-kart.kalip-toren .hy-gos { min-height: 62px; }
.hy-kart.kalip-toren .hy-gos-svg { height: 58px; }
.hy-ust-sade { margin-bottom: 10px; }

/* Mühür rozeti başlık satırının üstüne binmesin. */
.hy-kart .hy-ust { padding-right: 0; }
.hy-kart:has(.hy-muhur) .hy-ust { padding-right: 92px; min-height: 30px; }

.hy-kart.kalip-sessiz { padding: 15px 18px 14px; }
.hy-kart.kalip-sessiz .hy-baslik { font-size: 1.06em; }

/* ── MÜHÜR ROZETİ — küçük yol taşı kaybolmaz, köşeye iner (30 Ağu) ────
   ⚠️ BU AD YALNIZ KÖŞE ROZETİNİN. Kapanan konu listesindeki mühür halkası
   `hy-konu-muhur`; ikisi aynı adı taşıyınca liste mühürleri absolute olup
   kartın köşesine yığılıyordu. */
.hy-muhur {
    position: absolute; top: 14px; right: 14px; z-index: 1;
    display: inline-flex; align-items: center; gap: 5px;
    font-size: .62em; font-weight: 700; letter-spacing: .5px;
    color: var(--hy-ton); border: 1px solid currentColor; opacity: .8;
    border-radius: 999px; padding: 3px 9px;
}
.hy-muhur svg { flex: none; }

/* ── "İLK KEZ" — bu yüz bu öğrencide ilk kez çıkıyor ───────────────── */
.hy-ilk {
    display: inline-block; font-size: .56em; font-weight: 700; letter-spacing: 1.1px;
    text-transform: uppercase; color: #0B1020; background: var(--hy-ton);
    padding: 2px 8px; border-radius: 3px; margin-bottom: 8px;
}
/* İçerik filigranın ÜSTÜNDE dursun diye yığın bağlamı kuruluyor.
   ⚠️ MÜHÜR ROZETİ DIŞARIDA: o `position:absolute` ile köşeye oturuyor; bu
   kural onu da yakalayınca `relative`e dönüyor ve rozet başlığın SOL ÜSTÜNE
   biniyordu (30 Ağu, ekranda görüldü — kuralın kendisi değil KAPSAMI hataydı). */
.hy-kart > *:not(.hy-fon):not(.hy-muhur) { position: relative; }

.hy-kart .hy-ust {
    display: flex; align-items: center; gap: 11px; margin-bottom: 14px;
}
/* Rozet büyüdü: yüzün sembolü kartın ilk okunan şeyi olsun (29 Ağu). */
.hy-kart .hy-rozet {
    flex: none; width: 46px; height: 46px; border-radius: 50%;
    display: grid; place-items: center;
    background: radial-gradient(circle at 50% 42%, rgba(255,255,255,.10), transparent 72%);
    border: 1px solid var(--hy-ton);
    color: var(--hy-ton);
}
.hy-kart .hy-ust-yazi { display: flex; flex-direction: column; gap: 3px; min-width: 0; }
.hy-kart .hy-etiket {
    font-size: .6em; font-weight: 700; letter-spacing: .8px;
    text-transform: uppercase; color: #8b9ab4;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hy-kart .hy-tarih {
    font-size: .68em; font-weight: 600; letter-spacing: 1px;
    color: #7c8ca8; font-variant-numeric: tabular-nums; white-space: nowrap;
}
.hy-kart .hy-baslik {
    font-size: 1.34em; line-height: 1.2; font-weight: 600;
    color: #f5e9cb; margin: 0; text-wrap: balance;
}
.hy-kart.kucuk .hy-baslik { font-size: 1.08em; }
.hy-kart .hy-alt {
    font-size: .8em; line-height: 1.5; color: #aab8ce; margin: 8px 0 0;
}

/* ═══ GÖSTERGE — her yüzün kendi resmi (29 Ağu) ═══════════════════════
   Aynı çubuk grafiği her kartta duruyordu; kart yüzler arasında yalnız
   cümleyle ayrılıyordu. Artık resim de yüzün kendisi. Yükseklik sabit
   (kartlar yan yana dizilince satır kaymasın), içerik değişken.
   Ton: `--hy-vurgu` — haftanın baskın dersinden gelir, öğrenciden öğrenciye
   ve haftadan haftaya değişir. Altın kimlik korunur; bu yalnız göstergenin
   vurgusu. */
.hy-gos {
    min-height: 44px; margin: 16px 0 2px;
    display: flex; align-items: center;
    border-bottom: 1px solid rgba(255, 255, 255, .05); padding-bottom: 10px;
}
.hy-gos-svg { display: block; width: 100%; height: 40px; }

/* Kapanan konular: her biri bir mühür halkası. */
.hy-gos-liste { list-style: none; margin: 0; padding: 0; width: 100%; }
.hy-gos-liste li {
    display: flex; align-items: center; gap: 7px;
    font-size: .76em; color: #cbd5e1; line-height: 1.5;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hy-gos-liste .hy-konu-muhur { flex: none; display: inline-flex; }

/* Dersler: çipler; dönülen ders vurgulu. */
.hy-gos-cipler { display: flex; flex-wrap: wrap; gap: 6px; width: 100%; }
.hy-cip {
    font-size: .68em; font-weight: 600; letter-spacing: .2px;
    padding: 4px 9px; border-radius: 999px;
    color: #94a3b8; border: 1px solid rgba(255, 255, 255, .12);
}
.hy-cip.donen { font-weight: 700; background: rgba(255, 255, 255, .05); }

/* Taş: kartın içinde de taşın kendisi durur. */
.hy-gos-tas { display: flex; align-items: baseline; gap: 10px; width: 100%; }
.hy-gos-tas svg { align-self: center; flex: none; }
.hy-gos-tas b { font-size: 1.5em; font-weight: 700; font-variant-numeric: tabular-nums; }
.hy-gos-tas span {
    font-size: .64em; font-weight: 700; letter-spacing: 1.6px;
    text-transform: uppercase; color: #75859f;
}

.hy-kart .hy-sayilar {
    display: grid; grid-template-columns: minmax(0,1.5fr) minmax(0,1fr) minmax(0,1fr); gap: 8px;
    margin-top: 12px; padding-top: 12px;
    border-top: 1px solid rgba(232, 213, 168, 0.14);
}
.hy-kart .hy-sayi { min-width: 0; }
.hy-kart .hy-sayi .n {
    font-size: .88em; font-weight: 700; color: #f0e2bc; letter-spacing: -.2px;
    font-variant-numeric: tabular-nums; line-height: 1.15;
    white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.hy-kart .hy-sayi .l {
    font-size: .58em; font-weight: 700; letter-spacing: 1.6px;
    text-transform: uppercase; color: #75859f; margin-top: 5px;
}
/* Taşın satırı: başlığı alamadığı hafta burada durur — kaybolmaz. */
.hy-kart .hy-tas {
    display: flex; align-items: center; gap: 7px; margin-top: 11px;
    font-size: .74em; font-weight: 600; color: #d4af6a;
}
.hy-kart .hy-tas svg { flex: none; }
.hy-kart .hy-eller { display: flex; gap: 8px; margin-top: 13px; }
.hy-kart .hy-dgm {
    flex: 1; padding: 9px 0; border-radius: 10px; cursor: pointer;
    font-family: inherit; font-size: .76em; font-weight: 700; letter-spacing: .4px;
    color: #e8d5a8; background: rgba(212, 175, 106, 0.10);
    border: 1px solid rgba(212, 175, 106, 0.30);
}
.hy-kart .hy-dgm:hover { background: rgba(212, 175, 106, 0.20); }

/* Taş haftası kendini belli eder: çerçevesi biraz daha parlak. */
.hy-kart.yuz-tas { border-color: rgba(232, 213, 168, .40); }

/* "Haftaların" sayfası: kartlar alt alta. Eski haftalar SÖNMEZ, yalnız
   sesini kısar — geçmiş hafta da o öğrencinin haftasıdır. */
.hy-kart + .hy-kart { margin-top: 12px; }
.hy-kart.eski { box-shadow: 0 8px 20px rgba(4, 8, 20, .35); }
.hy-kart.eski .hy-baslik { font-size: 1.14em; }
.hy-kart.eski .hy-fon { color: rgba(212, 175, 106, .038); }

@media (prefers-reduced-motion: reduce) {
    #hy-hafta:active { transform: none; }
}

        /* ═══ ODAK KİLİDİ — çalışırken alt bar (31 Ağustos 2026) ═══════════
           Kullanıcı kararı: çalışma sürerken alt bardaki ikonlar kapalı;
           molada ve duraklamada açık.

           🔒 SÖNÜK AMA DOKUNULABİLİR: ikon çizilmeden kaybolmaz. Dokununca
           sebebini söyleyen tek satır çıkar. Kullanılamayan aracı görünmez
           yapmak keşfedilebilirliği öldürür ("görünen her şey
           dokunulabilirdir" — tek saat standardı).
           ⚠️ Tam ekran muaf: ekrandan çıkarmaz, odağı destekler. */
        .navbar.nav-kilitli .nav-i:not(.active):not(#btn-fullscreen) {
            opacity: 0.34;
            filter: grayscale(0.5);
            transition: opacity .25s ease;
        }
        .navbar.nav-kilitli .nav-i:not(.active):not(#btn-fullscreen):active {
            opacity: 0.55;   /* dokunuş karşılıksız kalmasın */
        }

        #nav-kilit-balon {
            position: fixed; left: 50%; transform: translateX(-50%) translateY(6px);
            bottom: calc(env(safe-area-inset-bottom, 0px) + 74px);
            z-index: 70; max-width: min(320px, calc(100vw - 32px));
            padding: 9px 14px; border-radius: 12px;
            background: rgba(18, 24, 40, 0.96);
            border: 1px solid rgba(255, 255, 255, 0.12);
            box-shadow: 0 12px 30px -8px rgba(0, 0, 0, 0.6);
            color: #cbd5e1; font-size: 12.5px; line-height: 1.45; text-align: center;
            opacity: 0; pointer-events: none;
            transition: opacity .18s ease, transform .18s ease;
        }
        #nav-kilit-balon.acik { opacity: 1; transform: translateX(-50%) translateY(0); }
        @media (prefers-reduced-motion: reduce) {
            #nav-kilit-balon { transition: none; }
            .navbar.nav-kilitli .nav-i { transition: none; }
        }

/* ── Yaprakta salon bölümü gezme okları (1 Eyl) ──────────────────────────
   Kalabalık salonda yaprak TEK masa çizer (kural); oklar yalnız gezdirir.
   Pusula sönük durur — masanın kendisiyle yarışmaz. */
#alkis-yaprak .sln-yaprak-nav {
    display: flex; align-items: center; justify-content: center; gap: 2px;
    margin: 0 0 2px;
}
/* Ok HAFİFTİR: daire yok, çerçeve yok — ince bir kıvrım. Dokunma alanı
   görünenden geniş (34×30), göz yalnız kıvrımı görür. */
#alkis-yaprak .syn-ok {
    width: 34px; height: 30px; flex: none; padding: 0;
    display: inline-flex; align-items: center; justify-content: center;
    background: none; border: none; color: #5f6b80; cursor: pointer;
    transition: color 0.15s ease;
}
#alkis-yaprak .syn-ok:hover,
#alkis-yaprak .syn-ok:active { color: #e8d5a8; }
#alkis-yaprak .syn-ad {
    font-size: 0.68em; color: #8fa2bf; letter-spacing: 0.06em;
    min-width: 72px; text-align: center; font-variant-numeric: tabular-nums;
}

/* ── Yaprakta anlık birlikte eylemleri (1 Eyl) ───────────────────────────
   Kesmeyen pencerede tek dokunuşluk iki eylem. Kural düğmenin ALTINDA:
   öğrenci ne olacağını bilerek basar. */
#alkis-yaprak .ay-eylem { margin-top: 12px; }
#alkis-yaprak .ay-dug {
    display: block; width: 100%; padding: 11px 14px; border-radius: 11px;
    background: rgba(255,255,255,0.05); color: #cbd5e1;
    border: 1px solid rgba(255,255,255,0.16);
    font-family: inherit; font-size: 0.86em; font-weight: 700; cursor: pointer;
}
#alkis-yaprak .ay-dug.altin {
    background: rgba(212,175,106,0.10); color: #e8d5a8; border-color: rgba(212,175,106,0.4);
}
#alkis-yaprak .ay-dug:disabled { opacity: .6; cursor: wait; }
#alkis-yaprak .ay-kural { font-size: 0.72em; color: #8fa2bf; text-align: center; margin-top: 7px; line-height: 1.5; }

/* ═══ PERDEDE DE AYNI KART (4 Eylül 2026) ════════════════════════════════
   Sayaçsız giriş ve düzeltme ekranı, kronometrenin kayıt kartıyla AYNI
   sınıfları kullanıyor (`pk-grup` · `pk-satir` · `pk-ic` · `pk-dyb` …).
   Buradaki kurallar yalnız PERDENİN dar gövdesine uyarlar — kartın kendi
   ölçüleri (renk, yükseklik, çip biçimi) tek yerde, yukarıda duruyor.
   🔑 Amaç: "üç ekran tek dil" cümlesi görsel bir benzerlik değil, YAPISAL
   bir gerçek olsun — aynı sınıf, aynı ölçü. */
.dz-govde .pk-grup.dz-kart { margin: 12px 0 14px; }
/* Perde dar: kartın iç bloğu ikonun altına 48 px girintilenmez. */
.dz-govde .pk-ic { margin: 0 12px 6px 14px; }
.dz-govde .pk-dyb, .dz-govde .pk-zor { min-height: 44px; }
/* Sayı kutuları kartla aynı ölçüde; perdede biraz daha geniş (tek satırda üç). */
/* (7 Eyl) Perdedeki 54 px ezmesi KALKTI — ölçü artık temelde. */
/* Süre satırı: −/+ düğmeleri kutunun iki yanında, hepsi 44 px parmak hedefi. */
.dz-govde .pk-sure-ayar button {
    width: 40px; height: 44px; border-radius: 11px; cursor: pointer;
    border: 1px solid var(--glass-border); background: rgba(255,255,255,0.05);
    color: #e8eefc; font-size: 1.1em; font-family: inherit; flex: none;
}
.dz-govde .pk-sure-ayar button:active { background: rgba(255,255,255,0.12); }
/* Beşli cetvel satıra sığmaz: etiket üstte kalır, şerit tam genişliğe geçer. */
.dz-govde .pk-zor.genis { display: block; }
.dz-govde .pk-zor.genis .pk-cipler { display: flex; margin-top: 7px; }
.dz-govde .pk-cipler.bes .pk-cip {
    flex: 1; padding: 6px 3px; font-size: .78em; line-height: 1.15; white-space: normal; min-height: 44px;
}
/* Gün kutuları: iki kutu, tarihi altında küçük. */
.dz-govde .pk-gun { display: flex; gap: 6px; flex: 1; }
.dz-govde .pk-cip.gun {
    flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center;
    gap: 1px; min-height: 48px; padding: 4px 6px;
}
.dz-govde .pk-cip.gun small { font-size: .78em; color: #5d6b86; font-weight: 400; }
.dz-govde .pk-cip.gun.secili small { color: #9fd8e4; }
/* Kaynak: etiket kendi satırında, kitap ve ayracı hemen altında tek çerçevede. */
.dz-govde .pk-dyb.pk-kaynak { padding-bottom: 2px; }
.dz-govde .dz-kaynak-blok { margin: 0 0 4px; }
.dz-govde .pk-not { padding: 2px 0 8px; }
.dz-govde .dz-saat { min-height: 44px; }

/* ═══ KÜÇÜK HEDEFLER — PARMAK ÖLÇÜSÜ 44 ════════════════════════════════════
   (7 Eylül 2026 — gezinti raporu 9. madde.)

   Kronometre KOŞARKEN ölçülenler: kilit uydusu 26x26 · göz uydusu 26x26 ·
   "Bu konuya not al" 24x24 · bloğu düzelt kalemi 26x26 · tuş takımının
   ‹ › okları 34x34. Hepsi 44'ün altındaydı; en çok da çalışma sürerken,
   yani öğrencinin en dikkatsiz olduğu anda dokunuluyorlar.

   🔑 ANAYASANIN İKİ YOLU, karıştırılmaz:
     · TEK BAŞINA duran düğmede → görünmez pay (`::after`), `z-index` ŞART
       (pay komşu yazının altında kalıyordu — 7 Eyl'in çarpı vakası).
     · DAR SATIRIN İÇİNDE → dolgu + eksi kenar payı. Kaplama orada
       komşunun dokunuşunu YER.
   🔒 Görünen boyut hiçbirinde değişmez. */

/* ⚠️ DOLGU BURADA İŞE YARAMAZ (7 Eyl provasında ölçüldü): bu düğmelerin
   genişliği/yüksekliği SABİT yazılı ve kutu ölçüsü `border-box` — dolgu
   kutuyu büyütmüyor, içeriye doğru YİYOR. Ekranda düğme yine 24x24 kaldı.
   O yüzden hepsinde GÖRÜNMEZ PAY kullanılıyor; `z-index` şart, yoksa pay
   komşu yazının altında kalır ve dokunuş yine kaçar.
   🔒 Görünen daire/çerçeve büyümez — pay saydamdır. */

/* Odak araçları (not al · kaynak · göz…): 24x24 çizim. Aralık 6'dan 22'ye
   çıkarıldı ki iki komşunun payı BİRBİRİNİ YEMESİN: 24 + 2x11 = 46 dokunma,
   aradaki boşluk tam yetiyor. */
#focus-info .fi-d, #odak-araclar .fi-d { position: relative; }
#focus-info .fi-d::after, #odak-araclar .fi-d::after {
    content: ''; position: absolute; inset: -11px; z-index: 1;
}

/* Bloğu düzelt kalemi: blok satırının sağ ucunda; solundaki komşusu satırın
   kendisi (bir kapı değil, bilgi). Pay 9 → 44x44. */
.od-kalem { position: relative; }
.od-kalem::after { content: ''; position: absolute; inset: -9px; z-index: 1; }

/* Tuş takımının gezinme okları: aralarında yalnız başlık YAZISI var,
   komşu bir düğme değil — pay güvenle büyür. 34 + 2x5 = 44. */
#num-keypad .kp-gez { position: relative; }
#num-keypad .kp-gez::after { content: ''; position: absolute; inset: -5px; z-index: 1; }

/* Kilit ve göz uyduları: çemberin sağ üst köşesinde, tek sütunda, aralarında
   18 px. Pay 9 → 44x44. Altlarındaki `.dial-core` çalışma sürerken TIKLANIR
   DEĞİL (ölçüldü: `cursor:auto`, düğme atası yok), o yüzden pay kimsenin
   dokunuşunu yemiyor; uydular da yalnız çalışma sürerken çiziliyor. */
#kilit-uydu, #sure-uydu { }
#kilit-uydu::after, #sure-uydu::after {
    content: ''; position: absolute; inset: -9px; z-index: 1; border-radius: 50%;
}
