/* 說法可信 — 法式編輯・夜藍酒紅紙色（PLANNING 第十五節定版，不得臨場新增顏色） */
:root{
  --nuit:#131E33; --nuit-2:#22355C; --creme:#F8F3E9; --card:#FFFEF9;
  --rouge:#BE2A30; --bordeaux:#8E2A46; --ink:#1E2430; --sub:#666C7A;
  --line:#E3D9C4; --or:#B08D3E; --rouge-soft:#F9E8E6; --nuit-soft:#E7EBF2; --or-soft:#F5ECD8;
  --bord-soft:rgba(142,42,70,.10);
  --sans:'Noto Sans TC','PingFang TC','Microsoft JhengHei',-apple-system,'Segoe UI',sans-serif;
  --serif:'Noto Serif TC','Songti TC',serif;
  --fr-serif:'Playfair Display',Georgia,'Times New Roman',serif;
  --radius:16px;
  --shadow:0 1px 3px rgba(19,30,51,.06),0 8px 24px rgba(19,30,51,.05);
}
*{box-sizing:border-box}
html{scrollbar-gutter:stable}
body{margin:0;font-family:var(--sans);background:var(--creme);color:var(--ink);line-height:1.75;font-size:16px;-webkit-font-smoothing:antialiased}
[lang="fr"]{font-family:var(--fr-serif);letter-spacing:.01em}
a{color:var(--nuit-2);text-decoration:none}
a:hover{text-decoration:underline}
.wrap{max-width:1120px;margin:0 auto;padding:0 20px}
h1,h2,h3{font-family:var(--serif);color:var(--nuit);line-height:1.4;margin:0 0 .5em}
h1{font-size:30px} h2{font-size:23px} h3{font-size:18px}
p{margin:0 0 1em}
small{color:var(--sub)}
.nb{white-space:nowrap}
.eyebrow{font-size:11px;letter-spacing:3px;color:var(--or);text-transform:uppercase;margin-bottom:6px}
main{display:block;padding:28px 0 90px}
section.blk{margin:0 0 44px}
/* ---- 頁首 ---- */
header.site{background:var(--nuit);color:#E9EDF5;position:sticky;top:0;z-index:50;border-bottom:2px solid var(--or)}
.hbar{display:flex;align-items:center;gap:18px;padding-top:10px;padding-bottom:10px}
.brand{display:flex;align-items:center;gap:10px;color:#fff;text-decoration:none}
.brand:hover{text-decoration:none}
.brand img{width:40px;height:40px;border-radius:10px}
.bname{display:flex;flex-direction:column;line-height:1.2}
.bname b{font-family:var(--serif);font-size:19px;letter-spacing:2px;color:#F8F3E9}
.bname small{font-size:8.5px;letter-spacing:2.5px;color:#B8C3D9}
nav.main{display:flex;gap:16px;margin-left:12px;flex-wrap:wrap}
nav.main a{color:#C9D3E6;font-size:14.5px;white-space:nowrap}
nav.main a:hover{color:#fff;text-decoration:none}
.hactions{margin-left:auto;display:flex;align-items:center;gap:12px}
.hactions a{color:#E9EDF5;font-size:14.5px;white-space:nowrap}
.nav-cta{background:var(--rouge);color:#fff!important;padding:7px 14px;border-radius:9px;font-weight:700}
.adm-entry{border:1px solid var(--or);color:var(--or-soft)!important;padding:4px 10px;border-radius:8px;font-size:13px}
.streak-chip{background:var(--nuit-2);border:1px solid #31456E;color:#E8C97A;padding:3px 10px;border-radius:99px;font-size:12.5px;white-space:nowrap}
/* ---- 頁尾 ---- */
footer.site{background:var(--nuit);color:#B8C3D9;padding:44px 0 110px;margin-top:20px;position:relative;overflow:hidden}
.weave-foot::before{content:"";position:absolute;inset:0;opacity:.045;background-image:linear-gradient(#F8F3E9 1px,transparent 1px),linear-gradient(90deg,#F8F3E9 1px,transparent 1px);background-size:26px 26px;pointer-events:none}
footer.site .wrap{position:relative}
.flogo{display:flex;align-items:center;gap:10px;margin-bottom:22px}
.flogo img{width:40px;height:40px;border-radius:10px}
.fnav{display:flex;gap:36px;flex-wrap:wrap;margin-bottom:24px}
.fcol h3{color:#F8F3E9;font-size:15px;margin-bottom:10px}
.fcol a{display:block;color:#B8C3D9;font-size:14px;margin-bottom:6px}
.fstate{font-size:12.5px;line-height:1.8;color:#7E8CAA;max-width:760px}
.ffr{font-size:13.5px;color:#93A5C4}
.ffr [lang="fr"]{color:#E8C97A}
.flogout{margin-top:10px}.flogout a{color:#7E8CAA;font-size:13px}
/* ---- 底部導覽 ---- */
.tabbar{display:none}
@media (max-width:860px){
  nav.main{display:none}
  .tabbar{display:flex;position:fixed;left:0;right:0;bottom:0;background:var(--card);border-top:1px solid var(--line);z-index:60;padding-bottom:env(safe-area-inset-bottom)}
  .tabbar .tab{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 0 6px;color:var(--sub);font-size:11px;text-decoration:none}
  .tabbar .tab svg{width:22px;height:22px}
  .tabbar .tab.on{color:var(--rouge)}
  main{padding-bottom:110px}
  .hactions .streak-chip{display:none}
}
/* ---- 按鈕與表單 ---- */
.btn{display:inline-block;border:1px solid var(--nuit);background:var(--nuit);color:#fff;padding:10px 22px;border-radius:11px;font-size:15px;font-weight:600;cursor:pointer;text-decoration:none;text-align:center}
.btn:hover{text-decoration:none;opacity:.92}
.btn.rouge{background:var(--rouge);border-color:var(--rouge)}
.btn.light{background:var(--card);color:var(--nuit);border-color:var(--line)}
.btn.bord{background:var(--bordeaux);border-color:var(--bordeaux)}
.btn.sm{padding:6px 14px;font-size:13.5px;border-radius:9px}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn.block{display:block;width:100%}
form.card,div.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:24px 26px;box-shadow:var(--shadow)}
label.fl{display:block;font-size:13.5px;font-weight:600;margin:14px 0 6px;color:var(--nuit)}
input[type=text],input[type=email],input[type=password],input[type=date],select,textarea{width:100%;padding:11px 13px;border:1px solid var(--line);border-radius:10px;font-size:16px;font-family:var(--sans);background:#fff;color:var(--ink)}
input:focus,select:focus,textarea:focus{outline:2px solid var(--or);outline-offset:0;border-color:var(--or)}
.msg{padding:12px 16px;border-radius:11px;font-size:14.5px;margin:0 0 16px}
.msg.ok{background:var(--or-soft);border:1px solid var(--or);color:#6B5312}
.msg.err{background:var(--rouge-soft);border:1px solid var(--rouge);color:#7E1B1F}
.note{font-size:13px;color:var(--sub);line-height:1.7}
.center-narrow{max-width:520px;margin:0 auto}
/* ---- 卡片與格線 ---- */
.grid{display:grid;gap:16px}
.grid.c2{grid-template-columns:repeat(2,1fr)} .grid.c3{grid-template-columns:repeat(3,1fr)} .grid.c4{grid-template-columns:repeat(4,1fr)}
@media (max-width:860px){.grid.c2,.grid.c3,.grid.c4{grid-template-columns:1fr}}
.pcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:20px 22px;box-shadow:var(--shadow);display:flex;flex-direction:column;gap:8px}
.pcard h3{margin:0}
.pcard .meta{font-size:12.5px;color:var(--sub);display:flex;gap:8px;flex-wrap:wrap}
.tag{display:inline-block;font-size:11.5px;padding:2px 9px;border-radius:99px;background:var(--nuit-soft);color:var(--nuit-2)}
.tag.lv{background:var(--or-soft);color:#6B5312}
.tag.warn{background:var(--rouge-soft);color:#7E1B1F}
.tag.bord{background:var(--bord-soft);color:var(--bordeaux)}
.pcard .go{margin-top:auto}
/* ---- 主視覺 ---- */
.hero{background:var(--nuit);color:#E9EDF5;border-radius:0 0 22px 22px;position:relative;overflow:hidden;margin:-28px 0 34px}
.hero::before{content:"";position:absolute;inset:0;opacity:.05;background-image:linear-gradient(#F8F3E9 1px,transparent 1px),linear-gradient(90deg,#F8F3E9 1px,transparent 1px);background-size:26px 26px}
.hero .wrap{position:relative;padding-top:40px;padding-bottom:40px}
.hero h1{color:#F8F3E9;font-size:34px}
.hero p{color:#C9D3E6;max-width:640px}
.hero .eyebrow{color:#E8C97A}
/* ---- 聲織標記 ---- */
.frline{font-size:21px;line-height:2.1;font-family:var(--fr-serif);color:var(--ink)}
.frline .tok{border-radius:4px;padding:0 1px}
.mk-silent{opacity:.32}
.mk-nasal{border-radius:3px;padding:0 1px}
.mk-nasal-an{background:rgba(176,141,62,.22);text-decoration:underline solid var(--or) 2px;text-underline-offset:4px}
.mk-nasal-in{background:rgba(142,42,70,.16);text-decoration:underline dashed var(--bordeaux) 2px;text-underline-offset:4px}
.mk-nasal-on{background:rgba(34,53,92,.16);text-decoration:underline dotted var(--nuit-2) 2px;text-underline-offset:4px}
.mk-nasal-un{background:rgba(190,42,48,.14);text-decoration:underline wavy var(--rouge) 1.5px;text-underline-offset:4px}
.mk-liaison{color:var(--rouge);font-weight:700;text-decoration:underline solid var(--rouge) 2px;text-underline-offset:5px}
.mk-elision{color:var(--bordeaux);font-weight:700}
.agree{border-bottom:2px solid transparent}
.agree-m{border-bottom-color:var(--nuit-2);background:var(--nuit-soft)}
.agree-f{border-bottom-color:var(--bordeaux);background:var(--bord-soft)}
.agree-src{font-weight:700}
button.tokbtn{background:none;border:none;font:inherit;cursor:pointer;padding:0}
.audio-btn{display:inline-flex;align-items:center;gap:6px;background:var(--nuit);color:#fff;border:none;border-radius:99px;padding:7px 15px;font-size:13.5px;cursor:pointer}
.audio-btn.slow{background:var(--card);color:var(--nuit);border:1px solid var(--line)}
.audio-btn.playing{background:var(--rouge)}
.marks-notes{background:var(--nuit-soft);border-radius:12px;padding:14px 18px;font-size:14px}
.marks-notes li{margin-bottom:5px}
/* ---- 性織對位卡 ---- */
.vcard{border-radius:var(--radius);padding:22px;border:1.5px solid var(--line);background:var(--card);box-shadow:var(--shadow)}
.vcard.gm{border-top:5px solid var(--nuit-2)}
.vcard.gf{border-top:5px solid var(--bordeaux)}
.vcard .pair{font-size:27px;font-family:var(--fr-serif)}
.vcard .pair .art{font-weight:700}
.gm .art,.gm-txt{color:var(--nuit-2)} .gf .art,.gf-txt{color:var(--bordeaux)}
.exc-badge{background:var(--rouge);color:#fff;font-size:11px;padding:2px 8px;border-radius:99px}
.ffcard{border:1.5px solid var(--rouge);background:#FFF9F6;border-radius:var(--radius);padding:22px}
.ff-lv1{border-color:var(--rouge)} .ff-lv2{border-color:var(--or)} .ff-lv3{border-color:var(--line)}
/* ---- 變位織機 ---- */
.loom{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:22px;box-shadow:var(--shadow)}
.loom-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:14px}
@media (max-width:640px){.loom-grid{grid-template-columns:repeat(2,1fr)}}
.loom-cell{border:1px solid var(--line);border-radius:11px;padding:10px 12px;background:var(--creme)}
.loom-cell .who{font-size:12px;color:var(--sub)}
.loom-cell .form{font-size:19px;font-family:var(--fr-serif)}
.loom-cell .form .stem{color:var(--nuit-2);font-weight:700}
.loom-cell .form .end{color:var(--rouge);font-weight:700}
.stemline{font-size:22px;font-family:var(--fr-serif)}
.stemline .stem{color:var(--nuit-2);font-weight:700;border-bottom:3px solid var(--nuit-2)}
select.loom-sel{width:auto;display:inline-block}
/* ---- 時態羅盤 ---- */
.compass{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media (max-width:640px){.compass{grid-template-columns:1fr}}
.fond-box{background:var(--nuit-soft);border-radius:var(--radius);padding:20px;border:1.5px dashed var(--nuit-2)}
.point-box{background:var(--or-soft);border-radius:var(--radius);padding:20px;border:1.5px solid var(--or)}
.knot{display:inline-block;width:13px;height:13px;border-radius:50%;background:var(--or);border:2px solid #8A6D2A;vertical-align:middle;margin-right:6px}
/* ---- 診斷條 ---- */
.skillbar{margin-bottom:16px}
.skillbar .lab{display:flex;justify-content:space-between;font-size:14px;margin-bottom:5px}
.bar{height:10px;background:var(--nuit-soft);border-radius:99px;overflow:hidden}
.bar i{display:block;height:100%;background:linear-gradient(90deg,var(--nuit-2),var(--or));border-radius:99px}
.bar.danger i{background:linear-gradient(90deg,var(--rouge),var(--bordeaux))}
/* ---- 數字結 ---- */
.knot-parts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-family:var(--fr-serif);font-size:21px}
.knot-part{background:var(--card);border:1.5px solid var(--nuit-2);border-radius:11px;padding:7px 14px}
.knot-op{color:var(--rouge);font-weight:700;font-size:19px}
/* ---- 步驟 ---- */
.steps{display:flex;gap:6px;margin-bottom:20px;flex-wrap:wrap}
.step-chip{padding:5px 13px;border-radius:99px;border:1px solid var(--line);background:var(--card);font-size:13px;color:var(--sub)}
.step-chip.on{background:var(--nuit);color:#fff;border-color:var(--nuit)}
.step-chip.done{background:var(--or-soft);color:#6B5312;border-color:var(--or)}
.rec-btn{background:var(--rouge);color:#fff;border:none;border-radius:99px;padding:11px 24px;font-size:15px;font-weight:700;cursor:pointer}
.rec-btn.recording{background:#7E1B1F;animation:pulse 1.2s infinite}
@keyframes pulse{50%{opacity:.65}}
.opt-btn{display:block;width:100%;text-align:left;background:var(--card);border:1.5px solid var(--line);border-radius:11px;padding:12px 16px;font-size:16px;margin-bottom:9px;cursor:pointer;font-family:var(--sans)}
.opt-btn:hover{border-color:var(--nuit-2)}
.opt-btn.right{border-color:var(--or);background:var(--or-soft)}
.opt-btn.wrong{border-color:var(--rouge);background:var(--rouge-soft)}
.opt-btn:disabled{cursor:default;opacity:.85}
/* ---- 表格 ---- */
.tbl-scroll{overflow-x:auto}
table.tbl{border-collapse:collapse;width:max-content;min-width:100%;background:var(--card)}
table.tbl th,table.tbl td{border:1px solid var(--line);padding:8px 12px;font-size:14px;text-align:left;white-space:nowrap}
table.tbl th{background:var(--nuit-soft);color:var(--nuit)}
/* ---- 後台 ---- */
.admin-body{background:#EFEAE0}
.adm-nav{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:18px}
.adm-nav a{background:var(--card);border:1px solid var(--line);padding:6px 13px;border-radius:9px;font-size:13.5px;color:var(--nuit)}
.adm-nav a.on{background:var(--nuit);color:#fff}
.stat-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
@media (max-width:860px){.stat-grid{grid-template-columns:repeat(2,1fr)}}
.stat{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:16px 18px}
.stat .num{font-size:27px;font-weight:700;color:var(--nuit);font-variant-numeric:tabular-nums}
.progress-line{height:9px;background:var(--nuit-soft);border-radius:99px;overflow:hidden;margin-top:7px}
.progress-line i{display:block;height:100%;background:var(--or)}
/* ---- 其他 ---- */
.seal{display:inline-flex;align-items:center;justify-content:center;width:54px;height:54px;border:2.5px solid var(--or);color:#8A6D2A;border-radius:10px;font-family:var(--serif);font-weight:700;font-size:19px;transform:rotate(-6deg);background:var(--or-soft)}
.divider{border:none;border-top:1px solid var(--line);margin:26px 0}
.two-col{display:grid;grid-template-columns:1fr 1fr;gap:22px}
@media (max-width:860px){.two-col{grid-template-columns:1fr}}
.quiz-q{font-size:18px;margin-bottom:14px}
.dict-input{font-family:var(--fr-serif);font-size:19px}
.flashcard{cursor:pointer;user-select:none}
.hidden{display:none!important}
.mt{margin-top:18px}.mb{margin-bottom:18px}
.chiprow{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:16px}
.chip{padding:6px 14px;border-radius:99px;border:1px solid var(--line);background:var(--card);font-size:13.5px;cursor:pointer;color:var(--ink)}
.chip.on{background:var(--nuit);color:#fff;border-color:var(--nuit)}
