/* ==========================================================================
   yd-task-system 主题体系（参考 D14 双主题方案）
   - 通过 <html data-theme="dark|light"> 切换
   - 颜色用 RGB 三元组 + rgb(var(--c-xxx) / <alpha>) 模式，方便透明度
   ========================================================================== */

:root, html[data-theme="dark"] {
  --c-bg:        11  16  32;          /* 页面 #0b1020 */
  --c-bg-2:      19  26  46;          /* 卡片表面 #131a2e */
  --c-bg-3:      28  37  64;          /* 凹陷 #1c2540 */
  --c-brand:     59  130  246;        /* blue-500 悦达品牌色 */
  --c-brand-dark:37  99  235;
  --c-brand-soft:147 197  253;
  --c-accent:    34  211  238;        /* cyan-400 */
  --c-ok:        52  211  153;
  --c-warn:      251 191 36;
  --c-err:       248 113 113;
  --c-line:      35  43  68;
  --c-text:      229 231 235;
  --c-text-mute: 156 163 175;
  --c-text-deep: 255 255 255;
  /* 任务状态语义色（全站唯一口径：待办灰 / 进行中橙 / 待验收蓝 / 已通过绿 / 逾期·停滞红） */
  --c-st-open:   156 163 175;
  --c-st-doing:  251 191 36;
  --c-st-review: 96  165 250;
  --c-st-ok:     52  211 153;
  --c-st-stop:   248 113 113;
  /* 圆角 / 字号档位：新写的样式用这些，不要再发明新值 */
  --r-sm: 6px; --r-md: 8px; --r-lg: 10px; --r-xl: 14px; --r-pill: 999px;
  --fs-xs: 11px; --fs-sm: 12px; --fs-md: 13px; --fs-base: 14px; --fs-lg: 15px; --fs-xl: 18px;
  --bg-grad: radial-gradient(1200px 600px at 10% -10%, rgba(59,130,246,.10), transparent 60%),
             radial-gradient(900px 500px at 110% 0%, rgba(34,211,238,.06), transparent 60%);
  color-scheme: dark;
}

html[data-theme="light"] {
  --c-bg:        250 250 247;         /* #FAFAF7 */
  --c-bg-2:      255 255 255;
  --c-bg-3:      241 240 235;         /* #F1F0EB */
  --c-brand:     37  99  235;         /* blue-600 */
  --c-brand-dark:29  78  216;
  --c-brand-soft:59  130  246;
  --c-accent:    45  90  239;
  --c-ok:        22  163  74;
  --c-warn:      202 138  4;
  --c-err:       220  38  38;
  --c-line:      229 231 235;
  --c-text:      17  24  39;
  --c-text-mute: 107 114 128;
  --c-text-deep: 0   0   0;
  --c-st-open:   107 114 128;
  --c-st-doing:  217 119 6;
  --c-st-review: 37  99  235;
  --c-st-ok:     22  163 74;
  --c-st-stop:   220 38  38;
  --bg-grad: radial-gradient(1200px 700px at 15% 5%, rgba(37,99,239,0.05), transparent 60%),
             radial-gradient(900px 600px at 90% 15%, rgba(34,211,238,0.03), transparent 55%);
  color-scheme: light;
}

* { box-sizing: border-box; margin: 0; padding: 0; }
html, body {
  background: var(--bg-grad), rgb(var(--c-bg));
  color: rgb(var(--c-text));
  font-family: Inter, -apple-system, "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif;
  min-height: 100vh;
  transition: background-color .25s ease, color .25s ease;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

[x-cloak] { display: none !important; }
button { font-family: inherit; transition: all .15s ease; }
input, textarea, select { font-family: inherit; color: inherit; }

/* ── 顶部导航 ───────────────────────────────── */
.app-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 28px;
  background: rgb(var(--c-bg-2) / .85);
  backdrop-filter: blur(10px);
  border-bottom: 1px solid rgb(var(--c-line));
  position: sticky; top: 0; z-index: 100;
}
.brand { display: flex; align-items: center; gap: 10px; }
.brand-text { display: flex; flex-direction: column; gap: 2px; line-height: 1.1; }
.brand-title {
  font-size: 20px; font-weight: 700; letter-spacing: -.3px;
  color: rgb(var(--c-text));
}
.brand-sub {
  font-size: 11px; color: rgb(var(--c-text-mute));
  letter-spacing: 1.5px; text-transform: uppercase;
}
.brand-dot {
  width: 8px; height: 8px; border-radius: 50%;
  background: rgb(var(--c-brand));
  box-shadow: 0 0 12px rgb(var(--c-brand) / .5);
}

.nav-tabs { display: flex; gap: 4px; }
.nav-tab {
  padding: 8px 14px;
  border-radius: 8px;
  border: none;
  background: transparent;
  color: rgb(var(--c-text-mute));
  font-size: 14px; font-weight: 500;
  cursor: pointer;
  display: inline-flex; align-items: center; gap: 6px;
}
.nav-tab:hover { background: rgb(var(--c-bg-3)); color: rgb(var(--c-text)); }
.nav-tab.active {
  background: rgb(var(--c-brand) / .15);
  color: rgb(var(--c-brand-soft));
}
html[data-theme="light"] .nav-tab.active {
  background: rgb(var(--c-brand) / .12);
  color: rgb(var(--c-brand));
}

.user-info { display: flex; align-items: center; gap: 10px; }

/* 头像按钮（圆 + 首字） */
.avatar-wrap { position: relative; }

/* 头像 + 名字 + 层级 一整块（顶部直接显示） */
.avatar-block {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 3px 10px 3px 3px;
  border: 1px solid transparent;
  border-radius: 999px;
  background: transparent;
  cursor: pointer;
  transition: background .12s ease, border-color .12s ease;
}
.avatar-block:hover { background: rgba(15,23,42,.04); border-color: rgba(15,23,42,.06); }

.avatar-btn {
  width: 32px; height: 32px;
  border-radius: 50%;
  border: none;
  background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
  color: #fff;
  font-size: 14px; font-weight: 600;
  display: inline-flex; align-items: center; justify-content: center;
  box-shadow: 0 2px 6px rgba(59,130,246,.3);
  flex-shrink: 0;
}
.avatar-letter { line-height: 1; }

.avatar-info {
  display: flex; flex-direction: row; align-items: center; gap: 6px;
  line-height: 1.1;
}
.avatar-name {
  font-size: 13px; font-weight: 600;
  color: rgb(var(--c-text));
  white-space: nowrap;
}
.avatar-caret {
  margin-left: 2px;
  font-size: 10px;
  color: rgb(var(--c-text-mute));
}

/* 头像下拉菜单 */
.user-menu {
  position: absolute;
  top: calc(100% + 8px); right: 0;
  min-width: 220px;
  background: #fff;
  border: 1px solid rgba(15,23,42,.08);
  border-radius: 10px;
  box-shadow: 0 12px 40px rgba(15,23,42,.12);
  z-index: 1000;
  overflow: hidden;
}
.user-menu-head {
  padding: 12px 14px;
  background: rgba(15,23,42,.02);
  border-bottom: 1px solid rgba(15,23,42,.06);
}
.user-menu-name {
  font-size: 14px; font-weight: 600;
  color: rgb(var(--c-text));
  margin-bottom: 6px;
}
.user-menu-meta { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.user-menu-item {
  width: 100%;
  display: flex; align-items: center; gap: 8px;
  padding: 9px 14px;
  border: none; background: transparent;
  text-align: left;
  font-size: 13px;
  color: rgb(var(--c-text));
  cursor: pointer;
  transition: background .1s ease;
}
.user-menu-item:hover { background: rgba(15,23,42,.04); }
.user-menu-item.danger { color: rgb(var(--c-err)); }
.user-menu-item.danger:hover { background: rgb(var(--c-err) / .08); }
.user-menu-divider {
  height: 1px;
  background: rgba(15,23,42,.06);
  margin: 4px 0;
}

/* 层级 chip（蓝色） */
.user-level {
  font-size: 11px;
  padding: 1px 6px;
  border-radius: 4px;
  background: rgb(var(--c-brand) / .12);
  color: rgb(var(--c-brand));
  font-weight: 500;
}

/* 通知按钮（铃铛 + 红点） */
.btn-bell {
  position: relative;
  font-size: 16px;
}
.bell-dot {
  position: absolute;
  top: 2px; right: 2px;
  min-width: 16px; height: 16px;
  padding: 0 4px;
  background: #ef4444;
  color: #fff;
  border-radius: 8px;
  font-size: 10px;
  font-weight: 600;
  display: inline-flex; align-items: center; justify-content: center;
}
.role-badge {
  display: inline-flex; align-items: center;
  padding: 3px 10px; border-radius: 999px;
  font-size: 11px; font-weight: 600;
  white-space: nowrap;
  background: rgb(var(--c-brand) / .14);
  color: rgb(var(--c-brand-soft));
  border: 1px solid rgb(var(--c-brand) / .35);
}
html[data-theme="light"] .role-badge { color: rgb(var(--c-brand)); }
.role-admin        { background: rgb(var(--c-err) / .14);   color: rgb(var(--c-err));   border-color: rgb(var(--c-err) / .35); }
.role-supervisor   { background: rgb(var(--c-warn) / .14);  color: rgb(var(--c-warn));  border-color: rgb(var(--c-warn) / .35); }
.role-leader       { background: rgb(var(--c-brand) / .14); color: rgb(var(--c-brand-soft)); border-color: rgb(var(--c-brand) / .35); }
.role-product_lead { background: rgb(var(--c-accent) / .14); color: rgb(var(--c-accent)); border-color: rgb(var(--c-accent) / .35); }
.role-member       { background: rgb(var(--c-text-mute) / .14); color: rgb(var(--c-text-mute)); border-color: rgb(var(--c-text-mute) / .3); }

/* 层级徽章（用户基础信息） */
.level-badge {
  display: inline-flex; align-items: center;
  padding: 2px 8px; border-radius: 6px;
  font-size: 11px; font-weight: 600;
  font-family: ui-monospace, "JetBrains Mono", monospace;
  background: rgb(var(--c-brand) / .14);
  color: rgb(var(--c-brand-soft));
  border: 1px solid rgb(var(--c-brand) / .35);
}
html[data-theme="light"] .level-badge { color: rgb(var(--c-brand)); }
.level-L1 { background: rgb(var(--c-text-mute) / .14); color: rgb(var(--c-text-mute)); border-color: rgb(var(--c-text-mute) / .3); }
.level-L2 { background: rgb(var(--c-accent) / .14); color: rgb(var(--c-accent)); border-color: rgb(var(--c-accent) / .35); }
.level-L3 { background: rgb(var(--c-brand) / .14); color: rgb(var(--c-brand-soft)); border-color: rgb(var(--c-brand) / .35); }
.level-L4 { background: rgb(var(--c-warn) / .14); color: rgb(var(--c-warn)); border-color: rgb(var(--c-warn) / .35); }
.level-L5 { background: rgb(var(--c-err) / .14); color: rgb(var(--c-err)); border-color: rgb(var(--c-err) / .35); }

.btn-icon, .btn-logout {
  border: 1px solid rgb(var(--c-line));
  background: transparent;
  color: rgb(var(--c-text-mute));
  padding: 6px 12px; border-radius: 8px;
  cursor: pointer; font-size: 13px;
  display: inline-flex; align-items: center; gap: 4px;
}
.btn-icon:hover, .btn-logout:hover {
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
}
.btn-logout:hover { color: rgb(var(--c-err)); border-color: rgb(var(--c-err) / .3); }

/* 按钮内 SVG 图标（顶部三图标的退出按钮用） */
.btn-icon .icon-svg, .btn-logout .icon-svg {
  display: block;
  width: 16px; height: 16px;
  flex: 0 0 auto;
}
.btn-logout { color: rgb(var(--c-text-mute)); }

/* user-menu 里的 SVG 图标 */
.user-menu-item .menu-icon {
  display: block;
  width: 16px; height: 16px;
  flex: 0 0 auto;
  color: rgb(var(--c-text-mute));
}
.user-menu-item:hover .menu-icon { color: rgb(var(--c-text)); }
.user-menu-item.danger .menu-icon { color: rgb(var(--c-err)); }

/* ── 卡片 ───────────────────────────────────── */
.card {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  padding: 18px;
  box-shadow: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
}
html[data-theme="dark"] .card {
  box-shadow: 0 1px 3px rgba(0,0,0,.20), 0 1px 2px rgba(0,0,0,.24);
}
html[data-theme="light"] .card {
  border-radius: 18px;
  box-shadow: 0 1px 2px rgba(10,10,10,.04), 0 18px 40px -20px rgba(10,10,10,.08);
}

/* 页头图标：和左侧导航同一个线条图标（v288 起不再用 emoji） */
.title-ico { width: 18px; height: 18px; flex: none; color: rgb(var(--c-brand)); }
.as-head-ops { display: flex; align-items: center; gap: 8px; }
.card-title {
  font-size: 14px; font-weight: 600;
  color: rgb(var(--c-text));
  margin-bottom: 14px;
  display: flex; align-items: center; gap: 6px;
}

/* ── 主布局 ─────────────────────────────────── */
.main-grid {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 20px;
  padding: 24px 28px;
  max-width: 1600px;
  margin: 0 auto;
}
@media (max-width: 1024px) {
  .main-grid { grid-template-columns: 1fr; padding: 16px; }
}

/* ── 看板双栏 ──────────────────────────────── */
/* Kanban 5 列布局（按状态分列） */
.kanban-5col {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 12px;
}
@media (max-width: 1280px) { .kanban-5col { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 768px)  { .kanban-5col { grid-template-columns: 1fr; } }
.kanban-col {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  padding: 12px 14px;
  min-height: 400px;
  display: flex; flex-direction: column;
}
.kanban-col .col-body {
  flex: 1;
  overflow-y: auto;
  max-height: calc(100vh - 260px);
  padding-right: 4px;
}
.kanban-col .col-empty {
  text-align: center; color: rgb(var(--c-text-mute));
  font-size: 12px; padding: 30px 10px;
}
.kanban-col .col-count {
  display: inline-flex;
  align-items: center; justify-content: center;
  min-width: 22px; height: 18px;
  padding: 0 6px;
  border-radius: 9px;
  background: rgb(var(--c-bg-3));
  font-size: 11px; font-weight: 600;
  color: rgb(var(--c-text-mute));
}
.kanban-col .col-title { font-size: 14px; font-weight: 600; display: flex; align-items: center; gap: 6px; }
.kanban-col .col-header {
  display: flex; align-items: center; justify-content: space-between;
  padding-bottom: 8px; margin-bottom: 8px;
  border-bottom: 1px solid rgb(var(--c-line));
}
/* 列主题色（header 左侧细条） */
.kanban-col.col-open      { border-top: 3px solid rgb(var(--c-brand)); }
.kanban-col.col-doing     { border-top: 3px solid rgb(var(--c-warn)); }
.kanban-col.col-done      { border-top: 3px solid rgb(var(--c-accent)); }
.kanban-col.col-approved  { border-top: 3px solid rgb(var(--c-ok)); }
.kanban-col.col-rejected  { border-top: 3px solid rgb(var(--c-err)); }

/* 任务卡：逾期高亮 + 紧凑 */
.tk-card {
  background: rgb(var(--c-bg-3));
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  padding: 10px 12px;
  margin-bottom: 8px;
  cursor: pointer;
  transition: all .15s ease;
  position: relative;
}
.tk-card:hover { border-color: rgb(var(--c-brand) / .5); transform: translateY(-1px); }
.tk-card.tk-overdue { border-left: 3px solid rgb(var(--c-err)); }
.tk-card.tk-approved { opacity: .65; }
.tk-card.tk-rejected { border-left: 3px solid rgb(var(--c-err)); background: rgb(var(--c-err) / .04); }
.tk-title { font-size: 13px; font-weight: 500; line-height: 1.4; margin-bottom: 4px; }
.tk-meta { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 6px; align-items: center; font-size: 11px; color: rgb(var(--c-text-mute)); }
.tk-pri { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 10px; font-weight: 700; }
.tk-pri.pri-p1 { background: rgb(var(--c-err) / .15); color: rgb(var(--c-err)); }
.tk-pri.pri-p2 { background: rgb(var(--c-warn) / .15); color: rgb(var(--c-warn)); }
.tk-pri.pri-p3 { background: rgb(var(--c-text-mute) / .15); color: rgb(var(--c-text-mute)); }
.tk-cat { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 10px; background: rgb(var(--c-brand) / .1); color: rgb(var(--c-brand-soft)); border: 1px solid rgb(var(--c-brand) / .2); }
html[data-theme="light"] .tk-cat { color: rgb(var(--c-brand)); }
.tk-link {
  display: inline-flex; align-items: center; gap: 3px;
  font-size: 10px; color: rgb(var(--c-accent));
  text-decoration: none;
}
.tk-link:hover { text-decoration: underline; }
.tk-overdue-tag {
  display: inline-block; padding: 1px 5px; border-radius: 3px;
  background: rgb(var(--c-err)); color: #fff;
  font-size: 10px; font-weight: 600;
}
.col-header {
  display: flex; align-items: center; justify-content: space-between;
  margin-bottom: 14px; padding-bottom: 10px;
  border-bottom: 1px solid rgb(var(--c-line));
}
.col-title {
  font-size: 15px; font-weight: 600;
  display: flex; align-items: center; gap: 6px;
}
.col-count {
  font-size: 12px; color: rgb(var(--c-text-mute)); font-weight: 400;
  margin-left: 4px;
}

/* ── 任务卡 ─────────────────────────────────── */
.tk-card {
  background: rgb(var(--c-bg-3));
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 10px;
  cursor: pointer;
  transition: all .15s ease;
}
.tk-card:hover { border-color: rgb(var(--c-brand) / .5); transform: translateY(-1px); }
.tk-card.tk-approved { opacity: .7; }
.tk-title { font-size: 14px; font-weight: 500; margin-bottom: 4px; line-height: 1.4; }
.tk-desc {
  font-size: 12px; color: rgb(var(--c-text-mute));
  margin-bottom: 8px; line-height: 1.5;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.tk-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.tk-row-top { display: flex; align-items: flex-start; gap: 10px; }

/* ── chips ──────────────────────────────────── */
.chip {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 8px; border-radius: 999px;
  font-size: 11px; line-height: 18px;
  border: 1px solid transparent;
}
.chip-p1 { background: rgb(var(--c-err) / .15); color: rgb(var(--c-err)); border-color: rgb(var(--c-err) / .35); }
.chip-p2 { background: rgb(var(--c-warn) / .15); color: rgb(var(--c-warn)); border-color: rgb(var(--c-warn) / .35); }
.chip-p3 { background: rgb(var(--c-text-mute) / .15); color: rgb(var(--c-text-mute)); border-color: rgb(var(--c-text-mute) / .35); }
.chip-user, .chip-product, .chip-date {
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text-mute));
  border-color: rgb(var(--c-line));
}
.chip-daily { background: rgb(var(--c-accent) / .14); color: rgb(var(--c-accent)); border-color: rgb(var(--c-accent) / .35); }
.chip-main { background: rgb(var(--c-brand) / .14); color: rgb(var(--c-brand-soft)); border-color: rgb(var(--c-brand) / .35); }

/* ── 状态徽章 ───────────────────────────────── */
.tag {
  display: inline-block;
  padding: 2px 8px; border-radius: 999px;
  font-size: 11px; font-weight: 600;
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text-mute));
}
.tag-open { background: rgb(var(--c-st-open) / .14); color: rgb(var(--c-st-open)); }
.tag-doing { background: rgb(var(--c-st-doing) / .15); color: rgb(var(--c-st-doing)); }
.tag-done { background: rgb(var(--c-st-review) / .12); color: rgb(var(--c-st-review)); }
.tag-approved { background: rgb(var(--c-st-ok) / .14); color: rgb(var(--c-st-ok)); }
.tag-rejected, .tag-pending { background: rgb(var(--c-st-stop) / .12); color: rgb(var(--c-st-stop)); }

