/* =====================================================================
   金华山 GEO · AI 引用采集系统  共用样式
   浅色主题 · 移动优先（学生大多用手机）
   ===================================================================== */
:root{
  --bg:#F4F6F9; --card:#FFFFFF; --ink:#0F172A; --ink2:#475569; --ink3:#94A3B8;
  --line:#E4E9F0; --line2:#CBD5E1;
  --brand:#123C6E; --brand2:#1D5FA8; --accent:#0E7C6B;
  --warn:#B45309; --warnbg:#FFFBEB; --danger:#B42318; --dangerbg:#FEF2F2;
  --ok:#047857; --okbg:#ECFDF5;
  --r:12px; --sh:0 1px 2px rgba(16,24,40,.05), 0 1px 3px rgba(16,24,40,.06);
}
*{box-sizing:border-box}
html,body{margin:0;padding:0}
body{background:var(--bg); color:var(--ink);
  font-family:"PingFang SC","Microsoft YaHei","Hiragino Sans GB",-apple-system,"Segoe UI",sans-serif;
  font-size:14px; line-height:1.65; -webkit-font-smoothing:antialiased}
a{color:var(--brand2)}
h1,h2,h3,h4{margin:0; font-weight:600}
code{font-family:ui-monospace,Menlo,Consolas,monospace}

