:root {
  --bg: #ffffff;
  --fg: #1a1a1a;
  --muted: #6b7280;
  --faint: #9ca3af;
  --border: #e5e7eb;
  --border-soft: #f0f1f3;
  --accent: #185fa5;
  --accent-soft: #e6f1fb;
  --warn: #854f0b;
  --warn-soft: #faeeda;
  --danger: #a32d2d;
  --danger-soft: #fce9e9;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--bg);
  color: var(--fg);
  font-family: "Noto Sans SC", -apple-system, BlinkMacSystemFont,
               "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei",
               "Segoe UI", sans-serif;
  font-size: 15px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

a { color: inherit; text-decoration: none; }

::selection { background: #d8e8f7; }

.pill, .chip, .tab, .vtab { transition: border-color .12s, color .12s, background .12s; }

.wrap { max-width: 820px; margin: 0 auto; padding: 0 24px 80px; }

/* ---------- 布局 ---------- */
.layout {
  display: grid;
  grid-template-columns: 280px minmax(0, 1fr);
  max-width: 1400px;
  margin: 0 auto;
  padding: 28px 24px 80px;
}

.sidebar {
  position: sticky;
  top: 0;
  align-self: start;
  max-height: 100vh;
  overflow-y: auto;
  padding: 0 16px 48px 0;
  border-right: 1px solid var(--border-soft);
  scrollbar-width: thin;
}
.sidebar::-webkit-scrollbar { width: 6px; }
.sidebar::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }

.main { padding: 0 0 0 28px; min-width: 0; }

.sb-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 20px; }
.sb-title { font-size: 14px; font-weight: 500; }
.sb-reset { font-size: 12px; color: var(--muted); margin-left: auto; }
.sb-reset:hover { color: var(--accent); }

/* 筛选分组 */
.fg { margin-bottom: 22px; }
.fg h3 {
  font-size: 12px;
  font-weight: 500;
  color: var(--faint);
  margin: 0 0 8px;
  letter-spacing: .02em;
}
/* 两列网格：grid 默认按行填充，顺序就是从左到右、从上到下。
   minmax(0, 1fr) 而非 1fr —— 后者最小尺寸是 min-content，长机构名会把列撑破。 */
.pills {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 6px;
}
.pill {
  font-size: 12px;
  padding: 4px 10px;
  border-radius: 999px;
  border: 1px solid var(--border);
  color: var(--muted);
  background: #fff;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  line-height: 1.4;
  /* 侧边栏 232px，两列各约 102px。长的机构名不换行（否则 pill 高低不齐），
     极端情况下宁可截断也不撑破网格。 */
  min-width: 0;
  white-space: nowrap;
  overflow: hidden;
}
.pill:hover { border-color: var(--faint); color: var(--fg); }
.pill.on { background: var(--accent-soft); border-color: transparent; color: var(--accent); }
.pill .n { font-size: 11px; color: var(--faint); font-variant-numeric: tabular-nums; }
.pill.on .n { color: var(--accent); opacity: .65; }

.daterange { margin-top: 10px; display: flex; align-items: center; gap: 5px; }
.daterange input[type=date] {
  font-family: inherit;
  font-size: 12px;
  padding: 3px 6px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: #fff;
  color: var(--fg);
  width: 104px;
}
.daterange .dash { font-size: 12px; color: var(--faint); }
.daterange input[type=date]:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
.mini {
  font-family: inherit;
  font-size: 11px;
  padding: 3px 8px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: #fff;
  color: var(--muted);
  cursor: pointer;
}
.mini:hover { border-color: var(--faint); color: var(--fg); }

/* 抽屉控件：宽屏隐藏 */
.sb-toggle { display: none; }
.sb-scrim { display: none; }