/* ── 按钮 ───────────────────────────────────── */
.btn-primary {
  background: linear-gradient(180deg, rgb(var(--c-brand)), rgb(var(--c-brand-dark)));
  color: #fff; font-weight: 600;
  border-radius: 10px;
  padding: 10px 18px;
  border: none;
  cursor: pointer;
  font-size: 14px;
  box-shadow: 0 1px 3px rgb(var(--c-brand-dark) / .35);
}
.btn-primary:hover { filter: brightness(1.1); }
.btn-primary:disabled { opacity: .5; cursor: not-allowed; }

.btn-secondary {
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  padding: 10px 18px;
  cursor: pointer;
  font-size: 14px;
}
.btn-secondary:hover { background: rgb(var(--c-line) / .5); }

.btn-ghost {
  background: transparent;
  border: 1px solid rgb(var(--c-line));
  color: rgb(var(--c-text-mute));
  border-radius: 10px;
  padding: 8px 14px;
  cursor: pointer;
  font-size: 13px;
}
.btn-ghost:hover { color: rgb(var(--c-text)); border-color: rgb(var(--c-text-mute)); }

/* 危险 / 成功按钮（全站三档，别再内联 background 覆盖 btn-primary）：
   - 列表行里的删除：.as-btn.pr-danger（小号描边红字，见 assets.css）
   - 弹窗底部的「删除」：.btn-danger-ghost（和「取消」同尺寸，红字描边）
   - 破坏性操作的最终确认（打回 / 拒绝 / 停滞 / 确认删除）：.btn-danger（实心红）
   - 「同意 / 通过」：.btn-ok（实心绿） */
.btn-danger, .btn-ok {
  color: #fff; font-weight: 600;
  border-radius: 10px; padding: 10px 18px; border: none;
  cursor: pointer; font-size: 14px;
}
.btn-danger { background: rgb(var(--c-err)); box-shadow: 0 1px 3px rgb(var(--c-err) / .35); }
.btn-ok { background: rgb(var(--c-ok)); box-shadow: 0 1px 3px rgb(var(--c-ok) / .35); }
.btn-danger:hover, .btn-ok:hover { filter: brightness(1.08); }
.btn-danger:disabled, .btn-ok:disabled { opacity: .5; cursor: not-allowed; }
.btn-danger-ghost {
  background: transparent; color: rgb(var(--c-err));
  border: 1px solid rgb(var(--c-err) / .35);
  border-radius: 10px; padding: 10px 18px; cursor: pointer; font-size: 14px;
}
.btn-danger-ghost:hover { background: rgb(var(--c-err) / .06); }
.btn-sm { padding: 6px 12px !important; font-size: 13px !important; border-radius: 8px !important; }

/* 必填星号 / 状态文字 / 红色提示条 —— 替代散落各处的 style="color:#dc2626" */
.req { color: rgb(var(--c-err)); margin-right: 2px; }
.notice-ok {
  background: rgb(var(--c-ok) / .06); border-left: 3px solid rgb(var(--c-ok));
  padding: 10px 14px; border-radius: 4px; margin-bottom: 14px; font-size: 13px;
}
.text-err { color: rgb(var(--c-err)); }
.text-ok { color: rgb(var(--c-ok)); }
.text-warn { color: rgb(var(--c-st-doing)); }
.text-mute { color: rgb(var(--c-text-mute)); }
.load-err { color: rgb(var(--c-err)); font-size: 12px; padding: 12px 0; }
.notice-err {
  background: rgb(var(--c-err) / .05); border-left: 3px solid rgb(var(--c-err));
  padding: 10px 14px; border-radius: 4px; margin-bottom: 14px; font-size: 13px;
}

/* 任务状态 chip：所有地方都用 taskStatusChip() 生成，颜色只在这里定义 */
.st-chip {
  display: inline-flex; align-items: center; gap: 3px;
  padding: 1px 8px; border-radius: 10px;
  font-size: 12px; font-weight: 500; white-space: nowrap;
  color: rgb(var(--st)); background: rgb(var(--st) / .13);
}
.st-open   { --st: var(--c-st-open); }
.st-doing  { --st: var(--c-st-doing); }
.st-review { --st: var(--c-st-review); }
.st-ok     { --st: var(--c-st-ok); }
.st-stop   { --st: var(--c-st-stop); }
.st-chip.status-chip { margin-left: 6px; }

