/* ============================================================
   base.css — struktur Mini App: layout, ukuran, spacing, state.

   Tidak ada satu pun nilai warna di file ini; semuanya var() yang
   didefinisikan file tema (themes/*.css). Menambah komponen baru cukup di
   sini sekali, dan dua tema langsung ikut. Kalau butuh warna yang belum ada
   tokennya, tambahkan tokennya ke SEMUA file tema — jangan tulis hex di sini,
   karena tema gelap akan mewarisinya diam-diam.
   ============================================================ */

*{box-sizing:border-box;}
html,body{margin:0;background:var(--bg);}
body{font-family:var(--body);color:var(--ink);letter-spacing:-.01em;-webkit-font-smoothing:antialiased;}
a{color:var(--mint-d);text-decoration:none;}
a:hover{color:var(--mint);}
button{font:inherit;}

.app{max-width:480px;min-height:100vh;margin:0 auto;display:flex;flex-direction:column;
  background:var(--tex) repeat, var(--paper);
  box-shadow:var(--app-shadow);}

.topbar{flex:none;display:flex;align-items:center;gap:10px;padding:11px 14px;background:var(--panel);
  border-bottom:1px solid var(--rule);position:sticky;top:0;z-index:5;}
.topbar .mark{width:24px;height:24px;border-radius:6px;background:var(--mint);display:grid;place-items:center;
  font-family:var(--disp);font-weight:800;font-size:10.5px;color:var(--on-mint);flex:none;}
.topbar .org{font-family:var(--disp);font-weight:800;font-size:13px;flex:1;}

.content{flex:1;display:flex;flex-direction:column;padding:14px 14px 20px;}
.screen{display:none;}
.screen.on{display:flex;flex-direction:column;gap:14px;animation:rise .32s cubic-bezier(.2,.7,.3,1) both;}
/* Wrapper berisi beberapa section-list: baru di-hide/show bersamaan, jadi
   spacing antar section-nya diatur di sini (bukan inherit gap .screen). */
#homeBody,#wlWrap,#newsWrap,#flowBody,#marketBody,#alertBody{display:flex;flex-direction:column;gap:14px;}
/* Halaman bayar diberi ruang lebih: kartu harga perlu napas supaya terbaca. */
#upBody{display:flex;flex-direction:column;gap:22px;}
@keyframes rise{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:none;}}
@media (prefers-reduced-motion:reduce){.screen.on{animation:none;}}
[hidden]{display:none!important;}

.h1{font-family:var(--disp);font-weight:700;font-size:19px;letter-spacing:-.02em;margin:0;}
.head{display:flex;align-items:baseline;justify-content:space-between;}
.lbl{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--faint);padding-bottom:7px;}
.datetag{font-family:var(--mono);font-size:10px;letter-spacing:.02em;color:var(--faint);white-space:nowrap;}
.lbl.up{color:var(--mint-d);}
.lbl.down{color:var(--down);}
.back{display:inline-block;font-family:var(--mono);font-size:10px;letter-spacing:.1em;color:var(--muted);padding:6px 0;}
.tabs{display:flex;gap:18px;padding:2px 2px 0;border-bottom:1px solid var(--line);}
.tab{padding:8px 2px 9px;background:none;border:0;border-bottom:3px solid transparent;color:var(--faint);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;cursor:pointer;}
  .tab.on{color:var(--ink);border-bottom-color:var(--mint-d);}
#marketBody {gap: 0;}
#marketBody .tabs {border: 0;padding: 0;}
.mono{font-family:var(--mono);}
.up{color:var(--mint-d);}
.down{color:var(--down);}
.muted{color:var(--muted);}
.faint{color:var(--faint);}

.panel{background:var(--panel);border:1px solid var(--line-2);box-shadow:var(--raise);}
.panel.pad{padding:14px;}
.rows{padding:0 12px;}
.rows > *{border-top:1px solid var(--line);}
.rows > *:first-child{border-top:0;}

.mrow{display:flex;align-items:center;gap:12px;padding:12px 0;color:var(--ink);min-height:44px;}
.mrow .no{font-family:var(--mono);font-size:9.5px;color:var(--mint-d);width:16px;}
.mrow .t{flex:1;}
.mrow .t b{display:block;font-size:13.5px;font-weight:600;}
.mrow .t span{display:block;font-size:11px;color:var(--muted);margin-top:2px;}
.mrow .go{color:var(--faint);font-size:14px;transition:transform .18s;}
.mrow:active .go{transform:translateX(3px);}

