:root{
  --bg:#0a0b14; --ink:#eef0ff; --muted:#9aa0c3; --line:rgba(255,255,255,.09);
  --card:rgba(255,255,255,.045); --accent:#7c6cff; --accent2:#25d9c8; --warn:#ff5d7e;
  --good:#3ddc84; --radius:16px; --font:'Segoe UI',system-ui,-apple-system,sans-serif;
}
*{box-sizing:border-box}
[hidden]{display:none!important}
html,body{margin:0;height:100%}
body{
  font-family:var(--font); color:var(--ink); background:var(--bg);
  overflow-x:hidden; -webkit-font-smoothing:antialiased;
}
button{font-family:inherit;cursor:pointer;color:inherit}
input,select{font-family:inherit;font-size:14px}

/* ---------- animated background ---------- */
.bg{position:fixed;inset:0;z-index:-1;overflow:hidden;background:
   radial-gradient(1200px 800px at 15% -10%,#1b1746 0%,transparent 60%),
   radial-gradient(1000px 700px at 110% 20%,#0c2f3a 0%,transparent 55%),var(--bg);}
.blob{position:absolute;border-radius:50%;filter:blur(70px);opacity:.55;mix-blend-mode:screen}
.b1{width:46vmax;height:46vmax;left:-12vmax;top:-14vmax;background:#6a4bff;animation:drift1 22s ease-in-out infinite}
.b2{width:38vmax;height:38vmax;right:-10vmax;top:10vmax;background:#12b3a6;animation:drift2 27s ease-in-out infinite}
.b3{width:32vmax;height:32vmax;left:30vmax;bottom:-16vmax;background:#ff4f87;animation:drift3 30s ease-in-out infinite}
.grain{position:absolute;inset:0;opacity:.05;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")}
@keyframes drift1{50%{transform:translate(14vmax,10vmax) scale(1.15)}}
@keyframes drift2{50%{transform:translate(-12vmax,8vmax) scale(1.1)}}
@keyframes drift3{50%{transform:translate(8vmax,-12vmax) scale(1.2)}}

/* ---------- top bar ---------- */
.topbar{display:flex;align-items:center;justify-content:space-between;padding:14px 20px}
.brand{display:flex;align-items:center;gap:10px}
.brand h1{font-size:20px;letter-spacing:.5px;margin:0;font-weight:700}
.brand .tagline{font-size:11px;color:var(--muted);letter-spacing:1px;text-transform:uppercase}
.brand-orb{width:22px;height:22px;border-radius:50%;
  background:conic-gradient(from 0deg,var(--accent),var(--accent2),var(--warn),var(--accent));
  animation:spin 6s linear infinite;box-shadow:0 0 18px var(--accent)}
@keyframes spin{to{transform:rotate(360deg)}}
.top-right{display:flex;align-items:center;gap:8px}
.status{font-size:11px;color:var(--muted);border:1px solid var(--line);border-radius:999px;padding:5px 10px}
.status.on{color:var(--good);border-color:rgba(61,220,132,.4)}
.status.degraded{color:#ffce6b;border-color:rgba(255,206,107,.45)}
.gear{width:32px;height:32px;border-radius:50%;border:1px solid var(--line);background:var(--card);font-size:14px;line-height:1;transition:transform .3s}
.gear:hover{transform:rotate(90deg);border-color:var(--accent)}

/* ---------- voice panel ---------- */
.voice-panel{position:absolute;right:12px;top:64px;z-index:40;width:320px;max-width:calc(100vw - 24px);
  max-height:calc(100vh - 80px);overflow-y:auto;   /* Languages + Playback is a tall panel */
  background:rgba(16,17,32,.97);backdrop-filter:blur(14px);border:1px solid var(--line);border-radius:16px;
  padding:16px;display:flex;flex-direction:column;gap:12px;box-shadow:0 20px 60px rgba(0,0,0,.5);animation:rise .25s}
.vp-row{display:flex;align-items:center;justify-content:space-between;gap:10px}
.seg{display:flex;border:1px solid var(--line);border-radius:999px;overflow:hidden}
.seg button{border:0;background:transparent;color:var(--muted);padding:6px 12px;font-size:12px;font-weight:600}
.seg button.on{background:linear-gradient(120deg,var(--accent),var(--accent2));color:#fff}
.seg button:disabled{opacity:.4;cursor:not-allowed}
.vp-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--muted)}
.vp-field select{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:9px 10px;color:var(--ink)}
.vp-note{font-size:11px;line-height:1.5;color:var(--muted);margin:0}
.vp-note b{color:var(--ink)}
.vp-note code{font-size:10px;background:rgba(255,255,255,.07);padding:1px 4px;border-radius:4px}
.vp-check{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}
.vp-sep{border:0;border-top:1px solid var(--line);margin:2px 0}
.voice-panel strong{font-size:12px;text-transform:uppercase;letter-spacing:1px;color:var(--accent2)}
.warn-chip{font-size:12px;color:#ffce6b;background:rgba(255,206,107,.1);border:1px solid rgba(255,206,107,.35);
  border-radius:10px;padding:8px 10px;margin:0 0 12px}

/* server-TTS failure banner — the browser voice must never take over silently */
.tts-alert{display:flex;align-items:flex-start;gap:10px;margin:0 16px 4px;padding:9px 12px;
  font-size:12px;line-height:1.5;color:#ffce6b;background:rgba(255,206,107,.1);
  border:1px solid rgba(255,206,107,.35);border-radius:10px}
.tts-alert code{font-size:11px;background:rgba(255,255,255,.08);padding:1px 4px;border-radius:4px}
.tts-alert button{margin-left:auto;flex:none;border:0;background:transparent;color:inherit;
  font-size:13px;line-height:1;opacity:.7;padding:2px}
.tts-alert button:hover{opacity:1}

/* ---------- tabs ---------- */
.tabs{position:relative;display:flex;gap:4px;padding:4px;margin:6px 16px 0;
  background:var(--card);border:1px solid var(--line);border-radius:999px;width:max-content;max-width:calc(100% - 32px);overflow:auto}
.tabs button{border:0;background:transparent;color:var(--muted);padding:9px 16px;border-radius:999px;
  font-size:13px;font-weight:600;transition:color .2s;white-space:nowrap;z-index:1}
.tabs button.active{color:#fff}
.tab-ink{position:absolute;top:4px;height:calc(100% - 8px);border-radius:999px;
  background:linear-gradient(120deg,var(--accent),var(--accent2));z-index:0;
  transition:transform .35s cubic-bezier(.5,1.6,.4,1),width .35s cubic-bezier(.5,1.6,.4,1);box-shadow:0 4px 20px rgba(124,108,255,.5)}

/* ---------- panels ---------- */
main{max-width:760px;margin:0 auto;padding:18px 16px 60px}
.panel{display:none;animation:rise .45s cubic-bezier(.2,.9,.2,1)}
.panel.active{display:block}
@keyframes rise{from{opacity:0;transform:translateY(18px)}}

/* ---------- stage / bubble ---------- */
.stage{position:relative;display:grid;place-items:center;height:300px;margin:4px 0 8px}
.stage-sm{height:240px}
#bubble,#bubbleA{width:300px;height:300px;filter:drop-shadow(0 10px 40px rgba(124,108,255,.45))}
.stage-sm #bubbleA{width:230px;height:230px}
.stage-caption{position:absolute;bottom:2px;font-size:12px;color:var(--muted);letter-spacing:.3px}

/* ---------- chat ---------- */
.chat{display:flex;flex-direction:column;gap:10px;margin:8px 0}
.msg{max-width:82%;padding:11px 14px;border-radius:14px;font-size:14px;line-height:1.5;position:relative;animation:pop .35s cubic-bezier(.4,1.5,.5,1)}
@keyframes pop{from{opacity:0;transform:scale(.9) translateY(8px)}}
.msg.user{align-self:flex-end;background:linear-gradient(120deg,var(--accent),#5b8bff);color:#fff}
.msg.bot{align-self:flex-start;background:var(--card);border:1px solid var(--line)}
.msg .gloss{display:block;margin-top:6px;font-size:12px;color:var(--muted);border-top:1px dashed var(--line);padding-top:6px}
.msg b{font-weight:650;color:var(--ink)}
.msg code{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.92em;background:rgba(255,255,255,.07);border-radius:5px;padding:1px 5px}
/* translation — fetched with the reply, hidden until asked for */
.msg .tr-toggle{display:inline-block;margin-top:7px;font-size:11px;color:var(--muted);
  border:1px dashed var(--line);background:transparent;border-radius:8px;padding:2px 8px}
.msg .tr-toggle:hover,.msg .tr-toggle.open{color:var(--accent2);border-color:var(--accent2)}
.msg .tr{display:block;margin-top:6px;font-size:12.5px;color:var(--muted);
  border-top:1px dashed var(--line);padding-top:6px;line-height:1.55}
[dir=rtl]{direction:rtl;text-align:right;unicode-bidi:isolate}
.msg.notice{align-self:center;background:transparent;border:1px dashed var(--line);
  color:var(--muted);font-size:12px;text-align:center;max-width:92%}
.msg .m-actions{display:flex;gap:6px;margin-top:8px}
.msg .m-actions button{font-size:11px;border:1px solid var(--line);background:rgba(255,255,255,.04);border-radius:8px;padding:4px 9px}
.msg .m-actions button:hover{border-color:var(--accent)}
.msg.think{color:var(--muted)}
.msg.think::after{content:'▊';animation:blink 1s steps(2) infinite}
@keyframes blink{50%{opacity:0}}

/* ---------- composer ---------- */
.composer{position:sticky;bottom:10px;display:flex;align-items:center;gap:8px;margin-top:10px;
  background:rgba(14,15,28,.85);backdrop-filter:blur(10px);border:1px solid var(--line);border-radius:999px;padding:6px}
.composer input#converseInput{flex:1;border:0;background:transparent;color:var(--ink);padding:10px 6px;outline:none}
.gloss-toggle{font-size:11px;color:var(--muted);display:flex;align-items:center;gap:4px;white-space:nowrap}
.mic{width:40px;height:40px;border-radius:50%;border:1px solid var(--line);background:rgba(255,255,255,.05);display:grid;place-items:center}
.mic span{width:12px;height:12px;border-radius:3px;background:var(--muted);transition:.2s}
.mic.rec{border-color:var(--warn);background:rgba(255,93,126,.15)}
.mic.rec span{background:var(--warn);border-radius:50%;animation:pulse 1s infinite}
@keyframes pulse{50%{transform:scale(1.5);opacity:.6}}
.send{width:40px;height:40px;border-radius:50%;border:0;background:linear-gradient(120deg,var(--accent),var(--accent2));color:#fff;font-size:15px}
.send:hover{filter:brightness(1.1)}

/* ---------- rows / forms ---------- */
.row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:12px}
.row input,.row select,#accentCustom{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:10px 12px;color:var(--ink);outline:none}
.row input{flex:1;min-width:160px}
#accentCustom{width:100%;margin-bottom:12px}
.primary{border:0;border-radius:10px;padding:10px 18px;font-weight:700;color:#fff;background:linear-gradient(120deg,var(--accent),var(--accent2))}
.primary:hover{filter:brightness(1.1)}
.hint,.tagline{font-size:11px;color:var(--muted)}

/* ---------- practice cards ---------- */
.cards{display:grid;gap:12px;grid-template-columns:repeat(auto-fill,minmax(220px,1fr))}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:14px;animation:pop .4s cubic-bezier(.4,1.4,.5,1) backwards}
.card h3{margin:0 0 4px;font-size:16px}
.card .en{color:var(--muted);font-size:12px}
.card .ex{margin:8px 0;font-size:13px;line-height:1.5}
.card .cloze{font-size:12px;color:var(--accent2)}
/* example translation — rides in the /api/practice payload, revealed for free */
.card .tr-toggle{display:inline-block;margin-top:8px;font-size:11px;color:var(--muted);
  border:1px dashed var(--line);background:transparent;border-radius:8px;padding:2px 8px}
.card .tr-toggle:hover,.card .tr-toggle.open{color:var(--accent2);border-color:var(--accent2)}
.card .tr{display:block;margin-top:6px;font-size:12px;color:var(--muted);
  border-top:1px dashed var(--line);padding-top:6px;line-height:1.5}
.card .c-actions{display:flex;gap:6px;margin-top:8px}
.more-btn{display:block;margin:14px auto 0}

/* ---------- dictionary ---------- */
.dict-result{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:16px;animation:rise .4s}
.dict-result:empty{display:none}
.dict-head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.dict-head h2{margin:0;font-size:22px}
.badge{font-size:11px;text-transform:uppercase;letter-spacing:1px;padding:3px 8px;border-radius:999px;background:rgba(124,108,255,.2);color:#cbc4ff}
.dict-result ul{margin:10px 0;padding-left:18px;line-height:1.6}
.dict-result .ex-line{display:flex;align-items:center;gap:8px;margin:6px 0;font-size:13px}
.syn{display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.syn span{font-size:12px;border:1px solid var(--line);border-radius:999px;padding:3px 10px}

/* ---------- ghost / rec buttons ---------- */
.ghost{border:1px solid var(--line);background:rgba(255,255,255,.04);border-radius:10px;padding:9px 14px;font-size:13px}
.ghost:hover{border-color:var(--accent)}
.rec{border:1px solid var(--warn);background:rgba(255,93,126,.12);color:#ffbcc9;border-radius:10px;padding:9px 14px;font-size:13px}
.rec.on{animation:pulse 1s infinite}
.accent-actions{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:14px}

/* ---------- score ring ---------- */
.ring{position:absolute;width:150px;height:150px}
.stage-sm .ring{right:8px;top:8px;width:110px;height:110px}
.ring circle{fill:none;stroke-width:9;stroke-linecap:round;transform:rotate(-90deg);transform-origin:60px 60px}
.ring-bg{stroke:rgba(255,255,255,.08)}
.ring-fg{stroke:url(#g);stroke:var(--accent2);stroke-dasharray:327;stroke-dashoffset:327;transition:stroke-dashoffset 1s cubic-bezier(.3,1,.3,1)}
.ring text{fill:#fff;font-size:26px;font-weight:800;text-anchor:middle}

/* ---------- scored words ---------- */
.scored{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}
.scored span{padding:4px 9px;border-radius:8px;font-size:14px;border:1px solid var(--line)}
.scored span.hit{background:rgba(61,220,132,.16);border-color:rgba(61,220,132,.45);color:#c7f7db}
.scored span.miss{background:rgba(255,93,126,.14);border-color:rgba(255,93,126,.45);color:#ffc9d5}
.score-metrics{font-size:12px;color:var(--muted);min-height:17px}
.score-metrics b{color:var(--ink)}
.tip{font-size:13px;color:var(--accent2);min-height:18px;margin:6px 0 0}

/* ---------- history ---------- */
.hist-list{display:flex;flex-direction:column;gap:10px}
.hist{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:12px 14px;animation:pop .35s backwards}
.hist .h-top{display:flex;justify-content:space-between;gap:10px;font-size:12px;color:var(--muted)}
.hist .h-type{text-transform:uppercase;letter-spacing:1px;color:var(--accent2)}
.hist .h-title{font-size:14px;margin:4px 0}
.hist .h-actions{display:flex;gap:6px;align-items:center;margin-top:6px}
.hist audio{height:30px}
.hist .del{margin-left:auto;border:1px solid var(--line);background:transparent;border-radius:8px;padding:3px 8px;font-size:11px;color:var(--muted)}
.hist .del:hover{color:var(--warn);border-color:var(--warn)}

.empty{color:var(--muted);font-size:13px;text-align:center;padding:30px}

/* ---------- costs: actually spent ---------- */
.spend{display:flex;flex-direction:column;gap:10px;margin-bottom:6px}
.sp-head{background:linear-gradient(120deg,rgba(124,108,255,.18),rgba(37,217,200,.12));
  border:1px solid var(--line);border-radius:var(--radius);padding:16px 16px 14px;
  display:flex;flex-wrap:wrap;gap:14px;align-items:flex-end;justify-content:space-between}
.sp-big{display:flex;flex-direction:column;gap:2px}
.sp-big span{font-size:11px;text-transform:uppercase;letter-spacing:.7px;color:var(--muted)}
.sp-big b{font-size:30px;font-weight:800;letter-spacing:.5px;line-height:1}
.sp-chips{display:flex;flex-wrap:wrap;gap:8px}
.sp-chip{display:flex;flex-direction:column;gap:2px;font-size:14px;font-weight:700;
  border:1px solid var(--line);border-radius:10px;padding:6px 10px;background:rgba(0,0,0,.18)}
.sp-chip em{font-size:10px;font-style:normal;text-transform:uppercase;letter-spacing:.6px;
  font-weight:400;color:var(--muted)}
.sp-chip.sp-left{border-color:rgba(61,220,132,.4);color:#c7f7db}
.sp-head.sp-off{display:block;background:rgba(255,206,107,.08);border-color:rgba(255,206,107,.3)}
.sp-head.sp-off b{display:block;font-size:14px;color:#ffce6b;margin-bottom:4px}
.sp-head.sp-off span{font-size:12px;color:var(--muted)}
.sp-sub{font-size:12.5px;color:var(--muted)}
.sp-sub em{font-style:normal;opacity:.8}
.sp-tag{font-size:10px;font-style:normal;text-transform:uppercase;letter-spacing:.5px;
  color:var(--muted);border:1px solid var(--line);border-radius:5px;padding:0 4px;margin-left:4px}
.sp-days{display:flex;align-items:flex-end;gap:2px;height:52px;padding:6px 10px;
  background:var(--card);border:1px solid var(--line);border-radius:12px}
.sp-day{flex:1;min-width:2px;border-radius:2px 2px 0 0;
  background:linear-gradient(180deg,var(--accent2),var(--accent))}
.sp-day-0{background:rgba(255,255,255,.1)}   /* a day with no calls */
.sp-days-cap{font-size:11px;color:var(--muted);margin-top:-4px}
.sp-note{font-size:11.5px;color:var(--muted);line-height:1.55;margin:0}

/* ---------- costs ---------- */
.cost-lead{font-size:13px;line-height:1.6;color:var(--muted);margin:2px 0 18px}
.cost-lead b{color:var(--ink)}
.cost-h{font-size:13px;text-transform:uppercase;letter-spacing:1px;color:var(--accent2);margin:22px 0 10px}
.cost-src{text-transform:none;letter-spacing:0;color:var(--muted);font-size:11px;font-weight:400}
.cost-table{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.ct-row{display:grid;grid-template-columns:1.4fr 1fr 1.3fr;gap:10px;padding:9px 14px;font-size:12.5px;align-items:center;border-top:1px solid var(--line)}
.ct-row:first-child{border-top:0}
.ct-head{font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--muted);background:rgba(255,255,255,.03)}
.ct-model{color:var(--accent2);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;word-break:break-all}
.ct-free{color:var(--muted)}
.ct-num{font-weight:700;white-space:nowrap}
.ct-num em{font-weight:400;color:var(--muted);font-size:11px}
.ct-barwrap{height:7px;background:rgba(255,255,255,.06);border-radius:999px;overflow:hidden}
.ct-bar{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--accent2))}
.cost-config{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;margin-bottom:6px}
.cc-row{display:grid;grid-template-columns:1.2fr 1.3fr 1.1fr;gap:10px;padding:10px 14px;font-size:12.5px;align-items:center;border-top:1px solid var(--line)}
.cc-row:first-child{border-top:0}
.cc-role{color:var(--muted)}
.cc-val{color:var(--ink);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;word-break:break-all}
.cc-env{color:var(--accent2);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:10.5px;word-break:break-all}
.cost-rates{display:flex;flex-direction:column;gap:8px;margin-bottom:12px}
.cost-rates>div{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:10px 14px;font-size:12.5px}
.cost-rates b{display:block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11.5px;color:var(--ink);margin-bottom:2px;word-break:break-all}
.cost-rates span{color:var(--muted)}
.cost-sim{display:grid;grid-template-columns:repeat(auto-fill,minmax(210px,1fr));gap:10px;margin-bottom:16px}
.cost-sim label{display:flex;flex-direction:column;gap:5px;font-size:11.5px;color:var(--muted)}
.cost-sim input{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:9px 10px;color:var(--ink);outline:none}
.cost-sim input:focus{border-color:var(--accent)}
.cost-out{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);overflow:hidden}
.cost-total{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:16px 14px;background:linear-gradient(120deg,rgba(124,108,255,.16),rgba(37,217,200,.12))}
.cost-total span{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.6px}
.cost-total b{font-size:26px;font-weight:800;letter-spacing:.5px}
.cost-total-sub{text-transform:none!important;letter-spacing:0!important}
.cost-notes{margin:0;padding:10px 14px 12px 30px;font-size:11px;color:var(--muted);line-height:1.6}
.cost-assume{margin-top:14px;font-size:12px;color:var(--muted)}
.cost-assume summary{cursor:pointer;color:var(--accent2)}
.cost-assume>div{margin-top:8px;display:flex;flex-direction:column;gap:5px;line-height:1.5}
.cost-assume b{color:var(--ink)}

@media(max-width:480px){
  #bubble,#bubbleA{width:240px;height:240px}
  .stage{height:250px}
}
