/* ==========================================================
   陶端健课题组 · Tao Group @ JXNU
   设计基调：浅色留白 / 卡片化 / 科研蓝
   ========================================================== */
:root{
  --navy:#0e2f52;
  --navy-2:#143d68;
  --blue:#1e6fc4;
  --blue-2:#3b93e0;
  --blue-100:#e8f2fc;
  --blue-50:#f3f8fd;
  --cyan:#0ea5b7;
  --sky:#e6f4fe;
  --gold:#d99a3c;
  --gold-100:#fdf3e2;
  --violet:#7c5cd6;
  --violet-100:#f0ebfd;
  --ink:#1a2b3c;
  --ink-2:#48607a;
  --muted:#8ba0b6;
  --line:#e8eef5;
  --line-2:#f1f5f9;
  --bg:#f7fafd;
  --white:#fff;
  --r:14px;
  --r-lg:18px;
  --sh-1:0 1px 2px rgba(16,47,82,.04),0 2px 8px rgba(16,47,82,.04);
  --sh-2:0 4px 16px rgba(16,47,82,.07),0 12px 32px rgba(16,47,82,.05);
  --sh-blue:0 8px 24px rgba(30,111,196,.22);
  --sans:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC",Helvetica,Arial,sans-serif;
  --serif:Georgia,"Times New Roman","Songti SC","Noto Serif SC",serif;
  --max:1240px;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);
  font-size:calc(15.5px * var(--fz-all,1));line-height:1.75;-webkit-font-smoothing:antialiased}
img{max-width:100%;display:block}
a{color:inherit;text-decoration:none}
h1,h2,h3,h4{margin:0;font-weight:700;letter-spacing:-.01em;color:var(--navy)}
p{margin:0 0 1em}
p:last-child{margin-bottom:0}
ul{margin:0;padding:0;list-style:none}
button{font-family:inherit}
.wrap{max-width:var(--max);margin:0 auto;padding:0 32px}
/* 只给搜索引擎 / 读屏用的文字（页头品牌文字去掉后，标题靠它保留） */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0}

/* ============ 头部（顶栏底色后台可自由取色） ============
   底色 --head-bg 与文字色 --head-fg / --head-on 都由 <body> 上的
   内联 CSS 变量给（PHP 按底色亮度自动选深字还是浅字）。
   原来那条深色信息条（地址 / 电话 / 邮箱）已按要求去掉。

   ⚠️ .header 必须是 <body> 的直接子元素，position:sticky 才会整页吸顶。
   前面新增的 .bbar（顶部品牌带）也是 body 直接子元素，它先滚走，导航接管吸顶。 */