.grid{display:grid;gap:1px;background:var(--line);border:1px solid var(--line-2);box-shadow:var(--raise-2);}
.grid.c2{grid-template-columns:1fr 1fr;}
.grid.c3{grid-template-columns:repeat(3,1fr);}
.grid .cell{background:var(--panel);padding:11px 12px;}
.grid a.cell{display:block;color:inherit;text-decoration:none;}
.grid .cell b{font-family:var(--disp);font-weight:700;font-size:13px;}
.grid .cell .v{font-family:var(--mono);font-size:12px;margin-top:3px;}
.grid .cell .soon{font-family:var(--mono);font-size:9px;color:var(--mint-d);letter-spacing:.1em;}
.grid .cell .n{font-size:11.5px;margin-top:6px;line-height:1.3;}
.grid .cell .dt{font-family:var(--mono);font-size:9px;letter-spacing:.06em;color:var(--faint);margin-top:3px;}
.grid .cell .pick{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:8px;margin-top:8px;}
.grid .cell .pick .v{font-family:var(--mono);font-size:11.5px;margin-top:0;}
.grid .cell .pick .q{display:flex;align-items:baseline;gap:6px;}
.grid .cell .pick .q .p{font-family:var(--mono);font-size:11.5px;color:var(--ink);}
.band{font-family:var(--mono);font-size:9.5px;color:var(--faint);margin-top:2px;line-height:1.4;}
.grid .cell .none{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.4;}

.thead,.trow{display:grid;grid-template-columns:1fr auto 56px 34px;gap:10px;align-items:center;}
.thead{font-family:var(--mono);font-size:9px;letter-spacing:.12em;color:var(--faint);padding-bottom:7px;}
.thead .r,.trow .r{text-align:right;}
.trow{padding:14px 0;border-top:1px solid var(--line);min-height:52px;}
.trow:first-of-type{border-top:1px solid var(--rule);}
#wlRows{padding:12px;}
.trow .tk{display:block;font-family:var(--disp);font-weight:700;font-size:13.5px;}
.trow .nm{display:block;font-size:10.5px;color:var(--muted);margin-top:2px;}
.trow .px{font-family:var(--mono);font-size:12.5px;}
.trow .ch{font-family:var(--mono);font-size:11.5px;}
.trow .px.tick{animation:tick .6s ease;}
@keyframes tick{0%{background:var(--tick);}100%{background:transparent;}}
.trow .del{width:44px;height:44px;margin-right:-5px;display:grid;place-items:center;background:none;border:0;
  color:var(--faint);font-family:var(--mono);font-size:15px;cursor:pointer;padding:0;justify-self:end;}
.trow .del:active{color:var(--down);}
.list-end{border-bottom:1px solid var(--line);}
.leaving{animation:leave .22s ease forwards;}
@keyframes leave{to{opacity:0;transform:translateX(-14px);height:0;padding:0;border-width:0;}}

.srow{display:flex;justify-content:space-between;align-items:center;padding:11px 0;border-top:1px solid var(--line);}
.srow:first-of-type{border-top:1px solid var(--rule);}
.srow b{font-family:var(--disp);font-weight:700;font-size:13.5px;}
.plan-opt{width:100%;background:none;border:0;border-top:1px solid var(--line);color:inherit;cursor:pointer;text-align:left;}
.plan-opt.on{color:var(--mint-d);}
.plan-opt.on b::before{content:'● ';font-size:10px;vertical-align:middle;}
.srow .v{font-family:var(--mono);font-size:12.5px;}
.srow .nm{display:block;font-size:10px;color:var(--muted);margin-top:1px;font-family:var(--mono);}
/* Baris bandarmologi yang bisa diketuk (→ detail broker). Di layar sentuh
   tidak ada hover, jadi penandanya harus terlihat: panah kanan yang jelas,
   dan efek tekan. */