/* ---------- 布局 ---------- */
.top{background:linear-gradient(180deg,#123C6E 0%,#164A85 100%); color:#fff; padding:18px 0 20px}
.wrap{max-width:960px; margin:0 auto; padding:0 16px}
.wrap-wide{max-width:1200px}
.top h1{font-size:19px; letter-spacing:.3px}
.top .sub{font-size:12.5px; color:#B9CDE6; margin-top:4px}
.topnav{margin-top:10px; display:flex; gap:8px; flex-wrap:wrap}
.topnav a{color:#DCE9F8; text-decoration:none; font-size:12.5px; border:1px solid rgba(255,255,255,.28);
  padding:4px 11px; border-radius:999px}
.topnav a:hover{background:rgba(255,255,255,.12)}
.topnav a.on{background:#fff; color:var(--brand); border-color:#fff; font-weight:600}
main{padding:18px 0 90px}

/* ---------- 卡片 ---------- */
.card{background:var(--card); border:1px solid var(--line); border-radius:var(--r); box-shadow:var(--sh); margin-bottom:14px}
.pad{padding:16px 18px}
h2.sec{font-size:15px; margin-bottom:4px}
p.hint{font-size:12.5px; color:var(--ink2); margin:0 0 12px}
.muted{color:var(--ink3)}
.small{font-size:12px}

/* ---------- 表单 ---------- */
label.f{display:block; font-size:12.5px; color:var(--ink2); margin-bottom:6px; font-weight:600}
input[type=text],input[type=password],textarea,select{
  font:inherit; color:var(--ink); background:#fff; border:1px solid var(--line2);
  border-radius:9px; padding:9px 12px; width:100%; outline:none}
input:focus,textarea:focus,select:focus{border-color:var(--brand2); box-shadow:0 0 0 3px rgba(29,95,168,.12)}
textarea{resize:vertical; min-height:110px; line-height:1.7; font-size:13px}
input.err{border-color:#FCA5A5; background:#FFF7F7}
input.ok{border-color:#86EFAC; background:#F7FEFB}

/* ---------- 按钮 ---------- */
.btn{appearance:none; font:inherit; font-size:13.5px; cursor:pointer; border-radius:9px;
  padding:8px 16px; border:1px solid var(--line2); background:#fff; color:var(--ink);
  transition:background .12s,border-color .12s; white-space:nowrap}
.btn:hover{border-color:#94A3B8; background:#F8FAFC}
.btn:disabled{opacity:.5; cursor:not-allowed}
.btn.primary{background:var(--brand2); border-color:var(--brand2); color:#fff; font-weight:600}
.btn.primary:hover{background:#1A5391}
.btn.sm{font-size:12.5px; padding:5px 11px; border-radius:8px}
.btn.tiny{font-size:11.5px; padding:3px 9px; border-radius:7px}
.btn.ghost{background:transparent; border-color:var(--line2)}
.btn.danger{color:var(--danger); border-color:#FECACA}
.btn.danger:hover{background:var(--dangerbg)}
.row{display:flex; gap:8px; flex-wrap:wrap; align-items:center}
.spacer{flex:1}

/* ---------- 标签 ---------- */
.tag{display:inline-block; font-size:11.5px; padding:1px 7px; border-radius:999px;
  border:1px solid var(--line2); background:#F8FAFC; color:var(--ink2); white-space:nowrap}
.tag.ok{background:var(--okbg); border-color:#A7F3D0; color:var(--ok)}
.tag.warn{background:var(--warnbg); border-color:#FDE68A; color:var(--warn)}
.tag.err{background:var(--dangerbg); border-color:#FECACA; color:var(--danger)}
.tag.brand{background:#EFF6FF; border-color:#BFDBFE; color:var(--brand2)}
.tag.lv{font-family:ui-monospace,monospace; font-weight:600}

/* ---------- 消息条 ---------- */
.msg{border-radius:9px; padding:11px 14px; font-size:13px; margin-top:12px; display:none; white-space:pre-wrap}
.msg.ok{background:var(--okbg); border:1px solid #A7F3D0; color:#065F46; display:block}
.msg.err{background:var(--dangerbg); border:1px solid #FECACA; color:#991B1B; display:block}
.msg.wait{background:#EFF6FF; border:1px solid #BFDBFE; color:#1E40AF; display:block}
.msg.warn{background:var(--warnbg); border:1px solid #FDE68A; color:#92400E; display:block}

/* ---------- 表格 ---------- */
table.t{width:100%; border-collapse:collapse; font-size:12.5px}
table.t th,table.t td{border-bottom:1px solid var(--line); padding:7px 8px; text-align:left; vertical-align:top}
table.t th{background:#F8FAFC; color:var(--ink2); font-weight:600; white-space:nowrap; position:sticky; top:0; z-index:2}
table.t tr:hover td{background:#FBFDFF}
table.t td.num,table.t th.num{text-align:right; font-variant-numeric:tabular-nums}

/* ---------- 进度 ---------- */
.bar{height:8px; background:#E2E8F0; border-radius:999px; overflow:hidden}
.bar > i{display:block; height:100%; background:linear-gradient(90deg,#1D5FA8,#0E7C6B); width:0; transition:width .25s}
/* 不确定态进度条（2026-10-02）：用于"服务端在算、前端拿不到真实百分比"的阶段，
   例如生成报告（一次同步请求）。流动条纹诚实表示「在动」，不假装一个百分比。 */
.bar > i.indet{width:100% !important; transition:none;
  background:repeating-linear-gradient(115deg,#1D5FA8 0 14px,#0E7C6B 14px 28px);
  background-size:56px 100%; animation:barflow 1s linear infinite}
@keyframes barflow{from{background-position:0 0}to{background-position:56px 0}}

/* ---------- 题目卡（学生端） ---------- */
.qcard{background:#fff; border:1px solid var(--line); border-radius:var(--r); box-shadow:var(--sh); margin-bottom:14px; overflow:hidden}
.qcard.done{border-color:#A7F3D0; box-shadow:0 0 0 3px rgba(4,120,87,.07)}
.qhead{display:flex; gap:10px; align-items:flex-start; padding:14px 16px; border-bottom:1px solid var(--line); background:#FCFDFF}
.qhead .idx{flex:0 0 auto; width:30px; height:30px; border-radius:8px; background:#EFF6FF; color:var(--brand2);
  display:flex; align-items:center; justify-content:center; font-weight:700; font-size:13px}
.qhead .qtext{flex:1; min-width:0}
.qhead .qmain{font-size:15px; font-weight:600; line-height:1.5; word-break:break-word}
.qhead .qvar{font-size:12.5px; color:var(--ink2); margin-top:5px}
.qhead .qvar b{color:var(--ink3); font-weight:600}
.qmeta{display:flex; gap:6px; flex-wrap:wrap; margin-top:7px}
.platrow{display:flex; align-items:center; gap:8px; padding:9px 16px; border-bottom:1px dashed var(--line)}
.platrow:last-child{border-bottom:none}
.platrow .pname{flex:0 0 76px; font-size:12.5px; font-weight:600; color:var(--ink2)}
.platrow .pctl{flex:0 0 auto; display:flex; gap:6px}
.platrow .purl{flex:1 1 200px; min-width:140px; position:relative}
.platrow input{font-size:12.5px; padding:6px 10px}
.platrow .pact{flex:0 0 auto}
.platrow .pstat{flex:0 0 auto; min-width:78px; text-align:right; font-size:11.5px; color:var(--ink3)}
.platrow.filled{background:#F8FEFC}

/* 已锁定：这条已经交上去了，输入框锁死 */
.platrow.locked{background:var(--okbg)}
.platrow.locked input{background:#F0FDF9; color:var(--ink2); cursor:not-allowed}
.platrow.locked .okmark{color:var(--ok); font-weight:600}

/* 已采满：这一格不需要学生再填 */
.platrow.full{background:#F8FAFC; opacity:.6}
.platrow.full input{background:#F1F5F9; cursor:not-allowed}
.platrow.full .fulltag{font-size:11.5px; color:var(--ink3); white-space:nowrap}

/* 正在抓取 */
.platrow.verifying{background:#EFF6FF}
.platrow.verifying .spinmark{color:var(--brand2); font-weight:700}

/* v1.6.2：链接贴上来自动校验 —— 这一栏显示**状态**，学生不用再点按钮 */
.platrow .autotag{display:inline-flex; align-items:center; gap:5px;
  font-size:11.5px; color:var(--ink3); white-space:nowrap}
.platrow .autotag.busy{color:var(--brand2); font-weight:600}
.platrow .autotag .sp{display:inline-block; width:10px; height:10px; border-radius:50%;
  border:2px solid #BFDBFE; border-top-color:var(--brand2); animation:autoSpin .7s linear infinite}
@keyframes autoSpin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion: reduce){.platrow .autotag .sp{animation:none}}

/* v1.6.3：通过校验之后这一格就**定稿**了 —— 不再给「重新填写」按钮，只留一个状态标。
   它不是按钮（没有 hover / 没有 cursor:pointer），避免学生以为还能点。 */
.platrow .locktag{display:inline-flex; align-items:center; gap:4px;
  font-size:11.5px; color:var(--ok); font-weight:600; white-space:nowrap;
  background:#ECFDF5; border:1px solid #A7F3D0; border-radius:999px; padding:2px 9px}

/* 验证没通过 */
.platrow.err{background:#FFF7F7}
.platrow.err input{border-color:#FCA5A5; background:#FFF7F7}
.platrow .errmark{display:inline-flex; width:17px; height:17px; border-radius:50%;
  background:var(--danger); color:#fff; align-items:center; justify-content:center;
  font-size:11px; font-weight:700; cursor:help}
.platrow .mutedmark{color:var(--ink3)}

@media (max-width:640px){
  .platrow{flex-wrap:wrap}
  .platrow .pname{flex:0 0 66px; font-size:12px}
  .platrow .pctl{flex:0 0 auto}
  .platrow .pctl .btn{font-size:11.5px; padding:4px 9px}
  .platrow .purl{flex:1 1 100%; order:5}
  .platrow .pact{order:6}
  .platrow .pstat{order:7; min-width:0; text-align:left}
}

/* ---------- 吸底提交条（v1.6.4 已撤掉，样式留档说明） ----------
   原来是「清空未验证的 / 我全部做完了」两个按钮的固定底栏。
   现在每条链接贴上去就自动校验入库，学生端没有批量提交，整条杠已从 HTML 移除。 */

/* ---------- 提示浮层 ---------- */
#toast{position:fixed; left:50%; bottom:36px; transform:translateX(-50%) translateY(10px);
  background:#0F172A; color:#fff; font-size:13px; padding:9px 16px; border-radius:999px;
  opacity:0; pointer-events:none; transition:opacity .2s, transform .2s; z-index:60; max-width:88vw}
#toast.on{opacity:1; transform:translateX(-50%) translateY(0)}

/* ---------- 弹窗 ---------- */
.modal{position:fixed; inset:0; background:rgba(15,23,42,.45); display:none; z-index:50;
  align-items:flex-start; justify-content:center; padding:28px 14px; overflow:auto}
.modal.on{display:flex}
.modal .box{background:#fff; border-radius:14px; max-width:900px; width:100%; box-shadow:0 20px 50px rgba(16,24,40,.25)}
.modal .box header{display:flex; align-items:center; gap:10px; padding:14px 18px; border-bottom:1px solid var(--line)}
.modal .box .body{padding:16px 18px; max-height:70vh; overflow:auto}
.modal .box footer{padding:12px 18px; border-top:1px solid var(--line); display:flex; gap:8px; justify-content:flex-end}

/* ---------- 统计小卡 ---------- */
.stats{display:grid; grid-template-columns:repeat(auto-fill,minmax(120px,1fr)); gap:10px}
.stat{background:#fff; border:1px solid var(--line); border-radius:10px; padding:11px 13px}
.stat .k{font-size:11.5px; color:var(--ink3)}
.stat .v{font-size:20px; font-weight:700; line-height:1.3; font-variant-numeric:tabular-nums}
.stat.brand .v{color:var(--brand2)}
.stat.ok .v{color:var(--ok)}
.stat.warn .v{color:var(--warn)}
.stat.err .v{color:var(--danger)}

/* ---------- 题库勾选列表 ---------- */
.qpick{max-height:420px; overflow:auto; border:1px solid var(--line); border-radius:10px}
.qpick .it{display:flex; gap:10px; align-items:flex-start; padding:9px 12px; border-bottom:1px solid var(--line); font-size:13px}
.qpick .it:last-child{border-bottom:none}
.qpick .it:hover{background:#FBFDFF}
.qpick .it .cb{flex:0 0 auto; padding-top:2px}
.qpick .it .tx{flex:1; min-width:0}
.qpick .it .q{word-break:break-word}
.qpick .it .mt{font-size:11.5px; color:var(--ink3); margin-top:2px}
.qpick.filtered{background:#FCFDFF}

/* ---------- 平台徽标色 ---------- */
.pill{display:inline-block; font-size:11.5px; padding:1px 8px; border-radius:999px; white-space:nowrap}
.p-豆包{background:#EFF6FF; color:#1D4ED8}
.p-DeepSeek{background:#EEF2FF; color:#4338CA}
.p-通义千问{background:#F5F3FF; color:#6D28D9}
.p-元宝{background:#ECFDF5; color:#047857}
/* 文心已于 2026-10-01 下线，徽标样式一并移除 */

/* ---------- 其他 ---------- */
.foot{font-size:12px; color:var(--ink3); text-align:center; padding:20px 0 0}
.steps{font-size:12.5px; color:var(--ink2); margin:0; padding-left:18px}
.steps li{margin-bottom:3px}
.legend{font-size:12px; color:var(--ink2); background:#F8FAFC; border:1px solid var(--line);
  border-radius:9px; padding:9px 12px; line-height:1.9}
.legend code{background:#EFF3F8; padding:0 4px; border-radius:4px}
.warnbox{background:var(--warnbg); border:1px solid #FDE68A; color:#92400E; border-radius:9px;
  padding:10px 13px; font-size:12.5px; line-height:1.7}
.scroll-x{overflow-x:auto}
.ans{font-size:13px; white-space:pre-wrap; word-break:break-word; background:#FBFCFE;
  border:1px solid var(--line); border-radius:9px; padding:11px 13px; max-height:340px; overflow:auto}
.urlcell{word-break:break-all; font-size:11.5px; color:var(--ink3)}
.nowrap{white-space:nowrap}

/* ---------- 学生端提示框 ---------- */
.alert{background:var(--warnbg); border:1px solid #FDE68A; border-radius:10px;
  padding:12px 14px; font-size:12.5px; color:#7C2D12; line-height:1.8; margin-bottom:14px}
.alert .steps{margin-top:6px; color:#7C2D12}

/* ---------- 提问对比（弹窗里用） ---------- */
.cmp{border:1px solid var(--line); border-radius:10px; overflow:hidden}
.cmprow{padding:10px 13px; border-bottom:1px solid var(--line)}
.cmprow:last-child{border-bottom:none}
.cmprow .k{font-size:11.5px; color:var(--ink3); margin-bottom:3px}
.cmprow .v{font-size:13.5px; font-weight:600; word-break:break-word}
.cmprow .v.err{color:var(--danger)}

.tag.tgt{background:#FEF3C7; border-color:#FDE68A; color:#92400E}

/* ---------- 完成度矩阵（后台看板） ---------- */
.mx{display:grid; gap:6px}
.mxrow{display:grid; grid-template-columns:minmax(160px,2fr) repeat(4,minmax(46px,1fr)); gap:6px; align-items:center}
.mxrow.head{font-size:11.5px; color:var(--ink3); font-weight:600}
.mxq{font-size:12px; word-break:break-word; line-height:1.45}
.mxcell{text-align:center; font-size:11.5px; border-radius:7px; padding:5px 2px;
  border:1px solid var(--line); font-variant-numeric:tabular-nums}
.mxcell.full{background:var(--okbg); border-color:#A7F3D0; color:var(--ok); font-weight:600}
.mxcell.part{background:var(--warnbg); border-color:#FDE68A; color:var(--warn)}
.mxcell.zero{background:#F8FAFC; color:var(--ink3)}
