/* 雷迪恩客服数据中心 · 深色毛玻璃主题
   强调色用青色（cyan-400 #22d3ee）而非品牌蓝：深色底上对比度更高、读起来更省力，
   又比纯 #0ff 柔和不刺眼。三个场景页共用这一份，改样式只改这里。

   毛玻璃的真实感来自四层叠加，缺一层就"塑料"：
     1) 大半径背景模糊 + 饱和度提升（把背后的辉光揉开）
     2) 表面本身的渐变（上亮下暗，模拟玻璃厚度）
     3) 内嵌高光边（inset 阴影，玻璃的折射边缘）
     4) 极细颗粒噪点（磨砂质感，纯色平面一眼假）
   深色界面里外阴影几乎看不见，**别靠 box-shadow 拉层次**。 */

/* ── 字体：自托管，不走 Google Fonts ──
   两个理由：①部署到 VPS 后要在国内访问，fonts.googleapis.com 常年不稳；
   ②这是内部工具，多一个外部依赖就多一个「今天怎么变丑了」。
   两款都是 SIL Open Font License，允许自托管转发。合计 64KB。
   Inter 是可变字体，**一个文件覆盖 100–900 全部字重**（下过三次才发现三份
   md5 完全相同）。font-display:swap —— 字体没到之前先用系统字渲染，
   绝不留白屏。 */
@font-face{
  font-family:"Michroma";font-style:normal;font-weight:400;font-display:swap;
  src:url("/static/fonts/michroma-full.ttf") format("truetype");
}
@font-face{
  font-family:"Inter";font-style:normal;font-weight:100 900;font-display:swap;
  src:url("/static/fonts/inter-var-latin.woff2") format("woff2");
}

:root{
  --cy:#22d3ee;              /* 主强调色 */
  --cy-soft:#67e8f9;         /* 高光/渐变顶端 */
  --cy-deep:#0891b2;         /* 渐变底端 */
  --cy-glow:rgba(34,211,238,.30);
  --cy-faint:rgba(34,211,238,.10);

  --ink:#e9f3f7;
  --ink2:#a6bcc7;
  --ink3:#6f8794;

  --glass:rgba(255,255,255,.045);
  --glass-hi:rgba(255,255,255,.085);
  --line:rgba(255,255,255,.11);
  --line-hi:rgba(255,255,255,.18);

  --ok:#34e0a1;  --ok-bg:rgba(52,224,161,.11);
  --warn:#f5c344; --warn-bg:rgba(245,195,68,.11);
  --err:#ff6f61; --err-bg:rgba(255,111,97,.12);

  --r:20px;

  /* 字体：靠**回退链**分工，不靠给中英文套不同标签。
     Michroma 和 Inter 都只有拉丁字形，遇到汉字会自动落到链条后面的中文字体——
     所以一条 font-family 就能做到「英文用指定字体、中文用系统字体」，
     不需要把中英文拆进不同的 span 里（那种做法一改文案就出错）。 */
  --font-display:"Michroma","PingFang SC","Microsoft YaHei","Hiragino Sans GB",
                 system-ui,sans-serif;           /* 英文大标题 */
  --font:"Inter",-apple-system,BlinkMacSystemFont,"SF Pro SC","PingFang SC",
         "Microsoft YaHei","Hiragino Sans GB",system-ui,sans-serif;   /* 正文 */

  /* 磨砂颗粒。用内联 SVG 湍流噪声，不依赖外部图片 */
  --grain:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23n)' opacity='.42'/%3E%3C/svg%3E");
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;color:var(--ink);font-family:var(--font);
  font-size:15px;line-height:1.7;letter-spacing:.01em;
  -webkit-font-smoothing:antialiased;
  background:#0a0c0e;
}

/* 背景：**必须有可辨认的形状，毛玻璃才看得出来。**
   之前是几团很淡的雾，卡片压上去背后仍是纯黑 —— 模糊 0 和模糊 40px 长得一模一样。
   参考图里玻璃能看出来，是因为后面压着地图（有轮廓、有明暗）。
   这里用「几团边界清楚的光斑 + 细网格」替代地图：光斑刻意放在**内容列正下方**，
   卡片会盖在它们上面，虚化才有东西可虚。 */
