/* SM工作台 · 样式（零依赖原生 CSS）
   主色：墨青 #2F4F4F
   两档断点：≥1024 宽屏（左侧栏）｜ <1024 窄屏（底栏 + 单列）
   触屏铁律：无 hover 依赖、点击区 ≥44px
*/

:root {
  --ink: #2F4F4F;
  --ink-strong: #24393C;
  --ink-mid: #3E7272;
  --ink-soft: #DCE7E7;
  --ink-faint: #EDF3F2;
  --bg: #F4F6F5;
  --card: #FFFFFF;
  --line: #E2E7E5;
  --line-strong: #CBD5D3;
  --text: #22302F;
  --text-2: #566462;
  --text-3: #8A9795;
  --danger: #B4402F;
  --danger-soft: #FBEDEA;
  --warn: #A9761B;
  --warn-soft: #FBF3E2;
  --ok: #3D7A57;
  --ok-soft: #EAF4EE;
  /* v15.1：各分支进度里「当前环节」药丸的醒目标色（主人指定橙色系）。
     单独起一套 token，不借用 --ink-*，这样像素主题覆盖 ink 变量时也不会被改回蓝调。 */
  --stage-bg: #FFCE93;
  --stage-ink: #6B3200;
  --stage-line: #E58522;
  --radius: 14px;
  --radius-sm: 9px;
  --shadow: 0 1px 2px rgba(34, 48, 47, .05), 0 6px 20px rgba(34, 48, 47, .05);
  --tap: 44px;
}

* { box-sizing: border-box; -webkit-tap-highlight-color: transparent; }

