:root{
  --brand:#0f9d6e;
  --brand-bright:#34d399;
  --brand-deep:#0a6b4c;
  --brand-soft:#e4f7ee;
  --brand-softer:#f0fbf6;
  --bg:#f2f9f5;
  --surface:#ffffff;
  --line:#e2efe8;
  --text:#15302a;
  --text-2:#546e65;
  --text-3:#8ba49b;
  --warn:#c2790a;
  --danger:#d9553f;
  --radius:14px;
  --shadow:0 10px 28px -18px rgba(21,48,42,.45);
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;
  background:var(--bg);
  color:var(--text);
  /* 拉丁字母与数字走 Segoe UI / 系统西文字体，中文回落到雅黑：
     之前整行都是雅黑，时间与金额的数字看着发胖 */
  font:14px/1.55 "Segoe UI",-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei",system-ui,sans-serif;
  -webkit-font-smoothing:antialiased;
}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
/* 作者样式里的 display:flex 会盖掉浏览器默认的 [hidden]{display:none}，
   导致「隐藏的字段仍然显示」。这条兜底规则必须放在最前面 */
[hidden]{display:none!important}

/* ---------- 布局：左侧导航 + 右侧主区 ---------- */
.app{display:flex;min-height:100vh;align-items:stretch}

.side{
  flex:0 0 216px;width:216px;
  position:sticky;top:0;align-self:flex-start;height:100vh;
  display:flex;flex-direction:column;
  padding:18px 12px 16px;
  background:linear-gradient(180deg,#fbfefc,#f6fbf8);
  border-right:1px solid var(--line);
}
.sidebrand{display:flex;align-items:center;gap:10px;padding:2px 8px 0;margin-bottom:20px}
.sidebrand .logo{width:34px;height:34px;border-radius:11px;box-shadow:0 7px 16px -10px rgba(8,90,64,.9)}
.sidebrand-name{font-weight:700;letter-spacing:.1px;font-size:15px;line-height:1.2;color:#16241f}
.sidebrand-sub{font-size:9.5px;letter-spacing:.19em;color:#8aa39a;margin-top:2px}

.navlabel{font-size:10.5px;font-weight:600;color:var(--text-3);letter-spacing:.1em;padding:0 10px;margin:0 0 8px}
.nav{display:flex;flex-direction:column;gap:2px}

.nav-item{
  position:relative;display:flex;align-items:center;gap:10px;
  width:100%;padding:9px 10px;border:0;border-radius:10px;
  background:transparent;color:var(--text-2);font:inherit;font-size:13.5px;
  cursor:pointer;text-align:left;transition:background .15s,color .15s;
}
.nav-item:hover{background:var(--brand-soft);color:#0b6b4c}
.nav-item.on{background:var(--brand-soft);color:#0b6b4c;font-weight:600}
.nav-item.on::before{
  content:"";position:absolute;left:-12px;top:50%;transform:translateY(-50%);
  width:3px;height:18px;border-radius:0 3px 3px 0;background:var(--brand);
}
.nav-item .ic{width:18px;height:18px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;opacity:.9}
.nav-item .label{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nav-item .cnt{
  flex:0 0 auto;font-size:11px;font-variant-numeric:tabular-nums;
  background:#eef5f1;color:var(--text-2);border-radius:999px;padding:0 7px;
}
.nav-item.on .cnt{background:#fff;color:#0b6b4c}

.sidefoot{margin-top:auto;padding-top:14px}
.synccard{
  display:flex;flex-direction:column;gap:3px;width:100%;
  padding:10px 12px;border:1px solid var(--line);border-radius:12px;
  background:var(--surface);font:inherit;text-align:left;cursor:pointer;
  transition:.15s;
}
.synccard:hover{border-color:#cfe3d9;box-shadow:var(--shadow)}
.syncrow{display:flex;align-items:center;gap:7px;font-size:12.5px;color:var(--text)}
.syncrow .dot.ok{background:var(--brand)}
.syncrow .dot.bad{background:var(--danger)}
.syncrow .dot.warn{background:var(--warn)}
.synctip{font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.sidehint{font-size:10.5px;color:var(--text-3);margin:8px 4px 0;line-height:1.5}

.main{flex:1 1 auto;min-width:0;display:flex;flex-direction:column}

/* ---------- 顶栏 ---------- */
.topbar{
  position:sticky;top:0;z-index:10;
  display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:12px 22px;
  background:rgba(255,255,255,.86);
  backdrop-filter:saturate(1.4) blur(10px);
  border-bottom:1px solid var(--line);
}

/* 页面标题：从各视图的 page-head 挪到顶栏、放在日期前面。
   顶栏左侧是一个两行的标题块——第一行标题 + 日期，第二行小字副标题，
   两行都在白色顶栏里，不掉到下面的浅色底上边去 */
.nowhead{display:flex;flex-direction:column;justify-content:center;gap:1px;min-width:0;flex:0 1 auto}
.nowline{display:flex;align-items:baseline;gap:10px;min-width:0}
.nowtitle{margin:0;font-size:16.5px;font-weight:700;letter-spacing:-.01em;line-height:1.3;color:#132520;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nowsub{margin:0;font-size:12px;line-height:1.45;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nowsub[hidden]{display:none}

.topdate{
  font-size:12.5px;font-weight:600;color:var(--text-2);letter-spacing:.01em;white-space:nowrap;
}
.logo{width:30px;height:30px;border-radius:9px;display:block;flex:0 0 auto}

/* 铃铛：未读时右上角一个数字红点。数字比纯红圆点有用——
   一眼知道是 1 条还是 9 条，值不值得现在点开 */
.iconbtn{
  position:relative;display:inline-flex;align-items:center;justify-content:center;
  width:34px;height:34px;padding:0;border:1px solid transparent;border-radius:9px;
  background:transparent;color:var(--text-2);cursor:pointer;transition:.15s;
}
.iconbtn:hover{background:var(--brand-softer);color:var(--brand-deep)}
.iconbtn .ic{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.75;stroke-linecap:round;stroke-linejoin:round}
.bellbadge{
  position:absolute;top:2px;right:1px;min-width:16px;height:16px;padding:0 4px;
  border-radius:999px;background:#e5534b;color:#fff;box-shadow:0 0 0 2px #fff;
  font-size:9.5px;font-weight:600;line-height:16px;font-style:normal;text-align:center;
  font-variant-numeric:tabular-nums;
}

/* 顶栏浮层：通知面板挂在同步条上 */
.popover{
  position:absolute;right:0;top:calc(100% + 10px);z-index:40;
  background:#fff;border:1px solid var(--line);border-radius:14px;
  box-shadow:0 22px 46px -24px rgba(16,42,36,.45),0 2px 6px rgba(16,42,36,.05);
  padding:12px;
}

/* 通知面板 */
.notifpanel{width:344px;max-width:calc(100vw - 24px);padding:6px}
.nf-head{display:flex;align-items:center;gap:8px;padding:8px 8px 9px}
.nf-head strong{font-size:13px}
.nf-head .spacer{flex:1 1 auto}
.nf-sec{padding:9px 9px 4px;font-size:10.5px;font-weight:600;letter-spacing:.06em;color:var(--text-3)}
.nf-item{
  display:flex;gap:9px;width:100%;padding:9px 9px;border:0;border-radius:9px;
  background:transparent;font:inherit;text-align:left;cursor:pointer;
}
.nf-item:hover{background:var(--brand-softer)}
.nf-dot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;margin-top:6px;background:#e5534b}
.nf-dot.read{background:#dbe7e1}
.nf-body{min-width:0;flex:1 1 auto;display:flex;flex-direction:column;gap:2px}
.nf-title{font-size:12.8px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nf-item.read .nf-title{color:var(--text-2);font-weight:450}
.nf-sub{font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.nf-empty{padding:26px 14px;text-align:center;font-size:12.5px;color:var(--text-3);line-height:1.7}

.syncbar{display:flex;align-items:center;gap:10px;flex-wrap:nowrap;position:relative}
.pill{
  display:inline-flex;align-items:center;gap:6px;
  padding:4px 10px;border-radius:999px;font-size:12.5px;
  background:var(--brand-soft);color:#0b6b4c;
}
.pill b{font-variant-numeric:tabular-nums}
.pill.muted{background:#f1f5f3;color:var(--text-2)}
.pill.warn{background:#fdf3e2;color:var(--warn)}
.pill.bad{background:#fdecea;color:var(--danger)}
.dot{width:7px;height:7px;border-radius:50%;background:var(--brand);display:inline-block}
.pill.bad .dot{background:var(--danger)}
.pill.warn .dot{background:var(--warn)}
.lastsync{font-size:12px;color:var(--text-3);min-width:96px}

/* 按钮基准照设计稿：34 高 / 9 圆角 / 12.5 号字。
   白底描边=次要操作，绿色渐变=主操作；一屏只留一个主操作，别到处抢注意力 */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:34px;padding:0 14px;border-radius:9px;
  border:1px solid var(--line);background:var(--surface);color:var(--text-2);
  font:inherit;font-size:12.5px;font-weight:550;line-height:1;cursor:pointer;
  transition:.16s border-color,.16s background,.16s color;white-space:nowrap;
}
.btn:hover:not(:disabled){border-color:#bfe4d3;color:var(--brand-deep);background:var(--brand-softer)}
.btn:active:not(:disabled){transform:translateY(1px)}
/* 不可点的按钮得看得出来：主操作是绿色渐变，不禁用样式时跟可点的一模一样 */
.btn:disabled{
  opacity:.45;cursor:not-allowed;box-shadow:none;transform:none;
}
.btn.ghost{color:var(--text-2)}
.btn.primary{
  background:linear-gradient(140deg,#23b981,#0f9d6e);
  border-color:transparent;color:#fff;
  box-shadow:0 6px 16px -8px rgba(15,157,110,.7);
}
.btn.primary:hover{
  filter:brightness(1.04);color:#fff;
  background:linear-gradient(140deg,#23b981,#0f9d6e);
}
.btn.primary:active{transform:translateY(1px)}
.btn .ic{width:14px;height:14px;flex:0 0 auto;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}

.switch{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;color:var(--text-2);cursor:pointer;user-select:none}
.switch input{appearance:none;width:34px;height:19px;border-radius:999px;background:#d8e6df;position:relative;cursor:pointer;transition:.18s}
.switch input::after{content:"";position:absolute;top:2px;left:2px;width:15px;height:15px;border-radius:50%;background:#fff;transition:.18s;box-shadow:0 1px 2px rgba(0,0,0,.2)}
.switch input:checked{background:var(--warn)}
.switch input:checked::after{transform:translateX(15px)}

/* ---------- 主体 ---------- */
/* width:100% 不能省：.main 是纵向 flex 容器，auto 外边距会顶掉 stretch，
   结果 .wrap 缩成「内容宽度」，整块内容莫名其妙地居中偏右。
   上限给到 2200：早期写 1180 是按 1366 笔记本定的，换到 1920/2K 屏后左右各空
   出三百多像素，看着像没铺满。2200 在 1920 和 2560 屏上都是满宽（只留 22 的内边距），
   再宽的带鱼屏才居中，不至于把单行卡片拉到三四千像素没人读得下去。 */
.wrap{width:100%;max-width:2200px;margin:0 auto;padding:22px 22px 48px}

/* ---------- page-head：只剩右侧行内操作 ----------
   大标题与小字副标题都在顶栏（.nowtitle / .nowsub），内容区不再重复一遍。
   .viewsub 保留给零散场景（例如页内卡片自己的说明行）。 */
.viewsub{margin:0 0 14px;font-size:12.5px;color:var(--text-2);line-height:1.5}
.page-head{display:flex;align-items:flex-end;gap:14px;margin:0 0 18px;flex-wrap:wrap}
.page-head > div:first-child{min-width:0}
.page-head h1{margin:0;font-size:22px;font-weight:700;letter-spacing:-.015em;line-height:1.3;color:#132520}
.page-head .sub{margin-top:3px;font-size:12.5px;color:var(--text-2);line-height:1.5}
.page-head .spacer{flex:1 1 auto}
/* 标题上移后，行内操作/搜索框在没有 spacer 的页面上也要靠右 */
.page-head > .headacts,.page-head > .headsearch{margin-left:auto}
.page-head .headacts{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.page-head .headsearch{
  flex:0 1 240px;min-width:150px;
  border:1px solid var(--line);background:#fbfefc;border-radius:9px;
  padding:7px 11px;font-size:12.5px;color:var(--text);outline:0;transition:.15s;
}
.page-head .headsearch::placeholder{color:#a9bdb5}
.page-head .headsearch:focus{border-color:var(--brand-bright);background:#fff;box-shadow:0 0 0 3px rgba(52,211,153,.12)}
/* 知识库：分类 chips 与「手动新增」同一行（页内搜索框已撤，搜索走顶栏） */
.kbhead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0 0 14px}
.kbhead .kbtabs{margin-bottom:0;flex:1 1 auto;min-width:0}
.kbhead .btn{flex:0 0 auto;white-space:nowrap}
/* 手动新增知识：结论用正文字体，别用 monospace 的粘贴框字体 */
.kbdialog{width:min(480px,calc(100vw - 28px))}
.kbclaim{font-family:inherit;font-size:13px;line-height:1.7;resize:vertical;min-height:96px}
/* 小字副标题与行内操作同排时：左边一行小字，右边按钮/搜索框，各自垂直居中 */
.page-head > .viewsub{margin:0;align-self:center;flex:1 1 auto;min-width:0}
.page-head > .headacts,.page-head > .headsearch{align-self:center}
@media (max-width:640px){
  .page-head{margin-bottom:14px;gap:10px}
  .page-head h1{font-size:19px}
  .page-head .headsearch{flex:1 1 100%;margin-left:0}
  /* 窄屏：chips 与按钮仍然同排，挤不下时按钮才换行，不强行拉满一行 */
  .kbhead{gap:10px}
}

.composer{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:14px 16px 12px;
}
.input{
  width:100%;border:0;outline:0;background:transparent;
  font-size:16px;color:var(--text);padding:6px 2px;
}
.input::placeholder{color:#a9bdb5}
/* 输入框和「创建」按钮同一行：按钮不能挤掉输入框的可视宽度，
   窄屏时两者仍然并排（拇指够得着），输入框靠 minmax(0,1fr) 让位 */
.inputrow{display:flex;align-items:center;gap:10px}
.inputrow .input{flex:1 1 auto;min-width:0}
.cbtn{flex:0 0 auto}
@media (max-width:640px){.cbtn{padding:0 13px}}

.preview{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px;min-height:0}
.preview:empty{display:none}
.chip{
  display:inline-flex;align-items:center;gap:5px;
  font-size:11.5px;padding:3px 8px;border-radius:6px;
  background:var(--brand-soft);color:#0b6b4c;
}
.chip.k-date{background:#e8f1fd;color:#2563a8}
.chip.k-time{background:#e8f1fd;color:#2563a8}
.chip.k-deadline{background:#fdf3e2;color:var(--warn)}
.chip.k-priority{background:#fdecea;color:var(--danger)}
.chip.k-repeat{background:#f0ecfd;color:#5b46b8}
.chip.k-project{background:#f1f5f3;color:var(--text-2)}
.chip .k{opacity:.6;font-size:10.5px}

.hint{display:flex;justify-content:space-between;gap:12px;margin-top:8px;font-size:11.5px;color:var(--text-3);flex-wrap:wrap}
.hint-strong{color:var(--brand);opacity:.85}

/* ---------- 两栏 ---------- */
.cols{display:grid;grid-template-columns:minmax(0,1fr) 306px;gap:16px;margin-top:16px;align-items:start}
/* 注意：移动端覆盖必须用 minmax(0,1fr) 而不是裸 1fr —— 裸 1fr 的轨道带 auto
   最小尺寸，任何一个子元素有大的固有宽度（比如 6 个取件码输入框的默认 size）
   就会把整条轨道撑到远超视口，再被 overflow-x:hidden 一裁，右侧内容直接消失 */
@media (max-width:900px){.cols{grid-template-columns:minmax(0,1fr)}.taskaside{display:none}}

.listpanel{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:6px 6px 10px;min-height:220px;
}
.list{display:flex;flex-direction:column}

/* 冲突条：不属于任何视图，切页签也不该被藏起来 */
.conflictbar{
  margin:0 0 14px;padding:12px 14px;border-radius:12px;
  background:#fdf6e8;border:1px solid #f2e0c2;color:#8a5a06;font-size:12.5px;
}
.cbhead{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:8px}
.cbhead b{font-size:13px;color:#7a4f05}
.cbhint{color:#a2792f;font-size:11.5px}
.cbcount{margin-left:auto;font-size:11px;background:#f6e6c8;color:#8a5a06;border-radius:999px;padding:1px 8px}
.cbdiff{display:flex;flex-direction:column;gap:4px;margin-bottom:10px}
.cbrow{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;font-size:12px}
.cbk{flex:0 0 62px;color:#a2792f}
.cbv{background:#fff;border:1px solid #f0e2c6;border-radius:6px;padding:2px 8px}
.cbv.mine{color:#0b6b4c;border-color:#cdeade}
.cbv.theirs{color:#7a4f05}
.cbbtns{display:flex;align-items:center;gap:8px;flex-wrap:wrap}

/* 任务分组标题：列表里唯一的层级分隔 */
/* 分组标题：只看层级，不做装饰。计数用纯数字，胶囊底会把「今天 4」读成两个并列标签 */
.group-title{
  display:flex;align-items:center;gap:8px;
  padding:15px 14px 8px;font-size:12.5px;font-weight:600;color:#6d847b;letter-spacing:.2px;
}
.group-title .n{font-variant-numeric:tabular-nums;background:none;padding:0;font-size:12px;font-weight:500;color:#9fb3ab}

.row{
  display:flex;align-items:flex-start;gap:12px;
  padding:13px 14px;border-radius:10px;
  transition:background .12s;
}
.row:hover{background:#f8fcf9}
.row + .row{border-top:1px solid #f1f6f3}

/* 勾选框做成 18px 的圆角方块：比正圆更像「清单」，也比 D 形描边更容易点中 */
.check{
  flex:0 0 auto;width:18px;height:18px;margin-top:2px;border-radius:6px;
  border:1.5px solid #cddfd7;background:#fff;cursor:pointer;position:relative;
  transition:border-color .15s,background .15s,box-shadow .15s;
}
.check:hover{border-color:var(--brand);box-shadow:0 0 0 3px rgba(52,211,153,.12)}
.check.on{background:linear-gradient(150deg,#34d399,#0f9d6e);border-color:#13a877}
.check.on::after{
  content:"";position:absolute;left:4.6px;top:1.4px;width:5px;height:9px;
  border:2px solid #fff;border-top:0;border-left:0;transform:rotate(40deg);
}

/* 标题是整行唯一的「主要内容」，字重和字号都要压过标签 */
.rowtitle{font-size:14.6px;font-weight:600;color:#1b2a24;line-height:1.42;word-break:break-word;letter-spacing:.1px}
.rowmain{flex:1 1 auto;min-width:0}

/* 优先级徽标贴在行尾（对齐设计稿）：高=红、中=琥珀、低=灰 */
.rowpri{
  flex:none;margin-top:2px;font-size:11px;font-weight:600;line-height:1.7;
  padding:0 8px;border-radius:6px;letter-spacing:.3px;
}
.rowpri.high{background:#fdeceb;color:#d64541}
.rowpri.mid{background:#fdf3e2;color:#b7791f}
.rowpri.low{background:#eef4f1;color:#7d918a}

/* 任务页右栏：环形完成率 + 分布条 */
.ringwrap{position:relative;width:132px;margin:2px auto 12px}
.ring{width:100%;display:block}
.ringtxt{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1px}
.ringtxt b{font-size:22px;font-weight:680;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.ringtxt span{font-size:10.5px;color:var(--text-3)}
.divider{height:1px;background:#eef6f1;margin:0 0 12px}
.distrow{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:11.5px}
.distrow .dnm{flex:0 0 66px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.distrow .dbar{flex:1;height:6px;border-radius:999px;background:#eef4f1;overflow:hidden}
.distrow .dbar i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#34d399,var(--brand))}
.distrow .dvl{flex:0 0 20px;text-align:right;color:var(--text-3);font-variant-numeric:tabular-nums}
.taskaside{position:sticky;top:76px;display:flex;flex-direction:column;gap:12px}
.taskaside .log{max-height:220px}
.kb-claim{font-size:12.8px;line-height:1.66;color:var(--text)}
/* 完成态要一眼可辨：只靠颜色差异在低亮度屏幕上几乎看不出来 */
.row.done .rowtitle{color:#8fa49b;text-decoration:line-through;text-decoration-thickness:1px;font-weight:500}
.row.done .check{background:#eaf5f0;border-color:#cfe6da}
.row.done .check::after{border-color:#8dc7ae}
.row.done .tag{opacity:.7}

/* 标签按语义分成三种：项目=绿底（归属）、普通话题=灰底（次要）、时间=纯文字+时钟
   时间不做成彩色胶囊：一屏里每行都有时间，全上色反而把标题压下去 */
.meta{display:flex;flex-wrap:wrap;align-items:center;gap:7px;margin-top:7px}
.tag{
  font-size:11.5px;line-height:1.55;padding:1.5px 8px;border-radius:6px;
  background:#f2f5f4;color:#6b7f77;
}
.tag.due{background:#fdeceb;color:#d64541;font-weight:500}
.tag.plan{background:#edf3fb;color:#3b6fa8}
.tag.pri{background:#fdeceb;color:#d64541}
.tag.rep{background:#f1edfd;color:#5b46b8}
.tag.proj{background:#e6f7ef;color:#0d7a56;font-weight:500}
.mt{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;color:#7d918a;font-variant-numeric:tabular-nums}
.mt svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;opacity:.8}
.mt em{font-style:normal;color:#a4b6ae}

.del{
  flex:0 0 auto;border:0;background:transparent;color:#c3d4cc;
  font-size:16px;line-height:1;cursor:pointer;padding:2px 4px;border-radius:6px;
  opacity:0;transition:.15s;
}
.row:hover .del{opacity:1}
.del:hover{color:var(--danger);background:#fdecea}

.empty{padding:40px 16px;text-align:center;color:var(--text-3);font-size:13px}

/* ---------- 任务空状态 ----------
   列表为空时不能只留一块白板：那看起来跟「加载失败」一模一样。
   这里给一个明确的图形、一句解释、三条可以直接点的示例。 */
.emptystate{padding:34px 20px 30px;text-align:center;color:var(--text-3)}
.emptystate.loading{padding:26px 20px;font-size:12.5px}
.emptystate.bad{color:var(--danger);padding:26px 20px;font-size:13px}
.emptymark{
  width:44px;height:44px;margin:0 auto 12px;border-radius:50%;
  display:grid;place-items:center;
  background:var(--brand-soft);color:var(--brand);
}
.emptytitle{font-size:14.5px;color:var(--text);font-weight:600;margin-bottom:4px}
.emptysub{font-size:12.5px;line-height:1.7;margin:0 auto;max-width:420px}
.emptyex{display:flex;flex-direction:column;align-items:center;gap:8px;margin:18px 0 12px}
.exchip{
  border:1px dashed #cfe3d9;background:#fbfefc;color:var(--text-2);
  font:inherit;font-size:12.5px;padding:7px 14px;border-radius:999px;cursor:pointer;
  max-width:100%;transition:.15s;text-align:left;
}
.exchip:hover{border-color:var(--brand);border-style:solid;background:var(--brand-soft);color:#0b6b4c}
.emptytip{font-size:11.5px;color:var(--text-3);margin:0}

/* ---------- 启动失败横幅 ---------- */
.booterror{
  display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap;
  margin:0 0 14px;padding:12px 16px;border-radius:12px;
  background:#fdf0ed;border:1px solid #f3d3cc;color:#8f3323;font-size:13px;
}
.booterror-main{display:flex;flex-direction:column;gap:2px;min-width:0}
.booterror-main strong{font-size:13.5px}
.booterror-main span{color:#a2543f;font-size:12.5px;word-break:break-word}
.booterror-acts{display:flex;gap:8px;flex-wrap:wrap}

/* ---------- 同步记录（任务页右栏卡片里的一段列表） ---------- */
.linkbtn{border:0;background:transparent;color:var(--brand);font-size:12px;cursor:pointer;padding:0}
.log{list-style:none;margin:0;padding:0;overflow:auto;font-size:12px;line-height:1.5}
.log li{display:flex;gap:8px;padding:5px 0;border-bottom:1px dashed #eef5f1;color:var(--text-2)}
.log li:last-child{border-bottom:0}
.log .t{color:var(--text-3);font-variant-numeric:tabular-nums;flex:0 0 46px}
.log .ok{color:var(--brand)}
.log .warn{color:var(--warn)}
.log .bad{color:var(--danger)}

/* ---------- 登录 / 初始化 ---------- */
body.authpage{
  display:grid;place-items:center;min-height:100vh;padding:24px;
  position:relative;overflow:hidden;
}
.authbg{
  position:fixed;inset:0;z-index:-1;
  background:
    radial-gradient(58% 48% at 12% 8%, #dcf5ea 0%, rgba(220,245,234,0) 62%),
    radial-gradient(50% 44% at 92% 92%, #e7f8f0 0%, rgba(231,248,240,0) 58%),
    linear-gradient(158deg,#f8fdfa 0%,#eef8f3 100%);
}
.authbg::after{
  content:"";position:absolute;inset:0;opacity:.5;
  background-image:radial-gradient(#cfe9dd 1px, transparent 1px);
  background-size:22px 22px;
  mask-image:radial-gradient(70% 60% at 50% 40%, #000 0%, transparent 100%);
}
.authcard{
  width:min(400px,100%);
  background:var(--surface);border:1px solid var(--line);border-radius:20px;
  box-shadow:0 26px 60px -34px rgba(15,157,110,.55);
  padding:28px 26px 20px;
}
.authbrand{display:flex;align-items:center;gap:11px;margin-bottom:22px}
.authbrand .logo{width:38px;height:38px;border-radius:11px;box-shadow:0 9px 20px -12px rgba(8,90,64,.9)}
.authform{display:flex;flex-direction:column;gap:14px}
.field{display:flex;flex-direction:column;gap:6px}
.field>span{font-size:12px;color:var(--text-2);letter-spacing:.2px}
.field input{
  width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:10px;
  font-size:14px;color:var(--text);background:#fbfefc;outline:0;transition:.15s;
}
.field input:focus{border-color:var(--brand-bright);background:#fff;box-shadow:0 0 0 3px rgba(52,211,153,.14)}
.field input::placeholder{color:#adc2ba}
.fieldnote{font-size:11px;color:var(--text-3);font-style:normal;line-height:1.45}
.fieldnote code{background:#f1f5f3;border-radius:4px;padding:0 4px;font-size:10.5px}
.autherr{
  margin:0;padding:9px 11px;border-radius:9px;
  background:#fdecea;color:#a3372a;font-size:12.5px;line-height:1.45;
}
.authbtn{
  margin-top:4px;width:100%;padding:11px;border:0;border-radius:11px;cursor:pointer;
  font-size:14px;font-weight:600;color:#fff;letter-spacing:.3px;
  background:linear-gradient(135deg,var(--brand),var(--brand-bright));
  box-shadow:0 10px 22px -12px rgba(15,157,110,.9);
  transition:.15s;
}
.authbtn:hover{filter:brightness(1.04)}
.authbtn:active{transform:translateY(1px)}
.authbtn:disabled{opacity:.55;cursor:not-allowed;box-shadow:none}
.authfoot{margin:18px 0 0;font-size:11px;color:var(--text-3);line-height:1.6;text-align:center}

/* ---------- 账户面板 ---------- */
.avatar{
  width:30px;height:30px;border-radius:50%;border:1px solid var(--line);
  background:var(--brand-soft);color:#0b6b4c;font-size:12px;font-weight:650;
  cursor:pointer;display:inline-flex;align-items:center;justify-content:center;
  letter-spacing:.5px;transition:.15s;
}
.avatar:hover{border-color:var(--brand-bright);background:#d9f4e8}

dialog.sheet{
  border:0;border-radius:18px;padding:0;width:min(440px,calc(100vw - 32px));
  background:var(--surface);color:var(--text);
  box-shadow:0 30px 70px -30px rgba(21,48,42,.6);
}
dialog.sheet::backdrop{background:rgba(21,48,42,.32);backdrop-filter:blur(2px)}
.sheethead{
  display:flex;align-items:center;justify-content:space-between;
  padding:16px 18px 10px;border-bottom:1px solid var(--line);
}
.sheethead h2{margin:0;font-size:14.5px;font-weight:650}
.sheetbody{padding:14px 18px 18px;max-height:min(70vh,560px);overflow:auto}
.sheetsection + .sheetsection{margin-top:18px;padding-top:16px;border-top:1px solid var(--line)}
.sheetsection h3{margin:0 0 8px;font-size:12px;color:var(--text-3);font-weight:500;letter-spacing:.3px}
.who{display:flex;align-items:baseline;gap:8px;font-size:14px}
.who span{font-size:12px;color:var(--text-3)}
.who + .sheetsection{margin-top:14px}
.devicerow{
  /* 三列定宽：名字伸缩、时间右对齐、操作列固定 58px。
     用 flex 的话「当前」那一行没有按钮，时间就会掉到最右边，
     和其它行错开一列，看起来像是没对齐 */
  display:grid;grid-template-columns:minmax(0,1fr) auto 58px;
  align-items:center;gap:10px;padding:9px 10px;border-radius:10px;
  font-size:13px;
}
.devicerow:hover{background:#fafdfb}
.devicerow .dname{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.devicerow .dmeta{font-size:11.5px;color:var(--text-3);text-align:right;white-space:nowrap}
.devicerow .dact{display:flex;justify-content:flex-end}
.devicerow .cur{font-size:10.5px;padding:1px 7px;border-radius:999px;background:var(--brand-soft);color:#0b6b4c}
.minibtn{
  border:1px solid var(--line);background:#fff;color:var(--text-2);
  font:inherit;font-size:11.5px;font-weight:550;padding:4px 11px;border-radius:7px;
  cursor:pointer;transition:.15s border-color,.15s background,.15s color;white-space:nowrap;
}
.minibtn:hover{border-color:#bfe4d3;color:var(--brand-deep);background:var(--brand-softer)}
.minibtn.danger{color:var(--danger)}
.minibtn.danger:hover{border-color:#f0c9c1;color:var(--danger);background:#fdf6f5}
.sheetrow{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap}
.sheet .field{margin-top:10px}
.sheetfoot{padding:12px 18px 16px;border-top:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:10px}
.hintline{font-size:11.5px;color:var(--text-3);line-height:1.5}
.btn.danger{color:var(--danger);border-color:#f3d6d1}
.btn.danger:hover{color:var(--danger);background:#fdf6f5;border-color:#e9b3a9}


/* ---------- 语音记录 ---------- */
.voicedlg{width:min(520px,calc(100vw - 28px))}
.recbar{display:flex;align-items:center;gap:14px;padding:2px 0 4px}
.recbtn{
  position:relative;flex:0 0 auto;width:52px;height:52px;border-radius:50%;
  border:0;cursor:pointer;color:#fff;
  background:linear-gradient(150deg,#34d399,#0f9d6e);
  display:inline-flex;align-items:center;justify-content:center;
  box-shadow:0 10px 22px -12px rgba(15,157,110,.9);transition:.16s;
}
.recbtn svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.9;stroke-linecap:round;stroke-linejoin:round}
.recbtn:hover{filter:brightness(1.05)}
.recbtn.on{background:linear-gradient(150deg,#f0716a,#d64541);box-shadow:0 10px 22px -12px rgba(214,69,65,.9)}
.recbtn.on svg{width:18px;height:18px}
.recring{position:absolute;inset:-6px;border-radius:50%;border:2px solid rgba(214,69,65,.4);opacity:0;pointer-events:none}
.recbtn.on .recring{opacity:1;animation:recpulse 1.6s ease-out infinite}
@keyframes recpulse{0%{transform:scale(.86);opacity:.7}100%{transform:scale(1.28);opacity:0}}
.rectext{display:flex;flex-direction:column;gap:2px;min-width:0}
.rectext b{font-size:13.5px;font-weight:600;color:var(--text)}
.rectext .hintline{font-size:12px;font-variant-numeric:tabular-nums}
.recmeter{display:flex;align-items:center;gap:3px;flex:0 0 auto;height:34px;margin-left:auto}
.recmeter i{width:3px;height:5px;border-radius:2px;background:#d7e8e0;transition:height .1s linear}
.recmeter.live i{background:linear-gradient(180deg,#34d399,#0f9d6e)}
.recpreview{margin-top:12px;padding:12px;border:1px solid var(--line);border-radius:12px;background:#fbfdfc}
.recpreview audio{width:100%;height:34px}
.recacts{display:flex;gap:8px;margin-top:10px}
.voicesec{margin-top:16px;padding-top:14px;border-top:1px solid var(--line)}
.voicesec-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.voicesec-head strong{font-size:12.5px;color:var(--text-2)}
.voicesec-head .spacer{flex:1 1 auto}
.voicelist{display:flex;flex-direction:column;gap:8px;max-height:300px;overflow:auto}
.vclip{border:1px solid var(--line);border-radius:11px;padding:9px 11px;background:#fff;display:flex;flex-direction:column;gap:6px}
.vclip-head{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.vclip-head b{font-size:12px;color:var(--text-2);font-weight:600}
.vclip-head .spacer{flex:1 1 auto}
.vclip audio{width:100%;height:30px}
.vclip-text{font-size:12.5px;line-height:1.65;color:var(--text);margin:0;white-space:pre-wrap;word-break:break-word}
.vclip-text.muted{color:var(--text-3)}
.vempty{font-size:12px;color:var(--text-3);text-align:center;padding:16px 0}

/* ---------- 窄屏：侧栏变底部导航 ----------
   手机上竖向侧栏没有意义，但「换模块」这个动作必须有入口，
   所以整条侧栏改成底部标签栏，居中图标 + 文字，拇指够得着 */
@media (max-width:900px){
  .app{flex-direction:column}
  .side{
    position:fixed;left:0;right:0;bottom:0;top:auto;
    height:auto;width:auto;flex:0 0 auto;
    flex-direction:row;align-items:center;
    padding:6px 8px calc(6px + env(safe-area-inset-bottom));
    border-right:0;border-top:1px solid var(--line);
    background:rgba(255,255,255,.96);
    backdrop-filter:saturate(1.4) blur(10px);
    z-index:20;
  }
  .sidebrand,.navlabel,.sidefoot{display:none}
  .nav{flex-direction:row;width:100%;gap:4px}
  /* 侧栏分了两组（工作台 / 内容与多端），窄屏上它们得挤进同一行底部栏。
     两组各占一半会让「知识库」这种三字标签被压掉字，所以按项数平分 */
  .side .nav{flex:1 1 auto;width:auto;min-width:0;justify-content:space-around}
  .side .nav + .nav{margin-left:2px}
  .nav-item{flex:1 1 0;flex-direction:column;gap:3px;padding:6px 2px;font-size:10.5px;justify-content:center;text-align:center}
  .nav-item.on::before{display:none}
  .nav-item .cnt{display:none}
  .nav-item .ic{width:19px;height:19px}
  .nav-item{min-width:0;padding:6px 1px}
  .nav-item .label{white-space:nowrap;flex:0 0 auto;overflow:visible;text-overflow:clip}
  body{padding-bottom:62px}
  .topbar{padding:10px 14px;flex-wrap:wrap;row-gap:8px}
  /* 顶栏在手机上只留：标题、日期、铃铛、账户。同步详情折叠不展开 */
  .nowhead{flex:1 1 auto;min-width:0}
  .nowtitle{font-size:15.5px}
  /* 手机上顶栏小字独占一行，允许换行，别截成省略号——它是解释性文字，截一半等于没说 */
  .nowsub{max-width:none;white-space:normal;overflow:visible}
  .topdate{display:none}
  .searchwrap{flex:1 1 100%;max-width:none;margin-left:0;order:3}
  .syncbar{width:100%;gap:8px}
  .lastsync{display:none}
  .syncbar .switch > span{display:none}
  /* 铃铛在顶栏第二行（在线/同步那一排），面板跟着它往下展开，不再钉死 top:58 */
  .notifpanel{left:auto;right:0;top:calc(100% + 8px);width:calc(100vw - 28px);max-width:none}
  .wrap{padding:14px 14px 40px}
}

/* ---------- 灵感（对齐设计稿：capture 卡 + chips 筛选 + 三列卡片网格） ---------- */
.capture{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:16px 18px 12px;box-shadow:var(--shadow);margin-bottom:14px;transition:.18s;
}
.capture:focus-within{border-color:#a8e0c8;box-shadow:0 0 0 3px rgba(52,211,153,.12),var(--shadow)}
.capture textarea{
  width:100%;border:0;outline:0;resize:vertical;min-height:56px;max-height:260px;
  font:inherit;font-size:14px;line-height:1.7;color:var(--text);background:none;padding:0;
}
.capture textarea::placeholder{color:#a9bdb5}
.cap-foot{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin-top:10px;padding-top:10px;border-top:1px solid #eef6f1;
}
.cap-foot .spacer{flex:1 1 auto}
.cap-tags{display:flex;gap:5px;flex-wrap:wrap;min-height:0}
.cap-tags:empty{display:none}
.cap-hint{font-size:11px;color:var(--text-3)}

.notetabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.notetabs .chip{
  border:1px solid var(--line);background:#fbfefc;color:var(--text-2);
  padding:4px 10px;border-radius:7px;cursor:pointer;transition:.15s;font-family:inherit;
}
.notetabs .chip i{font-style:normal;color:var(--text-3);margin-left:5px;font-size:10.5px}
.notetabs .chip:hover{border-color:#bfe4d3;color:var(--brand-deep);background:#fff}
.notetabs .chip.on{background:var(--brand-soft);border-color:#c2ecdb;color:#0a6b4c;font-weight:600}
.notetabs .chip.on i{color:#0a6b4c;opacity:.65}

.notes{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;align-items:stretch}
.note-card{
  position:relative;display:flex;flex-direction:column;min-height:92px;
  background:var(--surface);border:1px solid var(--line);border-radius:12px;
  padding:14px 15px 11px;box-shadow:0 1px 2px rgba(16,48,42,.03);
  transition:transform .18s,box-shadow .18s,border-color .18s;
}
.note-card:hover{transform:translateY(-2px);box-shadow:var(--shadow);border-color:#cdeade}
.note-card.pinned{background:#f8fdfb;border-color:#cdeade}
.note-card.flash{box-shadow:0 0 0 2px #f0c274 inset}
.nc-pin{
  position:absolute;top:11px;right:12px;font-size:10px;padding:1px 7px;border-radius:6px;
  background:var(--brand-soft);color:#0a6b4c;font-weight:600;
}
/* 正文默认收 5 行，点一下展开——三列网格靠这个保证高度可控 */
.nc-txt{
  margin:0;font-size:12.8px;line-height:1.68;color:var(--text);
  white-space:pre-wrap;word-break:break-word;cursor:pointer;
  display:-webkit-box;-webkit-line-clamp:5;-webkit-box-orient:vertical;overflow:hidden;
}
.note-card.pinned .nc-txt{padding-right:38px}
.note-card.open .nc-txt{display:block;-webkit-line-clamp:unset}
.nc-tags{display:flex;gap:5px;flex-wrap:wrap;margin-top:9px}
.nc-foot{
  margin-top:auto;padding-top:10px;
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  font-size:10.5px;color:var(--text-3);
}
.nc-when{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.nc-unsync{font-size:10px;padding:1px 6px}
.nc-acts{display:flex;align-items:center;gap:9px}
/* 首屏只留主操作「提炼」；置顶/编辑/删除悬停或聚焦时才出现，避免每张卡都挂一排按钮 */
.nc-acts .mini-link{opacity:0;transition:opacity .15s}
.nc-acts .mini-link:first-child{opacity:1}
.note-card:hover .nc-acts .mini-link,
.note-card.editing .nc-acts .mini-link,
.note-card:focus-within .nc-acts .mini-link{opacity:1}
/* 触屏没有 hover：操作必须常驻，否则手机上永远点不到 */
@media (hover:none){.nc-acts .mini-link{opacity:1}}
.mini-link{
  border:0;background:none;padding:0;font:inherit;font-size:10.5px;font-weight:600;
  color:var(--brand);cursor:pointer;
}
.mini-link.muted{color:var(--text-3);font-weight:500}
.mini-link.muted:hover{color:var(--brand-deep)}
.mini-link.danger:hover{color:var(--danger)}
.note-card .editbox{
  width:100%;border:1px solid var(--brand-bright);border-radius:9px;padding:9px 11px;
  font:inherit;font-size:12.8px;line-height:1.65;color:var(--text);background:#fff;
  outline:0;resize:vertical;min-height:96px;
}
.notes-empty{
  grid-column:1 / -1;display:flex;flex-direction:column;align-items:center;gap:5px;
  padding:46px 20px;border:1px dashed #cfe8dc;border-radius:12px;
  color:var(--text-3);background:#fbfefc;font-size:12.5px;
}
.notes-empty b{color:var(--text-2);font-size:13px;font-weight:600}

@media (max-width:1100px){
  .notes{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:640px){
  .notes{grid-template-columns:minmax(0,1fr)}
  .capture{padding:13px 14px 10px}
  .note-card{padding:13px 14px 10px;min-height:0}
}

/* ---------- 窄屏（手机浏览器 / 小程序内嵌 WebView） ---------- */
@media (max-width:640px){
  .topbar{padding:10px 14px;gap:10px}
  .syncbar{gap:6px;justify-content:flex-end;row-gap:6px}
  .syncbar .pill{padding:3px 8px;font-size:11.5px}
  /* 上次同步时间不是手机上要盯的信息，留给桌面 */
  .syncbar .lastsync{display:none}
  .syncbar .switch span{display:none}
  .syncbar .btn.ghost{height:28px;padding:0 10px;font-size:12px}
  .iconbtn{width:32px;height:32px}
  .wrap{padding:14px 14px 40px}
  .composer{padding:12px 12px 10px}
}

@media (max-width:640px){
  /* 顶栏必须允许换行：不换行时搜索框的最小内容宽度会把整页撑宽，
     表现就是「右侧内容被切掉」，比藏起几个按钮难查得多 */
  .topbar{flex-wrap:wrap}
  .syncbar{width:100%;justify-content:flex-start}
  html,body{overflow-x:hidden}
}

/* ---------- Drop 跨设备互传（对齐设计稿：左主列 + 300px 右栏） ---------- */
.drop-grid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:16px;align-items:start}
.dropmain{display:flex;flex-direction:column;gap:0;min-width:0}
.dropside{display:flex;flex-direction:column;gap:12px}
@media (max-width:1100px){
  .drop-grid{grid-template-columns:minmax(0,1fr)}
}

/* 上传区：虚线大框，图标 + 标题 + 格式 chips */
.upload-zone{
  border:1.6px dashed #c4e6d7;border-radius:16px;
  background:linear-gradient(180deg,#fbfefc,#f4fbf7);
  padding:28px 24px;text-align:center;transition:.2s;cursor:pointer;
}
.upload-zone.dragging{border-color:var(--brand);background:linear-gradient(180deg,#f7fdfa,#eefaf4)}
.up-icon{
  width:48px;height:48px;border-radius:14px;margin:0 auto 12px;
  background:#fff;border:1px solid var(--line);display:flex;align-items:center;justify-content:center;
  color:var(--brand);box-shadow:0 6px 18px -12px rgba(15,157,110,.6);
}
.up-icon svg{width:24px;height:24px}
.upload-zone h3{font-size:14px;font-weight:650;margin-bottom:5px}
.upload-zone p{font-size:12px;color:var(--text-2)}
.upload-zone .fmt{display:flex;gap:6px;justify-content:center;margin-top:12px;flex-wrap:wrap}
.upload-zone .dropbar{justify-content:center;margin-top:14px}
.upload-zone .dropbar .btn{margin-left:0}
.dropbar{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;align-items:center}
.dropselect{
  border:1px solid var(--line);background:#fbfefc;color:var(--text);
  padding:6px 10px;border-radius:9px;font-size:12.5px;outline:0;cursor:pointer;
}
.dropselect:focus{border-color:var(--brand-bright)}
/* 折线图多指标芯片：勾选即叠加一条线，样式沿用 notetabs chip 的选中态。
   这一区必须独占整行——塞进 bgrid 的 150px 窄列里，中文会被逐字换行、竖成一柱 */
.builder .field.metric-field{grid-column:1/-1;gap:6px}
.metricchips{
  display:flex;gap:6px;flex-wrap:wrap;align-items:flex-start;
  padding:8px 10px;border:1px solid var(--line);border-radius:10px;background:#fbfefc;
  max-height:116px;overflow-y:auto;
}
.metricchips .chip{
  display:inline-flex;align-items:center;gap:6px;padding:5px 10px;cursor:pointer;
  border:1px dashed var(--line);border-radius:999px;background:#fff;white-space:nowrap;
  font-size:12px;color:var(--text-2);user-select:none;transition:border-color .15s,background .15s,color .15s;
}
.metricchips .chip input{margin:0;accent-color:var(--brand);cursor:pointer}
.metricchips .chip:hover{border-color:#bfe4d3;color:var(--brand-deep)}
.metricchips .chip.on{border-style:solid;background:var(--brand-soft);border-color:#c2ecdb;color:#0a6b4c;font-weight:600}
.chipempty{font-size:11.5px;color:var(--text-3)}
/* ---------- 一键经营分析报告 ---------- */
.insreport{margin-top:14px}
/* 报告正文原来直接贴到卡片边上（0 内边距），一屏塞满没有留白，容易看成被裁掉 */
#insReportBody{padding:2px 16px 16px}
.insreport .card-head{flex-wrap:wrap;row-gap:6px}
/* KPI 条带：卡片给足宽度（198px 起），宽屏 4 列、窄屏 2 列。
   之前 150px 起挤 6 列，名字和「期间均值 · 9月 xx」只能折成两行，看着像被裁掉 */
.rp-kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(198px,1fr));gap:12px;margin-bottom:16px}
/* 6 个指标时固定 3 列 → 排成 3×2 的方块；否则最后一行只剩两张卡，右边空一大块，看着像数据缺了 */
.rp-kpis.cols3{grid-template-columns:repeat(3,minmax(0,1fr))}
@media (max-width:760px){.rp-kpis.cols3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:460px){.rp-kpis,.rp-kpis.cols3{grid-template-columns:minmax(0,1fr)}}
.rp-kpi{
  display:flex;flex-direction:column;gap:6px;padding:13px 15px;border-radius:12px;min-width:0;
  background:linear-gradient(150deg,var(--brand-softer,#f0fbf6),#fff);border:1px solid #dcefe5;position:relative;
}
.rpk-name{
  font-size:12px;color:var(--text-2);line-height:1.4;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.rpk-val{font-size:21px;font-weight:700;color:var(--brand-deep,#0a6b4c);letter-spacing:-.3px;line-height:1.2;font-variant-numeric:tabular-nums}
.rpk-sub{font-size:11.5px;color:var(--text-3);line-height:1.45}
.rpkmom{font-size:12px;font-weight:600;display:inline-flex;align-items:center;gap:4px;margin-top:2px}
.rpkmom i{font-style:normal;font-size:10px;font-weight:400;opacity:.65}
.rpkmom.up{color:#d64541}
.rpkmom.down{color:#1a9850}
.rp-overview{margin:0 0 16px;font-size:13.5px;line-height:1.75;color:var(--text);background:#f7fbf9;border-left:3px solid var(--brand);border-radius:0 10px 10px 0;padding:11px 15px}
.rp-cols{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin-bottom:16px}
.rp-sec{min-width:0}
.rp-sec h4{margin:0 0 8px;font-size:12.5px;color:var(--text-2);letter-spacing:.2px}
.rp-sec ul{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:7px}
.rp-sec li{font-size:12.5px;line-height:1.65;padding:9px 12px;border-radius:9px;background:#fbfdfc;border:1px solid var(--line)}
.rp-good li{border-color:#d5efdf;background:#f4fbf7}
.rp-risk li{border-color:#f3ddd7;background:#fdf7f5}
.rp-advice{margin-bottom:0}
.rp-advice li{border-color:#dfe8fd;background:#f6f8fd}
/* 预算达成条与收入结构：经营分析里最常被「只看总量」漏掉的两块 */
.rp-budget{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:center;font-size:12.5px;color:var(--text-2);background:#fbfdfc;border:1px dashed #d7e9e0;border-radius:10px;padding:10px 13px;margin-bottom:16px;line-height:1.6}
.rpb-tag{font-size:11px;font-weight:600;color:var(--brand-deep);background:var(--brand-soft);border-radius:999px;padding:2px 9px}
.rpb-good{color:#1a9850;font-weight:600}
.rpb-bad{color:#d64541;font-weight:600}
.rp-struct{margin-bottom:16px}
.rp-struct h4{margin:0 0 10px;font-size:12.5px;color:var(--text-2);letter-spacing:.2px}
.rps-row{display:grid;grid-template-columns:minmax(96px,190px) minmax(0,1fr) 42px 74px;gap:10px;align-items:center;font-size:12px;margin-bottom:7px}
.rps-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-2)}
.rps-bar{height:8px;border-radius:999px;background:#eef4f1;overflow:hidden}
.rps-bar i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,#34d399,#0f9d6e)}
.rps-row b{text-align:right;color:#0a6b4c}
.rps-row em{font-style:normal;text-align:right;color:var(--text-3);font-size:11px}
@media (max-width:640px){.rp-cols{grid-template-columns:1fr}}
.dropbar .btn{margin-left:auto}
.uplist{display:flex;flex-direction:column;gap:8px;margin-top:10px;text-align:left}
.uprow{
  display:grid;grid-template-columns:minmax(0,1fr) 160px 110px;gap:10px;align-items:center;
  padding:7px 10px;border:1px solid var(--line);border-radius:10px;background:#fbfefc;font-size:12.5px;
}
.uprow.failed{border-color:#f0c9c1;background:#fdf6f5}
.upname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.upbar{height:6px;border-radius:999px;background:#e6f1ec;overflow:hidden}
.upbar i{display:block;height:100%;border-radius:999px;background:linear-gradient(90deg,var(--brand),var(--brand-bright));transition:width .2s}
.upstate{color:var(--text-2);text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* 最近互传：trans-card 行（图标 + 名称/元信息 + 取件码 + 操作） */
.dropgroup{display:flex;align-items:center;gap:8px;margin:22px 0 10px;font-size:13px;font-weight:650;color:var(--text)}
/* group-title 的 ::after 会把剩余宽度吃掉，导致「刷新」跑到中间 */
.dropgroup::after{display:none}
.dropgroup .count{font-size:11.5px;font-weight:400;color:var(--text-3)}
.dropgroup .grow{flex:1}
.translist{display:flex;flex-direction:column;gap:9px}
.droprow{
  display:grid;grid-template-columns:36px minmax(0,1fr) auto;gap:12px;align-items:center;
  border:1px solid var(--line);border-radius:12px;padding:11px 14px;background:var(--surface);
  box-shadow:0 1px 2px rgba(16,48,42,.03);transition:.16s;
}
.droprow:hover{border-color:#c9e8d9;box-shadow:var(--shadow)}
/* 列表刷新失败但手里有旧数据时：顶部一条温和提示，下面照常显示上次结果 */
.loaderr{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  margin:0 0 10px;padding:8px 11px;border:1px solid #f0dcc2;border-radius:10px;
  background:#fdf9f3;color:#8a5a24;font-size:12px;line-height:1.5;
}
.droprow.dead{opacity:.62;background:#f4f7f5}
.file-ic{
  width:36px;height:36px;border-radius:10px;flex:none;
  background:var(--brand-soft);color:var(--brand);
  display:flex;align-items:center;justify-content:center;border:1px solid #d9f0e6;
}
.file-ic svg{width:18px;height:18px}
.file-ic.alt{background:#f0f5fc;color:#3b7ad4;border-color:#dfe9f8}
.dmain{min-width:0}
.dmain .rowtitle{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dmain .meta{display:flex;flex-wrap:wrap;gap:5px;margin-top:3px}
.dside{display:flex;flex-direction:column;align-items:flex-end;gap:6px}
.dcode{
  font-family:ui-monospace,SFMono-Regular,Consolas,monospace;
  font-size:12.5px;font-weight:600;letter-spacing:.09em;color:#0b6b4c;
  background:var(--brand-soft);padding:3px 8px;border-radius:6px;user-select:all;
}
.dact{display:flex;gap:6px;align-items:center;flex-wrap:wrap;justify-content:flex-end}
.minibtn.danger{color:var(--danger)}

/* 右栏卡片 */
.sidecard{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:0 1px 2px rgba(16,48,42,.03);overflow:hidden;
}
.sidehead{padding:12px 16px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,#fff,#fbfdfc)}
.sidehead h3{font-size:13px;font-weight:650;margin:0}
.sidebody{padding:14px 16px 16px;display:flex;flex-direction:column;gap:10px}
.sidebody textarea{
  width:100%;resize:vertical;border:1px solid var(--line);border-radius:10px;background:#fff;
  font:inherit;font-size:13px;line-height:1.6;color:var(--text);padding:9px 11px;min-height:72px;
}
.sidebody textarea:focus{outline:2px solid var(--brand-soft);border-color:var(--brand)}
.sidebody textarea::placeholder{color:#a9bdb5}
.sidehint{font-size:11.5px;color:var(--text-3);line-height:1.5}
.btn.wide{width:100%;justify-content:center}
.pick-cells{display:flex;gap:6px}
.pick-cells input{
  flex:1;min-width:0;height:40px;border-radius:8px;border:1.4px solid var(--line);
  background:#f6faf8;text-align:center;font-family:ui-monospace,Consolas,monospace;
  font-size:15px;font-weight:600;color:var(--text);text-transform:uppercase;outline:none;
  transition:.15s;
}
.pick-cells input:focus{border-color:var(--brand);background:#fff;box-shadow:0 0 0 3px rgba(52,211,153,.16)}
.pick-cells input.filled{border-color:#9fdcc3;background:#fff}
.pickerr{font-size:11.5px;color:var(--danger)}
.statline{display:flex;align-items:baseline;gap:6px}
.statline b{font-size:22px;font-weight:650;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.statline span{font-size:12px;color:var(--text-2)}
.synctxt{display:flex;justify-content:space-between;font-size:11.5px;color:var(--text-3)}

/* 分析页仍复用的通用列表头 / 拖放提示（互传页新样式在上方） */
.dz-hint{
  display:flex;align-items:center;gap:12px;color:var(--text-2);font-size:13.5px;
  padding:6px 2px 2px;
}
.dz-hint svg{width:26px;height:26px;color:var(--brand);flex:none}
.drophead{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}
.droptitle{font-weight:650;font-size:13.5px}
.droplist{display:flex;flex-direction:column;gap:10px}

@media (max-width:640px){
  .droprow{grid-template-columns:36px minmax(0,1fr)}
  .dside{grid-column:1 / -1;flex-direction:row;justify-content:space-between;align-items:center}
  .uprow{grid-template-columns:minmax(0,1fr) 90px}
  .uprow .upstate{display:none}
  .sidebody{padding:12px 14px 14px}
}

/* ---------- 二维码 / 截图弹窗 ---------- */
.qrbody{display:flex;flex-direction:column;align-items:center;gap:12px;text-align:center}
.qrbody canvas{border:1px solid var(--line);border-radius:10px}
.qrmeta{display:flex;flex-direction:column;gap:2px;align-items:center}
.qrcode-text{
  font:650 22px/1.2 ui-monospace,SFMono-Regular,Consolas,Menlo,monospace;
  letter-spacing:.28em;color:#0b6b4c;user-select:all;
}
.shotwrap{
  position:relative;overflow:hidden;max-height:56vh;border:1px solid var(--line);
  border-radius:10px;background:#f4f7f5;touch-action:none;text-align:center;
}
/* 宽高都要受容器约束：只限宽度时，竖长截图会把弹层撑出屏幕 */
.shotwrap canvas{display:block;margin:0 auto;max-width:100%;max-height:52vh;width:auto;height:auto;cursor:crosshair}
/* 选区必须和画布同坐标系：stage 的尺寸就是画布渲染后的尺寸 */
.shotstage{position:relative;display:inline-block;line-height:0;max-width:100%}
/* 微信式选区：选区外用大范围投影压暗，选区内透亮 */
.shotsel{
  position:absolute;border:1.5px solid #fff;outline:1.5px solid var(--brand);
  box-shadow:0 0 0 9999px rgba(10,20,16,.55);
  cursor:move;pointer-events:auto;
}
.shotsel .shotsize{
  position:absolute;left:50%;transform:translateX(-50%);
  bottom:-26px;background:rgba(10,20,16,.85);color:#fff;
  font-size:11px;line-height:1;padding:5px 8px;border-radius:6px;
  white-space:nowrap;pointer-events:none;
}
.shotsel .shotsize.above{bottom:auto;top:-26px}
.shotsel .shotsize.atleft{left:0;transform:none}
.shotsel .shotsize.atright{left:auto;right:0;transform:none}
.shoth{
  position:absolute;width:10px;height:10px;border-radius:50%;
  background:#fff;border:2px solid var(--brand);box-sizing:border-box;
}
.shoth[data-h="nw"]{left:-6px;top:-6px;cursor:nwse-resize}
.shoth[data-h="ne"]{right:-6px;top:-6px;cursor:nesw-resize}
.shoth[data-h="sw"]{left:-6px;bottom:-6px;cursor:nesw-resize}
.shoth[data-h="se"]{right:-6px;bottom:-6px;cursor:nwse-resize}

/* ---------- 取件页（无登录） ---------- */
.pickuppage{
  display:flex;align-items:center;justify-content:center;
  min-height:100vh;padding:40px 16px;
}
.pickupcard{
  width:100%;max-width:400px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:24px 22px 22px;
}
/* 取件只有一个动作，按钮给足分量：矮矮一条 34px 撑不起这张卡 */
.pickupcard .btn{height:40px;font-size:13.5px;font-weight:600}
.pickupcard .field input{
  width:100%;border:1px solid var(--line);border-radius:10px;background:#fbfefc;
  padding:9px 12px;font-size:16px;outline:0;
}
.pickupcard .field input:focus{border-color:var(--brand-bright);background:#fff}
.pickupcard .field{display:flex;flex-direction:column;gap:6px;margin-bottom:14px}
.pickupcard .field span{font-size:12.5px;color:var(--text-2)}
.fileico{
  width:46px;height:46px;border-radius:12px;background:var(--brand-soft);
  color:#0b6b4c;display:flex;align-items:center;justify-content:center;margin-bottom:10px;
}
.fileico svg{width:24px;height:24px}
.fname{
  margin:0 0 6px;font-size:15.5px;font-weight:650;word-break:break-all;
}
.fmeta{display:flex;flex-wrap:wrap;gap:4px 10px;color:var(--text-3);font-size:12.5px;margin-bottom:16px}
.autherr{color:var(--danger);font-size:12.5px;margin:8px 0 0}

/* ---------- Insight 运营数据分析 ---------- */
/* ---------- 分析页：多格式导入 ---------- */
.inszone{padding:16px 18px 14px;transition:.15s border-color,.15s background}
.inszone.dragging{border-color:var(--brand-bright);background:var(--brand-soft)}
.dz{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  border:1.5px dashed #cfe8dc;border-radius:12px;background:#fbfefc;
  padding:15px 17px;transition:.15s border-color,.15s background;
}
.inszone.dragging .dz{border-color:var(--brand);background:#f4fdf8}
.dz-ico{
  width:42px;height:42px;flex:none;border-radius:12px;
  background:var(--brand-soft);color:var(--brand);
  display:flex;align-items:center;justify-content:center;
}
.dz-ico svg{width:22px;height:22px}
.dz-main{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 180px}
.dz-main b{font-size:13.5px;font-weight:650}
.dz-main span{font-size:11.5px;color:var(--text-3)}
.dz-acts{display:flex;gap:8px;flex-wrap:wrap;margin-left:auto}
.dz-tips{margin-top:10px;font-size:11.5px;color:var(--text-3);line-height:1.6}
.dz-tips b{color:var(--text-2);font-weight:600}

/* 解析结果确认：先看再入库 */
.insparse{padding:0;overflow:hidden}
.ip-head{display:flex;align-items:center;gap:12px;padding:13px 18px 11px;border-bottom:1px solid var(--line-2)}
.ip-file{display:flex;flex-direction:column;gap:2px;min-width:0}
.ip-file b{font-size:13.5px;font-weight:650;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ip-file span{font-size:11.5px;color:var(--text-3)}
.ip-head .linkbtn{margin-left:auto;flex:none}
.ip-warn{
  display:flex;flex-direction:column;gap:4px;margin:12px 18px 0;
  padding:9px 12px;border:1px solid #f3e2c4;border-radius:9px;background:#fdf8ee;
  font-size:11.5px;line-height:1.6;color:#8a6414;
}
.ip-tabs{display:flex;gap:6px;flex-wrap:wrap;padding:12px 18px 0}
.ip-tablescroll{
  overflow:auto;max-height:340px;margin:12px 18px 0;
  border:1px solid var(--line);border-radius:10px;
}
.iptable{border-collapse:separate;border-spacing:0;width:100%;font-size:12px;min-width:max-content}
.iptable th,.iptable td{padding:7px 12px;text-align:left;white-space:nowrap;border-bottom:1px solid var(--line-2)}
.iptable th{
  position:sticky;top:0;z-index:1;background:#f4fbf7;font-size:11.5px;font-weight:600;
  color:var(--text);border-bottom:1px solid var(--line);
}
.iptable th .ct{
  margin-left:6px;font-style:normal;font-size:9.5px;color:var(--text-3);
  background:#fff;border:1px solid var(--line);border-radius:4px;padding:0 3px;
}
/* 数字列里混了脏字（合计/小计）被跳过：标个感叹号，别让数据「悄悄变空」 */
.iptable th .ct-skip{
  margin-left:3px;color:#a4720c;background:#fdf6e7;border-color:#eddbb4;cursor:help;
}
.iptable td{color:var(--text-2);font-variant-numeric:tabular-nums}
.iptable tbody tr:last-child td{border-bottom:0}
.iptable tbody tr:hover td{background:#fbfefc}
.ip-more{padding:7px 18px 0;font-size:11px;color:var(--text-3)}
.ip-text{
  margin:12px 18px 0;padding:12px 14px;border:1px solid var(--line);border-radius:10px;
  background:#fbfefc;font-size:12.5px;line-height:1.75;color:var(--text-2);
  min-height:56px;max-height:300px;overflow:auto;white-space:pre-wrap;word-break:break-word;
}
.ip-foot{
  display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap;
  padding:13px 18px;border-top:1px solid var(--line-2);margin-top:14px;
}
.ip-name{flex:1 1 220px;display:flex;flex-direction:column;gap:5px;min-width:0}
.ip-name span{font-size:11.5px;color:var(--text-3)}
.ip-name .input{
  border:1px solid var(--line);border-radius:9px;padding:7px 11px;
  background:#fbfefc;font-size:13px;
}
.ip-name .input:focus{border-color:var(--brand-bright);background:#fff;box-shadow:0 0 0 3px rgba(52,211,153,.12)}
.ip-head-sw{flex:none;padding-bottom:7px;white-space:nowrap}
.ip-acts{display:flex;gap:8px;margin-left:auto;flex-wrap:wrap}
.pastebox{
  display:block;width:100%;margin-top:8px;padding:11px 12px;
  border:1px solid var(--line);border-radius:10px;background:#fbfefc;
  font:12.5px/1.7 ui-monospace,Consolas,"Microsoft YaHei",monospace;color:var(--text);
  resize:vertical;outline:0;
}
.pastebox:focus{border-color:var(--brand-bright);background:#fff;box-shadow:0 0 0 3px rgba(52,211,153,.12)}
.hintline.bad{color:var(--danger)}
.uprow.ok{border-color:#c2ecdb;background:#f6fdf9}

@media (max-width:640px){
  .inszone{padding:12px 12px 10px}
  .dz{padding:13px 14px;gap:10px}
  .dz-acts{width:100%;margin-left:0}
  .dz-acts .btn{flex:1 1 auto}
  .ip-head{padding:12px 14px 10px}
  .ip-tablescroll,.ip-text,.ip-warn{margin-left:14px;margin-right:14px}
  .ip-tabs{padding:10px 14px 0}
  .ip-more{padding-left:14px;padding-right:14px}
  .ip-foot{padding:12px 14px}
  .ip-name{flex:1 1 100%}
  /* 名字输入框独占一行后，两个开关并排一行、不必再跟输入框底对齐 */
  .ip-head-sw{padding-bottom:0;flex:1 1 auto}
  .ip-acts{width:100%;margin-left:0}
  .ip-acts .btn{flex:1 1 auto}
}

.builder{padding:14px 16px 12px}
.bgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px 14px}
.builder .field{display:flex;flex-direction:column;gap:5px}
.builder .field span{font-size:12px;color:var(--text-3)}
.builder .input{padding:7px 10px;font-size:13px}

/* 看板按 12 栅格排：KPI 卡一排四个，折线占 2/3、柱状占 1/3，结论压底。
   参考稿就是这个比例——折线要宽才好读趋势，柱状窄一点不影响看排名 */
.dashgrid{display:grid;grid-template-columns:repeat(12,minmax(0,1fr));gap:12px;padding:0 16px 16px}
.metriccard{grid-column:span 3}
.chartcard{grid-column:span 12}
.chartcard.line{grid-column:span 8}
/* 看板里只有折线（没有柱状图）时占满整行 */
.chartcard.line.solo{grid-column:span 12}
.chartcard.bar{grid-column:span 4}
.chartcard.dashsum{grid-column:span 12}
@media (max-width:1180px){
  .metriccard{grid-column:span 6}
  .chartcard.line,.chartcard.bar{grid-column:span 12}
}
@media (max-width:640px){
  .metriccard{grid-column:span 12}
}

/* 通用卡片：标题行 + 内容（对齐设计稿 .card / .card-head） */
.panelcard{
  background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);box-shadow:var(--shadow);
}
.panelcard .card-head{display:flex;align-items:center;gap:10px;padding:14px 16px 10px}
.panelcard .card-head h3{margin:0;font-size:13.5px;font-weight:650}
.panelcard .card-head .spacer{flex:1}
.insdash,.insds{margin-top:14px}
/* 空态：虚线框 + 一句解释，不要一句灰字孤零零悬在白卡中央 */
.insempty{
  margin:2px 16px 16px;padding:30px 20px;border:1px dashed #cfe8dc;border-radius:12px;
  background:#fbfefc;text-align:center;
  display:flex;flex-direction:column;align-items:center;gap:6px;
}
.insempty b{font-size:13.5px;font-weight:600;color:var(--text-2)}
.insempty span{font-size:12px;line-height:1.7;color:var(--text-3);max-width:430px}
/* 空态要么占满整行，要么别塞进网格：否则会被 auto-fill 的第一列裁成窄条 */
.dashgrid .insempty{grid-column:1 / -1;margin:2px 0 0}
.dslist{display:flex;flex-direction:column;gap:8px;padding:0 16px 16px}
.metriccard{
  position:relative;background:#fbfefc;border:1px solid var(--line);border-radius:12px;
  padding:14px 16px 12px;min-width:0;
}
.mctitle{font-size:12.5px;color:var(--text-2)}
.mcvalue{font:700 30px/1.2 "Segoe UI",system-ui,sans-serif;color:#0b6b4c;margin-top:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 环比：涨绿跌红，持平灰。字号比数值小一档，不能抢主数字 */
.mcdelta{display:flex;align-items:center;gap:4px;margin-top:2px;font-size:12px;font-weight:600}
.mcdelta i{font-style:normal;font-weight:400;font-size:11px;color:var(--text-3)}
.mcdelta.up{color:#0b8f62}
.mcdelta.down{color:var(--danger)}
.mcdelta.flat{color:var(--text-3)}
.mcsub{font-size:11.5px;color:var(--text-3);margin-top:6px}
.chartcard{
  position:relative;background:#fbfefc;border:1px solid var(--line);border-radius:12px;
  padding:12px 14px 10px;min-width:0;
}
.chartcard svg{width:100%;height:auto;display:block}
/* 标题与图例同一行：参考稿就是这么排的，图例跟在标题后面，不另起一行占高度 */
.cchead{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:6px;padding-right:20px}
.cchead .cctitle{margin:0;padding-right:0}
.ccleg{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:11.5px;color:var(--text-2)}
.ccleg span{display:inline-flex;align-items:center;gap:5px}
.ccleg i{width:8px;height:8px;border-radius:50%;display:inline-block}
.cctitle{font-weight:650;font-size:13px;margin-bottom:6px;padding-right:20px}
.ccempty{color:var(--text-3);font-size:12.5px;padding:18px 0}
.chartcard.dead{opacity:.6}
/* 底部自动结论：左侧一道色条当引子，正文用列表，别糊成一段 */
.dashsum{border-left:3px solid var(--brand-bright);padding:14px 16px 12px}
.factlist{margin:2px 0 0;padding-left:16px;display:flex;flex-direction:column;gap:5px}
.factlist li{font-size:12.5px;line-height:1.75;color:var(--text-2)}
.factfoot{margin-top:8px;font-size:11px;color:var(--text-3)}
.ccdel{
  position:absolute;top:8px;right:8px;width:22px;height:22px;border:0;border-radius:7px;
  background:transparent;color:var(--text-3);font-size:15px;line-height:1;cursor:pointer;
}
.ccdel:hover{background:#f0f6f2;color:var(--danger)}

.dsrow{
  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px;align-items:center;
  border:1px solid var(--line);border-radius:12px;padding:10px 12px;background:#fbfefc;
}
.dsrow .meta{display:flex;flex-wrap:wrap;gap:5px;margin-top:4px}
@media (max-width:640px){
  .dsrow{grid-template-columns:minmax(0,1fr)}
  .dsrow .dact{justify-content:flex-start}
}

.interpret-text{
  font-size:14px;line-height:1.75;color:var(--text);white-space:pre-wrap;
  background:#fbfefc;border:1px solid var(--line);border-radius:10px;padding:14px 16px;
}

/* ---------- 微信绑定 ---------- */
.wxrow{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.wxok{background:var(--brand-soft);color:#0b6b4c;font-weight:650;font-size:12.5px;border-radius:8px;padding:4px 10px}
.wxcode{text-align:center;padding:8px 0 2px}

/* ---------- 顶栏：全局搜索 ---------- */
.searchwrap{position:relative;flex:0 1 240px;min-width:92px;max-width:400px;margin-left:auto}
.sic{
  position:absolute;left:11px;top:50%;transform:translateY(-50%);
  width:15px;height:15px;fill:none;stroke:var(--text-3);stroke-width:1.9;
  stroke-linecap:round;pointer-events:none;
}
.gsearch{
  width:100%;padding:8px 30px 8px 33px;
  border:1px solid var(--line);border-radius:10px;background:#f7fbf9;
  color:var(--text);font:inherit;font-size:13px;outline:none;transition:.15s;
}
.gsearch::placeholder{color:var(--text-3)}
.gsearch:focus{border-color:var(--brand-bright);background:#fff;box-shadow:0 0 0 3px rgba(52,211,153,.14)}
.gsearch::-webkit-search-cancel-button{display:none}
.searchclear{
  position:absolute;right:6px;top:50%;transform:translateY(-50%);
  width:20px;height:20px;padding:0;border:0;border-radius:50%;
  background:#e7f1ec;color:var(--text-2);font-size:13px;line-height:1;cursor:pointer;
}
.searchclear:hover{background:#d9eae2}
.searchpanel{
  position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:30;
  background:#fff;border:1px solid var(--line);border-radius:12px;
  box-shadow:0 18px 40px -22px rgba(21,48,42,.5);
  padding:6px;max-height:60vh;overflow:auto;
}
.sgroup{font-size:10.5px;font-weight:600;letter-spacing:.1em;color:var(--text-3);padding:8px 9px 5px}
.shit{
  display:flex;flex-direction:column;gap:2px;width:100%;padding:8px 9px;
  border:0;border-radius:8px;background:transparent;text-align:left;
  font:inherit;cursor:pointer;
}
.shit:hover,.shit.on{background:var(--brand-soft)}
.shit-main{font-size:13px;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.shit-meta{font-size:11.5px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sempty{padding:18px 12px;text-align:center;color:var(--text-3);font-size:12.5px}

/* ---------- 今日看板 ---------- */

.statgrid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:16px}
.stat{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:14px 16px 13px;box-shadow:var(--shadow);
}
.stat-top{font-size:12px;color:var(--text-2)}
.stat-num{
  font-size:27px;font-weight:680;line-height:1.15;margin:8px 0 4px;
  letter-spacing:-.5px;font-variant-numeric:tabular-nums;color:var(--text);
}
.stat-of{font-size:14px;color:var(--text-3);font-weight:500}
.stat-foot{font-size:11.5px;color:var(--text-3)}
.stat.warn .stat-num{color:var(--warn)}
.stat.good .stat-num{color:var(--brand)}

.todaycols{grid-template-columns:minmax(0,1fr) 300px}
/* 今日左栏只有一两条时，别撑出一大片空白：高度交给内容 */
.todaycols .listpanel{min-height:0}
.maincol{display:flex;flex-direction:column;gap:16px;min-width:0}
.sidestack{display:flex;flex-direction:column;gap:12px}
.minipanel{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:12px 14px 14px;
}
.panelhead{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:3px 2px 10px}
.paneltitle{font-weight:650;font-size:13px}

.todaynotes{display:flex;flex-direction:column;gap:6px}
.tnote{
  display:flex;flex-direction:column;gap:2px;width:100%;padding:8px 9px;
  border:0;border-radius:9px;background:#fbfefc;text-align:left;font:inherit;cursor:pointer;
}
.tnote:hover{background:var(--brand-soft)}
.tnote-title{font-size:12.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tnote-meta{font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.weekchart{display:flex;align-items:flex-end;justify-content:space-between;gap:6px;height:78px;padding:0 2px}
.wcol{flex:1 1 0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:4px;height:100%}
.wnum{height:12px;line-height:12px;font-size:10px;color:var(--text-3);font-variant-numeric:tabular-nums}
.wbar{width:100%;max-width:22px;border-radius:5px 5px 3px 3px;background:#d8ece3;transition:height .3s}
.wcol.on .wbar{background:linear-gradient(180deg,var(--brand-bright),var(--brand))}
.wlab{font-size:10px;color:var(--text-3)}
.wcol.on .wlab{color:#0b6b4c;font-weight:600}

/* 接下来三天：三张竖排小卡，同一天的事按时间从上往下读 */
.upnext{padding:12px 14px 14px}
.updays{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}
.upday{
  min-width:0;padding:9px 10px 10px;border:1px solid var(--line);
  border-radius:11px;background:#fbfefc;
}
.upday.is-tom{border-color:#c2ecdb;background:linear-gradient(180deg,#f6fdf9,#fbfefc)}
.updhead{display:flex;align-items:baseline;gap:5px;margin-bottom:7px}
.updhead b{font-size:12.5px;font-weight:650;letter-spacing:.1px}
.updhead span{font-size:10.5px;color:var(--text-3);font-variant-numeric:tabular-nums}
.updhead .upn{margin-left:auto;font-size:10.5px;color:var(--text-3)}
.upitems{display:flex;flex-direction:column;gap:6px;margin:0;padding:0;list-style:none}
.upitems li{display:flex;align-items:baseline;gap:6px;min-width:0;font-size:12px;color:var(--text-2);line-height:1.45}
.upitems .uptime{
  flex:0 0 auto;font-size:10.5px;color:#0b6b4c;font-variant-numeric:tabular-nums;
  background:var(--brand-soft);border-radius:5px;padding:0 5px;line-height:16px;
}
.upitems .uptime.allday{background:#f1f5f3;color:var(--text-3)}
.upitems .upttl{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.upitems li.due .uptime{background:#fdf3e2;color:var(--warn)}
.upmore{font-size:10.5px;color:var(--text-3);padding-left:2px}
.upempty{font-size:11.5px;color:#a9bdb5;padding:1px 0 2px}
@media (max-width:640px){
  .updays{grid-template-columns:minmax(0,1fr);gap:8px}
  .upday{padding:8px 10px}
  /* 手机上三天全空时别占三屏：空的日期压成一行 */
  .upday.is-empty{display:flex;align-items:center;gap:8px;padding:7px 10px}
  .upday.is-empty .updhead{margin:0;flex:1 1 auto;min-width:0}
  .upday.is-empty .upempty{padding:0;flex:0 0 auto}
}

@media (max-width:1100px){.statgrid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media (max-width:900px){
  .todaycols{grid-template-columns:minmax(0,1fr)}
  .hero{align-items:flex-start}
}
@media (max-width:480px){
  .statgrid{grid-template-columns:repeat(2,minmax(0,1fr));gap:9px}
  .stat{padding:11px 12px}
  .stat-num{font-size:23px}
}


/* ---------- 知识库 ----------
   候选卡不是任务行：它有「结论 + 适用条件 + 出处 + 两个动作」四层信息，
   塞进 .row 会把行高撑歪，所以单独一套。 */
.kbtabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
.kbtab{
  border:1px solid var(--line);background:#fbfefc;color:var(--text-2);font:inherit;font-size:11.5px;
  padding:4px 10px;border-radius:7px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;
  transition:.15s;
}
.kbtab:hover{border-color:#bfe4d3;color:var(--brand-deep);background:#fff}
.kbtab.on{background:var(--brand-soft);border-color:#c2ecdb;color:#0a6b4c;font-weight:600}
.kbtab .cnt{font-size:10.5px;font-weight:600;color:var(--text-3)}
.kbtab.on .cnt{color:#0a6b4c;opacity:.65}
.kbtab .cnt.warn{color:var(--warn);opacity:1}

.kbList{display:flex;flex-direction:column;gap:10px;padding:2px}
.kbitem{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:14px 16px 12px;box-shadow:var(--shadow);
}
.kbclaim{font-weight:600;line-height:1.55}
.kbcond{margin-top:3px;color:var(--text-2);font-size:12.5px}
.kbmeta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:9px}
.kbtag{font-size:11.5px;padding:2px 8px;border-radius:999px;background:var(--brand-soft);color:#0b6b4c}
.kbtag.warn{background:#fdf3e2;color:var(--warn)}
.kbacts{display:flex;gap:8px;margin-top:11px}

/* 「收入知识库」是这一屏唯一的主操作，不能沿用小按钮的红色 hover */
.minibtn.primary{color:#fff;background:var(--brand);border-color:var(--brand)}
.minibtn.primary:hover{background:#0b8a60;border-color:#0b8a60;color:#fff}

/* ---------- 小程序 ---------- */
.kbbox{display:flex;flex-direction:column;gap:10px;padding:2px 16px 16px}
.mpmain{min-height:0}
/* 绑定状态：一行状态胶囊 + 一句说明，别让整张卡只剩一行小字 */
.wxstate{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.wxstate b{font-size:13.5px;font-weight:600}
.wxstate .chip{font-size:11px}
.mplist,.mpsteps{margin:0;padding:0 2px;display:flex;flex-direction:column;gap:11px}
.mplist{list-style:none}
.mplist li{display:flex;flex-direction:column;gap:1px;font-size:12.5px;color:var(--text-2)}
.mplist li strong{font-size:13px;color:var(--text);font-weight:600}
.mpsteps{padding-left:18px;font-size:12.5px;color:var(--text-2)}
.mpsteps li{padding-left:2px}

/* 启动期崩溃堆栈 */
.boottrace{
  position:fixed;left:0;right:0;bottom:0;margin:0;padding:12px;z-index:99;
  background:#fdecea;color:#a3372a;font-size:12px;white-space:pre-wrap;
  max-height:40vh;overflow:auto;border-top:1px solid #f3c7bf;
}
.emptystate-act{margin-top:14px}
.emptystate-act .btn{font-size:12.5px;padding:7px 15px}

/* ---------- 互传 · 文字/链接（发送框已并入右栏卡片 .sidebody） ---------- */

/* 文字行的预览块：可点击复制，得看起来「点得动」 */
.txtrow .txtpreview{
  white-space:pre-wrap;word-break:break-all;line-height:1.55;
  cursor:copy;border-radius:8px;padding:6px 8px;margin:-2px -8px;
}
.txtrow .txtpreview:hover{background:var(--brand-soft)}

/* 取件页的文字卡片 */
.pickup-txt{
  margin:0;padding:12px 14px;background:#f6faf8;border:1px solid var(--line);
  border-radius:10px;white-space:pre-wrap;word-break:break-all;
  font:inherit;font-size:13.5px;line-height:1.6;color:var(--text);
  max-height:40vh;overflow:auto;
}
.tbtns{display:flex;gap:8px}
.tbtns .btn{flex:1}

/* ---------- 日程页 ----------
   设计取向：日历是「一张卡」，不是 42 个独立小方块。
   单元格之间用发丝线分隔，格子里直接露出当天最多两条日程，
   细节（完整清单、完成/删除）留给下半区，一眼能看出「哪天空、哪天忙」。 */

/* 工具条：左侧月份标题 + 翻页，右侧视图切换 + 跳转 */
.schtop{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.schheadline{display:flex;align-items:center;gap:14px;min-width:0}
.schrange{
  margin:0;font-size:17px;line-height:1.2;font-weight:650;letter-spacing:-.015em;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.schstep{display:inline-flex;align-items:center;border:1px solid var(--line);border-radius:9px;background:var(--surface);overflow:hidden}
.schstepbtn{
  border:0;background:transparent;font:inherit;font-size:12.5px;color:var(--text-2);
  cursor:pointer;padding:5px 10px;line-height:1.5;
}
.schstepbtn:hover{background:var(--brand-soft);color:#0b6b4c}
.schstepbtn+.schstepbtn{border-left:1px solid var(--line)}
.schstepbtn.today{font-weight:600;color:var(--text);padding:5px 12px}
.schtools{display:flex;align-items:center;gap:8px;margin-left:auto}
.schmodes{display:inline-flex;border:1px solid var(--line);border-radius:9px;overflow:hidden;background:var(--surface)}
.schmode{
  border:0;background:transparent;font:inherit;font-size:12.5px;padding:5px 15px;
  cursor:pointer;color:var(--text-2);
}
.schmode+.schmode{border-left:1px solid var(--line)}
.schmode:hover{background:var(--brand-soft);color:#0b6b4c}
.schmode.active{background:var(--brand);color:#fff;font-weight:600}
.schjump{
  border:1px solid var(--line);border-radius:9px;background:var(--surface);
  padding:4px 8px;font:inherit;font-size:12.5px;color:var(--text-2);height:30px;
}
.schjump:focus{outline:0;border-color:var(--brand);color:var(--text)}

/* 登记条：一行到底，不抢日历的视觉重心 */
.schadd{
  display:flex;align-items:center;gap:10px;background:var(--surface);
  border:1px solid var(--line);border-radius:12px;padding:6px 8px 6px 13px;
  transition:border-color .15s,box-shadow .15s;
}
.schadd:focus-within{border-color:var(--brand-bright);box-shadow:0 0 0 3px rgba(52,211,153,.14)}
.schadd-ic{width:17px;height:17px;color:var(--brand);flex:none}
.schadd-input{
  flex:1;min-width:0;border:0;background:transparent;outline:0;font:inherit;
  font-size:13.5px;color:var(--text);padding:5px 0;
}
.schadd-input::placeholder{color:#a7bcb4}
.schadd-btn{flex:none;padding:6px 16px;font-size:12.5px}
.schadd-hint{font-size:11.5px;color:var(--text-3);margin:7px 4px 12px}
.schadd-hint b{color:var(--brand);font-weight:600}

/* 日历卡 */
.schcal{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:0 1px 2px rgba(16,48,42,.03);overflow:hidden;
}
.schdowrow{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));background:#fafdfb;border-bottom:1px solid var(--line)}
.schdowrow span{padding:8px;font-size:11.5px;font-weight:600;color:var(--text-3);letter-spacing:.02em}
.schdowrow span.we{color:#bda06c}
/* 周视图的列头自带星期，外层表头就成了重复信息 */
.schcal:has(#schWeek:not([hidden])) .schdowrow{display:none}

.schmonth{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}
.schcell{
  position:relative;height:64px;padding:6px 8px;
  border-right:1px solid var(--line);border-bottom:1px solid var(--line);
  cursor:pointer;display:flex;flex-direction:column;gap:2px;overflow:hidden;
  transition:background .12s;
}
.schcell:nth-child(7n){border-right:0}
.schcell:nth-last-child(-n+7){border-bottom:0}
.schcell:hover{background:#f7fcf9}
.schcell.isout{background:#fbfdfc}
.schcell.isout .schdaynum{color:#c2d4cb}
.schcell.isout .schevs{opacity:.45}
.schcell.istoday{background:#f4fbf7}
.schcell.issel{background:var(--brand-soft);box-shadow:inset 0 0 0 1.5px var(--brand);z-index:1}
.schcelltop{display:flex;align-items:center;justify-content:space-between;height:20px;flex:none}
.schdaynum{
  width:20px;height:20px;border-radius:50%;
  display:inline-flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--text);
}
.schcell.istoday .schdaynum,.schwkcol.istoday .schdaynum{background:var(--brand);color:#fff;font-weight:700}
.schcellmore{font-size:10px;color:var(--text-3);font-variant-numeric:tabular-nums}

.schevs{display:flex;flex-direction:column;gap:1px;min-width:0}
.schev{display:flex;align-items:center;gap:4px;min-width:0;font-size:10.5px;line-height:14px;color:var(--text-2)}
.schev i{width:3px;height:10px;border-radius:2px;background:var(--brand);flex:none}
.schev.due i{background:#e0a32e}
.schev b{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums;flex:none}
.schev span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.schev.done{opacity:.5}
.schev.done span{text-decoration:line-through}
/* 日程（日历里登记的）走静蓝，和任务的绿、截止的琥珀分开：
   同一格里两种东西一眼能分清，不用去读文字 */
.schev.ev i{background:#3f7fbf}

/* 周视图：7 列共用一张卡，发丝线分隔 */
.schweek{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));min-height:230px}
.schwkcol{
  border-right:1px solid var(--line);display:flex;flex-direction:column;
  cursor:pointer;transition:background .12s;min-width:0;
}
.schwkcol:last-child{border-right:0}
.schwkcol:hover{background:#f9fdfb}
.schwkcol.istoday{background:#f4fbf7}
.schwkcol.issel{background:var(--brand-soft);box-shadow:inset 0 0 0 1.5px var(--brand)}
.schwkhead{display:flex;align-items:center;justify-content:flex-start;gap:7px;padding:7px 9px 5px}
.schwkdow{font-size:11.5px;font-weight:600;color:var(--text-2)}
.schwkcol.issel .schwkdow{color:#0b6b4c}
.schwkhead .schdaynum{font-size:16px;font-weight:700;width:auto;height:auto}
.schwkcol.istoday .schdaynum{
  background:var(--brand);color:#fff;height:20px;padding:0 7px;border-radius:999px;
  display:inline-flex;align-items:center;font-size:13px;
}
.schwklist{display:flex;flex-direction:column;gap:4px;padding:0 7px 9px;min-width:0}
.schwkempty{color:#c8d9d1;font-size:11px;text-align:center;padding:8px 0}

.schitem{
  display:flex;align-items:center;gap:5px;min-width:0;
  background:#f6fbf8;border:1px solid transparent;border-radius:6px;
  padding:4px 6px;font-size:11.5px;cursor:pointer;
}
.schitem:hover{border-color:#cfe9dd;background:#fff}
.schitem .schtime{
  flex:none;font-size:10.5px;font-weight:700;color:#0b6b4c;font-variant-numeric:tabular-nums;
}
.schitem .schtime.due{color:#a97a12}
.schitem .schtime.ev{color:#2f6fb0}
.schitem .schtitle{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text);line-height:1.45}
.schitem .schdel{
  flex:none;border:0;background:transparent;color:#b9c9c1;font-size:13px;cursor:pointer;
  padding:0 1px;line-height:1;margin-left:auto;visibility:hidden;
}
.schitem:hover .schdel{visibility:visible}
.schitem .schdel:hover{color:var(--danger)}
.schitem.done{opacity:.55}
.schitem.done .schtitle{text-decoration:line-through}
.schitem.past{box-shadow:inset 2px 0 0 #e2b96f}

/* 下半区：当日完整清单 */
.schpanel{
  margin-top:14px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius);box-shadow:0 1px 2px rgba(16,48,42,.03);padding:12px 16px 6px;
}
.schpanelhead{display:flex;align-items:center;gap:10px;padding-bottom:9px;border-bottom:1px solid var(--line)}
.schpanelhead h3{margin:0;font-size:14.5px;font-weight:650;letter-spacing:-.01em;font-variant-numeric:tabular-nums}
.schdaycount{font-size:11.5px;color:var(--text-3);background:#f2f8f5;border-radius:999px;padding:2px 8px}
.schfocus{
  margin-left:auto;border:1px solid var(--line);background:var(--surface);border-radius:8px;
  font:inherit;font-size:12px;color:var(--text-2);padding:4px 10px;cursor:pointer;
}
.schfocus:hover{border-color:var(--brand);color:#0b6b4c;background:var(--brand-soft)}

.schrows{display:flex;flex-direction:column;max-height:min(420px,46vh);overflow:auto}
.schrow{
  display:grid;grid-template-columns:66px 3px minmax(0,1fr) auto;align-items:center;gap:12px;
  padding:9px 4px;border-bottom:1px solid #f0f7f3;cursor:pointer;border-radius:8px;
}
.schrow:last-child{border-bottom:0}
.schrow:hover{background:#f9fdfb}
.schrowtime{
  font-size:12.5px;font-weight:600;color:#0b6b4c;
  font-variant-numeric:tabular-nums;white-space:nowrap;
}
.schrowtime.due{color:#a97a12}
.schrowtime.ev{color:#2f6fb0}
.schrowmark{width:3px;height:20px;border-radius:2px;background:var(--brand)}
.schrowmark.due{background:#e0a32e}
.schrowmark.ev{background:#3f7fbf}
.schrowmain{min-width:0}
.schrowtitle{
  font-size:13.5px;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.schrowmeta{display:flex;align-items:center;gap:5px;margin-top:3px;flex-wrap:wrap}
.schrowkind{font-size:10.5px;color:var(--text-3)}
.schrowkind.ev{color:#2f6fb0}
.schrowact{display:flex;gap:4px;opacity:0;transition:opacity .12s}
.schrow:hover .schrowact,.schrow:focus-within .schrowact{opacity:1}
.schrowbtn{
  border:1px solid var(--line);background:var(--surface);border-radius:7px;
  font:inherit;font-size:11.5px;color:var(--text-2);padding:3px 9px;cursor:pointer;
}
.schrowbtn:hover{border-color:var(--brand);color:#0b6b4c}
.schrowbtn.danger:hover{border-color:#e9b3a9;color:var(--danger)}
.schrow.done .schrowtitle{text-decoration:line-through;color:var(--text-3)}
.schrow.done .schrowmark{background:#cfe0d8}
.schrow.past .schrowmark{background:#e2b96f}
.schrowempty{color:var(--text-3);font-size:12.5px;text-align:center;padding:26px 0 24px}

/* 触屏没有 hover，动作按钮常驻 */
@media (hover:none){
  .schrowact{opacity:1}
  .schitem .schdel{visibility:visible}
}

@media (max-width:1100px){
  .schweek{grid-template-columns:repeat(7,minmax(118px,1fr));overflow-x:auto}
  .schcell{height:60px}
}
@media (max-width:900px){
  .schtop{gap:8px;margin-bottom:10px}
  .schrange{font-size:16px}
  .schheadline{gap:10px}
  .schstepbtn{padding:4px 8px;font-size:12px}
  .schmode{padding:4px 12px}
  .schjump{font-size:12px;padding:3px 6px;height:28px}
  .schadd{padding:4px 6px 4px 11px}
  .schadd-input{font-size:13px}
  .schdowrow span{padding:7px 6px;font-size:11px}
  .schcell{height:56px;padding:5px 6px}
  /* 手机上一格只有 50 多像素宽，标题会被压成一两个字反而更乱；
     这里退成「色点」表示当天有安排，具体内容看下面的清单 */
  .schevs{flex-direction:row;flex-wrap:wrap;gap:3px;margin-top:1px}
  .schev{gap:0}
  .schev b,.schev span{display:none}
  .schev i{width:5px;height:5px;border-radius:50%}
  .schdaynum{width:19px;height:19px;font-size:11.5px}
  .schpanel{margin-top:12px;padding:10px 12px 4px}
  .schrow{grid-template-columns:56px 3px minmax(0,1fr);gap:9px;padding:8px 2px}
  .schrowact{grid-column:2 / -1;justify-content:flex-end;opacity:1;padding-top:2px}
  .schrowmeta{margin-top:2px}
}

/* ---------- 知识库（对齐设计稿：左主列 + 右侧栏） ---------- */
.kbgrid{display:grid;grid-template-columns:minmax(0,1fr) 300px;gap:14px;align-items:start}
.kbmain,.kbside{display:flex;flex-direction:column;gap:8px;min-width:0}
@media (max-width:1100px){
  .kbgrid{grid-template-columns:minmax(0,1fr)}
}

.group-title .count{color:var(--text-3);font-weight:400;font-size:11.5px}
.group-title::after{content:"";flex:1;height:1px;background:var(--line)}

/* 候选卡：结论 + 置信度 + 来源 + 建议 + 两个动作 */
.cand{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:13px 15px 12px;box-shadow:var(--shadow);
}
.cand-top{display:flex;align-items:center;gap:8px;margin-bottom:7px}
.cand-top .src{font-size:10.5px;color:var(--text-3);margin-left:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cand-claim{margin:0;font-size:13px;line-height:1.66;color:var(--text)}
.suggest{
  font-size:11px;color:#0b6b4c;background:var(--brand-soft);
  border-radius:6px;padding:3px 8px;display:inline-block;margin-top:8px;
}

/* 置信度圆点 */
.conf{display:inline-flex;align-items:center;gap:4px;font-size:11px;color:var(--text-2);white-space:nowrap}
.conf i{width:5px;height:5px;border-radius:50%;background:var(--brand)}
.conf.mid i{background:#f0b45c}
.conf.low i{background:#e08a7a}

/* 最新知识：卡片内一行一条，分隔线 */
.cardlist{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:2px 16px;box-shadow:var(--shadow);
}
.kbgrid .kbitem{background:transparent;border:none;border-radius:0;box-shadow:none;padding:13px 0;border-bottom:1px solid var(--line)}
.kbgrid .kbitem:last-child{border-bottom:none}
.kbgrid .kbclaim{font-weight:500;font-size:12.8px;line-height:1.66;margin:6px 0 0}
.kbgrid .kbmeta{margin-top:6px}
.k-top{display:flex;align-items:center;gap:8px}
.k-uses{margin-left:auto;font-size:11px;color:var(--text-3);white-space:nowrap}

/* 右侧栏卡片 */
.kbcard{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);
  padding:13px 15px 14px;box-shadow:var(--shadow);
}
.kbcard h3{margin:0 0 10px;font-size:12.5px;color:var(--text-2);font-weight:600}
.kbignum{display:flex;align-items:baseline;gap:6px;font-size:24px;font-weight:650;letter-spacing:-.02em}
.kbignum small{font-size:12px;color:var(--text-3);font-weight:400;white-space:nowrap}
.sync-meter{height:5px;border-radius:999px;background:#eef2ef;overflow:hidden;margin-top:10px}
.sync-meter i{display:block;height:100%;background:var(--brand);border-radius:999px}
.sync-txt{display:flex;justify-content:space-between;font-size:11px;color:var(--text-3);margin-top:6px}
.kbpending-tip{
  margin-top:10px;padding:7px 9px;border-radius:8px;background:#fdf6e8;color:#8a5a06;
  font-size:11.5px;line-height:1.5;
}
.topic{display:flex;flex-direction:column;gap:2px;padding:7px 0;border-bottom:1px dashed var(--line)}
.topic:last-child{border-bottom:none}
.topic .tn{font-size:12.5px;font-weight:600;display:flex;align-items:center;gap:6px}
.topic .cnt{font-size:10.5px;color:#0b6b4c;background:var(--brand-soft);border-radius:999px;padding:0 6px}
.kbnote{display:flex;align-items:center;gap:8px;padding:7px 0;border-bottom:1px dashed var(--line);font-size:12px;color:var(--text-2)}
.kbnote:last-child{border-bottom:none}
.kbnote span{margin-left:auto;white-space:nowrap}
.kbmini{font-size:12px;color:var(--text-3);line-height:1.6;padding:6px 2px}

/* 知识库的分区标题要能立住：它是左主列里唯一的层级分隔 */
.kbmain .group-title{
  font-size:13px;font-weight:650;color:var(--text);letter-spacing:0;
  padding:0 0 10px;margin:2px 0 10px;border-bottom:1px solid var(--line);
}
.kbmain .group-title .count{font-weight:400;color:var(--text-3);font-size:11.5px;margin-left:2px}
.kbmain .group-title::after{display:none}
.kbmain .group-title:nth-of-type(2){margin-top:22px}
/* 空态用虚线框，别让一句话孤零零浮在页面中间 */
.kbmain .kbmini{
  border:1px dashed #cfe8dc;border-radius:12px;background:#fbfefc;
  padding:22px 18px;text-align:center;margin-bottom:4px;
}

/* chips 上的计数复用 .cnt，warn 变体给「待确认」 */
.kbtab .cnt.warn{background:#fdf3e2;color:var(--warn)}

/* 顶栏搜索在窄屏独占一行。
   必须放在文件末尾：.searchwrap 的基础样式在本文件靠后，写在前面会被它盖掉 */
@media (max-width:900px){
  .topbar .searchwrap{flex:1 1 100%;max-width:none;margin-left:0;order:3}
  .topbar{row-gap:8px}
}

/* ---------- 顶栏在中等宽度下逐级让位 ----------
   必须放在文件末：.lastsync / .pill 的基础声明在后面，写在前面会被盖掉。
   顺序按重要性：同步时间 > 模拟离线开关 > 待推送数字 */
@media (max-width:1400px){
  .lastsync{display:none}
}
@media (max-width:1240px){
  .syncbar .switch{display:none}
  .syncbar{gap:8px}
}
@media (max-width:1080px){
  .syncbar .pill.muted{display:none}
  .topbar{padding:10px 16px;gap:12px}
}

/* ---------- 设置页 ----------
   只读状态 + 维护动作。行式布局（标签左、值右）比卡片堆更省竖向空间，
   长路径、模型名这类内容会换行，所以值用 word-break 而不是省略号 ——
   这里的信息是给人核对的，截断等于没写 */
.setgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;align-items:start}
.setcard.span2{grid-column:1/-1}
.setrows{padding:0 16px 14px}
.setrow{display:flex;align-items:baseline;gap:12px;padding:7px 0;border-bottom:1px dashed #eef4f1;font-size:12.5px;line-height:1.55}
.setrow:last-child{border-bottom:0;padding-bottom:0}
.setk{color:var(--text-3);flex:0 0 auto}
.setv{margin-left:auto;text-align:right;color:var(--text);word-break:break-word;font-variant-numeric:tabular-nums}
.setv.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;color:var(--text-2)}
.setv.ok{color:#0b6b4c}
.setv.warn{color:var(--warn)}
.setv.bad{color:var(--danger)}
.setdot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--brand);margin-right:5px;vertical-align:1px}

.setprov{display:flex;align-items:center;gap:9px;padding:8px 0;border-bottom:1px dashed #eef4f1;font-size:12.5px}
.setprov:last-of-type{border-bottom:0}
.setprov .pname{font-weight:600;color:var(--text);min-width:104px}
.setprov .pmodel{flex:1 1 auto;min-width:0;color:var(--text-3);font-size:11.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.setprov .pmeta{flex:0 0 auto;color:var(--text-3);font-size:11px;font-variant-numeric:tabular-nums;white-space:nowrap}
.setbadge{flex:0 0 auto;font-size:10.5px;font-weight:600;padding:2px 8px;border-radius:999px;white-space:nowrap}
.setbadge.ok{background:var(--brand-soft);color:#0b6b4c}
.setbadge.off{background:#f1f5f3;color:var(--text-3)}
.setbadge.bad{background:#fdf3e2;color:var(--warn)}
/* 未就绪的原因单独一行缩进，别挤在模型名后面把行撑乱 */
.setwhy{padding:0 0 8px 113px;font-size:11px;color:var(--warn);line-height:1.5}

.setchains{padding:0 16px 14px}
.setchainhead{margin:0 0 6px}
.setchain{display:flex;gap:8px;font-size:11.5px;color:var(--text-3);padding:3px 0;line-height:1.5}
.setchain b{flex:0 0 88px;color:var(--text-2);font-weight:600}

.setacts{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:0 16px 12px}
.setnote{margin:0;padding:0 16px 14px}
.setnote code{
  font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  font-size:11px;background:#f4f8f6;border-radius:4px;padding:1px 5px;color:var(--text-2);
}
@media (max-width:900px){
  .setgrid{grid-template-columns:minmax(0,1fr)}
  .setcard.span2{grid-column:auto}
  .setprov{flex-wrap:wrap}
  .setprov .pmodel{flex:1 1 100%;order:4;white-space:normal}
  .setwhy{padding-left:0}
}

/* ---------- 设置页：模型配置 ----------
   密钥与模型分成两段：同一个环境变量常被多个模型共用（硅基流动的文本 + 视觉），
   按供应商重复填两遍 Key 是最容易被吐槽的设计，所以按变量分组只填一次 */
.llmform{padding:0 16px 4px}
.llmsec{
  display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  margin:16px 0 2px;font-size:11px;font-weight:600;letter-spacing:.09em;color:var(--text-3);
}
.llmsec:first-child{margin-top:2px}
.llmrow{padding:10px 0;border-bottom:1px dashed #eef4f1}
.llmrow:last-child{border-bottom:0;padding-bottom:2px}
.llmhead{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.llmhead b{font-size:12.5px;color:var(--text);font-weight:600}
.llmmeta{
  font-size:11px;color:var(--text-3);min-width:0;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.llmgrid{
  display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1.35fr) auto;
  gap:10px;align-items:end;margin-top:7px;
}
.llmgrid.keygrid{grid-template-columns:minmax(0,1fr) auto}
.llmgrid .field>span{font-size:11px;color:var(--text-3)}
.llmgrid .field input{padding:7px 10px;font-size:12.5px;background:#fbfefc}
.llmgrid .minibtn{margin-bottom:1px}
.llmmsg{margin-top:5px;font-size:11px;line-height:1.5}
.llmmsg.ok{color:#0b6b4c}
.llmmsg.bad{color:var(--danger)}
.llmmsg.warn{color:var(--warn)}

/* 分级策略被放宽的提示条：不摆在这里就等于悄悄改了口径 */
.llmpolicy{
  margin:12px 0 2px;padding:8px 11px;border-radius:7px;
  background:#fffaf0;border:1px solid #f2e2c2;
  font-size:11px;line-height:1.65;color:#96601a;
}
.llmpolicy code{
  padding:1px 4px;border-radius:4px;background:#f7ecd7;
  font-size:10.5px;color:#8a5716;
}

/* 预留供应商：没有任何任务链引用它们，收起成一行，别在真在跑的模型里冒充必填项 */
.llmreserve{margin-top:16px;border-top:1px solid #eef4f1}
.llmreserve>summary{
  display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
  margin-top:11px;font-size:11.5px;color:var(--text-3);
  cursor:pointer;list-style:none;user-select:none;
}
.llmreserve>summary::-webkit-details-marker{display:none}
.llmreserve>summary::before{
  content:"▸";display:inline-block;font-size:10px;color:var(--text-3);
  transform:translateY(-1px);transition:transform .15s;
}
.llmreserve[open]>summary::before{transform:translateY(-1px) rotate(90deg)}
.llmreserve>summary>span:first-of-type{font-weight:600;color:var(--text-2)}
.llmreserve>summary:hover>span:first-of-type{color:var(--text)}
.llmreservebody{
  margin-top:7px;padding:2px 0 0 14px;border-left:2px solid #f0f5f2;
}
.llmreservebody>.hintline{margin:2px 0 6px;line-height:1.6}
.llmreservebody code{
  padding:1px 4px;border-radius:4px;background:#f2f7f4;
  font-size:10.5px;color:var(--text-2);
}
.llmform+.setacts{padding-top:12px}

/* ---------- 设置页：通知 ---------- */
.notifybody{padding-top:2px}
.chanpick{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:0 16px}
.chan{
  display:flex;flex-direction:column;align-items:flex-start;gap:3px;
  padding:10px 12px;border:1px solid var(--line);border-radius:11px;
  background:#fbfefc;font:inherit;text-align:left;cursor:pointer;
  transition:border-color .15s,background .15s,box-shadow .15s;
}
.chan b{font-size:12.5px;color:var(--text)}
.chan span{font-size:11px;color:var(--text-3);line-height:1.4}
.chan:hover{border-color:var(--brand-bright);background:#fff}
.chan.on{border-color:var(--brand);background:var(--brand-soft);box-shadow:0 0 0 3px rgba(52,211,153,.12)}
.chan.on b{color:#0b6b4c}
.notifytoken{margin:14px 16px 0}
.notifybody .field>span{font-size:12px;color:var(--text-2)}
.notifyrow{
  display:grid;grid-template-columns:190px minmax(0,1fr);gap:16px;
  align-items:start;margin:14px 16px 0;
}
.notifier-time input{padding:7px 10px;font-size:12.5px}
.chks{display:flex;flex-direction:column;gap:7px;padding-top:2px}
.chk{display:flex;align-items:flex-start;gap:8px;font-size:12.5px;color:var(--text-2);line-height:1.5;cursor:pointer}
.chk input{margin:2px 0 0;accent-color:var(--brand);flex:0 0 auto}
.notifyacts{padding:16px 16px 6px}
.switchrow{display:inline-flex;align-items:center;gap:7px;font-size:12.5px;font-weight:600;color:var(--text);cursor:pointer}
.switchrow input{width:15px;height:15px;accent-color:var(--brand)}
.notifybody .setnote{padding-top:6px}

@media (max-width:900px){
  .llmgrid,.llmgrid.keygrid{grid-template-columns:minmax(0,1fr)}
  .llmgrid .minibtn{justify-self:start}
  .chanpick{grid-template-columns:minmax(0,1fr)}
  .notifyrow{grid-template-columns:minmax(0,1fr);gap:10px}
  .llmmeta{white-space:normal}
}

/* ---------- 宽屏加宽 ----------
   .wrap 上限抬到 1760 后，中间那列会跟着变宽，原来定死的右侧栏（306/300）
   相对就显得窄，知识卡也会被拉成宽条。这里按视口宽度把右栏和卡片列数一起放大。
   必须放文件末尾：要覆盖前面 .cols / .drop-grid / .kbgrid / .todaycols / .notes
   的同名声明，写在前面会被它们盖掉 */
@media (min-width:1440px){
  .cols,.todaycols{grid-template-columns:minmax(0,1fr) 340px}
  .drop-grid,.kbgrid{grid-template-columns:minmax(0,1fr) 340px}
}
@media (min-width:1680px){
  .notes{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media (min-width:2100px){
  .notes{grid-template-columns:repeat(5,minmax(0,1fr))}
}
/* 经营分析的 6 个 KPI 原本是 3 列两行；铺满后每列能到 700 多，卡片里只有
   一个数字，空得很。宽屏改成一行 6 个，宽度回到 200~300 的正常密度 */
@media (min-width:1800px){
  .rp-kpis.cols3{grid-template-columns:repeat(6,minmax(0,1fr))}
}