.bg{
  position:fixed;inset:0;z-index:-2;
  background:linear-gradient(180deg,#0a0c0e 0%,#0d1114 50%,#090b0d 100%);
}
/* 细网格：给玻璃一个"背后有结构"的参照物。单独一层，方便调浓淡 */
.bg::before{
  content:"";position:absolute;inset:0;
  background-image:
    linear-gradient(rgba(255,255,255,.028) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255,255,255,.028) 1px, transparent 1px);
  background-size:56px 56px;
  mask-image:radial-gradient(1200px 900px at 50% 30%, #000 20%, transparent 78%);
  -webkit-mask-image:radial-gradient(1200px 900px at 50% 30%, #000 20%, transparent 78%);
}
.bg::after{
  content:"";position:absolute;inset:0;background-image:var(--grain);
  opacity:.14;mix-blend-mode:overlay;pointer-events:none;
}
/* 光斑本体。放在 .wrap 之前的独立层，位置对准内容列 */
.orbs{position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden}
.orb{position:absolute;border-radius:50%;filter:blur(70px);opacity:.5}
.orb.a{width:520px;height:520px;left:6%;top:4%;
  background:radial-gradient(circle at 35% 35%, #22d3ee, transparent 68%)}
.orb.b{width:420px;height:420px;left:52%;top:26%;
  background:radial-gradient(circle at 40% 40%, #0891b2, transparent 66%)}
.orb.c{width:600px;height:600px;left:26%;top:58%;
  background:radial-gradient(circle at 45% 45%, #1e6b8c, transparent 70%)}
.orb.d{width:360px;height:360px;right:4%;top:70%;
  background:radial-gradient(circle at 40% 40%, #67e8f9, transparent 66%);opacity:.32}
@media(prefers-reduced-motion:no-preference){
  /* 极慢的漂移：静止的光斑看久了像贴图，微动才像"背后真有东西" */
  .orb.a{animation:drift1 34s ease-in-out infinite alternate}
  .orb.b{animation:drift2 41s ease-in-out infinite alternate}
  .orb.c{animation:drift1 47s ease-in-out infinite alternate-reverse}
}
@keyframes drift1{to{transform:translate(70px,-46px) scale(1.10)}}
@keyframes drift2{to{transform:translate(-58px,54px) scale(.92)}}

.wrap{max-width:1060px;margin:0 auto;padding:56px 24px 120px}

/* ---------- 毛玻璃基座：.card / .entry / .glass 共用这套观感 ---------- */
.glass,.card,.entry{
  position:relative;
  border:1px solid var(--line);
  border-radius:var(--r);
  background:
    linear-gradient(165deg, rgba(255,255,255,.055), rgba(255,255,255,.012) 55%,
                    rgba(255,255,255,.028));
  backdrop-filter:blur(40px) saturate(150%) brightness(1.03);
  -webkit-backdrop-filter:blur(40px) saturate(150%) brightness(1.03);
  /* 内嵌高光：玻璃的折射边。深色里这一条比任何外阴影都管用 */
  box-shadow:inset 0 1px 0 rgba(255,255,255,.16),
             inset 0 -1px 0 rgba(255,255,255,.04),
             0 18px 50px -30px rgba(0,0,0,.9);
  overflow:hidden;
}
/* 磨砂颗粒叠在面板上 —— 纯色平面一眼就是假玻璃 */
.glass::after,.card::after,.entry::after{
  content:"";position:absolute;inset:0;background-image:var(--grain);
  opacity:.09;mix-blend-mode:overlay;pointer-events:none;border-radius:inherit;
}

/* ---------- 首页 ---------- */
.hero{text-align:center;margin-bottom:52px}
.brandmark{
  font-family:var(--font-display);
  font-size:13px;letter-spacing:.34em;color:var(--cy);
  font-weight:400;margin-bottom:20px;text-indent:.34em;
  text-shadow:0 0 22px var(--cy-glow);
}
/* 大标题。Michroma 是等宽感很强的展示体，字距要放开、字重不能再加粗
   （它只有 400 一个字重，写 600/700 会触发浏览器合成加粗，糊成一团）。 */
.hero h1{
  font-family:var(--font-display);
  font-size:clamp(38px,6.4vw,60px);margin:0 0 16px;font-weight:400;
  letter-spacing:.02em;line-height:1.2;
  background:linear-gradient(180deg,#fff,#a9d9e6);
  -webkit-background-clip:text;background-clip:text;color:transparent;
}
.hero .sub{color:var(--ink2);margin:0 auto;font-size:15.5px;max-width:62ch}

.entries{display:grid;gap:16px}
.entry{
  display:grid;grid-template-columns:auto 1fr auto;align-items:center;gap:22px;
  padding:26px 28px;text-decoration:none;color:inherit;
  transition:transform .26s cubic-bezier(.2,.8,.3,1),
             border-color .26s, box-shadow .26s;
}
.entry:hover{
  transform:translateY(-3px);
  border-color:rgba(34,211,238,.46);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.22),
             0 22px 60px -30px rgba(0,0,0,.95),
             0 0 0 1px rgba(34,211,238,.10),
             0 10px 46px -22px var(--cy-glow);
}
.entry .ico{
  width:52px;height:52px;border-radius:15px;display:grid;place-items:center;
  color:var(--cy);
  background:linear-gradient(160deg,rgba(34,211,238,.22),rgba(34,211,238,.05));
  border:1px solid rgba(34,211,238,.30);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.18);
  transition:box-shadow .26s,transform .26s;
}
.entry:hover .ico{box-shadow:inset 0 1px 0 rgba(255,255,255,.22),
                             0 0 26px -6px var(--cy-glow)}
.entry .ico svg{width:26px;height:26px}
.entry h2{
  font-size:18px;margin:0 0 5px;font-weight:600;letter-spacing:-.01em;
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
}
.entry p{margin:0 0 10px;color:var(--ink2);font-size:14px}
.entry .need{margin:0;padding:0;list-style:none;font-size:13px;color:var(--ink3)}
.entry .need li{margin:2px 0}
.entry .need b{color:var(--ink2);font-weight:500;margin-right:2px}

/* 进入：胶囊按钮。默认描边、悬停填充并让箭头滑出 */
.go{
  display:inline-flex;align-items:center;gap:8px;white-space:nowrap;
  padding:9px 20px;border-radius:99px;font-size:14px;font-weight:500;
  color:var(--cy);
  background:rgba(34,211,238,.07);
  border:1px solid rgba(34,211,238,.34);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.10);
  transition:background .26s,color .26s,border-color .26s,
             box-shadow .26s,transform .26s cubic-bezier(.2,.8,.3,1);
}
.go .arw{display:inline-block;transition:transform .26s cubic-bezier(.2,.8,.3,1)}
.entry:hover .go{
  color:#04161c;border-color:transparent;transform:translateX(3px);
  background:linear-gradient(150deg,var(--cy-soft),var(--cy));
  box-shadow:0 8px 24px -10px var(--cy-glow),inset 0 1px 0 rgba(255,255,255,.35);
}
.entry:hover .go .arw{transform:translateX(4px)}

.tag{
  font-size:11px;font-weight:500;letter-spacing:.02em;padding:3px 9px;border-radius:99px;
  color:var(--ink2);background:rgba(255,255,255,.06);border:1px solid var(--line);
}
.tag.on{color:var(--cy);background:rgba(34,211,238,.13);border-color:rgba(34,211,238,.32)}

.foot{margin-top:38px;text-align:center;color:var(--ink3);font-size:13px}
.foot a{color:var(--cy);text-decoration:none}
.foot a:hover{text-decoration:underline}

/* 右上角登录信息（ui.js userBar）。固定定位，不占文档流，老页面不用改布局 */
.userbar{
  position:fixed;top:14px;right:18px;z-index:40;display:flex;align-items:center;gap:14px;
  padding:7px 15px;border-radius:99px;font-size:12.5px;color:var(--ink3);
  background:rgba(8,18,28,.62);border:1px solid var(--line);
  -webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);
}
.userbar .uname{color:var(--ink2);font-weight:500}
.userbar a{color:var(--ink3);text-decoration:none;transition:color .16s}
.userbar a:hover{color:var(--cy)}
@media(max-width:640px){.userbar{top:auto;bottom:14px;right:50%;transform:translateX(50%)}}

/* 分区页（/kefu、/geo）的返回按钮。
   这两页的 hero 是居中的，塞不进 .pagehead，所以单独起一行放左上角 ——
   位置和外观都跟二级页的 .back 一致，用户在哪一层都按同一个地方返回。
   原来做成 brandmark 旁边一行淡青色小字「← 返回大厅」，
   opacity .6 之后对比度不够，而且和二级页两种样式。 */
.topback{margin-bottom:20px}

/* ---------- 场景页头部 ---------- */
.pagehead{display:flex;align-items:flex-start;gap:16px;margin-bottom:30px}
.back{
  flex:none;width:38px;height:38px;border-radius:12px;display:grid;place-items:center;
  color:var(--ink2);text-decoration:none;
  background:rgba(255,255,255,.05);border:1px solid var(--line);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12);
  transition:.22s;
}
.back:hover{color:var(--cy);border-color:rgba(34,211,238,.42);transform:translateX(-2px)}
.pagehead h1{font-size:30px;margin:0 0 6px;font-weight:600;letter-spacing:-.015em}
.pagehead .sub{color:var(--ink2);margin:0;font-size:14px}
.pagehead .sub a{color:var(--cy);text-decoration:none}

/* ---------- 步骤卡 ---------- */
.card{padding:24px 26px;margin-bottom:16px}
.card h2{font-size:15px;margin:0 0 4px;display:flex;align-items:center;gap:10px;font-weight:600}
.step{
  width:23px;height:23px;border-radius:50%;flex:none;
  font-size:12px;display:grid;place-items:center;font-weight:700;color:#04161c;
  background:linear-gradient(150deg,var(--cy-soft),var(--cy));
  box-shadow:0 0 0 1px rgba(34,211,238,.34),0 5px 16px -7px var(--cy-glow),
             inset 0 1px 0 rgba(255,255,255,.4);
}
.hint{color:var(--ink3);font-size:13px;margin:0 0 18px 33px;line-height:1.65}
.hint b{color:var(--ink2);font-weight:500}

input[type=date]{
  font:inherit;font-size:15px;padding:10px 14px;border-radius:11px;color:var(--ink);
  background:rgba(255,255,255,.06);border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
  color-scheme:dark;transition:.2s;
}
input[type=date]:focus{outline:none;border-color:var(--cy);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 0 0 3px rgba(34,211,238,.18)}

/* ---------- 拖拽框 ---------- */
.zones{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}
.zones3{grid-template-columns:repeat(3,1fr)}
.zones4{grid-template-columns:repeat(4,1fr)}
@media(max-width:860px){.zones,.zones3,.zones4{grid-template-columns:repeat(2,1fr)}}
.zone{
  position:relative;
  border:1.5px dashed var(--line-hi);border-radius:13px;padding:18px 12px;text-align:center;
  background:rgba(255,255,255,.028);cursor:pointer;min-height:130px;
  display:flex;flex-direction:column;justify-content:center;gap:6px;
  backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);
  transition:border-color .2s,background .2s,transform .2s,box-shadow .2s;
}
.zone:hover{border-color:var(--cy);background:rgba(34,211,238,.08);
  box-shadow:0 0 26px -14px var(--cy-glow)}
.zone.over{border-color:var(--cy);background:rgba(34,211,238,.14);transform:scale(1.02);
  box-shadow:0 0 34px -12px var(--cy-glow)}
.zone.done{border-style:solid;border-color:rgba(52,224,161,.5);background:var(--ok-bg)}
.zone.bad{border-style:solid;border-color:rgba(255,111,97,.5);background:var(--err-bg)}
.zname{font-weight:600;font-size:14px;color:var(--ink)}
.zmsg{font-size:12px;color:var(--ink3);word-break:break-all;line-height:1.55}
.zone.done .zmsg{color:var(--ok)}
.zone.bad .zmsg{color:var(--err)}
.zclear{font-size:11px;color:var(--ink3);text-decoration:underline;cursor:pointer}

/* ---------- 按钮与进度 ---------- */
.runbar{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
button.primary{
  font:inherit;font-size:15px;font-weight:600;padding:13px 42px;border:0;border-radius:99px;
  color:#04161c;cursor:pointer;letter-spacing:.02em;
  background:linear-gradient(150deg,var(--cy-soft),var(--cy));
  box-shadow:0 10px 30px -14px var(--cy-glow),inset 0 1px 0 rgba(255,255,255,.4);
  transition:transform .2s cubic-bezier(.2,.8,.3,1),box-shadow .2s,filter .2s;
}
button.primary:hover:not(:disabled){
  transform:translateY(-2px);filter:brightness(1.07);
  box-shadow:0 16px 38px -16px var(--cy-glow),inset 0 1px 0 rgba(255,255,255,.45);
}
button.primary:active:not(:disabled){transform:translateY(0)}
button.primary:disabled{
  background:rgba(255,255,255,.07);color:var(--ink3);box-shadow:none;cursor:not-allowed;
}
.runnote{color:var(--ink3);font-size:13px}

.bar{height:6px;background:rgba(255,255,255,.07);border-radius:99px;overflow:hidden;margin:16px 0 8px}
.bar>i{display:block;height:100%;width:0;border-radius:99px;transition:width .35s ease;
  background:linear-gradient(90deg,var(--cy-deep),var(--cy-soft));
  box-shadow:0 0 14px -2px var(--cy-glow)}
.prog{font-size:13px;color:var(--ink2);font-variant-numeric:tabular-nums}

/* ---------- 表格 ---------- */
table{width:100%;border-collapse:collapse;font-size:14px}
th{text-align:left;font-size:12px;color:var(--ink3);font-weight:500;padding:9px 10px;
   border-bottom:1px solid var(--line)}
td{padding:11px 10px;border-bottom:1px solid rgba(255,255,255,.05)}
tr:last-child td{border-bottom:0}
.num{text-align:right;font-variant-numeric:tabular-nums}
.pill{display:inline-block;padding:2px 10px;border-radius:99px;font-size:12px;font-weight:600}
.pill.ok{background:var(--ok-bg);color:var(--ok)}
.pill.no{background:var(--err-bg);color:var(--err)}

/* ---------- 报错：上层人话 + 下层技术详情 ---------- */
.msg{border-radius:13px;padding:15px 17px;margin-bottom:11px;border-left:3px solid;
     background:rgba(255,255,255,.035);
     backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px)}
.msg.error{background:var(--err-bg);border-color:var(--err)}
.msg.warn{background:var(--warn-bg);border-color:var(--warn)}
.msg h4{margin:0 0 5px;font-size:14px}
.msg.error h4{color:var(--err)} .msg.warn h4{color:var(--warn)}
.msg p{margin:0 0 5px;font-size:13.5px;color:var(--ink2)}
.msg strong{color:var(--ink);font-weight:600}
.msg .todo{color:var(--ink)}
.msg details{margin-top:10px}
.msg summary{cursor:pointer;font-size:12px;color:var(--ink3);user-select:none;
  list-style:none;display:inline-block;padding:3px 11px;border-radius:99px;
  background:rgba(255,255,255,.05);border:1px solid var(--line);transition:.2s}
.msg summary::-webkit-details-marker{display:none}
.msg summary:hover{color:var(--cy);border-color:rgba(34,211,238,.36)}
.msg pre{margin:9px 0 0;padding:11px 13px;background:rgba(0,0,0,.42);color:#8fd4e4;
  border:1px solid var(--line);border-radius:10px;
  font-family:"SF Mono",Consolas,monospace;font-size:11.5px;line-height:1.6;
  white-space:pre-wrap;word-break:break-all;max-height:230px;overflow:auto}

/* ---------- 运行日志：收在角落，主动点才展开 ---------- */
.logbtn{
  position:fixed;right:20px;bottom:20px;z-index:20;cursor:pointer;
  padding:10px 20px;border-radius:99px;font-size:13px;color:var(--ink2);
  background:rgba(12,26,34,.62);border:1px solid var(--line);
  backdrop-filter:blur(26px) saturate(170%);-webkit-backdrop-filter:blur(26px) saturate(170%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.12),0 8px 26px -14px rgba(0,0,0,.9);
  transition:.22s;
}
.logbtn:hover{color:var(--cy);border-color:rgba(34,211,238,.44);transform:translateY(-2px)}
.logpane{
  position:fixed;right:20px;bottom:66px;z-index:20;
  width:min(780px,calc(100vw - 40px));height:min(470px,62vh);
  display:none;flex-direction:column;border-radius:15px;overflow:hidden;
  background:rgba(8,18,25,.78);border:1px solid var(--line);
  backdrop-filter:blur(34px) saturate(180%);
  -webkit-backdrop-filter:blur(34px) saturate(180%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14),0 26px 74px -26px rgba(0,0,0,.92);
}
.logpane.show{display:flex}
.loghead{padding:11px 16px;border-bottom:1px solid var(--line);
  font-size:12.5px;color:var(--ink3);display:flex;justify-content:space-between;align-items:center}
.loghead b{color:var(--ink);font-weight:600}
.logbody{flex:1;overflow:auto;padding:13px 16px;color:#8fd4e4;
  font-family:"SF Mono",Consolas,monospace;font-size:12px;line-height:1.65;
  white-space:pre-wrap;word-break:break-all}

/* ---------- 尚未开放的场景 ---------- */
.soon{text-align:center;padding:56px 30px}
.soon .ico{width:62px;height:62px;margin:0 auto 20px;border-radius:17px;display:grid;
  place-items:center;color:var(--cy);
  background:linear-gradient(160deg,rgba(34,211,238,.20),rgba(34,211,238,.04));
  border:1px solid rgba(34,211,238,.28);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.18),0 0 30px -10px var(--cy-glow)}
.soon .ico svg{width:30px;height:30px}
.soon h2{font-size:19px;margin:0 0 8px;font-weight:600}
.soon p{color:var(--ink2);margin:0 auto 6px;max-width:560px;font-size:14px}
.soon .todo{margin-top:22px;text-align:left;max-width:560px;margin-inline:auto;
  padding:16px 20px;border-radius:13px;background:rgba(255,255,255,.035);
  border:1px solid var(--line);font-size:13.5px;color:var(--ink2);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.10)}
.soon .todo b{color:var(--ink);display:block;margin-bottom:7px;font-size:13px}
.soon .todo li{margin:4px 0}


/* ---------- 上传框里的文件名与格式徽标 ---------- */
/* 只显示"已上传 325 KB"看不出传的是哪一份 —— 四个框长得一样，传错了发现不了。
   所以列出**完整原始文件名**，并用颜色徽标把格式先亮出来。 */
.zone.done,.zone.bad{padding:14px 10px}
.fchip{
  display:inline-block;margin-bottom:6px;padding:2px 9px;border-radius:6px;
  font-size:10.5px;font-weight:700;letter-spacing:.06em;font-family:"SF Mono",Consolas,monospace;
}
.fchip.x{color:#7ee2b8;background:rgba(52,224,161,.14);border:1px solid rgba(52,224,161,.30)}
.fchip.t{color:#8fd4e4;background:rgba(34,211,238,.13);border:1px solid rgba(34,211,238,.30)}
.fchip.o{color:#e2c887;background:rgba(245,195,68,.13);border:1px solid rgba(245,195,68,.30)}
.fname{
  display:block;font-size:11.5px;line-height:1.45;color:var(--ink);
  word-break:break-all;margin-bottom:4px;
  /* 长文件名最多三行，再长省略 —— 免得把框撑得高低不齐 */
  display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
}
.fmeta{display:block;font-size:11px;color:var(--ink3)}
.zone.done .fmeta,.zone.done .fname{color:inherit}
.zone.done .fname{color:var(--ink)}
.zone.done .fmeta{color:var(--ink3)}


/* ---------- 一个上传框里的多份文件 ---------- */
/* 有的平台把响应时长与用户评价放在同一份导出里，天猫却分成两份。
   两份都要，所以按行列出、各自可移除。 */
.frow{display:block;margin-bottom:9px}
.frow:last-of-type{margin-bottom:4px}
.fadd{display:block;font-size:11px;color:var(--ink3);opacity:.75;margin-top:2px}


/* ---------- 流程分段（质检页：跑质检 → 人工填 → 出周报） ---------- */
/* 中间隔着一步人工，不能做成一个按钮走到底。分段标题就是把这个"断点"讲清楚。 */
.phase{display:flex;align-items:center;gap:12px;margin:30px 4px 14px}
.pnum{
  flex:none;padding:4px 13px;border-radius:99px;font-size:12px;font-weight:600;
  color:var(--cy);background:rgba(34,211,238,.11);
  border:1px solid rgba(34,211,238,.30);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.10);
}
.ptxt{color:var(--ink2);font-size:13.5px}
.phase::after{content:"";flex:1;height:1px;
  background:linear-gradient(90deg,var(--line),transparent)}

select{
  font:inherit;font-size:14px;padding:9px 13px;border-radius:11px;color:var(--ink);
  background:rgba(255,255,255,.06);border:1px solid var(--line);color-scheme:dark;
}
input[type=text]{
  font:inherit;font-size:14px;padding:10px 14px;border-radius:11px;color:var(--ink);
  background:rgba(255,255,255,.06);border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
}
input[type=text]:focus,select:focus{outline:none;border-color:var(--cy);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 0 0 3px rgba(34,211,238,.18)}


/* ---------- 次要动作按钮 ---------- */
/* 周报页有四个动作，只有「生成报告并存档」是主路径，其余三个是辅助。
   全做成实心胶囊会让人不知道该点哪个 —— 主次要靠视觉分出来。 */
button.ghost{
  font:inherit;font-size:14px;font-weight:500;padding:11px 22px;border-radius:99px;
  cursor:pointer;color:var(--ink2);
  background:rgba(255,255,255,.05);
  border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.10);
  transition:.2s;
}
button.ghost:hover:not(:disabled){
  color:var(--cy);border-color:rgba(34,211,238,.42);transform:translateY(-1px);
}
button.ghost:disabled{opacity:.45;cursor:not-allowed}


/* ---------- 模式单选（周报页：先选后执行，防误触） ---------- */
/* 四个动作里有两个有副作用（覆写数据、发群），点错收不回来。
   所以按钮只负责"选"，执行统一走底下一个确认键 —— 把"选择"和"触发"拆开。 */
.modes{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:12px}
.mode{
  display:block;padding:14px 16px;border-radius:13px;cursor:pointer;
  background:rgba(255,255,255,.03);border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
  transition:border-color .2s,background .2s,box-shadow .2s;
}
.mode:hover{border-color:var(--line-hi);background:rgba(255,255,255,.055)}
.mode input{position:absolute;opacity:0;pointer-events:none}
.mode .mt{
  display:block;font-size:14px;font-weight:600;color:var(--ink2);margin-bottom:4px;
  padding-left:24px;position:relative;transition:color .2s;
}
/* 自绘单选点：原生 radio 在深色下几乎看不见 */
.mode .mt::before{
  content:"";position:absolute;left:0;top:3px;width:15px;height:15px;border-radius:50%;
  border:1.5px solid var(--line-hi);transition:.2s;
}
.mode input:checked ~ .mt{color:var(--cy)}
.mode input:checked ~ .mt::before{
  border-color:var(--cy);
  box-shadow:inset 0 0 0 3.5px #0a0c0e, inset 0 0 0 9px var(--cy);
}
.mode:has(input:checked){
  border-color:rgba(34,211,238,.44);background:rgba(34,211,238,.07);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.14),0 0 26px -14px var(--cy-glow);
}
.mode .md{display:block;font-size:12.5px;color:var(--ink3);line-height:1.6;padding-left:24px}
.mode .md b{color:var(--ink2);font-weight:500}

/* ---- 「用本地日归档拼周数据」块（质检页 / 周报页共用） ----
   刻意做成卡片里的一个内嵌区，而不是另起一张卡：它和下面的上传框是
   **同一件事的两条路**，并排放才看得出是二选一，分成两张卡会让人以为都得做。 */
.stitch{
  margin:0 0 16px 33px;padding:14px 16px;border-radius:12px;
  background:rgba(255,255,255,.04);border:1px solid var(--line);
}
.stitchhead{margin-bottom:11px}
.stitchhead b{font-size:13.5px;color:var(--ink2);font-weight:600}
.stitchhead .hint{margin:5px 0 0;font-size:12.5px}
.stitch .row{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.chk{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--ink2);cursor:pointer}
.chk input{accent-color:var(--cy);width:14px;height:14px;cursor:pointer}
.srow{
  margin-top:9px;padding:9px 12px;border-radius:9px;font-size:12.5px;line-height:1.6;
  background:rgba(255,255,255,.045);border-left:2.5px solid var(--line-hi);
}
.srow.good{border-left-color:var(--cy)}
.srow.bad{border-left-color:var(--err)}
.srow b{color:var(--ink);font-weight:600}
.srow .sub{margin-top:4px;font-size:11.5px;color:var(--ink3)}
.srow .sub.warn{color:var(--warn)}

/* ============================================================
   自绘表单控件（配 static/ui.js）

   为什么不用纯 CSS：`<select>` 展开的选项列表、`<input type=date>` 弹出的日历，
   都是浏览器/系统自己渲染的，CSS 够不着 —— 只能改收起来那一块。要让面板也跟
   深色毛玻璃一致，只能自己画一遍。

   原生控件仍留在 DOM 里（.nativehide 只是视觉隐藏），值和 change 事件照旧，
   JS 没加载时退回原生外观，功能不受影响。
   ============================================================ */
.nativehide{
  position:absolute;opacity:0;pointer-events:none;width:0;height:0;
  padding:0;border:0;margin:0;
}

/* ---------- 共用：浮层 ---------- */
.dp,.sl{position:relative;display:inline-block;vertical-align:middle}
/* 面板由 ui.js 挂到 <body> 上、用 fixed 手动定位 —— 因为 .card 是 overflow:hidden，
   而且它的 backdrop-filter 会成为固定定位的包含块，放在卡片里怎么都会被裁掉。 */
.dppop,.slpop{
  position:fixed;z-index:400;top:0;left:0;
  padding:10px;border-radius:16px;
  background:rgba(16,22,26,.82);
  border:1px solid var(--line-hi);
  backdrop-filter:blur(30px) saturate(160%);
  -webkit-backdrop-filter:blur(30px) saturate(160%);
  box-shadow:0 18px 50px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.09);
  opacity:0;transform:translateY(-6px) scale(.97);transform-origin:top left;
  pointer-events:none;transition:opacity .16s ease,transform .16s cubic-bezier(.2,.9,.3,1.3);
}
.dppop.open,.slpop.open{opacity:1;transform:none;pointer-events:auto}

/* ---------- 日期字段 ---------- */
.dpbtn,.slbtn{
  font:inherit;display:inline-flex;align-items:center;gap:10px;cursor:pointer;
  color:var(--ink);border-radius:11px;
  background:rgba(255,255,255,.06);border:1px solid var(--line);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
  transition:border-color .2s,background .2s,box-shadow .2s,transform .12s;
}
.dpbtn{font-size:15px;padding:10px 14px}
.slbtn{font-size:14px;padding:9px 13px;width:100%;justify-content:space-between}
.dpbtn:hover,.slbtn:hover{border-color:var(--line-hi);background:rgba(255,255,255,.085)}
.dpbtn:active,.slbtn:active{transform:translateY(1px)}
/* 面板已经不是控件的后代了，展开态靠 ui.js 给按钮加 .on，不能再用 :has() */
.dpbtn.on,.slbtn.on{
  border-color:var(--cy);background:rgba(34,211,238,.10);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08),0 0 0 3px rgba(34,211,238,.18);
}
.dpval{letter-spacing:.4px;font-variant-numeric:tabular-nums}
.dpval.empty{color:var(--ink3)}
.dpico{display:flex;color:var(--ink3);transition:color .2s}
.dpico svg{width:16px;height:16px}
.dpbtn:hover .dpico,.dpbtn.on .dpico{color:var(--cy)}
.slico{display:flex;color:var(--ink3);transition:transform .2s,color .2s}
.slico svg{width:15px;height:15px}
.slbtn.on .slico{transform:rotate(180deg);color:var(--cy)}

/* ---------- 日历面板 ---------- */
.dppop{width:288px}
.dphead{display:flex;align-items:center;gap:6px;margin-bottom:8px}
.dptitle{
  font:inherit;flex:1;font-size:13.5px;font-weight:600;color:var(--ink);cursor:pointer;
  background:transparent;border:0;border-radius:9px;padding:7px 8px;transition:background .18s;
}
.dptitle:hover{background:rgba(255,255,255,.07)}
.dpnav{
  font:inherit;width:30px;height:30px;flex:none;cursor:pointer;line-height:1;
  font-size:17px;color:var(--ink2);background:rgba(255,255,255,.05);
  border:1px solid var(--line);border-radius:9px;transition:.18s;
}
.dpnav:hover{color:var(--cy);border-color:var(--cy);background:rgba(34,211,238,.12)}
.dpnav:active{transform:scale(.92)}
.dpwd{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:3px}
.dpwd i{
  font-style:normal;text-align:center;font-size:11px;color:var(--ink3);
  padding:5px 0;letter-spacing:.5px;
}
.dpgrid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dpday{
  font:inherit;font-size:12.5px;height:33px;cursor:pointer;color:var(--ink2);
  background:transparent;border:1px solid transparent;border-radius:9px;
  font-variant-numeric:tabular-nums;
  transition:background .15s,color .15s,border-color .15s,transform .1s;
  animation:dpin .22s both;animation-delay:calc(var(--i,0) * 12ms);
}
@keyframes dpin{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
.dpday:hover{background:rgba(255,255,255,.09);color:var(--ink)}
.dpday:active{transform:scale(.9)}
.dpday.out{color:var(--ink3);opacity:.45}
.dpday.today{border-color:rgba(34,211,238,.45);color:var(--cy)}
.dpday.on{
  background:linear-gradient(160deg,var(--cy-soft),var(--cy-deep));
  color:#04222a;font-weight:700;border-color:transparent;
  box-shadow:0 4px 14px var(--cy-glow);
}
.dpfoot{
  display:flex;justify-content:space-between;margin-top:8px;padding-top:8px;
  border-top:1px solid var(--line);
}
.dplink{
  font:inherit;font-size:12.5px;cursor:pointer;color:var(--ink3);
  background:transparent;border:0;border-radius:7px;padding:5px 9px;transition:.18s;
}
.dplink:hover{color:var(--cy);background:rgba(34,211,238,.10)}

/* 年月快选：点标题展开，免得一个月一个月翻 */
.dpmonths{display:none;position:absolute;inset:10px;border-radius:12px;
  background:rgba(16,22,26,.96);padding:10px;flex-direction:column}
.dpmonths.show{display:flex;animation:dpin .18s both}
.dpyr{display:flex;align-items:center;gap:6px;margin-bottom:9px}
.dpyr b{flex:1;text-align:center;font-size:13.5px;color:var(--ink);font-weight:600}
.dpmg{flex:1;display:grid;grid-template-columns:repeat(3,1fr);gap:6px}
.dpm{
  font:inherit;font-size:12.5px;cursor:pointer;color:var(--ink2);
  background:rgba(255,255,255,.05);border:1px solid var(--line);
  border-radius:9px;transition:.18s;
}
.dpm:hover{color:var(--cy);border-color:var(--cy);background:rgba(34,211,238,.12)}
.dpm.on{background:linear-gradient(160deg,var(--cy-soft),var(--cy-deep));
  color:#04222a;font-weight:700;border-color:transparent}

/* ---------- 下拉面板 ---------- */
/* 限高 + 内部滚动。车型有 40 款，全量铺开会顶穿整个视口 ——
   这是全局的，所有下拉都受益。ui.js 的 place() 靠 offsetHeight 判断往上还是往下翻，
   封顶之后那个判断反而更准。 */
.slpop{padding:6px;max-height:min(46vh,380px);overflow-y:auto;overscroll-behavior:contain}
.slpop::-webkit-scrollbar{width:9px}
.slpop::-webkit-scrollbar-track{background:transparent}
.slpop::-webkit-scrollbar-thumb{
  background:rgba(255,255,255,.14);border-radius:99px;
  border:2px solid transparent;background-clip:padding-box;
}
.slpop::-webkit-scrollbar-thumb:hover{background:rgba(34,211,238,.45);background-clip:padding-box}
/* optgroup 的分组标题 */
.slgrp{
  font-size:11px;letter-spacing:.1em;color:var(--ink3);
  padding:10px 12px 5px;position:sticky;top:-6px;
  background:linear-gradient(180deg,rgba(16,22,26,.98),rgba(16,22,26,.86));
}
.slgrp:first-child{padding-top:4px}
.slopt{
  font:inherit;display:block;width:100%;text-align:left;font-size:13.5px;
  padding:9px 12px;cursor:pointer;color:var(--ink2);
  background:transparent;border:0;border-radius:9px;
  transition:background .15s,color .15s,padding-left .15s;
  animation:dpin .2s both;animation-delay:calc(var(--i,0) * 22ms);
}
.slopt:hover{background:rgba(255,255,255,.09);color:var(--ink);padding-left:16px}
.slopt.on{color:var(--cy);background:rgba(34,211,238,.12);font-weight:600}

/* ---------- 复选框 ---------- */
/* 原生 checkbox 在深色下是个白方块，accent-color 也只能改填充色，
   边框和圆角依旧是系统的。整个换掉。 */
.chk input[type=checkbox]{
  appearance:none;-webkit-appearance:none;flex:none;
  width:17px;height:17px;border-radius:6px;cursor:pointer;position:relative;
  background:rgba(255,255,255,.06);border:1.5px solid var(--line-hi);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
  transition:background .18s,border-color .18s,box-shadow .18s,transform .12s;
}
.chk input[type=checkbox]:hover{border-color:var(--cy);background:rgba(34,211,238,.12)}
.chk input[type=checkbox]:active{transform:scale(.88)}
.chk input[type=checkbox]::after{
  content:"";position:absolute;left:4.5px;top:1px;width:4px;height:9px;
  border:solid #04222a;border-width:0 2px 2px 0;
  transform:rotate(45deg) scale(0);transform-origin:center;
  transition:transform .2s cubic-bezier(.2,.9,.3,1.6);
}
.chk input[type=checkbox]:checked{
  background:linear-gradient(160deg,var(--cy-soft),var(--cy-deep));
  border-color:transparent;box-shadow:0 3px 12px var(--cy-glow);
}
.chk input[type=checkbox]:checked::after{transform:rotate(45deg) scale(1)}
.chk input[type=checkbox]:focus-visible{outline:none;box-shadow:0 0 0 3px rgba(34,211,238,.25)}
.chk:hover{color:var(--ink)}

/* ---------- 文本框：补 hover 与更明显的聚焦 ---------- */
input[type=text]{transition:border-color .2s,background .2s,box-shadow .2s}
input[type=text]:hover{border-color:var(--line-hi);background:rgba(255,255,255,.085)}
input[type=text]::placeholder{color:var(--ink3)}

/* ---------- 自绘确认框（替代原生 confirm）----------
   原生对话框由浏览器绘制，CSS 完全够不着。周报页拿它拦「推送到飞书群」这种
   发出去收不回的动作，正是最该说清楚的一刻，所以自己画一个。 */
.mask{
  position:fixed;inset:0;z-index:800;display:grid;place-items:center;padding:24px;
  background:rgba(4,7,9,.62);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  opacity:0;transition:opacity .2s ease;
}
.mask.open{opacity:1}
.modal{
  width:min(480px,100%);padding:26px 28px;
  transform:translateY(10px) scale(.97);
  transition:transform .24s cubic-bezier(.2,.9,.3,1.25);
}
.mask.open .modal{transform:none}
.modaltitle{font-size:16px;font-weight:600;color:var(--ink);margin-bottom:10px}
.modalbody{font-size:14px;color:var(--ink2);line-height:1.75}
.modalrow{display:flex;justify-content:flex-end;gap:10px;margin-top:22px}

/* ---------- 滚动条 ----------
   默认滚动条在 Windows 上是浅灰的，深色界面里非常扎眼。
   两套都写：WebKit 用伪元素，Firefox 用 scrollbar-color。 */
*{scrollbar-width:thin;scrollbar-color:rgba(255,255,255,.16) transparent}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{
  background:rgba(255,255,255,.15);border-radius:99px;
  border:3px solid transparent;background-clip:content-box;
}
::-webkit-scrollbar-thumb:hover{background:rgba(34,211,238,.42);background-clip:content-box}
::-webkit-scrollbar-corner{background:transparent}

/* ---------- 文本选中 ---------- */
::selection{background:rgba(34,211,238,.28);color:var(--ink)}

/* ---------- 统一焦点环 ----------
   :focus-visible 只在键盘操作时出现，鼠标点击不会到处冒蓝框。
   默认的浏览器焦点环是白/蓝实线，和整套配色不搭。 */
a:focus-visible,button:focus-visible,input:focus-visible,
select:focus-visible,label.mode:focus-within{
  outline:none;
  box-shadow:0 0 0 3px rgba(34,211,238,.30);
  border-radius:11px;
}

/* 上传框里的「已识别日期」确认条。通过校验也要看得见 ——
   静默接受正是"传错了没人发现"的根源，人只会看文件名，而文件名最不可信。 */
.fday{
  display:block;margin-top:7px;padding:4px 9px;border-radius:8px;
  font-size:11.5px;color:var(--ok);
  background:var(--ok-bg);border:1px solid rgba(52,224,161,.28);
}

/* ---------- 日报表格（第7步：给同事抄的那张） ----------
   列多，必须能横向滚动；但**日期列要钉住**，否则滚到右边就不知道在看哪天了。 */
.sheetbar{display:flex;align-items:center;gap:12px;margin:0 0 12px 33px}
.sheetwrap{
  margin-left:33px;overflow-x:auto;border-radius:12px;
  border:1px solid var(--line);background:rgba(255,255,255,.03);
}
.sheet{width:auto;min-width:100%;border-collapse:separate;border-spacing:0;margin:0}
.sheet th,.sheet td{
  padding:8px 12px;font-size:12.5px;white-space:nowrap;text-align:right;
  border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;
}
.sheet th{
  position:sticky;top:0;z-index:2;text-align:right;font-weight:500;
  color:var(--ink3);font-size:11.5px;
  background:#141a1d;                     /* 不透明：底下的行滚过去不能透出来 */
}
.sheet td{color:var(--ink2)}
.sheet tbody tr:hover td{background:rgba(255,255,255,.045)}
.sheet tbody tr:last-child td{border-bottom:none}
/* 日期列钉左 */
.sheet th.d,.sheet td.d{
  position:sticky;left:0;z-index:1;text-align:left;
  background:#141a1d;border-right:1px solid var(--line);
}
.sheet th.d{z-index:3}
.sheet td.d{color:var(--ink)}
/* 合计与转化那几列：加重，扫一眼能定位 */
.sheet th.t{color:var(--cy)}
.sheet td.t{color:var(--ink);font-weight:600;background:rgba(34,211,238,.05)}

/* ---------- 推送前预览：照着真正要发的卡片 JSON 渲染 ----------
   不追求和飞书像素级一致，追求的是**内容一模一样** ——
   要能一眼看出有没有不该出现的客服、数字对不对。 */
.cardprev{margin:0 0 18px 33px;display:flex;flex-direction:column;gap:14px}

/* ---------- 目标群 chat_id：默认锁着，点「编辑」才能改 ----------
   这个框改错的代价不对称：改对了照常发，改错了消息进了一个谁也不看的群，
   而且不会报错。所以做成"要多点一下"，宁可麻烦一点也不要被擦着改掉。 */
.chatrow{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  margin:0 0 18px 33px;padding:12px 14px;border-radius:12px;
  border:1px solid var(--line);background:rgba(255,255,255,.03);
}
.chatlab{font-size:12.5px;color:var(--ink3);white-space:nowrap}
.chatid{
  font:inherit;font-size:13px;font-family:ui-monospace,Consolas,monospace;
  flex:1 1 300px;min-width:0;padding:8px 12px;border-radius:9px;
  color:var(--ink3);background:rgba(255,255,255,.03);
  border:1px solid transparent;cursor:default;transition:.2s;
}
.chatid.editing{
  color:var(--ink);background:rgba(34,211,238,.07);
  border-color:rgba(34,211,238,.42);cursor:text;
}
.chatrow button{
  font:inherit;font-size:12.5px;font-weight:500;padding:7px 15px;border-radius:99px;
  cursor:pointer;color:var(--ink2);background:rgba(255,255,255,.05);
  border:1px solid var(--line);transition:.2s;
}
.chatrow button:hover{color:var(--cy);border-color:rgba(34,211,238,.42)}
.chatnote{font-size:12px;color:var(--ink3);flex:1 0 100%}
.chatnote.custom{color:var(--cy)}
.chatnote.bad{color:#fc8181}
.pushempty{margin:0 0 4px 33px;font-size:13px;color:var(--ink3)}
.fcard{
  border-radius:12px;overflow:hidden;
  border:1px solid var(--line);background:rgba(255,255,255,.035);
}
.fchead{
  padding:10px 14px;font-size:13.5px;font-weight:600;color:#fff;
  background:linear-gradient(90deg,#2b6cb0,#2c5282);      /* 飞书 blue 模板 */
}
.fchead.red{background:linear-gradient(90deg,#c53030,#9b2c2c)}
.fcmd{padding:9px 14px;font-size:12.5px;color:var(--ink2);line-height:1.7}
.fcmd b{color:var(--ink)}
.fchr{height:1px;background:var(--line);margin:2px 14px}
.fctwrap{margin:0 14px 12px;overflow-x:auto;border-radius:9px;border:1px solid var(--line)}
.fct{width:100%;border-collapse:separate;border-spacing:0;margin:0}
.fct th,.fct td{
  padding:6px 10px;font-size:11.5px;text-align:center;white-space:nowrap;
  border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;
}
.fct th{background:rgba(255,255,255,.07);color:var(--ink2);font-weight:600}
.fct td{color:var(--ink2)}
.fct tbody tr:last-child td{border-bottom:none}
.fcbtn{
  margin:0 14px 12px;padding:7px 14px;border-radius:99px;display:inline-block;
  font-size:12px;color:var(--ink3);border:1px dashed var(--line-hi);
}
/* 卡片 1.0 的 note：飞书里就是一行小灰字（生成时间之类） */
.fcnote{padding:2px 14px 10px;font-size:11.5px;color:var(--ink3)}

/* 运行日志：滚上去看历史时浮出来的「回到最新」。
   不做成"无脑滚到底"是因为人往上翻正是在读某一段，那时候把他拽回底部更烦。 */
.logjump{
  position:absolute;right:18px;bottom:16px;z-index:2;
  font:inherit;font-size:12px;padding:6px 14px;border-radius:99px;cursor:pointer;
  color:#04222a;background:linear-gradient(150deg,var(--cy-soft),var(--cy));
  border:0;box-shadow:0 6px 20px -6px var(--cy-glow);
  opacity:0;pointer-events:none;transform:translateY(6px);transition:.2s;
}
.logjump.show{opacity:1;pointer-events:auto;transform:none}
.logjump:active{transform:scale(.94)}

/* ---------- 日报表格：按年-月折叠 ----------
   跑满一年就是 365 行，全铺开页面会长到没法用；而实际要抄的永远是最近几天。
   所以默认只展开最新一个月，且**一次只开一个** —— 同时开多个又会把页面撑长，
   那就白折叠了。 */
.mgroup{margin-left:33px;border-radius:12px;border:1px solid var(--line);
  background:rgba(255,255,255,.03);overflow:hidden;margin-bottom:10px}
.mhead{
  font:inherit;display:flex;align-items:center;gap:10px;width:100%;
  padding:11px 15px;cursor:pointer;text-align:left;
  color:var(--ink2);background:transparent;border:0;transition:background .18s;
}
.mhead:hover{background:rgba(255,255,255,.055)}
.mhead b{font-size:13.5px;font-weight:600;color:var(--ink)}
.mcaret{display:inline-block;color:var(--ink3);font-size:11px;transition:transform .2s}
.mgroup.open .mcaret{transform:rotate(90deg);color:var(--cy)}
.mgroup.open .mhead{background:rgba(34,211,238,.07)}
.mgroup.open .mhead b{color:var(--cy)}
.mcount{margin-left:auto;font-size:12px;color:var(--ink3)}
.mbody{display:none}
.mgroup.open .mbody{display:block}
/* 折叠里的表格自己带边框了，外层 wrapper 只负责横向滚动 */
.mbody .sheetwrap{margin:0;border:0;border-top:1px solid var(--line);border-radius:0}