/* ---------- 吸顶区：品牌页头 + 视图切换条 ----------
   两块一起吸顶，而不是各自 sticky —— 各自 sticky 得把前一块的高度
   写死成后一块的 top 值，改字号就会错位。包一层容器，高度由内容定。
   品牌区（.masthead）与切换条（.viewbar）本身都保持原样，只是容器吸顶。 */
.topbar {
  position: sticky;
  top: 0;
  z-index: 20;
  background: var(--bg);
}
/* 离开原位后才压一道浅影，和滚上来的列表分开。
   常态不画线：切换条自己那条细线已经够了，再叠一条会发密。
   .stuck 由页面脚本按 getBoundingClientRect().top 切换。 */
.topbar.stuck { box-shadow: 0 6px 12px -9px rgba(0, 0, 0, .28); }

/* ---------- 页头：只装品牌，两行 ----------
   第一行徽标 + 字标，第二行副标。切换与更新时间不在这里 ——
   它们归 .viewbar，是页头之下独立的一条。
   背景交给外层 .topbar；这里只留一条分界线。 */
.masthead {
  padding: 0 0 14px;
  border-bottom: 1px solid var(--border);
}
/* 徽标：两条支流先后汇入一根贯穿干流 —— 干流必须全宽，
   否则多条线向一点收拢，小尺寸下会被看成「>」箭头（09-14 重验） */
.brand-line {
  display: flex;
  align-items: center;
  gap: 10px;
}
.brand-mark { width: 24px; height: 24px; flex-shrink: 0; }
.brand-line h1 {
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 23px;
  font-weight: 600;
  letter-spacing: .14em;
  margin: 0;
  color: var(--fg);
}
/* 副标独占第二行。不跟字标挤一行 —— 两条「汇流」挨着读起来打结。
   左缘与徽标对齐，不缩进：缩进要靠写死的偏移量算，改徽标尺寸就会错位。 */
.brand-tag {
  font-size: 14px;
  color: var(--faint);
  letter-spacing: .03em;
  margin: 5px 0 0;
}
.refresh-msg { font-size: 12px; color: var(--muted); }
.btn {
  font-size: 13px;
  padding: 4px 12px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: transparent;
  color: var(--fg);
  cursor: pointer;
  font-family: inherit;
}
.btn:hover { border-color: var(--faint); background: #fafafa; }
.btn:disabled { color: var(--faint); cursor: default; }

/* ---------- 搜索 ---------- */
.searchbar {
  display: flex;
  gap: 8px;
  padding: 12px 0 14px;
  border-bottom: 1px solid var(--border);
}
.searchbar input[type=text] {
  flex: 1;
  min-width: 0;
  font-family: inherit;
  font-size: 14px;
  padding: 8px 12px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: #fff;
  color: var(--fg);
}
.searchbar input[type=text]:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }

.chips { display: flex; flex-wrap: wrap; gap: 6px; padding: 12px 0 0; }
.chip {
  font-size: 12px;
  padding: 4px 10px;
  border-radius: 999px;
  border: 1px solid var(--border);
  color: var(--muted);
  cursor: pointer;
  background: #fff;
}
.chip:hover { border-color: var(--faint); color: var(--fg); }
.chip.on {
  background: var(--accent-soft);
  border-color: transparent;
  color: var(--accent);
}

/* ---------- 时间流 ---------- */
.day-head {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 30px 0 0;
}
.day-head .day-date {
  font-size: 20px;
  font-weight: 500;
  color: var(--fg);
  letter-spacing: -0.02em;
}
.day-head .day-sub {
  font-size: 12px;
  color: var(--faint);
}
.day-line {
  height: 1px;
  background: var(--border);
  margin: 10px 0 16px;
}