.header{position:sticky;top:0;z-index:80;background:var(--head-bg,#fff);
  border-bottom:1px solid var(--head-line,rgba(20,60,102,.12));transition:background .25s ease}
.header .wrap{display:flex;align-items:center;height:92px;gap:28px}
/* flex:0 1 auto + min-width:0 + max-width —— 长方形 logo 变宽后也不把整条顶栏撑出去 */
.brand{display:flex;align-items:center;flex:0 1 auto;min-width:0;max-width:min(400px,44%);
  transition:opacity .28s ease,transform .28s ease}
/* 有品牌带时，导航左侧的 logo 先藏着 —— 上面那条里已经有两个大 logo 了，
   等品牌带滚出屏幕再淡入，避免同屏出现三个一样的标识。
   它始终占位（只是透明），所以导航不会在滚动时跳一下。 */
body.has-bbar:not(.bbar-gone) .brand{opacity:0;transform:translateX(-8px);pointer-events:none}
/* 后台勾了「品牌带还在时也显示导航 logo」就一直显示（勾了才方便调大小时看效果） */
body.has-bbar.nav-logo-always .brand{opacity:1;transform:none;pointer-events:auto}
/* 页头标识：只放一张 logo 图，文字由图片自身带。
   高度由 --nav-logo 控制（= 基准高度 × 全站 logo 缩放），后台可调。 */
.brand .mark{
  height:var(--nav-logo,48px);min-width:0;border-radius:0;flex:0 1 auto;
  display:flex;align-items:center;background:transparent;box-shadow:none;
}
.brand .mark img{display:block;height:var(--nav-logo,48px);width:auto;max-width:100%;object-fit:contain}
.brand .mark.no-img{
  flex:0 0 auto;width:var(--nav-logo,48px);border-radius:12px;overflow:hidden;
  background:linear-gradient(145deg,var(--blue),var(--navy));
  color:#fff;display:grid;place-items:center;font-family:var(--serif);font-size:12px;font-weight:700;
  box-shadow:0 4px 12px rgba(30,111,196,.3);letter-spacing:.02em;
}
.brand .mark.no-img img{display:none}
/* 导航项：字号加大到 17.5、字重加到 600（选中项 700），项与项之间留 10px 呼吸位 */
.nav{margin-left:auto;display:flex;align-items:center;gap:10px}
.nav a{position:relative;padding:12px 17px;font-size:calc(17.5px * var(--fz-all,1) * var(--fz-nav,1));font-weight:600;letter-spacing:.015em;
  color:var(--head-fg,#3d566e);border-radius:10px;transition:.2s;white-space:nowrap}
.nav a:hover{color:var(--head-on,var(--blue));background:var(--head-onbg,var(--blue-50))}
.nav a.on{color:var(--head-on,var(--blue));font-weight:700}
.nav a.on:after{content:"";position:absolute;left:17px;right:17px;bottom:4px;height:3px;
  border-radius:2px;background:var(--head-on,var(--blue))}
.burger{display:none;margin-left:auto;width:44px;height:44px;border:1px solid var(--head-line,var(--line));
  border-radius:11px;background:transparent;cursor:pointer;padding:12px}
.burger i{display:block;height:1.7px;background:var(--head-fg,var(--navy));border-radius:2px;margin:3.5px 0}
.burger i:nth-child(2){width:70%}
body.head-tone-dark .brand .mark.no-img{box-shadow:0 4px 12px rgba(0,0,0,.35)}

/* ============ 页面标题带 ============
   排在顶部背景图「下面」，文字落在纯色底上，不会再压在照片上看不清。 */
/* 页头区右侧的淡分子装饰（化学课题组的苯环网络）——
   只挂在 .pb（栏目页头）上，首页没有 .pb 所以不受影响；
   纯装饰，pointer-events:none 不挡任何点击，窄屏藏掉。 */
.pb{position:relative;padding:48px 0 10px;overflow:hidden}
.pb::after{content:"";position:absolute;right:-36px;top:0;bottom:0;width:600px;
  background:url(../img/pb-deco.svg) no-repeat right center;background-size:600px auto;
  pointer-events:none}
@media (max-width:980px){.pb::after{opacity:.5;width:340px}}
@media (max-width:640px){.pb::after{display:none}}
.pb .wrap{position:relative;z-index:1}
.pb .crumb{font-size:15px;color:#5a6b7d;margin-bottom:15px}
.pb .crumb a{color:#3d4f61}
.pb .crumb a:hover{color:var(--blue)}
.pb .crumb em{margin:0 8px;font-style:normal;opacity:.45}
/* 不在页头横幅(.pb)里的面包屑（论坛列表/详情、内容详情等）——此前无样式，
   一直是继承来的小灰字，2026-10-03 老师反馈不明显 */
.crumb{font-size:15px;color:#5a6b7d;margin:0 0 14px}
.crumb a{color:#3d4f61}
.crumb a:hover{color:var(--blue);text-decoration:none}
.crumb em{margin:0 8px;font-style:normal;opacity:.45}
.pb h1{font-size:calc(40px * var(--fz-all,1) * var(--fz-pb,1));line-height:1.24;letter-spacing:-.02em}
.pb-en{font-family:var(--serif);font-size:calc(17px * var(--fz-all,1) * var(--fz-sub,1));color:var(--muted);font-weight:400;
  letter-spacing:.06em;margin-left:14px}
.pb .sub{color:var(--ink-2);font-size:calc(17px * var(--fz-all,1) * var(--fz-sub,1));margin-top:12px;max-width:840px}

/* ==========================================================
   ① 顶部品牌带（网站最顶端的一条整行背景图 + 两个等大的 logo 槽位）
   ----------------------------------------------------------
   DOM: <div class="bbar"> → <header class="header"> → <div class="pb">
   也就是说：**品牌带在最上面，导航栏在它下面**，页面标题带再在导航下面。

   背景图由后台「Logo 与品牌」上传（--bb-h 控制带子高度，cover 铺满整行）；
   带内是 .wrap 里的两个 .slot —— 两个槽位**高度完全一样、可容纳宽度也一样**，
   图片用 object-fit:contain 居中，所以换上宽高比不同的 logo 也不会一大一小。

   white-logo：把 logo 自动转成纯白（brightness(0) invert(1)），
   这样深色的院徽 / 文字直接放到深色背景带上也能看清，不用手工做白版。
   ========================================================== */
.bbar{position:relative;background-color:#2d7dbc;background-position:center;background-size:cover;
  background-repeat:no-repeat;overflow:hidden}
/* 上下压一点暗，让白色 logo 在浅色图案区也够清楚 */
.bbar::after{content:"";position:absolute;inset:0;pointer-events:none;
  background:linear-gradient(180deg,rgba(4,26,48,.16),rgba(4,26,48,.02) 46%,rgba(4,26,48,.20))}
.bbar .wrap{position:relative;z-index:1;height:var(--bb-h,132px);display:flex;align-items:center;
  justify-content:center;gap:var(--bb-gap,56px)}
.bbar.al-left .wrap{justify-content:flex-start}
.bbar .slot{display:flex;align-items:center;justify-content:center;
  height:var(--bb-lh,64px);max-width:var(--bb-lw,300px);flex:0 1 auto;min-width:0}
.bbar .slot img{display:block;height:100%;width:auto;max-width:100%;object-fit:contain;
  transition:transform .25s ease}
.bbar .slot:hover img{transform:scale(1.03)}
/* 自动转白：任意颜色的 logo 都能一键变成纯白剪影 */
.bbar.white-logo .slot img{filter:brightness(0) invert(1) drop-shadow(0 2px 6px rgba(0,10,25,.28))}
/* 还没传 logo 时的占位：一个虚线框，提示这里要放什么 */
.bbar .slot.no-img{border:1px dashed rgba(255,255,255,.55);border-radius:10px;padding:0 16px;
  max-width:var(--bb-lw,300px)}
.bbar .slot.no-img .ph{color:rgba(255,255,255,.9);font-size:13.5px;letter-spacing:.08em;white-space:nowrap}

/* ==========================================================
   ② 全站背景水印（隐约的化工元素，不影响阅读）
   ----------------------------------------------------------
   一层固定在视口最底下的图案（position:fixed + z-index:-1），
   除了它别的元素都排在它上面；浓度由 --wm-op 控制（后台可调 0 – 16%）。
   带白底的内容卡片会自然盖住它，所以正文区域始终清爽。
   ========================================================== */
.wm{position:fixed;inset:0;z-index:-1;pointer-events:none;opacity:var(--wm-op,.05);
  background:url(../img/watermark.svg) repeat 0 0;background-size:620px 620px}

/* ============ 详情页 · 子栏目横向导航 ============ */
.subnav{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:14px;
  padding:9px 12px;background:#fff;border:1px solid var(--line);border-radius:12px;
  box-shadow:var(--sh-1)}
.subnav .lb{flex:0 0 auto;font-size:12.5px;font-weight:700;color:var(--navy);letter-spacing:.05em;
  padding-right:10px;margin-right:2px;border-right:1px solid var(--line-2)}
.subnav a{flex:0 0 auto;font-size:13.5px;color:var(--ink-2);text-decoration:none;
  padding:6px 13px;border-radius:8px;transition:.18s;border:1px solid transparent}
.subnav a:hover{background:var(--blue-50);color:var(--blue);border-color:#cfe2f7}
.subnav a.on{background:linear-gradient(135deg,var(--blue),var(--blue-2));color:#fff;
  font-weight:600;border-color:transparent;box-shadow:var(--sh-blue)}
.subnav .sp{flex:1 1 auto;min-width:6px}
.subnav a.home{display:inline-flex;align-items:center;gap:6px;padding:6px 14px;border-radius:9px;
  font-size:12.5px;font-weight:600;color:var(--ink-2);background:#fff;border:1px solid var(--line);transition:.2s}
.subnav a.home:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-50);text-decoration:none}
@media(max-width:600px){
  .subnav{gap:6px;padding:8px 9px}
  .subnav a{padding:5px 10px;font-size:12.5px}
  .subnav .lb{width:100%;border-right:none;border-bottom:1px solid var(--line-2);
    padding:0 0 6px;margin:0 0 2px}
}

/* ============ 板块标题 ============ */
.sec{padding:34px 0 64px}
.sec-h{display:flex;align-items:center;gap:11px;margin-bottom:22px}
.sec-h:before{content:"";width:4px;height:19px;border-radius:3px;
  background:linear-gradient(180deg,var(--blue),var(--blue-2))}
.sec-h h2{font-size:calc(20px * var(--fz-all,1) * var(--fz-sec,1));letter-spacing:-.01em}
.sec-h .cnt{font-size:13px;color:var(--muted);font-weight:400;background:var(--line-2);
  padding:1px 9px;border-radius:20px}
/* 「全部方向 → / 更多动态 → / 查看全部 →」：栏目标题右侧的跳转动作，按钮化 */
.sec-h .right{margin-left:auto;display:inline-flex;align-items:center;gap:5px;padding:6px 14px;
  border-radius:9px;font-size:12.5px;font-weight:600;color:var(--blue);background:#fff;
  border:1px solid var(--line);transition:.2s}
.sec-h .right:hover{border-color:var(--blue);background:var(--blue-50);text-decoration:none}

/* ============ 按钮 ============ */
.btn{display:inline-flex;align-items:center;gap:7px;padding:11px 22px;border-radius:10px;
  font-size:14.5px;border:1px solid transparent;transition:.22s;cursor:pointer;font-weight:500}
.btn-p{background:linear-gradient(135deg,var(--blue),var(--blue-2));color:#fff;box-shadow:var(--sh-blue)}
.btn-p:hover{transform:translateY(-2px);box-shadow:0 12px 28px rgba(30,111,196,.32)}
.btn-g{background:#fff;border-color:var(--line);color:var(--ink-2)}
.btn-g:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-50)}

/* ============ 标签 ============ */
.tag{display:inline-flex;align-items:center;font-size:12px;padding:2.5px 10px;border-radius:6px;
  background:var(--blue-100);color:var(--blue);font-weight:500;line-height:1.6}
.tag.g{background:var(--gold-100);color:#a9701d}
.tag.v{background:var(--violet-100);color:var(--violet)}
.tag.n{background:var(--line-2);color:var(--ink-2)}
.tag.on-img{position:absolute;top:12px;left:12px;z-index:3;background:rgba(255,255,255,.94);
  backdrop-filter:blur(6px);color:var(--navy);font-weight:600;box-shadow:0 2px 8px rgba(16,47,82,.14)}

/* ==========================================================
   PI 卡片（首页 / 成员页）
   ========================================================== */
.pi-hero{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  padding:28px;display:grid;grid-template-columns:400px 1fr;gap:36px;box-shadow:var(--sh-1)}
/* 左列现在只有头像（原「联系方式」栏已去掉） */
.pi-col{display:flex;flex-direction:column;min-width:0}
/* PI 头像：高度撑满右侧正文列（上下不再留白），
   高度不受限时（窄屏单列）退回 4.2 : 3.6（≈ 7:6）的自然比例 */
.pi-portrait{
  border-radius:12px;overflow:hidden;position:relative;
  aspect-ratio:4.2/3.6;flex:1 1 auto;
  background:linear-gradient(160deg,#123a63 0%,#1c5288 55%,#2a6fa8 100%);
  display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;color:#fff;
}
/* 头像下方的联系信息块，撑满剩余高度避免出现空白 */
.pi-side{flex:1;margin-top:14px;border:1px solid var(--line);border-radius:12px;
  background:var(--blue-50);padding:14px 16px 16px;display:flex;flex-direction:column;gap:10px}
.pi-side-h{font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--blue);
  font-weight:700;padding-bottom:8px;border-bottom:1px solid #dbeafe}
.pi-side .r{display:flex;gap:10px;font-size:13px;line-height:1.6}
.pi-side .k{flex:0 0 42px;color:var(--muted);font-size:12.5px}
.pi-side .v{flex:1;color:var(--ink-2);word-break:break-all}
.pi-side .v a{color:var(--blue);text-decoration:none}
.pi-side .v a:hover{text-decoration:underline}
.pi-portrait img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center 22%}
/* 照片上不再压任何文字/蒙版，姓名挪到右侧正文列（见 .pi-name） */
.pi-main{display:flex;flex-direction:column}
/* PI 姓名标题（原先是压在照片上的浮层，现移到照片右侧） */
.pi-name{font-family:var(--serif);font-size:32px;font-weight:700;color:var(--navy);
  line-height:1.15;letter-spacing:-.01em;margin-bottom:4px}
.pi-name span{display:block;font-family:var(--sans);font-size:11.5px;font-weight:400;
  letter-spacing:.24em;text-transform:uppercase;color:var(--muted);margin-top:6px}
.pi-main .role{font-size:14px;color:var(--blue);font-weight:600;margin-bottom:6px}
.pi-main h2{font-size:26px;margin-bottom:12px;letter-spacing:-.02em}
.pi-main h2 small{font-family:var(--serif);font-size:17px;color:var(--ink-2);font-weight:400;margin-left:8px}
/* 身份标签：由「副标题」拆分而来，替代原来重复出现的 role 行 + 职务 */
.pi-roles{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:14px}
.role-chip{font-size:13px;font-weight:600;color:var(--blue);background:var(--blue-50);
  border:1px solid #dbeafe;border-radius:20px;padding:4px 13px;letter-spacing:.02em}
.pi-intro{background:var(--blue-50);border:1px solid #dbeafe;border-radius:12px;padding:16px 18px;
  font-size:14.5px;line-height:1.9;color:var(--ink-2);margin:0 0 16px}
.pi-field,.pi-tags{margin-bottom:18px}
.pi-field .lb,.pi-tags .lb{display:block;font-size:11.5px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--blue);font-weight:700;margin-bottom:9px}
.pi-field .tags,.pi-tags .tags{display:flex;flex-wrap:wrap;gap:7px}
.pi-field .tag{background:var(--blue-50);border:1px solid #dbeafe;color:#1a5fa8}
/* 邮箱 / 电话标签：可点，样式跟「研究方向」的标签保持一致 */
.pi-field .tag-link{text-decoration:none;cursor:pointer;transition:.18s}
.pi-field .tag-link:hover{background:#dbeafe;border-color:#b9d6f5;color:#124a89}
.mail-sep{color:var(--muted);margin:0 3px}
.pi-tags .tag.tg{background:linear-gradient(180deg,#fff8e6,#ffefc9);border-color:#f0d79a;color:#8a5b00}
.kv{display:grid;grid-template-columns:112px 1fr;gap:9px 16px;font-size:14.5px;margin-bottom:18px}
.kv dt{color:var(--muted);font-size:calc(13.5px * var(--fz-all,1) * var(--fz-kv,1))}
.kv dd{font-size:calc(15.5px * var(--fz-all,1) * var(--fz-kv,1))}
.kv dd{margin:0;color:var(--ink)}
.kv dd a{color:var(--blue)}
.pi-actions{display:flex;gap:10px;flex-wrap:wrap;margin-top:auto;padding-top:4px}

/* ============ PI 详情双栏 ============ */
.pgrid{display:grid;grid-template-columns:1fr 1fr;gap:22px;margin-top:22px}
.card{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);padding:24px 26px;box-shadow:var(--sh-1)}
.card+.card{margin-top:22px}
.card-h{display:flex;align-items:center;gap:9px;margin-bottom:20px;padding-bottom:14px;border-bottom:1px solid var(--line-2)}
.card-h:before{content:"";width:3px;height:16px;border-radius:2px;background:var(--blue)}
.card-h h3{font-size:16px;letter-spacing:.01em}
.card-h .en{font-size:12px;color:var(--muted);letter-spacing:.06em}

/* 时间轴 */
.tl{position:relative;padding-left:24px}
.tl:before{content:"";position:absolute;left:4.5px;top:9px;bottom:9px;width:1px;background:var(--line)}
.tl li{position:relative;padding-bottom:20px}
.tl li:last-child{padding-bottom:0}
.tl li:before{content:"";position:absolute;left:-24px;top:7px;width:10px;height:10px;border-radius:50%;
  background:#fff;border:2.5px solid var(--blue-2)}
.tl .t1{font-size:14.5px;color:var(--ink);font-weight:500;line-height:1.6}
.tl .t2{font-size:13px;color:var(--muted);margin-top:3px;line-height:1.65}

/* 荣誉 */
.aw li{display:flex;gap:16px;padding:13px 0;border-bottom:1px dashed var(--line)}
.aw li:last-child{border-bottom:0;padding-bottom:0}
.aw .yr{flex:0 0 62px;font-size:13.5px;font-weight:700;color:var(--blue);letter-spacing:.02em;padding-top:1px}
.aw .c1{font-size:14.5px;color:var(--ink);line-height:1.65}
.aw .c2{font-size:12.5px;color:var(--muted);margin-top:3px;line-height:1.6}

/* 项目 */
.fund{margin-bottom:18px}
.fund:last-child{margin-bottom:0}
.fund-h{display:inline-block;font-size:13px;font-weight:600;color:var(--blue);
  background:var(--blue-100);padding:3px 12px;border-radius:20px;margin-bottom:10px}
.fund li{padding:11px 0;border-bottom:1px dashed var(--line);font-size:14.5px;color:var(--ink)}
.fund li:last-child{border-bottom:0}
.fund li .m{font-size:12.5px;color:var(--muted);margin-top:3px}
.fund li .amt{float:right;font-size:12.5px;color:var(--blue);font-weight:600}

/* 报告 / 兼职 */
.rp li{display:flex;gap:14px;padding:9px 0;border-bottom:1px dashed var(--line);font-size:14px;align-items:baseline}
.rp li:last-child{border-bottom:0}
.rp .yr{flex:0 0 62px;color:var(--muted);font-size:12.5px;letter-spacing:.02em}
.rp .c1{flex:1;color:var(--ink);line-height:1.6}
.rp .c2{font-size:12px;color:var(--muted);flex:0 0 auto}
.pt li{padding:10px 0 10px 18px;position:relative;border-bottom:1px dashed var(--line);font-size:14px;color:var(--ink);line-height:1.65}
.pt li:last-child{border-bottom:0}
.pt li:before{content:"";position:absolute;left:2px;top:18px;width:6px;height:6px;border-radius:50%;background:var(--blue-2)}
.pt .c2{display:block;font-size:12.5px;color:var(--muted);margin-top:2px}

/* ==========================================================
   成员卡片（3:4 竖版）
   ========================================================== */
.mgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:20px}
/* 团队导师 / 实验系列：一行 3 人。限宽避免卡片被拉伸过大，照片同步改为 1:1 */
.mgrid.c3{grid-template-columns:repeat(3,1fr);max-width:1080px;margin:0 auto}
.mgrid.c3 .pcard .ph{aspect-ratio:1/1}
.mgrid.c3 .pcard .ph img{object-position:center 18%}
/* 博士 / 硕士：横向卡片 —— 照片在左（4:5），成员信息在右 */
.mgrid.mh{grid-template-columns:repeat(2,1fr);gap:18px 22px}
.pcard.h{display:grid;grid-template-columns:126px 1fr;align-items:stretch}
.pcard.h .ph{aspect-ratio:4/5;height:100%;min-height:158px}
.pcard.h .ph img{object-position:center 18%}
.pcard.h .bd{padding:16px 18px;justify-content:flex-start}
.pcard.h .nm{font-size:calc(17px * var(--fz-all,1) * var(--fz-card,1))}
.pcard.h .sub{margin-top:3px}
.pcard.h .sp{margin:12px 0 10px}
.pcard.h .rows{gap:8px;font-size:13.5px;flex:0 0 auto}
.pcard.h .rows .k{flex:0 0 40px}
.pcard.h:hover .ph img{transform:scale(1.05)}
.pcard{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  transition:.26s;cursor:pointer;box-shadow:var(--sh-1);display:flex;flex-direction:column}
.pcard:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#cfe2f7}
.pcard .ph{position:relative;aspect-ratio:3/4;background:linear-gradient(160deg,#123a63,#245c92 60%,#33739f);
  overflow:hidden;display:grid;place-items:center}
.pcard .ph img{width:100%;height:100%;object-fit:cover;object-position:center 20%;transition:.55s}
.pcard:hover .ph img{transform:scale(1.05)}
.pcard .ph .ini{font-family:var(--serif);font-size:46px;font-weight:700;letter-spacing:.06em;
  color:rgba(255,255,255,.9);text-shadow:0 2px 20px rgba(6,26,48,.45);user-select:none}
.pcard .bd{padding:15px 16px 17px;display:flex;flex-direction:column;flex:1}
.pcard .nm{font-size:16.5px;font-weight:700;color:var(--navy);line-height:1.4}
.pcard .sub{font-size:12px;color:var(--muted);letter-spacing:.04em;margin-top:2px}
.pcard .tag{margin-top:10px;align-self:flex-start}
.pcard .sp{height:1px;background:var(--line-2);margin:13px 0 11px}
.pcard .rows{display:flex;flex-direction:column;gap:7px;font-size:13px;line-height:1.55;flex:1}
.pcard .rows .r{display:flex;gap:9px}
.pcard .rows .k{flex:0 0 46px;color:var(--muted);font-size:12.5px}
.pcard .rows .v{flex:1;color:var(--ink-2);word-break:break-all}
.pcard .rows .v a{color:var(--blue)}
.pcard .go{margin-top:13px;font-size:13px;color:var(--blue);display:flex;align-items:center;gap:4px}
.pcard:hover .go{gap:8px}
/* 团队导师 / 实验系列 / 合作导师小卡牌：照片下固定排版（2026-09-30 老师）
   姓名（加粗加大）→ 职称 → 方向/邮箱/招生（带标签、单行整词截断）→ 查看详情 */
.pcard.rich .nm{font-size:calc(18px * var(--fz-all,1) * var(--fz-card,1))}
.pcard.rich .sub{font-size:12.5px;margin-top:3px}
.pcard.rich .rows .v.fitline{white-space:nowrap;overflow:hidden;word-break:normal;flex:1;min-width:0}
.pcard.rich .rows .em a{color:var(--blue);white-space:nowrap}
.pcard.rich .go{margin-top:auto;padding-top:12px}

/* ==========================================================
   论文列表（按年份分组 · 编号排版）
   ========================================================== */
.yearbar{display:flex;align-items:center;gap:14px;margin:34px 0 6px}
.yearbar:first-child{margin-top:8px}
.yearbar .y{font-family:var(--serif);font-size:24px;font-weight:700;color:var(--navy);letter-spacing:.01em}
.yearbar .ln{flex:1;height:1px;background:var(--line)}
.yearbar .n{font-size:12px;color:var(--muted)}
.pub{display:grid;grid-template-columns:54px 1fr;gap:16px;padding:20px 4px;border-bottom:1px solid var(--line-2);
  cursor:pointer;transition:.2s;align-items:start}
.pub:hover{background:var(--blue-50);border-radius:10px}
.pub .idx{font-size:13px;color:var(--muted);padding-top:3px;letter-spacing:.02em}
.pub .idx b{color:var(--blue)}
.pub .ttl{font-size:16px;font-weight:700;color:var(--navy);line-height:1.5;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.pub .ttl .a{color:var(--blue);opacity:0;transition:.2s;transform:translateX(-4px)}
.pub:hover .ttl .a{opacity:1;transform:translateX(0)}
.pub .sub{font-size:14px;color:var(--ink-2);margin-top:6px;line-height:1.7}
.pub .meta{font-size:12.5px;color:var(--muted);margin-top:8px;letter-spacing:.02em;display:flex;gap:14px;flex-wrap:wrap}
.pub .meta .pdf{color:var(--blue);font-weight:500}
.pub.thm{grid-template-columns:54px 1fr}
.pub .bb{display:flex;gap:10px;align-items:center;font-size:13px;padding:12px 4px;border-bottom:1px solid var(--line-2);cursor:pointer}
.pub .bb:hover{background:var(--blue-50);border-radius:10px}

/* 简易行（毕业/专利等） */
.rlist{qbackground:#fff}
.rlist li{display:flex;align-items:center;gap:16px;padding:15px 6px;border-bottom:1px solid var(--line-2);
  cursor:pointer;transition:.2s}
.rlist li:hover{background:var(--blue-50);border-radius:10px}
.rlist .idx{flex:0 0 44px;font-size:13px;color:var(--muted)}
.rlist .tx{flex:1;font-size:15px;color:var(--navy);font-weight:500;line-height:1.6}
.rlist .dt{font-size:12.5px;color:var(--muted);flex:0 0 auto}
.rlist .ar{color:var(--blue);opacity:0;transition:.2s}
.rlist li:hover .ar{opacity:1}

/* ============ 选项卡 ============ */
.tabs{display:flex;gap:8px;flex-wrap:wrap;background:#fff;border:1px solid var(--line);
  border-radius:14px;padding:7px;box-shadow:var(--sh-1);margin-bottom:26px}
.tabs .tab{border:0;background:transparent;padding:10px 20px;border-radius:10px;font-size:14.5px;
  color:var(--ink-2);cursor:pointer;transition:.2s;display:flex;align-items:center;gap:7px;white-space:nowrap;
  text-decoration:none;line-height:1.25;font-family:inherit}
.tabs .tab:hover{background:var(--blue-50);color:var(--blue)}
.tabs .tab.on{background:linear-gradient(135deg,var(--blue),var(--blue-2));color:#fff;font-weight:600;
  box-shadow:var(--sh-blue)}
.tabs .tab .n{font-size:12px;opacity:.72}

/* ============ 新闻 / 相册 / 设施 ============ */
.ngrid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.ncard{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  display:flex;flex-direction:column;transition:.26s;cursor:pointer;box-shadow:var(--sh-1)}
.ncard:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#cfe2f7}
.ncard .ph{aspect-ratio:16/10;background:var(--line-2);overflow:hidden;position:relative}
.ncard .ph img{width:100%;height:100%;object-fit:cover;transition:.55s}
.ncard:hover .ph img{transform:scale(1.05)}
.ncard .bd{padding:15px 17px 18px;flex:1;display:flex;flex-direction:column}
.ncard .dt{font-size:12px;color:var(--blue);letter-spacing:.05em;margin-bottom:7px;font-weight:500}
/* 标题一律换行显示完整，不做行数截断（原来 clamp 到 2 行会把长标题吃掉）。
   两端对齐：中文标题换行后左右两边都是齐的，不会一边长一边短。
   text-justify:inter-character 是给 CJK 用的，否则浏览器按西文规则只在词间拉开，
   中文长标题会看起来「没对齐」。 */
.ncard h4{font-size:15.5px;line-height:1.6;font-weight:600;color:var(--navy);
  word-break:break-word;overflow-wrap:anywhere;
  text-align:justify;text-justify:inter-character}
.news-card h4{
  display:block!important;white-space:normal!important;overflow:visible!important;
  text-overflow:clip!important;-webkit-line-clamp:unset!important;max-height:none!important;
  overflow-wrap:anywhere;word-break:break-word
}
.ncard:hover h4{color:var(--blue)}

/* 组内动态：卡片样式保持不变，整条轨道由右向左无缝滚动 */
.mq-view{overflow:hidden;position:relative;
  -webkit-mask-image:linear-gradient(90deg,transparent 0,#000 44px,#000 calc(100% - 44px),transparent 100%);
  mask-image:linear-gradient(90deg,transparent 0,#000 44px,#000 calc(100% - 44px),transparent 100%)}
.mq-track{display:flex;width:max-content;will-change:transform;animation:mqRoll linear infinite}
.mq-track:hover{animation-play-state:paused}
.ngrid.mq{display:flex;gap:20px;width:max-content;padding-right:20px}
.ngrid.mq .ncard{width:400px;flex:0 0 400px}
@keyframes mqRoll{from{transform:translateX(0)}to{transform:translateX(var(--mq-shift,-50%))}}
@media(max-width:1100px){.ngrid.mq .ncard{width:326px;flex:0 0 326px}}
@media(max-width:620px){.ngrid.mq .ncard{width:264px;flex:0 0 264px}}

/* 首页「最新成果」固定 4 个，窄屏降为 2 列 / 1 列，避免出现落单的孤儿卡 */
@media(max-width:920px){.home-pub .tocgrid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:620px){.home-pub .tocgrid{grid-template-columns:1fr}}

.ggrid{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}
.gitem{position:relative;border-radius:12px;overflow:hidden;aspect-ratio:4/3;background:var(--line-2);
  cursor:pointer;border:1px solid var(--line)}
.gitem img{width:100%;height:100%;object-fit:cover;transition:.55s}
.gitem:hover img{transform:scale(1.06)}
/* 相册标题同样完整换行，不截断 */
.gitem .cap{position:absolute;left:0;right:0;bottom:0;padding:30px 14px 12px;font-size:13.5px;color:#fff;
  line-height:1.55;background:linear-gradient(180deg,rgba(10,32,54,0),rgba(10,32,54,.82));
  word-break:break-word}

.fgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.fcard{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  cursor:pointer;transition:.26s;box-shadow:var(--sh-1)}
.fcard:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#cfe2f7}
.fcard .ph{aspect-ratio:4/3;background:var(--line-2);overflow:hidden}
.fcard .ph img{width:100%;height:100%;object-fit:cover;transition:.55s}
.fcard:hover .ph img{transform:scale(1.05)}
.fcard .nm{padding:13px 16px 16px;font-size:calc(14.5px * var(--fz-all,1) * var(--fz-card,1));color:var(--navy);font-weight:500;line-height:1.6}

/* 科研设施是纯展示页：固定为截图中的三列图片卡，不混入预约页签。 */
.facilities-only{min-height:360px}
.facilities-only .fgrid{gap:22px}
.facilities-only .fcard{border-radius:14px}
.facilities-only .fcard .ph{aspect-ratio:1.36/1}

/* 组内管理：一级导航始终横向固定在内容上方；个人中心内部再使用左侧事务菜单。 */
.lab-login-section,.lab-workspace-section{background:linear-gradient(180deg,#f7faff 0,#fff 100%)}
.lab-login-card{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:26px;
  max-width:940px;margin:12px auto;padding:34px 38px;background:#fff;border:1px solid var(--line);
  border-radius:20px;box-shadow:var(--sh-2)}
.lab-login-mark{width:82px;height:82px;border-radius:24px;display:grid;place-items:center;color:#fff;
  background:linear-gradient(145deg,var(--navy),var(--blue-2));font-size:22px;font-weight:800;letter-spacing:.08em;
  box-shadow:0 12px 28px rgba(30,111,196,.22)}
.eyebrow{display:block;margin-bottom:5px;color:var(--blue);font-size:11px;font-weight:800;letter-spacing:.14em}
.lab-login-copy h2,.lab-welcome h2{color:var(--navy);font-size:24px}
.lab-login-copy p,.lab-welcome p{margin:7px 0 0;color:var(--ink-2);line-height:1.8}
.lab-login-copy ul{display:flex;gap:8px 20px;flex-wrap:wrap;margin:14px 0 0;padding:0;list-style:none;color:var(--muted);font-size:13px}
.lab-login-copy li::before{content:"\2713";margin-right:6px;color:var(--blue);font-weight:800}
.lab-login-btn{white-space:nowrap;padding:11px 22px}
.tabs.lab-tabs{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;margin:0 0 18px;padding:8px;background:#fff;overflow-x:auto}
.tabs.lab-tabs .tab{flex:0 0 auto;padding:11px 20px;border-radius:10px}
.tabs.lab-tabs .tab-mine:not(.on){color:var(--blue);font-weight:700;border:1px solid #cfe2f7;background:var(--blue-50)}
.tabs.lab-tabs .tab.on{box-shadow:var(--sh-blue)}
.lab-tab-dot{width:7px;height:7px;border-radius:50%;background:#bdd1e5;flex:none}
.tabs.lab-tabs .tab.on .lab-tab-dot{background:#fff}
.lab-user-tools{display:flex;align-items:center;gap:10px;margin-left:auto;padding:0 8px 0 15px;white-space:nowrap;color:var(--ink-2);font-size:13px}
.lab-user-tools a{padding-left:10px;border-left:1px solid var(--line)}
.lab-content{min-width:0}

.lab-member-nav{display:flex;align-items:center;gap:8px;margin:0 0 18px;padding:8px;background:#fff;border:1px solid var(--line);
  border-radius:14px;box-shadow:var(--sh-1);overflow-x:auto}
.lab-member-link{display:inline-flex;align-items:center;gap:7px;flex:0 0 auto;padding:10px 20px;border-radius:10px;color:var(--ink-2);font-size:14.5px;white-space:nowrap}
.lab-member-link:hover{text-decoration:none;color:var(--blue);background:var(--blue-50)}
.lab-member-link.on{color:#fff;background:linear-gradient(135deg,var(--blue),var(--blue-2));font-weight:700;box-shadow:var(--sh-blue)}
.lab-member-link .ic{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.lab-member-mine:not(.on){color:var(--blue);font-weight:700;border:1px solid #cfe2f7;background:var(--blue-50)}

@media(max-width:900px){
  .tabs.lab-tabs{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none}
  .tabs.lab-tabs::-webkit-scrollbar{display:none}
  .lab-user-tools{display:none}
}
@media(max-width:680px){
  .lab-login-card{grid-template-columns:1fr;padding:25px 22px;gap:18px}
  .lab-login-mark{width:64px;height:64px;border-radius:19px}
  .lab-login-btn{justify-self:start}
  .tabs.lab-tabs .tab,.lab-member-link{padding:9px 14px}
}

/* ---- 仪器预约 ---- */
.bkgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.bkcard{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  transition:.26s;box-shadow:var(--sh-1);display:flex;flex-direction:column}
.bkcard:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#cfe2f7}
.bkcard .ph{aspect-ratio:4/3;background:linear-gradient(160deg,#f4f8fd,#e7f0fa);
  display:grid;place-items:center;overflow:hidden}
.bkcard .ph img{width:100%;height:100%;object-fit:cover;transition:.55s}
.bkcard:hover .ph img{transform:scale(1.05)}
.bkcard .ph .ic{width:64px;height:64px;border-radius:18px;display:grid;place-items:center;
  background:linear-gradient(145deg,var(--blue),var(--navy));color:#fff;font-size:24px;font-weight:700;
  box-shadow:0 6px 16px rgba(30,111,196,.28)}
.bkcard .tx{padding:14px 17px 17px;display:flex;flex-direction:column;gap:7px;flex:1}
.bkcard .tx b{font-size:calc(15.5px * var(--fz-all,1) * var(--fz-card,1));color:var(--navy);font-weight:600;line-height:1.55}
.bkcard .tx p{margin:0;font-size:13px;color:var(--muted);line-height:1.7;flex:1}
.bkcard .tx .bk-meta{font-size:12.5px;color:var(--muted);line-height:1.6}
.bkcard .tx .bk-meta:before{content:"\1F551\00a0";font-size:11.5px}
.bk-ops{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}
.bk-ops .btn.s{padding:7px 14px;font-size:13px}
/* 预约须知：Tab 顶上的一条淡蓝提示 */
.bknote{margin:0 0 18px;padding:13px 16px;border-radius:12px;font-size:13.5px;line-height:1.75;
  color:#2b4d70;background:#f2f7fd;border:1px solid #d8e7f7;white-space:pre-wrap}

.cgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
.ccard{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:18px 16px;text-align:center;
  transition:.26s;box-shadow:var(--sh-1)}
/* 合作交流的卡片只展示信息，不跳详情页，所以不做手势提示 */
.ccard.flat{cursor:default}
.ccard.flat:hover{border-color:#cfe2f7;box-shadow:var(--sh-2);transform:none}
.ccard .sub{font-size:12.5px;color:var(--muted);margin-top:6px;line-height:1.7;word-break:break-word}
.ccard:hover{transform:translateY(-3px);box-shadow:var(--sh-2);border-color:#cfe2f7}
.ccard .ph{width:88px;height:88px;margin:2px auto 14px;border-radius:50%;overflow:hidden;background:var(--line-2);
  border:3px solid #fff;box-shadow:0 4px 14px rgba(16,47,82,.12)}
.ccard .ph img{width:100%;height:100%;object-fit:cover}
.ccard .tx{font-size:calc(14.5px * var(--fz-all,1) * var(--fz-card,1));color:var(--navy);font-weight:500;line-height:1.6}

/* ============ 详情页 ============ */
.dwrap{max-width:900px;margin:0 auto}
.dhead{padding:34px 0 22px;border-bottom:1px solid var(--line);margin-bottom:28px}
.dhead h1{font-size:calc(29px * var(--fz-all,1) * var(--fz-dt,1));line-height:1.4;letter-spacing:-.015em;margin-bottom:14px}
.dmeta{display:flex;gap:18px;flex-wrap:wrap;font-size:13px;color:var(--muted)}
.dmeta .pill{background:var(--blue-100);color:var(--blue);padding:2px 11px;border-radius:20px;font-size:12.5px}
.dbody{font-size:calc(16px * var(--fz-all,1) * var(--fz-body,1));line-height:2;color:var(--ink-2)}
.dbody img{max-width:100%;height:auto;border-radius:12px;margin:16px 0;box-shadow:var(--sh-1)}
.dbody a{color:var(--blue);text-decoration:underline;text-underline-offset:3px;word-break:break-all}
.dbody h3{font-size:calc(17px * var(--fz-all,1) * var(--fz-body,1));color:var(--navy);margin:24px 0 10px}
.dbody b,.dbody strong{color:var(--ink)}
.dbody u{text-decoration:none}
.abstract{background:var(--blue-50);border:1px solid #dbeafe;border-radius:12px;padding:18px 20px;
  font-size:15px;line-height:1.95;color:var(--ink-2);margin-bottom:22px}
.abstract .lb{font-size:12px;color:var(--blue);letter-spacing:.12em;font-weight:600;
  text-transform:uppercase;margin-bottom:8px}
.abstract-h{font-size:13px;color:var(--blue);font-weight:700;letter-spacing:.08em;margin-bottom:10px;
  display:flex;align-items:center;gap:8px}
.abstract-h:before{content:"";width:4px;height:16px;border-radius:2px;background:var(--blue)}
.actbar{display:flex;gap:10px;flex-wrap:wrap;margin:26px 0 6px}

/* PDF 预览 */
.pdfbox{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
  box-shadow:var(--sh-1);margin:26px 0 8px}
.pdfbox .hd{display:flex;align-items:center;gap:11px;padding:14px 20px;border-bottom:1px solid var(--line);
  background:var(--blue-50)}
.pdfbox .hd .ic{width:30px;height:30px;border-radius:8px;background:#e34b4b;color:#fff;display:grid;
  place-items:center;font-size:10px;font-weight:700;letter-spacing:.02em}
.pdfbox .hd b{font-size:14.5px;color:var(--navy);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pdfbox .hd b em{font-style:normal;font-size:12.5px;color:var(--muted);margin-left:8px;font-weight:400}
.pdfbox .hd .act{display:flex;gap:8px;flex:0 0 auto}
.pdfbox .hd .act a,.pdfbox .hd .act .fsbtn{font-size:13px;color:var(--blue);padding:5px 13px;border:1px solid #cfe2f7;
  border-radius:8px;background:#fff;transition:.2s;white-space:nowrap;cursor:pointer;
  font-family:inherit;line-height:1.6}
.pdfbox .hd .act a:hover,.pdfbox .hd .act .fsbtn:hover{background:var(--blue);color:#fff;border-color:var(--blue)}
.pdfbox object,.pdfbox iframe{width:100%;height:78vh;min-height:560px;border:0;display:block;background:#fff}
/* 全屏预览 */
.pdfbox:fullscreen{border-radius:0;border:0;height:100vh;display:flex;flex-direction:column;margin:0}
.pdfbox:fullscreen .hd{flex:0 0 auto}
.pdfbox:fullscreen object,.pdfbox:fullscreen iframe{flex:1;height:auto;min-height:0}
.pdfbox:-webkit-full-screen{border-radius:0;border:0;height:100vh;display:flex;flex-direction:column;margin:0}
.pdfbox:-webkit-full-screen object{flex:1;height:auto;min-height:0}
.pdfbox .fb{height:78vh;min-height:300px;display:grid;place-items:center;padding:30px;
  text-align:center;color:var(--ink-2);font-size:14.5px;line-height:2;
  background:linear-gradient(180deg,#fff,#f4f8fc)}
.pdfbox .fb a{color:var(--blue);text-decoration:underline;text-underline-offset:3px}

/* 资源下载卡片（压缩包 / Word / PPT 这类浏览器内嵌不了的附件）
   以前这类文件被硬塞进 <object>，浏览器渲染不了 → 一进详情页就默默下载。
   现在改成一张卡片，把「下载」变成一个明确的按钮。 */
.dlbox{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;
  box-shadow:var(--sh-1);margin:26px 0 8px}
.dlbox .hd{display:flex;align-items:center;gap:11px;padding:14px 20px;border-bottom:1px solid var(--line);
  background:var(--blue-50)}
.dlbox .hd .ic{width:34px;height:34px;border-radius:8px;background:#5b7c99;color:#fff;display:grid;
  place-items:center;font-size:10px;font-weight:700;letter-spacing:.02em;flex:0 0 auto}
.dlbox .hd .ic.t-archive{background:#c98a2b}
.dlbox .hd .ic.t-pdf{background:#e34b4b}
.dlbox .hd .ic.t-word{background:#2b579a}
.dlbox .hd .ic.t-excel{background:#1d7a4c}
.dlbox .hd .ic.t-ppt{background:#c1552b}
.dlbox .hd .ic.t-image,.dlbox .hd .ic.t-video{background:#7a5bc9}
.dlbox .hd b{font-size:14.5px;color:var(--navy);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dlbox .hd b em{font-style:normal;font-size:12.5px;color:var(--muted);margin-left:8px;font-weight:400}
.dlbox .hd .act{display:flex;gap:8px;flex:0 0 auto}
.dlbox .hd .act a{font-size:13px;color:var(--blue);padding:5px 13px;border:1px solid #cfe2f7;
  border-radius:8px;background:#fff;transition:.2s;white-space:nowrap;line-height:1.6}
.dlbox .hd .act a:hover{background:var(--blue);color:#fff;border-color:var(--blue)}
.dlbox .hd .act a.dload{background:var(--blue);color:#fff;border-color:var(--blue);font-weight:600;
  padding:6px 18px;font-size:13.5px;box-shadow:0 2px 8px rgba(24,92,168,.18)}
.dlbox .hd .act a.dload:hover{background:#12467e;border-color:#12467e}
.dlbox .body{padding:18px 22px 20px}
.dlbox .frow{display:flex;gap:14px;padding:7px 0;border-bottom:1px dashed #eaf0f6;font-size:14px}
.dlbox .frow:last-of-type{border-bottom:0}
.dlbox .frow .k{flex:0 0 84px;color:var(--muted);font-size:13px;line-height:1.9}
.dlbox .frow .v{flex:1;color:var(--navy);word-break:break-all;line-height:1.7}
.dlbox .tip{margin:12px 0 0;font-size:13px;color:var(--muted);line-height:1.8}
@media (max-width:640px){
  .dlbox .hd{flex-wrap:wrap;gap:9px}
  .dlbox .hd b{flex:1 1 100%;order:2}
  .dlbox .hd .act{order:3;flex:1 1 100%}
  .dlbox .hd .act a{flex:1;text-align:center}
}

/* ==========================================================
   首页顶部 · 整行照片轮播
   ----------------------------------------------------------
   内容与顺序都在后台「首页管理」里配。
   --hb-h 是桌面端最大高度；窄屏按 34vw 自动变矮。
   只有一张照片时不显示箭头/圆点，也不自动切换。
   ========================================================== */
.hb{position:relative;background:var(--navy)}
.hb-vp{position:relative;width:100%;height:clamp(190px,32vw,var(--hb-h,420px));overflow:hidden}
.hb-tr{position:absolute;inset:0}
.hb-sl{position:absolute;inset:0;display:block;opacity:0;transition:opacity .7s ease}
.hb-sl.on{opacity:1}
/* 照片适配：默认「填满整行」，可在后台切成不裁切的两种 */
.hb-sl .hb-mn{display:block;width:100%;height:100%}
.hb.fit-cover .hb-mn{object-fit:cover}
.hb.fit-contain .hb-mn,.hb.fit-blur .hb-mn{object-fit:contain}
.hb.fit-contain .hb-vp{background:#0d2242}
.hb.fit-blur .hb-vp{background:#0d2242}
/* 完整显示时，两侧空白用同一张图放大虚化补上 */
.hb.fit-blur .hb-bl{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover;
  transform:scale(1.25);filter:blur(30px) saturate(1.15);opacity:.5}
.hb.fit-blur .hb-mn{position:relative;z-index:1}
.hb-nv{position:absolute;top:50%;transform:translateY(-50%);z-index:3;width:44px;height:44px;
  border:0;border-radius:50%;cursor:pointer;padding:0 0 3px;line-height:1;
  font-size:26px;font-family:var(--serif);color:var(--navy);background:rgba(255,255,255,.82);
  box-shadow:0 4px 14px rgba(16,47,82,.2);backdrop-filter:blur(6px);transition:.22s;opacity:.9}
.hb-nv:hover{background:#fff;opacity:1}
.hb-pv{left:22px}
.hb-nx{right:22px}
.hb-dots{position:absolute;left:0;right:0;bottom:16px;z-index:3;display:flex;justify-content:center;gap:9px}
.hb-dots button{width:9px;height:9px;padding:0;border:0;border-radius:50%;cursor:pointer;
  background:rgba(255,255,255,.55);box-shadow:0 1px 4px rgba(11,36,62,.35);transition:.22s}
.hb-dots button.on{background:#fff;width:26px;border-radius:6px}

/* ==========================================================
   出版物 · 3:4 TOC 图卡片网格
   ========================================================== */
.filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 20px}
.filters .lb2{font-size:13px;color:var(--muted);margin-right:2px}
.chip{border:1px solid var(--line);background:#fff;border-radius:20px;padding:6px 15px;font-size:13.5px;
  color:var(--ink-2);cursor:pointer;transition:.2s;line-height:1.6}
.chip:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-50)}
.chip.on{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:500}

.tocgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:22px}
.tcard{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  display:flex;flex-direction:column;cursor:pointer;transition:.26s;box-shadow:var(--sh-1)}
.tcard:hover{transform:translateY(-5px);box-shadow:var(--sh-2);border-color:#cfe2f7}
/* 整块填充：上传的 TOC 图铺满整个 4:3 卡片，不再留白 / 不再被遮罩压暗 */
.tcard .ph{position:relative;aspect-ratio:4/3;background:#f4f8fc;overflow:hidden;
  display:grid;place-items:center}
.tcard .ph.fill{display:block;background:#eef4fa}
.tcard .ph.fill:before,.tcard .ph.fill:after{display:none}
.tcard .ph img{position:relative;z-index:2;width:100%;height:100%;object-fit:cover;
  object-position:center;transition:.5s;display:block}
.tcard:hover .ph img{transform:scale(1.035)}
.tcard .ph .no{font-family:var(--serif);font-size:40px;color:#c9dced;letter-spacing:.02em}
/* 重点推荐小黄星（后台可勾选） */
.stk{display:inline-block;vertical-align:middle;color:#f5b301;font-size:15px;line-height:1;
  text-shadow:0 1px 3px rgba(120,80,0,.28);margin-left:5px}
.tcard .ph .stk{position:absolute;top:10px;right:11px;z-index:4;font-size:19px;margin:0;
  text-shadow:0 2px 8px rgba(0,0,0,.45);filter:drop-shadow(0 1px 2px rgba(0,0,0,.35))}
.stkc{display:inline-block;font-size:11.5px;font-weight:700;letter-spacing:.04em;color:#8a5b00;
  background:linear-gradient(180deg,#fff5d6,#ffe9ab);border:1px solid #f2d489;border-radius:20px;
  padding:2px 9px;white-space:nowrap}
/* 星章在左、DOI/全文徽标靠右（.dv 自带 margin-left:auto） */
.tcard .ft .dv{margin-left:8px}
.tcard .ft a.dv{color:var(--blue);text-decoration:none;cursor:pointer}
.tcard .ft a.dv:hover{text-decoration:underline}
.dlinks .stkc,.dlinks a.stkc{color:#8a5b00;background:linear-gradient(180deg,#fff5d6,#ffe9ab);
  border:1px solid #f2d489;border-radius:8px;padding:5px 12px;font-size:13px}
.pub .meta .stkc{margin-right:4px}
.rlist .tx .stk{font-size:13px}
/* 列表行末尾的「附件」角标：让人在点之前就知道是能在线看还是要下载 */
.at-chip{display:inline-block;margin-left:9px;padding:1px 8px;border-radius:20px;font-size:11.5px;
  font-weight:500;line-height:1.9;vertical-align:middle;white-space:nowrap;letter-spacing:.02em}
.at-chip.pv{color:#b0332f;background:#fdeceb;border:1px solid #f3cfcc}
.at-chip.dl{color:#8a5b00;background:linear-gradient(180deg,#fff5d6,#ffe9ab);border:1px solid #f2d489}
.tcard .bd{padding:14px 15px 16px;flex:1;display:flex;flex-direction:column}
/* 期刊眉头：期刊名做小徽标行（学术排版惯例：刊名在上、文章标题在下） */
.tcard .jn{font-size:12px;font-weight:700;color:var(--blue);letter-spacing:.05em;
  margin-bottom:6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tcard .jr{font-family:var(--serif);font-size:16px;font-weight:700;color:var(--navy);line-height:1.5}
.tcard:hover .jr{color:var(--blue)}
.tcard .au{font-size:12.5px;color:var(--ink-2);line-height:1.7;margin-top:7px;
  text-align:justify}   /* 作者/说明区：两端对齐，行数自适应不锁三行 */
.tcard .ft{margin-top:auto;padding-top:12px;display:flex;align-items:center;gap:8px;
  font-size:12px;color:var(--muted);border-top:1px solid var(--line-2)}
.tcard .ft:empty{display:none}
.tcard .ft .dv{margin-left:auto;color:var(--blue);font-weight:500;white-space:nowrap}

/* ==========================================================
   详情页 · TOC 图 + 元信息
   ========================================================== */
/* 图片列放大一些（原来 300 / 320px 照片偏小），右侧文字相应右移。
   图片依旧按真实比例完整显示，不裁切。 */
.dtop{display:grid;grid-template-columns:420px 1fr;gap:34px;align-items:start;margin-bottom:8px}
.dtop.news-detail{display:block;margin:0 0 18px}
.dtop.news-detail .dinfo{width:100%;max-width:none}
.dtop.news-detail .dinfo h1{
  white-space:normal;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word
}
/* 组内动态这类纯文字详情页：标题居中、日期行也居中（老师 2026-09-30 要求）。
   论文/成员详情页是左图右文布局，不套用这里的居中。 */
.dtop.news-detail .dinfo h1{text-align:center}
.dtop.news-detail .dinfo .kv{grid-template-columns:auto auto;justify-content:center}
.dtop.news-detail .dinfo .kv dt{text-align:right}
.dtop.news-detail .dinfo .kv dd{text-align:left}
.dtop.mem{grid-template-columns:460px 1fr;gap:38px}
.dtop .pcol{min-width:0}
/* 详情页图片：容器比例由 JS 设为图片真实比例，图片整块铺满 —— 保证完整显示、不裁切 */
.dtop .toc{position:relative;border:1px solid var(--line);border-radius:var(--r);
  aspect-ratio:4/3;background:#f4f8fc;display:grid;place-items:center;overflow:hidden;
  box-shadow:var(--sh-1)}
.dtop .toc.fill{display:block;background:#eef4fa}
.dtop .toc.fill:before,.dtop .toc.fill:after{display:none}
.dtop .toc img{position:relative;z-index:2;width:100%;height:100%;object-fit:cover;
  object-position:center;display:block}
.dtop .toc .no{position:relative;z-index:2}
.dtop .toc .no{font-family:var(--serif);font-size:44px;color:#c5d9ea}
.dtip{margin-top:16px;font-size:14px;line-height:1.8;color:var(--muted);
  background:var(--blue-50);border:1px solid #dbeafe;border-radius:10px;padding:12px 14px}
.dtop .tocl{margin-top:10px;text-align:center;font-size:11.5px;letter-spacing:.14em;
  text-transform:uppercase;color:var(--muted)}
.dinfo{min-width:0}
.dinfo h1{font-size:calc(27px * var(--fz-all,1) * var(--fz-dt,1));line-height:1.42;letter-spacing:-.018em;margin-bottom:12px}
.dinfo .kv{margin-bottom:14px}
.dlinks{display:flex;gap:9px;flex-wrap:wrap;margin-top:4px}
.dlinks a{font-size:13px;color:var(--blue);border:1px solid #cfe2f7;background:var(--blue-50);
  padding:5px 13px;border-radius:8px;transition:.2s}
.dlinks a:hover{background:var(--blue);color:#fff;border-color:var(--blue)}

/* 上下篇导航 */
.pnav{display:flex;gap:14px;margin:34px 0 6px}
.pnav a{flex:1;min-width:0;background:#fff;border:1px solid var(--line);border-radius:var(--r);
  padding:14px 18px;transition:.22s;box-shadow:var(--sh-1)}
.pnav a:hover{border-color:#cfe2f7;box-shadow:var(--sh-2)}
.pnav a .k{font-size:11.5px;color:var(--muted);letter-spacing:.1em;text-transform:uppercase}
.pnav a .t{font-size:14.5px;color:var(--navy);font-weight:500;margin-top:4px;line-height:1.6;
  word-break:break-word}
.pnav a.r{text-align:right}

/* ============ 分页 / 空态 ============ */
.pager{display:flex;justify-content:center;align-items:center;gap:7px;flex-wrap:wrap;margin:34px 0 4px}
.pager button{min-width:36px;height:36px;padding:0 12px;border:1px solid var(--line);background:#fff;
  border-radius:9px;font-size:14px;color:var(--ink-2);cursor:pointer;transition:.2s;line-height:1}
.pager button:hover:not(:disabled):not(.on){border-color:var(--blue);color:var(--blue);background:var(--blue-50)}
.pager button.on{background:linear-gradient(135deg,var(--blue),var(--blue-2));color:#fff;
  border-color:transparent;font-weight:600;box-shadow:var(--sh-blue)}
.pager button:disabled{opacity:.4;cursor:default}
.pager .pg-nav{padding:0 15px;font-size:13.5px}
.pager .gap{color:var(--muted);padding:0 2px;user-select:none}
.pager .info{font-size:12.5px;color:var(--muted);margin-left:8px}
.more-wrap{text-align:center;margin:30px 0 6px}
.more-btn{padding:11px 32px;border-radius:10px;border:1px solid var(--line);background:#fff;
  color:var(--ink-2);font-size:14.5px;cursor:pointer;transition:.22s}
.more-btn:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-50)}
.empty{padding:70px 0;text-align:center;color:var(--muted)}
.empty a{color:var(--blue);text-decoration:underline}

/* ============ 统计条 ============ */
.stats{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;margin-top:26px}
.stat{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:20px 22px;box-shadow:var(--sh-1)}
.stat b{display:block;font-size:30px;font-weight:700;color:var(--navy);line-height:1.2;
  font-family:var(--serif);letter-spacing:-.01em}
.stat b i{font-style:normal;font-size:14px;color:var(--muted);font-weight:400;margin-left:3px}
.stat span{font-size:13.5px;color:var(--muted)}

/* ============ 方向卡片 ============ */
.dgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}
.dcard{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:24px 24px 22px;
  position:relative;overflow:hidden;transition:.26s;box-shadow:var(--sh-1)}
.dcard:hover{transform:translateY(-4px);box-shadow:var(--sh-2);border-color:#cfe2f7}
.dcard .no{font-family:var(--serif);font-size:32px;font-weight:700;color:var(--blue-100);line-height:1;margin-bottom:10px}
.dcard h4{font-size:16px;line-height:1.6;margin-bottom:7px}
.dcard .en{font-size:12.5px;color:var(--muted);line-height:1.65;min-height:3.2em}
.dcard p{font-size:14px;color:var(--ink-2);line-height:1.85;margin-top:10px;padding-top:12px;
  border-top:1px solid var(--line-2)}

/* ============ 页脚 ============ */
.footer{background:var(--navy);color:rgba(255,255,255,.7);padding:52px 0 26px;margin-top:20px}
.footer .fg{display:grid;grid-template-columns:1.5fr 1.1fr;gap:48px}
.footer .fg.has-wx{grid-template-columns:1.32fr 1fr 1.1fr;gap:38px}
.footer h5{margin:0 0 16px;font-size:16px;color:#fff;font-weight:600}
/* 页脚标识：同样只放一张图、不垫白底，透明 PNG 直接压在深蓝页脚上 */
.footer .fl{display:flex;align-items:center;margin-bottom:18px}
.footer .fl .mark{height:auto;width:auto;padding:0;border-radius:0;background:transparent;
  display:flex;align-items:center;flex:0 0 auto}
.footer .fl .mark img{display:block;height:var(--foot-logo,46px);width:auto;max-width:420px;object-fit:contain}
.footer .fl .mark.no-img{display:none}
/* 页脚微信公众号：整图按比例放，给足宽度才扫得动 */
.footer .wx-img{display:block;width:100%;max-width:420px;border-radius:12px;overflow:hidden;
  background:transparent;padding:0;line-height:0;transition:.25s}
.footer .wx-img:hover{transform:translateY(-2px);opacity:.92}
.footer .wx-img img{display:block;width:100%;height:auto}
.footer .wx-tip{margin-top:11px;font-size:13px;line-height:1.7;color:rgba(255,255,255,.6)}
.footer .ct li{display:flex;gap:9px;font-size:14px;line-height:1.85;margin-bottom:10px;color:rgba(255,255,255,.72)}
.footer .ct b{color:rgba(255,255,255,.95);font-weight:500;flex:0 0 42px}
.footer .ct li span{flex:1;min-width:0}
.footer .bot{margin-top:34px;padding-top:18px;border-top:1px solid rgba(255,255,255,.13);
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;font-size:12.5px;color:rgba(255,255,255,.45)}

.to-top{position:fixed;right:26px;bottom:30px;width:44px;height:44px;border-radius:12px;display:grid;
  place-items:center;background:#fff;border:1px solid var(--line);box-shadow:var(--sh-2);cursor:pointer;
  color:var(--navy);z-index:60;opacity:0;pointer-events:none;transition:.25s;font-size:17px}
.to-top.on{opacity:1;pointer-events:auto}
.to-top:hover{color:var(--blue)}

/* 灯箱：必须用 #lb 限定，不能用 .lb ——
   .lb 这个类名同时被 .subnav .lb / .pi-field .lb / .pi-tags .lb / .abstract .lb
   当作小标签使用，若在这里写成 .lb 会把那些标签也变成全屏遮罩，导致整页被盖住。 */
#lb{position:fixed;inset:0;background:rgba(10,28,48,.92);z-index:200;display:none;
  align-items:center;justify-content:center;padding:40px}
#lb.on{display:flex}
#lb img{max-width:92%;max-height:80%;border-radius:12px;box-shadow:0 24px 60px rgba(0,0,0,.5)}
#lb .cap{position:absolute;bottom:32px;left:0;right:0;text-align:center;color:#fff;font-size:15px;padding:0 30px}
#lb .x{position:absolute;top:22px;right:30px;color:#fff;font-size:34px;cursor:pointer;opacity:.85;line-height:1}
#lb .x:hover{opacity:1}

/* ============ 响应式 ============ */
@media (max-width:1120px){
  .mgrid,.ggrid,.cgrid,.tocgrid{grid-template-columns:repeat(3,1fr)}
  .pi-hero{grid-template-columns:340px 1fr;gap:28px}
  .dtop{grid-template-columns:340px 1fr;gap:26px}
  .dtop.mem{grid-template-columns:360px 1fr;gap:28px}
}
/* 导航单独一档：字号加大后 9 个栏目在 1200 以下就会开始挤 logo，这里先收一档 */
@media (max-width:1200px){
  .header .wrap{gap:14px;height:84px}
  .brand .mark,.brand .mark img{height:calc(var(--nav-logo,48px) * .92)}
  .nav{gap:5px}
  .nav a{padding:10px 12px;font-size:calc(16px * var(--fz-all,1) * var(--fz-nav,1));letter-spacing:0}
  .nav a.on:after{left:12px;right:12px}
}
@media (max-width:920px){
  .header .wrap{height:auto;padding:12px 0;flex-wrap:wrap}
  .burger{display:block}
  .nav{display:none;width:100%;flex-direction:column;align-items:stretch;margin:8px 0 4px;gap:3px}
  .nav.open{display:flex}
  .nav a{padding:13px 16px;font-size:calc(17px * var(--fz-all,1) * var(--fz-nav,1))}
  .nav a:hover{background:var(--head-hover)}
  .nav a.on:after{display:none}
  .nav a.on{background:var(--head-onbg)}
  /* 窄屏下品牌带收一档，别把首屏挤满；两个 logo 仍等高，只是间距缩小 */
  .bbar .wrap{height:calc(var(--bb-h,132px) * .78);gap:calc(var(--bb-gap,56px) * .6)}
  .wrap{padding:0 22px}
  .pi-hero{grid-template-columns:1fr;gap:22px}
  .pi-col{max-width:460px;width:100%;margin:0 auto}
  .pgrid,.ngrid,.dgrid,.fgrid,.bkgrid{grid-template-columns:repeat(2,1fr)}
  .mgrid,.ggrid,.cgrid,.tocgrid{grid-template-columns:repeat(2,1fr)}
  .tocgrid{grid-template-columns:repeat(2,1fr) !important}
  .mgrid.c3{grid-template-columns:repeat(2,1fr);max-width:none}
  .mgrid.c3 .pcard .ph{aspect-ratio:3/4}
  .stats{grid-template-columns:repeat(2,1fr)}
  .hb-vp{height:clamp(180px,46vw,300px)}
  .hb-nv{width:38px;height:38px;font-size:22px}
  .hb-pv{left:12px}
  .hb-nx{right:12px}
  .dtop,.dtop.mem{grid-template-columns:1fr;gap:20px}
  .dtop .toc{max-width:560px;margin:0 auto}
  .mgrid.mh{grid-template-columns:1fr}
  .pb{padding:32px 0 8px}
  .pb h1{font-size:31px}
  .pb-en{font-size:15.5px;margin-left:10px}
  .pb .sub{font-size:16px;margin-top:10px}
  .dinfo h1{font-size:24px}
  .footer .fg,.footer .fg.has-wx{grid-template-columns:1fr;gap:26px}
  .dhead h1{font-size:24px}
}
@media (max-width:600px){
  .mgrid,.ggrid,.cgrid,.ngrid,.dgrid,.fgrid,.pgrid,.tocgrid,.bkgrid{grid-template-columns:1fr}
  .mgrid.c3{grid-template-columns:1fr;max-width:none}
  .mgrid.c3 .pcard .ph{aspect-ratio:3/4}
  .tocgrid{gap:16px}
  .ggrid{grid-template-columns:repeat(2,1fr);gap:12px}
  .pub{grid-template-columns:34px 1fr;gap:10px}
  .kv{grid-template-columns:88px 1fr}
  .pi-name{font-size:26px}
  .pcard.h{grid-template-columns:104px 1fr}
  .pcard.h .ph{min-height:130px}
  .mgrid.mh{grid-template-columns:1fr}
  .footer .bot{flex-direction:column;gap:6px}

  /* 成果卡片手机端紧凑化（2026-10-04）：后台列数是行内样式会压掉上面的响应式，
     这里用 !important 夺回来；作者区取消两端对齐并限 3 行，卡片不再被拉成长条 */
  .tocgrid{grid-template-columns:1fr !important}
  .tcard .au{text-align:left;display:-webkit-box;-webkit-line-clamp:3;
    -webkit-box-orient:vertical;overflow:hidden;line-height:1.55;margin-top:6px}
  .tcard .bd{padding:12px 13px 13px}
  .tcard .jr{font-size:15px;line-height:1.45}
  .tcard .ph{aspect-ratio:16/10}
  .tcard .ft{padding-top:9px}
}
  /* 窄屏：logo 收一档，避免顶栏被长方形 logo 撑出横向滚动 */
  .brand .mark,.brand .mark img{height:calc(var(--nav-logo,48px) * .8)}
  .brand .mark img{max-width:210px}
  .brand .mark.no-img{width:calc(var(--nav-logo,48px) * .8);font-size:10px;border-radius:9px}
  .footer .fl .mark img{height:calc(var(--foot-logo,46px) * .8);max-width:220px}
  .pb{padding:26px 0 6px}
  .pb h1{font-size:27px}
  .pb-en{display:block;margin:7px 0 0;font-size:15px}
  .pb .sub{font-size:15.5px}
  .pb .crumb{font-size:13.5px}
  .bbar .wrap{height:calc(var(--bb-h,132px) * .62);gap:calc(var(--bb-gap,56px) * .42)}
  .bbar .slot{max-width:46%}
}

/* ==========================================================
   按钮的「小号 / 主色 / 次要」三种规格
   后台 admin.css 里一直有，前台之前只有基础 .btn；
   预约页、仪器卡片都要用小号按钮，这里补上（不影响已有页面）。
   ========================================================== */
.btn.s{padding:7px 15px;font-size:13.5px;border-radius:9px}
.btn.p{background:linear-gradient(135deg,var(--blue),var(--blue-2));color:#fff;border-color:transparent;
  box-shadow:0 6px 18px rgba(30,111,196,.2)}
.btn.p:hover{transform:translateY(-1px);box-shadow:0 10px 24px rgba(30,111,196,.3)}
.btn.ghost{background:#fff;border-color:var(--line);color:var(--ink-2)}
.btn.ghost:hover{border-color:var(--blue);color:var(--blue)}
.btn.danger{background:linear-gradient(135deg,#d9463f,#e8665e);border-color:transparent;
  box-shadow:0 6px 18px rgba(217,70,63,.22)}
.btn.danger:hover{box-shadow:0 10px 24px rgba(217,70,63,.3)}
.btn.dis,.btn[disabled]{opacity:.45;cursor:not-allowed;pointer-events:none}
a.btn.dis{pointer-events:none}

/* ==========================================================
   仪器预约
   ------------------------------------------------------------
   .bktable 是一张真正的表格：行 = 时段，列 = 日期。
   格子四态：free 可约 / mine 我约的 / busy 别人约的 / past 已过期。
   窄屏时表格横向滚动，第一列（时段）吸在左边不动。
   ========================================================== */

/* 顶栏：我是谁 + 可约规则 + 退出 */
.bkbar{display:flex;align-items:center;gap:14px;flex-wrap:wrap;background:#fff;border:1px solid var(--line);
  border-radius:var(--r);padding:12px 18px;box-shadow:var(--sh-1);margin-bottom:18px}
.bkbar-me{display:flex;align-items:center;gap:9px;font-weight:600;color:var(--navy)}
.bkbar-me img{width:32px;height:32px;border-radius:50%;object-fit:cover;border:1px solid var(--line)}
.bkbar-me em{font-style:normal;font-weight:400;font-size:13px;color:var(--muted)}
.bk-adm{font-style:normal;font-size:11.5px;font-weight:600;padding:2px 8px;border-radius:6px;
  background:var(--gold-100);color:#a9701d}
/* 「← 返回仪器列表」这类导航动作一律按钮化（老师要求：全站不许再有裸文字按钮） */
.bkback{display:inline-flex;align-items:center;gap:6px;padding:7px 14px;border-radius:9px;
  font-size:13px;font-weight:600;color:var(--blue);background:#fff;border:1px solid var(--line);
  transition:.2s;margin-right:4px}
.bkback:hover{border-color:var(--blue);background:var(--blue-50);text-decoration:none}
.bkbar-meta{margin-left:auto;font-size:13px;color:var(--muted)}
/* 2026-09-29：顶栏右上角原来那排「★ 我的 / 我的资料 / 退出」整块撤了 ——
   资料和密码都并进「个人中心」，退出也在个人中心的侧栏菜单里，
   再留三个按钮既占地方又和左上角那个「← 个人中心」重复。
   配套删掉的：.bkbar-out / .bkbar-link / .bkbar-me2 这三个 class 的样式
   （源码里已经没有任何地方用它们，留着只会让人以为是还在用的东西）。 */
/* 「姓名还没读到」的提醒条 */
.bkhelp{display:flex;gap:10px;flex-wrap:wrap;align-items:baseline;background:#fffaf0;
  border:1px solid #f0d9a8;border-radius:var(--r);padding:12px 18px;margin-bottom:18px;
  font-size:13.5px;line-height:1.7;color:var(--ink-2)}
.bkhelp b{color:#a9701d;flex:none}
.bkhelp code{background:#fff;border:1px solid #f0d9a8;border-radius:5px;padding:1px 7px;font-size:12.5px}
/* 「预约要实名」拦截条：差姓名/手机号就横在页面最上面，附一个去补全的按钮 */
.bkneed{display:flex;align-items:center;gap:14px;background:#fff4f4;border:1px solid #f3c9c9;
  border-left:4px solid var(--err);border-radius:var(--r);padding:14px 18px;margin-bottom:18px}
.bkneed-ic{font-size:22px;line-height:1;flex:none}
.bkneed-tx{flex:1 1 auto;min-width:0}
.bkneed-tx b{display:block;font-size:14.5px;color:#b3272b;margin-bottom:3px}
.bkneed-tx span{display:block;font-size:13px;line-height:1.7;color:var(--ink-2)}
.bkneed .btn{flex:none}
@media (max-width:640px){
  .bkneed{flex-wrap:wrap}
  .bkneed .btn{width:100%;justify-content:center}
}
/* 我的资料：改名卡片 */
.bkprof{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:20px 22px;
  box-shadow:var(--sh-1);margin-bottom:26px}
.bkprof h3{margin:0;font-size:16px;color:var(--navy)}
.bkprof-form{display:flex;gap:10px;align-items:center;flex-wrap:wrap}
.bkprof-form input[type=text]{width:220px;padding:9px 12px;border:1px solid var(--line);
  border-radius:9px;font-size:14px;font-family:inherit;color:var(--ink)}
.bkprof-form input[type=text]:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-50)}
/* 「预约实名资料」表单：姓名 / 手机号 / 企业邮箱两列排，窄屏自动单列 */
.bkprof-id{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;align-items:start}
@media (max-width:820px){.bkprof-id{grid-template-columns:1fr}}
.bkprof-fld{display:block;min-width:0}
.bkprof-fld>b{display:block;font-size:13px;color:var(--ink-2);margin-bottom:6px}
.bkprof-fld input[type=text]{width:100%;box-sizing:border-box;padding:9px 12px;border:1px solid var(--line);
  border-radius:9px;font-size:14px;font-family:inherit;color:var(--ink);background:#fff}
.bkprof-fld input[type=text]:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-50)}
/* 只读字段（比如管理员分配的企业邮箱）：一眼看出不能改 */
.bkprof-fld input[readonly]{background:#f6f8fa;color:var(--ink-2);cursor:default}
.bkprof-fld .mini{display:block;margin-top:6px;line-height:1.6}
.bkprof-ops{grid-column:1/-1;display:flex;gap:10px;align-items:center;flex-wrap:wrap;
  border-top:1px dashed var(--line);padding-top:14px}
.bkprof-locked .v{font-size:15px;color:var(--navy);font-weight:600}
/* 我的资料：四张卡片两列排（窄屏自动单列） */
.bkprof-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:18px;margin-bottom:8px}
@media (max-width:820px){.bkprof-grid{grid-template-columns:1fr}}
.bkprof-grid .bkprof{margin-bottom:0}
.bkprof-lock{display:inline-block;margin-left:8px;font-style:normal;font-size:12px;font-weight:400;
  background:#eef4fb;color:#2b5f96;border:1px solid #d6e8fb;border-radius:20px;padding:2px 10px}
.bkprof-locked{background:var(--blue-50);border:1px dashed #c9dcf3;border-radius:10px;padding:14px 16px}
.bkprof-locked .v{font-size:19px;font-weight:700;color:var(--navy);margin-bottom:6px}
.bkprof-locked span{font-size:13px;color:var(--muted);line-height:1.85}
.bkprof-locked b{color:#143d68}
.bkprof-pass{flex-direction:column;align-items:stretch;gap:9px}
.bkprof-pass input[type=password]{width:100%;box-sizing:border-box;padding:9px 12px;border:1px solid var(--line);
  border-radius:9px;font-size:14px;font-family:inherit;color:var(--ink)}
.bkprof-pass input[type=password]:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px var(--blue-50)}
.bkprof-pass button{align-self:flex-start;margin-top:3px}
/* 姓名锁定后的提示弹窗 */
.bkdlg h3{font-size:17px;margin-bottom:12px}
.bkdlg-btns{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}

/* 图例 */
.bklegend{display:flex;flex-wrap:wrap;gap:8px 20px;font-size:13px;color:var(--ink-2);margin-bottom:14px}
.bklegend span{display:inline-flex;align-items:center;gap:7px}
.bklegend .lg{width:16px;height:16px;border-radius:5px;border:1px solid;flex:none}
.lg.free{background:#fafdff;border-color:#d9e8f8}
.lg.mine{background:linear-gradient(165deg,#5d9ce8,#3a7bc8);border-color:#3a7bc8}
.lg.busy{background:#e9edf2;border-color:#d7dee7}
.lg.past{background:#eef1f5;border-color:#e0e5ec}

/* 翻页条 */
.bkwk{display:flex;align-items:center;justify-content:center;gap:14px;margin-bottom:14px}
.bkwk-t{font-size:13.5px;color:var(--muted)}

/* 表格本体 */
/* ---------- 日程表 ----------
   列宽必须**固定**：以前是 table-layout:auto，列宽由内容决定 ——
   站台方块多一个列就宽一点，预约成功后格子里从「+」换成「我」列宽又变一次，
   拖选高亮时整行重排，结果就是老师说的「一填就莫名很长、会乱跳、日期都被挤没了」。
   现在 table-layout:fixed：列宽只由「第一行的宽度」决定，格子里的内容再怎么变，
   列宽纹丝不动。表格的 min-width 由 PHP 按「站台数 × 天数」算好内联上来，
   窗口不够宽就让 .bkscroll 横向滚动，绝不压列。 */
.bkscroll{overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--line);
  border-radius:var(--r);background:#fff;box-shadow:var(--sh-1)}
/* 紧凑时间轴日历（老师反馈「约很多表格会变长，别用表格了」）：
   行高压到 26px、去掉格子的常驻边框、被约时段显示为**整条色带** ——
   视觉上不再是一张大表格，而是一根根彩色时段带；整个表一屏看全，
   约再多高度也纹丝不动（格子高度锁死，色带 absolute 不撑行）。 */
.bktable{border-collapse:separate;border-spacing:0;width:100%;min-width:640px;
  table-layout:fixed;font-size:12.5px}
.bktable th{border-bottom:1px solid var(--line);background:var(--blue-50);color:var(--ink-2);font-weight:600}
.bktable thead th{padding:7px 5px;text-align:center;line-height:1.35}
.bktable thead th b{display:block;color:var(--navy);font-size:13px}
.bktable thead th em{display:block;font-style:normal;font-size:11px;font-weight:400;color:var(--muted)}
.bktable thead th.we{background:var(--gold-100)}
.bktable thead th.we b{color:#a9701d}
.bktable thead th.we em{color:#b98a4a}
/* 今天那一列给个明显标记：底色深一档 + 顶部蓝条 */
.bktable thead th.today{background:#d8eafb;box-shadow:inset 0 3px 0 var(--blue)}
.bktable thead th.today b{color:var(--blue)}
.bktable thead th.today em{color:var(--blue);font-weight:600}
.bktable th.h{position:sticky;left:0;z-index:2;width:76px;min-width:76px;padding:5px 6px;text-align:center;
  background:var(--blue-50);color:var(--ink-2);font-variant-numeric:tabular-nums;border-right:1px solid var(--line)}
.bktable tbody th.h{background:#fafcfe;color:var(--muted);font-weight:500;font-size:11.5px}
.bktable td{border-bottom:1px solid var(--line-2)}
.bktable tbody tr:last-child td{border-bottom:0}

/* 格子 */
.bkcell{height:26px;min-width:64px;text-align:center;vertical-align:middle;cursor:default;
  font-size:12px;color:var(--muted);transition:background .15s,border-color .15s;
  border-right:1px solid var(--line-2);position:relative;overflow:hidden}
/* 可预约：极淡底，不再每个格子描边框（几十个框框排在一起就是「表格感」的来源）；
   悬停时才亮出可点的样子 */
.bkcell.free{background:#f8fbfe;cursor:pointer}
.bkcell.free:hover{background:var(--blue-100);box-shadow:inset 0 0 0 2px var(--blue-2);color:var(--blue)}
.bkcell.free:after{content:"+";position:absolute;inset:0;display:grid;place-items:center;
  color:#c2d9f0;font-size:13px;font-weight:400;opacity:0;transition:opacity .15s}
.bkcell.free:hover:after{opacity:1}
.bkcell.mine{cursor:pointer}
.bkcell.mine:hover .bkb{filter:brightness(.94)}
.bkcell.busy{background:transparent}
.bkcell.past{background:#f2f4f7;color:#b3bcc7;cursor:not-allowed}
.bkcell.past:after{content:"";position:absolute;left:7px;right:7px;top:50%;height:1px;background:#cdd6df}

/* ---------- 预约色带 ----------
   被约的格子不再是一格一个「我」文字块（约一整天整列全是重复小块，
   老师说「表格会变长」），而是**整格填充的色带**：
   · 同一个人连续约的相邻格，服务端标好 data-cu / data-cd，
     上下格去圆角、色带向上多伸 1px 盖住中间分隔线 → 视觉上合成一条；
   · 文字（我 / 姓名 / 已约）只出现在色带首格，后续格留白；
   · 「我的」色带 = 蓝渐变白字；别人的 = 他的头像色（td 上着色，色带 inherit）。 */
.bkb{position:absolute;left:0;right:0;top:0;bottom:0;display:flex;align-items:center;justify-content:center;
  border-radius:7px;font-weight:700;font-size:11.5px;letter-spacing:.02em;
  background:inherit;color:inherit;pointer-events:none}
.bkcell.mine .bkb{background:linear-gradient(165deg,#5d9ce8,#3a7bc8);color:#fff;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.22)}
.bkcell.busy:not(.avfill) .bkb{background:#e9edf2;color:#7e8b9c;font-weight:600;
  box-shadow:inset 0 0 0 1px #d7dee7}
.bkcell.avfill .bkb{font-weight:700}
.bkcell[data-cu] .bkb{top:-1px;bottom:0;height:calc(100% + 1px);
  border-top-left-radius:0;border-top-right-radius:0}
.bkcell[data-cd] .bkb{border-bottom-left-radius:0;border-bottom-right-radius:0}
/* 连体段内部不放分隔线：border 画在色带包含块之外，负偏移盖不住，
   直接把段内格子的下边框透明掉（border 仍占位，行高不变） */
.bkcell[data-cd]{border-bottom-color:transparent}

/* 说明 / 须知 */
.bktip{margin-top:14px;font-size:13.5px;color:var(--muted);line-height:1.8}
.bktip b{color:var(--ink-2)}

/* ---------- 批量取消测试（横条 + 下拉）----------
   仪器清单页顶部一条 / 个人中心「仪器预约信息」标题旁。
   下拉里按「用途备注」聚合：同一条备注的格子算一个测试，一键全取消。 */
.bkbulk{display:flex;align-items:center;gap:14px;padding:11px 16px;margin-bottom:16px;
  background:var(--blue-50);border:1px solid #d6e8fb;border-radius:12px;font-size:13.5px;color:var(--ink-2)}
.bkbulk-t b{color:var(--navy)}
.bkbulk-host{position:relative;margin-left:auto}
.bkcm-btn{border:1px solid #f0c8c4;background:#fff;color:#b3352f;font-weight:600;font-size:13px;
  padding:7px 14px;border-radius:20px;cursor:pointer;transition:.15s}
.bkcm-btn:hover{background:#fdeeee;border-color:#eab8b3}
.bkcm-btn:disabled{opacity:.55;cursor:wait}
.bkcm{position:absolute;right:0;top:calc(100% + 8px);z-index:60;min-width:290px;max-width:360px;
  background:#fff;border:1px solid var(--line);border-radius:14px;padding:8px;
  box-shadow:0 18px 48px rgba(14,47,82,.18)}
.bkcm-h{font-size:12px;color:var(--muted);padding:6px 10px 8px;border-bottom:1px solid var(--line-2);margin-bottom:6px}
.bkcm-it{display:block;width:100%;text-align:left;background:transparent;border:0;cursor:pointer;
  padding:9px 10px;border-radius:9px;font-size:13px;color:var(--ink);transition:background .13s}
.bkcm-it:hover{background:var(--blue-50)}
.bkcm-it b{display:block;font-weight:600;color:var(--navy);margin-bottom:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bkcm-it .mini{display:block;font-size:11.5px}
.bkcm-it.all{margin-top:6px;border-top:1px dashed var(--line-2);border-radius:0 0 9px 9px;
  color:#b3352f;font-weight:600;padding-top:11px}
.bkcm-it.all:hover{background:#fdeeee}
.bknote{background:var(--blue-50);border:1px solid #d6e8fb;border-radius:12px;color:#2b5f96;
  padding:12px 16px;font-size:14px;line-height:1.85;margin-bottom:18px;white-space:pre-wrap}

/* 提示条：保存成功 / 出错 */
.msg{padding:11px 15px;border-radius:10px;margin-bottom:15px;font-size:13.5px;line-height:1.75}
.msg.ok{background:#e8f8f1;border:1px solid #c3e8d9;color:#10754f}
.msg.err{background:#fdeeee;border:1px solid #f5cdcd;color:#a8382f}
.mini{font-size:12.5px;color:var(--muted);font-weight:400}

/* ==========================================================
   仪器管理员：在这台仪器的日程表上直接改开放设置
   ========================================================== */
.bkadm{border:1px solid var(--line);border-radius:var(--r);background:#fff;margin:0 0 18px;overflow:hidden;
  box-shadow:var(--sh-1)}
.bkadm>summary{cursor:pointer;padding:13px 18px;display:flex;flex-wrap:wrap;align-items:center;gap:9px;
  background:var(--blue-50);border-bottom:1px solid var(--line-2);font-size:14.5px;color:var(--navy);
  list-style:none;user-select:none}
.bkadm>summary::-webkit-details-marker{display:none}
.bkadm>summary:before{content:"\25B8";color:var(--blue);font-size:13px;transition:transform .18s;display:inline-block}
.bkadm[open]>summary:before{transform:rotate(90deg)}
.bkadm>summary b{font-weight:600}
.bkadm-f{padding:18px}
.bkadm-row{margin-bottom:14px;display:flex;flex-wrap:wrap;align-items:center;gap:10px}
.bkadm-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:0 16px;margin-bottom:12px}
.bkfld{margin-bottom:13px}
.bkfld>label{display:block;font-size:13px;font-weight:600;color:var(--ink-2);margin-bottom:6px}
.bkfld>label .tip{font-weight:400;color:var(--muted);font-size:12px;margin-left:6px}
.bkfld input[type=text],.bkfld input[type=number],.bkfld textarea{
  width:100%;border:1px solid var(--line);border-radius:9px;padding:8px 11px;font-size:13.5px;
  font-family:inherit;background:#fff;color:var(--ink)}
.bkfld input:focus,.bkfld textarea:focus{outline:0;border-color:var(--blue);box-shadow:0 0 0 3px rgba(37,110,190,.12)}
.bkfld input[type=checkbox]{width:auto;margin:0;flex:none;accent-color:var(--blue);cursor:pointer}
.bkfld label.chk{display:inline-flex;align-items:center;gap:7px;font-size:13px;font-weight:400;
  color:var(--ink-2);margin:0;cursor:pointer}
.bkadm-days{display:flex;flex-wrap:wrap;gap:9px 16px}
.bkadm-days .chk{font-size:13px;color:var(--ink-2)}
.bkadm-ops{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding-top:14px;
  border-top:1px dashed var(--line-2)}
.bkadm-p{padding:13px 18px;background:var(--blue-50);border-top:1px solid var(--line-2);font-size:13px;
  color:var(--ink-2);display:flex;flex-wrap:wrap;align-items:center;gap:9px}
.bkadm-p b{color:var(--navy)}
.bkadm-p1{display:inline-flex;align-items:center;gap:6px;background:#fff;border:1px solid var(--line);
  border-radius:20px;padding:3px 12px 3px 4px;font-size:12.5px}
.bkadm-p1 img{width:24px;height:24px;border-radius:50%;object-fit:cover;flex:none}
.bkadm-p1 em{font-style:normal;color:var(--muted);font-size:11.5px}

/* 一格内按「功能」分成几行（各功能可同时约时用） */
.bktable.multi{min-width:940px}
.bktable.multi .bkcell.multi{min-width:96px}
.bkcell.multi{padding:2px;text-align:left;vertical-align:top}
.bkcell.multi.past{pointer-events:none}
.bkm{display:flex;align-items:center;gap:4px;min-height:16px;margin-bottom:2px;
  padding:1px 6px;border-radius:5px;font-size:10.5px;line-height:1.25;cursor:default;
  border:1px solid transparent;overflow:hidden}
.bkm:last-child{margin-bottom:0}
.bkm .n{font-weight:600;flex:0 0 auto}
.bkm .u{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;opacity:.92}
.bkm.free{background:transparent;border-color:transparent;color:var(--muted);cursor:pointer}
.bkm.free:hover{background:var(--blue-100);border-color:var(--blue-2);color:var(--blue);font-weight:600}
.bkm.mine{background:var(--blue-100);border-color:var(--blue);color:var(--blue);font-weight:700;cursor:pointer}
.bkm.mine:hover{background:#d3e5f9}
.bkm.busy{background:#e9edf2;border-color:#d7dee7;color:#7e8b9c}
.bkm.past{color:#b3bcc7}
.bkcell.multi.past .bkm{border-color:transparent;background:transparent}

/* ==========================================================
   多站台：一格并排放 N 个独立位置（BET 脱气的 6 个站台）
   ----------------------------------------------------------
   1 号站台被人占了，2–6 号同一时段照样能约 —— 所以一格不再是
   「一个洞」，而是一排小方块，一块一块地占。
   ========================================================== */
.bktable.st{min-width:760px}
.bkcell.st{padding:2px 4px;text-align:center;vertical-align:middle;overflow:hidden}
/* 站台方块**不换行**：换行了格子就变两行高，整张表跟着变长、还会左右跳。
   列宽这边保证得够（PHP 按站台数算 min-width），宁可横向滚动也不挤成两行。 */
.bks{display:flex;flex-wrap:nowrap;gap:2px;justify-content:center;align-items:center;
  min-height:13px}
.bks-i{
  display:inline-flex;align-items:center;justify-content:center;
  min-width:13px;height:13px;padding:0 2px;border-radius:4px;
  font-size:9px;font-weight:600;line-height:1;cursor:default;
  border:1px dashed #cdd9e6;background:#fff;color:#9aa9b8;
  transition:background .12s,color .12s,border-color .12s;
}
.bks-i.free{cursor:pointer;border-style:solid;border-color:#dbe7f4;background:#f8fbfe;color:#8fa6bd}
.bks-i.free:hover{background:var(--blue-100);border-color:var(--blue-2);color:var(--blue)}
.bks-i.mine{background:var(--blue-100);border-color:var(--blue);color:var(--blue);font-weight:700;cursor:pointer}
.bks-i.mine:hover{background:#d3e5f9}
.bks-i.busy{background:#e9edf2;border-color:#d7dee7;color:#7e8b9c;border-style:solid}
.bks-i.past{background:#f4f6f9;border-color:#e6eaf0;color:#c3cbd6;border-style:solid;cursor:not-allowed}
.bkcell.st.past .bks-i{cursor:not-allowed}
/* 站台太多（>8）时只写一行「剩 x/N」 */
.bks-n{display:inline-block;font-size:10.5px;color:var(--muted);font-weight:600}
.bkcell.st .bkm{flex-wrap:nowrap;gap:3px}
.bkcell.st .bkm .n{font-size:10px;color:var(--muted);min-width:24px}
/* 功能并行时一格里有好几行（一行一个功能），行高要能自己长；其余格子固定 26px，
   行高统一了表格才不会一格高一格矮地跳 */
.bkcell.multi{height:auto;min-height:26px}

/* 拖选连约：划过的格子高亮，划不动的（满了 / 过期）打叉底 */
.bsel,.bsel.free,.bsel.mine{background:#dcecfc!important;box-shadow:inset 0 0 0 2px var(--blue)!important}
.bsel.free:after{opacity:0!important}
/* 拖选扫过「已被约」的格子：色带要跟着一起反馈（色带是子元素，会盖住 td 的底色） */
.bkcell.bskip .bkb{opacity:.35}
.bkcell.bsel .bkb{box-shadow:inset 0 0 0 2px var(--blue)}
.bskip{background:repeating-linear-gradient(45deg,#f4f6f9,#f4f6f9 5px,#eaeef3 5px,#eaeef3 10px)!important}
/* 连选时长按一下就滑过一片，把浏览器自带的「选蓝文字」关掉，不然满屏蓝色 */
.bktable{user-select:none;-webkit-user-select:none}
/* 没赶上的格子闪一下，让人看清是哪几格 */
.bmiss{animation:bkmisss .8s ease 0s 3}
@keyframes bkmisss{0%,100%{background:transparent}50%{background:#fdecea;box-shadow:inset 0 0 0 2px #e08080}}

/* 拖选时跟着鼠标的一句提示 */
.bksel-tip{
  position:fixed;left:50%;bottom:26px;transform:translate(-50%,14px);
  background:var(--navy);color:#eaf3fd;font-size:13px;font-weight:600;
  padding:9px 18px;border-radius:22px;box-shadow:0 10px 26px rgba(14,47,82,.32);
  opacity:0;pointer-events:none;transition:opacity .14s,transform .14s;z-index:60;
}
.bksel-tip.on{opacity:1;transform:translate(-50%,0)}
.bklegend .lg-drag{margin-left:auto;color:var(--muted);font-size:12px}
@media (max-width:760px){.bklegend .lg-drag{display:none}}

/* 预约弹窗里的点选按钮：功能 / 常用用途，点一下就好，不用打字 */
.bkchips{display:flex;flex-wrap:wrap;gap:7px;margin-top:2px}
.bkchip{border:1px solid var(--line);background:#fff;color:var(--ink-2);border-radius:18px;
  padding:5px 13px;font-size:13px;font-family:inherit;cursor:pointer;transition:.15s;line-height:1.4}
.bkchip:hover{border-color:var(--blue-2);color:var(--blue);background:var(--blue-50)}
.bkchip.on{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:600}

/* 跳到某一天 */
.bkwk-jump{display:inline-flex}
.bkwk-jump input[type=date]{border:1px solid var(--line);border-radius:9px;padding:5px 9px;font-size:13px;
  font-family:inherit;color:var(--ink-2);background:#fff}
.bkwk-jump input:focus{outline:0;border-color:var(--blue)}

/* 「我的预约」列表 */
.bkmine{border:1px solid var(--line);border-radius:var(--r);background:#fff;overflow:hidden;box-shadow:var(--sh-1)}
.bkmine-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:11px 16px;border-bottom:1px solid var(--line-2);font-size:14px}
.bkmine-row:last-child{border-bottom:0}
.bkmine-row .d{font-weight:600;color:var(--navy);font-variant-numeric:tabular-nums}
.bkmine-row .s{color:var(--blue);background:var(--blue-100);border-radius:7px;padding:2px 9px;font-size:12.5px;
  font-variant-numeric:tabular-nums}
.bkmine-row .n{flex:1;min-width:120px;color:var(--ink);font-weight:500}
.bkmine-row .t{color:var(--muted);font-size:13px}
/* 「3 号站台」要一眼看得出来 —— BET 有 6 个站台，约了哪个得知道 */
.bkmine-row .t.stn{color:var(--blue);background:var(--blue-100);border:1px solid #d9e8f8;
  border-radius:7px;padding:1px 8px;font-size:12.5px;font-weight:600;white-space:nowrap}

/* ---------- 预约按天汇总 ----------
   原来一条预约一行、每行都把日期重复一遍，同一天约 6 格就是 6 个「2026-10-01」。
   现在一天一块：日期只出现一次，块头写「共 N 小时 · M 格」，块里才是各时段。 */
.bkd{display:flex;flex-direction:column;gap:14px}
.bkd .bkday{border:1px solid var(--line);border-radius:var(--r);background:#fff;
  overflow:hidden;box-shadow:var(--sh-1)}
.bkday-h{display:flex;align-items:center;gap:10px;padding:10px 16px;background:var(--blue-50);
  border-bottom:1px solid var(--line);flex-wrap:wrap}
.bkday-h b{color:var(--navy);font-size:14.5px;font-variant-numeric:tabular-nums}
.bkday-h em{font-style:normal;font-size:12.5px;color:var(--muted)}
.bkday-sum{margin-left:auto;font-size:12.5px;font-weight:600;color:var(--blue);
  background:#fff;border:1px solid #d9e8f8;border-radius:20px;padding:3px 11px;white-space:nowrap}
.bkday .bkmine-row:last-child{border-bottom:0}
.bkday .bkmine-row .n a{color:var(--ink);text-decoration:none;border-bottom:1px dashed #c8d6e6}
.bkday .bkmine-row .n a:hover{color:var(--blue);border-bottom-color:var(--blue)}
.bkday .bkmine-row .s{min-width:96px;text-align:center}

/* 「只看我的」开关：值日表上排着全组几十号人，学生只想确认哪天轮到自己 */
.monly{display:inline-flex;align-items:center;gap:7px;font-size:13px;color:var(--ink-2);
  cursor:pointer;user-select:none;background:#fff;border:1px solid var(--line);
  border-radius:20px;padding:6px 14px;transition:.18s}
.monly:hover{border-color:var(--blue);color:var(--blue)}
.monly input{width:15px;height:15px;margin:0;accent-color:var(--blue);cursor:pointer}

/* 「个人中心 → 我的资料」：三张卡（实名资料 / 用户名 / 密码）叠成一列，
   卡头沿用按天汇总那套 .bkday 的样式，卡体给点内边距把表单撑开 */
.mprof-card{margin-bottom:14px}
.mpf-b{padding:14px 16px}
.mpf-b .mpass{padding:0}
.mpf-b .mini{margin:0 0 10px;color:var(--muted);font-size:12.5px;line-height:1.6}
.mpf-b input[readonly]{background:#f4f6f9;color:var(--muted);cursor:not-allowed}
.mwho-i .me-tag{font-style:normal;font-size:11px;font-weight:700;color:var(--blue);
  background:var(--blue-100);border-radius:5px;padding:1px 6px}

/* 「个人中心 → 简历修改」：导师自维护简历 */
.cv-photo{display:flex;align-items:center;gap:16px;margin-bottom:18px}
.cv-photo img{width:96px;height:96px;border-radius:14px;object-fit:cover;border:1px solid var(--line)}
.cv-photo-empty{width:96px;height:96px;border-radius:14px;border:1px dashed var(--line);
  display:grid;place-items:center;color:var(--muted);font-size:12.5px;background:#fafcfe}
.cv-photo-ops{display:flex;flex-direction:column;gap:6px}
.cv-fields{display:grid;grid-template-columns:1fr 1fr;gap:12px 16px;margin-bottom:20px}
.cv-f{display:flex;flex-direction:column;gap:6px}
.cv-f .k{font-size:13px;color:var(--muted);font-weight:600}
.cv-f input{width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:9px;
  font-size:14px;font-family:inherit;color:var(--ink);background:#fff}
.cv-f input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,111,196,.12)}
.cv-rt{border:1px solid var(--line);border-radius:12px;overflow:hidden;margin-bottom:18px}
.cv-tb{display:flex;flex-wrap:wrap;gap:4px;padding:8px 10px;background:var(--blue-50);
  border-bottom:1px solid var(--line)}
.cv-tb button{min-width:30px;height:28px;padding:0 8px;border:1px solid var(--line);border-radius:7px;
  background:#fff;color:var(--ink-2);cursor:pointer;font-size:13px;transition:.15s}
.cv-tb button:hover{background:var(--blue-100);color:var(--blue);border-color:#cfe2f7}
.cv-tb-sep{width:1px;height:20px;background:var(--line);margin:0 4px;align-self:center}
.cv-tb .cv-sel{height:28px;padding:0 4px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink);font-size:12.5px;cursor:pointer}
.cv-tb .cv-sel:hover{border-color:#cfe2f7}
.cv-tb .cv-num{height:28px;width:52px;padding:0 4px;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink);font-size:12.5px}
.cv-tb .cv-num:focus{border-color:var(--blue);outline:none}
/* 点字号/字体控件时正文的假选区高亮（选区在输入框聚焦期间仍然可见） */
.cv-fakesel{background:#b3d4fc}
/* 背景色板里的「透明」格：白底红斜线 */
.cv-sw-none{background:#fff!important;position:relative}
.cv-sw-none::after{content:'';position:absolute;left:2px;top:8px;width:14px;height:2px;background:#c0392b;transform:rotate(-45deg)}
/* 颜色按钮上的小色条 + 色板弹层 */
.cv-tb .cbar{display:block;width:16px;height:4px;border-radius:2px;margin:1px auto 0}
.cv-palette{position:absolute;z-index:80;top:calc(100% + 6px);left:0;background:#fff;
  border:1px solid var(--line);border-radius:10px;padding:10px;box-shadow:0 12px 32px rgba(14,47,82,.16)}
.pal-grid{display:grid;grid-template-columns:repeat(8,20px);gap:5px}
.cv-sw{display:block;width:20px;height:20px;border-radius:5px;cursor:pointer;border:1px solid rgba(0,0,0,.12);transition:.12s}
.cv-sw:hover{transform:scale(1.18);border-color:var(--navy)}
.pal-custom{display:flex;align-items:center;gap:6px;margin-top:9px;font-size:12px;color:var(--ink-2)}
.pal-custom input[type=color]{width:34px;height:24px;border:1px solid var(--line);border-radius:5px;
  padding:1px;background:#fff;cursor:pointer}
.cv-edit{min-height:260px;max-height:520px;overflow-y:auto;padding:16px 18px;font-size:14.5px;
  line-height:1.8;color:var(--ink);outline:none;background:#fff}
.cv-edit:empty:before{content:attr(data-ph);color:var(--muted)}
.cv-edit h2{margin:14px 0 8px;font-size:18px}
.cv-edit h3{margin:14px 0 8px;font-size:16px}
.cv-edit hr{border:0;border-top:1px solid var(--line-2);margin:14px 0}
.cv-edit ul,.cv-edit ol{padding-left:22px;margin:8px 0}
.cv-edit img{max-width:100%;border-radius:8px;margin:6px 0}
.cv-edit a{color:var(--blue);text-decoration:underline}
.cv-ops{display:flex;align-items:center;gap:14px}
.cv-ops .mres{font-size:13.5px}
@media (max-width:700px){
  .cv-fields{grid-template-columns:1fr}
  .cv-photo{flex-direction:column;align-items:flex-start}
}

/* 仪器卡片上的「近 N 天已约 M 次」小标 */
.bk-busy{display:inline-block;margin-left:8px;font-size:11.5px;font-weight:500;padding:2px 8px;
  border-radius:6px;background:var(--gold-100);color:#a9701d;vertical-align:middle}

/* 仪器卡片上的「功能」标签：这台仪器能做哪几种测试 */
.bk-modes{margin-top:8px;display:flex;flex-wrap:wrap;gap:5px}
.bk-mode{display:inline-block;padding:2px 9px;border-radius:6px;font-size:11.5px;line-height:1.6;
  background:#eef4fb;color:#2b5f96;border:1px solid #d6e8fb;white-space:nowrap}
.bk-mode.par{background:#fdf1e0;color:#96601a;border-color:#f2dcbb}

/* ==========================================================
   企业微信扫码登录页
   ========================================================== */
.bklogin{max-width:520px;margin:0 auto;background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);
  box-shadow:var(--sh-1);padding:32px 30px 26px;text-align:center}
.bklogin-head h2{font-size:20px;margin-bottom:6px}
.bklogin-head p{color:var(--muted);font-size:14px;margin-bottom:18px}
.bklogin-qr{min-height:290px;display:grid;place-items:center;margin:6px 0 4px}
.bklogin-qr iframe{width:100%;max-width:300px;height:290px;border:0}
.qr-fail{color:var(--muted);font-size:13.5px;border:1px dashed var(--line);border-radius:12px;padding:22px;
  background:var(--blue-50);line-height:1.8}
.bklogin-alt{margin-top:14px;font-size:13.5px;color:var(--muted);display:flex;align-items:center;
  justify-content:center;gap:10px;flex-wrap:wrap}
.bklogin-tip{text-align:left;background:var(--blue-50);border:1px solid #d6e8fb;border-radius:12px;
  padding:16px 18px;color:#2b5f96;font-size:14px;line-height:1.85}
.bklogin-tip b{color:#143d68}
.bklogin-err{background:#fdecec;border:1px solid #f5c9c6;color:#a33c36;border-radius:12px;padding:12px 16px;
  font-size:14px;margin-bottom:16px}
.bklogin-back{margin-top:20px;padding-top:16px;border-top:1px solid var(--line);display:flex;
  justify-content:space-between;gap:12px;font-size:13.5px;color:var(--muted)}
.bklogin-back a{display:inline-flex;align-items:center;gap:6px;padding:8px 16px;border-radius:9px;
  font-size:13px;font-weight:600;color:var(--ink-2);background:#fff;border:1px solid var(--line);transition:.2s}
.bklogin-back a:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-50);text-decoration:none}

/* ---- 扫码确认登录：本站自己画的二维码 ---- */
.bklogin-qr{position:relative}
.bklogin-qr img{width:220px;height:220px;display:block;margin:0 auto;
  border:1px solid var(--line);border-radius:14px;background:#fff;padding:6px}
.qr-mask{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);
  width:232px;height:232px;border-radius:14px;background:rgba(255,255,255,.93);
  display:grid;place-items:center;cursor:pointer;z-index:2}
.qr-mask span{font-size:14px;color:var(--ink);border-bottom:1px dashed var(--line);padding-bottom:3px}
.qr-mask[hidden]{display:none}
.qr-tip{margin-top:12px;font-size:14px;color:var(--muted)}
.qr-tip-warn{color:#a33c36}
.qr-hint{font-size:13px;color:var(--muted)}

/* ---- 账号密码登录 ---- */
.bkpass{display:flex;flex-direction:column;gap:13px;margin-top:4px;text-align:left}
.bkpass label{font-size:14px;font-weight:600;display:block}
.bkpass input[type=text],.bkpass input[type=password]{
  width:100%;box-sizing:border-box;margin-top:6px;padding:11px 13px;font-size:15px;
  border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink)}
.bkpass input[type=text]:focus,.bkpass input[type=password]:focus{
  outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(21,101,192,.12)}
/* .btn 是 inline-flex 且没设 justify-content，宽度撑满时文字会贴左边 —— 这里居中 */
.bkpass button{width:100%;box-sizing:border-box;padding:11px 0;font-size:15.5px;margin-top:2px;
  justify-content:center}
.bkpass-rm{display:flex!important;align-items:center;gap:8px;font-weight:400!important;
  font-size:13.5px!important;color:var(--muted);cursor:pointer}
.bkpass-rm input{width:15px;height:15px;margin:0;accent-color:var(--blue)}
.bkpass-tip{margin:0;font-size:12.8px;line-height:1.85;color:var(--muted);
  background:var(--blue-50);border:1px solid #d6e8fb;border-radius:10px;padding:11px 13px}
.bkpass-tip b{color:#143d68}

/* ---- 邮箱验证码登录 ---- */
.bklogin-ok{background:#eaf7ee;border:1px solid #bfe3cc;color:#256b3c;border-radius:12px;padding:12px 16px;
  font-size:14px;margin-bottom:16px}
.bkmform{display:flex;flex-direction:column;gap:13px;margin-top:4px;text-align:left}
.bkmform label{font-size:14px;font-weight:600;display:block}
.bkmform input[type=email],.bkmform input[type=text],.bkmform .bkcode{
  width:100%;box-sizing:border-box;margin-top:6px;padding:11px 13px;font-size:15px;
  border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink)}
.bkmform input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(21,101,192,.12)}
.bkmform .bkcode{font-size:22px;letter-spacing:8px;text-align:center;font-weight:700;
  font-family:ui-monospace,Menlo,Consolas,monospace}
.bkmform button[type=submit]{width:100%;box-sizing:border-box;padding:11px 0;font-size:15.5px;
  margin-top:2px;justify-content:center}
.bkmform-sent{background:var(--blue-50);border:1px solid #d6e8fb;border-radius:10px;
  padding:11px 13px;font-size:13.5px;color:#2b5f96;line-height:1.7}
.bkmform-sent b{color:#143d68;word-break:break-all}
.bkmform-sent span{color:var(--muted);font-size:12.5px}
.bkmform-alt{display:flex;gap:10px;flex-wrap:wrap;justify-content:space-between}
.bkmform-alt .btn{flex:1;min-width:120px;justify-content:center}
.bkmform-alt .btn:disabled{opacity:.55;cursor:not-allowed}
.bkmform .bkpass-tip{margin-top:2px}
/* 邮箱「只填前缀 + 固定后缀」：后缀做成贴在右边的灰色块，看得见但点不掉 */
.esfx{display:flex;align-items:stretch;width:100%;box-sizing:border-box;margin-top:6px;
  border:1px solid var(--line);border-radius:10px;background:#fff;overflow:hidden}
.esfx:focus-within{border-color:var(--blue);box-shadow:0 0 0 3px rgba(21,101,192,.12)}
.esfx-in{flex:1 1 auto;min-width:0;border:0!important;outline:none;margin:0!important;
  padding:11px 13px;font-size:15px;background:transparent;color:var(--ink);border-radius:0!important}
.esfx-in:focus{box-shadow:none!important;border:0!important}
.esfx-at{flex:none;display:flex;align-items:center;padding:0 13px;font-style:normal;font-weight:700;
  font-size:15.5px;color:var(--navy,#0e2f52);background:#eef4fa;border-left:1px solid var(--line);
  font-family:'Times New Roman',Times,serif;user-select:none;white-space:nowrap}
/* 后台成员表里显示邮箱时，后缀也淡化一下 */
.mail-sfx{color:#8a94a6;font-family:ui-monospace,Menlo,Consolas,monospace}

/* 几种登录方式并存时的分隔线 */
.bklogin-or{position:relative;margin:22px 0 16px;text-align:center}
.bklogin-or::before{content:"";position:absolute;left:0;right:0;top:50%;height:1px;background:var(--line)}
.bklogin-or span{position:relative;display:inline-block;padding:0 14px;background:#fff;
  font-size:13.5px;color:var(--muted)}

/* ---- 手机端确认页 ---- */
.bkqr-me{display:flex;align-items:center;gap:10px;justify-content:center;
  background:var(--blue-50);border:1px solid #d6e8fb;border-radius:12px;
  padding:12px 16px;margin-bottom:16px;font-size:14px;color:#2b5f96}
.bkqr-me img{width:34px;height:34px;border-radius:50%;object-fit:cover;background:#e8f0f9}
.bkqr-form{display:flex;flex-direction:column;gap:12px;margin-bottom:16px;text-align:left}
.bkqr-form label{font-size:14px;font-weight:600;display:block;margin-bottom:6px}
.bkqr-form label .tip{display:block;font-weight:400;font-size:12.5px;color:var(--muted);margin-top:3px}
.bkqr-form input[type=text]{width:100%;box-sizing:border-box;padding:11px 13px;font-size:15px;
  border:1px solid var(--line);border-radius:10px;background:#fff;color:var(--ink)}
.bkqr-form input[type=text]:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(21,101,192,.12)}
.bkqr-form button{width:100%;box-sizing:border-box;padding:11px 0;font-size:15px;justify-content:center}

/* 「扫码后才能看仪器」的引导块（科研设施 → 仪器预约 页签里用） */
.bkgate{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);padding:38px 30px;text-align:center;
  box-shadow:var(--sh-1)}
.bkgate .ico{width:64px;height:64px;margin:0 auto 16px;border-radius:20px;display:grid;place-items:center;
  background:linear-gradient(160deg,var(--blue-100),#dbeaf9);font-size:30px}
/* 门禁块里那把锁：跟别处一样用线框图标，不带 emoji 风格 */
.bkgate-ic{width:30px;height:30px;flex:0 0 30px;color:var(--blue);margin:0 auto 16px;
  background:linear-gradient(160deg,var(--blue-100),#dbeaf9);border-radius:20px;
  padding:17px;box-sizing:content-box}
.bkgate h3{font-size:19px;margin-bottom:8px}
.bkgate p{color:var(--muted);font-size:14px;line-height:1.9;max-width:440px;margin:0 auto 20px}
.bkgate-desc{background:var(--blue-50);border:1px solid #d6e8fb;border-radius:10px;
  padding:11px 14px;margin:0 auto 14px!important;color:#2b5f96!important;font-size:13.5px}

/* ==========================================================
   预约总览（科研设施 → 预约总览 页签）
   ----------------------------------------------------------
   一屏看清「哪台仪器、哪个时段、被谁约走了」。
   两种视图共用一套工具条；配色跟站点主色一致（navy / blue）。
   ========================================================== */
.bkov{font-size:14px}

/* ---------- 工具条 ---------- */
.bkov-bar{display:flex;flex-wrap:wrap;gap:9px;align-items:center;padding:13px 15px;margin-bottom:14px;
  background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh-1)}
.bkov-seg{display:inline-flex;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#f7fafd}
.bkov-seg .sb{border:0;background:transparent;padding:7px 13px;font-size:13px;color:var(--ink-2);
  cursor:pointer;font-family:inherit;line-height:1.5;transition:.18s;white-space:nowrap}
.bkov-seg .sb+.sb{border-left:1px solid var(--line)}
.bkov-seg .sb:hover{background:#eaf3fd;color:var(--blue)}
.bkov-seg .sb.on{background:var(--blue);color:#fff;font-weight:600}
.bkov-range{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--muted)}
.bkov-range .din{border:1px solid var(--line);border-radius:9px;padding:6px 9px;font-size:13px;
  font-family:inherit;color:var(--ink);background:#fff;min-width:132px}
.bkov-range .din:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,111,196,.12)}
.bkov-sel{border:1px solid var(--line);border-radius:9px;padding:7px 10px;font-size:13px;
  font-family:inherit;color:var(--ink);background:#fff;max-width:220px}
.bkov-sel:focus{outline:none;border-color:var(--blue)}
.bkov-kw{border:1px solid var(--line);border-radius:9px;padding:7px 12px;font-size:13px;
  font-family:inherit;color:var(--ink);background:#fff;width:180px}
.bkov-kw:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,111,196,.12)}
.bkov-chk{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink-2);cursor:pointer;
  padding:5px 2px;white-space:nowrap}
.bkov-chk input{width:15px;height:15px;accent-color:var(--blue);cursor:pointer}
.bkov-refresh{margin-left:auto;border:1px solid var(--line);background:#fff;border-radius:9px;
  padding:7px 14px;font-size:13px;color:var(--blue);cursor:pointer;font-family:inherit;transition:.18s;white-space:nowrap}
.bkov-refresh:hover{background:var(--blue);color:#fff;border-color:var(--blue)}

/* ---------- 统计条 ---------- */
.bkov-stat{margin:-4px 2px 14px;font-size:13.5px;color:var(--muted);line-height:1.8}
.bkov-stat b{color:var(--navy);font-size:15px;font-weight:700;font-variant-numeric:tabular-nums;margin:0 1px}

.bkov-msg{padding:34px 20px;text-align:center;color:var(--muted);font-size:14px;
  background:#fff;border:1px solid var(--line);border-radius:var(--r)}
.bkov-msg.bad{color:#b3352f}
.bkov-warn{margin-top:14px;padding:11px 15px;border-radius:10px;font-size:13px;line-height:1.75;
  background:#fff8e8;border:1px solid #f0dcae;color:#8a5b00}

/* ---------- 空态 ---------- */
.bkov-empty{background:#fff;border:1px solid var(--line);border-radius:var(--r-lg);padding:44px 28px;
  text-align:center;box-shadow:var(--sh-1)}
.bkov-empty .ic{width:62px;height:62px;margin:0 auto 14px;border-radius:20px;display:grid;place-items:center;
  background:linear-gradient(160deg,var(--blue-100),#dbeaf9);font-size:28px}
.bkov-empty h3{font-size:18px;color:var(--navy);margin-bottom:8px}
.bkov-empty p{color:var(--muted);font-size:14px;line-height:1.9;max-width:430px;margin:0 auto 18px}

/* ---------- 按日期视图 ---------- */
.bkov-days{display:flex;flex-direction:column;gap:11px}
.bkov-day{background:#fff;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  box-shadow:var(--sh-1);transition:box-shadow .2s}
.bkov-day:hover{box-shadow:var(--sh-2)}
.bkov-day.today{border-color:#bcd9f5;box-shadow:0 0 0 1px #d9eafb,var(--sh-1)}
.bkov-dayhd{display:flex;align-items:center;gap:10px;padding:12px 17px;cursor:pointer;user-select:none;
  background:linear-gradient(180deg,#fbfdff,#f5f9fd)}
.bkov-day.today .bkov-dayhd{background:linear-gradient(180deg,#f2f8ff,#e8f2fd)}
.bkov-dayhd:hover{background:#eff6fd}
.bkov-dayhd .ar{color:var(--muted);font-size:13px;transition:transform .2s;display:inline-block;flex:0 0 auto}
.bkov-day.open .bkov-dayhd .ar{transform:rotate(90deg)}
.bkov-dayhd b{font-size:16px;color:var(--navy);font-variant-numeric:tabular-nums}
.bkov-dayhd i{font-style:normal;font-size:12.5px;color:var(--muted)}
.bkov-dayhd .tg{font-style:normal;font-size:11.5px;padding:1px 8px;border-radius:20px;
  background:#e2effc;color:#1c5f9e;border:1px solid #c6ddf5}
.bkov-dayhd .tg.we{background:#f4f1fa;color:#6b5b95;border-color:#ddd5ef}
.bkov-dayhd .n{margin-left:auto;font-size:12.5px;color:var(--muted);flex:0 0 auto}
.bkov-dayhd .n.has{color:var(--blue);font-weight:600}

.bkov-list{list-style:none;margin:0;padding:0}
.bkov-day:not(.open) .bkov-list{display:none}
.bkov-free{padding:15px 18px;font-size:13.5px;color:var(--muted);border-top:1px solid var(--line-2);
  background:repeating-linear-gradient(45deg,#fcfdfe 0 10px,#f8fbfe 10px 20px)}
.bkov-row{display:flex;align-items:center;gap:14px;padding:11px 18px;border-top:1px solid var(--line-2);
  font-size:14px;transition:background .16s}
.bkov-row:hover{background:#f7fbff}
.bkov-row.mine{background:#f2f9f4}
.bkov-row.mine:hover{background:#eaf5ee}
.bkov-row.past{opacity:.55}
.bkov-row .tm{flex:0 0 108px;font-size:13px;color:var(--navy);font-weight:600;
  font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.bkov-row .tm .seg{display:inline-block;font-style:normal;font-size:11px;font-weight:600;
  margin-left:6px;padding:1px 8px;border-radius:20px;background:var(--blue-50);
  color:#2b5f96;border:1px solid #d6e8fb;vertical-align:1px;white-space:nowrap}
.bkov-row.past .tm{color:var(--muted);font-weight:500}
.bkov-row .it{flex:1 1 auto;min-width:120px;color:var(--ink);font-weight:500;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bkov-row .it .md{font-style:normal;margin-left:8px;font-size:11.5px;padding:1px 8px;border-radius:20px;
  background:var(--blue-50);color:#2b5f96;border:1px solid #d6e8fb;white-space:nowrap}
.bkov-row .who{flex:0 0 auto;display:inline-flex;align-items:center;gap:7px;font-size:13.5px;color:var(--ink-2)}
.bkov-row .who .av{width:26px;height:26px;border-radius:50%;display:grid;place-items:center;
  background:linear-gradient(160deg,var(--blue-100),#cfe2f7);color:#2b5f96;font-size:12.5px;font-weight:600;flex:0 0 auto}
.bkov-row.mine .who .av{background:linear-gradient(160deg,#d6f0df,#bfe6cd);color:#24683c}
.bkov-row .who .you{font-style:normal;font-size:11px;padding:1px 7px;border-radius:20px;
  background:#d6f0df;color:#24683c;border:1px solid #b7dfc5}
.bkov-row .nt{flex:0 1 200px;font-size:12.5px;color:var(--muted);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bkov-row .nt:not(:empty){cursor:pointer;border-bottom:1px dashed #cfdbe6}
.bkov-row .nt:not(:empty):hover{color:var(--blue)}
.bkov-row .nt.on{white-space:normal;overflow:visible;text-overflow:clip;flex-basis:auto;color:var(--ink-2)}

/* ---------- 仪器 × 日期 矩阵 ---------- */
.bkov-gbox{background:#fff;border:1px solid var(--line);border-radius:var(--r);box-shadow:var(--sh-1);
  overflow:hidden}
.bkov-gwrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.bkov-grid{border-collapse:separate;border-spacing:0;width:100%;min-width:640px;font-size:13px}
.bkov-grid th,.bkov-grid td{border-bottom:1px solid var(--line-2);border-right:1px solid var(--line-2)}
.bkov-grid thead th{position:sticky;top:0;z-index:2;background:#f5f9fd;color:var(--navy);
  font-size:12.5px;font-weight:600;padding:9px 6px;text-align:center;white-space:nowrap}
.bkov-grid thead th i{display:block;font-style:normal;font-size:11px;color:var(--muted);font-weight:400}
.bkov-grid thead th.today{background:#e6f1fd;color:#1c5f9e}
.bkov-grid thead th.we{color:#6b5b95}
.bkov-grid .corner{position:sticky;left:0;z-index:3;text-align:left;padding-left:14px;min-width:180px}
.bkov-grid thead .corner{z-index:4}
.bkov-grid tbody .rn{position:sticky;left:0;z-index:1;background:#fdfefe;text-align:left;
  padding:9px 14px;min-width:180px;max-width:250px;font-weight:500;vertical-align:middle}
.bkov-grid tbody tr:hover .rn{background:#f5f9fd}
.bkov-grid tbody .rn b{display:block;color:var(--navy);font-size:13.5px;font-weight:600;line-height:1.5}
.bkov-grid tbody .rn em{display:block;font-style:normal;font-size:11.5px;color:#2b5f96;margin-top:3px}
.bkov-grid tbody .rn .adm{display:block;font-size:11.5px;color:var(--muted);margin-top:2px}
.bkov-grid tbody .rn.off b{color:var(--muted)}
.bkov-grid tbody tr:last-child th,.bkov-grid tbody tr:last-child td{border-bottom:0}

.bkov-grid td.c{text-align:center;padding:8px 4px;cursor:default;
  font-variant-numeric:tabular-nums;background:#fff;transition:.16s;min-width:52px}
.bkov-grid td.c .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:#dde5ec}
.bkov-grid td.c.on{background:#e8f2fd;cursor:pointer}
.bkov-grid td.c.on b{font-size:14px;font-weight:700;color:#1c5f9e}
.bkov-grid td.c.on i{font-style:normal;font-size:11px;color:#7ba7d0}
.bkov-grid td.c.on:hover{background:#d3e7fb;box-shadow:inset 0 0 0 1px #9cc6ee}
.bkov-grid td.c.full{background:#fdeee6}
.bkov-grid td.c.full b{color:#b4501f}
.bkov-grid td.c.full i{color:#cf9070}
.bkov-grid td.c.full:hover{background:#fbe1d3;box-shadow:inset 0 0 0 1px #efb99b}
.bkov-grid td.c.off{background:#fafbfc}
.bkov-grid td.c.closed{background:repeating-linear-gradient(45deg,#f7f9fb 0 5px,#f1f4f8 5px 10px)}
.bkov-grid td.c.today{box-shadow:inset 0 0 0 1px #c9e0f7}
.bkov-gtip{margin:0;padding:11px 16px;font-size:12.5px;color:var(--muted);line-height:1.75;
  background:#fbfdff;border-top:1px solid var(--line-2)}

@media (max-width:820px){
  .bkov-refresh{margin-left:0}
  .bkov-sel{max-width:100%;flex:1 1 160px}
  .bkov-kw{width:100%;flex:1 1 140px}
  .bkov-row{flex-wrap:wrap;gap:8px 12px}
  .bkov-row .tm{flex:0 0 auto}
  .bkov-row .it{flex:1 1 100%;order:2}
  .bkov-row .nt{flex:1 1 100%;order:3}
}

/* ==========================================================
   预约弹窗
   ========================================================== */
.bkmask{position:fixed;inset:0;background:rgba(14,47,82,.42);backdrop-filter:blur(2px);
  display:none;align-items:center;justify-content:center;z-index:300;padding:20px}
.bkmask.on{display:flex}
.bkdlg{background:#fff;border-radius:16px;width:100%;max-width:400px;padding:24px 24px 20px;
  box-shadow:0 24px 60px rgba(14,47,82,.28);animation:bkpop .18s ease}
@keyframes bkpop{from{opacity:0;transform:translateY(10px) scale(.98)}to{opacity:1;transform:none}}
.bkdlg h4{font-size:17px;margin-bottom:14px}
.bkd{font-size:14px;color:var(--ink-2);line-height:1.8}
.bkd-l{display:flex;gap:10px;padding:5px 0;border-bottom:1px dashed var(--line-2)}
.bkd-l:last-child{border-bottom:0}
.bkd-l span{width:52px;flex:none;color:var(--muted);font-size:13px}
.bkd-l b{font-weight:600;color:var(--navy);font-variant-numeric:tabular-nums}
.bkd-w{margin:12px 0 0;font-size:12.5px;color:var(--muted);line-height:1.7}
/* 拖选多格时的「已选时段清单」 */
.bkd-sec{padding:9px 0 5px;border-bottom:0}
.bkd-sec b{font-weight:600}
.bkr-list{margin:6px 0 0;max-height:180px;overflow-y:auto;border:1px solid var(--line);
  border-radius:10px;background:#fafcfe}
.bkr-list::-webkit-scrollbar{width:8px}
.bkr-list::-webkit-scrollbar-thumb{background:#d3dde7;border-radius:4px}
.bkr-d{display:flex;gap:10px;padding:6px 10px;border-bottom:1px solid var(--line-2);font-size:13px}
.bkr-d:last-child{border-bottom:0}
.bkr-d .d{flex:0 0 88px;color:var(--navy);font-weight:600;font-variant-numeric:tabular-nums}
.bkr-d .s{flex:1 1 auto;color:var(--ink-2);font-variant-numeric:tabular-nums}
.bkf{display:block;margin-top:14px}
.bkf span{display:block;font-size:13px;color:var(--ink-2);margin-bottom:6px;font-weight:500}
.bkf .tip{font-weight:400;color:var(--muted);margin-left:6px;font-size:12px}
.bkf input{width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:9px;font-size:14px;
  font-family:inherit;color:var(--ink);background:#fff}
.bkf input:focus{outline:none;border-color:var(--blue);box-shadow:0 0 0 3px rgba(30,111,196,.12)}
.bkops{display:flex;justify-content:flex-end;gap:10px;margin-top:20px}

/* 右下角轻提示 */
.bktoast{position:fixed;right:22px;bottom:22px;z-index:400;max-width:320px;padding:12px 18px;border-radius:12px;
  background:var(--navy);color:#fff;font-size:14px;line-height:1.6;box-shadow:0 12px 32px rgba(14,47,82,.28);
  opacity:0;transform:translateY(12px);pointer-events:none;transition:.24s}
.bktoast.on{opacity:1;transform:none}
.bktoast.bad{background:#b3352f}

@media (max-width:700px){
  .bkbar{padding:11px 14px;gap:9px}
  .bkbar-meta{margin-left:0;width:100%;order:3}
  .bkhelp{padding:11px 14px;font-size:13px}
  .bkprof{padding:16px 16px}
  .bkprof-form input[type=text]{width:100%}
  .bklegend{gap:6px 14px;font-size:12.5px}
  .bkcell{height:24px;min-width:56px;font-size:11.5px}
  .bktable th.h{width:64px;min-width:64px;padding:4px 4px;font-size:11px}
  .bklogin{padding:24px 18px 20px}
  .bklogin-qr{min-height:250px}
  .bkgate{padding:28px 18px}
  .bktoast{right:12px;left:12px;bottom:12px;max-width:none}
}

/* ==========================================================
   成员色块头像
   ----------------------------------------------------------
   每个注册用户一个固定色块 + 名字首字母（惠伟→HW、惠伟伟→HWW），
   开号时发、之后改不了 —— 表格里一眼就能认出是谁。
   颜色由 inc/avatar.php 生成，文字明暗按底色亮度自动取。
   ========================================================== */
.av{
  display:inline-flex;align-items:center;justify-content:center;
  width:30px;height:30px;flex:0 0 30px;border-radius:9px;
  font-size:12px;font-weight:800;letter-spacing:.02em;
  line-height:1;vertical-align:middle;user-select:none;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.14);
}
.av-s{width:24px;height:24px;flex:0 0 24px;border-radius:7px;font-size:11px}
.av-lg{width:52px;height:52px;flex:0 0 52px;border-radius:15px;font-size:17px}
.av-w{display:inline-flex;align-items:center;gap:7px;min-width:0}
.av-w b{font-weight:600;font-size:13.5px;color:var(--ink)}
/* 预约表格里显示全名时，整格用这个人的色块填充 */
.bkcell.avfill,.bkm.avfill{font-weight:700}
.bkcell.avfill{box-shadow:inset 0 0 0 1px rgba(255,255,255,.18)}

/* ==========================================================
   个人中心「我的」（科研设施下的一个页签）
   ========================================================== */
/* 线框小图标：整套统一（原来用 emoji，一块一块花花绿绿不成体系） */
.ic{width:18px;height:18px;flex:0 0 18px;fill:none;stroke:currentColor;stroke-width:1.7;
  stroke-linecap:round;stroke-linejoin:round;display:block}

/* 个人中心两栏布局。类名必须带 pc- 前缀：裸 .mine 会命中预约日程表的
   bkcell mine 格子（display:grid 一上，表格行高直接爆炸——踩过）。 */
.pc-mine{display:grid;grid-template-columns:236px minmax(0,1fr);gap:20px;align-items:start}
.mine-nav{
  background:var(--white);border:1px solid var(--line);border-radius:var(--r);
  padding:10px;box-shadow:var(--sh-1);position:sticky;top:14px;
}
.mine-me{display:flex;align-items:center;gap:10px;padding:8px 8px 12px;border-bottom:1px solid var(--line-2);margin-bottom:8px}
.mine-me .av{width:38px;height:38px;flex:0 0 38px;border-radius:11px;font-size:13px}
.mine-me b{display:block;font-size:14px;line-height:1.4;color:var(--navy)}
.mine-me .mini{font-size:12px}

/* 预览学生账号：红色横幅 + 学生列表 */
.preview-bar{display:flex;align-items:center;gap:10px;padding:8px 12px;margin-bottom:10px;
  background:#fdecec;border:1px solid #f2c9c4;border-radius:9px;font-size:13px;color:#a33c36;flex-wrap:wrap}
.preview-bar b{font-weight:700}
.preview-exit{margin-left:auto;padding:4px 12px;border:1px solid #c0392b;border-radius:7px;
  background:#c0392b;color:#fff;font-size:12.5px;cursor:pointer}
.preview-exit:hover{background:#a93226}
.pv-list{display:flex;flex-direction:column;gap:8px;margin-bottom:14px}
/* display:flex 会盖掉 hidden 属性的默认 display:none —— 折叠必须显式声明 */
.pv-list[hidden]{display:none}
.pv-grp{font-size:13.5px;font-weight:700;color:var(--navy);margin:16px 0 8px;display:flex;align-items:center;gap:8px;
  cursor:pointer;user-select:none;padding:8px 12px;background:var(--white);border:1px solid var(--line);border-radius:9px}
.pv-grp::before{content:'';width:3px;height:14px;border-radius:2px;background:var(--blue)}
.pv-grp i{font-style:normal;font-size:11.5px;font-weight:500;color:var(--muted);background:var(--blue-50);padding:1px 8px;border-radius:10px}
.pv-grp .pv-caret{margin-left:auto;color:var(--muted);font-size:12px;transition:transform .18s}
.pv-grp.open .pv-caret{transform:rotate(180deg)}
.pv-grp:hover{border-color:#cfe2f7}
.pv-row{display:flex;align-items:center;gap:12px;padding:10px 14px;background:var(--white);
  border:1px solid var(--line);border-radius:10px}
.pv-av{width:38px;height:38px;flex:0 0 38px;border-radius:50%;display:flex;align-items:center;
  justify-content:center;font-size:14px;font-weight:700}
.pv-main{flex:1;min-width:0}
.pv-main b{display:block;font-size:14px;color:var(--navy)}
.pv-main .mini{font-size:12px}

/* 菜单：选中项左侧一条金线 + 浅蓝底 —— 一眼知道自己在哪一页 */
.mn-i{
  position:relative;display:flex;align-items:center;gap:10px;width:100%;
  padding:9px 10px 9px 12px;margin-bottom:2px;border:0;border-radius:10px;
  background:transparent;color:var(--ink-2);font:inherit;font-size:13.5px;
  text-align:left;cursor:pointer;text-decoration:none;
  transition:background .15s,color .15s;
}
.mn-i:hover{background:var(--blue-50);color:var(--navy)}
.mn-i.on{background:var(--blue-100);color:var(--navy);font-weight:600}
.mn-i.on::before{content:"";position:absolute;left:3px;top:9px;bottom:9px;width:3px;
  border-radius:2px;background:var(--gold)}
.mn-ic{width:19px;height:19px;flex:0 0 19px;color:var(--ink-2);opacity:.9}
.mn-i.on .mn-ic,.mn-i:hover .mn-ic{color:var(--blue);opacity:1}
.mn-sep{height:1px;background:var(--line-2);margin:8px 6px}
/* 菜单折叠组：父项 + 缩进子项（值日/快递/台账/巡查） */
.mn-grp .mn-caret{margin-left:auto;width:0;height:0;border-left:5px solid transparent;
  border-right:5px solid transparent;border-top:6px solid var(--muted);transition:transform .15s}
.mn-grp .mn-caret.open{transform:rotate(180deg)}
.mn-sub{padding-left:26px;font-size:13px}
.mn-sub .mn-ic{width:17px;height:17px;flex:0 0 17px}
/* 备忘录 checklist（Apple 备忘录式）：勾选圈 + 完成划线 + 跳转定位闪烁 */
.memo-chk{width:20px;height:20px;flex:0 0 20px;border:2px solid #b9c6d4;border-radius:50%;
  background:#fff;color:#fff;font-size:12px;line-height:1;cursor:pointer;padding:0;
  display:inline-flex;align-items:center;justify-content:center;transition:.15s}
.memo-chk:hover{border-color:var(--blue)}
.memo-chk.on{background:var(--blue);border-color:var(--blue)}
.memo-card.memo-done .mlog-h b{text-decoration:line-through;color:var(--muted)}
.memo-card.memo-done .mlog-b{color:var(--muted);text-decoration:line-through}
.memo-card.memo-done{opacity:.62}
.mlog-go{cursor:pointer;transition:.15s}
.mlog-go:hover{border-color:#cfe2f7;background:var(--blue-50)}
.memo-flash{animation:memoFlash 2.2s ease}
@keyframes memoFlash{0%,60%{background:#fff8dc;box-shadow:0 0 0 2px #f0d69a}100%{background:transparent}}
/* 概览备忘列表在等高列内滚动 */
.home-mid{align-items:stretch}
/* 概览页：备忘提醒（左窄）+ 本月日历（右宽）并排。
   align-items 用默认 stretch —— 两列等高，备忘列内部滚动，总高不超过日历 */
.home-mid{display:grid;grid-template-columns:340px 1fr;gap:18px;margin-top:20px}
.home-mid .sec-h{margin-top:0}
.hm-l{display:flex;flex-direction:column;min-height:0;min-width:0}
.hm-l .empty{padding:14px;font-size:13px}
.hm-l .mlogs{flex:1 1 auto;min-height:0;overflow-y:auto;padding-right:2px}
@media(max-width:1000px){.home-mid{grid-template-columns:1fr}}

/* 退出聚合：点「退出」展开「退出登录 / 切换账号」两个选项 */
.mn-out{position:relative}
.mn-out .mn-caret{margin-left:auto;width:0;height:0;border-left:5px solid transparent;
  border-right:5px solid transparent;border-top:6px solid var(--muted);transition:transform .15s}
.mn-out #mOutBtn.on .mn-caret{transform:rotate(180deg)}
.mn-out-menu{position:absolute;left:0;right:0;bottom:calc(100% + 6px);z-index:30;
  background:var(--white);border:1px solid var(--line);border-radius:10px;
  padding:5px;box-shadow:var(--sh-1)}
.mn-out-menu .mn-i{margin-bottom:0}
.mn-out-menu[hidden]{display:none}
.mn-dot{
  margin-left:auto;min-width:18px;height:18px;padding:0 5px;border-radius:9px;
  background:#d93b3b;color:#fff;font-size:11px;font-style:normal;font-weight:700;
  display:inline-flex;align-items:center;justify-content:center;
}

.mine-main{min-width:0}
.mine-hd{
  display:flex;align-items:center;gap:14px;margin-bottom:14px;
  background:linear-gradient(120deg,var(--navy),#1b4f85);
  border-radius:var(--r);padding:16px 18px;color:#e8f2fc;
}
.mine-hd .av{width:52px;height:52px;flex:0 0 52px;border-radius:15px;font-size:17px}
.mine-hd h3{font-size:19px;margin-bottom:2px;color:#fff}
.mine-hd .mini{color:#a9c9e6}
.mine-hd-t{min-width:0}

.mine-cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(188px,1fr));gap:12px;margin-bottom:8px}
.mine-card{
  background:var(--white);border:1px solid var(--line);border-radius:var(--r);
  padding:13px 14px;cursor:pointer;transition:box-shadow .15s,border-color .15s;
}
.mine-card:hover{box-shadow:var(--sh-2);border-color:var(--blue-2)}
.mine-card.on{border-left:3px solid var(--gold)}
.mc-hd{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.mc-hd .ic{color:var(--blue);width:17px;height:17px;flex:0 0 17px}
.mc-t{font-weight:700;color:var(--navy);font-size:14px}
.mc-v{margin-top:2px;font-size:13px;color:var(--ink);line-height:1.6}
.mc-v.muted{color:var(--muted)}
/* 导师概览四张卡里的学生胶囊：头像色块 + 姓名，流式换行 */
.mc-v.mwho{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.mc-v.mwho .mwho-i{padding:3px 10px 3px 3px}
.mc-d{margin-top:4px;font-size:12px;color:var(--muted)}

.mine-items{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}
.mine-item{display:block;background:var(--white);border:1px solid var(--line);border-radius:12px;padding:12px 14px}
.mine-item:hover{border-color:var(--blue-2);box-shadow:var(--sh-1)}
.mine-item b{display:block;font-size:14px;color:var(--navy);margin-bottom:2px}

/* 一张「安排表」：区域 + 时间段 + 名单 */
.mgrp{background:var(--white);border:1px solid var(--line);border-radius:var(--r);padding:14px 16px;margin-bottom:12px}
.mgrp-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.mgrp-h b{font-size:15px;color:var(--navy)}
/* 组会列表里「下一场」突出：金边 + 淡金底 + 「下一场」角标 */
.mgrp.next{border-color:var(--gold);background:linear-gradient(180deg,#fffdf5,#fff8e8);
  box-shadow:0 0 0 1px var(--gold),0 6px 18px rgba(217,154,60,.14)}
.mg-next-tag{font-style:normal;font-size:11.5px;font-weight:700;color:#fff;background:var(--gold);
  padding:2px 9px;border-radius:20px;letter-spacing:.02em}
.mwho{display:flex;flex-wrap:wrap;gap:8px}
.mwho-i{
  display:inline-flex;align-items:center;gap:7px;padding:5px 11px 5px 5px;
  border:1px solid var(--line);border-radius:22px;background:var(--blue-50);
}
.mwho-i.me{border-color:var(--gold);background:var(--gold-100);box-shadow:0 0 0 2px rgba(217,154,60,.16)}
.mwho-i b{font-weight:600;font-size:13.5px}
.mwho-i i{font-style:normal;font-size:11.5px;color:var(--muted)}
.mnote{margin-top:9px;padding:8px 11px;border-radius:9px;background:var(--blue-50);
  color:var(--ink-2);font-size:12.5px;line-height:1.7}
.mchk{padding:12px 16px;border:1px solid var(--line);border-radius:12px;background:var(--white)}
.mchk ul{margin:0;padding-left:20px;font-size:13.5px;line-height:1.95;color:var(--ink-2)}
.mtpl{white-space:pre-wrap;padding:12px 14px;border:1px dashed var(--line);border-radius:12px;
  background:var(--blue-50);font-size:13px;color:var(--ink-2);line-height:1.85}

/* 组会时间 · 以日期为主（2026-09-30 重新设计） */
.mginfo{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap;
  padding:12px 16px;border:1px solid var(--line);border-radius:12px;
  background:linear-gradient(180deg,#f6f0ff,#fbf7ff);font-size:13px;color:var(--ink-2);line-height:1.6}
.mginfo b{font-size:15px;color:var(--navy)}
.mginfo span{color:var(--ink-2)}
.mgl{margin-top:14px;display:flex;flex-direction:column;gap:12px}
.mgrow{background:var(--white);border:1px solid var(--line);border-radius:var(--r);
  padding:14px 18px;display:flex;flex-direction:column;gap:10px}
.mgrow.next{border-color:var(--gold);background:linear-gradient(180deg,#fffdf5,#fff8e8);
  box-shadow:0 0 0 1px var(--gold),0 6px 18px rgba(217,154,60,.14)}
.mgd{display:flex;align-items:center;gap:10px}
.mgd .mg-edit{margin-left:auto}
.mg-form textarea{width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;
  font:inherit;font-size:13.5px;line-height:1.7;color:var(--ink);background:var(--white)}
.mg-form textarea:focus{border-color:var(--blue-2);outline:2px solid rgba(26,86,168,.12);outline-offset:0}
.mgd b{font-size:16px;color:var(--navy);letter-spacing:.01em}
.mgwd{font-size:12.5px;color:var(--muted)}
.mgwho{display:flex;flex-wrap:wrap;gap:8px}
.mg-def{display:inline-flex;align-items:center;padding:5px 12px;border-radius:20px;
  background:var(--blue-50);border:1px solid var(--line);font-size:12.5px;color:var(--ink-2)}
.mg-extra{display:inline-flex;align-items:center;padding:5px 12px;border-radius:20px;
  background:var(--gold-100);border:1px solid var(--gold);font-size:12.5px;color:#854f0b}

/* 组会安排编辑表单（被授权导师） */
.mg-form{display:flex;flex-wrap:wrap;gap:12px;margin-top:12px}
.mg-form>label{display:flex;flex-direction:column;gap:5px;font-size:12.5px;color:var(--ink-2);flex:1 1 200px}
.mg-form>label.mg-full{flex:1 1 100%}
.mg-form input[type="text"],.mg-form input[type="date"]{
  padding:8px 11px;border:1px solid var(--line);border-radius:9px;font:inherit;font-size:13.5px;color:var(--ink);background:var(--white)}
.mg-form input:focus{border-color:var(--blue-2);outline:2px solid rgba(26,86,168,.12);outline-offset:0}
.mg-chks{display:flex;flex-wrap:wrap;gap:8px;padding:4px 0}
.mg-chks .chk{margin:0}
.mg-rows{display:flex;flex-direction:column;gap:10px}
.mg-row{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-start;padding:10px 12px;
  border:1px solid var(--line);border-radius:10px;background:var(--white)}
.mg-rd input{width:150px}
.mg-re{flex:1 1 220px}
.mg-re input{width:100%}
.mg-rx{flex:1 1 100%;display:flex;flex-wrap:wrap;gap:8px;align-items:center}
.mg-row input[type="text"],.mg-row input[type="date"]{
  padding:7px 10px;border:1px solid var(--line);border-radius:8px;font:inherit;font-size:13px;color:var(--ink);background:var(--white)}

/* 个人中心 · 改密码 */
.mpass{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:12px;align-items:end;
  background:var(--white);border:1px solid var(--line);border-radius:12px;padding:16px 18px;
}
.mpass label{display:flex;flex-direction:column;gap:5px;font-size:12.5px;color:var(--ink-2)}
.mpass label .tip{font-weight:400;color:var(--muted);font-size:11.5px;margin-left:6px}
.mpass input{
  padding:9px 11px;border:1px solid var(--line);border-radius:9px;background:var(--white);
  font:inherit;font-size:13.5px;color:var(--ink);
}
.mpass input:focus{border-color:var(--blue-2);outline:2px solid rgba(26,86,168,.12);outline-offset:0}
.mpass button{justify-self:start}
.mpass .mres{justify-self:start;align-self:center}
.mres{font-size:13px;color:var(--muted);line-height:1.6}
.mres.ok{color:var(--green,#16794a);font-weight:600}
.mres.bad{color:var(--red,#c0392b);font-weight:600}
@media(max-width:640px){.mpass{grid-template-columns:1fr}}

/* 登记 / 消息 */
.mlog-form{display:grid;grid-template-columns:repeat(auto-fit,minmax(160px,1fr));gap:10px;align-items:end;
  background:var(--white);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px}
.mlog-form label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;color:var(--ink-2)}
.mlog-form label.wide{grid-column:1/-1}
.mlog-form input{padding:8px 10px;border:1px solid var(--line);border-radius:9px;font:inherit;font-size:13.5px;background:var(--white)}
.mlog-form button{justify-self:start}
.mlogs{display:flex;flex-direction:column;gap:8px}
.mlog{background:var(--white);border:1px solid var(--line);border-radius:11px;padding:11px 14px}
.mlog.unread{border-left:3px solid var(--gold);background:#fffdf7}
.mlog-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.mlog-h b{font-size:14px;color:var(--navy)}
.mlog-b{margin-top:6px;font-size:13.5px;color:var(--ink-2);line-height:1.8;white-space:pre-wrap}
/* 站内消息「删」+ 备忘录「改/删」（2026-09-30） */
.mmsg-del{margin-left:auto;flex:none;border:0;background:transparent;color:var(--muted);
  font:inherit;font-size:12.5px;cursor:pointer;padding:2px 8px;border-radius:7px;transition:.15s}
.mmsg-del:hover{background:#fdecea;color:#c0392b}
/* 导师发的站内消息：金边突出（2026-09-30 起全员可发，导师消息要醒目） */
.mlog.vip{border-left:3px solid var(--gold);background:#fffdf7}
/* 写消息：选人胶囊 */
.mpick{display:flex;gap:6px;flex-wrap:wrap;padding:8px 10px;border:1px solid var(--line);
  border-radius:9px;background:#fbfdff;min-height:40px}
.mp-item{display:inline-flex;align-items:center;padding:4px 12px;border-radius:15px;cursor:pointer;
  border:1px solid var(--line);background:#fff;font-size:13px;color:var(--ink-2);transition:.15s;user-select:none}
.mp-item:hover{border-color:var(--blue);color:var(--blue)}
.mp-item.on{background:var(--blue);border-color:var(--blue);color:#fff}
.mp-item.boss::after{content:'导';margin-left:5px;font-size:10.5px;background:var(--gold);
  color:#fff;border-radius:50%;width:15px;height:15px;display:inline-flex;align-items:center;justify-content:center}
.memo-card .mlog-h{align-items:center}
.memo-acts{margin-left:auto;display:inline-flex;gap:6px;flex:none}
/* 个人中心「本月日历」：日期下方彩色圆点 = 当天有事，悬停浮层看明细（2026-09-30） */
.mcal{background:var(--white);border:1px solid var(--line);border-radius:12px;padding:12px;margin-bottom:16px}
.mcal-w{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;text-align:center;
  font-size:12px;color:var(--muted);margin-bottom:4px}
.mcal-g{display:grid;grid-template-columns:repeat(7,1fr);gap:4px}
.mcal-d{position:relative;min-height:52px;border:1px solid transparent;border-radius:9px;
  padding:5px 6px;font-size:13px;background:#fbfdff}
.mcal-d.empty{background:transparent}
.mcal-d.today{border-color:var(--blue);background:var(--blue-50)}
.mcal-d .n{font-weight:600;color:var(--ink)}
.mcal-d .dots{display:flex;gap:3px;margin-top:5px;min-height:7px;flex-wrap:wrap}
.mcal-d .dots i{width:7px;height:7px;border-radius:50%;display:inline-block}
.mcal-d.has{cursor:default}
.mcal-d.has:hover{border-color:var(--line)}
/* 类别色 */
.mcal .d-duty{background:#2f7bd9}.mcal .d-parcel{background:#2e9e63}
.mcal .d-ledger{background:#e08a1e}.mcal .d-safety{background:#c0392b}
.mcal .d-meeting{background:#7d4bd1}.mcal .d-booking{background:#1187a8}
.mcal .d-memo{background:#d1a018}
/* 悬浮明细 */
.mcal-pop{display:none;position:absolute;z-index:30;left:0;top:calc(100% + 6px);min-width:230px;max-width:320px;
  background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:var(--sh-2,0 8px 24px rgba(20,60,120,.16));
  padding:10px 12px;font-size:12.5px;color:var(--ink);text-align:left}
.mcal-pop b{display:block;margin-bottom:6px;color:var(--navy)}
.mcal-d:hover .mcal-pop{display:block}
.mp-row{display:flex;gap:6px;align-items:flex-start;margin:3px 0;line-height:1.5}
.mp-row i{width:8px;height:8px;border-radius:50%;flex:none;margin-top:5px}
/* 图例 */
.mcal-lg{display:flex;gap:14px;flex-wrap:wrap;margin-top:10px;font-size:12px;color:var(--ink-2)}
.mcal-lg span{display:inline-flex;align-items:center;gap:5px}
.mcal-lg i{width:8px;height:8px;border-radius:50%;display:inline-block}
.loading{padding:40px 0;text-align:center;color:var(--muted);font-size:13.5px}
/* 窄屏：侧栏改成一条能左右滑的胶囊导航。
   以前是 flex-wrap 换行 —— 9 个菜单项堆成三行，还带 emoji，非常乱。
   现在强制一行、超出横向滑动，高度固定，看上去像一条导航带。 */
@media (max-width:900px){
  .pc-mine{grid-template-columns:1fr;gap:14px}
  .mine-nav{
    position:static;padding:8px;
    display:flex;flex-wrap:nowrap;gap:6px;overflow-x:auto;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
  }
  .mine-nav::-webkit-scrollbar{display:none}
  .mine-me{display:none}            /* 身份条在内容区顶部已经有了，这里不重复 */
  .mn-i{
    width:auto;flex:0 0 auto;padding:8px 13px;border-radius:20px;
    background:var(--blue-50);white-space:nowrap;margin:0;gap:7px;
  }
  .mn-i.on::before{display:none}
  .mn-i.on{background:var(--blue);color:#fff}
  .mn-i.on .ic{color:#fff}
  .mn-sep{display:none}
  .mn-dot{margin-left:2px}
  .mine-cards{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  .mine-hd{padding:14px}
  .mine-hd .av{width:44px;height:44px;flex:0 0 44px;font-size:15px}
}
@media (max-width:420px){
  .mine-cards{grid-template-columns:1fr}
}

/* ==========================================================
   组内邮件（「组内管理 → 组内邮件」）
   ========================================================== */
.lm-who{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  background:var(--white);border:1px solid var(--line);border-radius:var(--r);
  padding:13px 16px;box-shadow:var(--sh-1);margin-bottom:10px;
}
.lm-who .av{width:44px;height:44px;flex:0 0 44px;border-radius:13px;font-size:15px}
.lm-who-t{min-width:0;display:flex;flex-direction:column;gap:1px}
.lm-who-t b{font-size:15px;color:var(--navy)}
.lm-from{font-size:12.5px;color:var(--ink-2)}
.lm-from em{font-style:normal;font-weight:600;color:var(--blue)}
.lm-how{font-size:12px;color:var(--muted)}
.lm-left{
  margin-left:auto;font-size:12.5px;font-weight:600;color:var(--navy);
  background:var(--blue-50);border:1px solid var(--line);border-radius:20px;padding:5px 12px;
}
.lm-tip{
  font-size:12.5px;line-height:1.7;color:var(--ink-2);
  background:var(--gold-100);border:1px solid #f0dcbb;border-radius:10px;
  padding:9px 13px;margin-bottom:14px;
}
.lm-grid{display:grid;grid-template-columns:308px minmax(0,1fr);gap:16px;align-items:start}

/* 收件人 */
.lm-pick{background:var(--white);border:1px solid var(--line);border-radius:var(--r);padding:14px}
.lm-pick-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.lm-pick-h b{font-size:14.5px;color:var(--navy)}
.lm-pick-h .n{margin-left:auto;font-size:12px;color:var(--blue);font-weight:600}
.lm-pick-ops{display:flex;gap:8px;margin:10px 0}
.lm-groups{max-height:380px;overflow:auto;border:1px solid var(--line-2);border-radius:10px}
.lm-grp{border-bottom:1px solid var(--line-2)}
.lm-grp:last-child{border-bottom:0}
.lm-grp>summary{
  display:flex;align-items:center;gap:9px;padding:9px 11px;cursor:pointer;
  list-style:none;background:var(--blue-50);font-size:13px;
}
.lm-grp>summary::-webkit-details-marker{display:none}
.lm-grp>summary::after{content:"▾";margin-left:6px;color:var(--muted);font-size:11px}
.lm-grp[open]>summary::after{content:"▴"}
.lm-grp>summary b{color:var(--navy);font-size:13px}
.lm-grp>summary .n{margin-left:auto;color:var(--muted);font-size:11.5px}
.lm-grp-t{display:flex;align-items:center;gap:8px;cursor:pointer}
.lm-grp-t input{width:15px;height:15px;accent-color:var(--blue)}
.lm-people{display:flex;flex-direction:column;padding:4px 0}
.lm-p{display:flex;align-items:baseline;gap:8px;padding:5px 12px;cursor:pointer;font-size:13px}
.lm-p:hover{background:var(--blue-50)}
.lm-p input{width:15px;height:15px;flex:0 0 15px;accent-color:var(--blue);transform:translateY(2px)}
.lm-p span{color:var(--ink)}
.lm-p i{font-style:normal;color:var(--muted);font-size:11.5px;margin-left:auto}
.lm-p input:checked+span{font-weight:600;color:var(--navy)}
.lm-extra{display:block;margin-top:12px}
.lm-extra>span{display:block;font-size:12.5px;color:var(--ink-2);margin-bottom:5px}
.lm-extra em{font-style:normal;color:var(--muted);margin-left:6px}
.lm-extra textarea{
  width:100%;padding:8px 10px;border:1px solid var(--line);border-radius:9px;
  font:inherit;font-size:13px;color:var(--ink);resize:vertical;
}

/* 写信 */
.lm-write{background:var(--white);border:1px solid var(--line);border-radius:var(--r);padding:16px 18px}
.lm-f{display:block;margin-bottom:12px}
.lm-f>span{display:block;font-size:12.5px;color:var(--ink-2);margin-bottom:5px}
.lm-f em{font-style:normal;color:var(--muted);margin-left:6px}
.lm-f input,.lm-f textarea{
  width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:9px;
  font:inherit;font-size:13.5px;color:var(--ink);background:var(--white);resize:vertical;
}
.lm-f input:focus,.lm-f textarea:focus{border-color:var(--blue-2);outline:2px solid rgba(26,86,168,.12)}
.lm-send{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:4px}
.lm-res{font-size:13px;line-height:1.6;color:var(--muted)}
.lm-res.ok{color:#16794a;font-weight:600}
.lm-res.bad{color:#c0392b;font-weight:600}
.lm-logs{margin-top:20px}
.lm-logs-h{font-size:13px;font-weight:700;color:var(--navy);margin-bottom:8px}
.lm-bad{color:#c0392b}

/* 没权限 */
.lm-gate{
  background:var(--white);border:1px solid var(--line);border-radius:var(--r);
  padding:36px 28px;text-align:center;box-shadow:var(--sh-1);
}
.lm-gate-ic{font-size:34px;line-height:1;margin-bottom:10px;color:var(--blue-2)}
.lm-gate h3{font-size:17px;color:var(--navy);margin-bottom:10px}
.lm-gate p{max-width:560px;margin:0 auto 8px;font-size:13.5px;line-height:1.85;color:var(--ink-2)}

@media (max-width:900px){
  .lm-grid{grid-template-columns:1fr}
  .lm-groups{max-height:300px}
}
/* 站内消息写消息：收件人按身份/届分组 */
.mp-group{margin-bottom:10px}
.mp-ghead{display:flex;align-items:center;gap:7px;margin-bottom:5px;cursor:pointer;font-size:13px;color:var(--navy)}
.mp-ghead input{width:auto}
.mp-group .mpick{min-height:34px}
/* 站内消息：收件人一行化 —— 「选收件人」按钮展开分组面板 */
.mwrap{position:relative;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.mpicked{font-size:12.5px;color:var(--blue);font-weight:600}
.mpanel{position:absolute;z-index:40;top:calc(100% + 6px);left:0;width:520px;max-width:90vw;
  max-height:420px;overflow:auto;background:#fff;border:1px solid var(--line);border-radius:12px;
  box-shadow:0 10px 30px rgba(20,60,120,.18);padding:12px 14px}
/* 收件人胶囊里的仪器管理员小标（金色，紧跟名字后） */
.mp-item .mi-roles{font-style:normal;font-size:10.5px;color:#9a6200;background:#fff1d6;
  border-radius:6px;padding:1px 5px;margin-left:5px}
/* 已选收件人姓名标签 */
.picked-tag{display:inline-flex;align-items:center;gap:4px;background:var(--blue-50);color:var(--blue);
  border:1px solid #cfe2f7;border-radius:14px;padding:3px 10px;font-size:12.5px;margin:2px 4px 2px 0}
.picked-tag .pt-x{font-style:normal;cursor:pointer;font-weight:700;color:var(--blue);padding:0 2px}
.picked-tag .pt-x:hover{color:var(--err)}
/* 身份标识徽章（导师授予的标签）：统一胶囊圆角，圆弧形不要方角 */
.badge{border-radius:20px}
.mine-hd .badge,.mpf-b .badge{display:inline-block;margin:2px 4px 2px 0;padding:3px 12px;
  border-radius:20px;font-size:12px;font-weight:600;border:1px solid transparent}
/* 概览：姓名旁的身份标识胶囊（自适应长度，两端留白） */
.mine-hd-t .mtags{display:flex;gap:6px;flex-wrap:wrap;margin-top:6px}
.mine-hd .badge{padding:3px 16px;border-radius:20px;font-size:12px;font-weight:600;
  letter-spacing:.05em;line-height:1.6}

/* ==========================================================
   组内论坛
   ========================================================== */
.fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px}
.fboard{display:block;background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px 18px 14px;
  transition:.22s;box-shadow:var(--sh-1)}
.fboard:hover{transform:translateY(-3px);box-shadow:var(--sh-2);border-color:#cfe2f7;text-decoration:none}
.fboard .fb-name{font-size:16.5px;font-weight:700;color:var(--navy);margin-bottom:6px}
.fboard .fb-intro{font-size:13px;color:var(--ink-2);line-height:1.6;min-height:40px}
.fboard .fb-meta{font-size:12px;color:var(--muted);margin-top:10px;padding-top:10px;border-top:1px solid var(--line-2)}
.fboard-h{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin-bottom:16px}
.fboard-h h1{font-size:22px;margin:0 0 4px}
.fboard-h p{color:var(--muted);font-size:14px;margin:0}
.fnew{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;margin-bottom:18px}
.acts{display:flex;gap:10px;align-items:center;margin-top:12px;flex-wrap:wrap}
.fnew input[type=text],.fnew textarea,.freply textarea{width:100%;padding:10px 12px;border:1px solid var(--line);
  border-radius:9px;font-size:14px;font-family:inherit;margin-bottom:10px;box-sizing:border-box}
.flist{display:flex;flex-direction:column;gap:10px}
.frow{display:flex;align-items:center;gap:14px;background:#fff;border:1px solid var(--line);border-radius:11px;
  padding:14px 16px;transition:.18s;box-shadow:var(--sh-1)}
.frow:hover{transform:translateY(-2px);box-shadow:var(--sh-2);border-color:#cfe2f7;text-decoration:none}
.frow .fr-main{flex:1;min-width:0}
.frow .fr-title{font-size:15px;font-weight:600;color:var(--navy);line-height:1.5}
.frow .fr-meta{font-size:12.5px;color:var(--muted);margin-top:5px}
.frow .fr-side{text-align:right;font-size:12.5px;color:var(--muted);white-space:nowrap}
.frow .fr-side span{display:block;margin:2px 0}
.fchp{display:inline-block;font-size:12px;font-weight:700;padding:2px 9px;border-radius:5px;margin-right:7px;
  background:#fdecec;color:#c0392b;vertical-align:2px;white-space:nowrap}
.fchp.d{background:#fdf3e3;color:#b8860b}
.ftopic,.fpost{display:flex;gap:18px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:18px;margin-bottom:14px;box-shadow:var(--sh-1)}
.ftopic.digest{border-color:#f0d69a;background:#fffdf6}
.ftopic .ft-main,.fpost .ft-main{flex:1;min-width:0}
.ftopic h1{font-size:20px;margin:0 0 12px;line-height:1.5}
.ft-body{font-size:15px;line-height:1.9;color:var(--ink);word-break:break-word}
.ft-body img{max-width:100%;border-radius:8px}
.ft-foot{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-top:16px;
  padding-top:12px;border-top:1px solid var(--line-2);flex-wrap:wrap}
.ft-acts{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* 论坛操作按钮（赞/编辑/置顶/加精/删帖）——胶囊轻按钮，比裸文字链接醒目 */
.ft-acts .fact{display:inline-flex;align-items:center;gap:4px;padding:4px 13px;border:1px solid var(--line);
  border-radius:999px;background:#fff;font-size:12.5px;font-weight:500;color:#3d4f61;
  text-decoration:none;white-space:nowrap;transition:.15s}
.ft-acts .fact:hover{border-color:var(--blue);color:var(--blue);background:var(--blue-50);text-decoration:none}
.ft-acts .fact.on{background:var(--blue);border-color:var(--blue);color:#fff;font-weight:600}
.ft-acts .fact.danger{color:#c0392b;border-color:#efc7c2}
.ft-acts .fact.danger:hover{background:#fdecec;border-color:#c0392b;color:#c0392b}
.ft-side{flex:0 0 180px}
.fpost-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}
.freply{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px;margin-top:8px}
.freply h3{margin:0 0 12px;font-size:16px}
/* 用户卡片（作者信息） */
.fu{font-size:13px;color:var(--ink-2);line-height:1.6}
.fu img,.fu-av{width:56px;height:56px;border-radius:50%;object-fit:cover;display:block;margin-bottom:8px}
.fu-av{display:flex;align-items:center;justify-content:center;color:#fff;font-size:22px;font-weight:700}
.fu-nm{font-size:15px;font-weight:700;color:var(--navy);margin-bottom:4px}
.fu-tags{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0}
.fut{font-size:11px;padding:1px 7px;border-radius:20px;border:1px solid}
.fu-meta{font-size:12px;color:var(--muted);margin-top:6px}
.flv{display:inline-block;font-size:11.5px;font-weight:700;padding:1px 8px;border-radius:20px;border:1px solid}
@media (max-width:700px){.ftopic,.fpost{flex-direction:column}.ft-side{flex:1 1 auto}}

/* 个人中心菜单里的「组内论坛」入口：别的颜色 + 加粗，突出新功能 */
.mn-i.accent{color:var(--blue);font-weight:700}
.mn-i.accent:hover{background:var(--blue-50);color:var(--blue)}

/* 论坛编辑器 */
.fed{border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff}
.fed-tb{display:flex;flex-wrap:wrap;gap:4px;padding:8px 10px;background:var(--blue-50);border-bottom:1px solid var(--line)}
.fed-tb button,.fed-sel{min-width:30px;height:28px;padding:0 8px;border:1px solid var(--line);border-radius:7px;
  background:#fff;color:var(--ink);font-size:12.5px;cursor:pointer;font-family:inherit}
.fed-tb button:hover,.fed-sel:hover{background:var(--blue-100);color:var(--blue);border-color:#cfe2f7}
.fed-cbtn{position:relative;display:inline-flex;align-items:center;gap:2px;height:28px;padding:0 8px;
  border:1px solid var(--line);border-radius:7px;background:#fff;font-size:12.5px;cursor:pointer}
.fed-cbtn input[type=color]{width:16px;height:16px;border:0;padding:0;background:none;cursor:pointer}
.fed-body{min-height:140px;padding:12px 14px;font-size:14.5px;line-height:1.85;color:var(--ink);
  outline:none;word-break:break-word}
.fed-body:empty::before{content:attr(data-ph);color:var(--muted)}
.fed-body img{max-width:100%;border-radius:8px}
.fed-emoji{display:flex;flex-wrap:wrap;gap:2px;padding:8px 10px;background:#f8fafc;border-bottom:1px solid var(--line)}
.fed-emo{width:32px;height:32px;border:0;background:none;font-size:20px;cursor:pointer;border-radius:6px}
.fed-emo:hover{background:var(--blue-50)}
.fed-attach-bar{display:flex;align-items:center;gap:10px;padding:8px 10px;background:#f8fafc;border-top:1px solid var(--line)}
.fed-attbtn{padding:5px 12px;border:1px solid var(--line);border-radius:7px;background:#fff;font-size:13px;cursor:pointer}
.fed-attbtn:hover{background:var(--blue-50);color:var(--blue)}
.fed-attach-list{padding:6px 10px 10px}
.fa-row{display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:7px;font-size:13px}
.fa-row:hover{background:var(--blue-50)}
.fa-row .fatt-nm{flex:0 1 auto;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:420px}
.fa-row .fa-del{border:0;background:none;color:#c0392b;cursor:pointer;font-size:13px}
/* 帖子/回复里的附件列表 */
.fatts{display:flex;flex-direction:column;gap:6px;margin-top:12px}
.fatt{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1px solid var(--line);border-radius:9px;
  background:#f8fafc;text-decoration:none;font-size:13.5px}
.fatt:hover{border-color:#cfe2f7;background:var(--blue-50)}
.fatt-nm{color:var(--blue);font-weight:500}
.fatt-sz{color:var(--muted);font-size:12px}

/* 论坛上传进度 */
.fed-prog{padding:8px 14px;font-size:13px;color:var(--blue);background:var(--blue-50)}
.fa-row.uploading{opacity:.75}
.fa-row .fa-prog{color:var(--blue);font-size:12.5px;white-space:nowrap}
.fa-row .fa-bar{flex:1 1 auto;max-width:220px;height:6px;border-radius:4px;background:#e6edf5;overflow:hidden}
.fa-row .fa-bar i{display:block;width:0;height:100%;border-radius:4px;background:var(--blue);transition:width .15s ease}
.fa-row.fa-err{background:#fdecec}
.fa-row.fa-err .fa-prog{color:#c0392b}