a.srow.tap{color:inherit;text-decoration:none;position:relative;padding-right:22px;-webkit-tap-highlight-color:transparent;}
a.srow.tap .chev{position:absolute;right:2px;top:50%;transform:translateY(-50%);font-size:18px;line-height:1;color:var(--mint-d);}
a.srow.tap:active{background:var(--line);}
.hint{margin:0 0 8px;font-family:var(--mono);font-size:9.5px;letter-spacing:.04em;color:var(--mint-d);}
/* Detail broker: kepala (peringkat, kode, nama) lalu tiga angka berlabel. */
.brow{padding:11px 0;border-top:1px solid var(--line);}
.brow:first-of-type{border-top:1px solid var(--rule);}
.brow-h{display:flex;align-items:center;gap:10px;}
.brow-h b{font-family:var(--disp);font-weight:700;font-size:13.5px;}
.brow-h .nm{display:block;font-size:10px;color:var(--muted);margin-top:1px;font-family:var(--mono);}
.brow-h .rank{font-family:var(--mono);font-size:10px;color:var(--faint);min-width:14px;}
.brow-s{display:grid;grid-template-columns:1.3fr 1fr 1fr;gap:8px;margin-top:8px;padding-left:24px;}
.brow-s i{display:block;font-style:normal;font-family:var(--mono);font-size:9px;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);}
.brow-s em{display:block;font-style:normal;font-family:var(--mono);font-size:11.5px;margin-top:2px;}
.brokerName{margin:-4px 0 10px;font-size:11.5px;color:var(--muted);}
.brokerNote{margin:12px 0 0;font-family:var(--mono);font-size:9.5px;color:var(--faint);line-height:1.4;}

/* Live alert. Dua zona: batch terbaru (SEKARANG) dan daftar saham yang pernah
   lolos formula hari ini (RIWAYAT). Baris riwayat yang sudah tidak lolos
   diredupkan, bukan disembunyikan — justru itu yang dicari orang yang
   melewatkan notifikasinya. */
.live{display:flex;align-items:center;gap:7px;font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;color:var(--faint);}
.live .dot{width:6px;height:6px;border-radius:50%;background:var(--faint);flex:none;}
.live.on{color:var(--mint-d);}
.live.on .dot{background:var(--mint-d);animation:pulse 2s ease-in-out infinite;}
@keyframes pulse{0%,100%{opacity:1;}50%{opacity:.25;}}
.arow{display:flex;justify-content:space-between;align-items:center;padding:11px 0;border-top:1px solid var(--line);}
.arow:first-of-type{border-top:1px solid var(--rule);}
.arow b{font-family:var(--disp);font-weight:700;font-size:13.5px;}
.arow .px{font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-left:8px;}
.arow .v{font-family:var(--mono);font-size:12.5px;}
.arow.out{opacity:.5;}
.arow .win{display:block;font-family:var(--mono);font-size:9.5px;color:var(--faint);margin-top:2px;}
.seg{display:flex;gap:0;border:1px solid var(--rule);}
.seg button{flex:1;min-height:44px;background:none;border:0;border-left:1px solid var(--line);color:var(--muted);
  font-family:var(--mono);font-size:10px;letter-spacing:.06em;cursor:pointer;}
.seg button:first-child{border-left:0;}
.seg button.on{background:var(--invert-bg);color:var(--invert-fg);}
.togg{display:flex;justify-content:space-between;align-items:center;padding:11px 0 13px;}
.togg span{font-size:12px;color:var(--muted);}
.cap{margin:10px 0 0;font-size:11px;color:var(--faint);line-height:1.45;}

.btn{display:inline-flex;align-items:center;justify-content:center;min-height:44px;text-align:center;font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;
  padding:12px 16px;color:var(--on-mint);background:var(--mint);border:1px solid var(--mint-d);
  box-shadow:var(--btn-shadow);cursor:pointer;transition:transform .12s;}
.btn:active{transform:translateY(1px);}
.btn[disabled]{opacity:.5;pointer-events:none;}
.btn.sm{padding:8px 14px;font-size:10px;}
.btn.block{display:flex;width:100%;}

.note{display:flex;align-items:center;gap:12px;padding:12px;background:var(--warn-bg);border:1px solid var(--warn-line);}
.note p{flex:1;margin:0;font-size:11.5px;color:var(--muted);line-height:1.45;}

.addform{display:flex;gap:8px;padding:12px;background:var(--panel);border:1px solid var(--line);
  box-shadow:var(--raise-3);}
.addform input{flex:1;min-width:0;min-height:44px;padding:11px 12px;border:1px solid var(--line-2);background:var(--input-bg);
  font-family:var(--mono);font-size:12px;color:var(--ink);outline:none;text-transform:uppercase;}