.item {
  display: block;
  /* 负边距让 hover 的浅色底比正文宽出一点，像把整条托起来；
     分隔线仍跨满整行，列表的呼吸感不变。 */
  margin: 0 -10px;
  padding: 14px 10px;
  border-bottom: 1px solid var(--border-soft);
  border-radius: 8px;
  transition: background .12s;
}
.item:hover { background: #f6f9fc; }
.item:hover .title { color: var(--accent); }
/* 机构与栏目紧挨着排。之前用 space-between 把栏目顶到右端，
   眼睛要从标题左边跳到右边再回来才读完一行，改成左对齐连续阅读。 */
.item .item-head {
  display: flex;
  justify-content: flex-start;
  align-items: baseline;
  gap: 8px;
  font-size: 12px;
  margin-bottom: 8px;
}
.item .item-head .source {
  color: var(--accent);
  font-weight: 500;
}
.item .item-head .module {
  color: var(--faint);
  flex-shrink: 0;
}
.item .title {
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 17px;
  font-weight: 500;
  line-height: 1.5;
  margin: 0 0 6px;
  transition: color .12s;
}
.item .excerpt {
  font-size: 13px;
  color: var(--muted);
  line-height: 1.65;
  margin: 0 0 7px;
  display: -webkit-box;
  /* 3 行约 145 字，够放下摘要的中位长度（128 字）。压到 2 行会把
     「经研究，现就…调整如下」这类关键动作切掉，只剩半句。 */
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}
.meta { font-size: 12px; color: var(--faint); display: flex; gap: 9px; flex-wrap: wrap; align-items: center; }
.tag {
  font-size: 11px;
  padding: 1px 7px;
  border-radius: 4px;
  background: #f4f5f7;
  color: var(--muted);
}
.tag.src { background: var(--accent-soft); color: var(--accent); }
.tag.lv { background: #f4f5f7; color: var(--muted); }
.tag.warn { background: var(--warn-soft); color: var(--warn); }
.tag.danger { background: var(--danger-soft); color: var(--danger); }

/* ---------- 详情 ---------- */
.detail-head { padding: 26px 0 18px; border-bottom: 1px solid var(--border); margin-bottom: 22px; }
.detail-head h1 {
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 21px; font-weight: 500; line-height: 1.45; margin: 0 0 12px; }
.kv { display: grid; grid-template-columns: 82px 1fr; gap: 6px 14px; font-size: 13px; margin-top: 12px; }
.kv dt { color: var(--faint); }
.kv dd { margin: 0; color: var(--fg); }
.body-text { font-size: 15px; line-height: 1.85; white-space: pre-wrap; word-break: break-word; }
.body-text mark { background: #fde68a; padding: 0 1px; border-radius: 2px; }
.back { font-size: 13px; color: var(--muted); display: inline-block; margin-bottom: 14px; }
.back:hover { color: var(--accent); }

.empty { padding: 60px 0; text-align: center; color: var(--muted); font-size: 14px; }
.empty-mark { display: block; width: 44px; height: 44px; margin: 0 auto 14px; }
.pager {
  display: flex; flex-wrap: wrap; gap: 10px; align-items: center;
  justify-content: center; padding: 34px 0 0;
  font-size: 13px; color: var(--muted);
}
.page-go { display: flex; align-items: center; gap: 6px; margin-left: 6px; }
.page-go label { font-size: 12px; color: var(--faint); }
.page-go input[type=number] {
  font-family: inherit;
  font-size: 12px;
  width: 56px;
  padding: 3px 6px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: #fff;
  color: var(--fg);
  text-align: center;
  -moz-appearance: textfield;
}
.page-go input[type=number]::-webkit-outer-spin-button,
.page-go input[type=number]::-webkit-inner-spin-button { -webkit-appearance: none; margin: 0; }
.page-go input[type=number]:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-soft); }
.page-go .total { font-size: 12px; color: var(--faint); }
.hint { font-size: 12px; color: var(--faint); padding: 10px 0 0; }

/* ---------- 备案页脚 ----------
   合规要求：网站首页底部显著位置展示 ICP 备案号，并链接到工信部备案系统。
   占位号部署前要换成真实备案号（见模板里 index.html / detail.html 的注释）。 */
.site-foot {
  max-width: 1400px;
  margin: 0 auto;
  padding: 20px 24px 36px;
  text-align: center;
  font-size: 12px;
  color: var(--faint);
}
.site-foot a { color: var(--faint); }
.site-foot a:hover { color: var(--accent); }
/* 备案号与「管理」之间的分隔点。刻意不给「管理」单独做样式 ——
   它要和备案号一样安静，别把用户视线引到管理端上去 */
.site-foot .foot-sep { margin: 0 8px; }

/* ---------- 回到顶部按钮 ---------- */
.to-top {
  position: fixed;
  right: 24px;
  bottom: 24px;
  z-index: 40;
  font-family: inherit;
  font-size: 13px;
  line-height: 1;
  padding: 11px 16px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: #fff;
  color: var(--accent);
  box-shadow: 0 4px 14px rgba(0, 0, 0, .12);
  cursor: pointer;
  opacity: 0;
  visibility: hidden;
  transform: translateY(8px);
  transition: opacity .18s ease, transform .18s ease, visibility .18s;
}
.to-top.show { opacity: 1; visibility: visible; transform: translateY(0); }
.to-top:hover { background: var(--accent); color: #fff; border-color: var(--accent); }

/* 判断页的范围 / 排序切换：胶囊。用户端不用这个类，见下面的 .vtab。 */
.tab {
  font-size: 13px;
  padding: 5px 14px;
  border-radius: 999px;
  border: 1px solid var(--border);
  color: var(--muted);
  background: #fff;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  line-height: 1.4;
}
.tab:hover { border-color: var(--faint); color: var(--fg); }
.tab.on {
  background: var(--accent-soft);
  border-color: transparent;
  color: var(--accent);
  font-weight: 500;
}
.tab .n { font-size: 11px; color: var(--faint); }
.tab.on .n { color: var(--accent); opacity: .7; }

/* ---------- 用户端视图切换：页头之下的独立一条 ----------
   下划线而非胶囊 —— 侧栏整列铺的都是 pill，页头再放 pill 会分不清
   「这是导航还是筛选」；细横线也和列表的日期分组线同族。
   左侧放切换（全部在左、精选在右），右侧放更新时间。
   与页头同处 .topbar 吸顶区，这块会一直挂在顶上，所以留白压得比常规紧。 */
.viewbar {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
  padding: 12px 0 14px;
}
.tabs {
  display: flex;
  gap: 22px;
  flex-wrap: wrap;
  border-bottom: 1px solid var(--border-soft);
  flex-shrink: 0;
}
.vtab {
  font-size: 13px;
  padding: 0 0 8px;
  border-bottom: 2px solid transparent;
  margin-bottom: -1px;
  color: var(--muted);
  display: inline-flex;
  align-items: baseline;
  gap: 6px;
  line-height: 1.4;
}
.vtab:hover { color: var(--fg); border-bottom-color: var(--border); }
.vtab.on { color: var(--accent); font-weight: 500; border-bottom-color: var(--accent); }
.vtab .n { font-size: 11px; color: var(--faint); }
.vtab.on .n { color: var(--accent); opacity: .7; }
/* 更新时间：安静的小字，和 tab 文字底对齐（tabs 自身有 1px 底线）。
   只显示 09-14 21:21，年份和秒进 title —— 完整值在右端太重，
   还会在窄屏把切换条顶成两行。放不下时靠 .viewbar 的 flex-wrap
   自然落到下一行靠左，不要用 margin-left:auto
   （那个在换行后会被顶出视口，09-14 踩过）。 */
.updated {
  font-size: 12px;
  color: var(--faint);
  font-variant-numeric: tabular-nums;
  padding-bottom: 9px;
  /* 必须是不可收缩的整块：flex 默认 shrink:1，被压窄后文字会溢出盒子、
     贴着视口边缘被切掉（430px 实测踩到）。nowrap + shrink:0 之后，
     放不下就整体换行到下一行靠左。 */
  flex-shrink: 0;
  white-space: nowrap;
}
.review-link { margin-left: auto; font-size: 12px; padding: 4px 12px; }

/* ---------- 判断页 ---------- */
.rv { max-width: 980px; margin: 0 auto; padding: 28px 24px 80px; }

.rv-title-row { display: flex; align-items: baseline; gap: 14px; }
.rv-head h1 {
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 19px; font-weight: 500; margin: 0 0 6px; }
.back-link { font-size: 13px; color: var(--muted); margin-left: auto; }
.back-link:hover { color: var(--accent); }

.rv-sub {
  font-size: 13px;
  color: var(--muted);
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}
.rv-sub b { font-weight: 500; color: var(--fg); }
.rv-sub .dot { color: var(--border); }
.rv-sub .k-pick b { color: var(--warn); }
.rv-sub .k-drop b { color: var(--faint); }

.rv-progress {
  height: 4px;
  background: var(--border-soft);
  border-radius: 999px;
  margin: 10px 0 0;
  overflow: hidden;
}
.rv-bar {
  height: 100%;
  width: 0;
  background: var(--warn);
  border-radius: 999px;
  transition: width .2s ease;
}

.rv-scopes {
  display: flex;
  align-items: center;
  gap: 6px;
  flex-wrap: wrap;
  padding: 18px 0 12px;
  border-bottom: 1px solid var(--border);
}
.rv-hit { font-size: 12px; color: var(--faint); margin-left: auto; }
.rv-hit b { color: var(--fg); font-weight: 500; }

/* 排序切换。跟着 rv-hit 排在最右，用竖线隔开 */
.rv-sorts {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  font-size: 12px;
  color: var(--faint);
  padding-left: 14px;
  margin-left: 12px;
  border-left: 1px solid var(--border);
}

/* 按标题排序时的说明条。只在那种排序下出现，说清两档标记的区别 */
.rv-tip {
  font-size: 12px;
  color: var(--muted);
  background: var(--accent-soft);
  border-radius: 8px;
  padding: 9px 13px;
  margin-top: 12px;
  line-height: 1.75;
}
.rv-tip .grp { padding: 0 5px; }

.rv-filter {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
  padding: 14px 0;
}
.rv-filter input[type=text] {
  flex: 1 1 220px;
  min-width: 0;
  font-family: inherit;
  font-size: 13px;
  padding: 6px 10px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: #fff;
  color: var(--fg);
}
.rv-filter input[type=text]:focus { outline: none; border-color: var(--accent); }
.rv-filter select {
  font-family: inherit;
  font-size: 13px;
  padding: 6px 8px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: #fff;
  color: var(--fg);
  max-width: 190px;
}
.rv-filter select:focus { outline: none; border-color: var(--accent); }
.mini-link { font-size: 12px; color: var(--muted); }
.mini-link:hover { color: var(--accent); }
/* 登出链接：/admin 与 /review 的标题行都是 13px 链接，.mini-link 的
   12px 挨着会显得掉一档 */
.quit-link { font-size: 13px; }

.rv-bulk {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
  font-size: 12px;
  color: var(--faint);
  padding: 0 0 12px;
}
.rv-bulk-gap { flex: 1; }
.mini.warn { color: var(--warn); border-color: #e8d9be; }
.mini.warn:hover { border-color: var(--warn); color: var(--warn); background: var(--warn-soft); }

.rv-list { border-top: 1px solid var(--border); }
.rv-item {
  display: flex;
  gap: 16px;
  align-items: flex-start;
  padding: 14px 12px;
  border-bottom: 1px solid var(--border-soft);
  border-left: 3px solid transparent;
  transition: background .12s, opacity .12s;
}
/* 键盘光标用 outline 而不是左边框：左边框已经被纳入/不纳入的状态占用了 */
.rv-item.cur { outline: 2px solid var(--accent); outline-offset: -2px; border-radius: 4px; }
.rv-item.s-pick { border-left-color: var(--warn); background: #fdfaf5; }
.rv-item.s-drop { opacity: .45; background: #fafafa; }

/* 相邻分组。画在 inset 阴影上而不是 border-left —— 左边框已经被
   纳入/不纳入的状态占用了，判断完这条标记还在，能看出整组的归属。 */
.rv-item.g-same { box-shadow: inset 3px 0 0 var(--accent); }
.rv-item.g-weak { box-shadow: inset 3px 0 0 var(--border); }

/* 分组徽标。两档的颜色差别要一眼分得清：蓝=可放心连按，灰=还得自己看 */
.grp {
  display: inline-block;
  font-size: 11px;
  font-weight: 500;
  line-height: 1.6;
  padding: 1px 6px;
  border-radius: 4px;
}
.grp.g-same { color: var(--accent); background: var(--accent-soft); }
.grp.g-weak { color: var(--muted); background: var(--border-soft); }

.rv-main { flex: 1; min-width: 0; }
.rv-meta {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
  align-items: center;
  font-size: 12px;
  color: var(--faint);
  margin-bottom: 5px;
}
.rv-meta .source { color: var(--accent); font-weight: 500; }
.rv-title {
  display: block;
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 16px;
  font-weight: 500;
  line-height: 1.5;
  color: var(--fg);
  word-break: break-word;
}
.rv-title:hover { color: var(--accent); }
.rv-excerpt {
  font-size: 13px;
  color: var(--muted);
  line-height: 1.65;
  margin: 5px 0 0;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.rv-actions { display: flex; gap: 6px; flex-shrink: 0; }
.act {
  font-family: inherit;
  font-size: 12px;
  padding: 5px 11px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: #fff;
  color: var(--muted);
  cursor: pointer;
  white-space: nowrap;
}
.act:hover { border-color: var(--faint); color: var(--fg); }
.act.pick:hover { border-color: var(--warn); color: var(--warn); background: var(--warn-soft); }
.act.drop:hover { border-color: var(--faint); color: var(--fg); background: #f4f5f7; }
.act.undo { color: var(--faint); }
/* 已判断的状态下对应按钮常亮，扫一眼就知道这条判成了什么 */
.s-pick .act.pick { border-color: var(--warn); color: var(--warn); background: var(--warn-soft); }
.s-drop .act.drop { border-color: var(--faint); color: var(--fg); background: #f4f5f7; }

.rv-help {
  font-size: 12px;
  color: var(--faint);
  padding: 18px 0 0;
  text-align: center;
}

/* ---------- 窄屏：侧边栏变抽屉 ---------- */
@media (max-width: 1080px) {
  .layout { grid-template-columns: minmax(0, 1fr); padding: 0 20px 80px; }
  .main { padding: 18px 0 0; }

  .sb-toggle {
    display: inline-block;
    font-family: inherit;
    font-size: 13px;
    padding: 5px 14px;
    margin: 16px 0 0;
    border: 1px solid var(--border);
    border-radius: 999px;
    background: #fff;
    color: var(--fg);
    cursor: pointer;
  }
  .sb-toggle:hover { border-color: var(--faint); }

  .sidebar {
    position: fixed;
    left: 0;
    top: 0;
    bottom: 0;
    width: 280px;
    max-height: none;
    padding: 20px;
    background: #fff;
    border-right: 1px solid var(--border);
    transform: translateX(-100%);
    transition: transform .18s ease-out;
    z-index: 60;
  }
  .sidebar.open { transform: translateX(0); }

  .sb-scrim {
    display: block;
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, .28);
    opacity: 0;
    pointer-events: none;
    transition: opacity .18s;
    z-index: 50;
  }
  .sb-scrim.open { opacity: 1; pointer-events: auto; }
}

@media (max-width: 560px) {
  .layout { padding: 0 16px 60px; }
  .detail-head h1 { font-size: 19px; }
}

/* 窄屏下判断页的按钮挤不进一行，改成标题在上、按钮贴右下 */
@media (max-width: 680px) {
  .rv { padding: 20px 16px 70px; }
  .rv-item { flex-direction: column; gap: 10px; padding: 14px 10px; }
  .rv-actions { align-self: flex-end; }
  .rv-filter select { max-width: none; flex: 1 1 140px; }
  .rv-help { display: none; }
}

/* 主视图说明（.view-note）已下线 —— Lin 明确不要「从 N 条筛出 M 条 /
   剔除 N 条 / 与 X 直接相关」这类复述性文字。tab 上 2328 与 4790 两个
   数字并排摆着，本身就说明这个列表是被筛过的，不必再写一句。 */

/* ---------- 管理页 ----------
   与用户界面共用一套变量，不引入新的配色。
   管理页没有侧边栏，用单栏居中，宽度按表格能放下为准。 */
.adm {
  max-width: 900px;
  margin: 0 auto;
  padding: 28px 24px 80px;
}

.adm-head { margin-bottom: 28px; }
.adm-title-row {
  display: flex;
  align-items: baseline;
  gap: 14px;
  margin-bottom: 8px;
}
.adm-title-row h1 {
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 22px; font-weight: 500; margin: 0; }
.adm-back { font-size: 13px; color: var(--muted); margin-left: auto; }
.adm-back:hover { color: var(--accent); }

.adm-sub { font-size: 13px; color: var(--muted); display: flex; gap: 8px; flex-wrap: wrap; }
.adm-sub b { font-weight: 500; color: var(--fg); }
.adm-sub .dot { color: var(--faint); }

.adm-card {
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 20px 22px;
  margin-bottom: 16px;
}
.adm-card h2 { font-size: 15px; font-weight: 500; margin: 0 0 6px; }
.adm-desc { font-size: 13px; color: var(--muted); margin: 0 0 14px; line-height: 1.65; }

.adm-actions { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.adm-actions .btn { font-size: 13px; padding: 7px 14px; }
.mini-link { font-size: 12px; color: var(--muted); }
.mini-link:hover { color: var(--accent); }

.adm-msg { font-size: 13px; color: var(--muted); }
.adm-meta { margin-top: 12px; font-size: 12px; color: var(--faint); }

.adm-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13px;
  margin-top: 4px;
}
.adm-table th {
  text-align: left;
  font-weight: 500;
  color: var(--muted);
  font-size: 12px;
  padding: 8px 10px;
  border-bottom: 1px solid var(--border);
  white-space: nowrap;
}
.adm-table td {
  padding: 8px 10px;
  border-bottom: 1px solid var(--border-soft);
  color: var(--fg);
  vertical-align: top;
}
.adm-table tr.bad td { color: var(--danger); }
.adm-table .mono { font-size: 12px; color: var(--muted); white-space: nowrap; }
.adm-table .num { text-align: right; font-variant-numeric: tabular-nums; }

@media (max-width: 680px) {
  .adm { padding: 20px 16px 60px; }
  .adm-card { padding: 16px; }
  /* 表格在窄屏横向滚动，不挤压列宽导致内容换行成一团 */
  .adm-table { display: block; overflow-x: auto; white-space: nowrap; }
}

/* ---------- 周报 ----------
   周报页复用首页的 .masthead / .viewbar / .item / .day-head：
   两者是同一个信息架构，只是切片粒度从「天」换成「周」。
   这里只补周报独有的几块。 */

/* 首页 tabs 里的周报入口。它是跳转不是视图，所以不带 .on 的选中配色，
   只借这条导航的位置，让人找得到。 */
.wk-entry { color: var(--muted); }

/* 上一期 / 下一期。位置在 .updated 那一格，所以样式向它看齐。 */
.wk-step { font-size: 12px; color: var(--muted); margin-left: 12px; }
.wk-step:hover { color: var(--accent); }

.wk-head { padding: 24px 0 2px; }
.wk-range {
  font-family: "Noto Serif SC", "Songti SC", "STSong",
               "Noto Serif CJK SC", "SimSun", serif;
  font-size: 22px;
  font-weight: 600;
  letter-spacing: .02em;
  color: var(--fg);
}
.wk-sub {
  font-size: 12px;
  color: var(--faint);
  display: flex;
  gap: 7px;
  flex-wrap: wrap;
  margin-top: 6px;
  font-variant-numeric: tabular-nums;
}
.wk-dot { color: var(--border); }

/* AI 导读：整页唯一的强调块。条目列表本身是平的，导读要一眼分得出来；
   但也不做成通栏横幅 —— 它是提示，主体仍是下面那些条目。 */
.wk-digest {
  margin: 20px 0 4px;
  padding: 16px 18px;
  background: var(--accent-soft);
  border-radius: 10px;
}
.wk-digest-tag {
  font-size: 11px;
  letter-spacing: .1em;
  color: var(--accent);
  margin-bottom: 6px;
}
.wk-digest h2 {
  font-size: 16px;
  font-weight: 500;
  line-height: 1.5;
  margin: 0 0 8px;
  color: var(--fg);
}
/* 保留模型输出的换行，但不解析其中任何标记 —— 内容按纯文本转义后渲染 */
.wk-digest-body {
  font-size: 14px;
  line-height: 1.78;
  margin: 0;
  color: #24415f;
  white-space: pre-wrap;
}
.wk-digest-foot {
  font-size: 11px;
  line-height: 1.6;
  color: var(--accent);
  opacity: .72;
  margin-top: 10px;
}

.wk-note {
  font-size: 12px;
  line-height: 1.6;
  color: var(--muted);
  background: #fafafa;
  border: 1px solid var(--border-soft);
  border-radius: 8px;
  padding: 10px 12px;
  margin: 16px 0 0;
}

.wk-group { margin-top: 26px; }
.wk-group .day-head { margin-top: 0; }

/* 条目行内的日期。首页按天分组所以不必标，周报跨 7 天则必须看得见是哪天。
   位置紧跟在机构之后 —— 与 .module 同位，保持左对齐连续阅读，
   不推到右端（那是 .item-head 明确改掉的做法）。 */
.wk-date {
  color: var(--faint);
  font-variant-numeric: tabular-nums;
  flex-shrink: 0;
}

.wk-archive {
  margin-top: 46px;
  padding-top: 18px;
  border-top: 1px solid var(--border-soft);
}
.wk-archive h3 {
  font-size: 12px;
  font-weight: 500;
  color: var(--faint);
  letter-spacing: .02em;
  margin: 0 0 10px;
}
.wk-archive ul { list-style: none; margin: 0; padding: 0; }
.wk-archive li {
  display: flex;
  align-items: baseline;
  gap: 9px;
  font-size: 13px;
  padding: 5px 0;
  font-variant-numeric: tabular-nums;
}
.wk-archive a { color: var(--muted); }
.wk-archive a:hover { color: var(--accent); }
.wk-arc-n { font-size: 11px; color: var(--faint); }
.wk-arc-ai {
  font-size: 11px;
  color: var(--accent);
  background: var(--accent-soft);
  border-radius: 999px;
  padding: 1px 7px;
}

.wk-empty { padding: 44px 0 16px; }
.wk-empty p { font-size: 14px; margin: 0 0 10px; }
.wk-empty-why {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.75;
  max-width: 560px;
}
.wk-empty-act { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 16px; }

@media (max-width: 680px) {
  .wk-range { font-size: 19px; }
  .wk-digest { padding: 14px; }
  .wk-head { padding-top: 18px; }
}