/* ── 表单（紧凑） ───────────────────────────────────── */
.form-row { margin-bottom: 10px; }
.form-row label {
  display: block; font-size: 12px;
  color: rgb(var(--c-text-mute));
  margin-bottom: 4px; font-weight: 500;
}
.form-row input, .form-row textarea, .form-row select {
  width: 100%;
  background: rgb(var(--c-bg));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  padding: 7px 10px;
  font-size: 13px;
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
/* 复选框/单选框不能吃上面那条 width:100% —— Chrome 会把方框拉成整行宽（看着像"居中的小方块"），
   同一行的文字被挤成一列竖排。成员弹窗「绑定产品」的产品名消失就是这么来的。 */
.form-row input[type="checkbox"], .form-row input[type="radio"] { width: auto; }

/* ── 成员弹窗：@ 前缀输入框 / 字段下方说明 / 密码提示条 / 角色层级提示 / 员工档案折叠区 ── */
/* 登录用户名就是 TG 账号，所以固定显示一个 @ 前缀。存库时不带 @（登录输的也是不带 @ 的） */
.input-at {
  display: flex; align-items: stretch;
  background: rgb(var(--c-bg));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  overflow: hidden;
  transition: border-color .15s, box-shadow .15s;
}
.input-at:focus-within { border-color: rgb(var(--c-brand)); box-shadow: 0 0 0 3px rgb(var(--c-brand) / .18); }
.input-at-prefix {
  display: flex; align-items: center;
  padding: 0 4px 0 10px;
  color: rgb(var(--c-text-mute));
  font-size: 13px;
}
.form-row .input-at input {
  flex: 1; min-width: 0;
  border: none; border-radius: 0;
  background: transparent;
  padding-left: 0;
}
.form-row .input-at input:focus { box-shadow: none; }

/* 外事号：对外 TG 账号，可以有多个。每行复用上面的 @ 输入框，右边一个移除按钮 */
.tg-list { display: flex; flex-direction: column; gap: 6px; }
.tg-row { display: flex; align-items: stretch; gap: 6px; }
.tg-row .input-at { flex: 1; min-width: 0; }
.tg-del {
  flex: none; width: 34px;
  background: none;
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  color: rgb(var(--c-text-mute));
  font-size: 12px;
  cursor: pointer;
}
.tg-del:hover { color: #dc2626; border-color: #dc2626; }
.tg-add {
  align-self: flex-start;
  background: none; border: none;
  padding: 2px 0;
  color: rgb(var(--c-brand));
  font-size: 12px;
  cursor: pointer;
}
.tg-add:hover { text-decoration: underline; }
.tg-del:focus-visible, .tg-add:focus-visible { outline: 2px solid rgb(var(--c-brand)); outline-offset: 2px; }
/* 查看模式：只列出 @xxx */
.tg-list:has(.tg-chip) { flex-direction: row; flex-wrap: wrap; }
.tg-chip {
  display: inline-block;
  padding: 3px 10px;
  border-radius: 12px;
  background: rgb(var(--c-bg-3));
  border: 1px solid rgb(var(--c-line));
  font-size: 12px;
  color: rgb(var(--c-text));
}
.tg-empty { font-size: 12px; color: rgb(var(--c-text-mute)); }
.field-note {
  font-size: 11px;
  color: rgb(var(--c-text-mute));
  margin-top: 5px;
  line-height: 1.5;
}

/* ── 成员弹窗：密码提示条 / 角色层级提示 / 员工档案折叠区 ── */
.member-pw-tip {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  margin-bottom: 14px;
}
.member-pw-tip b { color: rgb(var(--c-text)); font-weight: 600; }
.member-level-hint {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  margin: -6px 0 14px;
}
.member-archive {
  border-top: 1px solid rgb(var(--c-line));
  margin-top: 4px;
  padding-top: 10px;
}
.member-archive > summary {
  cursor: pointer;
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  list-style: none;
  user-select: none;
  padding: 4px 0;
}
.member-archive > summary::-webkit-details-marker { display: none; }
.member-archive > summary::before { content: '▸ '; }
.member-archive[open] > summary::before { content: '▾ '; }
.member-archive > summary:hover { color: rgb(var(--c-text)); }
.member-archive[open] > summary { margin-bottom: 8px; }

/* chip-group：紧凑的标签按钮组，用于"任务分类"等轻字段 */
.chip-group {
  display: flex; flex-wrap: wrap; gap: 5px;
}
.chip-label {
  display: inline-flex; align-items: center;
  padding: 4px 10px;
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  font-size: 12px;
  cursor: pointer;
  background: rgb(var(--c-bg));
  color: rgb(var(--c-text-mute));
  transition: all .12s ease;
  user-select: none;
}
.chip-label:hover {
  border-color: rgb(var(--c-brand) / .5);
  color: rgb(var(--c-text));
}
.chip-label input { display: none; }
.chip-label:has(input:checked) {
  background: rgb(var(--c-brand) / .14);
  border-color: rgb(var(--c-brand));
  color: rgb(var(--c-brand-soft));
  font-weight: 600;
}
html[data-theme="light"] .chip-label:has(input:checked) {
  color: rgb(var(--c-brand));
}

/* ── product-picker：下拉触发器 + 展开面板 ─────── */
.product-picker {
  position: relative;
}
.product-picker-trigger {
  width: 100%;
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text-mute));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  padding: 9px 12px;
  font-size: 13px;
  cursor: pointer;
  outline: none;
  text-align: left;
  transition: border-color .12s ease;
}
.product-picker-trigger:hover { border-color: rgb(var(--c-brand) / .5); }
.product-picker-trigger:focus { border-color: rgb(var(--c-brand)); box-shadow: 0 0 0 3px rgb(var(--c-brand) / .18); }
.product-picker-trigger .trigger-text {
  flex: 1; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.product-picker-trigger .trigger-arrow {
  flex: 0 0 auto;
  font-size: 11px;
  transition: transform .15s ease;
}
.product-picker.open .trigger-arrow { transform: rotate(180deg); }

.product-picker-panel {
  position: absolute;
  top: calc(100% + 4px); left: 0; right: 0;
  z-index: 50;
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  box-shadow: 0 8px 28px rgba(15,23,42,.12);
  padding: 8px;
  max-height: 280px;
  overflow: auto;
}
.product-picker-search {
  width: 100%;
  box-sizing: border-box;
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 6px;
  padding: 6px 10px;
  font-size: 12px;
  outline: none;
  margin-bottom: 8px;
}
.product-picker-search:focus { border-color: rgb(var(--c-brand)); }
/* v182：下拉面板里的多选统一成「竖排列表 + 可见复选框」。
   面板外的 chip-group（任务分类等轻字段）保持原样，不受影响。 */
.product-picker-panel .chip-group {
  display: block;
  max-height: 260px;
  overflow-y: auto;
}
.product-picker-panel .chip-label {
  display: flex; align-items: center; gap: 8px;
  width: 100%; box-sizing: border-box;
  padding: 6px 8px;
  margin: 0;
  border: none;
  border-radius: 6px;
  background: transparent;
  font-size: 13px;
  font-weight: 400;
  color: rgb(var(--c-text));
  line-height: 1.5;
}
.product-picker-panel .chip-label:hover { background: rgb(var(--c-bg-3)); }
.product-picker-panel .chip-label input {
  display: inline-block;
  flex: 0 0 auto;
  width: auto;          /* 双保险：面板可能被放进 .form-row 里 */
  margin: 0;
  cursor: pointer;
}
/* 产品名占满剩余宽度，太长就省略号，不要换行挤成竖排 */
.product-picker-panel .chip-label span {
  flex: 1; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 弹窗里的下拉面板改成流内展开：.modal 自己是 overflow:auto 的滚动容器，
   绝对定位的面板会被它裁掉一半（展开后看不全、还得滚）。 */
.modal .product-picker-panel {
  position: static;
  margin-top: 6px;
  box-shadow: none;
  max-height: 240px;
}
.product-picker-panel .chip-label:has(input:checked) {
  background: rgb(var(--c-brand) / .08);
  border-color: transparent;
  color: rgb(var(--c-text));
  font-weight: 500;
}
html[data-theme="light"] .product-picker-panel .chip-label:has(input:checked) { color: rgb(var(--c-text)); }
.product-picker-panel .chip-label input:disabled { cursor: not-allowed; opacity: .5; }

.form-row input:focus, .form-row textarea:focus, .form-row select:focus {
  border-color: rgb(var(--c-brand));
  box-shadow: 0 0 0 3px rgb(var(--c-brand) / .18);
}

/* ── 今日：两个任务入口卡片 ─────────────────────────── */
.task-entry-grid {
  display: grid; grid-template-columns: 1fr 1fr; gap: 16px;
  padding: 16px 28px 0;
}
.task-entry-card {
  background: #fff;
  border: 1px solid rgba(15,23,42,.06);
  border-radius: 12px;
  padding: 16px 18px;
  cursor: pointer;
  transition: all .15s ease;
  min-height: 140px;
  display: flex; flex-direction: column;
}
.task-entry-card:hover {
  border-color: rgba(59,130,246,.35);
  box-shadow: 0 6px 20px rgba(59,130,246,.1);
  transform: translateY(-1px);
}
.task-entry-head {
  display: flex; align-items: center; gap: 10px;
  margin-bottom: 4px;
}
.task-entry-icon {
  width: 32px; height: 32px;
  border-radius: 8px;
  background: rgba(59,130,246,.08);
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 16px;
}
.task-entry-title {
  font-size: 15px; font-weight: 600;
  color: rgb(var(--c-text));
  flex: 1;
}
.task-entry-count {
  font-size: 12px;
  padding: 2px 10px;
  background: rgba(15,23,42,.04);
  color: rgb(var(--c-text-mute));
  border-radius: 10px;
}
.task-entry-tag {
  font-size: 11px;
  color: rgb(var(--c-text-mute));
  margin-bottom: 10px;
}
.task-entry-body { display: flex; flex-direction: column; gap: 6px; }
.task-entry-empty {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  text-align: center;
  padding: 18px 0;
  opacity: .7;
}
.task-entry-row {
  padding: 8px 10px;
  border-radius: 6px;
  background: rgba(15,23,42,.02);
  border: 1px solid rgba(15,23,42,.04);
  cursor: pointer;
  transition: background .1s ease;
}
.task-entry-row:hover { background: rgba(59,130,246,.06); }
.task-entry-row-title {
  font-size: 13px; font-weight: 500;
  color: rgb(var(--c-text));
  margin-bottom: 3px;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.task-entry-row-meta {
  display: flex; gap: 10px;
  font-size: 11px; color: rgb(var(--c-text-mute));
}

/* ── 看板：表格形式（飞书多维表格风格） ───────────────── */
.board-table-wrap {
  background: #fff;
  border: 1px solid rgba(15,23,42,.06);
  border-radius: 12px;
  overflow-x: auto;
}
.board-table,
.board-table-inner {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
}
.board-table thead th {
  background: rgba(15,23,42,.03);
  font-size: 11px;
  font-weight: 600;
  color: rgb(var(--c-text-mute));
  text-align: left;
  padding: 10px 8px;
  border-bottom: 1px solid rgba(15,23,42,.08);
  white-space: nowrap;
  text-transform: uppercase;
  letter-spacing: 0.3px;
  position: sticky; top: 0; z-index: 2;
}
.board-table tbody td {
  padding: 10px 8px;
  border-bottom: 1px solid rgba(15,23,42,.04);
  vertical-align: top;
  color: rgb(var(--c-text));
}
.board-table tbody tr.task-tr:hover { background: rgba(59,130,246,.04); }
.board-table tbody tr.task-tr.approved td { opacity: .5; }
.board-table tbody tr.task-tr.approved .task-title-text { text-decoration: line-through; }
.board-table tbody tr.task-tr.overdue .task-title-text { color: #dc2626; font-weight: 600; }
.col-check { width: 36px; text-align: center; }
.col-title { min-width: 180px; }
.col-desc,
.col-progress { min-width: 200px; max-width: 280px; }
.col-link { width: 70px; text-align: center; }
.col-date { width: 110px; white-space: nowrap; }
.col-ei { width: 80px; text-align: center; }
.col-status { width: 80px; text-align: center; }
.col-user,
.col-creator,
.col-product,
.col-category,
.col-type { width: 100px; }
.col-actions { width: 70px; text-align: center; white-space: nowrap; }
.task-title-cell {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
}
.task-title-text { font-weight: 500; color: rgb(var(--c-text)); }
.cell-text {
  font-size: 12px;
  color: rgb(var(--c-text));
  white-space: pre-wrap;
  word-break: break-word;
  max-height: 80px;
  overflow: hidden;
  text-overflow: ellipsis;
}
.cell-muted { color: rgba(15,23,42,.35); font-size: 12px; }
.cell-link { color: #2563eb; font-size: 12px; text-decoration: none; }
.cell-link:hover { text-decoration: underline; }

/* Eisenhower chip（精简） */
.task-ei-chip {
  display: inline-block;
  padding: 2px 8px;
  font-size: 11px;
  border-radius: 4px;
  font-weight: 500;
  white-space: nowrap;
}
.task-ei-chip.ei-q1 { color: #dc2626; background: rgba(220,38,38,.08); border-left: 3px solid #dc2626; }
.task-ei-chip.ei-q2 { color: #2563eb; background: rgba(59,130,246,.08); border-left: 3px solid #3b82f6; }
.task-ei-chip.ei-q3 { color: #b45309; background: rgba(245,158,11,.12); border-left: 3px solid #f59e0b; }
.task-ei-chip.ei-q4 { color: #64748b; background: rgba(100,116,139,.08); border-left: 3px solid #94a3b8; }

/* 表格里的复选框（小圆） */
.board-table .task-check {
  width: 18px; height: 18px;
  border: 2px solid rgba(15,23,42,.2);
  border-radius: 50%;
  cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
}
.board-table .task-check.done {
  background: #10b981;
  border-color: #10b981;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3'><polyline points='20 6 9 17 4 12'/></svg>");
  background-position: center;
  background-repeat: no-repeat;
  background-size: 12px 12px;
}
.board-table .task-check.doing {
  border-color: #3b82f6;
  background: rgba(59,130,246,.15);
}

/* 分组标题行（在表格里以 colspan 行展示） */
.task-group-row { background: rgba(15,23,42,.02); }
.task-group-row .task-group-cell { padding: 8px 12px; }
.task-group-header {
  display: flex; align-items: center; gap: 8px;
  font-size: 13px; font-weight: 600;
  color: rgb(var(--c-text));
  cursor: pointer; user-select: none;
}
.task-group-header:hover { color: #3b82f6; }
.task-group.collapsed .caret { transform: rotate(-90deg); }
.task-group-body { background: #fff; }
.task-group.collapsed .task-group-body { display: none; }
.task-group-header .caret { font-size: 10px; color: rgb(var(--c-text-mute)); transition: transform .15s; }
.group-label { flex: 1; }
.group-count {
  font-size: 11px;
  padding: 1px 10px;
  background: rgba(15,23,42,.06);
  color: rgb(var(--c-text-mute));
  border-radius: 10px;
}

/* ── 任务表单（参考风格：单列长表单） ──────────────── */
.task-form-list { padding: 4px 0; }
.task-form-row {
  display: grid;
  grid-template-columns: 130px 1fr;
  align-items: start;
  gap: 12px;
  padding: 10px 0;
  border-bottom: 1px solid rgba(15,23,42,.04);
}
.task-form-row:last-child { border-bottom: none; }
.task-form-label {
  font-size: 13px;
  color: rgb(var(--c-text-mute));
  padding-top: 9px;
  white-space: nowrap;
}
.task-form-label .req {
  display: inline-block;
  width: 18px; height: 18px;
  margin-right: 6px;
  border: 1px solid rgba(15,23,42,.15);
  border-radius: 4px;
  vertical-align: middle;
  background: rgba(15,23,42,.02);
  font-size: 11px;
  color: rgb(var(--c-text-mute));
  text-align: center;
  line-height: 16px;
}
.task-form-input {
  width: 100%; box-sizing: border-box;
  background: #fff;
  border: 1px solid rgba(15,23,42,.12);
  border-radius: 8px;
  padding: 9px 12px;
  font-size: 13px;
  color: rgb(var(--c-text));
  outline: none;
  transition: border-color .12s, box-shadow .12s;
}
.task-form-input:focus {
  border-color: #3b82f6;
  box-shadow: 0 0 0 3px rgba(59,130,246,.15);
}
.task-form-input:disabled { background: rgb(var(--c-bg-3)); opacity: .6; cursor: not-allowed; }

.task-form-footer {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 0 4px;
  border-top: 1px solid rgba(15,23,42,.06);
  margin-top: 12px;
}
.task-form-checkbox { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: rgb(var(--c-text-mute)); }

/* Eisenhower 矩阵（重要 × 紧急 四象限） */
.eisenhower-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
.ei-cell {
  display: flex; flex-direction: column; gap: 4px;
  padding: 10px 12px;
  border: 2px solid rgba(15,23,42,.1);
  border-radius: 8px;
  background: #fff;
  cursor: pointer;
  text-align: left;
  transition: all .12s ease;
}
.ei-cell:hover { border-color: rgba(59,130,246,.4); }
.ei-cell.selected { border-color: #3b82f6; background: rgba(59,130,246,.08); box-shadow: 0 0 0 3px rgba(59,130,246,.12); }
.ei-cell.q1 { border-left: 4px solid #dc2626; }
.ei-cell.q2 { border-left: 4px solid #3b82f6; }
.ei-cell.q3 { border-left: 4px solid #f59e0b; }
.ei-cell.q4 { border-left: 4px solid #94a3b8; }
.ei-title { font-size: 13px; font-weight: 600; color: rgb(var(--c-text)); }
.ei-sub { font-size: 11px; color: rgb(var(--c-text-mute)); }

/* ── 任务列表（滴答清单风格） ─────────────────── */
.task-list-wrap {
  background: #fff;
  border: 1px solid rgba(15,23,42,.06);
  border-radius: 12px;
  overflow: hidden;
}
.task-list-header {
  display: grid;
  grid-template-columns: 36px 48px 1fr 1.4fr 80px;
  align-items: center;
  gap: 12px;
  padding: 10px 16px;
  background: rgba(15,23,42,.02);
  border-bottom: 1px solid rgba(15,23,42,.06);
  font-size: 11px;
  font-weight: 600;
  color: rgb(var(--c-text-mute));
  text-transform: uppercase;
  letter-spacing: 0.4px;
}
.task-row {
  padding: 0;
  border-bottom: 1px solid rgba(15,23,42,.04);
  cursor: pointer;
  transition: background .12s ease;
}
.task-row:last-child { border-bottom: none; }
.task-row:hover { background: rgba(15,23,42,.02); }
.task-row.approved .task-title-text { text-decoration: line-through; opacity: .55; }
.task-row.overdue .task-title-text { color: #dc2626; font-weight: 600; }

/* 行顶：复选框 + 优先级 + 标题 + 操作 */
.task-row-top {
  display: grid;
  grid-template-columns: 36px 48px 1fr 80px;
  align-items: center;
  gap: 12px;
  padding: 12px 16px 6px;
}
.task-row-meta {
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 0 16px 6px 92px;  左侧对齐 title-cell
}
.task-row-timeline {
  padding: 0 16px 10px 92px;
  font-size: 12px;
  color: rgb(var(--c-text-mute));
}
.task-row-timeline b { color: rgb(var(--c-text)); font-weight: 600; }

/* 任务详情块（描述/最新进展） */
.task-detail-block {
  margin-top: 6px;
  padding: 8px 10px;
  background: rgba(15,23,42,.02);
  border-radius: 6px;
  font-size: 12px;
}
.task-detail-label {
  font-size: 11px;
  color: rgb(var(--c-text-mute));
  margin-bottom: 4px;
  font-weight: 600;
}
.task-detail-text {
  color: rgb(var(--c-text));
  line-height: 1.5;
  white-space: pre-wrap;
  word-break: break-word;
}

.task-check {
  width: 22px; height: 22px;
  border: 2px solid rgba(15,23,42,.2);
  border-radius: 50%;
  cursor: pointer;
  transition: all .15s ease;
  display: inline-flex; align-items: center; justify-content: center;
}
.task-check.done {
  background: #10b981;
  border-color: #10b981;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3'><polyline points='20 6 9 17 4 12'/></svg>");
  background-position: center;
  background-repeat: no-repeat;
  background-size: 14px 14px;
}
.task-check.doing {
  border-color: #3b82f6;
  background: rgba(59,130,246,.15);
}

.task-pri { display: flex; align-items: center; justify-content: center; }
.task-title-text {
  font-size: 14px; font-weight: 500;
  color: rgb(var(--c-text));
}
.task-category { font-size: 11px; color: rgb(var(--c-text-mute)); margin-top: 2px; }
.task-meta-cell { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.task-meta-item {
  font-size: 11px;
  color: rgb(var(--c-text-mute));
  padding: 2px 8px;
  background: rgba(15,23,42,.04);
  border-radius: 4px;
  white-space: nowrap;
}
.task-meta-item.overdue { color: #dc2626; background: rgba(220,38,38,.08); }
.task-meta-item.link { color: #2563eb; background: rgba(59,130,246,.08); text-decoration: none; }
.task-meta-item.link:hover { background: rgba(59,130,246,.16); }
.task-meta-item.ei-q1 { color: #dc2626; background: rgba(220,38,38,.08); border-left: 3px solid #dc2626; }
.task-meta-item.ei-q2 { color: #2563eb; background: rgba(59,130,246,.08); border-left: 3px solid #3b82f6; }
.task-meta-item.ei-q3 { color: #b45309; background: rgba(245,158,11,.12); border-left: 3px solid #f59e0b; }
.task-meta-item.ei-q4 { color: #64748b; background: rgba(100,116,139,.08); border-left: 3px solid #94a3b8; }
.chip-mini {
  font-size: 11px;
  padding: 2px 8px;
  border-radius: 4px;
  font-weight: 500;
}
.chip-mini.main { background: rgba(59,130,246,.12); color: #2563eb; }
.chip-mini.daily { background: rgba(245,158,11,.14); color: #b45309; }
/* v127：⏳待审核 chip 上的数字徽标（红色，轻量提示） */
.chip-mini.review { background: rgba(220,38,38,.12); color: #dc2626; margin-left: 4px; }
.task-actions-cell { display: flex; gap: 4px; justify-content: flex-end; }

/* 分组（滴答清单风格：分组标题可折叠） */
.task-group { border-top: 1px solid rgba(15,23,42,.04); }
.task-group:first-child { border-top: none; }
.task-group-header {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 16px;
  background: rgba(15,23,42,.03);
  font-size: 13px; font-weight: 600;
  color: rgb(var(--c-text));
  cursor: pointer;
  user-select: none;
}
.task-group-header:hover { background: rgba(15,23,42,.05); }
.task-group-header .caret {
  font-size: 10px;
  color: rgb(var(--c-text-mute));
  transition: transform .15s ease;
  display: inline-block;
}
.task-group.collapsed .caret { transform: rotate(-90deg); }
.task-group.collapsed .task-group-body { display: none; }
.group-label { flex: 1; }
.group-count {
  font-size: 11px;
  padding: 1px 8px;
  background: rgba(15,23,42,.06);
  color: rgb(var(--c-text-mute));
  border-radius: 10px;
  font-weight: 500;
}

/* ── 滚动条 ─────────────────────────────────── */
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track { background: rgb(var(--c-bg)); }
::-webkit-scrollbar-thumb { background: rgb(var(--c-line)); border-radius: 4px; }
::-webkit-scrollbar-thumb:hover { background: rgb(var(--c-brand) / .55); }

/* ── toast ──────────────────────────────────── */
.toast {
  position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%);
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  padding: 10px 20px;
  border-radius: 999px;
  font-size: 13px;
  box-shadow: 0 4px 20px rgba(0,0,0,.2);
  border: 1px solid rgb(var(--c-line));
  opacity: 0; pointer-events: none;
  transition: opacity .25s ease;
  z-index: 9999;
}
.toast.show { opacity: 1; }

/* ── 主题切换 ───────────────────────────────── */
.theme-toggle {
  width: 34px; height: 34px;
  display: inline-flex; align-items: center; justify-content: center;
  border: 1px solid rgb(var(--c-line));
  background: transparent;
  color: rgb(var(--c-text-mute));
  border-radius: 8px;
  cursor: pointer; font-size: 14px;
}
.theme-toggle:hover { color: rgb(var(--c-text)); background: rgb(var(--c-bg-3)); }

/* ── empty ──────────────────────────────────── */
.empty {
  text-align: center;
  padding: 40px 20px;
  color: rgb(var(--c-text-mute));
}
.empty .icon { font-size: 36px; opacity: .5; margin-bottom: 10px; }
.loading { padding: 20px; text-align: center; color: rgb(var(--c-text-mute)); font-size: 13px; }

/* ── 登录页专用 ─────────────────────────────── */
.login-hero {
  padding: 64px 24px 80px;
  text-align: center;
  color: #fff;
  background:
    linear-gradient(135deg, rgba(37,99,235,.95), rgba(99,102,241,.85)),
    radial-gradient(1200px 600px at 10% -10%, rgba(34,211,238,.3), transparent 60%);
  position: relative;
  overflow: hidden;
}
.login-hero h1 { font-size: 28px; font-weight: 700; letter-spacing: .5px; }
.login-hero p { margin-top: 8px; opacity: .85; font-size: 13px; letter-spacing: 1px; }
.login-hero::after {
  content: ''; position: absolute; bottom: -1px; left: 0; right: 0; height: 30px;
  background: rgb(var(--c-bg));
  -webkit-mask-image: linear-gradient(transparent, black);
          mask-image: linear-gradient(transparent, black);
}

.login-card {
  max-width: 400px;
  margin: -40px auto 0;
  padding: 28px;
  position: relative;
  z-index: 1;
}

/* 任务表单分组（紧凑） */
.form-section {
  margin-bottom: 12px;
  padding-bottom: 8px;
  border-bottom: 1px solid rgb(var(--c-line));
}
.form-section:last-of-type { border-bottom: none; }
.form-section-title {
  font-size: 11px;
  font-weight: 600;
  color: rgb(var(--c-text-mute));
  margin-bottom: 6px;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}

/* ═══════ 看板：左右双列卡片（图片风格） ═══════ */
.board-toolbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 24px; flex-wrap: wrap; gap: 12px;
}
.board-toolbar-left,
 .board-toolbar-right { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }

.seg-group-sm { padding: 2px; }
.seg-group-sm .seg-btn { height: auto; padding: 3px 10px; font-size: 12px; }

.board-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 16px;
  padding: 0 24px 24px;
}
@media (max-width: 900px) {
  .board-grid { grid-template-columns: 1fr; }
}

/* v103：board-2col 默认撑满整个屏幕（去掉左右 padding） */
.board-2col {
  display: grid;
  /* v91 微调：用 minmax(0,1fr) 强制等分（默认 1fr 是 minmax(auto,1fr)，会被 min-content 撑开导致不等宽） */
  grid-template-columns: minmax(0, 1fr) 6px minmax(0, 1fr);
  gap: 0;
  padding: 0;
  min-height: calc(100vh - 130px);  /* 撑满屏幕减去顶部 toolbar + 底部状态栏 */
}
@media (max-width: 900px) {
  .board-2col { grid-template-columns: 1fr; }
  .board-col-resizer { display: none; }
}
.board-list-pane {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  padding: 12px 14px;
  min-height: calc(100vh - 160px);
  /* v103：左边区域独立滚动（任务多时只有左边滚动） */
  max-height: calc(100vh - 130px);
  overflow-y: auto;
}
.board-detail-pane {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  /* v107：flex column 让中间内容独立滚动 + 底部按钮固定屏幕底 */
  display: flex;
  flex-direction: column;
  min-height: calc(100vh - 160px);
  max-height: calc(100vh - 130px);
  overflow: hidden;
}
.board-detail-scroll {
  flex: 1;
  overflow-y: auto;
  padding: 12px 14px;
  min-height: 0;  /* flex 子项最小高度关键，否则内容溢出 */
}
.board-detail-footer {
  padding: 12px 14px;
  border-top: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  flex-shrink: 0;
  border-radius: 0 0 14px 14px;
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
  box-shadow: 0 -4px 12px rgba(15, 23, 42, .06);
}
/* v89 微调：可拖拽分隔条 */
.board-col-resizer {
  cursor: col-resize;
  user-select: none;
  background: transparent;
  position: relative;
  margin: 0 -3px;  /* 让 6px 可视区扩大 3px 命中区 */
  z-index: 5;
}
.board-col-resizer::before {
  content: '';
  position: absolute;
  left: 50%;
  top: 0; bottom: 0;
  width: 1px;
  background: rgb(var(--c-line));
  transform: translateX(-0.5px);
  transition: background-color .15s;
}
.board-col-resizer:hover::before,
.board-col-resizer.dragging::before {
  background: rgb(var(--c-brand));
  width: 2px;
  transform: translateX(-1px);
}
.board-detail-empty {
  display: flex; align-items: center; justify-content: center;
  min-height: 360px;
  color: rgb(var(--c-text-mute));
  font-size: 14px;
}

.board-row.selected {
  background: rgb(var(--c-brand) / .12) !important;
  outline: 2px solid rgb(var(--c-brand) / .35);
  outline-offset: -2px;
}

.board-column {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  padding: 14px 16px;
  display: flex; flex-direction: column;
  min-height: 320px;
  max-height: calc(100vh - 220px);
}

.board-col-header {
  display: flex; align-items: center; justify-content: space-between;
  gap: 10px; flex-wrap: wrap;
  padding-bottom: 10px;
  border-bottom: 1px solid rgb(var(--c-line));
  margin-bottom: 10px;
}
.board-col-title {
  display: flex; align-items: center; gap: 8px;
  font-size: 14px;
}
.board-col-icon { font-size: 16px; }
.board-col-name { font-weight: 600; color: rgb(var(--c-text)); }
.board-col-count {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  padding: 1px 8px;
  background: rgb(var(--c-bg-3));
  border-radius: 8px;
}
.board-col-tools { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.board-col-hint { font-size: 11px; color: rgb(var(--c-text-mute)); }

.board-col-body {
  flex: 1;
  overflow-y: auto;
  padding: 2px 2px 4px;
}
.board-empty {
  text-align: center;
  padding: 40px 0;
  color: rgb(var(--c-text-mute));
  font-size: 13px;
}

/* ── 看板列表（v83：行模式，比卡片更紧凑） ── */
.board-list-wrap {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  overflow-x: auto;
}
.board-list-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
  min-width: 900px;
}
.board-list-table thead th {
  background: rgb(var(--c-bg-3));
  text-align: left;
  padding: 10px 12px;
  font-size: 12px;
  font-weight: 600;
  color: rgb(var(--c-text-mute));
  border-bottom: 1px solid rgb(var(--c-line));
  white-space: nowrap;
}
.board-list-table tbody tr.board-row {
  border-bottom: 1px solid rgb(var(--c-line));
  transition: background-color .12s ease;
}
.board-list-table tbody tr.board-row:hover {
  background: rgb(var(--c-brand) / .04);
}
.board-list-table tbody tr.board-row:last-child { border-bottom: 0; }
.board-list-table tbody tr.board-row.board-row-overdue {
  background: rgba(220,38,38,.04);
}
.board-list-table tbody tr.board-row.board-row-overdue:hover {
  background: rgba(220,38,38,.07);
}
.board-list-table tbody tr.board-row.board-row-approved { opacity: .65; }
.board-list-table tbody tr.board-row.board-row-review { background: rgba(37, 99, 235, .03); }
.board-list-table tbody tr.board-row.board-row-extend-pending { background: rgba(245, 158, 11, .06); }
.board-list-table tbody td { vertical-align: middle; }
.board-list-table tbody td { vertical-align: middle; }
.board-row-op {
  background: transparent;
  border: 1px solid transparent;
  border-radius: 6px;
  padding: 3px 8px;
  font-size: 14px;
  color: rgb(var(--c-text-mute));
  cursor: pointer;
  transition: all .12s;
}
.board-row-op:hover { background: rgb(var(--c-brand) / .1); color: rgb(var(--c-text)); }
.board-row-op.success:hover { background: rgba(34,197,94,.15); color: #16a34a; }
.board-row-op.danger:hover { background: rgb(var(--c-err) / .12); color: rgb(var(--c-err)); }

/* ── v92：紧凑行（滴答清单风 + 截图样式重做） ── */
.board-list-compact { width: 100%; border-collapse: collapse; min-width: 0; }
/* 标题列只吃剩余宽度：自动表格布局下长标题 nowrap 会把列撑宽，列表栏出现横向滚动、执行人被截 */
.board-list-compact tbody tr.board-row > td[data-act="select"] { max-width: 0; width: 100%; }
/* 右侧让出绝对定位的执行人标签（right:8px）+ 最多 3 个图标（right:110px 起，宽 ~54）。
   让在标题的行容器上而不是标题的 padding 上：窄屏时 padding 会吃光内容区，文字溢进 padding 压住标签 */
.board-list-compact tbody tr.board-row > td[data-act="select"] > div:first-child { margin-right: 172px; }
@media (max-width: 900px) {
  .board-list-compact tbody tr.board-row > td[data-act="select"] > div:first-child { margin-right: 92px; }
  .board-list-compact .br-meta-icons { display: none; }
}
.board-list-compact tbody tr.board-row {
  border-bottom: 1px solid rgb(var(--c-line));
  transition: background-color .12s;
}
/* 行高加大（按截图每行 padding 大） */
.board-list-compact tbody tr.board-row > td { padding-top: 12px; padding-bottom: 12px; }
.board-list-compact tbody tr.board-row:hover { background: rgb(var(--c-brand) / .05); }

/* 左侧 4px 状态指示条 — 用 td:first-child 或 box-shadow 实现 */
.board-list-compact tbody tr.board-row {
  position: relative;
}
.board-list-compact tbody tr.board-row::before {
  content: '';
  position: absolute;
  left: 0; top: 0; bottom: 0;
  width: 3px;
}
.board-list-compact tbody tr.board-row[data-status="open"]::before     { background: #ef4444; }  /* 红 */
.board-list-compact tbody tr.board-row[data-status="doing"]::before    { background: #3b82f6; }  /* 蓝 */
.board-list-compact tbody tr.board-row[data-status="done"]::before     { background: #22c55e; }  /* 绿 */
.board-list-compact tbody tr.board-row[data-status="approved"]::before { background: #9ca3af; }  /* 灰 */

/* 过期行微红底 */
.board-list-compact tbody tr.board-row.board-row-overdue { background: rgba(239, 68, 68, .04); }
.board-list-compact tbody tr.board-row.board-row-overdue:hover { background: rgba(239, 68, 68, .08); }
/* 已完成行淡掉 + 划线 */
.board-list-compact tbody tr.board-row.board-row-approved { opacity: .65; }
.board-list-compact tbody tr.board-row.board-row-approved .br-title { text-decoration: line-through; color: rgb(var(--c-text-mute)); font-weight: 400; }
/* v131：待审核（done，提交待审）—— 蓝色标识（区别于已通过的灰色） */
.board-list-compact tbody tr.board-row.board-row-review { background: rgba(37, 99, 235, .04); }
.board-list-compact tbody tr.board-row.board-row-review:hover { background: rgba(37, 99, 235, .08); }
/* v131：已提交（extend_pending=1，延期申请审批中）—— 橙色背景 */
.board-list-compact tbody tr.board-row.board-row-extend-pending { background: rgba(245, 158, 11, .06); }
.board-list-compact tbody tr.board-row.board-row-extend-pending:hover { background: rgba(245, 158, 11, .12); }

/* v131：approved checkbox —— 灰色对勾（"已通过"视觉） */
.board-list-compact .board-card-check.approved {
  border-color: #9ca3af;
  background-color: #f3f4f6;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%236b7280' stroke-width='3'><polyline points='20 6 9 17 4 12'/></svg>");
  background-size: 10px 10px;
  background-position: center;
  background-repeat: no-repeat;
}
/* v174：review checkbox —— 蓝色横线"—"（"待审核"未完结，不打勾；以横线标识"等待中"） */
.board-list-compact .board-card-check.review {
  border-color: #1d4ed8;
  background-color: rgba(37, 99, 235, .12);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%231d4ed8' stroke-width='3'><line x1='6' y1='12' x2='18' y2='12'/></svg>");
  background-size: 10px 10px;
  background-position: center;
  background-repeat: no-repeat;
}
/* v174：extend-pending checkbox —— 橙色横线"—"（与 review 共用"等待中"语义；不再用对勾） */
.board-list-compact .board-card-check.extend-pending {
  border-color: #f59e0b;
  background-color: rgba(245, 158, 11, .14);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23f59e0b' stroke-width='3'><line x1='6' y1='12' x2='18' y2='12'/></svg>");
  background-size: 10px 10px;
  background-position: center;
  background-repeat: no-repeat;
}
/* v174：详情面板里的 review checkbox —— 蓝色横线"—" */
.board-card-check.review {
  border-color: #1d4ed8;
  background-color: rgba(37, 99, 235, .12);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%231d4ed8' stroke-width='3'><line x1='6' y1='12' x2='18' y2='12'/></svg>");
  background-size: 10px 10px;
  background-position: center;
  background-repeat: no-repeat;
}
/* v174：详情面板里的 extend-pending checkbox —— 橙色横线"—"（与 review 共用"等待中"语义；不再用对勾） */
.board-card-check.extend-pending {
  border-color: #f59e0b;
  background-color: rgba(245, 158, 11, .14);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%23f59e0b' stroke-width='3'><line x1='6' y1='12' x2='18' y2='12'/></svg>");
  background-size: 10px 10px;
  background-position: center;
  background-repeat: no-repeat;
}

/* v91 微调：标题列 td 用 relative，让 chip 容器 absolute 贴分隔条；v94 加 padding-left 让复选框和标题拉开距离（对齐滴答清单截图） */
.board-list-compact tbody tr.board-row > td:nth-child(1) { padding-left: 20px; }  /* v111：复选框和左侧 3px 状态条拉开距离（14px → 20px）*/
.board-list-compact tbody tr.board-row > td:nth-child(2) { position: relative; padding-left: 14px; }
/* v99：回滚 v=95 — 标题独立，metaIcons 绝对定位 right:110px，br-chips 仅 assignee + extend */
.board-list-compact .br-title {
  font-size: 14px;
  font-weight: 500;
  color: rgb(var(--c-text));
}
/* v99：meta 图标绝对定位在日期 td 左侧 */
.board-list-compact .br-meta-icons {
  position: absolute;
  right: 110px;  /* 日期 td 90 + padding 8 + 间距 12 */
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  align-items: center;
  gap: 6px;
  color: rgb(var(--c-text-mute));
  opacity: 0.7;
}
.board-list-compact .br-meta-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
}
.board-list-compact .br-meta-icon svg {
  display: block;
  width: 100%;
  height: 100%;
}
.board-list-compact .br-meta-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 14px;
  height: 14px;
}
.board-list-compact .br-meta-icon svg {
  display: block;
  width: 100%;
  height: 100%;
}
/* chip 容器：始终贴 td 右边缘 = list-pane 右边缘 = 分隔条左边 */
.board-list-compact .br-chips {
  position: absolute;
  right: 8px;
  top: 50%;
  transform: translateY(-50%);
  display: flex;
  gap: 6px;
  align-items: center;
  background: linear-gradient(to right, transparent 12px, rgb(var(--c-bg-2)) 20px);  /* 渐变遮盖下方 title */
}

/* ── 卡片（仅今日页用） ── */
.board-card {
  background: rgb(var(--c-bg-3));
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  padding: 12px 14px;
  margin-bottom: 10px;
  transition: border-color .15s ease, transform .15s ease;
}
.board-card:hover {
  border-color: rgb(var(--c-brand) / .45);
  transform: translateY(-1px);
}
.board-card.board-overdue {
  border-left: 3px solid rgb(var(--c-err));
}
.board-card.board-approved { opacity: .65; }
.board-card.board-rejected {
  border-left: 3px solid rgb(var(--c-err));
  background: rgb(var(--c-err) / .04);
}

.board-card-top {
  display: flex; align-items: flex-start; gap: 10px;
  margin-bottom: 8px;
}
.board-card-check {
  flex: 0 0 14px;  /* v94：缩小到 14px，和标题字号接近 */
  width: 14px; height: 14px;
  border: 2px solid #ef4444;  /* v92：默认 open 状态 = 红色 */
  border-radius: 4px;
  cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center;
  margin-top: 1px;
  box-sizing: border-box;
  transition: border-color .12s, background-color .12s;
}
/* done 勾变小适配 */
.board-card-check.done {
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3'><polyline points='20 6 9 17 4 12'/></svg>");
  background-size: 10px 10px;
}
/* v92：按状态变色（与左侧状态条同步） */
.board-card-check.doing { border-color: #3b82f6; background: rgba(59,130,246,.12); }
.board-card-check.approved { border-color: #9ca3af; background: transparent; }
/* 优先级用 box-shadow 外环（与状态色叠加，不冲突） */
.board-card-check.pri-p1 { box-shadow: 0 0 0 2px rgba(239, 68, 68, .5); }
.board-card-check.pri-p2 { box-shadow: 0 0 0 2px rgba(234, 179, 8, .55); }

.board-card-title {
  flex: 1; min-width: 0;
  display: flex; align-items: center; gap: 6px;
  font-size: 14px; font-weight: 500;
  color: rgb(var(--c-text));
  line-height: 1.4;
  cursor: pointer;
}
.board-card-title-text { word-break: break-word; }

.board-card-desc {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  line-height: 1.6;
  margin: 4px 0 8px;
  white-space: pre-wrap;
  word-break: break-word;
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.board-card-desc ol,
.board-card-desc ul { padding-left: 18px; margin: 2px 0; }

.board-card-meta {
  display: flex; flex-wrap: wrap; gap: 6px;
  align-items: center;
  margin-bottom: 6px;
}

/* 头像 */
.board-avatar {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 22px;
  padding: 0 6px;
  background: rgb(var(--c-brand) / .18);
  color: rgb(var(--c-brand-soft));
  font-size: 11px; font-weight: 600;
  border-radius: 999px;
  border: 1px solid rgb(var(--c-brand) / .35);
}
html[data-theme="light"] .board-avatar { color: rgb(var(--c-brand)); }

/* 操作图标 */
.board-card-actions {
  position: absolute;
  top: 12px; right: 12px;
  display: none; gap: 4px;
}
.board-card { position: relative; }
.board-card:hover .board-card-actions { display: inline-flex; }
.board-card-icon {
  width: 24px; height: 24px;
  display: inline-flex; align-items: center; justify-content: center;
  background: transparent;
  border: 1px solid rgb(var(--c-line));
  border-radius: 6px;
  color: rgb(var(--c-text-mute));
  font-size: 12px; cursor: pointer;
}
.board-card-icon:hover { color: rgb(var(--c-text)); background: rgb(var(--c-bg-2)); }
.board-card-icon.danger:hover { color: rgb(var(--c-err)); border-color: rgb(var(--c-err) / .3); }

/* 状态文字行 */
.board-card-status {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  margin-top: 4px;
}

/* 状态操作按钮（按 SOP 7.2 任务流转：open→doing→done→approved/rejected→open） */
.board-card-actions-row {
  display: flex; flex-wrap: wrap; gap: 6px;
  margin-top: 6px;
}
.board-state-btn {
  padding: 4px 12px;
  border-radius: 6px;
  font-size: 12px;
  font-weight: 500;
  cursor: pointer;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text));
  transition: all .12s ease;
}
.board-state-btn:hover { background: rgb(var(--c-bg-3)); border-color: rgb(var(--c-brand) / .45); }
.board-state-btn.success { color: rgb(var(--c-ok)); border-color: rgb(var(--c-ok) / .35); background: rgb(var(--c-ok) / .06); }
.board-state-btn.success:hover { background: rgb(var(--c-ok) / .12); }
.board-state-btn.danger { color: rgb(var(--c-err)); border-color: rgb(var(--c-err) / .35); background: rgb(var(--c-err) / .06); }
.board-state-btn.danger:hover { background: rgb(var(--c-err) / .12); }
.board-state-text {
  font-size: 12px;
  color: rgb(var(--c-text-mute));
  padding: 4px 0;
}
/* v181：成员管理筛选行的下拉 */
.mf-sel{background:rgb(var(--c-bg-3));color:rgb(var(--c-text));border:1px solid rgb(var(--c-line));border-radius:8px;padding:7px 10px;font-size:13px;outline:none;margin-left:4px;min-width:104px}
.mf-sel:focus{border-color:rgb(var(--c-brand))}

/* ═══════ 知识库（v181）：左侧分类文档树 + 右侧阅读区 ═══════ */
/* ═══════ 知识库（v201 改版）═══════
   两态：文档墙（默认，铺满整屏）/ 阅读态（左树 + 右正文）。
   高度不再用 calc(100vh - 168px) 那种魔数——那个数和实际布局对不上，
   实测底部白白空掉 60px。现在 #page-wiki 用 flex 撑满，
   顶栏高度由 JS 实测写进 --app-header-h（写不进时回落 68px）。 */
#page-wiki.active {
  display: flex;
  flex-direction: column;
  height: calc(100vh - var(--app-header-h, 68px));
  min-height: 420px;
  /* v209：这一页一直没有左右留白，分类 chip、文档卡片、提示条全贴着屏幕边缘。
     全站的内容区留白有两套：产品/成员/汇报/计划走共享的 .main-grid（24px 28px），
     今日/看板是 24px。取 28px——它跟顶栏 (.app-header 14px 28px) 对齐，
     用的页面也更多。上边 14px 跟看板工具条一致。
     全局 box-sizing 是 border-box，所以上面那个 height 计算不受影响。 */
  padding: 14px 28px 0;
}

/* ── 工具条 ── */
.wiki-toolbar {
  display: flex; align-items: center; gap: 12px;
  flex-wrap: wrap;
  margin-bottom: 12px;
  flex: 0 0 auto;
}
#wikiCatBar { display: flex; gap: 8px; flex-wrap: wrap; flex: 1; min-width: 0; }
.wiki-cat-chip {
  padding: 5px 14px;
  border-radius: 999px;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text-mute));
  font-size: 12px; cursor: pointer;
  white-space: nowrap;
}
.wiki-cat-chip:hover { color: rgb(var(--c-text)); }
.wiki-cat-chip.active {
  background: rgb(var(--c-brand));
  border-color: rgb(var(--c-brand));
  color: #fff; font-weight: 500;
}
.wiki-cat-chip .n { opacity: .65; margin-left: 5px; font-size: 11px; }
/* v203：原来是 flex:0 0 auto 且不换行——里面 200px 搜索框加三个按钮，
   窗口一窄「上传文档」按钮就被挤出视口边缘，看着就像按钮没了/点不到。
   现在允许收缩换行，搜索框也能压到 120px。 */
.wiki-tools {
  display: flex; align-items: center; gap: 8px;
  flex: 0 1 auto; flex-wrap: wrap;
  min-width: 0;
}
.wiki-tools input {
  flex: 0 1 200px;
  min-width: 120px;
  width: 200px;
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  padding: 6px 12px;
  font-size: 13px; outline: none;
}
.wiki-tools input:focus { border-color: rgb(var(--c-brand)); }
.wiki-tool-btn {
  padding: 6px 12px;
  border-radius: 8px;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text-mute));
  font-size: 12px; cursor: pointer;
  white-space: nowrap;
}
.wiki-tool-btn:hover { color: rgb(var(--c-text)); border-color: rgb(var(--c-brand)); }
.wiki-tool-btn.spinning { opacity: .6; pointer-events: none; }

/* ── 提醒条（未分类 / 发现新文档）── */
.wiki-tip {
  display: flex; align-items: center; gap: 10px;
  padding: 8px 14px;
  margin-bottom: 10px;
  border-radius: 10px;
  font-size: 13px;
  background: rgba(245, 158, 11, .1);
  border: 1px solid rgba(245, 158, 11, .25);
  color: rgb(var(--c-text));
  flex: 0 0 auto;
}
.wiki-tip-new { background: rgba(16, 185, 129, .1); border-color: rgba(16, 185, 129, .3); }
.wiki-tip button {
  margin-left: auto;
  padding: 3px 12px; font-size: 12px;
  border-radius: 6px; cursor: pointer;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text));
}
.wiki-tip button:hover { border-color: rgb(var(--c-brand)); color: rgb(var(--c-brand)); }

/* ── 态 A：文档墙 ── */
.wiki-wall {
  flex: 1; min-height: 0;
  overflow-y: auto;
  /* 右边 4px 是给滚动条留的；底部留一口气，否则最后一排卡片紧贴窗口下沿 */
  padding: 0 4px 18px 0;
}
.wiki-wall-sec { margin-bottom: 22px; }
.wiki-wall-sec-hd {
  display: flex; align-items: baseline; gap: 8px;
  margin-bottom: 10px;
  font-size: 13px; font-weight: 600;
  color: rgb(var(--c-text));
}
.wiki-wall-sec-hd .cnt {
  font-size: 11px; font-weight: 400;
  color: rgb(var(--c-text-mute));
  padding: 1px 8px;
  background: rgba(15,23,42,.06);
  border-radius: 10px;
}
.wiki-wall-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 12px;
}
.wiki-card {
  position: relative;
  display: flex; flex-direction: column;
  gap: 8px;
  padding: 14px 14px 12px;
  border-radius: 12px;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  cursor: pointer;
  text-align: left;
  transition: border-color .15s, transform .15s, box-shadow .15s;
  min-height: 104px;
}
.wiki-card:hover {
  border-color: rgb(var(--c-brand));
  transform: translateY(-2px);
  box-shadow: 0 8px 22px -12px rgba(15,23,42,.25);
}
.wiki-card:focus-visible {
  outline: 2px solid rgb(var(--c-brand));
  outline-offset: 2px;
}
.wiki-card.active { border-color: rgb(var(--c-brand)); background: rgb(var(--c-brand) / .07); }
.wiki-card-title {
  font-size: 13.5px; font-weight: 600; line-height: 1.45;
  color: rgb(var(--c-text));
  /* 长标题最多两行，超出省略——库里有「色花堂远程写手内容发布流程SOP（定稿）」这种 */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.wiki-card-meta {
  margin-top: auto;
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  font-size: 11px; color: rgb(var(--c-text-mute));
}
.wiki-fmt {
  padding: 1px 6px; border-radius: 4px;
  font-size: 10px; font-weight: 600; letter-spacing: .3px;
  background: rgba(15,23,42,.07);
  color: rgb(var(--c-text-mute));
}
.wiki-fmt.html { background: rgba(59,130,246,.12); color: #2563eb; }
.wiki-fmt.md   { background: rgba(139,92,246,.12); color: #7c3aed; }
.wiki-fmt.pdf  { background: rgba(220,38,38,.1);  color: #dc2626; }
.wiki-badge-new {
  position: absolute; top: 10px; right: 10px;
  padding: 1px 7px; border-radius: 999px;
  font-size: 10px; font-weight: 700; letter-spacing: .5px;
  background: #10b981; color: #fff;
}
.wiki-big { color: #d97706; }
.wiki-wall-empty {
  padding: 60px 20px; text-align: center;
  color: rgb(var(--c-text-mute)); font-size: 14px;
}

/* ── 态 B：阅读 ── */
.wiki-shell {
  flex: 1; min-height: 0;
  display: grid;
  grid-template-columns: 280px 1fr;
  gap: 14px;
}
.wiki-side {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  display: flex; flex-direction: column;
  overflow: hidden;
  min-width: 0;
}
.wiki-side-hd {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 12px;
  border-bottom: 1px solid rgb(var(--c-line));
  flex: 0 0 auto;
}
.wiki-back {
  width: 100%;
  padding: 6px 10px;
  border-radius: 8px;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  font-size: 12.5px; font-weight: 500;
  cursor: pointer; text-align: left;
}
.wiki-back:hover { border-color: rgb(var(--c-brand)); color: rgb(var(--c-brand)); }
#wikiTree { flex: 1; overflow-y: auto; padding: 8px 0 14px; }
.wiki-cat {
  padding: 9px 14px 4px;
  font-size: 11px; font-weight: 600;
  color: rgb(var(--c-text-mute));
  letter-spacing: .4px;
}

/* ═══════ v205：上传状态条（配色与结构在 v208 对齐既有组件）═══════
   同一个位置本来就有两条提示条（未分类提醒 .wiki-tip、新文档提醒 .wiki-tip-new），
   所以这条直接拿 .wiki-tip 当底，只补进度条和三种状态的配色——
   v205 时它自成一套：padding 差 1px、多一条左侧色条、按钮尺寸也不同，
   三条叠在一起就不像一个东西。配色也统一到项目既有口径
   （成功 #10b981、品牌 #3b82f6、危险 #dc2626），不再自带一套绿。 */
.wiki-upbar { flex-wrap: wrap; }
.wiki-upbar > .msg { flex: 1 1 200px; min-width: 0; }
.wiki-upbar b { font-weight: 600; word-break: break-all; }
/* .wiki-tip button 带 margin-left:auto，两个按钮时会被拆到两头 */
.wiki-upbar button { margin-left: 0; }
.wiki-upbar.busy { background: rgba(59,130,246,.1); border-color: rgba(59,130,246,.3); }
.wiki-upbar.ok   { background: rgba(16,185,129,.1); border-color: rgba(16,185,129,.3); }
.wiki-upbar.err  { background: rgba(220,38,38,.1);  border-color: rgba(220,38,38,.3); }
.wiki-upbar-pg {
  flex: 0 0 140px; height: 6px;
  border-radius: 4px; overflow: hidden;
  background: rgba(15,23,42,.12);
}
.wiki-upbar-pg i { display: block; height: 100%; background: rgb(var(--c-brand)); transition: width .15s linear; }
.wiki-upbar .pct {
  flex: 0 0 auto; font-size: 12px;
  color: rgb(var(--c-text-mute));
  font-variant-numeric: tabular-nums;
}
/* 传完在文档墙上把它闪一下——横条说「传好了」，这里让人真的看见它在哪 */
.wiki-card.flash { animation: wikiFlash 2.2s ease-out; }
@keyframes wikiFlash {
  0%, 100% { box-shadow: 0 0 0 0 rgba(16,185,129,0); }
  12%, 62% { box-shadow: 0 0 0 3px rgba(16,185,129,.5); }
}

/* v208：上传确认弹窗里的文件卡片 */
.wiki-up-file {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 12px;
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  background: rgb(var(--c-bg-3));
}
.wiki-up-file .nm {
  flex: 1; min-width: 0;
  font-size: 13px; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.wiki-up-file .sz { flex: 0 0 auto; font-size: 12px; color: rgb(var(--c-text-mute)); }

/* ═══════ v204：分类管理弹窗（样式在 v205 重做，v208 对齐既有口径）═══════ */
.cm-hint {
  font-size: 12px; line-height: 1.7;
  color: rgb(var(--c-text-mute));
  margin-bottom: 12px;
}
.cm-hint b { color: rgb(var(--c-text)); font-weight: 600; }
.wiki-catmgr {
  max-height: min(48vh, 360px); overflow-y: auto;
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  background: rgb(var(--c-bg-3));
}
.cm-empty { padding: 22px; text-align: center; color: rgb(var(--c-text-mute)); font-size: 12px; }

.wiki-catmgr-row {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 12px;
  border-bottom: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-3));
}
.wiki-catmgr-row:last-child { border-bottom: none; }
/* 拖拽手柄：给个明确的抓手，光靠整行 draggable 没人看得出来能拖 */
.wiki-catmgr-row .grip {
  flex: 0 0 auto; cursor: grab;
  color: rgb(var(--c-text-mute)); font-size: 15px; line-height: 1;
  padding: 2px 1px; user-select: none;
}
.wiki-catmgr-row .grip:active { cursor: grabbing; }
.wiki-catmgr-row.gone .grip { cursor: default; opacity: .4; }
.wiki-catmgr-row .nm {
  flex: 1; min-width: 0;
  font-size: 13px; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  cursor: text; padding: 3px 6px; margin: -3px -6px;
  border-radius: 6px;
}
/* 点名字就能改，所以要让人看出来它可点 */
.wiki-catmgr-row:not(.gone) .nm:hover {
  background: rgba(15,23,42,.06);
  box-shadow: inset 0 0 0 1px rgb(var(--c-line));
}
/* 行内编辑框跟弹窗里的 .form-row input 一个模样（同样的圆角、内边距、聚焦光晕） */
.wiki-catmgr-row .nm-edit {
  flex: 1; min-width: 0;
  font-size: 13px; font-weight: 500;
  background: rgb(var(--c-bg));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-brand));
  border-radius: 8px; padding: 3px 9px; outline: none;
  box-shadow: 0 0 0 3px rgb(var(--c-brand) / .18);
}
.wiki-catmgr-row .cnt {
  flex: 0 0 auto; font-size: 11px;
  color: rgb(var(--c-text-mute));
  padding: 1px 8px;
  background: rgba(15,23,42,.06);
  border-radius: 10px;
  white-space: nowrap;
}
.wiki-catmgr-row .ops { flex: 0 0 auto; display: flex; gap: 4px; }
.wiki-catmgr-row .act {
  padding: 3px 9px; font-size: 12px;
  border-radius: 6px; cursor: pointer;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-2));
  color: rgb(var(--c-text));
}
.wiki-catmgr-row .act.ord { padding: 3px 6px; font-size: 9px; color: rgb(var(--c-text-mute)); }
.wiki-catmgr-row .act:hover:not(:disabled) { border-color: rgb(var(--c-brand)); color: rgb(var(--c-brand)); }
.wiki-catmgr-row .act.del:hover { border-color: #dc2626; color: #dc2626; }
.wiki-catmgr-row .act:disabled { opacity: .3; cursor: not-allowed; }

/* 三种改动状态，一眼看出这行动过没有；配色沿用项目口径 */
.wiki-catmgr-row.fresh { background: rgba(16,185,129,.08); }
.wiki-catmgr-row.fresh .cnt { background: rgba(16,185,129,.16); color: #10b981; }
.wiki-catmgr-row.renamed { background: rgba(59,130,246,.08); }
/* 删除不让行消失：变灰划线 + 一个撤销按钮，保存才真删 */
.wiki-catmgr-row.gone { background: rgba(220,38,38,.08); }
.wiki-catmgr-row.gone .nm { text-decoration: line-through; opacity: .55; }
.wiki-catmgr-row.gone .cnt { color: #dc2626; background: rgba(220,38,38,.12); }
.wiki-catmgr-row.dragging { opacity: .4; }
.wiki-catmgr-row.over { box-shadow: inset 0 2px 0 0 rgb(var(--c-brand)); }

/* 跟页面上那条「未分类」提醒条长一个样，因为说的是同一件事 */
.cm-uncat {
  margin-top: 10px; padding: 8px 14px;
  border-radius: 10px; font-size: 13px; line-height: 1.6;
  color: rgb(var(--c-text));
  background: rgba(245,158,11,.1);
  border: 1px solid rgba(245,158,11,.25);
}
.cm-add { display: flex; gap: 8px; margin-top: 12px; }
.cm-new-input {
  flex: 1; min-width: 0;
  background: rgb(var(--c-bg));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  padding: 7px 10px; font-size: 13px; outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.cm-new-input:focus { border-color: rgb(var(--c-brand)); box-shadow: 0 0 0 3px rgb(var(--c-brand) / .18); }
/* 变更摘要：点保存之前就说清会发生什么 */
.cm-sum {
  margin-top: 12px; padding: 8px 12px;
  font-size: 12px; line-height: 1.5;
  border-radius: 8px;
  color: rgb(var(--c-text-mute));
  background: rgba(15,23,42,.04);
  border: 1px solid transparent;
}
.cm-sum.on {
  color: rgb(var(--c-text));
  background: rgba(59,130,246,.1);
  border-color: rgba(59,130,246,.3);
  font-weight: 500;
}

/* 窄屏：操作按钮换到第二行，否则 5 个元素挤在一行，分类名被压得只剩两个字 */
@media (max-width: 560px) {
  .wiki-catmgr-row { flex-wrap: wrap; row-gap: 6px; }
  .wiki-catmgr-row .nm { flex: 1 1 100%; order: 1; }
  .wiki-catmgr-row .grip { order: 0; }
  .wiki-catmgr-row .cnt { order: 2; }
  .wiki-catmgr-row .ops { order: 3; margin-left: auto; }
}
.wiki-cat-pick {
  padding: 4px 11px;
  border-radius: 999px;
  border: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  font-size: 12px; cursor: pointer;
}
.wiki-cat-pick:hover {
  border-color: rgb(var(--c-brand));
  color: rgb(var(--c-brand));
}

/* v202：左侧改成手风琴——一次只展开一个分类。
   原来 15 个文档按分类平铺，侧栏一屏放不下，找目标还得滚。 */
.wiki-cat-row {
  display: flex; align-items: center; gap: 8px;
  padding: 9px 14px;
  font-size: 12px; font-weight: 600;
  color: rgb(var(--c-text));
  cursor: pointer;
  user-select: none;
  border-left: 2px solid transparent;
}
.wiki-cat-row:hover { background: rgb(var(--c-bg-3)); }
.wiki-cat-row:focus-visible {
  outline: 2px solid rgb(var(--c-brand));
  outline-offset: -2px;
}
.wiki-cat-row .caret {
  font-size: 10px;
  color: rgb(var(--c-text-mute));
  transition: transform .15s ease;
  flex: 0 0 auto;
}
.wiki-cat-row.open .caret { transform: rotate(90deg); }
.wiki-cat-row.open {
  color: rgb(var(--c-brand));
  border-left-color: rgb(var(--c-brand));
}
.wiki-cat-row .nm {
  flex: 1; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.wiki-cat-row .cnt {
  flex: 0 0 auto;
  font-size: 11px; font-weight: 400;
  color: rgb(var(--c-text-mute));
  padding: 0 7px;
  background: rgba(15,23,42,.06);
  border-radius: 10px;
}
.wiki-cat-body { padding-bottom: 4px; }
.wiki-cat-body[hidden] { display: none; }
.wiki-doc {
  display: block; width: 100%;
  text-align: left;
  padding: 7px 14px 7px 18px;
  border: none; background: transparent;
  color: rgb(var(--c-text));
  font-size: 13px; line-height: 1.5;
  cursor: pointer;
  border-left: 2px solid transparent;
  /* 侧栏比原来宽 20px，但标题仍可能超长：两行截断，hover 有 title 兜底 */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.wiki-doc:hover { background: rgb(var(--c-bg-3)); }
.wiki-doc.active {
  background: rgb(var(--c-brand) / .1);
  border-left-color: rgb(var(--c-brand));
  color: rgb(var(--c-brand));
  font-weight: 500;
}
.wiki-doc .sz { font-size: 11px; color: rgb(var(--c-text-mute)); margin-left: 6px; }
.wiki-main {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  display: flex; flex-direction: column;
  overflow: hidden;
  min-width: 0;
}
.wiki-doc-hd {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px;
  border-bottom: 1px solid rgb(var(--c-line));
  font-size: 14px; font-weight: 600;
  flex: 0 0 auto;
}
.wiki-doc-hd #wikiDocMeta {
  font-size: 12px; font-weight: 400;
  color: rgb(var(--c-text-mute));
  margin-right: auto;
}
#wikiFrame { flex: 1; width: 100%; border: none; background: #fff; }

/* 加载骨架：库里最大的文档 34MB，加载要几秒，不能一片空白 */
.wiki-loading {
  flex: 1;
  display: flex; flex-direction: column;
  align-items: center; justify-content: center; gap: 14px;
  color: rgb(var(--c-text-mute)); font-size: 13px;
}
.wiki-spinner {
  width: 28px; height: 28px;
  border: 3px solid rgb(var(--c-line));
  border-top-color: rgb(var(--c-brand));
  border-radius: 50%;
  animation: wikiSpin .8s linear infinite;
}
@keyframes wikiSpin { to { transform: rotate(360deg); } }

/* ── Markdown 渲染（.md 原来直接塞进 iframe，显示的是裸源码）── */
.wiki-md {
  flex: 1; overflow-y: auto;
  padding: 28px 36px 60px;
  background: #fff;
  color: #1f2937;
  font-size: 15px; line-height: 1.75;
}
.wiki-md h1, .wiki-md h2, .wiki-md h3, .wiki-md h4 {
  color: #111827; font-weight: 600; line-height: 1.35;
  margin: 1.6em 0 .6em;
}
.wiki-md h1 { font-size: 26px; margin-top: 0; border-bottom: 1px solid #e5e7eb; padding-bottom: .4em; }
.wiki-md h2 { font-size: 20px; border-bottom: 1px solid #f0f1f3; padding-bottom: .3em; }
.wiki-md h3 { font-size: 16.5px; }
.wiki-md h4 { font-size: 15px; }
.wiki-md p { margin: .8em 0; }
.wiki-md ul, .wiki-md ol { margin: .7em 0; padding-left: 1.6em; }
.wiki-md li { margin: .3em 0; }
.wiki-md a { color: #2563eb; text-decoration: none; }
.wiki-md a:hover { text-decoration: underline; }
.wiki-md code {
  background: #f3f4f6; padding: .15em .4em;
  border-radius: 4px; font-size: .88em;
  font-family: ui-monospace, "JetBrains Mono", Consolas, monospace;
}
.wiki-md pre {
  background: #f8f9fb; border: 1px solid #e5e7eb;
  border-radius: 8px; padding: 14px 16px;
  overflow-x: auto; margin: 1em 0;
}
.wiki-md pre code { background: none; padding: 0; font-size: 13px; line-height: 1.6; }
.wiki-md blockquote {
  margin: 1em 0; padding: .4em 1em;
  border-left: 3px solid #d1d5db;
  color: #6b7280; background: #fafafa;
}
.wiki-md table { border-collapse: collapse; margin: 1em 0; width: 100%; font-size: 14px; }
.wiki-md th, .wiki-md td { border: 1px solid #e5e7eb; padding: 7px 12px; text-align: left; }
.wiki-md th { background: #f9fafb; font-weight: 600; }
.wiki-md hr { border: 0; border-top: 1px solid #e5e7eb; margin: 1.8em 0; }
.wiki-md img { max-width: 100%; }

@media (max-width: 900px) {
  #page-wiki.active { height: auto; }
  .wiki-shell { grid-template-columns: 1fr; }
  .wiki-wall { overflow: visible; }
  /* v245：原来 flex:1 在高度不定的列里把 60vh 顶掉了，iframe 实测只剩默认的 150px */
  #wikiFrame, .wiki-md { flex: none; height: calc(100vh - 190px); min-height: 360px; }
  .wiki-tools input { width: 130px; }
  /* v245：手机上阅读态只留「← 全部文档」+ 正文。原来筛选条、提示条、整棵文档树都堆在正文上面，
     点了卡片正文落在首屏以下，看起来像没反应；换文档回文档墙挑 */
  #page-wiki.wiki-reading .wiki-toolbar,
  #page-wiki.wiki-reading .wiki-tip,
  #page-wiki.wiki-reading #wikiTree { display: none !important; }
  #page-wiki.wiki-reading .wiki-side { border: none; background: none; }
  #page-wiki.wiki-reading .wiki-side-hd { padding: 0; border: none; }
  .wiki-doc-hd .btn-secondary { white-space: nowrap; flex: none; }
}


/* ═══════ 逾期提醒条（v185）═══════
   逾期不是状态分类（任务仍在待开始/进行中），所以不占 chip 位置，
   改成看板顶部一条提醒；有逾期才出现，点「只看逾期」就地筛出。 */
.overdue-bar {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 14px;
  margin: 0 0 10px;
  background: rgb(var(--c-err) / .08);
  border: 1px solid rgb(var(--c-err) / .25);
  border-radius: 10px;
  font-size: 13px;
  color: rgb(var(--c-err));
}
.overdue-bar[hidden] { display: none !important; }
.overdue-bar.active {
  background: rgb(var(--c-err) / .14);
  border-color: rgb(var(--c-err) / .45);
}
.overdue-bar-icon { flex: 0 0 auto; font-size: 14px; }
.overdue-bar #overdueBarText { flex: 1; font-weight: 500; }
.overdue-bar-btn {
  flex: 0 0 auto;
  background: transparent;
  border: 1px solid rgb(var(--c-err) / .4);
  color: rgb(var(--c-err));
  border-radius: 999px;
  padding: 3px 12px;
  font-size: 12px;
  cursor: pointer;
}
.overdue-bar-btn:hover { background: rgb(var(--c-err) / .12); }

/* ===== v191：看板主线/日常分区 + 复选框悬停提示 ===== */
/* 分区标题：比桶标题（.task-group-header）高一级，两类都有任务时才渲染 */
.board-section + .board-section { margin-top: 10px; }
.board-section-head {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 16px;
  background: rgba(59,130,246,.06);
  border-left: 3px solid #3b82f6;
  font-size: 12px; font-weight: 700;
  letter-spacing: .5px;
  color: #1d4ed8;
}
.board-section[data-section="daily"] .board-section-head {
  background: rgba(245,158,11,.08);
  border-left-color: #f59e0b;
  color: #b45309;
}
.board-section-head .bs-label { flex: 1; }
.board-section-head .bs-count {
  font-size: 11px; font-weight: 600;
  padding: 1px 8px;
  background: rgba(255,255,255,.7);
  border-radius: 10px;
}
/* 复选框悬停时显示这一下会做什么（▶ 开始 / ✓ 提交完成）。
   仍是同一个控件，不新增按钮——动作出口只有复选框和底部按钮栏两处。 */
.board-card-check[data-glyph]:hover::after {
  content: attr(data-glyph);
  font-size: 9px; line-height: 1; font-weight: 700;
  color: #3b82f6;
}
.board-card-check[data-glyph]:hover { border-color: #3b82f6; }

/* v192：今日页卡片的逾期日期 —— 红色，与看板列表的逾期日期同一套语义（不用 ⚠️） */
.chip.chip-date-overdue {
  background: rgb(var(--c-st-stop) / .12);
  color: rgb(var(--c-st-stop));
  border-color: rgb(var(--c-st-stop) / .35);
}

/* ==========================================================================
   v206：系统管理页（操作日志 + 系统设置）
   原来子 tab 的高亮是 JS 逐条写 inline style，没有 hover/focus 反馈；
   设置项全平铺在一张卡里，组织参数和任务分类糊成一片。这里统一收成类。
   ========================================================================== */

/* ── 设置详情里的字段 ── */
.set-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
  gap: 8px;
  margin-bottom: 10px;
}
.set-label {
  display: block;
  font-size: 12px; font-weight: 500;
  color: rgb(var(--c-text-mute));
  margin-bottom: 4px;
}
.set-input {
  width: 100%;
  box-sizing: border-box;
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  padding: 9px 12px;
  font-size: 13px;
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.set-input:focus {
  border-color: rgb(var(--c-brand));
  box-shadow: 0 0 0 3px rgb(var(--c-brand) / .15);
}
.set-input:disabled { opacity: .6; cursor: not-allowed; }
textarea.set-input { resize: vertical; line-height: 1.6; }
.set-actions {
  display: flex; align-items: center; justify-content: flex-end; gap: 8px;
  margin-top: 10px;
}
.set-hint { margin-right: auto; font-size: 12px; color: rgb(var(--c-text-mute)); }

/* ── 分类 chips ── */
.cat-chips {
  display: flex; flex-wrap: wrap; gap: 6px;
  min-height: 36px;
  padding: 7px 8px;
  background: rgb(var(--c-bg-3));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  margin-bottom: 10px;
}
.cat-chip {
  display: inline-flex; align-items: center; gap: 2px;
  padding: 4px 6px 4px 10px;
  background: rgb(var(--c-brand) / .15);
  color: rgb(var(--c-brand));
  border-radius: 12px;
  font-size: 12px;
  transition: background-color .15s;
}
.cat-chip:hover { background: rgb(var(--c-brand) / .25); }
/* 删除键原来只有 12px 且没有热区，点不中；这里给圆形热区 + 悬停变红 */
.cat-chip-del {
  display: inline-flex; align-items: center; justify-content: center;
  width: 16px; height: 16px;
  background: none; border: none;
  color: inherit; cursor: pointer;
  font-size: 14px; line-height: 1;
  border-radius: 50%;
  transition: background-color .15s, color .15s;
}
.cat-chip-del:hover { background: rgb(var(--c-err) / .2); color: rgb(var(--c-err)); }
.cat-chip-del:focus-visible { outline: 2px solid rgb(var(--c-brand) / .6); }

/* ── 操作日志筛选条 ── */
.logs-toolbar {
  display: flex; flex-wrap: nowrap; align-items: center; gap: 8px;
  margin-bottom: 12px;
  overflow-x: auto;   /* 真放不下就横向滚，不折成两行 */
}
.logs-toolbar .set-input { width: auto; flex: 1; min-width: 180px; }
.logs-toolbar select.set-input { flex: 0 0 auto; min-width: 130px; }
.logs-count { font-size: 12px; color: rgb(var(--c-text-mute)); white-space: nowrap; }

/* label 包着输入框时给一点间距（.set-label 自己的 margin 管的是整块） */
.set-label > .set-input { margin-top: 4px; }

/* ── 操作日志表格（原来每个 td 都内联一遍样式） ── */
.logs-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.logs-table thead tr { background: rgb(var(--c-bg-3)); }
.logs-table th {
  padding: 8px 10px; text-align: left;
  font-weight: 600; color: rgb(var(--c-text-mute));
  border-bottom: 1px solid rgb(var(--c-line));
  white-space: nowrap;
}
.logs-table td {
  padding: 8px 10px;
  border-bottom: 1px solid rgb(var(--c-line));
  color: rgb(var(--c-text));
}
.logs-table tbody tr { transition: background-color .12s; }
.logs-table tbody tr:hover { background: rgb(var(--c-bg-3) / .5); }
.logs-table .col-time { color: rgb(var(--c-text-mute)); white-space: nowrap; font-size: 12px; }
.logs-table .col-detail { color: rgb(var(--c-text-mute)); font-size: 12px; }
.log-role {
  font-size: 11px; color: rgb(var(--c-text-mute));
  background: rgb(var(--c-bg-3)); padding: 1px 6px; border-radius: 8px;
}
.log-action {
  display: inline-flex; align-items: center; gap: 4px;
  padding: 2px 8px; border-radius: 10px;
  font-size: 12px; font-weight: 500; white-space: nowrap;
}

/* ── v208：组织参数（中心 / 部门单选）──
   名单以权威文件为准，只能选不能改，所以没有自定义入口；
   一行一个字段，说明压成一句，避免原来那种一屏放不下两个分区的大留白。 */
.set-line {
  display: flex; align-items: center; gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 8px;
  font-size: 13px;
  color: rgb(var(--c-text));
}
.set-line-label {
  flex: 0 0 52px;
  font-size: 12px;
  color: rgb(var(--c-text-mute));
}
.set-line .set-input { flex: 1; min-width: 160px; }
.set-note {
  font-size: 12px; line-height: 1.5;
  color: rgb(var(--c-text-mute));
}
.set-note-tail { margin-left: auto; font-weight: 400; }
.set-link { color: rgb(var(--c-brand)); text-decoration: none; }
.set-link:hover { text-decoration: underline; }

.org-opts { display: flex; flex-wrap: wrap; gap: 6px; }
.org-opt {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px 10px;
  border: 1px solid rgb(var(--c-line));
  border-radius: 20px;
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text-mute));
  font-size: 12px;
  cursor: pointer;
  transition: background-color .15s, border-color .15s, color .15s;
}
.org-opt:hover { border-color: rgb(var(--c-brand) / .6); color: rgb(var(--c-text)); }
.org-opt input { accent-color: rgb(var(--c-brand)); cursor: pointer; margin: 0; }
.org-opt.on {
  background: rgb(var(--c-brand) / .12);
  border-color: rgb(var(--c-brand) / .45);
  color: rgb(var(--c-brand));
  font-weight: 500;
}

/* ── v210：系统管理的后台布局（左菜单 + 右详情）──
   原来是顶部两个子 tab，一个面板里堆三件事。现在左边一列分组菜单，
   右边只显示当前这一件事；菜单项带未保存的小圆点。 */
.admin-shell {
  display: grid;
  grid-template-columns: 172px minmax(0, 1fr);
  gap: 18px;
  min-height: 360px;
}
.admin-nav {
  border-right: 1px solid rgb(var(--c-line));
  padding-right: 10px;
  display: flex; flex-direction: column; gap: 2px;
}
.admin-nav-sec { display: flex; flex-direction: column; gap: 2px; }
.admin-nav-sec + .admin-nav-sec { margin-top: 10px; }
/* v227：分组名只是标签，不再可点可折叠 —— 一共 4 项，全展开一眼看完 */
.admin-nav-group {
  padding: 4px 10px;
  color: rgb(var(--c-text-mute));
  font-size: 12px; font-weight: 500;
}
.admin-nav-item {
  display: flex; align-items: center; gap: 8px; white-space: nowrap;
  width: 100%;
  padding: 8px 10px;
  border: none; border-radius: 8px;
  background: transparent;
  color: rgb(var(--c-text));
  font-size: 13px; text-align: left;
  cursor: pointer;
  transition: background-color .15s, color .15s;
}
.admin-nav-item:hover { background: rgb(var(--c-bg-3)); }
.admin-nav-item:focus-visible { outline: 2px solid rgb(var(--c-brand) / .5); outline-offset: -2px; }
.admin-nav-item.active {
  background: rgb(var(--c-brand) / .12);
  color: rgb(var(--c-brand));
  font-weight: 600;
}
.admin-nav-icon { font-size: 14px; line-height: 1; }
/* 哪个面板有没保存的改动，菜单上就亮一个点 */
.admin-nav-dot {
  margin-left: auto;
  width: 6px; height: 6px; border-radius: 50%;
  background: rgb(var(--c-warn));
}
.admin-detail { min-width: 0; padding-top: 2px; }
/* v227：面板标题栏 —— 左边标题（配置项里是面包屑），右边这个面板的操作按钮。
   按钮固定在这里，不用滚到内容底下去找「保存」。 */
.admin-detail-hd {
  display: flex; align-items: center; gap: 10px;
  min-height: 34px;
  padding-bottom: 12px;
  margin-bottom: 6px;
  border-bottom: 1px solid rgb(var(--c-line));
}
.adh-title {
  display: flex; align-items: center; gap: 8px; min-width: 0;
  font-size: 14px; font-weight: 600;
  color: rgb(var(--c-text));
}
.adh-crumb { color: rgb(var(--c-text-mute)); font-weight: 500; text-decoration: none; border-radius: 4px; }
.adh-crumb:hover { color: rgb(var(--c-brand)); }
.adh-crumb:focus-visible { outline: 2px solid rgb(var(--c-brand) / .5); outline-offset: 2px; }
.adh-sep { color: rgb(var(--c-text-mute) / .6); font-weight: 400; }
.adh-ops { margin-left: auto; display: flex; align-items: center; gap: 8px; flex: none; }
.adh-btn { padding: 6px 14px; font-size: 13px; min-height: 32px; white-space: nowrap; }
.adh-btn:disabled { opacity: .45; cursor: not-allowed; }
.set-dirty {
  font-size: 12px; font-weight: 500;
  color: rgb(var(--c-warn));
  background: rgb(var(--c-warn) / .12);
  padding: 2px 8px; border-radius: 10px;
  white-space: nowrap;
}
.set-dirty[hidden] { display: none; }

/* 查看态的值：纯文本，双击进编辑 */
.cfg-val { font-size: 13px; color: rgb(var(--c-text)); padding: 9px 0; line-height: 1.4; }
.cfg-val[title] { cursor: text; }
.cfg-empty { color: rgb(var(--c-text-mute)); }

/* 窄屏：菜单变成顶部一条横向滚动的 chip 行，4 项全在（v227 修：原来只露出当前分组那几项，
   另外两组的入口被一起藏掉了，手机上根本进不去「配置项」和「操作日志」） */
@media (max-width: 720px) {
  .admin-shell { grid-template-columns: 1fr; gap: 12px; }
  .admin-nav {
    flex-direction: row; flex-wrap: nowrap;
    overflow-x: auto;
    border-right: none;
    border-bottom: 1px solid rgb(var(--c-line));
    padding: 0 0 8px;
  }
  .admin-nav-sec { flex-direction: row; }
  .admin-nav-sec + .admin-nav-sec { margin-top: 0; }
  .admin-nav-group { display: none; }
  .admin-nav-item { width: auto; white-space: nowrap; min-height: 40px; }
  .admin-detail-hd { flex-wrap: wrap; }
  .adh-btn { min-height: 40px; }
}

/* ── v211：文字配置项的字数提示 ──
   写到八成变橙、写满变红。提示跟着输入框走，label 里的排在下方右侧，
   工具行里的（跟按钮同一行）就排在输入框后面。 */
.char-count {
  font-size: 11px;
  color: rgb(var(--c-text-mute));
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}
.set-label .char-count { display: block; text-align: right; margin-top: 3px; }
.cfg-ctrl .char-count { display: inline; margin-top: 0; }
.set-line .char-count { flex: 0 0 auto; align-self: center; }
.char-count.warn { color: rgb(var(--c-warn)); }
.char-count.full { color: rgb(var(--c-err)); font-weight: 600; }

/* ── v212：详情区「一行一个配置」──
   左边配置名 + 一句说明，右边控件；行与行之间一条细线。 */
.cfg-row {
  display: grid;
  grid-template-columns: 190px minmax(0, 1fr);
  gap: 20px;
  padding: 14px 0;
  border-top: 1px solid rgb(var(--c-line));
  align-items: center;
}
.cfg-row-wide { align-items: start; }
.cfg-row:first-child { border-top: none; padding-top: 4px; }
.cfg-meta { display: flex; align-items: center; gap: 6px; }
.cfg-name { font-size: 13px; font-weight: 500; color: rgb(var(--c-text)); }

.cfg-ctrl { min-width: 0; display: flex; align-items: center; gap: 10px; flex-wrap: nowrap; }
.cfg-ctrl > .set-input { flex: 1 1 auto; min-width: 0; width: auto; }
.cfg-ctrl > .char-count { flex: 0 0 auto; }
/* 表格那种整行控件不参与这套横排 */
.cfg-row-wide .cfg-ctrl { display: block; }
.cfg-add { display: flex; gap: 8px; align-items: center; }
.cfg-add .set-input { flex: 1; }
.cfg-add button { white-space: nowrap; }
@media (max-width: 720px) {
  .cfg-row { grid-template-columns: 1fr; gap: 8px; }
}

/* 日志新增列：ID / 登录名 / IP */
.logs-table .col-id { color: rgb(var(--c-text-mute)); font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.logs-table .col-who { white-space: nowrap; }
.logs-table .col-ip { color: rgb(var(--c-text-mute)); font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap; }
.log-uname { margin-left: 5px; font-size: 11px; color: rgb(var(--c-text-mute)); }

/* v212：日志表 7 列，详情区放不下就横向滚动；
   除「详情」外都不折行，否则「管理员」会被压成竖排 */
.table-wrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.logs-table { min-width: 720px; }
.logs-table td, .logs-table th { white-space: nowrap; }
.logs-table .col-detail {
  white-space: normal;
  min-width: 200px;
  word-break: break-word;
}
/* 工具条在窄一点的详情区里也能排成一行 */
.logs-toolbar .set-input { min-width: 120px; }
.logs-toolbar select.set-input { min-width: 110px; }

/* ── v213：枚举值管理表（任务分类 / 项目状态）──
   参考常见后台的「配置管理」页：搜索 + 批量操作条，下面一张带全选框的表格，
   行末是「修改 / 删除」文字链接。所有单元格一律不折行，宁可整表横向滚动。 */
.vt-box { display: block; }
.vt-search {
  flex: none; width: 200px;
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line));
  border-radius: 8px;
  padding: 6px 10px;
  font-size: 12px;
  outline: none;
  transition: border-color .15s, box-shadow .15s;
}
.vt-search:focus { border-color: rgb(var(--c-brand)); box-shadow: 0 0 0 3px rgb(var(--c-brand) / .15); }
.vt-count { font-size: 12px; color: rgb(var(--c-text-mute)); white-space: nowrap; }
.vt-btn { padding: 6px 14px; font-size: 12px; white-space: nowrap; }

.vt-wrap {
  border: 1px solid rgb(var(--c-line));
  border-radius: 10px;
  overflow-x: auto;
  background: rgb(var(--c-bg-2));
}
.vt-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.vt-table th {
  background: rgb(var(--c-bg-3));
  color: rgb(var(--c-text-mute));
  font-weight: 600; font-size: 12px;
  text-align: left;
  padding: 8px 10px;
  border-bottom: 1px solid rgb(var(--c-line));
}
.vt-table td {
  padding: 7px 10px;
  border-bottom: 1px solid rgb(var(--c-line));
  color: rgb(var(--c-text));
}
.vt-table tbody tr:last-child td { border-bottom: none; }
.vt-table tbody tr:hover { background: rgb(var(--c-bg-3) / .5); }
.vt-table tr.editing { background: rgb(var(--c-brand) / .06); }
/* 不折行是硬要求：宁可整表横向滚动，也别把「内容运营」压成一列竖字 */
.vt-table th, .vt-table td { white-space: nowrap; }
.vt-ck { width: 36px; }
.vt-ck input { accent-color: rgb(var(--c-brand)); cursor: pointer; margin: 0; vertical-align: middle; }
.vt-no { width: 44px; color: rgb(var(--c-text-mute)); font-variant-numeric: tabular-nums; }
.vt-name { width: 100%; }
.vt-act { width: 1%; text-align: right; }
.vt-input {
  width: 100%; max-width: 260px;
  background: rgb(var(--c-bg));
  color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-brand));
  border-radius: 6px;
  padding: 4px 8px;
  font-size: 13px;
  outline: none;
}
.vt-empty { text-align: center; color: rgb(var(--c-text-mute)); font-size: 12px; padding: 16px; }
/* 行内操作用文字链接，跟参考的后台一致 */
.vt-link {
  color: rgb(var(--c-brand));
  font-size: 12px;
  cursor: pointer;
  margin-left: 10px;
  user-select: none;
}
.vt-link:first-child { margin-left: 0; }
.vt-link:hover { text-decoration: underline; }
.vt-link.danger { color: rgb(var(--c-err)); }
.vt-link.mute { color: rgb(var(--c-text-mute)); }
.vt-link.mute:hover { color: rgb(var(--c-text)); }
.vt-link.off { opacity: .3; cursor: not-allowed; pointer-events: none; }

/* 表格这类宽控件：配置名在上、控件占满整行，不被左栏挤掉 */
.cfg-row-wide { grid-template-columns: minmax(0, 1fr); gap: 10px; }
.cfg-row-wide .cfg-meta { display: flex; align-items: center; gap: 6px; }

/* ── v214：说明收进小问号 ──
   后台天天用，解释看一次就够；长期占一行只是噪音。鼠标移上去才展开。 */
.hint-q {
  display: inline-flex; align-items: center; justify-content: center;
  width: 15px; height: 15px; flex: 0 0 15px;
  border: 1px solid rgb(var(--c-text-mute) / .45);
  border-radius: 50%;
  color: rgb(var(--c-text-mute));
  font-size: 10px; font-weight: 600; line-height: 1;
  cursor: help;
  position: relative;
  vertical-align: middle;
  transition: color .15s, border-color .15s;
}
.hint-q:hover { color: rgb(var(--c-brand)); border-color: rgb(var(--c-brand)); }
.hint-q::after {
  content: attr(data-tip);
  position: absolute; left: 50%; top: calc(100% + 7px);
  transform: translateX(-50%);
  width: max-content; max-width: 280px;
  padding: 7px 10px;
  background: rgb(17 24 39 / .96);
  color: #fff;
  border-radius: 7px;
  font-size: 12px; font-weight: 400; line-height: 1.6;
  text-align: left;
  white-space: normal;          /* 提示气泡里该换行就换行 */
  opacity: 0; pointer-events: none;
  transition: opacity .15s;
  z-index: 60;
}
.hint-q:hover::after, .hint-q:focus::after { opacity: 1; }   /* 键盘聚焦 / 手机点一下也能看 */
.hint-q:focus { outline: none; color: rgb(var(--c-brand)); border-color: rgb(var(--c-brand)); }
/* 靠右的问号把气泡往左收，免得超出卡片 */
.admin-detail-hd .hint-q::after, .cfg-meta .hint-q::after { left: 0; transform: none; }

/* ── v227：操作条 —— 搜索、数量、改动摘要、按钮排一行（原来筛选单独占一块灰底，
   几十个值用不着）。改动摘要是这一页最该被看见的东西：保存前知道自己改了什么。 */
.vt-bar {
  display: flex; align-items: center; gap: 10px;
  flex-wrap: wrap;
  margin: 12px 0 10px;
}
.vt-ops { margin-left: auto; display: flex; gap: 8px; flex-wrap: nowrap; }
.vt-btn.danger { color: rgb(var(--c-err)); border-color: rgb(var(--c-err) / .35); }
.vt-diff {
  font-size: 12px; font-weight: 500;
  color: rgb(var(--c-warn));
  background: rgb(var(--c-warn) / .1);
  border-radius: 6px;
  padding: 4px 10px;
}
/* 行上的改动标记 */
.vt-table tr.changed td:first-child { box-shadow: inset 3px 0 0 rgb(var(--c-warn)); }
.vt-tag {
  display: inline-block; margin-left: 8px;
  font-size: 11px; color: rgb(var(--c-text-mute));
  background: rgb(var(--c-bg-3));
  padding: 1px 6px; border-radius: 4px;
}
.vt-tag.new { color: rgb(var(--c-ok)); background: rgb(var(--c-ok) / .12); }
/* 拖动排序 */
.vt-drag { width: 22px; padding-right: 0 !important; }
.vt-grip {
  display: inline-block; cursor: grab;
  color: rgb(var(--c-text-mute) / .5);
  font-size: 12px; letter-spacing: -2px; user-select: none;
}
.vt-table tbody tr:hover .vt-grip { color: rgb(var(--c-text-mute)); }
.vt-table tr.dragging { opacity: .4; }
.vt-table tr.drop-before td { box-shadow: inset 0 2px 0 rgb(var(--c-brand)); }
.vt-table tr.drop-after td { box-shadow: inset 0 -2px 0 rgb(var(--c-brand)); }
.vt-name[data-i] { cursor: default; }
/* 配置项列表：整行可点 */
.vt-row-link { cursor: pointer; }
.vt-row-link:focus-visible { outline: 2px solid rgb(var(--c-brand) / .5); outline-offset: -2px; }
.vt-row-link:hover .vt-link { text-decoration: underline; }
@media (max-width: 720px) {
  .vt-search { width: 100%; flex: 1 1 100%; }
  .vt-ops { margin-left: 0; width: 100%; }
  .vt-ops .vt-btn { flex: 1; min-height: 40px; }
  .vt-drag { display: none; }           /* 触屏拖不动，靠 ↑↓ */
  .vt-link { display: inline-block; padding: 6px 2px; }
}

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

/* ── v217：配置项页（一张表列出所有枚举配置，点「修改」进去编辑）── */
.cfg-preview {
  color: rgb(var(--c-text-mute));
  max-width: 320px;
  overflow: hidden; text-overflow: ellipsis;   /* 值多了截断，鼠标悬停看全量 */
}

/* ═══════ v257：左侧固定导航（可收缩）+ 右侧内容自由伸展 ═══════
   宽屏：.app-header 变成固定在左侧的竖栏，.content 让出左边距占满剩余宽度。
   竖栏自上而下：品牌 + 收缩按钮 / 分组导航（含「工具」组：搜索、通知；自身可滚动）/ 头像。
   收缩：html.nav-collapsed，只留图标（title 做悬停提示），状态存 localStorage。
   ≤768px：回落为顶部横条（横条规则在 assets.css 顶部）。
   --app-header-h 在竖栏模式下由 syncAppHeaderVar 写 0，列表页照旧撑满一屏。 */
:root { --nav-w: 216px; }
/* 全站内容区统一留白：左右 --page-x、顶部 --page-top（窄屏收成 12px）。各页面都引用这两个变量，不再各写各的数 */
:root { --page-x: 16px; --page-top: 12px; --page-gap: 12px; }  /* 左右 / 顶部留白、卡片间距 */
@media (max-width: 768px) { :root { --page-x: 12px; } }
html.nav-collapsed { --nav-w: 64px; }

/* 导航分组标题 + 线性图标（v257，参考飞书式侧栏） */
.nav-group {
  padding: 14px 12px 4px; font-size: 12px; color: rgb(var(--c-text-mute) / .8);
  white-space: nowrap; user-select: none;
}
.nav-tabs > .nav-group:first-child { padding-top: 4px; }
.nav-tab svg.nav-ico { width: 18px; height: 18px; flex: none; }
.nav-tab.btn-bell { font-size: 14px; }
.nav-kbd {
  margin-left: auto; font: inherit; font-size: 11px; line-height: 1;
  padding: 3px 5px; border-radius: 4px;
  border: 1px solid rgb(var(--c-line)); color: rgb(var(--c-text-mute));
}

.nav-toggle {
  display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; flex: none; margin-left: auto;
  border: none; border-radius: 6px; background: transparent;
  color: rgb(var(--c-text-mute)); cursor: pointer;
}
.nav-toggle:hover { background: rgb(var(--c-bg-3)); color: rgb(var(--c-text)); }
.nav-toggle svg { transition: transform .18s ease; }

@media (min-width: 769px) {
  .app-header {
    position: fixed; top: 0; left: 0; bottom: 0;
    width: var(--nav-w);
    flex-direction: column; align-items: stretch; justify-content: flex-start;
    gap: 8px;
    padding: 12px 10px 10px;
    background: rgb(var(--c-bg-2));
    backdrop-filter: none;
    border-bottom: none;
    border-right: 1px solid rgb(var(--c-line));
    transition: width .18s ease;
  }
  .content { margin-left: var(--nav-w); transition: margin-left .18s ease; min-width: 0; }

  /* 品牌行 */
  .app-header .brand { padding: 0 0 10px 8px; border-bottom: 1px solid rgb(var(--c-line)); min-height: 40px; }
  .app-header .brand-text { min-width: 0; }
  .app-header .brand-title { font-size: 15px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
  .app-header .brand-sub { font-size: 10px; letter-spacing: .5px; white-space: nowrap; }

  /* 导航：竖排，占满中段，太多时自身滚动 */
  .nav-tabs { flex-direction: column; gap: 2px; flex: 1 1 auto; min-height: 0; overflow-y: auto; overflow-x: hidden; }
  .nav-tab { width: 100%; justify-content: flex-start; gap: 10px; padding: 9px 12px; white-space: nowrap; position: relative; flex: none; }
  .nav-tab.active::before {
    content: ""; position: absolute; left: -10px; top: 8px; bottom: 8px; width: 3px;
    border-radius: 0 3px 3px 0; background: rgb(var(--c-brand));
  }
  .nav-tab { color: rgb(var(--c-text) / .78); }

  /* 头像：竖栏底部，只留头像块（设置 / 退出在下拉菜单里） */
  .user-info { padding-top: 8px; border-top: 1px solid rgb(var(--c-line)); }
  .user-info .avatar-wrap { flex: 1 1 auto; min-width: 0; }
  .user-info .avatar-block { width: 100%; }
  .user-info .avatar-info { min-width: 0; }
  .user-info .avatar-name { overflow: hidden; text-overflow: ellipsis; }
  .user-info .avatar-caret { margin-left: auto; }
  .app-header .user-menu { top: auto; bottom: calc(100% + 8px); left: 0; right: auto; }

  /* ── 收缩态 ── */
  html.nav-collapsed .app-header .nav-txt,
  html.nav-collapsed .app-header .brand-text,
  html.nav-collapsed .app-header .avatar-info,
  html.nav-collapsed .app-header .avatar-caret { display: none; }
  html.nav-collapsed .app-header .brand { flex-direction: column; gap: 8px; padding-left: 0; }
  html.nav-collapsed .nav-toggle { margin-left: 0; }
  html.nav-collapsed .nav-toggle svg { transform: rotate(180deg); }
  /* 收起后分组标题变成细分隔线 */
  html.nav-collapsed .nav-group { font-size: 0; padding: 0; height: 1px; margin: 8px 10px; background: rgb(var(--c-line)); }
  html.nav-collapsed .nav-tabs > .nav-group:first-child { display: none; }
  html.nav-collapsed .nav-tab { justify-content: center; padding-left: 0; padding-right: 0; }
  html.nav-collapsed .user-info { justify-content: center; }
  html.nav-collapsed .user-info .avatar-wrap { flex: none; }
  html.nav-collapsed .user-info .avatar-block { width: auto; padding: 3px; }

  /* 内容：不再限宽，随可用宽度伸展；各模块顶部留白收紧，尽量贴顶 */
  .main-grid { max-width: none; padding: var(--page-top) var(--page-x) 16px; gap: var(--page-gap); }
  .board-toolbar { padding: var(--page-top) var(--page-x) 14px; }
  /* 任务列表视图原来左右贴边（v103 去掉了 padding），与其他页不齐 */
  .board-2col { padding: 0 var(--page-x) 16px; }
  #overdueBar { margin-left: var(--page-x); margin-right: var(--page-x); }
}

/* 窄屏：横条里不显示分组标题和快捷键，收缩按钮隐藏 */
@media (max-width: 768px) {
  .nav-tab { flex: none; }
  .nav-group, .nav-kbd, .nav-toggle { display: none; }
  /* 留白同样走变量（窄屏 --page-x = 12px） */
  .main-grid { padding: var(--page-top) var(--page-x) 16px; }
  .board-toolbar { padding: var(--page-top) var(--page-x) 12px; }
  .board-2col { padding: 0 var(--page-x) 12px; }
  #overdueBar { margin-left: var(--page-x); margin-right: var(--page-x); }
}

/* ── v258 全局下拉搜索面板（配合 app.js 末尾的 select 增强） ── */
.ss-pop {
  position: fixed; z-index: 10050; display: flex; flex-direction: column;
  max-height: 320px; padding: 6px;
  background: rgb(var(--c-bg-2)); color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line)); border-radius: 10px;
  box-shadow: 0 10px 30px rgba(15, 23, 42, .18);
}
.ss-q {
  flex: none; width: 100%; box-sizing: border-box; margin-bottom: 4px;
  padding: 6px 10px; font-size: 13px; outline: none;
  background: rgb(var(--c-bg-3)); color: rgb(var(--c-text));
  border: 1px solid rgb(var(--c-line)); border-radius: 7px;
}
.ss-q:focus { border-color: rgb(var(--c-brand)); }
.ss-list { overflow-y: auto; min-height: 0; }
.ss-opt {
  padding: 7px 10px; font-size: 13px; line-height: 18px; border-radius: 6px;
  cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ss-opt.is-active { background: rgb(var(--c-text) / .07); }
.ss-opt.is-sel { color: rgb(var(--c-brand)); font-weight: 600; }
.ss-opt.is-dis { opacity: .45; cursor: not-allowed; }
.ss-group { padding: 8px 10px 4px; font-size: 12px; color: rgb(var(--c-text-mute)); }
.ss-empty { padding: 14px 10px; font-size: 12px; text-align: center; color: rgb(var(--c-text-mute)); }
@media (max-width: 768px) { .ss-q { font-size: 16px; } }  /* 防止 iOS 聚焦时放大页面 */

/* ==========================================================================
   弹窗（v288：原来 app.html / admin.html 各有一份且 .modal-title 定义不同，合并到这里）
   统一结构：.modal-title（标题文字 + ✕）→ 内容 → .modal-footer（左：删除；右：取消 · 主按钮）
   ========================================================================== */
/* 模态框（紧凑） */
.modal {
  display: none;
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  align-items: center; justify-content: center;
  z-index: 1000;
  backdrop-filter: blur(4px);
}
.modal[style*="display: flex"], .modal.show { display: flex; }
/* ⚠️ 确认框必须压在所有弹窗之上。
   .modal 和 .modal-overlay 都是 z-index:1000，同层级时由 DOM 顺序决定谁在上面 ——
   而动态弹窗是 appendChild 到 body 末尾的，#confirmModal 是页面里的静态元素、位置靠前，
   于是「弹窗里改了东西点关闭」时，确认框被弹窗的半透明遮罩整个压住：
   看着就是又暗一层的黑屏，按钮还点不到。层级排序：弹窗 1000 < 浮层 1200 < 确认框 1400。 */
#confirmModal { z-index: 1400; }
.modal-content {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  padding: 0;
  max-width: 560px;
  width: 92%;
  max-height: 90vh;
  overflow: auto;
  box-shadow: 0 20px 60px rgba(0,0,0,.3);
}
.modal-overlay {
  position: fixed; inset: 0;
  background: rgba(0,0,0,.5);
  display: flex; align-items: center; justify-content: center;
  z-index: 1000;
  backdrop-filter: blur(4px);
}
.modal-overlay .modal {
  background: rgb(var(--c-bg-2));
  border: 1px solid rgb(var(--c-line));
  border-radius: 14px;
  padding: 0;
  max-width: 560px;
  width: 92%;
  max-height: 90vh;
  overflow: auto;
  box-shadow: 0 20px 60px rgba(0,0,0,.3);
  position: relative;
  display: block;
}
.modal-header {
  display: flex; align-items: center; justify-content: space-between;
  padding: 12px 18px;
  border-bottom: 1px solid rgb(var(--c-line));
}
.modal-title {
  display: flex; align-items: center; justify-content: space-between;
  gap: 12px;
  padding: 12px 18px;
  border-bottom: 1px solid rgb(var(--c-line));
  font-size: 14px; font-weight: 600;
}
.modal-title > :not(.modal-close) { flex: 1; min-width: 0; }
.modal-title > .modal-close { flex-shrink: 0; margin-left: auto; }
.modal-close {
  background: transparent; border: none;
  color: rgb(var(--c-text-mute));
  font-size: 20px; cursor: pointer;
  width: 28px; height: 28px;
  border-radius: 6px;
}
.modal-close:hover { background: rgb(var(--c-bg-3)); color: rgb(var(--c-text)); }
.modal-body { padding: 16px 18px; }
.modal-footer {
  padding: 10px 18px;
  border-top: 1px solid rgb(var(--c-line));
  display: flex; gap: 8px; justify-content: flex-end;
}

/* 静态弹窗（确认框、成员弹窗）是 .modal-header > .modal-title 两层，里层不能再带内边距和底线 */
.modal-header .modal-title { padding: 0; border-bottom: 0; display: block; }
/* 标题后面的灰字副标题（如「标记停滞」后面跟任务名） */
.modal-sub { margin-left: 8px; font-weight: 400; font-size: 13px; color: rgb(var(--c-text-mute)); }
.modal-title { font-size: 15px; }
/* 弹窗底部（全站唯一写法）：<div class="pm-footer">[删除] <span class="pm-spacer"></span> 取消 主按钮</div>
   吸底：内容再长，「保存」也一直看得见 */
.pm-footer, .modal-footer {
  display: flex; align-items: center; justify-content: flex-end; gap: 8px;
  padding: 12px 20px; border-top: 1px solid rgb(var(--c-line));
  background: rgb(var(--c-bg-3)); border-radius: 0 0 14px 14px;
}
.modal-overlay .modal > .pm-footer { position: sticky; bottom: 0; z-index: 2; }
.pm-footer .pm-spacer { flex: 1; }
.pm-footer :is(.btn-primary, .btn-secondary, .btn-danger, .btn-ok, .btn-danger-ghost),
.modal-footer :is(.btn-primary, .btn-secondary, .btn-danger, .btn-ok, .btn-danger-ghost) { padding: 8px 18px; }

/* 密码框小眼睛（app.js 自动包裹 type=password 输入框） */
.pwd-wrap { position: relative; display: block; width: 100%; }
.pwd-wrap > input { width: 100%; box-sizing: border-box; padding-right: 38px !important; }
.pwd-eye {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
  width: 30px; height: 30px; display: flex; align-items: center; justify-content: center;
  background: none; border: none; border-radius: 6px; padding: 0; cursor: pointer;
  color: rgb(var(--c-text-mute));
}
.pwd-eye:hover { color: rgb(var(--c-text)); background: rgb(var(--c-line) / .5); }

/* 账号设置里「还在用默认密码」提醒条 */
.pwd-default-tip {
  margin-bottom: 12px; padding: 10px 12px; border-radius: 8px; font-size: 13px; line-height: 1.6;
  color: rgb(var(--c-text)); background: rgb(var(--c-warn) / .14); border: 1px solid rgb(var(--c-warn) / .45);
}

/* ═══════ 在线人数 + 白天 / 夜晚切换 ═══════
   在线：品牌行下方一枚小胶囊（绿点 + 人数），点开浮层按小组列名单。
   主题按钮：头像块右侧；收起导航时和头像上下排。 */
.online-wrap { position: relative; }
.online-pill {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 5px 10px; border-radius: var(--r-pill);
  border: 1px solid rgb(var(--c-line)); background: transparent;
  color: rgb(var(--c-text-mute)); font-size: var(--fs-sm); cursor: pointer; white-space: nowrap;
}
.online-pill:hover, .online-pill[aria-expanded="true"] { background: rgb(var(--c-bg-3)); color: rgb(var(--c-text)); }
.online-pill:focus-visible, .theme-btn:focus-visible { outline: 2px solid rgb(var(--c-brand)); outline-offset: 2px; }
.online-dot {
  width: 7px; height: 7px; border-radius: 50%; flex: none;
  background: rgb(var(--c-ok)); box-shadow: 0 0 0 3px rgb(var(--c-ok) / .18);
}
.online-n { color: rgb(var(--c-text)); font-weight: 600; font-variant-numeric: tabular-nums; }
.online-pop {
  position: absolute; z-index: 300; top: calc(100% + 6px); left: 0;
  width: 260px; max-height: min(420px, 70vh); overflow-y: auto;
  padding: 12px; border-radius: var(--r-lg);
  background: rgb(var(--c-bg-2)); border: 1px solid rgb(var(--c-line));
  box-shadow: 0 12px 32px rgb(0 0 0 / .18);
}
.online-pop-hd { font-size: var(--fs-md); color: rgb(var(--c-text-mute)); margin-bottom: 8px; }
.online-pop-hd b { color: rgb(var(--c-text)); }
.online-grp + .online-grp { margin-top: 10px; padding-top: 10px; border-top: 1px dashed rgb(var(--c-line)); }
.online-grp-name { display: flex; justify-content: space-between; font-size: var(--fs-sm); color: rgb(var(--c-text-mute)); margin-bottom: 6px; }
.online-names { display: flex; flex-wrap: wrap; gap: 4px; }
.online-name {
  padding: 2px 8px; border-radius: var(--r-sm); font-size: var(--fs-sm);
  background: rgb(var(--c-bg-3)); color: rgb(var(--c-text));
}
.online-name.is-me { background: rgb(var(--c-brand) / .12); color: rgb(var(--c-brand)); }
.online-pop-ft { margin-top: 10px; font-size: var(--fs-xs); color: rgb(var(--c-text-mute)); line-height: 1.5; }

.theme-btn {
  display: inline-flex; align-items: center; justify-content: center;
  width: 32px; height: 32px; flex: none; border-radius: var(--r-md);
  border: none; background: transparent; color: rgb(var(--c-text-mute)); cursor: pointer;
}
.theme-btn:hover { background: rgb(var(--c-bg-3)); color: rgb(var(--c-text)); }

@media (min-width: 769px) {
  .online-wrap { padding: 0 2px; }
  .online-pill { width: 100%; }
  .online-pill .online-n { margin-left: auto; }
  /* 竖栏里浮层向右弹出，不挡导航 */
  .online-pop { top: 0; left: calc(100% + 12px); }
  html.nav-collapsed .online-pill { justify-content: center; padding: 5px 0; gap: 4px; }
  html.nav-collapsed .online-pill .online-n { margin-left: 0; }
  html.nav-collapsed .user-info { flex-direction: column; gap: 4px; }
}
/* 窄屏横条：品牌 / 在线 / 头像挤一行 —— 在线只留绿点 + 数字，头像去掉层级标签，主题切换改到头像菜单里 */
@media (max-width: 768px) {
  .online-wrap { margin-left: auto; }
  .online-pill { padding: 4px 8px; gap: 5px; }
  .online-pill .nav-txt { display: none; }
  .online-pop { left: auto; right: 0; }
  .app-header .theme-btn, .app-header .user-level { display: none; }
}
@media (min-width: 769px) { .user-menu-item.theme-item { display: none; } }
