/* ==========================================================================
   OSIS Padmanaba - Gaya Utama
   Dibuat untuk SMAN 3 Yogyakarta. Palet: merah padma, emas, kertas hangat.
   Struktur file ini mengikuti urutan halaman, dari atas ke bawah:
   1. Variabel warna dan dasar
   2. Kepala halaman dan navigasi
   3. Hero
   4. Bagian umum
   5. Tentang dan struktur
   6. Peta kabinet (layar penuh)
   7. Bidang, agenda, visi misi, kontak, footer
   8. Animasi dan media query
   ========================================================================== */

/* ===== 1. Variabel warna dan dasar ===== */
:root{
  --ink:#241417; --muted:#77656A; --faint:#A9989C;
  --paper:#FFFFFF; --tint:#FAF5F3; --line:#EAE0DC;
  --red:#B4232A; --red-deep:#8E1F24; --gold:#C98A12;
  --nav-ink:#5C4A4E; --body-ink:#4E3D41;
  --serif:Georgia,'Times New Roman',serif;
  --sans:'Segoe UI',system-ui,-apple-system,sans-serif;
  --ease:cubic-bezier(.19,1,.22,1);
}
/* Tema gelap halaman utama. Keluarga warnanya sengaja sama dengan tema gelap
   peta kabinet (hitam hangat, krem, emas), jadi membuka peta dari halaman
   gelap terasa melanjutkan ruangan yang sama, bukan pindah situs. Dasarnya
   COKELAT TUA hangat, bukan hitam: yang terlalu gelap membuat halaman
   terlihat mati. Hampir semua warna halaman sudah lewat variabel, jadi
   cukup menimpa variabelnya. Atributnya dipasang di <html> oleh js/tema.js
   dan disimpan di localStorage. */
html[data-tema="gelap"]{
  /* Dasarnya MARUN-GELAP hangat, bukan cokelat dan bukan hitam: cokelat
     membuat halaman terasa kehilangan nyawa (kritik putaran 13), hitam
     murni membuatnya mati. Merah di dalamnya menjaga situs ini terasa
     satu darah dengan hero, di tema mana pun. */
  --paper:#2A1518; --tint:#35191C; --line:#532D2F;
  --ink:#F6ECE8; --muted:#C9B3AC; --faint:#A38C88;
  /* Merah dibenerkan sedikit agar tetap terbaca di atas marun gelap. */
  --red:#E0555B; --red-deep:#A3282E; --gold:#E0A63C;
  --nav-ink:#D8C6BB; --body-ink:#D6C6BA;
}
/* Hero kini berwarna maroon di kedua tema (blok merek), dan padmanya emas,
   jadi tidak perlu penyesuaian tema seperti dulu. */
/* Papan nama di kartu struktur memakai tinta sebagai latarnya; warna teksnya
   mengikuti kertas, jadi di tema gelap pilnya terang bertulisan gelap. */

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
/* Kontrak CSS Lenis (js/lenis.min.js, putaran 12): selagi Lenis memandu
   roda mouse, scroll-behavior:smooth milik <html> harus diam supaya tidak
   ada dua animasi gulir yang berebut. Ponsel tak tersentuh: Lenis bawaannya
   membiarkan guliran sentuh asli. Aturan resmi dari dokumentasinya. */
html.lenis,html.lenis body{height:auto}
.lenis.lenis-smooth{scroll-behavior:auto !important}
.lenis.lenis-smooth [data-lenis-prevent]{overscroll-behavior:contain}
.lenis.lenis-stopped{overflow:hidden}
/* Latar halaman diberi butir kertas (putaran 18): tekstur kedua milik situs
   ini selain lambang emas, jadi permukaan yang kosong sekalipun tidak
   terasa datar. Butirnya ubin PNG mungil yang digaji lebih dulu (bukan
   filter SVG runtime: filter itu membebani raster pertama headless Edge
   dan menggeser waktu transisi sapuan, ketahuan uji 1b/1c uji_r9), hitam
   hangat di siang dan krem hangat di malam, puncak alfanya 5% agar cuma
   terasa sebagai "kertas", bukan noda. Kartu, foto, dan hero punya latar
   sendiri sehingga butir ini hanya hidup di permukaan telanjang. */
body{background-color:var(--paper);
     background-image:url(../img/butir-terang.png);background-size:180px 180px;
     color:var(--ink);font-family:var(--sans);
     font-size:16px;line-height:1.65}
html[data-tema="gelap"] body{background-image:url(../img/butir-gelap.png)}
.wrap{max-width:1100px;margin:0 auto;padding:0 24px}

/* Terlihat hanya saat difokus dengan tombol Tab. Membantu pengguna keyboard
   melompati menu tanpa harus melewatinya satu per satu. */