.addform input:focus{border-color:var(--mint-d);}

/* Pencarian di dalam daftar yang sudah dimuat (Insider). Bukan input pencarian
   ke server — tidak ada request per ketikan. */
.searchbar{display:flex;gap:8px;align-items:stretch;margin-bottom:10px;}
.searchbar input{flex:1;min-width:0;min-height:40px;padding:10px 12px;border:1px solid var(--line-2);background:var(--input-bg);
  font-family:var(--mono);font-size:12px;color:var(--ink);outline:none;}
.searchbar input:focus{border-color:var(--mint-d);}
.searchbar input::placeholder{color:var(--faint);}
/* Silang bawaan browser dimatikan: tingginya beda-beda antar mesin dan tidak
   terjangkau ibu jari. Tombol HAPUS di sebelahnya yang mengambil peran itu. */
.searchbar input[type=search]::-webkit-search-cancel-button{-webkit-appearance:none;appearance:none;}
.searchbar .clr{display:flex;align-items:center;padding:0 12px;border:1px solid var(--line-2);background:var(--panel);
  font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--muted);cursor:pointer;}
.searchbar .clr:active{background:var(--line);}

.field{margin-bottom:12px;}
.field label{display:block;font-size:11px;color:var(--muted);margin-bottom:6px;}
.field input{width:100%;min-height:44px;padding:11px 12px;border:1px solid var(--line-2);background:var(--input-bg);
  font-family:var(--body);font-size:13px;color:var(--ink);outline:none;}
.field input:focus{border-color:var(--mint-d);}
.row2{display:flex;gap:8px;}
.row2 .btn{flex:1;}
.btn.primary{background:var(--mint);border:1px solid var(--mint-d);color:var(--on-mint);}

.newscard{display:block;padding:13px 14px;background:var(--panel);border:1px solid var(--line-2);
  box-shadow:var(--raise);color:var(--ink);}
.newscard .meta{display:flex;gap:9px;align-items:center;font-family:var(--mono);font-size:9.5px;}
.newscard .meta .tk{color:var(--mint-d);letter-spacing:.08em;}
.newscard .meta .ago{color:var(--faint);}
.newscard h2{margin:6px 0 0;font-size:13.5px;line-height:1.4;font-weight:500;text-wrap:pretty;}
.newscard .src{display:flex;align-items:center;justify-content:space-between;margin-top:6px;}
.newscard .src span{font-size:10.5px;color:var(--faint);}
.newscard .src em{font-family:var(--mono);font-size:9.5px;color:var(--mint-d);font-style:normal;}
.newslist{display:flex;flex-direction:column;gap:14px;}

.locked{position:relative;}
.locked .veil{filter:blur(6px);pointer-events:none;}
.locked .lock{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:10px;text-align:center;background:var(--veil);}
.locked .lock .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--mint-d);}
.locked .lock p{margin:0;font-size:12px;color:var(--muted);max-width:210px;line-height:1.5;}

.big{display:flex;justify-content:space-between;align-items:baseline;padding-bottom:12px;border-bottom:1px solid var(--rule);}
.big span{font-size:11.5px;color:var(--muted);}
.big b{font-family:var(--mono);font-size:18px;font-weight:500;color:var(--mint-d);}

/* Pecahan pagi/sore di bawah angka gabungan. Dua kolom yang membagi lebar
   sama rata, jadi tidak ada yang terbaca lebih penting dari yang lain — dan
   tetap dua kolom di layar sempit, karena isinya cuma persen dan pecahan. */
.wr-split{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px;
  padding-top:12px;border-top:1px solid var(--rule);}
.wr-cell{display:flex;flex-direction:column;gap:2px;min-width:0;}
.wr-cell .wr-k{font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--faint);}
.wr-cell b{font-family:var(--mono);font-size:15px;font-weight:500;color:var(--mint-d);}
.wr-cell .wr-n{font-size:9px;letter-spacing:.08em;}

.me{display:flex;align-items:center;gap:12px;}
.me .av{width:42px;height:42px;border-radius:10px;background:var(--panel-2);border:1px solid var(--rule);
  display:grid;place-items:center;font-family:var(--disp);font-weight:700;font-size:13.5px;flex:none;
  box-shadow:var(--raise-4);}
.me b{font-family:var(--disp);font-weight:700;font-size:16px;letter-spacing:-.02em;}
.me span{display:block;font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-top:2px;}