html, body {
  margin: 0;
  padding: 0;
  height: 100%;
  background: var(--bg);
  color: var(--text);
  font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif;
  font-size: 14px;
  line-height: 1.6;
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, p { margin: 0; }
button { font-family: inherit; font-size: inherit; cursor: pointer; }
input, textarea, select { font-family: inherit; font-size: inherit; }
[hidden] { display: none !important; }

/* ---------- 通用按钮 ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-height: 38px;
  padding: 0 16px;
  border: 1px solid transparent;
  border-radius: 10px;
  background: transparent;
  color: var(--text);
  font-weight: 500;
  white-space: nowrap;
  transition: background .15s, border-color .15s, opacity .15s;
}
.btn:active { opacity: .75; }
.btn-primary { background: var(--ink); color: #fff; }
.btn-primary:hover { background: var(--ink-strong); }
.btn-ghost { border-color: var(--line-strong); color: var(--text-2); background: #fff; }
.btn-ghost:hover { border-color: var(--ink-mid); color: var(--ink); }
.btn-danger { background: var(--danger-soft); color: var(--danger); border-color: #EFD3CC; }
.btn-danger:hover { background: #F7E0DA; }
.btn-sm { min-height: 32px; padding: 0 11px; font-size: 13px; border-radius: 8px; }
.toolbar a.btn { text-decoration: none; }
.btn-block { width: 100%; }

/* ---------- 登录 ---------- */
.login-layer {
  position: fixed;
  inset: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: center;
  background: linear-gradient(160deg, #2F4F4F 0%, #24393C 100%);
  padding: 24px;
}
.login-box {
  width: 100%;
  max-width: 340px;
  background: #fff;
  border-radius: 18px;
  padding: 34px 28px 28px;
  box-shadow: 0 20px 50px rgba(0, 0, 0, .22);
}
.login-title { font-size: 24px; font-weight: 500; letter-spacing: 4px; color: var(--ink); text-align: center; }
.login-sub { text-align: center; color: var(--text-3); font-size: 13px; margin-top: 6px; letter-spacing: 1px; }
.login-input {
  width: 100%;
  min-height: var(--tap);
  margin-top: 22px;
  padding: 0 14px;
  border: 1px solid var(--line-strong);
  border-radius: 10px;
  font-size: 16px;
  outline: none;
}
.login-input:focus { border-color: var(--ink-mid); box-shadow: 0 0 0 3px var(--ink-faint); }
.login-btn { width: 100%; min-height: var(--tap); margin-top: 14px; letter-spacing: 4px; }
.login-err { min-height: 20px; margin-top: 10px; color: var(--danger); font-size: 13px; text-align: center; }

/* ---------- 图标（统一 stroke 风格，跟随当前文字色） ---------- */
.ico {
  width: 18px; height: 18px; flex: 0 0 auto;
  fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
}

/* ---------- 骨架 ---------- */
.app { height: 100vh; height: 100dvh; }
.app[hidden] { display: none; }

.sidebar {
  background: var(--ink);
  color: #DCE7E7;
  display: flex;
  flex-direction: column;
  padding: 18px 0 16px;
  overflow: hidden;
}
.side-nav { flex: 1; overflow-y: auto; -webkit-overflow-scrolling: touch; }

/* 侧栏底部操作区：刷新 / 记灵感（窄屏侧栏隐藏，改由顶栏与悬浮键承担） */
.side-foot {
  flex: 0 0 auto;
  padding: 14px 16px 2px;
  border-top: 1px solid rgba(255, 255, 255, .1);
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
/* 末位是奇数（管理员＝刷新 / 记灵感 / 退出登录 三个）→ 跨两列独占一行，不留空网格 */
.side-foot > .side-action:last-child:nth-child(odd) { grid-column: 1 / -1; }
.side-action {
  display: flex; align-items: center; justify-content: center; gap: 6px;
  min-height: var(--tap); padding: 0 8px;
  border: 1px solid rgba(255, 255, 255, .16);
  border-radius: 10px;
  background: rgba(255, 255, 255, .06);
  color: #C3D4D3;
  font-size: 13px;
  transition: background .15s, color .15s, border-color .15s;
}
.side-action:hover { background: rgba(255, 255, 255, .13); color: #fff; border-color: rgba(255, 255, 255, .3); }
.side-action:active { transform: scale(.98); }
.side-action.primary { background: #7FC7C0; border-color: #7FC7C0; color: #16302F; font-weight: 500; }
.side-action.primary:hover { background: #93D6CF; border-color: #93D6CF; color: #10262A; }
/* 退出登录：低调一档，不跟主操作抢眼 */
.side-action-exit { color: #A9BFBE; }
.brand { padding: 0 20px 16px; display: flex; align-items: baseline; gap: 8px; }
.brand-name { font-size: 18px; font-weight: 500; letter-spacing: 3px; color: #fff; }
.brand-sub { font-size: 11px; color: #8FA9A8; letter-spacing: 1px; }

.nav-group { margin-top: 14px; }
.nav-group-title {
  padding: 0 20px 8px;
  font-size: 11px;
  letter-spacing: 1.5px;
  color: #7E9B9A;
}
.nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  min-height: var(--tap);
  padding: 0 20px;
  color: #C3D4D3;
  border: none;
  background: transparent;
  width: 100%;
  text-align: left;
  font-size: 14px;
  border-left: 3px solid transparent;
}
.nav-item:hover { background: rgba(255, 255, 255, .06); color: #fff; }
.nav-item.active { background: rgba(255, 255, 255, .1); color: #fff; border-left-color: #7FC7C0; }
.nav-count { margin-left: auto; font-size: 12px; color: #8FA9A8; }
.nav-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; margin: 0 5px; }
.nav-ico { width: 18px; height: 18px; flex: 0 0 auto; display: flex; align-items: center; justify-content: center; }
.nav-ico .ico { width: 17px; height: 17px; }
.nav-add { color: #7FC7C0; font-size: 13px; }

.main { display: flex; flex-direction: column; min-width: 0; overflow: hidden; }
.topbar {
  display: flex;
  align-items: center;
  gap: 12px;
  min-height: 58px;
  padding: 0 20px;
  background: #fff;
  border-bottom: 1px solid var(--line);
  flex: 0 0 auto;
}
.topbar-title { font-size: 16px; font-weight: 500; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 游客登录时的只读角标 */
.role-badge {
  flex: 0 0 auto;
  padding: 3px 10px;
  border-radius: 999px;
  background: var(--warn-soft);
  color: var(--warn);
  font-size: 11.5px;
  white-space: nowrap;
}

/* 顶栏图标按钮：只在窄屏出现（宽屏的刷新/记灵感在侧栏底部） */
.icon-btn {
  display: inline-flex; align-items: center; gap: 5px;
  min-height: 38px; padding: 0 12px;
  border: 1px solid transparent;
  border-radius: 10px;
  background: transparent;
  color: var(--text-2);
  font-size: 13px;
  flex: 0 0 auto;
}
.icon-btn:hover { background: var(--ink-faint); color: var(--ink); }
.icon-btn:active { opacity: .7; }
/* 顶栏的退出登录：稍微退后一档，别跟「刷新」抢注意力 */
.icon-btn-exit { color: var(--text-3); }
.icon-btn-exit:hover { background: var(--danger-soft); color: var(--danger); }
@media (min-width: 1024px) { .icon-btn { display: none; } }

.view { flex: 1; overflow-y: auto; padding: 20px; -webkit-overflow-scrolling: touch; }
.view-inner { max-width: 1400px; margin: 0 auto; }

.tabbar { background: #fff; border-top: 1px solid var(--line); padding-bottom: env(safe-area-inset-bottom); }
.tab {
  flex: 1;
  min-height: 56px;
  border: none;
  background: transparent;
  color: var(--text-3);
  font-size: 12px;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 2px;
}
.tab.active { color: var(--ink); font-weight: 500; }
.tab-ico { display: flex; align-items: center; justify-content: center; height: 20px; }
.tab-ico .ico { width: 19px; height: 19px; }
/* 底栏 5 项，文字长了要能收 */
.tab-txt { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* 悬浮记灵感：只在窄屏显示（宽屏的「记灵感」在侧栏底部，避免重复又遮挡内容） */
.fab {
  display: none;
  position: fixed;
  right: 20px;
  bottom: calc(76px + env(safe-area-inset-bottom));
  z-index: 40;
  width: 54px;
  height: 54px;
  border-radius: 50%;
  border: none;
  background: var(--ink);
  color: #fff;
  align-items: center;
  justify-content: center;
  box-shadow: 0 6px 20px rgba(47, 79, 79, .38);
}
.fab .ico { width: 24px; height: 24px; stroke-width: 1.8; }
.fab:active { transform: scale(.94); }
@media (max-width: 1023px) { .fab { display: flex; } }

/* ---------- 断点：宽屏 ---------- */
@media (min-width: 1024px) {
  .app { display: grid; grid-template-columns: 246px 1fr; }
  .app[hidden] { display: none; }
  .tabbar { display: none; }
}
@media (max-width: 1023px) {
  .app { display: grid; grid-template-columns: 1fr; grid-template-rows: 1fr auto; }
  .app[hidden] { display: none; }
  .sidebar { display: none; }
  .tabbar { display: flex; }
}

/* ---------- 卡片网格 ---------- */
.cards { display: grid; gap: 14px; grid-template-columns: 1fr; }
@media (min-width: 700px) { .cards { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 1400px) { .cards { grid-template-columns: repeat(3, 1fr); } }

.card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  padding: 16px;
  box-shadow: var(--shadow);
}
.card-click { cursor: pointer; transition: border-color .15s, transform .15s; }
.card-click:hover { border-color: var(--ink-mid); }
.card-click:active { transform: scale(.995); }
.card-head { display: flex; align-items: center; gap: 10px; }
.card-title { font-size: 15px; font-weight: 500; flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.card-meta { color: var(--text-3); font-size: 12px; margin-top: 4px; }
.card-body { margin-top: 12px; }
.card-actions { display: flex; gap: 6px; margin-top: 12px; flex-wrap: wrap; }

/* ---------- 版本列表：三种形态（full 全展示 / mini 缩小 · 待办 / tiny 最窄一条 · 已收尾） ---------- */
.vbar { display: flex; align-items: center; gap: 10px; margin-bottom: 14px; flex-wrap: wrap; padding: 0 2px; }
.vbar-stats { color: var(--text-3); font-size: 12.5px; }
.vbar-hint { color: var(--text-3); font-size: 12px; margin-left: auto; }

.vwrap { align-self: start; }
.vwrap--full { grid-column: 1 / -1; }   /* 开发中那张完整卡片也整行宽：整列从上到下按版本号排，不用来回找 */
.vwrap--mini { grid-column: 1 / -1; }   /* 待办那条带一行内容，横贯整行更舒展 */

.vstrip {
  display: flex; align-items: center; gap: 10px;
  width: 100%;
  min-height: 46px;
  padding: 8px 14px;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  text-align: left;
  color: inherit;
  transition: border-color .15s, background .15s;
}
.vstrip:hover { border-color: var(--ink-mid); }
.vstrip:hover .vstrip-go { color: var(--ink-mid); transform: translateX(2px); }
.vstrip:focus-visible { outline: 2px solid var(--ink-mid); outline-offset: 2px; }

/* 条尾的小箭头：表示「点开看详情」——不是展开，所以没有旋转 */
.vstrip-go {
  margin-left: auto; flex: 0 0 auto;
  display: flex; align-items: center;
  color: var(--text-3);
  transition: color .15s, transform .15s;
}
.ico-chev { width: 15px; height: 15px; }

/* 「待办」组的收起条：右侧挂一个下拉，点开才露出其余的待办版本 */
.vwrap--grp { display: flex; align-items: stretch; gap: 8px; }
.vwrap--grp .vstrip { flex: 1 1 auto; min-width: 0; }
.vstrip-more {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 46px;
  padding: 0 12px;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius-sm);
  color: var(--text-2);
  font-size: 12.5px;
  white-space: nowrap;
  transition: border-color .15s, background .15s, color .15s;
}
.vstrip-more:hover { border-color: var(--ink-mid); color: var(--ink); background: var(--ink-faint); }
.vstrip-more:focus-visible { outline: 2px solid var(--ink-mid); outline-offset: 2px; }
.vstrip-more.open { border-color: var(--ink-mid); color: var(--ink); }
.vstrip-more-caret { font-size: 9px; color: var(--text-3); line-height: 1; }

.vstrip-ver { font-weight: 500; font-size: 13.5px; color: var(--ink); flex: 0 0 auto; white-space: nowrap; }
.vstrip-core {
  flex: 1 1 auto; min-width: 0;
  color: var(--text-3); font-size: 12.5px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.vstrip-date { color: var(--text-3); font-size: 12px; flex: 0 0 auto; white-space: nowrap; }

/* tiny（已上线 / 暂停等收尾态）：再收一档 —— 无底色、字更淡、不占额外行 */
.vstrip--tiny { background: transparent; border-color: var(--line); padding: 6px 13px; }
.vstrip--tiny .vstrip-ver { font-weight: 400; font-size: 12.5px; color: var(--text-2); }
.vstrip--tiny .vstrip-date { font-size: 11.5px; }
.vstrip--tiny:hover { background: var(--ink-faint); }

/* ---------- 进度条 / 统计 ---------- */
.stat-row { display: flex; gap: 14px; margin-top: 12px; flex-wrap: wrap; }
.stat { display: flex; flex-direction: column; }
.stat-num { font-size: 20px; font-weight: 500; color: var(--ink); line-height: 1.2; }
.stat-lbl { font-size: 11px; color: var(--text-3); }
.bar { height: 6px; border-radius: 3px; background: var(--ink-faint); overflow: hidden; margin-top: 10px; }
.bar-fill { height: 100%; background: var(--ink-mid); transition: width .3s; }

/* ---------- 标签 / 徽标 ---------- */
.tag {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 9px;
  border-radius: 999px;
  background: var(--ink-faint);
  color: var(--ink);
  font-size: 11.5px;
  white-space: nowrap;
}
.tag-line { border: 1px solid var(--line-strong); background: #fff; color: var(--text-2); }
.tag-ok { background: var(--ok-soft); color: var(--ok); }
.tag-warn { background: var(--warn-soft); color: var(--warn); }
.tag-danger { background: var(--danger-soft); color: var(--danger); }
.tag-mute { background: #F1F3F2; color: var(--text-3); }
.tag-row { display: flex; gap: 6px; flex-wrap: wrap; align-items: center; }

/* ---------- 工具条 / 筛选 ---------- */
.toolbar { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; margin-bottom: 16px; }
.toolbar-spacer { flex: 1; }

/* ---------- 二级分类：项目 / 灵感 ---------- */
.cat-tabs {
  display: flex;
  gap: 4px;
  background: var(--ink-faint);
  border-radius: 12px;
  padding: 4px;
  margin-bottom: 16px;
  max-width: 340px;
}
.cat-tab {
  flex: 1;
  min-height: 40px;
  padding: 0 10px;
  border: none;
  border-radius: 9px;
  background: transparent;
  color: var(--text-2);
  font-size: 14px;
  font-weight: 500;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  transition: background .15s, color .15s;
}
.cat-tab:hover { color: var(--ink); }
.cat-tab.active { background: #fff; color: var(--ink); box-shadow: 0 1px 3px rgba(34, 48, 47, .12); }
.cat-tab-num { font-size: 11.5px; color: var(--text-3); font-weight: 400; }
.cat-tab.active .cat-tab-num { color: var(--ink-mid); }

/* ---------- 三级分类：任务 / 版本 / 成员 ---------- */
.seg {
  display: inline-flex;
  gap: 2px;
  background: var(--ink-faint);
  border-radius: 10px;
  padding: 3px;
  margin-bottom: 16px;
  flex-wrap: wrap;
}
.seg-btn {
  min-height: 36px;
  padding: 0 14px;
  border: none;
  border-radius: 8px;
  background: transparent;
  color: var(--text-2);
  font-size: 13px;
}
.seg-btn:hover { color: var(--ink); }
.seg-btn.active { background: #fff; color: var(--ink); font-weight: 500; box-shadow: 0 1px 3px rgba(34, 48, 47, .12); }
.toolbar .seg { margin-bottom: 0; }

/* ---------- 灵感：标签快速筛选 ---------- */
.tag-filter { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 16px; }
.chip-filter {
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 36px; padding: 0 14px;
  border: 1px solid var(--line-strong); border-radius: 999px;
  background: #fff; color: var(--text-2); font-size: 12.5px;
  transition: background .15s, border-color .15s, color .15s;
}
.chip-filter:hover { border-color: var(--ink-mid); color: var(--ink); }
.chip-filter.on { background: var(--ink); border-color: var(--ink); color: #fff; }
.chip-filter-num { font-size: 11px; opacity: .65; }
.filter-note {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  font-size: 12.5px; color: var(--text-3); margin: -6px 0 14px;
}
.link-btn {
  border: none; background: transparent; padding: 6px 2px;
  color: var(--ink-mid); font-size: 12.5px; text-decoration: underline;
}

/* ---------- 灵感：置顶 ---------- */
.card-pinned { border-color: var(--ink-mid); box-shadow: 0 2px 10px rgba(47, 79, 79, .12); }
.pin-badge { display: inline-flex; align-items: center; color: var(--ink-mid); flex: 0 0 auto; }
.pin-badge .ico { width: 16px; height: 16px; }
.section-title { font-size: 14px; font-weight: 500; margin: 24px 0 10px; display: flex; align-items: center; gap: 8px; }
.section-title:first-child { margin-top: 0; }
.section-title .tag { font-weight: 400; }
.section-note { color: var(--text-3); font-size: 12px; margin: -4px 0 12px; }

.empty { padding: 34px 20px; text-align: center; color: var(--text-3); font-size: 13px; background: #fff; border: 1px dashed var(--line-strong); border-radius: var(--radius); }

/* ---------- 列表 ---------- */
.list { background: #fff; border: 1px solid var(--line); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow); }
.row { display: flex; align-items: center; gap: 12px; padding: 12px 14px; border-bottom: 1px solid var(--line); min-height: var(--tap); }
.row:last-child { border-bottom: none; }
.row-main { flex: 1; min-width: 0; }
.row-title { font-size: 14px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.row-title.done { text-decoration: line-through; color: var(--text-3); }
.row-sub { font-size: 12px; color: var(--text-3); margin-top: 2px; display: flex; gap: 8px; flex-wrap: wrap; }
.row-actions { display: flex; gap: 6px; flex: 0 0 auto; }
.check {
  width: 24px; height: 24px; flex: 0 0 auto;
  border: 1.5px solid var(--line-strong); border-radius: 7px;
  background: #fff; display: flex; align-items: center; justify-content: center;
  color: transparent; font-size: 14px;
  position: relative;
}
.check::after { content: ''; position: absolute; inset: -10px; }
.check.on { background: var(--ink); border-color: var(--ink); color: #fff; }
/* 游客只读：勾选框只作展示，不响应点击（扩大点击区的透明层也去掉） */
.check.static { cursor: default; }
.check.static::after { display: none; }

/* ---------- Life 待办：直接平铺展示（2026-09-30 起不再折叠） ---------- */

/* ---------- 配置中心 ---------- */
/* 分域标题：把「工作区设置」和「生活区设置」在视觉上彻底切开 */
.cfg-section-head {
  display: flex;
  align-items: baseline;
  gap: 10px;
  flex-wrap: wrap;
  font-size: 13px;
  font-weight: 500;
  color: var(--ink);
  letter-spacing: 1px;
  margin: 28px 0 12px;
  padding-left: 10px;
  border-left: 3px solid var(--ink-mid);
}
.cfg-section-head:first-child { margin-top: 0; }
.cfg-section-note { font-size: 11.5px; color: var(--text-3); font-weight: 400; letter-spacing: 0; }

.cfg-card { background: #fff; border: 1px solid var(--line); border-radius: var(--radius); padding: 16px; box-shadow: var(--shadow); margin-bottom: 14px; }
.cfg-head { display: flex; align-items: center; gap: 10px; margin-bottom: 4px; }
.cfg-name { font-size: 15px; font-weight: 500; flex: 1; }
.cfg-desc { color: var(--text-3); font-size: 12px; margin-bottom: 12px; }
.chip-list { display: flex; flex-wrap: wrap; gap: 8px; }
.chip {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 0 5px 0 14px;
  min-height: 40px;
  border: 1px solid var(--line-strong);
  border-radius: 999px;
  background: #fff;
  color: var(--text-2);
  font-size: 13px;
}
.chip-x { width: 30px; height: 30px; border: none; background: transparent; color: var(--text-3); border-radius: 50%; font-size: 14px; }
.chip-x:hover { background: var(--danger-soft); color: var(--danger); }
.chip-actions { display: flex; gap: 4px; }
.chip-btn { width: 30px; height: 30px; border: none; background: transparent; color: var(--text-3); border-radius: 50%; font-size: 13px; }
.chip-btn:hover { background: var(--ink-faint); color: var(--ink); }
.chip-add {
  display: inline-flex; align-items: center; gap: 6px;
  min-height: 34px; padding: 0 14px;
  border: 1px dashed var(--line-strong); border-radius: 999px;
  background: #fff; color: var(--ink-mid); font-size: 13px;
}
.chip-add:hover { border-color: var(--ink-mid); background: var(--ink-faint); }

/* 内联新建（下拉旁 + 新建） */
.inline-add { display: flex; gap: 6px; margin-top: 8px; }
.inline-add input { flex: 1; }

/* ---------- 表单 ---------- */
.field { margin-bottom: 14px; }
.field-label { display: block; font-size: 12.5px; color: var(--text-2); margin-bottom: 6px; }
.field-label .req { color: var(--danger); margin-left: 2px; }
.input, .select, .textarea {
  width: 100%;
  min-height: var(--tap);
  padding: 9px 12px;
  border: 1px solid var(--line-strong);
  border-radius: 10px;
  background: #fff;
  color: var(--text);
  font-size: 15px;
  outline: none;
}
.textarea { min-height: 96px; resize: vertical; line-height: 1.6; font-size: 14px; }
.input:focus, .select:focus, .textarea:focus { border-color: var(--ink-mid); box-shadow: 0 0 0 3px var(--ink-faint); }
.field-row { display: flex; gap: 10px; }
.field-row > * { flex: 1; min-width: 0; }
.field-hint { font-size: 11.5px; color: var(--text-3); margin-top: 5px; }

.select-row { display: flex; gap: 6px; align-items: center; }
.select-row .select { flex: 1; }

/* ---------- 弹窗 ---------- */
.modal-layer {
  position: fixed; inset: 0; z-index: 60;
  background: rgba(25, 38, 37, .42);
  display: flex; align-items: center; justify-content: center;
  padding: 20px;
}
.modal {
  width: 100%; max-width: 520px;
  max-height: 88vh;
  background: #fff; border-radius: 16px;
  display: flex; flex-direction: column;
  box-shadow: 0 24px 60px rgba(0, 0, 0, .22);
}
.modal-head { display: flex; align-items: center; gap: 12px; padding: 16px 18px; border-bottom: 1px solid var(--line); flex: 0 0 auto; }
.modal-title { font-size: 16px; font-weight: 500; flex: 1; }
.modal-close { width: 40px; height: 40px; border: none; background: transparent; color: var(--text-3); border-radius: 8px; font-size: 18px; }
.modal-close:hover { background: var(--bg); color: var(--text); }
.modal-body { padding: 18px; overflow-y: auto; flex: 1; }
.modal-foot { display: flex; gap: 10px; justify-content: flex-end; padding: 14px 18px; border-top: 1px solid var(--line); flex: 0 0 auto; flex-wrap: wrap; }
.modal-foot .btn { min-height: var(--tap); }

/* 头部右侧按钮组（v10）：标题与「记下 / 取消」同一行。
   比底部那排再小一号 —— 头部这一行本来就在，加按钮几乎不额外占高度；
   底部整条按钮栏因此可以直接撤掉，省下的高度全归正文。 */
.modal-head--acts { gap: 8px; }
.head-act {
  flex: 0 0 auto;
  display: inline-flex; align-items: center; justify-content: center;
  min-height: 34px; padding: 0 15px;
  border: 1px solid var(--line-strong); border-radius: var(--radius-sm);
  background: #fff; color: var(--text-2);
  font-size: 13.5px; font-weight: 500; line-height: 1; cursor: pointer;
  transition: border-color .15s, color .15s, background .15s;
}
.head-act:hover { border-color: var(--ink-mid); color: var(--ink); }
.head-act:active { background: var(--ink-soft); }
.head-act--primary { border-color: transparent; background: var(--ink); color: #fff; }
.head-act--primary:hover { background: var(--ink-strong); color: #fff; }
.head-act--primary:active { background: var(--ink-strong); }
.head-act--danger { border-color: transparent; background: var(--danger-soft); color: var(--danger); }
.head-act--danger:hover { border-color: var(--danger); color: var(--danger); background: var(--danger-soft); }

/* ---------- 记灵感弹窗（第一步：只写「标题 + 正文」） ----------
   归属 / 状态 / 标签已经挪到第二步的小弹窗（.modal-idea-confirm）；
   这一层只剩「细长标题条 + 格式条 + 正文」，版面几乎全给正文。
   v10 起底部那条按钮栏整块撤掉 ——「记灵感 ｜ 删除这条 记下 取消」全挤在头部一行。
   v11（2026-09-28）再让路给正文：弹窗 93vh→95vh，头部 / 标题条 / 格式条各收几像素，
   正文区在 1440×900 下实测能多拿约 40px。 */
.modal.modal-idea { max-width: 860px; height: 95vh; max-height: 95vh; }
.modal-idea .modal-head { padding: 6px 14px; min-height: 48px; }
.modal-idea .modal-title { font-size: 14px; font-weight: 500; color: var(--text-2); }
.modal-idea .modal-body { display: flex; flex-direction: column; gap: 8px; padding: 10px 18px 12px; }
.modal-idea .idea-title {
  border: none; border-bottom: 1px solid var(--line); border-radius: 0;
  padding: 4px 0; min-height: 44px;
  font-size: 22px; font-weight: 500;
  background: transparent;
}
.modal-idea .idea-title:focus { border-bottom-color: var(--ink-mid); box-shadow: none; }
.modal-idea .idea-body { flex: 1; min-height: 0; display: flex; flex-direction: column; margin-bottom: 0; }
/* 内容区高度全靠 flex 分配：绝不用大 min-height 硬撑 —— 一撑破父容器，
   后面的东西就会压上来叠在一起（2026-09-28 修的手机端错乱就是这个） */
.modal-idea .idea-text {
  flex: 1; min-height: 0; overflow-y: auto;
  border: 1px solid var(--line-strong); border-radius: 12px;
  background: #fff; color: var(--text); outline: none;
  font-size: 15.5px; line-height: 1.85; padding: 16px 18px;
}
.modal-idea .idea-text:focus { border-color: var(--ink-mid); box-shadow: 0 0 0 3px var(--ink-faint); }
/* 极端矮窗口时的保底：宁可让弹窗内部滚动，也不重叠 */
.modal-idea .idea-body { min-height: 180px; }

/* 记灵感两层的底部键：压成一排小号，不再竖排占掉小半屏。
   删除键推到最左边，跟「取消 / 记下」拉开距离，防误点。 */
.modal-idea .modal-foot,
.modal-idea-confirm .modal-foot {
  padding: 10px 18px; gap: 8px;
  flex-wrap: nowrap; align-items: center;
}
.modal-idea .modal-foot .btn,
.modal-idea-confirm .modal-foot .btn {
  width: auto; min-height: 38px; padding: 0 18px; font-size: 13.5px;
}
.modal-idea .modal-foot .btn-danger,
.modal-idea-confirm .modal-foot .btn-danger { margin-right: auto; }
/* 主要动作排到最右（取消在它左边），符合「主键靠右」的阅读习惯 */
.modal-idea .modal-foot [data-modal="save"],
.modal-idea-confirm .modal-foot [data-modal2="confirm"] { order: 3; }
.modal-idea .modal-foot [data-modal="cancel"],
.modal-idea-confirm .modal-foot [data-modal2="back"] { order: 2; }
.modal-idea .modal-foot .btn-danger { order: 1; }

/* ---------- 记灵感第二步弹窗：补归属 / 状态 / 标签 ----------
   单独一层（#modalLayer2，压在第一层上面）。第一层的正文一直留着不动，
   点「返回修改」原样回去，写的字一个不丢。 */
.modal-layer-2 { z-index: 70; }
.modal.modal-idea-confirm { max-width: 560px; max-height: 88vh; }
.modal-idea-confirm .modal-head { padding: 8px 16px; }
.modal-idea-confirm .modal-title { font-size: 14px; font-weight: 500; color: var(--text-2); }
.modal-idea-confirm .modal-body { display: flex; flex-direction: column; gap: 12px; padding: 14px 18px 6px; }
/* 刚写的那段：确认之前一眼看清自己记了什么 */
.ic-preview {
  background: var(--ink-faint); border: 1px solid var(--line);
  border-radius: 12px; padding: 12px 14px;
  max-height: 30vh; overflow-y: auto;
}
.ic-preview-title { font-size: 15px; font-weight: 600; color: var(--ink-strong); }
.ic-preview-body { margin-top: 6px; font-size: 13px; line-height: 1.75; color: var(--text-2); }
.ic-preview-empty { margin-top: 6px; font-size: 12.5px; color: var(--text-3); }
.modal-idea-confirm .idea-tags .pick-list { max-height: 132px; overflow-y: auto; }

/* ---------- 灵感富文本：格式工具栏 / 编辑区 / 渲染 ----------
   编辑区是 contenteditable（不是 textarea），存的 HTML 里只可能有
   b i u s br div p span ul ol li blockquote 和 font[size]。
   工具栏每个键 44×44，守触屏铁律。
   v11（2026-09-28）工具栏只剩 6 键：B S ｜ 中 大 特大 ｜ 清除 ——
   手机上正好排得进一行（原来 9 键要折两行）。 */
.rt-toolbar {
  display: flex; align-items: center; gap: 6px;
  flex: 0 0 auto; margin-bottom: 6px; padding: 4px 6px;
  background: var(--ink-faint); border: 1px solid var(--line);
  border-radius: 12px;
  /* 放不下就横向滑动（手机上像微信的格式条），不硬挤成一坨、也不多占一行高度 */
  overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none;
}
.rt-toolbar::-webkit-scrollbar { display: none; }
.rt-sep { flex: 0 0 1px; width: 1px; height: 22px; background: var(--line-strong); margin: 0 2px; }
.rt-btn {
  display: inline-flex; align-items: center; justify-content: center;
  flex: 0 0 auto;
  min-width: var(--tap); min-height: var(--tap); padding: 0 8px;
  border: 1px solid transparent; border-radius: 9px; background: #fff;
  color: var(--text-2); font-size: 15px; line-height: 1;
  transition: border-color .15s, color .15s, background .15s;
}
.rt-btn:hover { border-color: var(--ink-mid); color: var(--ink); }
.rt-btn:active { background: var(--ink-soft); }
.rt-btn b, .rt-btn strong { font-weight: 700; }
.rt-btn i, .rt-btn em { font-style: italic; }
.rt-btn u { text-decoration: underline; }
.rt-btn s { text-decoration: line-through; }
.rt-size { font-size: 13px; padding: 0 6px; letter-spacing: .5px; }
.rt-clear { font-size: 13px; padding: 0 12px; }

/* 没内容时用 data-empty 显示提示语（contenteditable 没有原生 placeholder） */
.rich-text[data-empty="true"]::before { content: attr(data-ph); color: var(--text-3); pointer-events: none; }

/* 富文本的渲染规则：编辑区与展示区共用（两处都带 .rt） */
.rt b, .rt strong { font-weight: 600; }
.rt i, .rt em { font-style: italic; }
.rt u { text-decoration: underline; }
.rt s, .rt strike { text-decoration: line-through; }
.rt div, .rt p { margin: 0; }
.rt ul, .rt ol { margin: 6px 0; padding-left: 22px; }
.rt li { margin: 2px 0; }
.rt blockquote { margin: 6px 0; padding: 2px 0 2px 10px; border-left: 2px solid var(--line-strong); color: var(--text-2); }
/* 字号映射：工具栏「小/中/大/特大」写出来的 <font size="2/3/5/6">。
   用 em 相对当前正文大小，短句版和长文版都按比例缩放，不会一个大一个小。 */
.rt font[size="1"] { font-size: .78em; }
.rt font[size="2"] { font-size: .88em; }
.rt font[size="3"] { font-size: 1em; }
.rt font[size="4"] { font-size: 1.12em; }
.rt font[size="5"] { font-size: 1.3em; }
.rt font[size="6"] { font-size: 1.55em; }
.rt font[size="7"] { font-size: 1.85em; }

/* 灵感卡片上的正文摘要：也按富文本渲染，但只给几行位置，多了裁掉 */
.idea-excerpt {
  font-size: 12.5px; line-height: 1.7; color: var(--text-3);
  max-height: 5.4em; overflow: hidden;
}

/* ---------- 灵感查看页（点卡片弹出） ----------
   按内容多少给三档排版：短句放大居中 / 中等大字号 / 长文正经阅读版。
   底部固定「置顶 / 编辑 / 删除」，游客只读时这三个不渲染。 */
.modal.modal-idea-view { max-width: 720px; max-height: 88vh; }
.modal-idea-view .modal-body { padding: 26px 30px 22px; }

.iv-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 16px; }
.iv-where { font-size: 12.5px; color: var(--ink-mid); }
.iv-when { font-size: 12px; color: var(--text-3); margin-left: auto; }
.iv-pin-txt { font-size: 11.5px; margin-left: 3px; }

.iv-title { font-weight: 500; color: var(--ink-strong); letter-spacing: .4px; }
.iv-content { color: var(--text); }
.iv-content strong { color: var(--ink-strong); font-weight: 600; }

/* 短句（≤48 字）：放大居中，像一张卡 */
.iv-title--short { font-size: 26px; line-height: 1.45; text-align: center; margin: 20px 0 10px; }
.iv-content--short { font-size: 19px; line-height: 1.9; text-align: center; color: var(--text-2); }

/* 中等（≤180 字）：大字号、宽松行距 */
.iv-title--mid { font-size: 22px; line-height: 1.5; margin: 14px 0 12px; }
.iv-content--mid { font-size: 16px; line-height: 1.9; }

/* 长文：正经阅读排版，行宽收窄一点更好读 */
.iv-title--long { font-size: 20px; line-height: 1.5; margin: 8px 0 14px; }
.iv-content--long { font-size: 15px; line-height: 1.95; max-width: 640px; }

.iv-tags { margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--line); }

/* ---------- 版本详情弹窗（点任意一条版本弹出，管理员/游客同一套） ---------- */
.modal.modal-version-view { max-width: 640px; max-height: 88vh; }
.modal-version-view .modal-body { padding: 24px 26px 20px; }

.vv-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.vv-where { font-size: 12.5px; color: var(--text-3); }
.vv-when { font-size: 12.5px; color: var(--text-3); margin-left: auto; }
.vv-title {
  font-size: 26px; font-weight: 500; color: var(--ink-strong);
  letter-spacing: .6px; margin: 10px 0 4px;
}
.vv-core { color: var(--text); font-size: 15px; line-height: 1.9; }
.vv-core strong { color: var(--ink-strong); font-weight: 600; }

.vv-block { margin-top: 20px; }
.vv-block .field-label { margin-bottom: 8px; }
.vv-dates { display: flex; gap: 18px; flex-wrap: wrap; font-size: 13px; color: var(--text-2); }
.vv-dim { font-size: 12.5px; color: var(--text-3); }

/* 其余文本块（版本级补充块，现只剩「备注」） */
.vv-text { color: var(--text); font-size: 14px; line-height: 1.85; word-break: break-word; }
.vv-text strong { color: var(--ink-strong); font-weight: 600; }

/* 各分支进度：一行一个上线口 —— 名称 + 状态 + 该口的开发内容全文，一一对应（v12 起 7 行） */
.vv-ports { border: 1px solid var(--line); border-radius: var(--radius-sm); overflow: hidden; }
.vv-port { display: flex; align-items: flex-start; gap: 10px; padding: 9px 12px; background: var(--card); }
.vv-port + .vv-port { border-top: 1px solid var(--line); }
.vv-port-name { flex: 0 0 60px; font-size: 13px; color: var(--ink); line-height: 20px; white-space: nowrap; }
.vv-port .tag { flex: 0 0 auto; margin-top: 1px; }
.vv-port-note {
  flex: 1 1 auto; min-width: 0;
  font-size: 12.5px; color: var(--text-2); line-height: 1.75;
  word-break: break-word;
}
.vv-port-note strong { color: var(--ink-strong); font-weight: 600; }

/* ---------- 各分支进度里的「负责人」（v13）----------
   结构：名称 | 状态小标 | 内容列（第一行负责人，下面是内容全文）。
   负责人名字用现成的 .tag，这里只管它那一行怎么排。 */
.vv-port-owners {
  display: flex; align-items: center; flex-wrap: wrap; gap: 5px;
  margin-bottom: 4px;
}
.vv-port-owners-k { font-size: 11.5px; color: var(--text-3); }
.vv-port-owners .vv-dim { font-size: 11.5px; }
.vv-port-owners .tag { font-size: 11px; padding: 1px 8px; }

/* ---------- 各分支进度里的「当前环节」（v15）----------
   结构：名称 | 状态小标 | 内容列（环节 → 负责人 → 内容全文）。
   环节是自由文本，可能长到折行，所以做成小药丸，跟下面那排负责人区分开。
   v15.1（2026-09-29 主人要求）：**用醒目的橙色底**，在一屏灰字里一眼就能抓到
   「这条线现在走到哪了」；没填的仍写灰色「未填」，不抢视线。 */
.vv-port-stage { display: flex; align-items: flex-start; flex-wrap: wrap; gap: 5px; margin-bottom: 4px; }
.vv-port-stage-k { font-size: 11.5px; color: var(--text-3); line-height: 18px; }
.vv-port-stage .vv-dim { font-size: 11.5px; line-height: 18px; }
.vv-stage {
  font-size: 11.5px; line-height: 18px; color: var(--stage-ink);
  background: var(--stage-bg); border: 1px solid var(--stage-line);
  border-radius: 6px; padding: 1px 8px;
  word-break: break-word;
}

/* 卡片上那一份各分支进度（v13）：跟上面「核心内容」用一条虚线隔开 */
.vv-ports--card { margin-top: 10px; padding-top: 9px; border-top: 1px dashed var(--line); }
.card .vv-port { padding: 8px 11px; }
.card .vv-port-note { font-size: 12.5px; }

/* ⚠️ v13 已删除 .vsum*（开发内容总览）——
   主人要求「开发中」卡片改为直接展示各分支进度全文，那一套首行摘要整块撤掉了。
   别再往卡片或详情里加回来，会和 .vv-ports 重复。 */

/* 版本表单里的「内容块 + 旁边状态框」一行（v12）：
   左边内容框占满，右边每个上线口一个状态框（APP开发内容就带安卓 + iOS 两个）。
   为了让它真的排成一行，这个弹窗单独放宽（默认 520px 会把第二个状态框挤下去）。 */
.modal.modal-version { max-width: 760px; }
.field-dev { align-items: flex-start; flex-wrap: wrap; }
.field-dev .field-grow { flex: 1 1 300px; min-width: 0; margin-bottom: 0; }
.field-dev .field-status { flex: 0 0 132px; min-width: 0; margin-bottom: 0; }
.field-dev .field-status .select { width: 100%; }
/* v15：每个内容块下面再一整行「当前环节」输入框（自由文本，独占一行） */
.field-dev .field-stage { flex: 0 0 100%; min-width: 0; margin: 8px 0 0; }
.field-dev .field-stage .input { width: 100%; }
/* v13：每个内容块下面一整行「负责人」多选 —— 独占一行，不跟状态框挤 */
.field-dev .field-owners { flex: 0 0 100%; min-width: 0; margin: 8px 0 0; }
.owner-pick { display: flex; flex-wrap: wrap; gap: 6px; }
.owner-pick .pick { cursor: pointer; }
.field-dev + .field-dev, .field-row + .field-dev { margin-top: 14px; }
.field-dev { margin-bottom: 14px; }

.vv-count { font-size: 12.5px; color: var(--text-3); margin-bottom: 8px; }
.vv-items { display: flex; flex-direction: column; gap: 6px; }
.vv-item {
  padding: 8px 11px;
  background: var(--ink-faint);
  border-radius: 8px;
  font-size: 13px;
  color: var(--text);
}
.vv-item-main { display: flex; align-items: center; gap: 8px; }
.vv-item-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--ink-mid); flex: 0 0 auto; }
.vv-item-txt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.vv-item-sub { margin: 4px 0 0 14px; font-size: 11.5px; color: var(--text-3); line-height: 1.6; }

/* ---------- 提示条 ---------- */
.toast {
  position: fixed;
  left: 50%; bottom: 90px;
  transform: translateX(-50%) translateY(12px);
  z-index: 90;
  max-width: 88vw;
  padding: 10px 18px;
  border-radius: 999px;
  background: rgba(34, 48, 47, .94);
  color: #fff;
  font-size: 13px;
  opacity: 0;
  pointer-events: none;
  transition: opacity .2s, transform .2s;
}
.toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
.toast.warn { background: rgba(169, 118, 27, .96); }
.toast.err { background: rgba(180, 64, 47, .96); }

.banner {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 14px; border-radius: 10px;
  background: var(--warn-soft); color: var(--warn);
  font-size: 13px; margin-bottom: 14px;
}
.banner-info { background: var(--ink-faint); color: var(--ink); }

/* 可点标签（灵感标签候选） */
.pick-list { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.pick {
  padding: 5px 11px; border: 1px solid var(--line-strong); border-radius: 999px;
  background: #fff; color: var(--text-2); font-size: 12.5px; min-height: 30px;
}
.pick.on { background: var(--ink); border-color: var(--ink); color: #fff; }

/* 窄屏细节（触屏：所有可点目标 ≥44px） */
@media (max-width: 1023px) {
  .view { padding: 14px; }
  .topbar { padding: 0 10px 0 14px; min-height: 56px; gap: 8px; }
  .topbar-title { font-size: 15px; }
  .icon-btn { min-height: var(--tap); padding: 0 12px; font-size: 12.5px; }
  .cat-tab, .seg-btn { min-height: var(--tap); }
  .cat-tabs { max-width: none; }
  .btn { min-height: 44px; }
  .btn-sm { min-height: 40px; }
  .row-actions .btn { min-height: 40px; }
  /* ★ 一行「信息 + 一排操作键」放不下时：整排操作键换到下一行，别把主区压塌。
     原来 .row-main 是 flex:1 + min-width:0、.row-actions 是 flex:0 0 auto 且不换行，
     窄屏上 5 个键（「不给游客看 / ↑ / ↓ / 编辑 / 删除」实测 292px）一挤，
     主区被压成 0 宽 ⇒ 标题一字一行、按钮直接压在文字上（2026-09-28 主人报的 bug）。
     放得下的行不受影响（flex-wrap 只在放不下时才换行，row-gap 不产生额外空隙）。 */
  .row { flex-wrap: wrap; row-gap: 8px; }
  .row-actions { flex-wrap: wrap; }
  .chip, .chip-add, .pick { min-height: 44px; }
  .chip { padding-left: 16px; }
  .chip-btn, .chip-x { width: 36px; height: 36px; font-size: 15px; }
  /* 卡片上的编辑图标是主要内容入口，窄屏单独放大到 44（配置中心的 chip 保持紧凑） */
  .card .chip-btn { width: 44px; height: 44px; }
  .chip-filter { min-height: var(--tap); }
  .link-btn { min-height: var(--tap); padding: 10px 4px; }
  .modal-close { width: 44px; height: 44px; }
  .modal { max-width: none; max-height: 92vh; }

  /* 手机端记灵感：弹窗几乎占满一屏（像备忘录），省下的高度全给正文 ——
     第一步已经没有归属 / 状态 / 标签了，底部键也只占一排，正文拿到的地方比 v8 更多 */
  .modal-layer { padding: 12px; }
  .modal.modal-idea {
    max-width: none;
    height: calc(100dvh - 20px); max-height: calc(100dvh - 20px);
  }
  .modal-idea .modal-head { padding: 4px 10px; gap: 6px; min-height: 44px; }
  /* 头部那一行也收一号：标题 + 删除这条 + 记下 + 取消 在窄屏也排得下 */
  .modal-idea .head-act { min-height: 36px; padding: 0 11px; font-size: 13px; }
  .modal-idea .modal-body { padding: 8px 12px 10px; gap: 6px; min-height: 0; }
  .modal-idea .idea-title { font-size: 19px; min-height: 38px; padding: 2px 0; }
  .modal-idea .idea-body { min-height: 0; }
  .modal-idea .idea-text { min-height: 0; font-size: 15px; line-height: 1.8; padding: 12px 14px; }
  /* 手机上格式条：v11 只剩 6 键（B S ｜ 中 大 特大 ｜ 清除），正好排进一行 ——
     原来 9 键要折两行，折掉的那一整行高度现在全归正文。
     每键 34px 且等宽均分（v10 主人要求缩体积），一行铺满不空不挤。 */
  .modal-idea .rt-toolbar { flex-wrap: nowrap; padding: 3px 5px; gap: 4px; margin-bottom: 6px; }
  .modal-idea .rt-btn { min-width: 0; flex: 1 1 0; min-height: 34px; padding: 0 4px; font-size: 13px; border-radius: 8px; }
  .modal-idea .rt-size { font-size: 12px; padding: 0 2px; letter-spacing: 0; }
  .modal-idea .rt-clear { font-size: 12px; padding: 0 4px; }
  .modal-idea .rt-sep { height: 16px; margin: 0 1px; flex: 0 0 1px; }

  /* ★ v12 手机端「底部按钮铁律」：**一律缩小 + 挤成一排**（主人 2026-09-28：
     「所有类似场景，都是缩小 UI 然后放到一行的逻辑」）。
     原来默认是 `column-reverse` 竖排一摞满宽大按钮，一屏小半都被按钮吃掉；
     现在全站弹窗统一走这条：等宽均分、36px 高、不换行、标签过长也不截断（nowrap + 让位）。
     ⚠️ 这是**一条全局规则**，所有走 openModal() 的弹窗（版本详情 / 编辑版本 / 新建事项 /
       成员管理 / 配置中心 / 冲突解决 …）自动受益 —— 以后新加弹窗不用再单独写手机样式。 */
  /* ⚠️ 选择器必须用 `.modal .modal-foot` 打头，把**特异性**提到 (0,3,0)：
     上面给「记灵感两层」单独写过 `.modal-idea-confirm .modal-foot .btn`（3 个类），
     而媒体查询**不会**提高特异性 ⇒ 这里若只写 `.modal-foot .btn`（2 个类）会被它压住，
     高度仍然是 38px。加上 `.modal` 后两边同级，靠「媒体查询在后面」取胜。 */
  .modal .modal-foot {
    flex-direction: row; flex-wrap: nowrap; gap: 6px; padding: 8px 12px;
    align-items: center;
  }
  .modal .modal-foot .btn {
    width: auto; flex: 1 1 0; min-width: 0;
    min-height: 36px; padding: 0 8px; font-size: 13px; white-space: nowrap;
  }
  /* 第二步弹窗在手机上同样让它居中浮着，不铺满整屏 */
  .modal.modal-idea-confirm { max-width: none; max-height: 86vh; }
  .modal-idea-confirm .modal-head { padding: 6px 12px; }
  .modal-idea-confirm .modal-body { padding: 12px 14px 4px; gap: 10px; }
  .modal-idea-confirm .field-label { font-size: 12px; margin-bottom: 4px; }
  .modal-idea-confirm .idea-tags .pick-list { max-height: 96px; }
  .modal-idea-confirm .field-hint { display: none; }
  .ic-preview { max-height: 26vh; padding: 10px 12px; }
  .ic-preview-title { font-size: 14px; }
  /* 版本条：窄屏整条就是点击区，再放宽一点 */
  .vstrip { min-height: 48px; }
  .vstrip--mini { flex-wrap: wrap; row-gap: 2px; }
  .vstrip--mini .vstrip-core { order: 9; flex: 1 1 100%; white-space: normal; }

  /* 灵感查看页：置顶 / 编辑 / 删除 / 关闭 四个键缩小、压成一排（v10 主人要求），
     v12 起这排的样式统一由上面的「底部按钮铁律」提供，这里只留版式微调 */
  .modal-idea-view .modal-body { padding: 20px 18px 18px; }
  .iv-when { margin-left: 0; }
  .iv-title--short { font-size: 22px; }
  .iv-content--short { font-size: 17px; }
  .iv-title--mid { font-size: 19px; }
  .iv-title--long { font-size: 18px; }

  /* 版本详情弹窗：窄屏版式微调（底部「编辑 / 删除 / 关闭」v12 起由全局底部按钮铁律压成一排） */
  .modal-version-view .modal-body { padding: 20px 18px 18px; }
  .vv-when { margin-left: 0; }
  /* v12 版本表单的「内容块 + 状态框」：手机一行塞不下 —— 内容框独占一行，状态框并排挪到下一行 */
  .field-dev .field-grow { flex: 1 1 100%; margin-bottom: 8px; }
  .field-dev .field-status { flex: 1 1 0; min-width: 0; }
  /* v13：负责人一行 —— 手机把按钮做得更矮胖一点，一屏能多放几个人 */
  .field-dev .field-stage { margin-top: 6px; }
  .field-dev .field-owners { margin-top: 6px; }
  .owner-pick { gap: 5px; }
  .owner-pick .pick { min-height: 34px; padding: 0 10px; font-size: 12.5px; }
  .vv-port-stage { gap: 4px; margin-bottom: 3px; }
  .vv-port-owners { gap: 4px; margin-bottom: 3px; }
  .vv-title { font-size: 22px; }
  .vv-port { gap: 8px; padding: 8px 10px; }
  .vv-port-name { flex: 0 0 54px; font-size: 12.5px; }
  .vv-port-note { font-size: 12px; }
  .vbar-hint { margin-left: 0; flex: 1 1 100%; }

  /* 待办组右侧的下拉：窄屏收窄一点，别把版本号挤出去 */
  .vstrip-more { padding: 0 10px; font-size: 11.5px; gap: 5px; }
}

/* 很窄的手机（≤400px）：顶栏两个按钮只留图标，别把标题挤没了 */
@media (max-width: 400px) {
  .topbar { gap: 6px; padding: 0 8px 0 12px; }
  .icon-btn { padding: 0 8px; }
  .icon-btn-txt { display: none; }
  /* 底部按钮一排：极窄屏再收一号，四个键（如「置顶/编辑/删除/关闭」）也排得下 */
  .modal .modal-foot { gap: 5px; padding: 8px 10px; }
  .modal .modal-foot .btn { min-height: 34px; padding: 0 5px; font-size: 12.5px; }
}

/* 手机：版本条上那行内容另起一行、最多两行，不跟版本号挤在一起 */
@media (max-width: 699px) {
  .vstrip--mini .vstrip-core {
    display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  }
  .vstrip--tiny .vstrip-date { font-size: 11px; }
}

/* ============================================================
   v16（2026-09-29）App 数据分析板块 —— 首页最上面那一块
   只有管理员看得见（游客后端直接 403，这里也不用管）。
   规律：比项目卡片更「重」一档 —— 它是每天第一眼看的东西。
   配色全部走现有变量，不新造语义色；红绿留给「涨跌」语义，这里不用。
   ============================================================ */
.umeng-panel {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 15px 18px 18px;
  margin-bottom: 18px;
}
.umeng-head {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 10px 12px;
  flex-wrap: wrap;
  padding-bottom: 12px;
  border-bottom: 1px solid var(--line);
}
.umeng-hd-main { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.umeng-title { font-size: 16px; font-weight: 600; color: var(--ink-strong); letter-spacing: .3px; }
.umeng-sub { font-size: 12px; color: var(--text-3); }
.umeng-hd-acts { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.umeng-stamp { font-size: 12px; color: var(--text-3); }

/* 未配置 / 还没抓到：引导与骨架 */
.umeng-setup { display: flex; align-items: center; gap: 14px; flex-wrap: wrap; padding-top: 14px; }
.umeng-setup-txt { flex: 1 1 300px; min-width: 0; }
.umeng-setup-t { font-weight: 600; color: var(--ink); margin-bottom: 4px; }
.umeng-setup-s { font-size: 12.5px; color: var(--text-2); line-height: 1.75; }
.umeng-setup-s.dim { color: var(--text-3); margin-top: 3px; }
.umeng-skel { padding-top: 14px; color: var(--text-3); font-size: 13px; line-height: 1.75; }
.umeng-skel code { background: var(--ink-faint); padding: 1px 5px; border-radius: 4px; font-size: 12px; }
.umeng-note { margin-top: 12px; padding: 9px 12px; border-radius: var(--radius-sm); font-size: 12.5px; line-height: 1.75; }
.umeng-note.err { background: var(--danger-soft); color: var(--danger); }
.umeng-note.sm { margin-top: 8px; }

/* 每个 App 一张卡 */
.umeng-apps { display: flex; flex-direction: column; gap: 11px; padding-top: 14px; }
.umeng-app { border: 1px solid var(--line); border-radius: var(--radius-sm); padding: 11px 13px 12px; background: #FCFDFD; }
.umeng-app-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.umeng-plat {
  font-size: 11px; line-height: 1.7; padding: 0 7px; border-radius: 999px;
  border: 1px solid var(--line-strong); color: var(--text-2); background: #fff;
}
.umeng-plat-android { color: #2F6B4A; border-color: #C3DCCE; background: #F2F8F4; }
.umeng-plat-ios { color: #3F5473; border-color: #C7D2E2; background: #F3F6FB; }
.umeng-plat-mini { color: #7A4E96; border-color: #DCC9E8; background: #F8F3FC; }
.umeng-app-name { font-weight: 600; color: var(--text); font-size: 13.5px; }
.umeng-app-state { margin-left: auto; font-size: 11.5px; color: var(--text-3); }
.umeng-app-state.bad { color: var(--danger); }

/* 三个核心指标 */
.umeng-kpis { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px 14px; margin-top: 10px; }
.umeng-kpi { min-width: 0; }
.umeng-kpi-lbl { font-size: 11.5px; color: var(--text-3); }
.umeng-kpi-row { display: flex; align-items: baseline; gap: 6px; margin-top: 1px; }
.umeng-kpi-num {
  font-size: 20px; font-weight: 650; color: var(--ink-strong); letter-spacing: .3px;
  font-variant-numeric: tabular-nums;
}
.umeng-kpi-num.dim { color: var(--text-3); font-weight: 500; }
.umeng-kpi-delta { font-size: 11.5px; font-variant-numeric: tabular-nums; }
.umeng-kpi-delta.up { color: var(--ink-mid); }
.umeng-kpi-delta.down, .umeng-kpi-delta.flat { color: var(--text-3); }
.umeng-kpi-date { font-size: 11px; color: var(--text-3); margin-top: 1px; }
.umeng-spark { margin-top: 5px; height: 30px; }
.umeng-spark-svg { display: block; width: 100%; height: 30px; }

/* v21：今日实时条（当天数字，比 KPI 的 T+1 新一天）—— 浅底药丸条 */
.umeng-live {
  display: flex; align-items: baseline; gap: 5px 14px; flex-wrap: wrap;
  margin-top: 11px; padding: 7px 12px;
  border: 1px solid var(--line); border-radius: var(--radius-sm);
  background: #FBFAF4; font-size: 12.5px; color: var(--text-2);
}
.umeng-live-tag { font-weight: 700; color: var(--text); }
.umeng-live-it b { font-weight: 650; color: var(--ink-strong); font-variant-numeric: tabular-nums; }

/* v21：留存 / 时长补充行 */
.umeng-sub {
  display: flex; align-items: baseline; gap: 5px 10px; flex-wrap: wrap;
  margin-top: 8px; font-size: 12.5px; color: var(--text-2);
}
.umeng-sub b { font-weight: 650; color: var(--ink-strong); font-variant-numeric: tabular-nums; }
.umeng-sub i { font-style: normal; color: var(--text-3); font-size: 11.5px; }
.umeng-sub-sep { color: var(--text-3); }

/* v21b：读数指南 —— 每张卡 / 每行的「?」键 + 弹窗里的文档排版 */
.umeng-q {
  flex: 0 0 auto;
  width: 17px; height: 17px;
  margin-left: 5px;
  padding: 0;
  border: 1px solid var(--line, rgba(47,79,79,.35));
  border-radius: 50%;
  background: transparent;
  color: var(--text-3);
  font: 600 11px/15px var(--font-ui, sans-serif);
  text-align: center;
  cursor: pointer;
  vertical-align: middle;
}
.umeng-q:hover, .umeng-q:focus-visible { color: var(--ink-strong); border-color: var(--ink-strong); }
.umeng-doc h4 { margin: 14px 0 4px; font-size: 13.5px; color: var(--ink-strong); }
.umeng-doc h4:first-child { margin-top: 2px; }
.umeng-doc p { margin: 4px 0; font-size: 13px; line-height: 1.75; }
.umeng-doc ul { margin: 4px 0; padding-left: 18px; }
.umeng-doc li { margin: 5px 0; font-size: 13px; line-height: 1.7; }
.umeng-doc code { padding: 1px 5px; border-radius: 4px; background: var(--ink-faint); font-size: 12px; }
.umeng-doc strong { color: var(--ink-strong); }
.umeng-doc-tip {
  margin-top: 12px; padding: 9px 12px;
  border-left: 3px solid #A9761B;
  border-radius: 0 6px 6px 0;
  background: var(--ink-faint);
  font-size: 12.5px; line-height: 1.7;
}

/* 配置弹窗里的 App 行（flex + wrap，窄屏自己折行，不挤） */
.umeng-app-list { display: flex; flex-direction: column; gap: 8px; }
.umeng-app-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.umeng-app-row .input[data-f="name"] { flex: 1 1 120px; min-width: 0; }
.umeng-app-row .input[data-f="appkey"] { flex: 1 1 160px; min-width: 0; }
.umeng-app-row .select { flex: 0 0 74px; }
.umeng-app-row .chip-btn { flex: 0 0 auto; }
.umeng-add-app { margin-top: 8px; }
.umeng-cfg-2col { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; }

/* 窄屏（<1024）：板块内边距收一号，KPI 改两列 */
@media (max-width: 1023px) {
  .umeng-panel { padding: 14px 14px 16px; margin-bottom: 14px; }
  .umeng-kpis { grid-template-columns: 1fr 1fr; }
  .umeng-setup { gap: 10px; }
}
@media (max-width: 600px) {
  .umeng-kpis { grid-template-columns: 1fr; }
  .umeng-cfg-2col { grid-template-columns: 1fr; }
  .umeng-hd-acts { width: 100%; }
}

/* ============================================================
   Today（v17 建 · v18 扩到五块 · v23 热点拆成独立一页）—— 与 Work / Personal 同级的第三区，登录后默认落地
   v23（主人 2026-09-30 指令）：侧栏 Today 组下分两项，各自独立一页 ——
     「今日事项」（view=today）= ① 今日工作计划 ② 今日待办事项 ③ 开发中的项目-版本 ④ App 数据分析（友盟）
     「网络热点」（view=todayHot）= ⑤ 微博热搜（后续主人再往里加源）
   布局：--items web 两列三排 ｜ <1024 单列 ｜ --hot 单列独占；窄屏两页靠 .today-switch 互相跳
        列序由 grid-template-areas 定：① 计划‖待办 ② 版本 ③ 情报独占整行
   配色一律走现有 CSS 变量，不新造 color token —— 像素主题覆盖时自动跟着走
   ============================================================ */

.today-head { display: flex; align-items: flex-end; gap: 12px; flex-wrap: wrap; margin-bottom: 14px; }
.today-head-main { flex: 1 1 auto; min-width: 0; }
.today-title { margin: 0; font-size: 20px; font-weight: 700; color: var(--text); }
.today-sub { margin-top: 3px; font-size: 12.5px; color: var(--text-3); }

/* ---------- v23 窄屏切换链接：今日事项 ⇄ 网络热点 ----------
   宽屏（≥1024）有侧栏，Today 组下两项直接点 —— 这颗不渲染进视觉（display:none）；
   窄屏（<1024）没有侧栏，靠它互相跳。 */
.today-switch {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  min-height: 44px; /* 触屏铁律：点击区 ≥44px */
  margin: 0 0 14px;
  padding: 10px 14px;
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  color: var(--text);
  font-size: 14px;
  font-weight: 500;
  text-align: left;
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
.today-switch:hover { border-color: var(--ink-mid); }
.today-switch:focus-visible { outline: 2px solid var(--ink-mid); outline-offset: 2px; }
.today-switch .today-switch-go { margin-left: auto; color: var(--text-3); font-size: 12.5px; font-weight: 400; }
@media (min-width: 1024px) {
  .today-switch { display: none; }
}

/* ---------- v24 历史归档页 ---------- */
/* 日期分组标题（「9月29日 · 星期一 [3 条]」） */
.hist-day { display: flex; align-items: center; gap: 8px; margin: 14px 2px 8px; font-size: 13px; color: var(--text-3); }
.today-blk-body .hist-day:first-child { margin-top: 2px; }
/* 卡头右侧的灰字说明（「拖过 7 天还没做的」） */
.hist-note { margin-left: auto; color: var(--text-3); font-size: 12px; }

/* ⚠️ 基础（<1024，单列）也必须显式写出 grid-template-areas ——
   五块身上钉着 grid-area: <名字>，若这里不给具名区域，浏览器会为它们**自动生成隐式轨道**，
   于是在手机上反而挤成多列（实测踩过：390px 下 grid-template-columns 变成 3 个值）。
   v23：网格按子页分两套 —— --items（四块）/ --hot（热点独占一页）。 */
.today-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 14px;
  align-items: start;
}
.today-grid--items { grid-template-areas: "work" "todo" "vers" "intel"; }
.today-grid--hot { grid-template-areas: "hot"; }
.today-grid > [data-today-block="work"] { grid-area: work; }
.today-grid > [data-today-block="todo"] { grid-area: todo; }
.today-grid > [data-today-block="vers"] { grid-area: vers; }
.today-grid > [data-today-block="hot"] { grid-area: hot; }
.today-grid > [data-today-block="intel"] { grid-area: intel; }
/* v23 版式（v18 三排改两页）—— 今日事项子页 web 端两列三排：
     第一排  今日工作计划 ‖ 今日待办事项    （手动区并排）
     第二排  开发中的版本                    （v23 起热点搬去子页，版本独占整行）
     第三排  App 数据分析                    （独占整行）
   网络热点子页：微博热搜独占整页宽。 */
@media (min-width: 1024px) {
  .today-grid--items { grid-template-columns: 1fr 1fr; grid-template-areas: "work todo" "vers vers" "intel intel"; }
  .today-grid--hot { grid-template-columns: 1fr; grid-template-areas: "hot"; }
}
/* 情报块自带 margin-bottom（它在 Work 首页是独立板块），进了网格就交给 gap 管，别再叠一层 */
.today-grid > .umeng-panel { margin-bottom: 0; }

/* ---------- 块外壳：一整张卡，里面直接铺 .row（不再套一层 .list 的边框） ---------- */
.today-block { padding: 0; }
.today-block .list { background: transparent; border: 0; border-radius: 0; box-shadow: none; }
.today-block .empty { background: transparent; border: 0; padding: 18px 14px; }

.today-blk-head { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 14px; border-bottom: 1px solid var(--line); }
.today-blk-fold {
  display: flex; align-items: center; gap: 6px; min-height: var(--tap);
  background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--text); font: inherit; font-size: 14.5px; font-weight: 700; text-align: left;
}
.today-blk-fold:hover { color: var(--ink-mid); }
.today-blk-caret { color: var(--text-3); font-size: 11px; }
.today-blk-count { margin-left: auto; }
.today-blk-body { padding-bottom: 8px; }

/* ---------- 一条待办（v18 改版）----------
   行里只剩「勾选框 + 标题/副信息」—— 四个操作键已收进详情弹窗（见下面 .td-acts），
   所以 v17 那套「给操作键让位、自适应折行」的规则全部撤掉。
   整行现在是一张**可点卡片**：点文字或空白 → 弹详情；点左边勾选框 → 只勾选（不弹窗）。
   ⚠️ 靠 data-act 区分：只有管理员那侧的行才有 data-act，游客的行不给手型、也不给 hover。 */
.today-row { flex-wrap: wrap; row-gap: 4px; align-items: flex-start; }
.today-row .check { margin-top: 3px; }
.today-row .row-main { flex: 1 1 180px; min-width: 132px; }
.today-row[data-act] { cursor: pointer; }
.today-row[data-act]:hover { background: var(--ink-faint); }
.today-act-on { border-color: var(--ink); color: var(--ink); font-weight: 600; }
.today-row--pin .row-title { font-weight: 600; }
.today-done-head {
  display: flex; align-items: center; gap: 6px;
  padding: 8px 14px 2px; font-size: 12px; color: var(--text-3);
  border-top: 1px dashed var(--line);
}
.today-done-list .row-title { color: var(--text-3); }

/* ---------- 陈年旧事（拖过 7 天） ---------- */
.today-stale-head {
  display: flex; align-items: center; gap: 6px; width: 100%; min-height: var(--tap);
  background: none; border: 0; border-top: 1px dashed var(--line);
  padding: 10px 14px; cursor: pointer; color: var(--text-2);
  font: inherit; font-size: 12.5px; text-align: left;
}
.today-stale-head:hover { background: var(--ink-faint); }
.today-stale-hint { margin-left: auto; color: var(--text-3); }
.today-stale-body { background: var(--ink-faint); }

.today-add {
  display: block; width: 100%; min-height: var(--tap);
  background: none; border: 0; border-top: 1px dashed var(--line);
  padding: 10px 14px; cursor: pointer; color: var(--ink-mid);
  font: inherit; font-size: 13px; text-align: left;
}
.today-add:hover { background: var(--ink-faint); }
.today-hint { margin-top: 6px; font-size: 12px; line-height: 1.5; color: var(--text-3); }

/* ---------- ③ 开发中的项目-版本 ---------- */
.today-ver { cursor: pointer; align-items: flex-start; }
.today-ver:hover { background: var(--ink-faint); }
.today-ver .nav-dot { margin-top: 7px; }
.today-ver-no { font-weight: 600; color: var(--text-2); }
/* v19（主人 2026-09-29）：「每一个组都独立一行」——
   每组 = 「端名 + 环节」。原先 .row-sub 是 flex + flex-wrap，
   7 个端会挤成 3 行参差不齐（实测 chip 顶边只有 3 个值：666 / 701 / 736）。
   改成**竖排一列**，一个端一行；端名占固定宽度 ⇒ 右边环节药丸左对齐，能竖着扫下来。
   ⚠️ 环节文字可能很长（H5 那条实测 294px），必须允许折行 ——
      `.tag` 默认 `white-space: nowrap`，不放开的话窄屏会横向溢出。 */
.today-ver-stages {
  display: flex;
  flex-direction: column;
  gap: 5px;
  align-items: stretch;
  margin-top: 6px;
}
.today-ver-stage { display: flex; align-items: flex-start; gap: 8px; min-width: 0; }
.today-ver-stage > b { flex: 0 0 auto; min-width: 4.2em; font-weight: 600; color: var(--text-2); }
.today-ver-stage > .tag { white-space: normal; text-align: left; min-width: 0; }
.today-ver-none { color: var(--text-3); }

/* ---------- ⑤ 网络热点（v18 · 占位块）----------
   目前只是块外壳 + 一张说明牌，等主人定了数据源再换真内容。
   外壳与①②③完全同款（.today-block），这里只补一句占位文案的排布。 */
.today-blk-body .today-empty { text-align: left; line-height: 1.9; }

/* ---------- 今日条目的「详情弹窗」（v18）----------
   主人 2026-09-29 要求：详情里展示**标题 + 备注**，五个键（完成/置顶/明天/编辑/删除）**保持一排**。
   ⚠️ 这一排用的是 flex 等分 + min-width:0 + nowrap ⇒ 再窄也只是各自变窄，**永不折行**。
      弹窗**没有**共享底部条（openModal 传了 hideFoot），否则五个键会和「取消」凑成两排。
      关闭走右上角 ✕（弹窗铁律不变：点遮罩不关）。 */
.td-view { display: flex; flex-direction: column; gap: 12px; }
.td-field { min-width: 0; }
.td-label { font-size: 11.5px; color: var(--text-3); margin-bottom: 5px; }
.td-val {
  font-size: 14.5px; line-height: 1.8; color: var(--text);
  background: var(--ink-faint); border: 1px solid var(--line);
  border-radius: var(--radius-sm); padding: 9px 12px;
  white-space: pre-wrap; word-break: break-word;
}
.td-title { font-weight: 600; }
.td-title.done { color: var(--text-3); text-decoration: line-through; }
.td-empty { color: var(--text-3); }
.td-meta { display: flex; flex-wrap: wrap; gap: 6px; margin-top: -3px; }
.td-acts { display: flex; gap: 6px; margin-top: 2px; }
.td-acts .btn {
  flex: 1 1 0; min-width: 0; min-height: 36px;
  padding-left: 6px; padding-right: 6px;
  font-size: 12.5px; white-space: nowrap;
}
/* 详情是小弹窗，别在宽屏上摊成一大片 */
.modal.modal-daily-detail { max-width: 460px; }

/* 侧栏 Today 组：与下面的工作区 / 生活区之间拉一条分隔，视觉上是独立一层 */
.nav-group-today { border-bottom: 1px solid var(--line); padding-bottom: 6px; }

@media (max-width: 600px) {
  .today-title { font-size: 18px; }
  /* v18：行内操作键已收进弹窗，这里不再需要「整排落到下一行」那套；
     详情弹窗那五个键靠 flex 等分自己收窄，也不用额外规则。 */
  .today-stale-hint { display: none; }
}

/* ---------- v20 · 网络热点（微博热搜，主人 2026-09-29 拍板「先做一个微博的」） ---------- */
/* 块头右侧：更新时间 + 刷新键（只在有数据时渲染） */
.today-blk-acts { margin-left: auto; display: flex; align-items: center; gap: 8px; }
/* 榜单：一列；每行 = 排名 + 标题 + 热度，整行是链接（新开标签页） */
.hot-list { display: flex; flex-direction: column; margin-top: 4px; }
.hot-row {
  display: flex; align-items: center; gap: 9px; min-width: 0;
  padding: 7px 4px; text-decoration: none; color: var(--text);
  border-bottom: 1px dashed var(--line);
}
.hot-row:last-child { border-bottom: none; }
.hot-row:hover { background: var(--ink-faint); }
.hot-rank {
  flex: 0 0 auto; width: 1.7em; text-align: center;
  font-size: 12px; font-weight: 700; color: var(--text-3);
  font-variant-numeric: tabular-nums;
}
/* 前三名醒目：红 / 橙 / 黄（榜单惯用色，主人要换色号随时说） */
.hot-rank-1 { color: #D6453D; }
.hot-rank-2 { color: #E8701A; }
.hot-rank-3 { color: #E8A01A; }
.hot-title {
  flex: 1 1 auto; min-width: 0; font-size: 13.5px; line-height: 1.5;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.hot-heat { flex: 0 0 auto; font-size: 12px; color: var(--text-3); font-variant-numeric: tabular-nums; }
.hot-foot { margin-top: 10px; font-size: 12px; color: var(--text-3); }
.hot-foot b { color: var(--warn); }
/* 手机窄屏：标题省略号照旧、热度列收窄 */
@media (max-width: 600px) {
  .hot-row { gap: 7px; padding: 8px 2px; } /* 触屏铁律：点击区加高 */
  .hot-title { font-size: 13px; }
  .hot-heat { font-size: 11px; }
}

/* ---------- v26 · 移动端灵感笔记页（小米笔记式，主人 2026-10-11 拍板） ---------- */
/* 全屏层：平时藏在屏幕下方（translateY(100%)），.open 挂上后上滑进场。
   z-index 55：低于弹窗层（60/70）—— 编辑弹窗从笔记页跳转时先收笔记页，互不打架。 */
.note-layer {
  position: fixed; inset: 0; z-index: 55;
  background: #fff;
  transform: translateY(100%);
  transition: transform .3s cubic-bezier(.32, .72, .28, 1);
}
.note-layer.open { transform: translateY(0); }
.note-page { display: flex; flex-direction: column; height: 100%; background: #fff; }
.note-head {
  display: flex; align-items: center; gap: 8px;
  padding: 8px 12px; border-bottom: 1px solid var(--line); background: #fff;
}
.note-back {
  width: 44px; height: 44px; flex: 0 0 auto;
  border: none; background: transparent; cursor: pointer;
  display: flex; align-items: center; justify-content: center;
  color: var(--ink-strong);
}
.note-back .ico { width: 22px; height: 22px; }
.note-head-title { font-size: 14px; color: var(--text-3); }
.note-body {
  flex: 1; min-height: 0; overflow-y: auto; -webkit-overflow-scrolling: touch;
  padding: 6px 18px 24px;
}
.note-foot {
  display: flex; gap: 8px;
  padding: 10px 14px calc(10px + env(safe-area-inset-bottom));
  border-top: 1px solid var(--line); background: #fff;
}
.note-foot .btn { flex: 1 1 0; min-width: 0; }

/* ---------- v26 · 窄屏 Ideas 页（小米笔记式排布）：只动移动端，宽屏不变 ---------- */
@media (max-width: 1023px) {
  /* 标签筛选：一行左右滑动（不换行）、圆角胶囊、无边框浅灰底（选中反白）——
     选择器带 .tag-filter 提特异性，压住 pixel-theme.css 里同特异性的 .chip-filter 覆写 */
  .tag-filter {
    flex-wrap: nowrap; overflow-x: auto; gap: 8px;
    margin: 0 -14px 14px;          /* 滑动区顶到屏幕边，滚到头不留白边 */
    padding: 2px 14px 8px;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .tag-filter::-webkit-scrollbar { display: none; }
  .tag-filter .chip-filter {
    flex: 0 0 auto;
    min-height: 38px; padding: 0 16px;
    border: none; border-radius: 999px;
    background: #F3F4F6; color: var(--text-2);
    box-shadow: inset 0 0 0 1px var(--line);
    font-size: 13.5px; white-space: nowrap;
  }
  .tag-filter .chip-filter.on { background: var(--ink); color: #fff; box-shadow: none; }
  .tag-filter .chip-filter-num { font-size: 11.5px; opacity: .55; }

  /* 笔记卡片：双列瀑布流、圆角白卡、无边框浅投影（小米笔记卡片式样） */
  .cards--idea { display: block; column-count: 2; column-gap: 10px; }
  .cards--idea .card {
    break-inside: avoid; margin: 0 0 10px;
    border: none; border-radius: 16px;
    box-shadow: 0 1px 6px rgba(31, 41, 40, .08);
  }
  .cards--idea .card-head { margin-bottom: 6px; }
  .cards--idea .card-title { font-size: 15px; line-height: 1.5; }
  .cards--idea .idea-excerpt { font-size: 13px; line-height: 1.7; max-height: 9.5em; }
  .cards--idea .card-meta { font-size: 11px; }
  .cards--idea .tag-row .tag { font-size: 11px; }
  /* 窄屏全屏笔记页：内容排版微调（短句不再强行居中放大，像备忘录一样从左上读起） */
  .note-body .iv-title--short { font-size: 22px; text-align: left; margin: 12px 0 8px; }
  .note-body .iv-content--short { font-size: 17px; text-align: left; }
}

/* ===== 工信部备案号（页面底部悬挂，管局硬要求） ===== */
.icp-footer {
  position: fixed;
  left: 0; right: 0; bottom: 0;
  z-index: 500; /* 高于普通内容、低于弹窗层（modal-layer 1000+） */
  text-align: center;
  padding: 3px 0 4px;
  background: rgba(247, 246, 238, 0.8); /* 跟随像素主题米色底（--bg 的透明版） */
  pointer-events: none; /* 整条不挡点击，只有链接本身可点 */
}
.icp-footer a {
  pointer-events: auto;
  font-size: 11px;
  color: var(--text-3, #999);
  text-decoration: none;
  letter-spacing: 0.5px;
}
.icp-footer a:hover { color: var(--ink-strong, #666); text-decoration: underline; }