.skip-link{position:absolute;left:-9999px;top:0;z-index:200;background:var(--red);
    color:#fff;padding:10px 18px;border-radius:0 0 8px 0;text-decoration:none;font-size:14px}
.skip-link:focus{left:0}

/* Cincin fokus keyboard sengaja dihilangkan: cincin abu-abu di sekeliling
   tombol terlihat seperti cacat gambar, padahal hampir semua elemen
   interaktif di situs ini sudah punya gaya keadaannya sendiri (mengangkat
   diri, berubah warna, bordernya menyala). Tautan "Lompat ke konten utama"
   tetap muncul saat ditab karena gayanya lewat posisi, bukan outline. */

/* ===== 2. Kepala halaman dan navigasi =====
   Kepala halaman melayang bebas di atas jendela. Di puncak halaman ia
   transparan, menyatu dengan hero maroon, dan teksnya berwarna krem terang.
   Begitu halaman digulir, bilahnya berubah menjadi pulau: membulat penuh,
   menjauh dari tepi atas, memakai kertas kabur, dan diberi bayangan. Kelas
   .pulau dipasang dan dicabut js/app.js mengikuti posisi gulir. */
header.site{position:fixed;top:0;left:0;right:0;z-index:95}
/* Kepala sengaja berdiri DI ATAS layar sapuan (.sapu-layar z-89): saat
   pindah halaman, kepala justru yang tetap tampak sementara isi ditukar
   di balik layar itu. Tetap di bawah .frame peta (100), .skip-link (200),
   dan modal pengurus (220). */
/* --- Naungan kabur di puncak halaman ---
   ala inspeksirumah.id: kepala tak pernah bertumpu pada satu warna. Di
   puncak halaman ia hanya naungan gelap mengkabur yang memudar ke bawah
   (foto atau isi apa pun di belakangnya tetap terasa), begitu digulir
   naungan ini diredam dan pulau kaca di bawah yang mengambil alih. Lapisan
   kuno hidup di ::before supaya mask pudarnya tak ikut memudarkan logo dan
   menu; bila dipasang langsung di header, isinya ikut hilang. */
header.site::before{content:"";position:absolute;inset:0;z-index:-1;
    pointer-events:none;
    background:linear-gradient(180deg,rgba(24,6,8,.5) 0%,rgba(24,6,8,.2) 58%,rgba(24,6,8,0) 100%);
    backdrop-filter:blur(9px) saturate(1.12);
    -webkit-backdrop-filter:blur(9px) saturate(1.12);
    -webkit-mask:linear-gradient(180deg,#000 26%,transparent 100%);
            mask:linear-gradient(180deg,#000 26%,transparent 100%);
    transition:opacity .45s ease}
header.site.pulau::before{opacity:0}
/* Dua wujud kepala, ala transisi pulau: di puncak halaman bilahnya meregang
   selebar jendela (logo di tepi kiri, menu di tengah, tombol di tepi kanan),
   lalu begitu digulir semuanya meluncur masuk ke pulau melayang yang
   menyusut di tengah. Yang dianimasikan sengaja properti yang dihitung ulang
   tiap frame (lebar maksimal, bantalan, tinggi, jarak antar item), supaya
   isi bilah benar-benar bergeser mulus mengikuti bingkainya, bukan melompat
   ke posisi baru. */
.bar{display:flex;align-items:center;gap:16px;height:72px;margin:0 auto;
    border-radius:999px;border:1px solid transparent;background:transparent;
    transition:margin-top .5s var(--ease),max-width .55s var(--ease),
               padding .5s var(--ease),height .4s,gap .45s var(--ease),
               background .35s,border-color .35s,box-shadow .45s var(--ease),
               border-radius .5s var(--ease),
               backdrop-filter .35s ease,-webkit-backdrop-filter .35s ease}
header.site .bar{max-width:100%;padding:0 34px}
/* Pulau melayang: kaca cair ala iOS, SATU RESEP untuk dua tema. Sengaja
   tak menyentuh variabel tema: sifat kaca justru itu, netral dan
   menuruti apa pun yang ada di belakangnya. Tintanya tebal, 52% putih,
   supaya isi pulau boleh memakai tinta gelap di KEDUA tema: diukur di
   seluruh halaman isi, kaca tipis 10% tak pernah memberi 4,5:1 untuk
   tinta mana pun (krem bahkan cuma 1,0-1,4:1 di titik terterangnya),
   sedangkan resep ini menetap di atas 5:1 untuk tinta gelap. */
header.site.pulau .bar{margin-top:10px;max-width:1100px;height:58px;padding:0 24px;
    background:linear-gradient(115deg,rgba(255,255,255,.28),rgba(255,255,255,.06) 38%,rgba(255,255,255,0) 60%,rgba(255,255,255,.14)),
               rgba(255,255,255,.52);
    border-color:rgba(255,255,255,.38);
    box-shadow:0 16px 44px rgba(36,20,23,.22),
               inset 0 1px 0 rgba(255,255,255,.42),
               inset 0 -1px 0 rgba(255,255,255,.14);
    backdrop-filter:blur(20px) saturate(1.55);
    -webkit-backdrop-filter:blur(20px) saturate(1.55)}
.mark{display:flex;align-items:center;gap:11px;text-decoration:none;color:#FFF7F0;
    transition:color .35s}
header.site.pulau .mark{color:#241417}
/* Logo OSIS tampil apa adanya tanpa bingkai kotak. Pemisahnya dari latar
   berupa bayangan lembut yang MENGIKUTI bentuk lotusnya: drop-shadow
   digambar dari siluet gambar, bukan dari kotaknya. */
.mark .logo{width:38px;height:38px;object-fit:contain;flex:none;
    filter:drop-shadow(0 2px 7px rgba(20,10,12,.45));
    transition:width .5s var(--ease),height .5s var(--ease)}
header.site.pulau .mark .logo{width:32px;height:32px}
.mark svg{width:38px;height:24px}
.mark .wm b{display:block;font-size:16px;letter-spacing:.4px;line-height:1.15;
    transition:font-size .5s var(--ease)}
header.site.pulau .mark .wm b{font-size:15px}
.mark .wm span{font-size:12px;color:rgba(255,240,232,.72);letter-spacing:.6px;
    transition:color .35s,font-size .5s var(--ease)}
header.site.pulau .mark .wm span{font-size:11px}
header.site.pulau .mark .wm span{color:rgba(36,20,23,.9)}
/* Baris "SMAN 3 Yogyakarta" tetap satu tangga lebih redup dari papan
   namanya, tapi sekali ini hierarkinya lewat ukuran saja (11px vs 15px):
   opacity di bawah 0,9 menggerus kontrasnya melewati batas di titik
   latar tergelap, jadi warnanya dibuat nyaris sama dengan tinta utama. */
nav.main{margin-left:auto;display:flex;gap:26px;
    transition:gap .5s var(--ease),opacity .3s ease}
header.site.pulau nav.main{gap:22px}
nav.main a{position:relative;color:rgba(255,241,233,.85);text-decoration:none;font-size:15px;
    padding:4px 0;border-bottom:2px solid transparent;
    transition:color .3s,border-color .15s,font-size .5s var(--ease)}
/* Garis bawah menyapu dari kiri (mikrointeraksi): border transparan tetap
   dipasang supaya tingginya tidak bergeser satu piksel pun saat garis
   muncul; garisnya digambar ::after mengikuti warna teks (currentColor),
   jadi dua wujud kepala (transparan dan pulau) otomatis ikut. */
nav.main a::after{content:"";position:absolute;left:0;right:0;bottom:-2px;height:2px;
    background:currentColor;transform:scaleX(0);transform-origin:left;
    transition:transform .4s var(--ease)}
nav.main a:hover::after,nav.main a:focus-visible::after{transform:scaleX(1)}
header.site.pulau nav.main a{font-size:14px}
nav.main a:hover{color:#F0C36B;border-color:transparent}
header.site.pulau nav.main a{color:#241417}
/* Hover di dalam pulau memakai merah tua, bukan var(--red): di tema gelap
   var(--red) diterangkan jadi #E0555B, yang lenyap di atas kaca putih.
   Garis bawahnya ikut muncul, jadi perubahan keadaannya tak bergantung
   pada warna saja. */
header.site.pulau nav.main a:hover{color:#6E1418;border-color:transparent}
.burger{display:none;margin-left:auto;background:none;border:1px solid rgba(255,244,232,.4);
    border-radius:8px;padding:11px 12px;cursor:pointer;color:#FFF7F0;
    transition:color .3s,border-color .3s,opacity .3s ease}
.burger span{display:block;width:18px;height:14px;position:relative}
.burger i{position:absolute;left:0;right:0;height:2px;border-radius:2px;
    background:currentColor;top:0;
    transition:transform .45s var(--ease),opacity .3s,top .45s var(--ease)}
.burger i:nth-child(2){top:6px}
.burger i:nth-child(3){top:12px}
/* Saat menunya terbuka, tiga garisnya menyusun diri jadi silang: garis
   pertama dan ketiga berputar ke titik tengah, garis tengahnya mengecil
   dan lenyap. Warna emasnya (aturan di blok layar kecil) menandai bahwa
   menunya sedang terbuka. */
.burger[aria-expanded="true"] i:nth-child(1){top:6px;transform:rotate(45deg)}
.burger[aria-expanded="true"] i:nth-child(2){opacity:0;transform:scaleX(.3)}
.burger[aria-expanded="true"] i:nth-child(3){top:6px;transform:rotate(-45deg)}
header.site.pulau .burger{color:#241417;border-color:rgba(36,20,23,.30)}
/* Tombol tema halaman utama, sepupu dari .fbtn.tema di peta: satu tombol,
   ikonnya ditukar lewat data-tema di <html>. Di tema terang ikonnya bulan
   (ajakan mencoba tema gelap), di tema gelap matahari. */
.tbtn{display:flex;align-items:center;justify-content:center;flex:none;
    width:40px;height:40px;background:none;border:1px solid rgba(255,244,232,.4);
    border-radius:9px;cursor:pointer;color:#FFF7F0;font-size:15px;
    transition:border-color .3s,color .3s,width .5s var(--ease),height .5s var(--ease)}
header.site.pulau .tbtn{width:36px;height:36px}
.tbtn:hover{border-color:#F0C36B;color:#F0C36B}
header.site.pulau .tbtn{border-color:rgba(36,20,23,.30);color:#241417}
header.site.pulau .tbtn:hover{border-color:#6E1418;color:#6E1418}
/* Ikonnya SVG tulenan, bukan lagi glyph \263E/\2600 dari font: bulan Segoe
   UI Symbol ternyata digambar jadi sabit rambut satu-dua piksel yang
   anti-alias-nya jadi sup pada 15px (terukur cuma 3,5:1 di dalam pulau).
   SVG ikut currentColor, tajam di ukuran mana pun, dan pilihan ikonnya
   tetap sama: di tema terang bulan (ajakan mencoba tema gelap), di tema
   gelap matahari. */
.tbtn svg{width:16px;height:16px;display:block;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round}
.tbtn .ikon-matahari{display:none}
html[data-tema="gelap"] .tbtn .ikon-matahari{display:block}
html[data-tema="gelap"] .tbtn .ikon-bulan{display:none}
/* Ikon yang baru muncul memutar masuk (mikrointeraksi penukaran tema):
   animasinya jalan tiap kali display berpindah dari none. */
@keyframes pintar{from{transform:rotate(-90deg) scale(.55);opacity:0}
   to{transform:none;opacity:1}}
html[data-tema="gelap"] .tbtn .ikon-matahari{animation:pintar .5s var(--ease)}
html:not([data-tema="gelap"]) .tbtn .ikon-bulan{animation:pintar .5s var(--ease)}
@media (prefers-reduced-motion: reduce){
  html[data-tema="gelap"] .tbtn .ikon-matahari,
  html:not([data-tema="gelap"]) .tbtn .ikon-bulan{animation:none}}

/* --- Wujud kepala: satu saja, di mana pun halamannya ---
   Dulu halaman isi memakai bilah kertas (kelas .di-isi dari Perute) supaya
   tombolnya jelas di atas foto Tentang; keputusan akhir justru sebaliknya:
   kepala tetap transparan krem seperti di halaman depan, karena pita gelap
   atas foto Tentang sudah cukup melindungi kontrasnya, dan wujud yang
   seragam membuat perpindahan halaman tak perlu pergantian warna kepala.
   Satu-satunya wujud lain tetap pulau melayang saat digulir (lihat atas),
   dan Perute melepas pulau itu selama layar sapuan berjalan. */

/* Jeda gulir untuk lompatan #anchor: dengan kepala melayang, judul bagian
   harus turun sedikit agar tidak tersembunyi di balik pulau. */
section[id],#beranda{scroll-margin-top:88px}

/* --- 2b. Penunjuk gulir, gantian scrollbar bawaan ---
   Scrollbar bawaan disembunyikan karena kehadirannya mengubah lebar layar:
   halaman depan pas satu layar (tak bergulir, tanpa scrollbar), halaman isi
   panjang (dengan scrollbar), dan pergantian itu terjadi PERSIS di tengah
   layar transisi, jadi semua posisi tampak bergeser menyesuaikan diri.
   Gantinya: penunjuk emas setipis pensil di tepi kanan yang hanya tampak
   selagi menggulir, memudar ketika berhenti, dan panjangnya mencerminkan
   seberapa panjang dokumen. Dan ia bukan pajangan: bisa disentuh. Menyeret
   ibu jarinya menggulirkan halaman, mengklik jalurnya melompat ke tempat
   itu, dan mendekat kepadanya menebalkannya sedikit sebagai ajakan
   (perilakunya di js/app.js). Guliran roda dan sentuhan tak terpengaruh. */
html{scrollbar-width:none}                       /* Firefox */
html::-webkit-scrollbar,body::-webkit-scrollbar{display:none;width:0;height:0}
.gulir{position:fixed;top:0;right:0;bottom:0;width:14px;z-index:96;
    opacity:0;transition:opacity .45s ease;touch-action:none}
/* Z-96: di atas kepala halaman (95). Tanpa ini 72px teratas jalurnya
   mati, tertutup kotak kepala yang melintang selebar jendela. Sisi kanan
   kepala memang kosong (hanya bantal 34px), jadi tidak ada tombol yang
   tertutup. Selagi layar sapuan berjalan ia mengalah penuh. */
body.sapu-jalan .gulir{opacity:0 !important}
/* Tampak selagi menggulir, selagi diarahkan, dan selama ibu jarinya
   dipegang (.gulir-ditahan), berapa lamapun tangan diam. */
body.sedang-gulir .gulir,body.gulir-ditahan .gulir,.gulir:hover{opacity:1}
.gulir i{position:absolute;right:3px;top:4px;width:4px;border-radius:999px;
    background:linear-gradient(180deg,#F5D78A,#C98B2E);
    box-shadow:0 0 10px rgba(240,195,107,.4);cursor:grab;
    transition:width .25s ease,right .25s ease}
.gulir:hover i,body.gulir-ditahan .gulir i{width:6px;right:2px}
body.gulir-ditahan .gulir i{cursor:grabbing}
body.gulir-ditahan{user-select:none;-webkit-user-select:none}
/* Perangkat sentuh punya penunjuk gulirnya sendiri; milik ini cuma untuk
   penunjuk tetapis. */
@media (hover:none){.gulir{display:none}}

/* ===== 3. Hero =====
   Layar pembuka penuh: tingginya sekali layar, isi di kiri, dan ruang kanan
   sengaja dikosongkan sebagai tempat foto pengurus yang akan datang; sementara
   itu pendaran emas dan bara menempati zonanya. Latar berlapis: gradasi
   maroon, pola titik, pendaran emas, vinyet, plus bara emas yang melayang
   pelan (canvas .bara, digambar js/app.js). Warnanya sengaja sama di dua
   tema: inilah blok merek halaman, yang terang pun tetap maroon. */
/* Lapisan latar hero dipisah ke variabel tingkat akar supaya gampang
   dipakai ulang di luar hero bila kelak perlu (dulu tirai sapu antarhalaman
   memakainya; kini layar sapuan punya gradasi sendiri yang lebih gelap).
   Posisi pendarannya memakai fallback var(--glow-x,76%), jadi dipakai di
   luar hero pun tetap sah. Foto stok sempat dicoba sebagai lapisan dasar
   (gradasinya dibuat tembus) lalu DIBUANG: di halaman resmi, foto orang
   asing terasa janggal, dan gradasinya kehilangan kedalaman maroonnya.

   Butir titiknya sempat dipertegas ke .14/2px supaya latarnya tidak terasa
   rata, lalu DIBUANG lagi: pada jarak 30px ia terbaca sebagai kertas
   bergaris, bukan sebagai permukaan, dan kisi rapi seperti itu bersaing
   dengan kelopak lotus yang justru bergerak bebas di atasnya. Yang
   menghidupkan latar ini kelopaknya, bukan butirnya. */
:root{
  --lapisan-hero:
    radial-gradient(950px 640px at var(--glow-x,76%) var(--glow-y,44%),rgba(224,166,60,.30),transparent 63%),
    radial-gradient(900px 520px at 8% 112%,rgba(46,7,9,.55),transparent 58%),
    radial-gradient(130% 110% at 62% 36%,transparent 55%,rgba(26,3,5,.5) 100%),
    linear-gradient(158deg,#8E1F24 0%,#B4232A 46%,#6E1418 100%);
}
.hero{position:relative;overflow:hidden;color:#F9EFE9;
    --glow-x:76%; --glow-y:44%;
    min-height:100vh;min-height:100svh;
    display:flex;align-items:center;
    background:var(--lapisan-hero);
    background-size:auto,auto,auto,auto}
/* Saat digulir, latarnya terasa tertambat (ala rujukan yang disukai
   pengunjung). Hanya di layar besar; iOS mengabaikan attachment:fixed, dan
   membiarkannya begitu lebih baik daripada gambarnya melompat-lompat. */
@media(min-width:821px){.hero{background-attachment:fixed}}
/* Kanvas bara: partikel emas halus di atas maroon, memenuhi satu layar. */
.hero .bara{position:absolute;inset:0;width:100%;height:100%;pointer-events:none}
/* Motif garis lambang, ditirukan dari kartu pratinjau beranda dan layar
   sapu: ruang kosong hero tidak pernah benar-benar kosong, ia berisi
   tekstur bermerek yang nyaris tak tampak (7%). Lapisan ::after sengaja
   TANPA transform apa pun: identitas transform pun mematikan
   background-attachment:fixed milik .hero di layar besar. */
.hero::after{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
    background:url(../img/pola-tirai.png) repeat;background-size:360px 360px;
    opacity:.07}

/* --- 3b. Dua halaman dan layar sapuannya ---
   Berlaku hanya bila js/app.js memasang kelas .zegerak di <html>: pengunjung
   yang mengizinkan animasi. Tanpa itu kedua .halaman tampil menumpuk sebagai
   satu dokumen yang mengalir biasa (perilaku lama), dan .sapu-layar tidak
   pernah terlihat.

   Bila aktif, hanya satu .halaman yang tampak pada satu waktu. Berpindah
   halaman digerakkan IIFE "Perute halaman" di js/app.js dengan satu layar
   transisi bermerek: layar maroon bermotif garis kedua logo dengan nama
   OSIS di tengahnya memudar menutupi isi, isi ditukar di baliknya selagi
   layar berdiam sebentar (rasa loading premium), kilau emas menyapu nama,
   lalu layar memudar lagi membuka halaman yang dituju. Tidak ada tirai yang
   menggeser; yang ada hanyalah kemunculan dan kemudaran layar ini. Hash
   tetap menjadi alamat (#beranda, #tentang, #agenda, dst.), jadi tombol
   mundur browser dan tautan langsung tetap bekerja tanpa memuat ulang. */
html.zegerak .halaman{display:none}
html.zegerak .halaman.aktif{display:block}
/* Layar transisi: tetap di tempat (tanpa transform) supaya motifenya benar-
   benar still; yang berubah hanya kemunculan dan kemudarannya. Z-89: di
   bawah kepala halaman (95), di atas isi. */
.sapu-layar{position:fixed;inset:0;z-index:89;pointer-events:none;
    visibility:hidden;opacity:0;
    transition:opacity .55s ease,visibility 0s linear .55s;
    background:linear-gradient(160deg,#7C181D 0%,#8E1F24 46%,#5C0F13 100%)}
.sapu-layar::before{content:"";position:absolute;inset:0;
    background:url(../img/pola-tirai.png) repeat;background-size:360px 360px;
    opacity:.5}
.sapu-layar.tampak{visibility:visible;opacity:1;
    transition:opacity .38s ease,visibility 0s}
/* Nama di tengah layar. Jeda hurufnya melebar-lalu-mampu saat layar tampak,
   dan warnanya bukan warna pas: ia gradasi emas yang diklip ke huruf, dan
   posisi gradasinya dianimasikan sehingga sebilah kilau terang menyapu
   namanya dari kiri ke kanan selagi layar berdiam. */
.sapu-tengah{position:absolute;left:24px;right:24px;top:50%;
    transform:translateY(-50%);text-align:center;color:#F0C36B}
/* Garis emas pembuka: pengganti tulisan "Organisasi Siswa Intra Sekolah"
   yang dibuang karena mengajari orang membaca saat seharusnya menikmati.
   Ia terentang pelan dari tengah begitu layar tampak, pembuka yang diam. */
.sapu-tengah .garis-sapu{display:block;width:170px;height:1px;margin:0 auto 4px;
    background:linear-gradient(90deg,rgba(240,195,107,0),rgba(240,195,107,.9) 30%,rgba(240,195,107,.9) 70%,rgba(240,195,107,0));
    box-shadow:0 0 12px rgba(240,195,107,.35);
    transform:scaleX(0);
    transition:transform .9s var(--ease) .1s}
.sapu-layar.tampak .garis-sapu{transform:scaleX(1)}
.sapu-tengah .cat{display:block;font-size:11px;font-weight:600;
    letter-spacing:5px;text-transform:uppercase;color:rgba(240,195,107,.72);
    opacity:0;transition:opacity .5s ease .15s}
.sapu-tengah b{display:inline-block;font-family:var(--serif);font-weight:600;
    font-size:clamp(30px,4.6vw,54px);line-height:1.25;margin:10px 0 12px;
    letter-spacing:.34em;opacity:0;
    transition:letter-spacing .7s var(--ease),opacity .5s ease}
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .sapu-tengah b{
    /* Tiga lapis latar, semuanya diklip ke huruf: di atas bilah kilau yang
       disapu, di bawah gradasi emas logam tegak (gelap di bawah, nyala di
       atas, dengan sebilah bayangan memantul di tengah batang huruf).
       Bilah kilaunya MIRING 135 derajat dan SENYAP: pitanya hanya 6% lebar
       garis gradasi, jadi yang melintas benar-benar bilah cahaya tipis,
       bukan selimut terang. Dua hal itu yang membuat sapuannya menyerong
       seperti rujukan: pita lebar pada sudut miring tetap terbaca sebagai
       selimut, dan sudut dangkal (105 derajat, versi lama) membuat bilahnya
       nyaris tegak sehingga seluruh nama menyala serentak.
       Karena bilahnya menyerong, tiap huruf tersapu lebih lama, jadi
       durasinya boleh panjang dan terasa satu tarikan.
       Diuji di work/preview/kilau-sudut2.html sebelum dipindahkan ke sini. */
    background-image:
      linear-gradient(135deg,rgba(255,255,255,0) 47%,rgba(255,250,228,.98) 50%,rgba(255,255,255,0) 53%),
      linear-gradient(180deg,#FFF7D6 0%,#FFE9A6 13%,#F2C14E 30%,#C8912B 45%,#93600F 57%,#7B4E0A 64%,#C8962F 77%,#F3D67C 90%,#FFF3C9 100%);
    background-size:220% 100%,100% 100%;
    background-position:100% 0,0 0;
    background-repeat:no-repeat,no-repeat;
    -webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;color:transparent;
    /* Bayangan huruf tetap tergambar meski isinya latarnya: satu garis
       nyala di tepi atas dan satu daleman lembut, memberi ketebalan. */
    text-shadow:0 1px 0 rgba(255,244,200,.28),0 4px 14px rgba(46,18,3,.55),
                0 0 30px rgba(240,195,107,.22)}
}
.sapu-layar.tampak .sapu-tengah .cat{opacity:1}
/* Kilaunya LINGARAN tanpa henti, bukan satu sapuan yang selesai: persis
   sama dengan layar muat di halaman detail (css/tirai.css). Dulu di sini
   sapuan sekali jalan lalu berhenti, dan di halaman detail kilaunya
   mati begitu layar membuka; hasilnya kilau "putus" di tengah perjalanan
   berpindah halaman. Karena kedua layar memakai lingaran yang sama, kilau
   terasa menyambung dari halaman utama ke halaman detail dan pulang
   kembali: selama ada layar yang tampak, kilaunya pasti sedang menyapu. */
.sapu-layar.tampak .sapu-tengah b{letter-spacing:.14em;opacity:1;
    animation:kilau-emas 2.6s cubic-bezier(.45,.05,.55,.95) .3s infinite}
/* Sapuan kilau: dari tepi kiri nama ke tepi kanannya (posisi latar 100%
   menaruh bilah terang di kiri huruf, 0% di kanannya). Lapisan gradasi
   logamnya tidak ikut digerakkan: posisinya disangkal di tiap keyframe.
   Karena bilahnya kini miring dan jauh lebih tinggi daripada teks, tiap
   huruf tersapu lebih lama, jadi durasinya dinaikkan supaya sapuannya
   tetap terasa satu tarikan, bukan berhenti di tengah. */
@keyframes kilau-emas{
    from{background-position:100% 0,0 0}
    to{background-position:0% 0,0 0}}
/* Kepulangan dari halaman detail (agenda/bidang): kelas sapu-awal dipasang
   skrip inline di <head> hanya bila js/tirai.js di halaman sebelumnya
   mencatat tanda di sessionStorage. Layarnya menunggu dalam keadaan
   tertutup sejak cat pertama (transisinya dimatikan supaya tak
   memudar-mudar di awal), lalu Perute melepas kelasnya selagi layar
   memudar membuka halaman. Wujud dalamnya dipaksa ke keadaan finalnya
   tanpa animasi kemunculan: layar muat memang sudah ada di sana. */
html.sapu-awal .sapu-layar{visibility:visible;opacity:1;transition:none}
/* Sama dengan tirai-dasar di css/tirai.css: selagi layar kepulangan
   menutup, kanvas dokumen diwarnai dasar tirai supaya kadar prapulih
   (bfcache) yang keburu dilukis browser tak pernah memperlihatkan
   putih kosong di belakang tirai. Kelasnya hilang bersamaan dengan
   pembukaan layar, di bawah tirai yang masih pekat. */
html.sapu-awal{background:#7C181D}
html.sapu-awal .sapu-layar .garis-sapu{transform:scaleX(1)}
html.sapu-awal .sapu-layar .cat{opacity:1}
html.sapu-awal .sapu-layar b{opacity:1;letter-spacing:.14em;
    animation:kilau-emas 2.6s cubic-bezier(.45,.05,.55,.95) .3s infinite}
/* Menu dan burger halaman utama tidak ada di kepala halaman detail, jadi
   keduanya menyingkir dari panggung SELAGI layar menutup dan baru kembali
   setelah layar membuka: yang tertukar di tengah perjalanan jadi dua bilah
   yang isinya persis sama (logo + tombol tema), tak ada elemen yang
   bintik hilang saat dokumen ditukar. Pulau juga dilabuhkan oleh
   js/app.js selagi sapu-jalan, jadi wujudnya saat menutup = puncak
   transparan = wajah yang ditunggu kepala halaman detail di seberang. */
body.sapu-jalan nav.main,body.sapu-jalan .burger{opacity:0}
html.sapu-awal nav.main,html.sapu-awal .burger{opacity:0;transition:none}
/* --- Pembuka terkunci (sapu-buka) ---
   Saat layar melepas tampak/sapu-awalnya, Perute memasang sapu-buka lebih
   dulu. Dulu pelepasan memulangkan isi layar ke keadaan dasarnya: jarak
   huruf nama menyusut dari .14em ke .34em SELAGI layarnya memudar, dan di
   layar sempit keadaan akhir itu melipat nama jadi dua baris, terbaca
   kedipan sesaat di ujung layar muat. Kini isi layar BEKU di wujud
   tampaknya (nama tetap .14em dan kilaunya terus berputar) dan hanya
   lapirannya yang memudar, persis cara tirai halaman detail membuka diri.
   Kelasnya dilepas lagi setelah pemudaran tuntas; saat itu layarnya sudah
   tak terlihat, jadi pemulangannya ke keadaan dasar tak berpandang. */
.sapu-layar.sapu-buka{visibility:visible;opacity:0;
    transition:opacity .55s ease,visibility 0s linear .55s}
.sapu-layar.sapu-buka .garis-sapu{transform:scaleX(1)}
.sapu-layar.sapu-buka .sapu-tengah .cat{opacity:1}
.sapu-layar.sapu-buka .sapu-tengah b{letter-spacing:.14em;opacity:1;
    animation:kilau-emas 2.6s cubic-bezier(.45,.05,.55,.95) .3s infinite}
/* .hero-in adalah .wrap yang sama: margin auto milik .wrap tetap dipakai
   supaya kolom isinya segaris dengan kepala halaman, dan padding shorthand
   jangan menimpa padding horizontal .wrap (dua-duanya specificity sama,
   urutan berkas menang). Cukup batas lebar teksnya; sisanya kanan untuk
   zona foto. */
.hero-in{position:relative;z-index:1;padding-top:130px;padding-bottom:150px;
    /* Lebar penuh kolom .wrap: tanpa ini, sebagai anak flex ia mengecil
       mengikuti isinya, dan tepi kirinya meleset dari kepala halaman. */
    width:100%}
h1{font-family:var(--serif);font-size:clamp(38px,5vw,56px);line-height:1.08;
    letter-spacing:-.5px;font-weight:700}
h1 em{font-style:normal;color:var(--red)}
.lead{margin:20px 0 30px;font-size:18px;color:var(--muted);max-width:540px}
/* Teks hero di atas maroon: krem hangat dan emas, bukan putih dingin.
   Nadanya kini tiga tingkat: sapaan kecil, nama organisasi besar beremas
   logam, lalu kalimat penyerta. Sapaan memakai ukuran dan jarak huruf yang
   sama dengan catatan di layar transisi, jadi halaman depan terasa lanjutan
   dari layar yang baru saja dilihat pengunjung. */
.hero .sapa{margin:0 0 16px;font-size:12px;font-weight:600;letter-spacing:3.5px;
    text-transform:uppercase;color:rgba(250,225,160,.95)}
.hero h1{color:#F3D67C;font-size:clamp(40px,5.6vw,62px);line-height:1.04;
    letter-spacing:.004em}
/* Emas logam judul: gradasi TERANG saja, tanpa pita pantul gelap yang dipakai
   nama di layar transisi. Di sana latarnya maroon tua; di sini maroon terang,
   jadi pita gelap #7B4E0A itu jatuh ke kontras sekitar 1,1:1 dan separuh
   batang huruf akan menyatu dengan latar. Tiga berhenti terang berturut-turut
   memberi kesan logam tanpa mengorbankan keterbacaan. Ujung bawah gradasinya
   sengaja tidak lebih gelap dari #F3CC77: diukur langsung pada tangkapan
   dengan judul disembunyikan, #E0A63C cuma 2,9:1 terhadap pendar emas di
   belakangnya, sedangkan teks sebesar ini butuh 3:1. Kilau bergeraknya juga
   tidak dipakai: panggungnya sudah punya di layar transisi, dan judul ini
   beranimasi ulang setiap kali pengunjung kembali ke beranda. */
@supports ((-webkit-background-clip:text) or (background-clip:text)){
  .hero h1{
    background-image:linear-gradient(180deg,#FFFAE6 0%,#FDEBB4 32%,#F7D98D 68%,#F3CC77 100%);
    background-repeat:no-repeat;
    -webkit-background-clip:text;background-clip:text;
    -webkit-text-fill-color:transparent;color:transparent;
    text-shadow:0 1px 0 rgba(255,244,200,.22),0 6px 20px rgba(46,18,3,.42)}
}
/* Kalimat penyerta sengaja dibatasi 520px: pada 560px kalimatnya pecah
   meninggalkan "SMAN 3 Yogyakarta" sendirian di baris kedua, dan pada 520px
   pecahnya jatuh setelah "kegiatan" sehingga kedua baris seimbang. */
.hero .lead{color:rgba(255,240,232,.85);font-size:19px;margin:22px 0 0;max-width:520px}
.hero .cta{display:flex;gap:14px;flex-wrap:wrap;margin-top:38px}
.btn{display:inline-block;padding:12px 26px;border:0;border-radius:8px;text-decoration:none;
    font-weight:600;font-size:15px;margin-right:10px;
    transition:background .25s,color .25s,border-color .25s,transform .45s var(--ease),box-shadow .45s var(--ease)}
/* Border:0 di atas penting: tombol popup ini elemen <button> sungguhan, dan
   browser menggambar bordernya sendiri (kelabu, makin terang di tema gelap)
   kalau tidak dihapus. Sebelumnya cincin kelabu itu mengikutinya ke mana-mana
   dan sempat dikira cincin fokus. */
.btn:hover{transform:translateY(-3px) scale(1.05)}
/* Tekanan: sentuhan terakhir microinteraction, tombol merespons jari
   sebelum halamannya berpindah. */
.btn:active{transform:translateY(-1px) scale(.97);transition-duration:.12s}
.btn.p{background:var(--red);color:#fff}
.btn.p:hover{background:var(--red-deep);box-shadow:0 12px 30px rgba(180,35,42,.35)}
.btn.s{border:1px solid var(--line);color:var(--ink)}
.btn.s:hover{border-color:var(--red);color:var(--red);box-shadow:0 10px 24px rgba(36,20,23,.1)}
/* Tombol hero di atas maroon: pil besar yang terasa penting, bukan sekadar
   tautan. Sekarang cuma satu, dan ia pintu masuk ke bagian Tentang.
   Tingginya turun dari 60px ke 58px setelah judulnya turun ke 62px: pil 60px
   hampir setinggi huruf judulnya sendiri sehingga massa emasnya berebut
   perhatian dengan judulnya.
   Border transparan tetap dipertahankan meski tombol keduanya sudah tidak
   ada: border 1px inilah yang menjaga tingginya sama dengan tombol .btn
   lain di halaman (Buka Peta Kabinet), dan menghapusnya akan membuat dua
   tombol emas situs ini beda tinggi 2px. */
.hero .btn{margin-right:0;border-radius:999px;padding:15px 30px;font-size:15.5px;
    border:1px solid transparent;
    display:inline-flex;align-items:center;gap:10px}
.hero .btn.p{background:linear-gradient(180deg,#F3CB79,#E8B54A);color:#46280A;
    box-shadow:0 12px 30px rgba(0,0,0,.28),0 4px 16px rgba(232,181,74,.35)}
.hero .btn.p:hover{background:linear-gradient(180deg,#F6D48A,#F0C36B);
    box-shadow:0 18px 42px rgba(0,0,0,.36),0 6px 20px rgba(232,181,74,.5)}
/* Panah turun di dalam tombol: menandakan bahwa menekannya membawa
   pengunjung MASUK ke halaman isi, bukan ke tautan luar. Ia bergeser turun
   naik pelan terus-menerus, satu-satunya gerakan di tombol ini; tanpa itu
   tombolnya diam dan arahnya cuma bisa ditebak dari kata "Jelajahi". */
.hero .btn .panah{width:15px;height:15px;flex:0 0 auto;
    fill:none;stroke:currentColor;stroke-width:1.7;
    stroke-linecap:round;stroke-linejoin:round;
    animation:panahTurun 1.9s ease-in-out infinite}
@keyframes panahTurun{
    0%,100%{transform:translateY(-2px);opacity:.72}
    50%{transform:translateY(2px);opacity:1}}
/* Gerakan panahnya ikut mati bagi pengunjung yang meminta tanpa animasi. */
body.noanim .hero .btn .panah,
html.zegerak body.noanim .hero .btn .panah{animation:none;opacity:1}

/* --- Busur antarbagian ---
   Transisi antarbagian bukan lagi garis lurus: svg tipis setinggi 74px
   membentuk busur. Isinya tiga macam: kertas (mengikuti var(--paper), jadi
   ikut berganti tema), kepala pita bidang, dan kepala footer. Busur atas
   pita dan footer menempel di LUAR bagian masing-masing (top -73px) supaya
   lengkungannya menjorok ke bagian tetangga, bukan menimpa isinya. Warnanya
   harus sama persis dengan warna ujung gradasi bagian itu, supaya
   sambungannya tidak terlihat. Busur bawah pita beda perilaku: ia mengukir
   dari dalam (lihat catatan di bawah). */
.lengkung{position:absolute;left:0;width:100%;height:74px;display:block;pointer-events:none}
.lengkung path{fill:var(--paper)}
.hero .lengkung{bottom:-1px}
.malam .lengkung.atas{top:-73px}
.malam .lengkung.atas path{fill:#571418}
/* Busur bawah pita dipasang DI DALAM pita (bottom:-1px, sama seperti hero)
   dan berisi kertas: ia "mengukir" tepi bawah pita melengkung. Dulu busur
   ini menggantung di luar pita sambil berisi warna gelap #2B0C0E, jadi di
   tema terang ia tampak sebagai pita nyaris hitam antara pita maroon dan
   bagian putih. Kertas di atas kertas memang tak terlihat di tema terang,
   tapi justru itu tepinya: yang terbaca hanyalah tepi melengkung pita. */
.malam .lengkung.bawah{bottom:-1px}
footer.site{position:relative}
footer.site .lengkung{top:-73px}
footer.site .lengkung path{fill:#2B1215}
/* Bagian yang dilewati busur diberi ruang napas ekstra. */
#agenda{padding-bottom:130px}
#pengurus{padding-top:130px}

/* --- Motif zigzag di bawah judul bagian ---
   Satu motif kecil yang diulang di setiap judul, murah tapi menempel di
   ingatan: tanda tangan visual halaman. Warnanya merah padma, di pita gelap
   berganti emas. */
.zikzak{display:block;width:78px;height:11px;margin:10px 0 4px}
.zikzak path{fill:none;stroke:var(--red);stroke-width:2.6;stroke-linecap:round;
    stroke-linejoin:round;opacity:.9}
.malam .zikzak path{stroke:#F0C36B}

/* Butir kertas ikut melengkung (putaran 20): svg busur bawah pita menutup
   butir di badannya dengan isian warna rata, sehingga tepi butir membentuk
   garis lurus di bawah lengkung, bukan mengikuti lengkungnya. Lapisan
   butir bertopeng path yang sama persis mengembalikan butir ke area itu,
   jadi butir "mengalir" melewati busur tanpa patah. Butirnya ubin PNG
   yang sama dengan latar halaman (dua tema), topengnya svg data-uri yang
   ikut meregang bersama busur. */
section.malam::after{content:"";position:absolute;left:0;bottom:-1px;width:100%;
    height:74px;pointer-events:none;
    background:url(../img/butir-terang.png) repeat;background-size:180px 180px;
    -webkit-mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 74' preserveAspectRatio='none'%3E%3Cpath d='M0 74 L0 48 Q720 -24 1440 48 L1440 74 Z'/%3E%3C/svg%3E");
    mask-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 74' preserveAspectRatio='none'%3E%3Cpath d='M0 74 L0 48 Q720 -24 1440 48 L1440 74 Z'/%3E%3C/svg%3E");
    -webkit-mask-size:100% 100%;mask-size:100% 100%;
    -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}
html[data-tema="gelap"] section.malam::after{
    background-image:url(../img/butir-gelap.png)}

/* --- Hiasan latar bagian ---
   Pola titik lama agenda sudah digantikan motif kawung (lihat aturan
   #agenda::before di bagian 7): satu seksi satu motif, bukan dua. */

/* ===== 4. Bagian umum ===== */
section{padding:72px 0}
section.tint{background:var(--tint)}
h2{font-family:var(--serif);font-size:clamp(26px,3vw,34px);margin-bottom:8px}
.sub{color:var(--muted);max-width:640px;margin-bottom:38px}
/* Kata beraksen di dalam judul bagian: serif miring emas, gembok kecil yang
   membuat judul terasa dirangkai, bukan diketik. */
h2 em{font-style:italic;color:var(--gold)}

/* ===== 5. Tentang =====
   Foto gedung memenuhi lebar layar, teks berdiri di bagian yang
   digelapkan. Dulu dua panel ala halaman masuk Reborn, tapi di ponsel
   hasilnya berantakan: foto terpotong sempit seperti tirai, sisi kanannya
   menganggur, dan pertemuan foto ke latar terasa seperti garis potong.
   Sekarang satu foto landscape penuh dengan teks di zonanya yang gelap. */
#tentang{padding:0}
/* ===== Foto selebar layar, teks di zonanya =====
   Satu foto landscape memenuhi lebar jendela dari tepi ke tepi; teksnya
   berdiri di bagian bawah foto yang digelapkan .lindung, jadi teksnya
   selalu terang di dua tema: ia duduk di atas foto yang digelapkan, bukan
   di atas kertas. Fotonya sengaja tanpa orang (potongan atas foto dokumen
   OSIS). Tepi bawah foto di-topeng gradasi supaya melebur ke latar halaman
   tanpa garis potong yang kasar; karena topeng menghabiskan ~20% bawah,
   teks sengaja ditambatkan di atas zona melebur itu. */
.lebar-foto{position:relative;margin:0;
    -webkit-mask:linear-gradient(180deg,#000 80%,transparent 99%);
            mask:linear-gradient(180deg,#000 80%,transparent 99%)}
.lebar-foto img{display:block;width:100%;height:clamp(420px,82vh,700px);
    object-fit:cover;object-position:50% 38%}
.lindung{position:absolute;inset:0;pointer-events:none;background:
    linear-gradient(180deg,rgba(24,10,10,.38) 0%,rgba(24,10,10,.05) 26%,
                    rgba(24,10,10,.22) 46%,rgba(26,11,10,.88) 92%)}
.lebar-foto figcaption{position:absolute;left:0;right:0;
    bottom:clamp(126px,18vh,180px)}
.lebar-foto h2{margin-bottom:8px;color:#FFF7F0;
    font-size:clamp(30px,4.2vw,44px);
    text-shadow:0 2px 24px rgba(20,8,8,.75)}
.lebar-foto h2 em{color:#F0C36B}
.lebar-foto p{margin:0;max-width:620px;color:rgba(255,240,232,.92);
    font-size:17px;text-shadow:0 1px 14px rgba(20,8,8,.85)}

/* struktur: pohon organisasi telah pindah ke Peta Kabinet; tombol peta ada
   di bagian pengurus. */

/* ===== 6. Peta kabinet (layar penuh) =====
   Peta punya dua tema. Warnanya diatur lewat variabel, dan variabelnya
   ditimpa di dalam .frame saja, jadi tema peta tidak merembet ke halaman
   utama. Tema aktifnya mengikuti pilihan situs (js/tema.js), sama dengan
   halaman utama; CSS di s hanya mengatur masing-masing wujudnya. */
.frame{
  --peta-bg:#2A1518; --peta-panel:#35191C; --peta-line:#532D2F;
  --peta-bar:#361A1D; --peta-bar-ink:#F6ECE8; --peta-bar-line:#532D2F;
  --peta-ink:#F6ECE8; --peta-muted:#C9B3AC;
  --peta-aksen:#E0A63C;
  --kartu-bawah:#301619; --kartu-garis:#552F31; --kartu-muted:#C6B0A9;
  --pil:#F6ECE8; --pil-teks:#2A1518;
  --peta-garis:#74494A;
}
/* Tema terang sengaja tidak dibuat sekadar kebalikan tema gelap. Bilah atasnya
   memakai maroon yang sama dengan kaki halaman, jadi dua tema ini terasa
   sama-sama "satu keluarga" dengan situsnya: yang gelap megah, yang terang
   terasa seperti kertas sertifikat. */
.frame[data-tema="terang"]{
  --peta-bg:#F7F0EA; --peta-panel:#FFFDFB; --peta-line:#E7DAD2;
  --peta-bar:#2B1215; --peta-bar-ink:#F3E4E0; --peta-bar-line:#4A2A2C;
  --peta-ink:#241417; --peta-muted:#7A666B;
  --peta-aksen:#A9760B;
  --kartu-bawah:#FDFAF6; --kartu-garis:#EADFDA; --kartu-muted:#7A666B;
  --pil:#241417; --pil-teks:#FFFFFF;
  --peta-garis:#D9BDB8;
}

/* Tombol lamanya dipusatkan otomatis (display:block + margin auto); wujudnya
   kini baris pintu .pintu-kabinet di bagian pesan, jadi aturan id ini tiada. */
.frame{position:fixed;inset:0;z-index:100;background:var(--peta-bg);
    color:var(--peta-ink);display:none;flex-direction:column}
.frame.open{display:flex}
.frame-bar{display:flex;align-items:center;gap:12px;padding:12px 26px;background:var(--peta-bar);
    color:var(--peta-bar-ink);border-bottom:1px solid var(--peta-bar-line);flex-wrap:wrap}
/* Tombol kembali: menggantikan judul dan tombol Tutup. Petanya lapisan
   di atas halaman utama, jadi kembali = menutup peta. */
.fbtn.kembali{display:inline-flex;align-items:center;gap:9px;margin-right:auto;
    font:inherit;font-size:14px;font-weight:600;padding:9px 18px;cursor:pointer}
.fbtn.kembali svg{width:13px;height:13px;stroke:currentColor;fill:none;
    stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round}
/* Pemilih periode: tombol pemicu + daftar tegak yang seluruhnya terlihat,
   supaya melompat jauh ke tahun lain tidak perlu menggulir select bawaan. */
.periode{position:relative}
.periode-tombol{display:inline-flex;align-items:center;gap:10px;font:inherit;
    font-size:13.5px;padding:9px 14px;cursor:pointer;color:var(--peta-ink);
    border:1px solid var(--peta-bar-line);border-radius:10px;background:var(--peta-panel)}
/* Latar tombolnya panel (--peta-panel), bukan bilahnya, jadi teksnya memakai
   tinta panel --peta-ink. Dulu teksnya --peta-bar-ink: pas di tema gelap,
   tapi di tema terang bilahnya maroon sementara tombolnya nyaris putih,
   sehingga tahun "2026/2027" berupa teks merah muda pucat di atas putih,
   nyaris tak terbaca. */
.periode-tombol span{font-size:10.5px;letter-spacing:1.6px;text-transform:uppercase;
    color:var(--peta-muted)}
.periode-tombol b{font-weight:600}
.periode-tombol svg{width:13px;height:13px;stroke:var(--peta-muted);fill:none;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;transition:transform .3s}
.periode-tombol[aria-expanded="true"] svg{transform:rotate(180deg)}
.periode-daftar{position:absolute;top:calc(100% + 8px);left:0;z-index:30;
    min-width:230px;max-height:280px;overflow:auto;padding:6px;
    border:1px solid var(--peta-bar-line);border-radius:12px;
    background:var(--peta-panel);box-shadow:0 24px 54px rgba(0,0,0,.45)}
.periode-daftar button{display:flex;width:100%;align-items:baseline;gap:10px;
    font:inherit;font-size:13.5px;text-align:left;cursor:pointer;color:var(--peta-ink);
    background:none;border:0;border-radius:8px;padding:10px 12px}
.periode-daftar button:hover{background:rgba(224,166,60,.12)}
.periode-daftar button.act{color:var(--peta-aksen);font-weight:700;
    background:rgba(224,166,60,.15)}
/* Terang: emas #A9760B di atas panel nyaris putih kontrasnya cuma sekitar
   4:1, keburu menyatu dengan latarnya. Teksnya digelapkan dan bilah emasnya
   ditebalkan, supaya periode yang menjabat jelas terbaca sebagai terpilih. */
.frame[data-tema="terang"] .periode-daftar button.act{color:#6B4A05;
    background:rgba(224,166,60,.24)}
.periode-daftar .tandai{font-size:10px;letter-spacing:1.2px;text-transform:uppercase;
    color:var(--peta-muted);margin-left:auto}
.fbtn{border:1px solid var(--peta-bar-line);background:transparent;border-radius:8px;min-width:34px;
    height:34px;font-size:16px;cursor:pointer;color:var(--peta-bar-ink)}
.fbtn:hover{border-color:var(--peta-aksen);color:var(--peta-aksen)}
/* Tombol tema memakai ikon matahari/bulan yang ditukar lewat data-tema, jadi
   tidak perlu dua tombol terpisah. */
.fbtn.tema{display:flex;align-items:center;justify-content:center}
.fbtn.tema::before{content:"\263E";line-height:1}          /* bulan = tema gelap aktif */
.frame[data-tema="terang"] .fbtn.tema::before{content:"\2600"}   /* matahari */
.frame-viewport{position:relative;flex:1;overflow:auto;cursor:grab;background:var(--peta-bg);
    /* Latar diberi titik halus dan cahaya lembut di tengah atas. Ini yang
       membuat petanya terasa seperti kertas infografis, bukan bidang kosong. */
    background-image:
      radial-gradient(circle at 50% 0,rgba(224,166,60,.10),transparent 46%),
      radial-gradient(rgba(255,255,255,.05) 1px,transparent 1px);
    background-size:auto,26px 26px;
    /* Sentuhan diserahkan penuh ke penjelajah peta ini: satu jari menggeser,
       dua jari mencubit. Bila diserahkan ke browser (pan-y), gerakan jari
       direbut untuk menggulir halaman dan cubitan nyaris tak pernah sampai
       ke js/peta.js. */
    touch-action:none;
    -webkit-overflow-scrolling:touch}
.frame[data-tema="terang"] .frame-viewport{
    background-image:
      radial-gradient(circle at 50% 0,rgba(201,138,18,.16),transparent 44%),
      radial-gradient(circle at 50% 100,rgba(180,35,42,.06),transparent 40%),
      radial-gradient(rgba(36,20,23,.055) 1px,transparent 1px);
    background-size:auto,auto,26px 26px}
.frame-viewport.dragging{cursor:grabbing}
.zoomwrap{transform-origin:0 0}

/* Lebar kanvasnya dihitung js/peta.js sesuai isi baris bidangnya (satu baris
   mendatar), ditambah bantal geser 680px di kedua sisi: batas geser terjauh
   justru ketika kotak paling tepi pas berada di tengah layar. Angka 3900px
   di sini hanya cadangan kalau JavaScript tidak jalan. */
.canvas{position:relative;width:3900px;padding:54px 680px 130px;user-select:none}

/* Kepala peta */
.peta-head{text-align:center;margin-bottom:48px}
.peta-atas{display:block;font-size:12px;color:var(--peta-muted);letter-spacing:2.6px;
    text-transform:uppercase;margin-bottom:8px}
.peta-head b{font-family:var(--serif);font-size:34px;display:block;line-height:1.15}
.peta-head em{display:inline-block;margin-top:12px;font-style:normal;font-size:12px;
    font-weight:700;letter-spacing:1.6px;color:var(--peta-aksen);
    border:1px solid var(--peta-line);background:var(--peta-panel);
    padding:5px 16px;border-radius:999px}

/* Baris pimpinan: pohon bertingkat, seperti bagan organisasi. Tiap tingkat
   satu baris kartu di tengah, tersambung garis tegak pendek antar baris:
   ketua umum, lalu para ketua, lalu sekretaris dan bendahara umum, terakhir
   para stafnya. Lebar panel mengikuti baris terisi, bukan selebar peta. */
.lini{background:var(--peta-panel);border:1px solid var(--peta-line);border-radius:22px;
    padding:26px 34px 30px;margin:0 auto 96px;width:-moz-fit-content;width:fit-content;
    box-shadow:0 18px 44px rgba(0,0,0,.28);scroll-margin-top:28px}
.frame[data-tema="terang"] .lini{box-shadow:0 12px 34px rgba(36,20,23,.07)}
.lini-head{margin-bottom:20px}
.lini-tag{font-size:10.5px;font-weight:700;letter-spacing:2px;text-transform:uppercase;
    color:var(--peta-aksen)}
.lini-head h4{font-family:var(--serif);font-size:22px;margin-top:3px}
.lini-tier{display:flex;justify-content:center;gap:14px;flex-wrap:wrap}
.lini-tier .okard{width:196px;flex:none}
.lini-sambung{width:1px;height:26px;background:var(--peta-garis);margin:8px auto}

/* --- Kartu orang ---
   Bentuknya mengikuti referensi infografis: bagian atas melengkung penuh
   seperti lengkung jendela, potret besar mengisi bagian itu, lalu nama dan
   kelas ditulis di dalam kartu bagian bawah. Lengkungnya dibuat dengan
   border-radius besar di dua sudut atas saja.

   Tinggi kartu TIDAK dipatok. Tinggi tetap selalu rapuh untuk data yang
   panjangnya berbeda-beda: nama pendek menyisakan ruang kosong, nama panjang
   terpotong. Sekarang tinggi kartu mengikuti isinya, lalu grid yang
   menyamakan tinggi antar kartu dalam satu baris, dan potret mengisi ruang
   yang tersisa. */
/* Lengkungnya 56px: cukup untuk terbaca sebagai lengkung, tapi tidak sampai
   memakan separuh kartu. Potretnya diberi ruang tinggi supaya kartunya
   berproporsi potret (lebih tinggi daripada lebar), bukan kotak gemuk. */
.okard{position:relative;border-radius:56px 56px 16px 16px;overflow:hidden;
    background:var(--kartu-bawah);border:1px solid var(--kartu-garis);
    display:flex;flex-direction:column;
    transition:transform .4s var(--ease),box-shadow .4s var(--ease),border-color .3s}
.okard > .ofoto{flex:1 1 auto;min-height:196px}
.okard > .oinfo{flex:none}
.okard:hover{border-color:var(--peta-aksen);transform:translateY(-6px);
    box-shadow:0 20px 44px rgba(0,0,0,.42);z-index:2}
.frame[data-tema="terang"] .okard:hover{box-shadow:0 18px 38px rgba(180,35,42,.2)}
.ofoto{position:relative;flex:1;min-height:0;overflow:hidden;
    background:linear-gradient(158deg,#6E2A2C 0%,#B4232A 55%,#5E161A 100%);
    display:flex;align-items:center;justify-content:center}
.ofoto img{width:100%;height:100%;object-fit:cover;object-position:center top;display:block}
.ofoto .ph{width:46%;max-width:82px;opacity:.85}
.ofoto .ph svg{width:100%;height:auto;stroke:#fff;fill:none}

/* Bagian teks di dalam kartu. Namanya diberi bentuk pil, mengikuti referensi
   infografis, supaya terbaca sebagai label dan bukan sekadar baris teks.

   Tingginya dipatok (bukan mengikuti isi) dan isinya ditengah: nama yang
   kebagian satu baris dan nama yang kebagian dua baris harus menghasilkan
   bar bawah yang sama tinggi, kalau tidak baris kartu terlihat bergerigi.
   Batasnya dihitung dari isi terpanjang yang mungkin dan sudah diukur langsung
   di peramban: peran dua baris (26px), nama dua baris dalam pil (41px), kelas
   (23px), jarak antarnya, dan bantalan. Isi anaknya tidak boleh menyusut
   (flex:none), kalau tidak baris kedua teksnya terpotong. */
.oinfo{position:relative;background:var(--kartu-bawah);padding:12px 13px 14px;
    border-top:1px solid var(--kartu-garis);text-align:center;
    height:124px;display:flex;flex-direction:column;justify-content:center}
.oinfo > *{flex:none}
.okard.koor .oinfo{background:linear-gradient(180deg,#342420,#2A1D1A)}
.frame[data-tema="terang"] .okard.koor .oinfo{background:linear-gradient(180deg,#FDF6F4,#FBEEE9)}
/* Nama subbidang bisa panjang ("PSKP (Persekutuan Siswa Kristen Padmanaba)").
   Dua baris disediakan dan dipotong dengan elipsis, supaya tinggi kartu tetap
   seragam dan tidak ada teks yang meluber keluar kartu. */
.operan{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    overflow:hidden;font-size:9px;font-weight:700;letter-spacing:1.2px;
    text-transform:uppercase;color:var(--peta-aksen);margin-bottom:5px;line-height:1.25}
.oinfo b{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;
    overflow:hidden;font-size:12px;line-height:1.3;
    background:var(--pil);color:var(--pil-teks);
    border-radius:999px;padding:5px 11px;font-weight:700}
.oinfo span{display:block;font-size:10.5px;color:var(--kartu-muted);margin-top:6px}

/* Potret kartu pimpinan diberi tinggi yang menyamai kartu di palung. */
.lini-tier .okard > .ofoto{min-height:186px}

/* --- Peta bidang ---
   Kelompoknya berupa kotak: panel dengan judul bidang di dalamnya, lalu grid
   kartu anggotanya. Kotaknya disebar ke tiga jalur tegak dengan tinggi yang
   sengaja tidak rata (lihat js/peta.js), jadi tetap terbaca sebagai
   infografis dan bukan tabel, meski kotaknya kembali. */
.peta-area{position:relative;width:100%;min-height:600px}
.peta-kelompok{position:absolute;left:0;top:0;width:100%}
/* Garis penghubung berupa bagan tiga tingkat: batang mendatar, garis tegak
   di lorong kiri tiap jalur, lalu cabang berpanah masuk ke tiap kotak.
   Digambar di lapisan paling belakang, jadi kotak kelompok selalu menang
   kalau ada garis lewat di baliknya. */
.peta-garis{position:absolute;left:0;width:100%;pointer-events:none;
    fill:none;stroke:var(--peta-garis);stroke-width:1.8;
    stroke-linecap:round;stroke-linejoin:round}
.peta-garis .g-batang{stroke-width:2.6}
.peta-garis .g-turun{stroke-width:2.2}
.peta-garis .g-panah{stroke:var(--peta-aksen);stroke-width:2.2}
.peta-garis marker path{fill:var(--peta-aksen)}
.peta-garis .g-simpul{fill:var(--peta-aksen);stroke:none}

.kelompok{position:absolute;background:var(--peta-panel);border:1px solid var(--peta-line);
    border-radius:20px;padding:20px 22px 22px;scroll-margin-top:28px;
    box-shadow:0 14px 34px rgba(0,0,0,.28)}
.frame[data-tema="terang"] .kelompok{box-shadow:0 12px 30px rgba(36,20,23,.07)}
.kelompok-head{display:flex;align-items:baseline;gap:13px;margin-bottom:16px}
.kelompok-head h5{font-family:var(--serif);font-size:17px;line-height:1.25;margin-top:1px;
    color:var(--peta-ink);flex:1;min-width:0}
/* Kartu disusun grid; jumlah kolomnya ditentukan jumlah orang di bidang itu
   (lihat lebarKelompok di js/peta.js) lewat --kolom. */
.kelompok-kartu{display:grid;grid-template-columns:repeat(var(--kolom,2),1fr);gap:13px}
/* Kartu terakhir yang sendirian di barisnya (ditandai .tunggal oleh
   js/peta.js, hanya kalau memang tidak punya pasangan) ditaruh di tengah
   dengan ukuran yang sama seperti kartu lainnya, supaya gugusnya tetap
   simetris dan tidak ada lubang kosong di sebelahnya. */
.kelompok-kartu .okard.tunggal{
    grid-column:1 / -1;justify-self:center;width:196px}
/* Sisa DUA kartu di baris terakhir juga dipusatkan: grid melebar menjadi
   enam kolom yang terisi dua-duanya, lalu kedua kartu terakhir duduk di
   kolom 2-3 dan 4-5, tepat di tengah barisnya. Baris yang penuh tetap
   tergambar persis sama seperti grid tiga kolom biasa. */
.kelompok-kartu.baris-2{grid-template-columns:repeat(6,1fr)}
.kelompok-kartu.baris-2 .okard{grid-column:auto / span 2}
.kelompok-kartu.baris-2 .okard:nth-last-child(2){grid-column:2 / 4}
.kelompok-kartu.baris-2 .okard:nth-last-child(1){grid-column:4 / 6}

/* Kartu orang di peta bisa ditekan untuk membuka popup detailnya. */
.okard{cursor:pointer}

/* Penanda koordinator dan pimpinan: emas, sebagai warna jabatan. Anggota
   biasa memakai potret merah. Koordinator diberi cincin tipis, karena dia
   berada di antara kartu anggota dan harus langsung terlihat. */
.okard.pimpinan{border-color:var(--peta-aksen)}
.okard.pimpinan .ofoto{background:linear-gradient(158deg,#8E5A16 0%,#C98A12 55%,#6E4209 100%)}
.okard.koor{border-color:var(--peta-aksen)}
.okard.koor .ofoto{background:linear-gradient(158deg,#8E5A16 0%,#C98A12 55%,#6E4209 100%)}
.okard.koor::after{content:"";position:absolute;inset:0;border-radius:56px 56px 16px 16px;
    border:2px solid var(--peta-aksen);opacity:.5;pointer-events:none}

.hint{position:absolute;left:50%;transform:translateX(-50%);bottom:18px;
    background:rgba(0,0,0,.72);color:#fff;font-size:12px;padding:8px 18px;border-radius:999px;
    pointer-events:none;border:1px solid rgba(255,255,255,.14);
    transition:opacity .4s ease}
.frame[data-tema="terang"] .hint{background:rgba(36,20,23,.82)}
.hint.hide{opacity:0}

/* --- Popup detail kartu ---
   Satu komponen untuk dua tempat: di dalam peta (#petaModal) dan di halaman
   utama (#modalUtama). Bentuknya dua kolom: gambar besar di kiri, penjelasan
   di kanan.

   Peralihan gambar ke teks dibuat dua lapis: satu gradasi gelap dari bawah
   untuk kedalaman (::before), dan sambungan gambar ke teks yang dikerjakan
   dengan topeng (mask) pada .omodal-poto, bukan dengan menumpuk gradasi warna
   panel. Alasan pindah ke topeng ada di komentar .omodal-poto di bawah. */
.omodal{
  --m-panel:var(--paper); --m-ink:var(--ink); --m-muted:var(--muted);
  --m-line:var(--line); --m-aksen:var(--red);
  position:fixed;inset:0;z-index:220;display:flex;align-items:center;
  justify-content:center;padding:26px;
  visibility:hidden;opacity:0;
  transition:opacity .35s var(--ease),visibility .35s}
.frame .omodal{
  --m-panel:var(--peta-panel); --m-ink:var(--peta-ink); --m-muted:var(--peta-muted);
  --m-line:var(--peta-line); --m-aksen:var(--peta-aksen)}
.omodal.open{visibility:visible;opacity:1}
.omodal-lat{position:absolute;inset:0;background:rgba(22,12,14,.62);
    backdrop-filter:blur(7px);-webkit-backdrop-filter:blur(7px);cursor:pointer}
.omodal-panel{position:relative;width:100%;max-height:min(560px,92vh);
    display:grid;grid-template-columns:330px 1fr;overflow:hidden;
    background:var(--m-panel);border:1px solid var(--m-line);border-radius:24px;
    box-shadow:0 40px 90px rgba(20,10,12,.45);
    transition:transform .5s var(--ease),opacity .5s ease,filter .5s ease}
/* --- Panggung jalur ---
   Satu jalur mendatar berisi seluruh anggota kelompok yang sedang dibuka,
   masing-masing satu kartu selebar panggung. Yang bergerak hanya jalurnya
   (translateX), dan rupa tiap kartu (skala, kecerahan, kejelasan) dihitung
   js/peta.js dari jaraknya ke tengah, jadi kartu tengah membesar dan menyala
   PERLAHAN selagi diseret, bukan menunggu jari dilepas.
   Dulu panggungnya menampung tiga panel tetap yang bertukar kelas: seretan
   selalu memantul balik dulu sebelum melangkah, dan panel yang keluar harus
   didaur ulang isinya sehingga gambarnya berkedip. Dua-duanya hilang dengan
   jalur menerus ini.
   Seleksi teks dimatikan di panggungnya (permukaannya pegangan seret); sisi
   teksnya touch-action:pan-y, bukan none, supaya teks panjang tetap bisa
   digulir tegak sementara seretan mendatar sampai ke jalurnya. */
/* overflow dibiarkan terlihat: kartu tetangga memang mengintip DI LUAR
   kotak panggung, sama seperti desain sebelumnya. Kartu yang lebih jauh
   disembunyikan lewat opasitas 0 (diatur js/peta.js), bukan lewat
   pemotongan, supaya tepi kartu tetangga tidak terpotong garis lurus.
   Seleksi teks dimatikan HANYA selagi jalurnya benar-benar diseret
   (.seret-aktif): menahan jari diam di atas teks tetap memilih teks seperti
   biasa, dan di desktop menyeret dari teks pun tetap bisa memilih. */
.omodal-panggung{position:relative;width:min(780px,100%);height:min(560px,80vh);
    touch-action:none;-webkit-user-select:text;user-select:text}
.omodal-panggung.seret-aktif{-webkit-user-select:none;user-select:none}
.omodal-jalur{display:flex;gap:20px;height:100%;will-change:transform;
    transition:transform .52s var(--ease)}
/* Selagi diseret, jalur mengikuti jari tanpa transisi, dan rupa kartunya
   (skala, kecerahan) juga tanpa transisi: kalau tidak, kartu tengah baru
   membesar 300ms setelah jarinya lewat, jadi terasa lelet. */
.omodal-jalur.diseret,.omodal-jalur.diseret .omodal-panel{transition:none}
/* Kartu tetangga mengecil ke arah tengahnya sendiri supaya celahnya tetap
   segap rancangan: tanpa ini, kartu yang mengecil 0,85 meninggalkan celah
   selebar 20px lebih seperlima lebarnya. */
.omodal-panel{transform-origin:50% 50%}
.omodal-panel{touch-action:pan-y}
.omodal-isi{touch-action:pan-y}
.omodal-panggung .omodal-panel{flex:0 0 100%;width:100%;height:100%;
    max-height:none;transform-origin:50% 50%;
    transition:transform .3s ease,opacity .3s ease,filter .3s ease}
/* Kelompok beranggota satu: tak ada tetangga, celahnya tak perlu. */
.omodal-panggung.sendirian .omodal-jalur{gap:0}
/* Panggung yang lorongnya sempit (ponsel): kartunya dipersempit dan celahnya
   dirapatkan, sehingga di kiri dan kanan kartu tengah tersisa lorong tempat
   kartu tetangga mengintip. Sebelumnya kartu di ponsel selebar panggungnya,
   jadi tetangganya tertutup penuh dan tak pernah terlihat sama sekali.
   Lebarnya 70%, bukan 72%: sisa ruangnya dibagi celah dan tetangga yang
   mengecil ke arah tengahnya sendiri, jadi 70% menyisakan selipan yang
   benar-benar terlihat, bukan garis tipis.
   JS hanya menambahkan kelas .sempit; angka lebarnya tetap di sini. */
.omodal-panggung.sempit .omodal-jalur{gap:12px}
.omodal-panggung.sempit .omodal-panel{flex:0 0 70%;width:70%}

/* Sisi gambar. Foto mengisi penuh; kalau tidak ada foto, isi ikon orang atau
   nomor bidang besar di atas gradasi merah yang sama dengan kartu. */
.omodal-poto{position:relative;min-height:340px;overflow:hidden;
    background:linear-gradient(158deg,#6E2A2C 0%,#B4232A 55%,#5E161A 100%);
    display:flex;align-items:center;justify-content:center}
/* Popup milik pemimpin: latar gambarnya emas, sama seperti kartunya. */
.omodal-poto.emas{background:linear-gradient(158deg,#8E5A16 0%,#C98A12 55%,#6E4209 100%)}
.omodal-poto img{position:absolute;inset:0;width:100%;height:100%;
    object-fit:cover;object-position:center top;display:block}
.omodal-poto .ph{width:34%;max-width:96px;opacity:.9}
.omodal-poto .ph svg{width:100%;height:auto;stroke:#fff;fill:none}
.omodal-poto svg{width:86px;height:86px;stroke:#fff;fill:none;opacity:.92}
.omodal-poto .nomor{font-family:var(--serif);font-size:104px;line-height:1;
    color:rgba(255,255,255,.94);text-shadow:0 12px 44px rgba(0,0,0,.35)}
.omodal-poto::before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;
    background:linear-gradient(196deg,rgba(20,10,12,.10) 34%,rgba(20,10,12,.55) 100%)}
/* Peralihan gambar ke teks dibuat dengan MENUTUP gambarnya memakai topeng
   (mask), bukan menumpuk gradasi warna panel di atasnya. Bedanya penting:
   gradasi yang ditumpuk harus menebak warna panelnya, dan sisa satu persen
   di ujungnya sempat terbaca sebagai garis tipis tepat di sambungan gambar
   dan teks. Topeng hanya membuat gambarnya tembus pandang, jadi yang muncul
   di baliknya adalah warna panel yang asli: garis tak mungkin muncul lagi.
   Lunturnya selesai di 97%, jadi tiga persen terakhir sudah bersih total. */
.omodal-poto{-webkit-mask-image:linear-gradient(90deg,#000 70%,transparent 97%);
    mask-image:linear-gradient(90deg,#000 70%,transparent 97%)}

/* Tombol tutup menempel di sudut kanan atas layar, jauh dari kartu yang
   berpindah-pindah: dulu ia ikut mengikuti kartu tengah, tertinggal di
   kartu sebelah, bahkan keluar layar. */
.omodal-tutup{position:absolute;top:18px;right:22px;z-index:7;width:38px;height:38px;
    border-radius:50%;border:1px solid rgba(255,255,255,.35);
    background:rgba(20,10,12,.38);color:#fff;font-size:19px;line-height:1;cursor:pointer;
    backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
    transition:background .25s,transform .25s}
.omodal-tutup:hover{background:rgba(20,10,12,.62);transform:scale(1.07)}

/* Sisi teks. */
.omodal-isi{padding:36px 38px 32px;overflow:auto;color:var(--m-ink)}
.omodal-kicker{display:block;font-size:10.5px;font-weight:700;letter-spacing:2px;
    text-transform:uppercase;color:var(--m-aksen);margin-bottom:10px}
.omodal-nama{font-family:var(--serif);font-size:27px;line-height:1.18;margin-bottom:12px}
.omodal-kelas{display:inline-block;background:var(--m-ink);color:var(--m-panel);
    border-radius:999px;padding:5px 14px;font-size:12px;font-weight:600;margin-bottom:4px}
.omodal-bid{display:flex;align-items:baseline;gap:10px;border-top:1px solid var(--m-line);
    padding-top:14px;margin-top:14px}
.omodal-bid b{font-family:var(--serif);font-size:15px;color:var(--m-aksen);white-space:nowrap}
.omodal-bid span{font-size:12.5px;color:var(--m-muted);line-height:1.4}
.omodal-isi p{font-size:13.5px;line-height:1.7;color:var(--m-muted);margin-top:12px}
.omodal-label{display:block;font-size:9.5px;font-weight:700;letter-spacing:1.8px;
    text-transform:uppercase;color:var(--m-muted);margin:18px 0 9px}
.omodal-chips{display:flex;flex-wrap:wrap;gap:7px}
.omodal-chips .chip{font-size:11px;padding:5px 11px;border-radius:999px;
    border:1px solid var(--m-line);color:var(--m-ink)}
.omodal-chips .chip.act{background:var(--m-aksen);border-color:var(--m-aksen);
    color:#fff;font-weight:600}
.omodal-aksi{margin-top:22px}
.omodal-aksi .btn{margin-right:0}

/* --- Navigasi popup peta ---
   Pita kelompok mengapung di atas panel: deretan cip nama kelompok yang
   bisa diklik, dengan tombol chevron untuk melangkah satu kelompok, dan
   penghitung posisi orang. Tombol panah besar di kiri-kanan layar
   melangkah antar orang dalam kelompok yang sama. Semua elemen ini hanya
   ada di #petaModal, bukan di popup halaman utama. */
.omodal-genggam{position:relative;display:flex;flex-direction:column;
    align-items:center;gap:16px;width:min(780px,100%);
    transform:translateY(18px) scale(.97);transition:transform .45s var(--ease)}
.omodal.open .omodal-genggam{transform:none}
/* --- Pita kelompok ---
   Cip karusel tanpa kotak wadah: kelompok aktif dipusatkan dengan naungan
   emasnya sendiri, tetangganya mengecil dan memudar. Pita bisa diseret
   untuk lompat kelompok (perilaku di js/peta.js).
   Jendolanya sengaja SEMPIT, hanya selebar tiga cip: satu di tengah, satu
   mengintip di kiri, satu di kanan. Cip lain tetap ada di jalurnya (supaya
   geserannya mulus dan pemilihan cip terdekat tetap adil), tapi terpotong
   di luar jendola. Lebarnya diukur dari cip terlebar supaya ketiganya pas.
   touch-action:none wajib: tanpa itu, di layar sentuh browser mengambil
   alih seretan mendatar sebagai gulir halaman dan pita tak pernah bergerak. */
.omodal-grup{display:flex;justify-content:center;max-width:100%}
.omodal-grup-jalur{overflow:hidden;
    width:min(560px,52vw,var(--lebar-jendola,300px));
    touch-action:none;user-select:none;-webkit-user-select:none}
.omodal-grup-lurus{display:flex;gap:4px;transition:transform .45s var(--ease)}
.omodal-grup-lurus.diseret{transition:none}
.gchip{flex:none;font:inherit;font-size:12px;font-weight:600;letter-spacing:.3px;
    color:rgba(255,255,255,.58);background:transparent;border:0;border-radius:999px;
    padding:7px 13px;cursor:pointer;white-space:nowrap;
    transition:color .2s,background .3s,transform .35s var(--ease),opacity .3s;
    transform:scale(.8);opacity:.45}
.gchip:hover{color:#fff}
.gchip.act{color:#fff;background:rgba(224,166,60,.26);transform:scale(1.12);opacity:1}
/* --- Titik posisi dalam kelompok ---
   Satu titik satu orang, kembaran barisan titik panggung pengurus; tak
   lagi garis beruas berbatas delapan yang membuat dua orang menumpuk di
   satu ruas. Titiknya bisa ditekan untuk lompat dan diseret untuk
   menggeser kartunya mengikuti jari. */
.omodal-titik{display:flex;gap:8px;justify-content:center;margin-top:2px;
    padding:10px 14px;border-radius:999px;cursor:pointer;
    touch-action:none;user-select:none;-webkit-user-select:none;
    transition:background .25s}
.omodal-titik:hover,.omodal-titik.diseret{background:rgba(255,255,255,.07)}
/* Satu titik satu orang, kembaran barisan titik panggung pengurus. Titik
   di dekat kartu yang sedang dilihat membesar mengikuti --dekat (1 = di
   posisi kartu, 0 = dua kartu jauhnya), jadi selagi kartunya diseret
   deretan titik ikut berdenyut mengikuti jari. Yang aktif merekah jadi
   pil, sama seperti titik aktif di panggung. */
.omodal-titik button{width:8px;height:8px;border-radius:999px;
    border:0;padding:0;background:var(--m-line);cursor:pointer;
    transform:scale(calc(.92 + .28 * var(--dekat, 0)));
    transition:width .35s var(--ease),background .25s,transform .18s ease}
.omodal-titik button.act{width:26px;background:var(--m-aksen)}
@media(max-width:700px){
  .omodal-titik button{width:7px;height:7px}
  .omodal-titik{padding:9px 12px}
}

/* --- Langkah antar orang ---
   Panelnya tidak lagi dianimasikan masuk dari samping: yang bergerak adalah
   jalurnya (lihat .omodal-jalur), jadi langkah antar kartu datang dari
   posisi jalurnya sendiri, bukan dari animasi masuk per panel. */

/* ===== 7. Bidang, agenda, visi misi, kontak, footer ===== */
/* Pita gelap bidang: gradasi maroon, titik samar, dan pendaran emas di atas.
   Warna ujung atas gradasinya (#571418) harus sama persis dengan isi busur
   .lengkung-nya di atas, supaya sambungan pita ke bagian tetangga tidak
   terlihat di mana garis lengkungnya berakhir. Ujung bawahnya sengaja
   berhenti di maroon pekat, bukan hitam: tepi bawah pita kini diukir busur
   kertas, dan gradasi yang menggelap sampai hitam justru terbaca sebagai
   bercak gelap sebelum lengkungnya (tema terang dulu terlihat begitu). */
section.malam{position:relative;color:#F6E9E2;padding:150px 0 156px;
    background:
      radial-gradient(rgba(255,255,255,.05) 1px,transparent 1px),
      linear-gradient(180deg,#571418 0%,#571418 70px,#3A0F12 45%,#411013 100%);
    background-size:auto,26px 26px,auto}
/* Pendaran emas di atas pita tidak lagi berupa lapisan CSS: lapisan itu
   mulai mendadak di bawah garis busur dan terbaca sebagai pita mendatar.
   Pendarannya kini digambar di dalam SVG busurnya (lihat index.html), jadi
   cahayanya mengikuti lengkungan. */
/* 70px pertama sengaja solid #571418, sama persis dengan isi busur atasnya,
   supaya sambungan busur ke badan pita tidak meninggalkan undak terang. */
section.malam .k{color:#F0C36B}
section.malam h2{color:#FFF6EE}
section.malam .sub{color:rgba(255,236,226,.72)}
/* Latar foto pita dihapus: foto stok terasa janggal; pita kembali murni
   gradasi, dan foto asli bisa masuk kelak lewat pola yang sama dengan
   Tentang. */

/* Kartu bidang: kertas krem di atas pita maroon, kontras inilah yang
   membuat bagian ini terasa hidup lagi. Isinya cuma tiga: ikon garis khas
   bidang, angka raksasa samar sebagai jangkar identitasnya, dan nama
   lengkapnya dalam serifa. Daftar subbidangnya pindah seluruhnya ke
   halaman tiap bidang (bidang/<slug>.html), jadi kartunya Lapang dan mata
   tak dipaksa membaca sepuluh daftar sekaligus. */
.grid10{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;
    /* Jarak dari sikunya: deskripsi bagian ini sudah dibuang, jadi tanpa
       margin ini sikunya menempel nyaris menyorap kartu pertama. */
    margin-top:26px}
.bd{position:relative;overflow:hidden;display:flex;flex-direction:column;
    width:100%;min-height:170px;text-align:left;text-decoration:none;
    background:#FFF9F2;border:1px solid rgba(46,14,8,.14);
    border-radius:18px;padding:20px 22px 18px;
    transition:transform .5s var(--ease),border-color .3s,box-shadow .5s var(--ease)}
.bd-ikon{width:30px;height:30px;flex:none;color:#B4232A}
.bd-angka{position:absolute;right:16px;top:4px;font-family:var(--serif);
    font-weight:600;font-size:74px;line-height:1;color:rgba(201,138,18,.42);
    pointer-events:none;user-select:none}
.bd .jd{margin-top:auto;font-family:var(--serif);font-size:20.5px;font-weight:600;
    line-height:1.3;color:#241417}
.bd:hover,.bd:focus-visible{transform:translateY(-6px);
    border-color:rgba(180,35,42,.5);box-shadow:0 22px 46px rgba(0,0,0,.35)}
.bd:hover .bd-angka,.bd:focus-visible .bd-angka{color:rgba(201,138,18,.6)}
.bd:focus-visible{outline:3px solid #F0C36B;outline-offset:3px}
/* Angkatannya harus mengalahkan aturan .reveal.in (transform:none) yang
   tertulis lebih bawah di berkas ini; selektor #bidang memastikan itu. */
#bidang .bd:hover,#bidang .bd:focus-visible{transform:translateY(-6px)}
/* Ponsel: sepuluh kartu setinggi kotak memaksa gulir yang panjangnya
   konyol. Sistemnya diganti jadi baris ramping ala daftar isi: ikon di
   kiri, nama di tengah, angka kecil di kanan. Sepuluh bidang jadi lima
   baris layar penuh, semua tetap kelihatan sekaligus tak perlu karosel. */
@media(max-width:640px){
  .grid10{gap:10px;margin-top:20px}
  .bd{flex-direction:row;align-items:center;gap:13px;min-height:0;
      padding:15px 16px;border-radius:14px}
  .bd-ikon{width:22px;height:22px}
  .bd-angka{position:static;order:3;margin-left:auto;font-size:30px}
  .bd .jd{margin-top:0;flex:1;font-size:15px;line-height:1.35}
}
/* --- Kartu bidang di tema gelap ---
   Kertas krem kartunya dipertahankan di tema terang, tetapi di tema gelap
   sepuluh kotak krem justru benda paling menyala di seantero halaman.
   Panelnya diganti cokelat hangat sekeluarga dengan kaki halaman (#2B1215),
   dua tingkat lebih terang dari pita maroon di belakangnya supaya tetap
   terbaca sebagai kartu, garis rambut krem setipis kertas, angka hantunya
   tetap emas tapi diredam, ikon merahnya diterangkan agar tak tenggelam,
   dan selaput kilau tipis di tepi atasnya memberi kesan permukaan yang
   menangkap cahaya. */
html[data-tema="gelap"] .bd{background:linear-gradient(168deg,#42191B 0%,#341314 62%,#2C1011 100%);
    border-color:rgba(255,231,204,.15);
    box-shadow:inset 0 1px 0 rgba(255,232,205,.08)}
html[data-tema="gelap"] .bd .jd{color:#F6E8DC}
html[data-tema="gelap"] .bd-ikon{color:#EE6A52}
html[data-tema="gelap"] .bd-angka{color:rgba(233,172,63,.42)}
html[data-tema="gelap"] .bd:hover .bd-angka,
html[data-tema="gelap"] .bd:focus-visible .bd-angka{color:rgba(240,195,107,.68)}
html[data-tema="gelap"] .bd:hover,
html[data-tema="gelap"] .bd:focus-visible{
    border-color:rgba(240,195,107,.45);
    box-shadow:0 22px 46px rgba(0,0,0,.42),inset 0 1px 0 rgba(255,232,205,.08)}

/* agenda: panggung kegiatan, dirombak minimal ala rujukan Apple/Figma.
   Satu jalur mendatar, digeser dengan jari atau diseret dengan tetikus
   (perilakunya di js/app.js). Kartunya kini HANYA gambarnya: judul tinggal di dalam gambar di atas
   naungan bawah (.ev-pojok), status berbahasa Inggris dengan titik warna,
   dan tombol bagikan melayang di pojok kanan atas. Deskripsi, tanggal,
   dan tempat pindah seluruhnya ke halaman detail tiap kegiatan. Seluruh
   kartu menekan ke halaman itu lewat tautan meregang; tombol bagikan
   satu-satunya pengecualian supaya menekannya tak ikut membuka halaman. */
.ev-kepala{text-align:center;margin-bottom:36px}
.ev-kepala .zikzak{margin-left:auto;margin-right:auto}
.ev-grid{display:flex;gap:18px;overflow-x:auto;
    /* Bantal di semua sisi supaya angkatan kartu saat disentuh dan
       bayangannya tidak terpotong tepi jalur; margin negatif menyembunyikan
       bantal itu dari kerangka halaman. */
    padding:16px 28px 72px;margin:-16px -28px -56px;
    scrollbar-width:none;-webkit-overflow-scrolling:touch;cursor:grab}
.ev-grid::-webkit-scrollbar{display:none}
.ev-grid.diseret{cursor:grabbing;user-select:none;-webkit-user-select:none}
/* Lebar kartu dihitung dari kolomnya, bukan angka mati: tiga kartu penuh
   dengan jeda 18px di antaranya plus sepotong kartu keempat yang selalu
   terlihat (94px = tiga jeda + 40px intipan). Dengan begitu tanda "masih
   ada lagi di kanan" hidup di lebar jendela apa pun, bukan hanya yang
   kebetulan memotong kartunya pas. */
.ev-card{flex:0 0 calc((100% - 94px)/3);width:calc((100% - 94px)/3);overflow:hidden;text-align:left;
    background:var(--paper);border:1px solid var(--line);border-radius:20px;
    transition:transform .5s var(--ease),box-shadow .5s var(--ease),border-color .3s}
.ev-card:hover,.ev-card:focus-within{transform:translateY(-6px);
    border-color:rgba(180,35,42,.45);box-shadow:0 22px 48px rgba(180,35,42,.16)}
.ev-visual{position:relative;height:400px;overflow:hidden;
    background:radial-gradient(rgba(255,255,255,.13) 1px,transparent 1px) 0 0/22px 22px,
               linear-gradient(140deg,var(--e2,#5E161A),var(--e1,#B4232A))}
.ev-foto{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* Ikon garis pindah ke kanan atas, samar: kaki kartu kini milik judul. */
.ev-ikon{position:absolute;right:18px;top:64px;width:86px;height:86px;
    color:rgba(255,251,244,.5);transition:transform .5s var(--ease)}
.ev-card:hover .ev-ikon{transform:scale(1.09) rotate(-2deg)}
/* Naungan bawah, tempat judul tinggal. Gradasinya membaca dari bawah kartu
   supaya judul krem terbaca di atas gambar apa pun kelak. */
.ev-pojok{position:absolute;left:0;right:0;bottom:0;z-index:1;padding:72px 20px 18px;
    background:linear-gradient(180deg,rgba(12,6,8,0) 0%,rgba(12,6,8,.55) 58%,rgba(12,6,8,.82) 100%)}
.ev-pojok h3{font-family:var(--serif);font-size:21.5px;line-height:1.32;color:#FFFAE6;
    text-wrap:balance}
/* Status: bahasa Inggris dengan titik warna, supaya akan datang, sedang
   berjalan, dan selesai terbaca sekilas tanpa perlu membaca teksnya. */
.ev-status{position:absolute;left:14px;top:14px;z-index:1;display:inline-flex;align-items:center;
    gap:7px;font-size:10px;font-weight:700;letter-spacing:1.6px;text-transform:uppercase;
    border-radius:999px;padding:6px 13px;color:#FFF3E4;
    background:rgba(22,10,12,.42);border:1px solid rgba(255,244,232,.3);
    backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px)}
.ev-status .titik{width:7px;height:7px;border-radius:50%;flex:none;background:#F0C36B}
/* Titik "Coming Soon" bernapas pelan (mikrointeraksi): kartu yang isinya
   masih menunggu tetap terasa hidup tanpa bergerak dari tempatnya. */
@media (prefers-reduced-motion: no-preference){
  .ev-status.datang .titik{animation:denyut 2.4s ease-in-out infinite}}
@keyframes denyut{0%,100%{opacity:1}50%{opacity:.3}}
.ev-status.jalan .titik{background:#97DE9A}
.ev-status.selesai .titik{background:rgba(255,244,232,.62)}
/* Tautan meregang: seluruh kartu adalah tombol menuju halaman detailnya. */
.ev-tautan{position:absolute;inset:0;z-index:2;border-radius:20px}
/* Tombol bagikan, satu-satunya bagian kartu di luar tautan meregang.
   Kacanya menyamai lencana status agar terasa satu keluarga. */
.ev-bagi{position:absolute;right:14px;top:14px;z-index:3;display:flex;align-items:center;
    justify-content:center;width:36px;height:36px;border-radius:50%;cursor:pointer;
    color:#FFF3E4;background:rgba(22,10,12,.42);border:1px solid rgba(255,244,232,.3);
    backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
    transition:border-color .3s,color .3s,transform .3s var(--ease)}
.ev-bagi svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;
    stroke-linecap:round;stroke-linejoin:round}
.ev-bagi:hover{border-color:#F0C36B;color:#F0C36B;transform:translateY(-2px)}
/* Uplan "tautan disalin" dari js/bagi.js, untuk perangkat tanpa
   navigator.share: pesan singkat di kaki layar, muncul lalu memudar. */
.upilan{position:fixed;left:50%;bottom:28px;z-index:150;transform:translateX(-50%) translateY(10px);
    background:#241417;color:#FFF7F0;font-size:13.5px;padding:10px 18px;border-radius:999px;
    opacity:0;pointer-events:none;box-shadow:0 14px 34px rgba(20,8,10,.35);
    transition:opacity .3s,transform .3s var(--ease)}
.upilan.tampak{opacity:1;transform:translateX(-50%) translateY(0)}

/* visi misi (putaran 21): isi resmi dari poster Belinda (calon ketua nomor
   1). SATU profil desain untuk SEMUA petak, visi pun ikut keluarga: tanpa
   pita merah, tanpa pita label; katanya "Visi" kini judul besar merah
   padma di tengah petak, sejajar ukurannya dengan huruf M A J U. Yang
   menyatukan grid adalah perlakuan (krem, tekstur lambang, huruf serif
   emas), bukan warna berbeda. Tekstur lambang satu ukuran (330px) dan
   posisinya DIHITUNG oleh js/app.js dari letak tiap petak (variabel
   --tekstur-x/-y), jadi ubinnya menerus menyambung di balik grid, seperti
   satu kain yang dipotong-jendela oleh petak-petaknya. */
.vm-lintasan{position:relative}
.vm-panggung{position:relative}
.vm-pembuka{display:none}
/* Kepala seksi (judul + zikzak) dibungkus satu kotak: di tampilan statis
   dia transparan bagi layout (display:contents, perilaku lama persis
   sama), di panggung tersemat dia kembali kotak biasa sehingga judul dan
   sikunya mengalir di ATAS bento, rata tepi kiri yang sama, bukan
   diabsolutkan ke koordinat lain yang membuatnya melenceng. */
.vm-kepala{display:contents}
.vm-bento{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:34px;
    grid-auto-rows:minmax(172px,auto)}
/* Petak memakai var(--tint) di atas latar halaman yang kini polos (seksi
   ini tidak memakai pita tint, supaya alunan foto Tentang menghilam mulus
   sampai ke sini, persis alur lama yang dianggap lebih lembut). Di malam
   petaknya diganti gradasi marun keluarga kartu bidang, dan timpana ini
   sengaja dikenakan ke .vm-cell SEMUA (bukan hanya .vm-misi): aturan
   gelap ini lebih spesifik daripada latar dasar .vm-cell, jadi satu
   aturan saja cukup dan tidak ada gradasi yang terhapus. */
.vm-cell{position:relative;overflow:hidden;border-radius:20px;padding:24px 24px 22px;
    display:flex;flex-direction:column;gap:10px;
    border:1px solid var(--line);background:var(--tint);
    transition:transform .35s var(--ease),box-shadow .35s var(--ease),border-color .25s}
.vm-cell > *{position:relative;z-index:1}
.vm-cell::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
    background:url(../img/pola-tirai.png) repeat;background-size:330px 330px;
    background-position:var(--tekstur-x,0px) var(--tekstur-y,0px);opacity:.1}
html[data-tema="gelap"] .vm-cell{
    background:linear-gradient(168deg,#42191B 0%,#341314 62%,#2C1011 100%);
    border-color:rgba(255,231,204,.15);
    box-shadow:inset 0 1px 0 rgba(255,232,205,.08)}
/* Putaran 22: huruf besar JADI huruf pertama kalimat misinya (huruf
   kapiler); kalimatnya huruf ricik yang enak dibaca, bukan serif.
   vm-gulung membungkus kalimatnya (huruf kapilernya di luar gulungan)
   supaya pamandean lingkaran gelombang kejut memotong KALIMATnya saja,
   hurufnya tidak ikut terpotong; display:block supaya clip-path rapi
   sementara teksnya tetap memeluk huruf kapilernya yang mengapung. */
.vm-huruf{font-family:var(--serif);font-weight:600;font-size:46px;line-height:.82;
    color:var(--gold);float:left;padding:7px 10px 0 0}
.vm-teks{margin:0;font-family:var(--sans);font-size:15.5px;line-height:1.7;
    color:var(--body-ink)}
.vm-gulung{display:block}
/* Teks lengkap untuk pembaca layar: huruf kapilernya disembunyikan dari
   suara (aria-hidden), jadi kalimat utuhnya diberikan di sini. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;
    overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* Gelombang kejut putaran 22: cincin emas yang mengembang dari titik
   duduk hurufnya; hanya hidup di mode pin, ukurannya ditulis js. */
.vm-gelombang{position:absolute;z-index:2;pointer-events:none;border-radius:50%;
    border:2px solid rgba(224,166,60,.8);opacity:0;
    box-shadow:0 0 26px rgba(224,166,60,.3),inset 0 0 16px rgba(224,166,60,.18);
    transform:translate(-50%,-50%)}
/* Angkatannya harus mengalahkan aturan .reveal.in (transform:none) yang
   tertulis lebih bawah di berkas ini; pola sama dengan #bidang .bd. */
#visimisi .vm-cell:hover{transform:translateY(-4px);
    border-color:rgba(201,138,18,.45);box-shadow:0 18px 40px rgba(36,10,12,.14)}

/* Petak visi: sama seperti petak misi, hanya isinya ditengah. Tanpa
   wadah merah, tanpa pita: "Visi" adalah judul serif seukuran huruf
   M A J U, berwarna merah padma. */
.vm-visi{grid-row:1 / span 2;justify-content:center;align-items:center;
    text-align:center;gap:14px}
/* Kalimat misi ditengah vertikal: kartu yang lebih tinggi dari teksnya
   tidak terasa kosong separuh bawah (masukan putaran 22). */
.vm-misi{justify-content:center}
.vm-judul{font-family:var(--serif);font-weight:600;font-size:46px;line-height:1;
    color:var(--red)}
html[data-tema="gelap"] .vm-judul{color:var(--gold)}
.vm-visi-teks{margin:0;font-family:var(--serif);font-size:clamp(17px,1.5vw,20px);
    line-height:1.6;color:var(--ink);max-width:34ch}
.vm-visi-teks em{font-style:italic;color:var(--red)}
html[data-tema="gelap"] .vm-visi-teks em{color:var(--gold)}

html[data-tema="gelap"] #visimisi .vm-cell:hover{
    border-color:rgba(224,166,60,.42);box-shadow:0 20px 44px rgba(0,0,0,.4)}

@media(max-width:960px){
  .vm-bento{grid-template-columns:1fr 1fr;grid-auto-rows:minmax(172px,auto)}
  .vm-visi{grid-column:1 / -1;grid-row:auto;min-height:236px}
}
@media(max-width:600px){
  .vm-bento{grid-template-columns:1fr;gap:12px}
  .vm-cell{padding:22px 20px 20px}
}

/* --- Panggung MAJU (putaran 21): pin gaya ScrollTrigger, vanilla.
   Semua aturan di bawah hanya hidup saat html.vmp-aktif, yang dipasang
   js/app.js kalau layar cukup besar dan pengunjung mengizinkan gerak.
   Tanpa kelas itu (ponsel, hemat-gerak, js mati) seksi mengalir seperti
   seksi biasa: pembuka M A J U disembunyikan, grid tampil utuh.
   .vm-lintasan dipanjangkan js; .vm-panggung menempel satu layar penuh,
   jadi selama lintasan belum habis, menggulir hanya menghidupkan
   panggungnya, bukan menggulir halaman. */
html.vmp-aktif .vm-panggung{position:sticky;top:0;height:100vh;display:flex;
    overflow:hidden;user-select:none;-webkit-user-select:none}
/* Judul dan zikzaknya mengalir di atas bento (dulu diabsolutkan ke
   koordinati sendiri: judul melenceng dari tepi grid dan sikuzu
   menempel persis di hurufnya). Sekarang keduanya satu kotak .vm-kepala
   yang ikut kolom .wrap, jadi rata tepi kiri dengan bento di semua
   lebar, dan jarak judul-ke-sikuzu konsisten seperti seksi lain. */
html.vmp-aktif .vm-panggung .wrap{position:relative;width:100%;height:100%;
    display:flex;flex-direction:column;justify-content:center}
html.vmp-aktif .vm-kepala{display:block}
html.vmp-aktif .vm-panggung h2{margin:0;font-size:clamp(40px,4.6vw,62px)}
html.vmp-aktif .vm-panggung .zikzak{width:92px;height:13px;margin:12px 0 0}
/* Kata & Misi diberi warna sepasang dengan Visi (dulu Misi putih sendirian
   di samping emasnya). */
html.vmp-aktif .kata-visi,html.vmp-aktif .kata-misi{color:var(--red)}
html.vmp-aktif[data-tema="gelap"] .kata-visi,
html.vmp-aktif[data-tema="gelap"] .kata-misi{color:var(--gold)}
/* Kata "Visi" di judul disembunyikan, posisinya ditutupi pilot abadi
   (span.vmp-visor buatan js) yang kelak terbang ke petak visinya. */
html.vmp-aktif .kata-visi{opacity:0}
html.vmp-aktif .vm-pembuka{display:flex;position:absolute;inset:0;z-index:2;
    align-items:center;justify-content:center;gap:clamp(20px,3.5vw,56px);
    pointer-events:none;font-family:var(--serif);font-weight:600;
    font-size:clamp(90px,16vh,180px);line-height:1;color:var(--gold)}
html.vmp-aktif .vm-pembuka span{will-change:transform,opacity}
/* Selama panggung mengemudi, transisi sel dimatikan supaya tulisan
   clip-path dan transform per-frame dari js tidak antre di balik
   transisi CSS dan terasa menempel di input. Kelas .rampung (dipasang
   js setelah selesai) menghidupkan transisi lagi agar hover kembali
   halus. Petak TERSEMBUNYI lewat clip-path lingkaran berjari-jari nol
   yang ditulis js: kartu tidak "muncul dengan animasi biasa", dia
   DIBUKA oleh gelombang kejutnya. */
html.vmp-aktif .vm-cell:not(.rampung){transition:none;
    will-change:clip-path,transform,box-shadow}
.vmp-visor{position:absolute;left:0;top:0;z-index:3;line-height:1;
    pointer-events:none;will-change:transform,opacity}

/* Motif kawung (putaran 19, dipindah ke agenda lewat masukan putaran 20):
   desain latar kedua milik situs, anggota kosakata tekstur di samping
   lambang emas dan butir kertas. Kawungnya digambar sebagai SVG ubin
   statis (tanpa filter, murah di raster), emas, dan dipakai SAMAR sebagai
   alas seksi agenda: kartu-kartunya akan diisi foto sungguhan, jadi motif
   hanya hidup di permukaan kosongnya. Tepi atas dan bawah motifnya
   dibaurkan dengan mask, jadi seksi bermotif berpapasan dengan seksi
   polos tanpa garis potong. Di visi misi motif ini sengaja TIDAK ada:
   petaknya sudah bermotif lambang, dua motif berlapis + teks bikin mata
   pegal. Kosakata lengkapnya: butir kertas di seluruh latar, lambang
   emas di momen merek (hero, layar sapu, petak visi misi), kawung di
   alas seksi agenda. */
#agenda{position:relative}
#agenda::before{content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
    background:url(../img/pola-kawung.svg) repeat;background-size:140px 140px;
    opacity:.1;
    -webkit-mask-image:linear-gradient(180deg,transparent 0,#000 160px,#000 calc(100% - 160px),transparent 100%);
    mask-image:linear-gradient(180deg,transparent 0,#000 160px,#000 calc(100% - 160px),transparent 100%)}
#agenda .wrap{position:relative;z-index:1}

/* ===== 7b. Panggung pesan pengurus =====
   Pesan berganti sendiri, tanpa sarung: slide menumpuk di satu petak kisi
   dan yang tampak cuma yang berkelas .act (lihat js/app.js). Selama foto
   belum ada, potret berisi monogram raksasa warna orangnya; begitu kolom
   foto di data/kabinet.js terisi, slotnya otomatis memakai foto. */
.panggung{position:relative;margin-top:26px}
/* --- Tukar ganti pemain, bukan barisan yang bergeser ---
   Seluruh slide menumpuk di SATU petak kisi; yang tampak cuma yang
   berkelas .act. Pergantiannya pertukaran lembut: slide lama memudar
   seretan sedikit ke arah langkah, slide baru naik mengisi tempatnya.
   Kotak kartunya juga dilepas (rujukan Zion): foto dan nama berdiri
   sendiri di atas latar bagian, tanpa bingkai yang memagari mereka. */
.panggung-jendela{position:relative}
.panggung-lurus{display:grid}
.slide{grid-area:1/1;display:grid;grid-template-columns:300px 1fr;gap:56px;
    align-items:center;opacity:0;visibility:hidden;pointer-events:none;
    transform:translateY(18px) scale(.99);
    transition:opacity .5s ease,transform .55s var(--ease),visibility 0s linear .55s}
.panggung[data-arah="-1"] .slide{transform:translateY(-18px) scale(.99)}
.slide.act{opacity:1;visibility:visible;pointer-events:auto;transform:none;
    transition:opacity .5s ease .12s,transform .6s var(--ease) .12s}
body.noanim .slide{transition:none}
/* --- Pesan yang berdiri bebas ---
   Tanpa bingkai apa pun: potret berupa monogram raksasa di atas pijaran
   tipis warna orangnya (saudara angka hantu kartu bidang), kutipan jadi
   teks serifa terbesar di panggung dengan tanda petik emas menggantung di
   atasnya, lalu nama dan jabatan hanya penanda kecil di bawah. Hierarkinya
   sengaja begitu: pesannya dulu, baru siapa pembawanya. Begitu kolom foto
   di data/kabinet.js terisi, img menggantikan monogram apa adanya, tetap
   tanpa bingkai. */
.slide-poto{position:relative;min-height:380px;display:flex;
    align-items:center;justify-content:center}
.slide-poto::before{content:"";position:absolute;inset:6% 0;
    background:radial-gradient(closest-side,var(--h1,#B4232A),transparent 72%);
    opacity:.17}
.slide-poto img{position:relative;width:100%;height:100%;object-fit:contain;
    object-position:center top;display:block}
.slide-poto .monogram{position:relative;font-family:var(--serif);font-weight:700;
    font-size:clamp(150px,13vw,190px);line-height:1;color:var(--h1,#B4232A)}
/* Kutipan memakai tanda petik melengkung di TEKS-nya sendiri; tanda
   menggantung terpisah pernah dicoba dan tampak yatim. */
.slide-isi{padding:0;position:relative;max-width:600px}
.slide-kutip{font-family:var(--serif);font-size:24px;line-height:1.62;
    color:var(--ink);margin:0}
.slide-siapa{margin-top:28px;display:flex;flex-direction:column;gap:8px}
.slide-siapa h3{font-family:var(--serif);font-size:21px;font-weight:600;
    line-height:1.25;color:var(--ink)}
.slide-peran{font-size:11.5px;font-weight:700;letter-spacing:.18em;
    text-transform:uppercase;color:var(--muted)}
/* Pintu ke peta kabinet: satu baris pernyataan berbingkai garis atas, bukan
   tombol yang mengambang. Kepentingannya diucapkan, bukan dibiarkan
   ditebak: di baliknya seluruh kabinet, bukan cuma tiga suara teratas. */
.pintu-kabinet{display:flex;width:100%;align-items:center;justify-content:space-between;
    gap:24px;margin-top:60px;padding:26px 2px 4px;border:0;border-top:1px solid var(--line);
    background:none;cursor:pointer;text-align:left;font:inherit}
.pk-kicker{display:block;font-size:11px;font-weight:700;letter-spacing:.18em;
    text-transform:uppercase;color:var(--muted);margin-bottom:8px;
    transition:color .25s}
.pk-judul{font-family:var(--serif);font-size:20px;line-height:1.4;color:var(--ink);
    max-width:640px;transition:color .25s}
.pk-panah{width:24px;height:24px;flex:none;stroke:var(--muted);fill:none;
    stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;
    transition:transform .35s var(--ease),stroke .25s}
.pintu-kabinet:hover .pk-judul,.pintu-kabinet:focus-visible .pk-judul{color:var(--red)}
.pintu-kabinet:hover .pk-kicker,.pintu-kabinet:focus-visible .pk-kicker{color:var(--red)}
.pintu-kabinet:hover .pk-panah,.pintu-kabinet:focus-visible .pk-panah{stroke:var(--red);
    transform:translateX(6px)}

/* --- Foto monokrom yang menyala saat disentuh ---
   Semua foto orang di situs ini (kartu peta, popup, panggung) tampil hitam
   putih selama tidak disentuh, lalu berwarna penuh saat kartunya diarahkan.
   Pola ini membuat deretan foto terlihat rapi sebagai satu kesatuan, dan
   warna tiap foto jadi hadiah kecil bagi yang penasaran. Begitu kolom foto
   di data/kabinet.js terisi, efeknya jalan sendiri tanpa sentuhan tambahan. */
.ofoto img,.slide-poto img,.omodal-poto img{
    filter:grayscale(.92) contrast(1.03);transition:filter .5s ease}
.okard:hover .ofoto img,.okard:focus-visible .ofoto img,
.slide:hover .slide-poto img,.omodal-panel:hover .omodal-poto img{filter:none}

/* footer
   Kaki halaman yang rapat: satu baris isi (merek, alamat, sosial, hak
   cipta) plus peta kecil di sampingnya. Dulu petanya setinggi 206px dengan
   tiga baris terpisah, jadi kaki halaman memakan hampir satu layar penuh;
   sekarang tingginya dijaga di bawah 180px dan isinya dirapatkan. */
footer.site{background:#2B1215;color:#D9C3C4;padding:34px 0 30px}
footer.site .top{display:flex;justify-content:space-between;align-items:center;gap:30px;flex-wrap:wrap;
    padding-bottom:20px;border-bottom:1px solid #45282B}
footer.site .fmark{display:flex;gap:12px;align-items:center}
/* Cip terang di bawah logo. Logonya didominasi merah di atas maroon yang
   juga merah, keburu menyatu; kertas terang di belakangnya menyelesaikan
   kontras itu tanpa menyentuh berkas logonya sama sekali. */
footer.site .fmark .logo-cip{flex:none;display:flex;align-items:center;justify-content:center;
    width:46px;height:46px;background:var(--tint);border-radius:13px;
    border:1px solid rgba(255,255,255,.10)}
footer.site .fmark .logo{width:34px;height:34px;object-fit:contain;flex:none}
footer.site .fmark b{color:#fff;display:block;font-size:15px}
footer.site .fmark span{font-size:12px;color:#B48F92}
/* Lokasi sekolah: peta kecil bawaan Google Maps (cukup embed, tanpa kunci
   API) dan satu baris alamat di bawahnya, seperti kaki situs organisasi
   pada umumnya. Tingginya sengaja sedang saja, bukan petak besar. */
footer.site .fpeta{flex:0 1 400px;min-width:260px}
footer.site .fpeta iframe{display:block;width:100%;height:150px;border:0;border-radius:14px;
    background:#1E0F11}
footer.site .falamat{display:flex;gap:8px;margin-top:10px;font-size:12.5px;color:#B48F92;line-height:1.55}
footer.site .falamat svg{width:14px;height:14px;flex:none;margin-top:2px;
    fill:none;stroke:#C9A9AB;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:round}
/* Baris pamungkas: hak cipta di kiri, media sosial di kanan. */
footer.site .bawah{display:flex;justify-content:space-between;align-items:center;gap:16px;flex-wrap:wrap;
    margin-top:20px}
footer.site .hak{font-size:12.5px;color:#B48F92}
/* Media sosial: tiap ikon adalah logo resminya sendiri, utuh satu bingkai,
   tanpa petak pembungkus. Instagram kotak gradasi khasnya, TikTok kotak
   hitam dengan catatan berlapis cyan dan merah, X kotak hitam berkandal
   silang putih, YouTube kotak pemutar merah. Dulu tiap logo dimasukkan ke
   petak berwarna lagi, akibatnya logo ig tampak bergaris hitam dan YouTube
   jadi gumpalan kotak kembar; sekarang logonya berdiri sendiri. */
footer.site .sosial{display:flex;gap:12px;align-items:center}
footer.site .soc{display:flex;transition:transform .35s var(--ease),filter .3s}
footer.site .soc:hover{transform:translateY(-3px) scale(1.08);filter:brightness(1.15)}
footer.site .soc svg{width:26px;height:26px;display:block}

/* ===== 8. Animasi dan media query ===== */
@media (prefers-reduced-motion: no-preference){
  /* Mode tanpa animasi: semua langsung tampil, dan transisinya dimatikan.
     Tanpa `transition:none`, elemen masih beranimasi dari pudar ke jelas, dan
     hasil tangkapan layar jadi tidak menentu, kadang tertangkap di tengah
     animasi sehingga halamannya terlihat kosong. */
  body.noanim .hero-in > *{animation:none;opacity:1;transform:none}
  body.noanim .reveal{opacity:1;transform:none;transition:none}
  .reveal{opacity:0;transform:translateY(16px);transition:opacity .55s ease,transform .55s ease}
  .reveal.in{opacity:1;transform:none}
  .hero-in > *{opacity:0;transform:translateY(14px);animation:rise .6s ease forwards}
  .hero-in > *:nth-child(1){animation-delay:.05s}
  .hero-in > *:nth-child(2){animation-delay:.16s}
  .hero-in > *:nth-child(3){animation-delay:.27s}
  .hero-in > *:nth-child(4){animation-delay:.38s}
  .hero-in > *:nth-child(5){animation-delay:.49s}
  @keyframes rise{to{opacity:1;transform:none}}
}

@media(max-width:820px){
  /* Foto penuh tetap selebar layar di ponsel. Tingginya sengaja tidak
     setinggi dulu: foto dokumen ini sangat lebar (2400x702), jadi makin
     tinggi zonanya makin keras pemotongan mendatarnya, dan muka gedung
     kehilangan konteksnya. */
  .lebar-foto img{height:clamp(300px,48vh,400px);object-position:50% 38%}
  .lindung{background:
      linear-gradient(180deg,rgba(24,10,10,.5) 0%,rgba(24,10,10,.2) 26%,
                      rgba(24,10,10,.46) 48%,rgba(26,11,10,.9) 90%)}
  .lebar-foto figcaption{bottom:clamp(84px,12vh,110px);padding:0 20px}
  .lebar-foto p{font-size:16px}
  .lebar-foto h2{font-size:clamp(26px,7vw,32px)}
  .grid10{grid-template-columns:1fr}
  .pintu-kabinet{margin-top:44px;padding-top:20px}
  .pk-judul{font-size:17.5px}
  /* Menu kecil: kartu melayang di bawah bilah, dengan latar gelap tembus
     pandang miliknya sendiri supaya terbaca di atas hero (dulu ia memaksa
     kepala jadi pulau supaya punya latar terang, dan itu terasa seperti bug
     karena pengunjung belum menggulir apa-apa).
     Munculnya beranimasi: kartunya turun sedikit sambil memudar masuk, dan
     tiap tautannya menyusul berurutan. Sebelumnya menu hanya display:flex
     begitu saja, jadi munculnya menyentak. */
  nav.main{display:flex;position:absolute;top:80px;left:16px;right:16px;
      background:rgba(24,10,12,.86);
      -webkit-backdrop-filter:blur(16px) saturate(1.3);
      backdrop-filter:blur(16px) saturate(1.3);
      border:1px solid rgba(255,244,232,.16);border-radius:18px;
      box-shadow:0 22px 52px rgba(20,8,10,.42);
      flex-direction:column;gap:0;padding:8px 20px 14px;
      transform-origin:50% 0;
      opacity:0;visibility:hidden;pointer-events:none;
      transform:translateY(-12px) scale(.97);
      transition:opacity .28s ease,transform .34s var(--ease),
          visibility .34s}
  nav.main.open{opacity:1;visibility:visible;pointer-events:auto;
      transform:none}
  nav.main a{padding:11px 0;border-bottom:1px solid rgba(255,244,232,.12);
      color:#FFF7F0;
      opacity:0;transform:translateY(-6px);
      transition:opacity .3s ease,transform .3s var(--ease),
          color .3s,border-color .3s}
  /* Kartu menu kecil ini SELALU gelap di kedua tema, jadi tautannya harus
     selalu krem, berapa pun temanya. Aturan pulau di atas lebih KHUSUS
     daripada aturan di dalam media ini (media query tidak menambah
     kekhususan sama sekali), jadi tanpa baris ini tinta tautannya mengikuti
     tema: di tema terang ia jadi gelap di atas kartu gelap. Gejalanya hanya
     muncul kalau pengunjung menggulir dulu baru membuka menu, sebab barulah
     pulau aktif.
     Kekhususan selektornya sengaja DISAMAKAN dengan aturan tema di atas
     (html[data-tema] + header.site.pulau + nav.main a) supaya bisa menang
     lewat urutan berkas, karena aturan tema itu menang atas selektor yang
     lebih pendek. */
  nav.main a,
  html[data-tema="terang"] header.site.pulau nav.main a,
  html[data-tema="gelap"] header.site.pulau nav.main a{color:#FFF7F0}
  nav.main.open a{opacity:1;transform:none}
  /* Tautan menyusul berurutan, jadi menunya terasa mengalir masuk. */
  nav.main.open a:nth-child(1){transition-delay:.05s}
  nav.main.open a:nth-child(2){transition-delay:.09s}
  nav.main.open a:nth-child(3){transition-delay:.13s}
  nav.main.open a:nth-child(4){transition-delay:.17s}
  nav.main.open a:nth-child(5){transition-delay:.21s}
  nav.main.open a:nth-child(6){transition-delay:.25s}
  nav.main.open a:nth-child(7){transition-delay:.29s}
  nav.main.open a:last-child{border-bottom:0}
  nav.main a:hover{color:#F0C36B;border-color:rgba(240,195,107,.5)}
  .burger{display:block}
  /* Tombol menu jadi silang saat terbuka: satu tanda yang jelas bahwa
     menunya bisa ditutup dari tempat yang sama. */
  .burger[aria-expanded="true"]{color:#F0C36B;border-color:#F0C36B}
  /* Di layar kecil kepala tetap selebar jendela saat diam, hanya lebih
     pendek; pulau kepala juga jalan, jaraknya dari tepi dirapatkan dan
     diberi sisi supaya lengkungnya tidak menempel tajam di tepi layar. */
  header.site .bar{height:62px;padding:0 18px;gap:12px}
  .mark .logo{width:34px;height:34px}
  header.site.pulau .bar{margin:8px 8px 0;width:calc(100% - 16px);height:56px;padding-left:16px;padding-right:16px}
  /* Jalur kegiatan tetap satu baris di ponsel. Bleed horizontalnya kembali,
     tapi PAS selebar bantal .wrap (24px): lebih lebar dari itu membuat
     halaman bocor bisa digeser mendatar dan pulau kepala terpotong tepi.
     Kartunya sengaja tak selebar layar: sisa empat puluhan piksel di kanan
     membuat kartu berikutnya selalu mengintip, tanda jalurnya masih ada
     isinya. Lebar kartu memakai 100vw dikurangi angka tetap, bukan vw
     saja, supaya lebar intipannya sama di semua ponsel. */
  .ev-grid{padding:16px 24px 72px;margin:-16px -24px -56px}
  .ev-card{flex-basis:calc(100vw - 76px);width:calc(100vw - 76px)}
  .ev-visual{height:min(94vw,430px)}
}

/* ===== Peta kabinet di layar kecil =====
   Petanya SAMA dengan desktop: kanvas lebar yang diseret satu jari dan
   dicubit dua jari untuk zum. Yang menyesuaikan hanya skala mulainya
   (seluruh peta muat lebar layar; dihitung js/peta.js), bilah atasnya yang
   dirapatkan, dan tombol zoom yang disembunyikan karena cubitan sudah
   menggantikannya. Dulu peta di HP diubah jadi satu kolom gulir biasa;
   selain kehilangan rasa petanya, cubit dan geser mendatar jadi mustahil. */
@media(max-width:820px){
  .frame-bar{padding:10px 14px;gap:8px}
  .fbtn.kembali{font-size:12.5px;padding:8px 12px}
  .fbtn.kembali svg{width:11px;height:11px}
  .fbtn.zoom{display:none}
  .peta-head{margin-bottom:26px}
  .peta-head b{font-size:23px}
  .peta-atas{font-size:10px;letter-spacing:1.4px}
  .peta-head em{font-size:10.5px;padding:4px 12px;margin-top:9px}
  .hint{font-size:11px;padding:7px 14px;bottom:12px}
}

/* Di layar sangat kecil, jarak dirapatkan lagi supaya tidak terlalu banyak
   ruang terbuang, tapi kartunya tetap dua kolom agar wajahnya masih terlihat. */
@media(max-width:430px){
  .lini-grid{gap:9px}
  .kelompok-kartu{gap:9px}
  .oinfo{padding:8px 10px 10px}
  .oinfo b{font-size:11.5px}
}

/* Popup detail di layar sempit: gambar pindah ke atas, teks di bawah, dan
   gradasi penyatunya ikut berputar jadi vertikal. */
@media(max-width:700px){
  .omodal{padding:14px}
  .omodal-panggung{height:min(520px,72vh)}
  .omodal-panel{grid-template-columns:1fr;grid-template-rows:215px 1fr;
      max-height:92vh}
  .omodal-poto{min-height:0}
  /* Di layar sempit gambar pindah ke atas teks, jadi topeng penyatunya ikut
     berputar: lunturnya ke BAWAH, bukan ke kanan. */
  .omodal-poto{-webkit-mask-image:linear-gradient(180deg,#000 58%,transparent 97%);
      mask-image:linear-gradient(180deg,#000 58%,transparent 97%)}
  .omodal-isi{padding:22px 22px 26px}
  .omodal-nama{font-size:22px}
  .omodal-grup-jalur{width:min(70vw,calc(var(--lebar-cip,110px) * 3.2))}
  .gchip{font-size:11px;padding:6px 10px}
}

/* Pengunjung yang mematikan animasi: popupnya langsung muncul tanpa transisi,
   dan jalurnya melompat tanpa geseran. */
@media (prefers-reduced-motion: reduce){
  .omodal,.omodal-panel,.omodal-tutup{transition:none;transform:none}
  .omodal-jalur,.omodal-grup-lurus{transition:none}
}

/* ===== Panggung, pita bidang, dan busur di layar kecil ===== */
@media(max-width:820px){
  /* Hero tetap layar penuh di HP: isi dirapatkan dari pulau kepala, zona
     pendaran emas pindah ke tengah atas, dan tombolnya sedikit dikecilkan
     supaya dua-duanya muam sebaris atau rapi menumpuk. */
  .hero{--glow-x:50%;--glow-y:30%}
  .hero-in{padding-top:112px;padding-bottom:150px}
  /* Sapaan dirapatkan jarak hurufnya di layar sempit: pada 3,5px ia pecah
     dua baris di bawah 340px, dan sapaan dua baris bukan lagi sapaan. */
  .hero .sapa{letter-spacing:2.6px;font-size:11.5px}
  /* Tombol masuk dilebarkan di ponsel: ia satu-satunya jalan masuk ke isi
     situs dari halaman depan, jadi lebih baik jadi sasaran jempol yang
     lapang daripada pil kecil yang harus dibidik. */
  .hero .btn{padding:15px 34px;font-size:16px}
  .lengkung{height:46px}
  .malam .lengkung.atas{top:-45px}
  .malam .lengkung.bawah{bottom:-1px}
  section.malam::after{height:46px}
  footer.site .lengkung{top:-45px}
  section.malam{padding:104px 0 110px}
  #agenda{padding-bottom:96px}
  #pengurus{padding-top:96px}
  /* Pesan menjadi tegak: potret di atas, teks di bawah; geseran satu jari
     tetap jalan walau tidak ada satu pun tombol di panggung ini. */
  .slide{grid-template-columns:1fr;grid-template-rows:210px 1fr;gap:18px}
  .slide-poto{min-height:0}
  .slide-poto .monogram{font-size:110px}
  .slide-kutip{font-size:18.5px;line-height:1.6;margin:0}
  .slide-siapa{margin-top:20px;gap:6px}
  .slide-siapa h3{font-size:19px}
}
