/* ---------------------------------------------------------------- tokens */
:root{
  --bg:#f4f6fb;
  --card:#ffffff;
  --card-2:#fbfcfe;
  --text:#1b1f27;
  --text-2:#5b6472;
  --text-3:#8a93a1;
  --line:#e3e7ef;
  --line-2:#eef1f6;
  --accent:#2f6fed;
  --accent-weak:#e8efff;
  --accent-text:#1b4fc4;
  --ok:#1a9e5f;
  --shadow:0 1px 2px rgba(16,24,40,.06), 0 8px 24px rgba(16,24,40,.06);
  --radius:14px;
}
:root[data-theme="dark"],
:root:not([data-theme="light"]){ }
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --bg:#0f1319;
    --card:#171c24;
    --card-2:#1c222b;
    --text:#e8ecf3;
    --text-2:#a7b0be;
    --text-3:#798394;
    --line:#2a313c;
    --line-2:#232935;
    --accent:#6c9bff;
    --accent-weak:#1d2740;
    --accent-text:#a9c4ff;
    --ok:#48c98a;
    --shadow:0 1px 2px rgba(0,0,0,.4), 0 10px 30px rgba(0,0,0,.35);
  }
}
:root[data-theme="dark"]{
  --bg:#0f1319;
  --card:#171c24;
  --card-2:#1c222b;
  --text:#e8ecf3;
  --text-2:#a7b0be;
  --text-3:#798394;
  --line:#2a313c;
  --line-2:#232935;
  --accent:#6c9bff;
  --accent-weak:#1d2740;
  --accent-text:#a9c4ff;
  --ok:#48c98a;
  --shadow:0 1px 2px rgba(0,0,0,.4), 0 10px 30px rgba(0,0,0,.35);
}

*{box-sizing:border-box}

/* hidden 屬性要贏過元素自己的 display。
   瀏覽器內建的 [hidden]{display:none} 特異性只有 0-1-0，
   .spinner{display:flex}、.clear-btn{display:grid} 這種類別選擇器會蓋掉它，
   結果 JS 設了 hidden 也藏不起來（轉圈動畫會一直轉）。 */
[hidden]{display:none !important}
html,body{margin:0;padding:0}
body{
  background:var(--bg);
  color:var(--text);
  font:16px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
       "Noto Sans TC", "PingFang TC", "Microsoft JhengHei", "Helvetica Neue", Arial, sans-serif;
  -webkit-text-size-adjust:100%;
}
.wrap{max-width:1120px;margin:0 auto;padding:0 16px}
.grow{flex:1}
.card{
  background:var(--card);
  border:1px solid var(--line);
  border-radius:var(--radius);
  box-shadow:var(--shadow);
}

/* ---------------------------------------------------------------- topbar */
.topbar{
  position:sticky;top:0;z-index:20;
  background:color-mix(in srgb, var(--bg) 88%, transparent);
  backdrop-filter:saturate(1.4) blur(10px);
  border-bottom:1px solid var(--line);
}
.topbar .wrap{display:flex;align-items:center;gap:12px;height:60px}
.brand{display:flex;align-items:baseline;gap:8px;text-decoration:none;color:inherit}
.brand-mark{
  display:inline-grid;place-items:center;
  width:30px;height:30px;border-radius:9px;
  background:var(--accent);color:#fff;font-weight:700;font-size:16px;
  transform:translateY(4px);
}
.brand-name{font-size:19px;font-weight:700;letter-spacing:.5px}
.brand-sub{font-size:12px;color:var(--text-3)}
@media(max-width:560px){.brand-sub{display:none}}
/* topbar 上的文字連結（翻譯頁 ↔ 教學頁） */
.nav-link{
  font-size:14px;color:var(--accent-text);background:var(--accent-weak);
  border-radius:99px;padding:6px 12px;text-decoration:none;white-space:nowrap;
}
.nav-link:hover{filter:brightness(1.06)}

.icon-btn{
  display:inline-grid;place-items:center;
  width:38px;height:38px;border-radius:10px;
  border:1px solid transparent;background:transparent;color:var(--text-2);
  cursor:pointer;transition:.15s background,.15s color;
}
.icon-btn:hover{background:var(--line-2);color:var(--text)}
.icon-btn:active{transform:scale(.95)}
.icon-btn.is-playing{color:var(--accent);background:var(--accent-weak)}