.plan{display:flex;justify-content:space-between;align-items:baseline;padding-bottom:9px;}
.plan .k{font-family:var(--mono);font-size:9px;letter-spacing:.14em;color:var(--faint);}
.plan .v{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;color:var(--mint-d);}
.planval{font-family:var(--disp);font-weight:700;font-size:14.5px;padding:11px 0;
  border-top:1px solid var(--rule);border-bottom:1px solid var(--line);}
.panel.pad .btn.block{margin-top:12px;}
/* Panel dashboard web di profil. */
.webtxt{margin:0;font-size:12px;color:var(--muted);line-height:1.5;}
.webtxt b{color:var(--ink);font-weight:600;word-break:break-all;}

.pay{display:flex;justify-content:space-between;align-items:center;padding:11px 0;border-top:1px solid var(--line);}
.pay:first-of-type{border-top:1px solid var(--rule);}
.pay .n{display:block;font-size:12px;}
.pay .d{display:block;font-family:var(--mono);font-size:10px;color:var(--faint);margin-top:3px;}
.pay .a{display:block;font-family:var(--mono);font-size:11.5px;text-align:right;}
.pay .s{display:block;font-family:var(--mono);font-size:9px;color:var(--mint-d);text-align:right;margin-top:3px;}
.pay .s.pending{color:var(--warn-ink);}

.hero{padding:18px;background:var(--invert-bg);color:var(--invert-fg);box-shadow:var(--hero-shadow);}
.hero .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--mint);}
.hero .p{font-family:var(--disp);font-weight:800;font-size:22px;margin-top:9px;letter-spacing:-.02em;}
.hero .p small{font-size:13px;font-weight:600;}
.hero .d{font-size:12px;margin-top:8px;opacity:.75;line-height:1.5;}
/* Harga promo. Harga normal dicoret oleh garis yang "digambar" (bukan
   text-decoration) supaya bisa dianimasikan; harga promo menyusul naik.
   Semua animasi sekali jalan dan mati di prefers-reduced-motion. */
.off{display:inline-block;font-family:var(--mono);font-size:9px;font-weight:700;letter-spacing:.08em;padding:3px 6px;
  background:var(--mint);color:var(--on-mint);border-radius:var(--r-sm,2px);
  animation:pop .45s cubic-bezier(.2,1.6,.4,1) .75s both;}
.was{position:relative;display:inline-block;text-decoration:none;font-family:var(--mono);font-size:12px;opacity:.55;}
.was::after{content:'';position:absolute;left:-3px;right:-3px;top:52%;height:2px;background:var(--down);
  transform:rotate(-6deg) scaleX(0);transform-origin:left center;animation:strike .4s ease-out .35s forwards;}
.now{display:inline-block;font-variant-numeric:tabular-nums;}
@keyframes strike{to{transform:rotate(-6deg) scaleX(1);}}
@keyframes pop{from{opacity:0;transform:scale(.4);}to{opacity:1;transform:scale(1);}}

.uphead p{margin:6px 0 0;font-size:12.5px;color:var(--muted);line-height:1.5;}
.deals{display:grid;gap:12px;}
.deal{position:relative;overflow:hidden;padding:16px;background:var(--panel);border:1px solid var(--line-2);
  border-radius:var(--r,0);box-shadow:var(--raise);}
.deal.best{border-color:var(--mint-d);box-shadow:var(--raise-2);}
.deal.best::before{content:'';position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(105deg,transparent 35%,var(--sk-hl) 50%,transparent 65%);
  transform:translateX(-100%);animation:shine 1.1s ease-in-out 1.1s;}
@keyframes shine{to{transform:translateX(100%);}}
.deal .top{display:flex;align-items:center;gap:8px;}
.deal .top b{font-family:var(--disp);font-weight:700;font-size:14px;}
.deal .top .ribbon{font-family:var(--mono);font-size:8.5px;letter-spacing:.12em;color:var(--mint-d);}
.deal .top .off{margin-left:auto;}
.deal .price{display:flex;align-items:baseline;flex-wrap:wrap;gap:4px 10px;margin-top:12px;}
.deal .now{font-family:var(--disp);font-weight:800;font-size:20px;letter-spacing:-.02em;}
.deal .per{font-family:var(--mono);font-size:10.5px;color:var(--muted);}
.deal .save{font-family:var(--mono);font-size:10px;letter-spacing:.04em;color:var(--mint-d);margin-top:8px;}
.deals .deal:nth-child(2) .was::after{animation-delay:.55s;}
@media (prefers-reduced-motion:reduce){
  .off,.deal.best::before{animation:none;}
  .was::after{animation:none;transform:rotate(-6deg);}
}