/* ---------------------------------------------------------------- langbar */
main.wrap{padding-top:18px;padding-bottom:48px}
.langbar{
  display:flex;align-items:center;gap:8px;
  padding:8px;margin-bottom:12px;
}
.lang-side{flex:1;display:flex;align-items:center;gap:8px;min-width:0}
.lang-select{
  flex:0 1 auto;max-width:100%;
  appearance:none;
  background:transparent;border:0;color:var(--text);
  font:inherit;font-weight:600;font-size:15px;
  padding:9px 30px 9px 12px;border-radius:10px;cursor:pointer;
  background-image:linear-gradient(45deg,transparent 50%,var(--text-3) 50%),
                   linear-gradient(135deg,var(--text-3) 50%,transparent 50%);
  background-position:calc(100% - 16px) 20px, calc(100% - 11px) 20px;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat;
}
.lang-select:hover{background-color:var(--line-2)}
.lang-select option{background:var(--card);color:var(--text)}
.lang-side:last-child{justify-content:flex-start}
.detected{font-size:12px;color:var(--text-3);white-space:nowrap}
.swap-btn{
  flex:0 0 auto;
  width:40px;height:40px;border-radius:50%;
  border:1px solid var(--line);background:var(--card-2);color:var(--text-2);
  cursor:pointer;display:grid;place-items:center;transition:.2s transform,.15s background;
}
.swap-btn:hover{background:var(--accent-weak);color:var(--accent-text)}
.swap-btn:active{transform:rotate(180deg)}

/* ---------------------------------------------------------------- toolbar */
.toolbar{
  display:flex;flex-wrap:wrap;align-items:center;gap:10px 18px;
  padding:10px 14px;margin-bottom:12px;
}
.tool-group{display:flex;align-items:center;gap:8px;min-width:0}
.tool-label{font-size:13px;color:var(--text-3);white-space:nowrap}
.seg{display:inline-flex;background:var(--line-2);border-radius:99px;padding:3px;gap:2px}
.seg-btn{
  border:0;background:transparent;color:var(--text-2);
  font:inherit;font-size:13px;line-height:1;
  padding:7px 12px;border-radius:99px;cursor:pointer;white-space:nowrap;
  transition:.15s;
}
.seg-btn:hover{color:var(--text)}
.seg-btn.is-on{background:var(--card);color:var(--accent-text);box-shadow:0 1px 2px rgba(16,24,40,.12);font-weight:600}
.switch{
  display:flex;align-items:center;gap:7px;font-size:13px;color:var(--text-2);
  cursor:pointer;user-select:none;white-space:nowrap;    /* 手機上「即時翻譯」不要被折成兩行 */
}
.switch input{accent-color:var(--accent);width:16px;height:16px;cursor:pointer}
.voice-select{
  max-width:220px;
  background:var(--card-2);border:1px solid var(--line);color:var(--text-2);
  font:inherit;font-size:12.5px;padding:6px 10px;border-radius:9px;cursor:pointer;
}
@media(max-width:720px){.voice-select{max-width:150px}}

/* ---------------------------------------------------------------- panes */
.panes{display:grid;grid-template-columns:1fr 1fr;overflow:hidden}
.pane{display:flex;flex-direction:column;min-width:0}
.pane + .pane{border-left:1px solid var(--line)}
@media(max-width:820px){
  .panes{grid-template-columns:1fr}
  .pane + .pane{border-left:0;border-top:1px solid var(--line)}
}
.pane-out{background:var(--card-2)}
.pane-body{position:relative;flex:1;min-height:190px;display:flex}
.src-input{
  flex:1;width:100%;resize:none;border:0;outline:0;background:transparent;
  color:var(--text);font:inherit;font-size:20px;line-height:1.7;
  padding:20px 44px 12px 20px;min-height:190px;
}
.src-input::placeholder{color:var(--text-3)}
.out-text{
  flex:1;padding:20px;font-size:20px;line-height:1.7;
  white-space:pre-wrap;word-break:break-word;min-height:190px;
}
.out-text.is-streaming::after{
  content:"";display:inline-block;width:2px;height:1.05em;
  background:var(--accent);vertical-align:-.16em;margin-left:2px;
  animation:blink 1s steps(2,start) infinite;
}
@keyframes blink{to{visibility:hidden}}
.placeholder{
  position:absolute;inset:20px auto auto 20px;
  color:var(--text-3);font-size:20px;pointer-events:none;
}
.clear-btn{
  position:absolute;top:12px;right:12px;
  width:30px;height:30px;border-radius:50%;border:0;
  background:transparent;color:var(--text-3);cursor:pointer;display:grid;place-items:center;
}
.clear-btn:hover{background:var(--line-2);color:var(--text)}
.pane-foot{
  display:flex;align-items:center;gap:6px;
  padding:8px 12px;border-top:1px solid var(--line-2);min-height:52px;
}
.counter{font-size:12.5px;color:var(--text-3);padding-right:6px}
.text-btn{
  border:0;background:var(--accent);color:#fff;
  font:inherit;font-size:14px;font-weight:600;
  padding:9px 20px;border-radius:99px;cursor:pointer;transition:.15s filter;
}
.text-btn:hover{filter:brightness(1.08)}
.text-btn:disabled{opacity:.5;cursor:default}

.spinner{position:absolute;left:20px;top:24px;display:flex;gap:5px}
.spinner i{width:8px;height:8px;border-radius:50%;background:var(--accent);opacity:.35;animation:bounce 1.1s infinite}
.spinner i:nth-child(2){animation-delay:.15s}
.spinner i:nth-child(3){animation-delay:.3s}
@keyframes bounce{0%,60%,100%{transform:translateY(0);opacity:.35}30%{transform:translateY(-6px);opacity:1}}

/* ---------------------------------------------------------------- 音標 */
.phonetic{border-top:1px solid var(--line-2);background:color-mix(in srgb, var(--accent-weak) 45%, transparent)}
.phonetic-head{display:flex;align-items:baseline;gap:8px;padding:8px 20px 2px}
.ph-title{font-size:12px;font-weight:700;color:var(--accent-text);letter-spacing:.5px}
.ph-hint{font-size:11.5px;color:var(--text-3)}
@media(max-width:560px){.ph-hint{display:none}}
.phonetic-body{
  position:relative;   /* 讓 chip 的 offsetParent 就是這個捲動容器 */
  display:flex;flex-wrap:wrap;gap:4px 6px;
  padding:6px 16px 14px;max-height:190px;overflow:auto;
  scroll-behavior:auto;
}
.tok{
  display:inline-flex;flex-direction:column;align-items:center;gap:1px;
  padding:3px 7px;border-radius:8px;cursor:pointer;border:0;background:transparent;
  font:inherit;color:inherit;transition:.12s background;
}
.tok:hover{background:var(--card)}
.tok .w{font-size:14px;line-height:1.25;color:var(--text-2)}
.tok .p{
  font-size:14.5px;line-height:1.25;color:var(--accent-text);white-space:nowrap;
  font-family:"Charis SIL","Doulos SIL","Gentium Plus","Lucida Sans Unicode","Segoe UI",
              "Noto Sans","DejaVu Sans",sans-serif;
}
.tok.miss .p{color:var(--text-3)}
.tok.guess .p{border-bottom:1px dotted var(--text-3)}
.tok.sep{padding:3px 1px;cursor:default}
.tok.sep:hover{background:transparent}

/* ---------------------------------------------------------------- 單字卡 */
.dict{margin-top:12px;padding:16px 20px 18px;position:relative}
.dict-close{
  position:absolute;top:10px;right:12px;border:0;background:transparent;
  color:var(--text-3);font-size:22px;line-height:1;cursor:pointer;padding:4px 8px;border-radius:8px;
}
.dict-close:hover{background:var(--line-2);color:var(--text)}
.dict-head{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding-right:32px}
.dict-head h2{margin:0;font-size:24px}
.dict-kk{
  font-size:17px;color:var(--accent-text);
  font-family:"Charis SIL","Doulos SIL","Gentium Plus","Lucida Sans Unicode","Segoe UI","Noto Sans",sans-serif;
}
.dict-body{margin-top:10px}
.sense{display:flex;gap:10px;padding:7px 0;border-top:1px solid var(--line-2)}
.pos{
  flex:0 0 auto;min-width:42px;text-align:center;
  font-size:12.5px;font-weight:700;color:var(--accent-text);
  background:var(--accent-weak);border-radius:6px;padding:3px 6px;height:fit-content;
}
.sense-main{min-width:0}
.sense-zh{font-size:16.5px}
.sense-def{font-size:13px;color:var(--text-3);margin-top:2px}
.examples{margin-top:10px;border-top:1px solid var(--line-2);padding-top:8px}
.ex{margin:6px 0}
.ex-en{font-size:15px}
.ex-zh{font-size:13.5px;color:var(--text-2)}
.dict-loading{color:var(--text-3);font-size:14px;padding:8px 0}

.foot-note{
  margin:18px 4px 0;font-size:12.5px;line-height:1.9;color:var(--text-3);
}
.foot-note b{color:var(--text-2);font-weight:600}
.foot-note a{color:var(--accent-text)}