.perk{display:flex;gap:10px;padding:11px 0;border-top:1px solid var(--line);font-size:12px;align-items:baseline;}
.perk:first-of-type{border-top:1px solid var(--rule);}
.perk i{font-family:var(--mono);font-size:10px;color:var(--mint-d);font-style:normal;}

.nav{flex:none;display:flex;justify-content:space-between;padding:9px 8px calc(9px + env(safe-area-inset-bottom,0px));
  background:var(--panel);border-top:1px solid var(--rule);position:sticky;bottom:0;z-index:5;}
.nav a{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 0;min-height:44px;color:var(--faint);}
.nav a span{font-family:var(--mono);font-size:8.5px;letter-spacing:.1em;}
.nav a.on{color:var(--mint-d);}

.sk{background:linear-gradient(90deg,var(--panel-2) 25%,var(--sk-hl) 37%,var(--panel-2) 63%);
  background-size:400% 100%;animation:shimmer 1.3s linear infinite;}
@keyframes shimmer{0%{background-position:100% 0;}100%{background-position:0 0;}}
.skline{height:11px;margin:9px 0;}
.skrow{display:flex;justify-content:space-between;align-items:center;padding:13px 0;border-top:1px solid var(--line);}
.skrow:first-child{border-top:1px solid var(--rule);}
.skrow .sk:first-child{width:38%;height:13px;}
.skrow .sk:last-child{width:22%;height:13px;}

.toast{position:fixed;left:50%;bottom:calc(76px + env(safe-area-inset-bottom,0px));transform:translate(-50%,14px);
  z-index:30;max-width:300px;padding:10px 14px;background:var(--invert-bg);color:var(--invert-fg);
  font-family:var(--mono);font-size:10.5px;letter-spacing:.05em;opacity:0;pointer-events:none;
  transition:opacity .2s,transform .2s;box-shadow:var(--toast-shadow);}
.toast.show{opacity:1;transform:translate(-50%,0);}
.toast.bad{background:var(--down);}

.empty{padding:26px 14px;text-align:center;}
.empty .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--faint);}
.empty p{margin:8px 0 0;font-size:12px;color:var(--muted);}
.empty .btn{margin-top:12px;}
.empty ol.steps{margin:12px 0 0;padding:0 0 0 18px;text-align:left;font-size:12px;line-height:1.6;color:var(--muted);}
.empty ol.steps li+li{margin-top:4px;}
.err{padding:12px;border:1px solid var(--err-line);background:var(--err-bg);}
.err p{margin:0 0 10px;font-size:11.5px;color:var(--down);}
/* ============================================================
   HARGA — kartu IHSG di home dan layar #/saham/<kode>.
   Warna garis ikut arah: naik var(--mint-d), turun var(--down). SVG memakai
   currentColor, jadi warnanya cukup diatur lewat class .up/.down di
   pembungkusnya dan kedua tema langsung ikut.
   ============================================================ */
#pxBody{display:flex;flex-direction:column;gap:14px;}

/* Kartu IHSG: angka di kiri, sparkline di kanan, panah penanda bisa diketuk. */
.ihsg{display:flex;align-items:center;gap:12px;padding:12px 14px;color:var(--ink);
  -webkit-tap-highlight-color:transparent;}
.ihsg:hover{color:var(--ink);}
.ihsg:active{background:var(--line);}
.ihsg-l{display:flex;flex-direction:column;gap:2px;min-width:0;}
.ihsg-k{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;color:var(--faint);}
.ihsg-k i{font-style:normal;letter-spacing:.04em;margin-left:4px;}
.ihsg b{font-family:var(--mono);font-size:17px;font-weight:500;letter-spacing:-.01em;}
.ihsg-c{font-family:var(--mono);font-size:11px;}
.ihsg .spark{flex:1;height:40px;min-width:0;}
.ihsg .chev{font-size:18px;line-height:1;color:var(--mint-d);}

/* Ticker yang bisa diketuk di menu pagi/sore. Layar sentuh tidak punya hover,
   jadi penandanya harus terlihat: panah kecil setelah harga, dan efek tekan. */