/* ---------------------------------------------------------------- 預選字 */
/* 跟著游標跑，所以是 position:fixed 掛在 body 上（放在 .panes 裡會被
   它的 overflow:hidden 切掉），座標由 suggest.js 每次算好再寫進來。 */
.ac-pop{
  position:fixed;z-index:60;min-width:240px;max-width:min(420px,92vw);
  background:var(--card);border:1px solid var(--line);border-radius:12px;
  box-shadow:var(--shadow);padding:4px;
  max-height:min(60vh,340px);overflow-y:auto;overscroll-behavior:contain;
}
.ac-item{
  display:flex;align-items:baseline;gap:8px;
  padding:7px 10px;border-radius:8px;cursor:pointer;
}
.ac-item.is-on{background:var(--accent-weak)}
.ac-item:hover{background:var(--line-2)}
.ac-item.is-on:hover{background:var(--accent-weak)}
.ac-w{font-size:15px;color:var(--text);white-space:nowrap}
.ac-w b{font-weight:700;color:var(--accent-text)}
.ac-kk{
  font-size:12.5px;color:var(--text-3);white-space:nowrap;
  font-family:"Charis SIL","Doulos SIL","Gentium Plus","Lucida Sans Unicode","Segoe UI","Noto Sans",sans-serif;
}
.ac-zh{
  font-size:12.5px;color:var(--text-2);margin-left:auto;padding-left:8px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.ac-tip{
  font-size:11.5px;color:var(--text-3);
  padding:5px 10px 3px;border-top:1px solid var(--line-2);margin-top:3px;
}
@media(max-width:560px){
  .ac-pop{max-width:94vw}
  .ac-item{padding:9px 10px}
  .ac-zh{font-size:12px}
  .ac-tip{display:none}          /* 手機上沒有這些鍵，直接點就好 */
}

/* ---------------------------------------------------------------- toast */
.toast{
  position:fixed;left:50%;bottom:28px;transform:translate(-50%,20px);
  background:#20242c;color:#fff;font-size:14px;
  padding:10px 18px;border-radius:99px;box-shadow:0 8px 30px rgba(0,0,0,.25);
  opacity:0;pointer-events:none;transition:.22s;z-index:50;max-width:88vw;text-align:center;
}
.toast.show{opacity:1;transform:translate(-50%,0)}

/* ---------------------------------------------------------------- 手機 */
@media(max-width:560px){
  .toolbar{gap:8px 14px;padding:10px 12px}
  .tool-label{font-size:12px}
  .seg-btn{padding:6px 10px;font-size:12.5px}
  .voice-select{max-width:none;width:100%}
  .tool-group:last-child{width:100%}

  .src-input{font-size:18px;padding:16px 40px 10px 16px;min-height:150px}
  .out-text{font-size:18px;padding:16px;min-height:150px}
  .pane-body{min-height:150px}
  .placeholder{font-size:18px;inset:16px auto auto 16px}
  .spinner{left:16px;top:20px}

  .phonetic-head{padding:8px 16px 2px}
  .phonetic-body{padding:6px 12px 12px;max-height:150px}
  .tok .w{font-size:13px}
  .tok .p{font-size:13.5px}

  .dict{padding:14px 16px 16px}
  .dict-head h2{font-size:21px}
  main.wrap{padding-bottom:32px}
}

/* 整句朗讀時，標出現在唸到哪個字 */
.tok.is-speaking{background:var(--accent)}
.tok.is-speaking .w{color:#fff}
.tok.is-speaking .p{color:#fff}
.tok.is-speaking.guess .p{border-bottom-color:rgba(255,255,255,.6)}

/* 語音輸入 */
.mic-btn.is-recording{color:#e5484d;background:rgba(229,72,77,.12);position:relative}
.mic-btn.is-recording::after{
  content:"";position:absolute;inset:0;border-radius:10px;
  border:2px solid #e5484d;animation:micpulse 1.4s ease-out infinite;
}
@keyframes micpulse{
  0%{transform:scale(1);opacity:.9}
  100%{transform:scale(1.35);opacity:0}
}
.mic-hint{
  font-size:12.5px;color:#e5484d;white-space:nowrap;
  animation:michint 1.4s ease-in-out infinite;
}
@keyframes michint{50%{opacity:.45}}
@media(prefers-reduced-motion:reduce){
  .mic-btn.is-recording::after,.mic-hint{animation:none}
}