a.pick{color:inherit;text-decoration:none;-webkit-tap-highlight-color:transparent;}
a.pick:hover{color:inherit;}
a.pick:active{opacity:.6;}
a.pick .chev{font-size:14px;line-height:1;color:var(--mint-d);}
/* Baris watchlist juga bisa diketuk (kecuali tombol hapusnya). */
.trow.tap{cursor:pointer;-webkit-tap-highlight-color:transparent;}
.trow.tap:active{background:var(--line);}

.pxhead{display:flex;align-items:baseline;justify-content:space-between;gap:10px;}
.pxhead b{font-family:var(--mono);font-size:24px;font-weight:500;letter-spacing:-.02em;font-variant-numeric:tabular-nums;}
.pxhead span{font-family:var(--mono);font-size:12.5px;text-align:right;font-variant-numeric:tabular-nums;}
.pxat{font-size:9.5px;letter-spacing:.06em;margin-top:2px;min-height:14px;}

/* Chart: SVG direntang (preserveAspectRatio=none) dengan stroke yang tidak ikut
   meregang; label sumbu Y ditulis sebagai HTML supaya hurufnya tidak gepeng. */
.chart{position:relative;height:170px;margin:10px 0 4px;padding-right:44px;touch-action:pan-y;}
.chart svg{display:block;width:100%;height:100%;overflow:visible;}
.chart.busy svg{opacity:.35;transition:opacity .15s;}
.chart-y{position:absolute;top:0;right:0;bottom:0;width:42px;pointer-events:none;}
.chart-y span{position:absolute;right:0;transform:translateY(-50%);font-family:var(--mono);font-size:9.5px;color:var(--faint);}
.chart-msg{position:absolute;inset:0 44px 0 0;display:grid;place-items:center;font-size:11.5px;color:var(--muted);text-align:center;}
.chart-dot{position:absolute;width:9px;height:9px;border-radius:50%;background:currentColor;
  transform:translate(-50%,-50%);box-shadow:0 0 0 3px var(--panel);pointer-events:none;}
.chart .base{stroke:var(--faint);}
.chart .cross{stroke:var(--faint);}
/* Garis sinyal: area beli diarsir tipis dengan tepi putus-putus, batas jual
   putus-putus saja. Warnanya tetap (beli = aksen, jual = merah), tidak ikut
   arah garis harga, supaya artinya sama di chart yang naik maupun turun. */
.chart .bandbuy{fill:var(--mint-d);opacity:.1;}
.chart .bandline{stroke-dasharray:3 3;}
.chart .bandline.buy{stroke:var(--mint-d);}
.chart .bandline.sell{stroke:var(--down);}
.chart-tag{position:absolute;left:2px;transform:translateY(-120%);font-family:var(--mono);font-size:8.5px;
  letter-spacing:.12em;color:var(--muted);pointer-events:none;}

.rtabs{display:flex;justify-content:space-between;gap:4px;margin-top:6px;}
.rtabs button{flex:1;min-height:36px;background:none;border:0;color:var(--faint);cursor:pointer;
  font-family:var(--mono);font-size:11px;letter-spacing:.06em;border-radius:var(--r-sm,0);}
.rtabs button.on{color:var(--mint-d);font-weight:700;background:var(--panel-2);}

/* Data hari ini: dua kolom label–angka, seperti layar broker. */
.stats{display:grid;grid-template-columns:1fr 1fr;gap:0 18px;}
.stats div{display:flex;justify-content:space-between;align-items:baseline;padding:7px 0;border-top:1px solid var(--line);}
.stats div:nth-child(-n+2){border-top:0;}
.stats i{font-style:normal;font-size:11.5px;color:var(--muted);}
.stats em{font-style:normal;font-family:var(--mono);font-size:12px;font-variant-numeric:tabular-nums;}
.stats .full{grid-column:1 / -1;}
.cmp{margin:10px 0 0;font-size:11.5px;color:var(--muted);line-height:1.45;}
.sig + .sig{margin-top:12px;padding-top:12px;border-top:1px solid var(--line);}
.sig .soon{font-family:var(--mono);font-size:9.5px;letter-spacing:.12em;color:var(--mint-d);}
.sig .dt{font-family:var(--mono);font-size:9.5px;color:var(--faint);margin-left:6px;}
.sig .stats{margin-top:6px;}
