/* ============================================================
   app.css — 侧边栏、顶栏、编辑器、弹窗、数据库视图
   ============================================================ */

/* ---------- 主界面布局 ---------- */
#screen-app { flex-direction: column; }
.app-shell { display: flex; width: 100%; flex: 1; min-height: 0; overflow: hidden; }

/* 图标包裹（线性 svg 图标，颜色跟随 currentColor） */
.ic { display: inline-flex; align-items: center; justify-content: center; flex-shrink: 0; }
.ic svg { display: block; }

/* ---------- 窗口标签栏（桌面端外观） ---------- */
/* C6：多标签窗口栏第一刀未启用，入口已摘除 —— chrome-tabbar.js 不再渲染
   内容（TABBAR_ENABLED=false），这里把空条隐藏。恢复时删掉 display:none
   并把 TABBAR_ENABLED 置回 true。 */
.win-tabbar {
  display: none;
  height: 36px; min-height: 36px; flex-shrink: 0;
  align-items: center; gap: 6px;
  padding: 0 8px; background: var(--bg-sidebar);
  border-bottom: 1px solid var(--border);
  user-select: none;
}
.wt-left { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
.wt-btn {
  width: 26px; height: 26px; border-radius: 5px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-tertiary); transition: background 0.12s ease, color 0.12s ease;
}
.wt-btn:hover { background: var(--bg-active); color: var(--text-secondary); }
.wt-tabs { display: flex; align-items: center; gap: 2px; flex: 1; min-width: 0; overflow: hidden; }
.wt-tab {
  display: inline-flex; align-items: center; gap: 6px;
  height: 28px; padding: 0 8px; border-radius: 6px;
  font-size: 13px; color: var(--text-secondary);
  max-width: 220px; min-width: 90px; cursor: pointer;
  transition: background 0.12s ease;
}
.wt-tab:hover { background: var(--bg-active); }
.wt-tab.active { background: var(--bg); color: var(--text); box-shadow: 0 0 0 1px var(--border); }
.wt-emoji { font-size: 13px; flex-shrink: 0; }
.wt-title { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.wt-close {
  width: 18px; height: 18px; border-radius: 4px; flex-shrink: 0;
  display: none; align-items: center; justify-content: center; color: var(--text-tertiary);
}
.wt-tab:hover .wt-close, .wt-tab.active .wt-close { display: inline-flex; }
.wt-close:hover { background: var(--bg-active); color: var(--text); }
.wt-add { margin-left: 2px; }

/* ---------- 侧边栏 ---------- */
.sidebar {
  width: 248px; min-width: 248px; height: 100%;
  background: var(--bg-sidebar);
  display: flex; flex-direction: column;
  position: relative; z-index: 50;
  transition: margin-left 0.25s ease;
}
.sidebar.collapsed { margin-left: -248px; }

.sidebar-top { padding: 8px 8px 4px; }

/* 工作区切换器 */
.ws-switcher {
  display: flex; align-items: center; gap: 8px;
  width: 100%; padding: 6px 8px; border-radius: 6px;
  cursor: pointer; transition: background 0.12s ease;
  position: relative;
}
.ws-switcher:hover { background: var(--bg-hover); }
.ws-avatar {
  width: 22px; height: 22px; border-radius: 4px;
  background: var(--avatar-orange); color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 12px; font-weight: 600; flex-shrink: 0;
}
.ws-name { font-size: 14px; font-weight: 500; flex: 1; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ws-caret { color: var(--text-tertiary); display: inline-flex; }

/* 顶部导航行：主页 / 对话 / 会议 / 收件箱（激活项展开为胶囊）+ 搜索 */
.side-quick-row { display: flex; align-items: center; gap: 2px; padding: 2px 0 0; }
.quick-btn {
  position: relative; height: 28px; min-width: 28px; padding: 0 6px;
  border-radius: 6px; gap: 5px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-secondary); cursor: pointer; user-select: none;
  transition: background 0.12s ease, color 0.12s ease;
}
.quick-btn:hover { background: var(--bg-hover); color: var(--text); }
.quick-btn.active { background: var(--bg-active); color: var(--text); padding: 0 9px 0 7px; }
.quick-btn .quick-label { font-size: 14px; font-weight: 500; white-space: nowrap; }
.quick-search { margin-left: auto; }
.quick-badge {
  position: absolute; top: -1px; right: -1px;
  min-width: 15px; height: 15px; padding: 0 4px; border-radius: 8px;
  background: var(--badge-bg); color: #fff; font-size: 10px; line-height: 15px;
  text-align: center; font-weight: 600;
}
.quick-btn.active .quick-badge { position: static; margin-left: 1px; }

/* 「对话」模式：代理磁贴 */
.agent-row { display: flex; gap: 10px; padding: 6px 16px 2px; }
.agent-tile {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  width: 58px; cursor: pointer; user-select: none;
}
.agent-avatar {
  width: 42px; height: 42px; border-radius: 50%;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--bg); color: var(--text);
  box-shadow: 0 0 0 1px var(--border), 0 1px 3px rgba(15,15,15,0.08);
  transition: transform 0.12s ease;
}
.agent-avatar.dashed { border: 1.4px dashed var(--border-strong); box-shadow: none; color: var(--text-tertiary); }
.agent-tile:hover .agent-avatar { transform: translateY(-1px); }
.agent-tile.active .agent-avatar { box-shadow: 0 0 0 2px var(--accent); }
.agent-tile.active .agent-name { color: var(--text); font-weight: 600; }
.agent-name {
  font-size: 11px; color: var(--text-tertiary); max-width: 58px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: center;
}
.chat-agent-tag { font-size: 10px; color: var(--text-tertiary); border: 1px solid var(--border); border-radius: 999px; padding: 0 5px; margin-left: 6px; flex-shrink: 0; }
.chat-row .chat-date { font-size: 12px; color: var(--text-tertiary); flex-shrink: 0; margin-left: 6px; }
.chat-row:hover .chat-date { color: var(--text-secondary); }

/* 「会议」模式：日程占位行 */
.side-event { color: var(--text-tertiary); cursor: default; }
.side-event:hover { background: transparent; }
.side-event .side-kbd { font-variant-numeric: tabular-nums; }

/* 「收件箱」模式：通知列表 */
.side-section-title .inbox-tools { margin-left: auto; display: none; gap: 2px; }
.side-section-title:hover .inbox-tools { display: inline-flex; }
.inbox-list { padding: 0 8px; }
.inbox-row {
  position: relative; display: flex; align-items: flex-start; gap: 8px;
  padding: 7px 8px; border-radius: 6px; cursor: pointer;
  transition: background 0.12s ease; user-select: none;
}
.inbox-row:hover { background: var(--bg-hover); }
.inbox-row .inbox-ic { color: var(--text-tertiary); margin-top: 2px; flex-shrink: 0; }
.inbox-row .inbox-avatar {
  width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; margin-top: 1px;
  display: inline-flex; align-items: center; justify-content: center;
  color: #fff; font-size: 10px; font-weight: 600;
}
.inbox-row .inbox-main { flex: 1; min-width: 0; }
.inbox-row .inbox-line { display: flex; align-items: baseline; gap: 6px; }
.inbox-row .inbox-title {
  flex: 1; min-width: 0; font-size: 13px; color: var(--text-secondary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.inbox-row.unread .inbox-title { color: var(--text); font-weight: 500; }
.inbox-row .inbox-date { font-size: 12px; color: var(--text-tertiary); flex-shrink: 0; }
.inbox-row .inbox-desc {
  /* 原先这里先写 display: block 再写 display: -webkit-box。同一声明块内后写者胜，
     block 是死声明。若真要保留兜底意图，正确写法是把 -webkit-box 三行连同
     display 一起放进 @supports (-webkit-line-clamp: 2)，那是另一次改动。 */
  font-size: 12px; color: var(--text-tertiary);
  line-height: 1.45; margin-top: 2px;
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
}
.inbox-row .inbox-dot {
  position: absolute; right: 8px; bottom: 10px;
  width: 6px; height: 6px; border-radius: 50%; background: var(--accent);
}

/* 折叠按钮：悬停侧边栏时显示 */
.sidebar-collapse-btn {
  position: absolute; top: 10px; right: 8px;
  width: 26px; height: 26px; border-radius: 6px;
  display: none; align-items: center; justify-content: center;
  color: var(--text-tertiary); z-index: 60;
}
.sidebar:hover .sidebar-collapse-btn { display: inline-flex; }
.sidebar-collapse-btn:hover { background: var(--bg-hover); color: var(--text); }

/* 侧边栏导航项 */
.side-item {
  display: flex; align-items: center; gap: 8px;
  width: 100%; padding: 4px 8px; min-height: 28px;
  border-radius: 6px; font-size: 14px; color: var(--text-secondary);
  cursor: pointer; transition: background 0.12s ease; user-select: none;
  position: relative;
}
.side-item:hover { background: var(--bg-hover); }
.side-item.active { background: var(--bg-active); color: var(--text); font-weight: 500; }
.side-item .side-icon {
  width: 22px; height: 22px; display: inline-flex; align-items: center; justify-content: center;
  font-size: 15px; flex-shrink: 0; color: var(--text-secondary);
}
.side-item.active .side-icon { color: var(--text); }
.side-item .side-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.side-item .side-kbd { font-size: 11px; color: var(--text-tertiary); }

/* 分区标题 */
.side-section { padding: 14px 8px 2px; }
.side-section-title {
  display: flex; align-items: center;
  padding: 2px 8px; font-size: 12px; font-weight: 600;
  color: var(--text-tertiary); user-select: none;
}
.side-section-title .section-plus {
  margin-left: auto; width: 20px; height: 20px; border-radius: 4px;
  display: none; align-items: center; justify-content: center;
  color: var(--text-tertiary); font-size: 14px;
}
.side-section-title:hover .section-plus { display: inline-flex; }
.side-section-title .section-plus:hover { background: var(--bg-hover); color: var(--text); }

.sidebar-scroll { flex: 1; overflow-y: auto; overflow-x: hidden; padding-bottom: 8px; }
.sidebar-bottom { padding: 4px 8px 8px; }

/* 「会议」区操作行：图标 + 标题 + 说明 + ＋ */
.side-action {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 4px 8px; border-radius: 6px; margin: 0 8px;
  cursor: pointer; transition: background 0.12s ease; user-select: none;
}
.side-action:hover { background: var(--bg-hover); }
.side-action .side-icon { margin-top: 2px; }
.side-action .sa-text { flex: 1; min-width: 0; }
.side-action .sa-label {
  display: block; font-size: 14px; color: var(--text-secondary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.side-action .sa-desc {
  display: block; font-size: 12px; color: var(--text-tertiary); line-height: 1.4; margin-top: 1px;
}
.side-action .sa-plus {
  width: 20px; height: 20px; border-radius: 4px; margin-top: 2px;
  display: none; align-items: center; justify-content: center; color: var(--text-tertiary);
}
.side-action:hover .sa-plus { display: inline-flex; }
.side-action .sa-plus:hover { background: var(--bg-active); color: var(--text); }

/* 分区「更多 / 收起」 */
.side-more { color: var(--text-tertiary); }
.side-more .tree-toggle { visibility: visible; }

/* 底部「全新」主按钮 */
.sidebar-newpage {
  display: flex; align-items: center; gap: 8px;
  height: 32px; margin-top: 6px; padding: 0 10px;
  border: 1px solid var(--border-strong); border-radius: 8px;
  background: var(--bg); color: var(--text);
  font-size: 14px; font-weight: 500; cursor: pointer;
  transition: background 0.12s ease; user-select: none;
}
.sidebar-newpage:hover { background: var(--bg-hover); }
.sidebar-newpage .np-label { flex: 1; }
.sidebar-newpage .np-kbd { font-size: 11px; color: var(--text-tertiary); }

/* 页面树 */
.page-tree { padding: 0 8px; }
.tree-item { position: relative; }
.tree-row {
  display: flex; align-items: center; gap: 4px;
  padding: 2px 6px 2px 4px; min-height: 28px;
  border-radius: 6px; font-size: 14px; color: var(--text-secondary);
  cursor: pointer; transition: background 0.12s ease; user-select: none;
}
.tree-row:hover { background: var(--bg-hover); }
.tree-row.active { background: var(--bg-active); color: var(--text); font-weight: 500; }
.tree-toggle {
  width: 20px; height: 20px; border-radius: 4px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-tertiary); font-size: 10px;
  transition: transform 0.15s ease, background 0.12s ease;
}
.tree-toggle:hover { background: var(--bg-active); }
.tree-toggle.open { transform: rotate(90deg); }
.tree-toggle.leaf { visibility: hidden; }
.tree-icon { width: 20px; text-align: center; flex-shrink: 0; font-size: 15px; }
.tree-label { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tree-actions { display: none; align-items: center; gap: 2px; flex-shrink: 0; }
.tree-row:hover .tree-actions { display: inline-flex; }
.tree-action-btn {
  width: 20px; height: 20px; border-radius: 4px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-tertiary); font-size: 13px;
}
.tree-action-btn:hover { background: var(--bg-active); color: var(--text); }
.tree-children { margin-left: 14px; }
.tree-children.collapsed { display: none; }
.tree-rename-input {
  flex: 1; height: 22px; font-size: 14px; padding: 0 4px;
  border: 1px solid var(--accent); border-radius: 4px; background: var(--bg-input);
}

/* ---------- 内容区 ---------- */
.main-area {
  flex: 1; min-width: 0; height: 100%;
  display: flex; flex-direction: column;
  background: var(--bg);
}

/* 顶栏 */
.topbar {
  height: 45px; min-height: 45px;
  display: flex; align-items: center; gap: 4px;
  padding: 0 12px;
  font-size: 14px;
}
.breadcrumb { display: flex; align-items: center; gap: 2px; flex: 1; min-width: 0; overflow: hidden; }
.crumb {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 3px 7px; border-radius: 5px; max-width: 200px;
  color: var(--text-secondary); cursor: pointer; white-space: nowrap;
  overflow: hidden; text-overflow: ellipsis;
}
.crumb:hover { background: var(--bg-hover); }
.crumb.current { color: var(--text); font-weight: 500; }
.crumb-sep { color: var(--text-tertiary); font-size: 12px; flex-shrink: 0; }
.topbar-actions { display: flex; align-items: center; gap: 2px; flex-shrink: 0; }
.topbar-actions .btn-share { height: 28px; padding: 0 10px; font-size: 13px; }
.topbar-actions .btn-share:hover { background: var(--bg-hover); }
.topbar-star { color: var(--text-secondary); width: 30px; height: 30px; }
.topbar-star.faved { color: #f6c050; }
.topbar-star.faved svg { fill: currentColor; }
/* 「上次编辑 4月26日」 */
.topbar-meta {
  font-size: 12px; color: var(--text-tertiary);
  margin-right: 6px; white-space: nowrap;
}
/* 访问范围标签：🔒 私人 ⌄ */
.topbar-chip {
  display: inline-flex; align-items: center; gap: 4px; flex-shrink: 0;
  height: 24px; padding: 0 6px; margin-left: 4px; border-radius: 5px;
  font-size: 12px; color: var(--text-tertiary);
  cursor: pointer; transition: background 0.12s ease; user-select: none;
}
.topbar-chip:hover { background: var(--bg-hover); color: var(--text-secondary); }
@media (max-width: 820px) { .topbar-meta { display: none; } }

/* .ai-fab（右下角 Notion AI 浮动入口）已随 ai.js 伪面板一并移除
   （2026-08-20 演示残留清算）。 */
.main-area { position: relative; }

/* 内容滚动区 */
.content-scroll { flex: 1; overflow-y: auto; overflow-x: hidden; position: relative; }

/* ---------- 页面编辑器 ---------- */
.page-editor { padding-bottom: 30vh; }
.page-cover {
  height: 200px; width: 100%; position: relative;
  background-size: cover; background-position: center;
}
.page-cover .cover-actions {
  position: absolute; right: 24px; bottom: 12px;
  display: none; gap: 6px;
}
.page-cover:hover .cover-actions { display: flex; }
.cover-btn {
  padding: 4px 8px; border-radius: 5px; font-size: 12px;
  background: rgba(255,255,255,0.85); color: var(--on-light-text);
  border: 1px solid rgba(0,0,0,0.1);
}
.cover-btn:hover { background: #fff; }

.page-body { max-width: 760px; margin: 0 auto; padding: 0 56px; }
.page-icon-wrap { position: relative; height: 0; }
/* 无封面时 wrap 必须真的占位。.page-icon 是 absolute + bottom:-8px，从 wrap 底边
   向上撑开 82px：有封面时它正好压在 200px 封面的下沿（Notion 的效果），
   无封面时 wrap 高度为 0 且上方无物，图标会整体溢出到内容区顶部之外被裁掉
   （实测 top:-74，82px 高只露 8px）。给 wrap 82px 高度后图标落在容器内，
   顶部留 8px。 */
.page-icon-wrap.no-cover { height: 82px; }
.page-icon {
  position: absolute; bottom: -8px; left: -4px;
  font-size: 78px; line-height: 1; cursor: pointer;
  border-radius: 8px; padding: 2px 6px;
  transition: background 0.12s ease; user-select: none;
}
.page-icon:hover { background: var(--bg-hover); }
.page-icon.on-cover { bottom: -46px; }
.page-head-space { height: 56px; }
/* 有图标且无封面时，图标已由 .page-icon-wrap.no-cover 占掉 82px，
   这里只需一个小间隙——与 on-cover 同值（都属于「上方已有内容」的情形）。
   原值 76px 是在图标不占位的前提下写的，图标修好后会变成双份留白。 */
.page-head-space.has-icon { height: 12px; }
.page-head-space.on-cover { height: 12px; }
.page-head-space.has-icon.on-cover { height: 62px; }

.page-tool-row {
  display: flex; gap: 4px; margin-bottom: 4px;
  opacity: 0; transition: opacity 0.15s ease; height: 26px; align-items: center;
}
.page-editor:hover .page-tool-row, .page-tool-row.pin { opacity: 1; }
.page-tool-btn {
  padding: 3px 7px; border-radius: 5px; font-size: 13px;
  color: var(--text-tertiary); display: inline-flex; align-items: center; gap: 5px;
}
.page-tool-btn:hover { background: var(--bg-hover); color: var(--text-secondary); }

.page-title-input {
  width: 100%; border: none; background: transparent;
  font-size: 40px; font-weight: 700; line-height: 1.2;
  color: var(--text); padding: 4px 0 8px;
  letter-spacing: -0.5px;
}
.page-title-input::placeholder { color: var(--border-strong); }
html[data-theme="dark"] .page-title-input::placeholder { color: #4a4a4a; }

/* ---------- 块 ---------- */
.blocks-area { min-height: 60px; }
.block {
  position: relative; display: flex; align-items: flex-start;
  border-radius: 4px; padding: 1px 2px;
}
.block:hover { background: rgba(0,0,0,0.015); }
html[data-theme="dark"] .block:hover { background: rgba(255,255,255,0.02); }

.block-side {
  position: absolute; left: -46px; top: 2px;
  display: flex; align-items: center; gap: 0;
  opacity: 0; transition: opacity 0.12s ease; user-select: none;
}
.block:hover .block-side { opacity: 1; }
.block-side-btn {
  width: 22px; height: 24px; border-radius: 4px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-tertiary); font-size: 15px; cursor: pointer;
}
.block-side-btn:hover { background: var(--bg-hover); color: var(--text-secondary); }
.block-handle { cursor: grab; font-size: 13px; letter-spacing: -2px; }
.block-handle:active { cursor: grabbing; }

.block-content { flex: 1; min-width: 0; }

/* 可编辑区域占位符 */
.editable { outline: none; word-break: break-word; line-height: 1.6; min-height: 1.6em; }
.editable:empty::before {
  content: attr(data-placeholder);
  color: var(--text-tertiary); pointer-events: none;
}
.editable code {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 85%; background: var(--bg-tertiary); color: var(--code-inline-text);
  padding: 1px 4px; border-radius: 4px;
}

/* 各块类型 */
.block-h1 .editable { font-size: 1.875em; font-weight: 700; line-height: 1.3; padding: 14px 0 2px; letter-spacing: -0.3px; }
.block-h2 .editable { font-size: 1.5em; font-weight: 600; line-height: 1.3; padding: 12px 0 2px; letter-spacing: -0.2px; }
.block-h3 .editable { font-size: 1.25em; font-weight: 600; line-height: 1.3; padding: 8px 0 2px; }
.block-text .editable { padding: 3px 0; }

.block-todo { display: flex; align-items: flex-start; gap: 6px; padding: 3px 0; }
.todo-checkbox {
  width: 16px; height: 16px; margin-top: 5px; flex-shrink: 0;
  border: 1.4px solid var(--text-secondary); border-radius: 2px;
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  background: transparent; transition: background 0.12s ease;
  color: #fff; font-size: 11px;
}
.todo-checkbox.checked { background: var(--accent); border-color: var(--accent); }
.todo-checkbox:hover { border-color: var(--accent); }
.block-todo .editable { flex: 1; }
.block-todo.done .editable { text-decoration: line-through; color: var(--text-tertiary); }

.block-bullet, .block-number { display: flex; align-items: flex-start; gap: 6px; padding: 3px 0; }
.bullet-marker { flex-shrink: 0; width: 18px; text-align: center; line-height: 1.6; user-select: none; }
.number-marker { flex-shrink: 0; min-width: 18px; text-align: right; line-height: 1.6; user-select: none; font-variant-numeric: tabular-nums; }
.block-bullet .editable, .block-number .editable { flex: 1; }

.block-toggle .toggle-head { display: flex; align-items: flex-start; gap: 4px; padding: 3px 0; }
.toggle-arrow {
  width: 22px; height: 24px; flex-shrink: 0; border-radius: 4px;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text-secondary); font-size: 11px; cursor: pointer;
  transition: transform 0.15s ease, background 0.12s ease; user-select: none;
}
.toggle-arrow:hover { background: var(--bg-hover); }
.toggle-arrow.open { transform: rotate(90deg); }
.block-toggle .editable { flex: 1; }
.toggle-children { margin-left: 26px; }
.toggle-children.collapsed { display: none; }
.toggle-empty-hint { color: var(--text-tertiary); font-size: 14px; padding: 3px 0; cursor: pointer; }
.toggle-empty-hint:hover { color: var(--text-secondary); }

.block-quote {
  border-left: 3px solid var(--text); padding: 3px 0 3px 14px;
  margin: 4px 0; font-size: 1.05em;
}
.block-quote .editable { font-size: inherit; }

.block-callout {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 14px 14px 14px 12px; border-radius: 8px; margin: 4px 0;
  background: var(--bg-secondary);
}
.callout-icon {
  font-size: 18px; line-height: 1.4; cursor: pointer;
  border-radius: 4px; padding: 0 2px; user-select: none; flex-shrink: 0;
}
.callout-icon:hover { background: var(--bg-hover); }
.block-callout .editable { flex: 1; }
.block-callout.bg-gray { background: var(--bg-secondary); }
.block-callout.bg-blue { background: var(--accent-soft); }
.block-callout.bg-yellow { background: rgba(253, 236, 200, 0.5); }
html[data-theme="dark"] .block-callout.bg-yellow { background: rgba(137, 99, 42, 0.3); }
.block-callout.bg-green { background: rgba(219, 237, 219, 0.5); }
html[data-theme="dark"] .block-callout.bg-green { background: rgba(43, 89, 63, 0.3); }
.block-callout.bg-red { background: rgba(255, 226, 221, 0.5); }
html[data-theme="dark"] .block-callout.bg-red { background: rgba(110, 54, 48, 0.3); }

/* ---------- 五种讲法卡片（S3；版式重设计 刀一） ----------
   单色纪律（防后人回填）：这个界面已经用颜色编码「状态」（生成失败红 /
   备用降级黄 / gate 三态 / 易错点琥珀），再用颜色编码「分类」就是两套语义
   抢同一个通道。讲法分类靠图标形状与版式差异承载——卡片一律白底描边。
   双密度（C4 课堂投影同一份渲染）：卡片内字号走 --teach-* 变量组，
   .classroom-stage 覆写一次即得投影密度。 */
.teach-card {
  --teach-stem: 15.5px; --teach-body: 14.5px; --teach-note: 12.5px; --teach-lead: 16px;
  border: 1px solid var(--border); border-radius: 8px;
  padding: 10px 14px; margin: 4px 0;
  background: var(--bg);
}
.teach-head { display: flex; align-items: center; gap: 8px; }
.teach-icon { color: var(--text-secondary); display: inline-flex; }
.teach-title { font-weight: 600; font-size: 14px; }
.teach-sub { font-size: 12px; color: var(--text-tertiary); }
.teach-tag {
  font-size: 11px; color: var(--text-secondary);
  background: var(--bg-tertiary); padding: 1px 6px; border-radius: 4px;
}
.teach-gate {
  margin-left: auto; padding: 1px 7px; border-radius: 4px;
  font-size: 11px; font-weight: 600; line-height: 1.5;
  border: 1px solid transparent; cursor: help;
}
.teach-gate.gate-pass { color: var(--tag-green-text); background: var(--tag-green); }
.teach-gate.gate-fail { color: var(--tag-red-text); background: var(--tag-red); }
.teach-gate.gate-unverifiable {
  color: var(--tag-gray-text); border-color: var(--border-strong);
  background: repeating-linear-gradient(135deg, var(--tag-gray), var(--tag-gray) 4px, transparent 4px, transparent 8px);
}
.teach-body { margin-top: 8px; display: flex; flex-direction: column; gap: 8px; }
.teach-empty { color: var(--text-tertiary); font-size: 13px; }
/* 卡头右侧 ⋯：原地展开的 details（不引入弹出菜单），本刀只承载原始规格 JSON */
.teach-more { margin-left: auto; max-width: 100%; }
.teach-more > summary { list-style: none; text-align: right; }
.teach-more > summary::-webkit-details-marker { display: none; }
/* visual：图占满卡宽，说明降为图下 caption */
.teach-fig { min-width: 0; }
.teach-fig-cap { margin-top: 6px; font-size: 15px; color: var(--text); line-height: 1.6; }
/* analogy：正文升为主体，约束降为脚注 */
.teach-analogy-lead { display: flex; gap: 8px; align-items: baseline; }
.teach-analogy-lead .teach-lead { flex: 1; min-width: 0; }
.teach-analogy ~ .teach-analogy, .teach-gsec ~ .teach-gsec {
  border-top: 1px dashed var(--border); padding-top: 8px;
}
.teach-idx {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 12px; color: var(--text-tertiary); flex-shrink: 0;
}
.teach-lead { font-size: var(--teach-lead); font-weight: 500; color: var(--text); line-height: 1.55; }
.teach-note { font-size: var(--teach-note); color: var(--text-secondary); line-height: 1.55; }
.teach-note.caution { color: var(--tag-yellow-text); }
/* workedExample：难度分组标题 + 题干浅底块 + 编号步骤轨 + 答案折叠 */
.teach-group { display: flex; flex-direction: column; gap: 8px; }
.teach-example { display: flex; flex-direction: column; gap: 6px; }
.teach-level {
  display: flex; align-items: center; gap: 8px;
  font-size: 12px; color: var(--text-tertiary);
}
.teach-level::after { content: ''; flex: 1; border-top: 1px solid var(--border); }
.teach-stem {
  font-size: var(--teach-stem); line-height: 1.6;
  background: var(--bg-secondary); border-left: 2px solid var(--border-strong);
  padding: 6px 10px; border-radius: 0 6px 6px 0;
}
.teach-track { display: flex; flex-direction: column; gap: 6px; }
.teach-srow { display: flex; gap: 8px; }
.teach-snum {
  width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0; margin-top: 1px;
  background: var(--bg); border: 1px solid var(--border-strong);
  color: var(--text-tertiary); font-size: 11px;
  display: inline-flex; align-items: center; justify-content: center;
}
.teach-scol { flex: 1; min-width: 0; }
.teach-purpose { font-size: 11.5px; color: var(--text-tertiary); }
.teach-work { font-size: var(--teach-body); line-height: 1.6; }
.teach-pitfall { font-size: var(--teach-note); color: var(--tag-yellow-text); }
/* 答案折叠（workedExample / practice 共用）：gate 徽标挂 summary，合上也能看到判定 */
.teach-ans > summary {
  cursor: pointer; font-size: 12.5px; color: var(--text-secondary);
  display: flex; align-items: center; gap: 6px; user-select: none;
}
.teach-ans > summary .teach-gate { margin-left: 0; }
.teach-ans-body { margin-top: 4px; font-size: var(--teach-body); line-height: 1.6; }
.teach-ans-line { display: flex; gap: 6px; }
.teach-ans-label { flex-shrink: 0; font-size: 12px; color: var(--text-tertiary); padding-top: 2px; }
.teach-ans-val { flex: 1; min-width: 0; word-break: break-word; }
/* practice：题表 + 卡脚动作 */
.teach-q { display: flex; gap: 8px; align-items: baseline; }
.teach-q-text { flex: 1; min-width: 0; font-size: var(--teach-body); line-height: 1.6; }
.teach-foot {
  margin-top: 10px; padding-top: 8px; border-top: 1px solid var(--border);
  display: flex; align-items: center; gap: 10px;
  font-size: 12px; color: var(--text-tertiary);
}
.teach-foot .teach-kp-all { margin-right: auto; }
/* guide：编号文档流 + 「编排自 X」中性徽标 */
.teach-gsec { display: flex; flex-direction: column; gap: 4px; }
.teach-gsec-head { display: flex; align-items: baseline; gap: 8px; font-size: 15px; font-weight: 600; }
.teach-gsec-body { font-size: 14px; color: var(--text-secondary); line-height: 1.6; }
.teach-src {
  display: inline-block; font-size: 11px; font-weight: 400;
  background: var(--bg-tertiary); color: var(--text-secondary);
  padding: 1px 6px; border-radius: 4px;
}
/* C3 生成元数据横幅：失败（红）/ 降级备用模型（黄），人审知情前提 */
.teach-gen-banner {
  margin-top: 8px; padding: 6px 10px; border-radius: 6px;
  font-size: 12px; line-height: 1.5;
  display: flex; align-items: center; gap: 8px;
}
.teach-gen-failed {
  background: rgba(255, 226, 221, 0.6); color: #9f3431;
  border: 1px solid rgba(159, 52, 49, 0.35);
}
html[data-theme="dark"] .teach-gen-failed {
  background: rgba(110, 54, 48, 0.35); color: #eb9a97;
}
.teach-gen-degraded {
  background: rgba(253, 242, 220, 0.7); color: #8a6a1d;
  border: 1px solid rgba(138, 106, 29, 0.35);
}
html[data-theme="dark"] .teach-gen-degraded {
  background: rgba(137, 99, 42, 0.3); color: #e3c26f;
}

/* ---------- 教学包页头 / 吸顶讲法导航 / 页内审阅条（版式重设计 刀二，D2/D3）----------
   沿用卡片的单色纪律：颜色只表状态（失败红 / 降级黄），分类靠图标与短名；
   三件是屏幕家具（打印段 display:none），不进课堂 overlay。 */
.teach-pagehead { margin: 2px 0 10px; }
.teach-pagehead-title { display: flex; align-items: center; gap: 8px; }
.teach-pagehead-icon { font-size: 18px; line-height: 1; }
.teach-pagehead-name { font-size: 15px; font-weight: 600; color: var(--text-secondary); }
.teach-review-chip {
  margin-left: auto; flex-shrink: 0;
  font-size: 11px; color: var(--text-secondary);
  background: var(--bg-tertiary); padding: 1px 8px; border-radius: 999px;
}
.teach-pagehead-meta { margin-top: 4px; font-size: 12.5px; color: var(--text-tertiary); }
/* 吸顶导航：滚动容器是 #content-scroll，中间祖先（.page-editor/.page-body）
   均无 overflow，sticky 生效；容器要实底色，否则滚过时内容透出来 */
.teach-nav {
  position: sticky; top: 0; z-index: 5;
  display: flex; flex-wrap: wrap; gap: 6px;
  padding: 6px 0; margin-bottom: 6px;
  background: var(--bg); border-bottom: 1px solid var(--border);
}
.teach-chip {
  display: inline-flex; align-items: center; gap: 5px;
  font-size: 12px; color: var(--text-secondary);
  border: 1px solid var(--border); border-radius: 999px;
  padding: 2px 10px; background: var(--bg); cursor: pointer;
}
.teach-chip:hover { background: var(--bg-secondary); }
.teach-chip .ic { display: inline-flex; }
.teach-chip-count {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 11px; color: var(--text-tertiary);
}
.teach-chip.failed { color: var(--tag-red-text); background: var(--tag-red); border-color: transparent; }
.teach-chip.failed .teach-chip-count { color: inherit; }
.teach-chip.degraded { color: var(--tag-yellow-text); background: var(--tag-yellow); border-color: transparent; }
.teach-chip.degraded .teach-chip-count { color: inherit; }
.teach-review-bar {
  display: flex; align-items: flex-start; gap: 10px;
  border: 1px solid var(--border); border-radius: 8px;
  padding: 8px 12px; margin: 4px 0 10px; background: var(--bg-secondary);
}
.teach-review-main { flex: 1; min-width: 0; font-size: 13px; line-height: 1.6; }
.teach-review-text { color: var(--text); }
.teach-review-warn { margin-top: 3px; font-size: 12px; color: var(--tag-yellow-text); }
.teach-review-confirm { flex-shrink: 0; }

/* ---------- 会议速记卡片 ---------- */
.meeting-card {
  background: #f1f5fd; border-radius: 10px;
  padding: 14px 16px 12px; margin: 6px 0 10px;
}
html[data-theme="dark"] .meeting-card { background: #1e2836; }
.mc-head { display: flex; align-items: center; gap: 6px; color: var(--text-secondary); }
.mc-emoji {
  width: 22px; height: 22px; border-radius: 5px; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: rgba(255,255,255,0.75); font-size: 13px;
}
html[data-theme="dark"] .mc-emoji { background: rgba(255,255,255,0.08); }
.mc-title { font-size: 15px; font-weight: 600; color: var(--text); margin-left: 2px; }
/* .mc-tabs/.mc-tab/.mc-set/.mc-rec/.recording/.mc-foot*/.mc-format 已随会议卡片
   假转录控件一并摘除（2026-08-20 演示残留清算）；会议笔记卡片只剩标题行 + 提示行。 */
.mc-body { font-size: 14px; color: var(--text-tertiary); padding: 4px 0 14px; }

.block-divider { padding: 8px 0; }
.block-divider hr { border: none; border-top: 1px solid var(--border-strong); }

.block-code {
  background: var(--bg-code); border: 1px solid var(--border);
  border-radius: 6px; margin: 4px 0; position: relative;
}
.code-lang-tag {
  position: absolute; top: 6px; right: 10px;
  font-size: 11px; color: var(--text-tertiary); user-select: none;
}
.code-input {
  display: block; width: 100%; min-height: 60px;
  background: transparent; border: none; resize: none; outline: none;
  padding: 26px 14px 12px;
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 13px; line-height: 1.6; color: var(--text);
  white-space: pre-wrap; word-break: break-all;
}

/* 拖拽指示线 */
.block.drop-before::before, .block.drop-after::after {
  content: ""; position: absolute; left: 0; right: 0; height: 3px;
  background: var(--accent); border-radius: 2px; z-index: 10; pointer-events: none;
}
.block.drop-before::before { top: -2px; }
.block.drop-after::after { bottom: -2px; }
.block.dragging { opacity: 0.4; }

/* ---------- slash 菜单 ---------- */
.slash-menu { max-height: 320px; overflow-y: auto; width: 300px; }
.slash-menu .menu-item { padding: 5px 8px; }
.slash-empty { padding: 12px; font-size: 13px; color: var(--text-tertiary); text-align: center; }

/* ---------- 行内格式浮动工具栏 ---------- */
.inline-toolbar {
  position: fixed; z-index: 1100;
  display: flex; align-items: center; gap: 1px;
  background: var(--bg-modal); border-radius: 8px;
  box-shadow: var(--shadow-menu); padding: 3px;
  animation: pop-in 0.1s ease;
}
.inline-toolbar button {
  min-width: 28px; height: 26px; padding: 0 6px; border-radius: 4px;
  font-size: 13px; color: var(--text-secondary);
  display: inline-flex; align-items: center; justify-content: center;
}
.inline-toolbar button:hover { background: var(--bg-hover); color: var(--text); }
.inline-toolbar button b { font-weight: 700; }
.inline-toolbar .tb-sep { width: 1px; height: 16px; background: var(--border); margin: 0 3px; }

/* ---------- emoji 选择器 ---------- */
.emoji-picker { width: 316px; padding: 10px; }
.emoji-picker .popup-title { padding: 0 4px 8px; }
.emoji-grid { display: grid; grid-template-columns: repeat(8, 1fr); gap: 2px; }
.emoji-cell {
  height: 34px; border-radius: 6px; font-size: 20px;
  display: flex; align-items: center; justify-content: center; cursor: pointer;
}
.emoji-cell:hover { background: var(--bg-hover); }
.emoji-picker .emoji-remove { margin-top: 8px; }

/* 封面选择器 */
.cover-picker { width: 300px; padding: 12px; }
.cover-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; }
.cover-swatch {
  height: 52px; border-radius: 6px; cursor: pointer;
  border: 2px solid transparent; transition: border-color 0.12s ease, transform 0.12s ease;
}
.cover-swatch:hover { transform: scale(1.03); border-color: var(--accent); }

/* ============================================================
   app.css（续）— 数据库视图、主页、弹窗内部
   ============================================================ */

/* ---------- 数据库块 ---------- */
.db-block { margin: 8px 0; }
.db-head { display: flex; align-items: center; gap: 8px; padding: 4px 0; }
.db-title-input {
  border: none; background: transparent; font-size: 16px; font-weight: 600;
  color: var(--text); flex: 1; min-width: 0; padding: 2px 4px; border-radius: 4px;
}
.db-title-input:hover { background: var(--bg-hover); }
.db-title-input:focus { background: var(--bg-hover); }
.db-views-bar {
  display: flex; align-items: center; gap: 2px;
  border-bottom: 1px solid var(--border); padding-bottom: 0;
  margin-bottom: 2px; overflow-x: auto;
}
.db-view-tab {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 5px 8px; font-size: 13px; color: var(--text-secondary);
  border-bottom: 2px solid transparent; margin-bottom: -1px;
  cursor: pointer; white-space: nowrap; user-select: none;
}
.db-view-tab:hover { color: var(--text); }
.db-view-tab.active { color: var(--text); font-weight: 500; border-bottom-color: var(--text); }
.db-view-add {
  padding: 5px 8px; font-size: 13px; color: var(--text-tertiary);
  cursor: pointer; white-space: nowrap;
}
.db-view-add:hover { color: var(--text); }

/* 表格视图 */
.db-table-wrap { overflow-x: auto; padding: 4px 0 10px; }
.db-table { border-collapse: collapse; min-width: 100%; }
.db-table th, .db-table td {
  border: 1px solid var(--border); padding: 0;
  font-size: 14px; vertical-align: middle;
  min-width: 120px; max-width: 260px; height: 34px;
  background: var(--bg);
  position: relative;
}
.db-table th {
  background: var(--bg-secondary); font-weight: 500; text-align: left;
  color: var(--text-secondary); font-size: 13px; height: 32px;
  cursor: pointer; user-select: none;
}
.db-table th:hover { background: var(--bg-hover); }
.db-th-inner { display: flex; align-items: center; gap: 6px; padding: 0 8px; height: 32px; }
.db-th-icon { font-size: 12px; flex-shrink: 0; }
.db-th-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.db-table td.cell-title { min-width: 200px; }
.db-cell {
  width: 100%; height: 100%; min-height: 34px;
  padding: 5px 8px; display: flex; align-items: center; flex-wrap: wrap; gap: 2px;
  cursor: pointer; overflow: hidden;
}
.db-cell:hover { background: var(--bg-hover); }
.db-cell input[type="text"], .db-cell input[type="number"], .db-cell input[type="date"] {
  width: 100%; border: none; background: transparent; font-size: 14px; padding: 0;
  color: var(--text);
}
.db-cell input[type="date"] { cursor: text; }
.db-cell .cell-placeholder { color: var(--text-tertiary); font-size: 13px; }
.db-cell input[type="checkbox"] { width: 15px; height: 15px; accent-color: var(--accent); cursor: pointer; }
.db-row-menu-btn {
  position: absolute; left: -26px; top: 50%; transform: translateY(-50%);
  width: 20px; height: 20px; border-radius: 4px;
  display: none; align-items: center; justify-content: center;
  color: var(--text-tertiary); font-size: 13px;
}
.db-table tr:hover .db-row-menu-btn { display: inline-flex; }
.db-row-menu-btn:hover { background: var(--bg-hover); color: var(--text); }
.db-add-row {
  display: flex; align-items: center; gap: 6px;
  padding: 6px 8px; margin-top: 2px; border-radius: 5px;
  font-size: 14px; color: var(--text-tertiary); cursor: pointer; user-select: none;
}
.db-add-row:hover { background: var(--bg-hover); }
.db-add-col {
  min-width: 34px !important; width: 34px; cursor: pointer;
  text-align: center; color: var(--text-tertiary); font-size: 15px;
}
.db-add-col:hover { background: var(--bg-hover); color: var(--text); }

/* 选项气泡 */
.opt-list { max-height: 220px; overflow-y: auto; }
.opt-item {
  display: flex; align-items: center; gap: 8px;
  padding: 5px 8px; border-radius: 5px; cursor: pointer; font-size: 14px;
}
.opt-item:hover { background: var(--bg-hover); }
.opt-item .opt-check { width: 16px; text-align: center; color: var(--accent); flex-shrink: 0; }
.opt-create-row { display: flex; gap: 6px; padding: 6px 4px 2px; }
.opt-create-row .input { height: 28px; font-size: 13px; }

/* 看板视图 */
.db-board {
  display: flex; gap: 12px; overflow-x: auto;
  padding: 10px 0 16px; align-items: flex-start;
}
.board-col {
  width: 250px; min-width: 250px;
  background: var(--bg-secondary); border-radius: 8px;
  padding: 8px; display: flex; flex-direction: column; gap: 6px;
}
.board-col.drag-over { outline: 2px solid var(--accent); outline-offset: -2px; }
.board-col-head {
  display: flex; align-items: center; gap: 6px;
  padding: 2px 4px 6px; font-size: 13px; font-weight: 500;
}
.board-col-count { color: var(--text-tertiary); font-weight: 400; }
.board-card {
  background: var(--bg); border-radius: 6px;
  box-shadow: rgba(15,15,15,0.1) 0px 0px 0px 1px, rgba(15,15,15,0.1) 0px 2px 4px;
  padding: 8px 10px; cursor: grab; user-select: none;
  display: flex; flex-direction: column; gap: 5px;
}
.board-card:hover { background: var(--bg-hover); }
.board-card.dragging { opacity: 0.4; }
.board-card-title { font-size: 14px; font-weight: 500; line-height: 1.4; word-break: break-word; }
.board-card-props { display: flex; flex-wrap: wrap; gap: 2px; font-size: 12px; color: var(--text-secondary); }
.board-card-prop { display: inline-flex; align-items: center; gap: 3px; margin-right: 6px; }
.board-add-card {
  display: flex; align-items: center; gap: 6px;
  padding: 5px 6px; border-radius: 5px; margin-top: 2px;
  font-size: 13px; color: var(--text-tertiary); cursor: pointer;
}
.board-add-card:hover { background: var(--bg-hover); color: var(--text-secondary); }

/* 卡片编辑弹层 */
.card-editor { width: 300px; max-height: 420px; overflow-y: auto; padding: 10px; }
.card-editor .ce-field { margin-bottom: 10px; }
.card-editor .ce-label { font-size: 12px; color: var(--text-tertiary); margin-bottom: 4px; }
.card-editor .ce-label .ce-type { margin-left: 4px; }
.card-editor .ce-value { padding: 2px 0; }
.card-editor .ce-value .input { height: 30px; font-size: 13px; }
.ce-opt-row { display: flex; flex-wrap: wrap; gap: 4px; }
.ce-opt {
  padding: 2px 8px; border-radius: 10px; font-size: 12px; cursor: pointer;
  border: 1.5px solid transparent; opacity: 0.55;
}
.ce-opt.on { opacity: 1; border-color: currentColor; }

/* ---------- 主页 ---------- */
.home-page { max-width: 900px; margin: 0 auto; padding: 60px 48px 120px; }
.home-greeting { font-size: 30px; font-weight: 700; margin-bottom: 4px; letter-spacing: -0.4px; }
.home-date { color: var(--text-tertiary); font-size: 14px; margin-bottom: 36px; }
.home-section-title {
  font-size: 13px; font-weight: 600; color: var(--text-secondary);
  margin: 28px 0 10px; display: flex; align-items: center; gap: 6px;
}

/* ---------- 首页看板（S3 骨架；全部走 base.css 令牌，深浅色自适应） ---------- */
.board { margin-top: 8px; }
.board-group { margin-bottom: 22px; }
.board-group-head { display: flex; align-items: center; gap: 6px; padding: 4px 2px; user-select: none; }
.board-group-caret { display: inline-flex; color: var(--text-tertiary); transition: transform 0.12s ease; }
.board-group.collapsed .board-group-caret { transform: rotate(-90deg); }
.board-group-title { font-size: 14px; font-weight: 600; color: var(--text); }
.board-group-count { font-size: 12px; color: var(--text-tertiary); }
.board-group-badge {
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 9px;
  background: var(--badge-bg); color: #fff;
  font-size: 11px; line-height: 18px; text-align: center; font-weight: 600;
}
.board-group-actions { margin-left: auto; display: flex; gap: 2px; }
.board-group-btn { width: 24px; height: 24px; font-size: 13px; color: var(--text-tertiary); }
.board-grid {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  grid-auto-rows: 132px; gap: 12px; margin-top: 8px;
}
.board-widget {
  position: relative; /* S4：.bw-resize 手柄的定位锚 */
  border: 1px solid var(--border); border-radius: 10px; background: var(--bg);
  padding: 10px 12px; display: flex; flex-direction: column; overflow: hidden;
}
.board-widget.dragging { opacity: 0.4; }
/* 四档尺寸（§2.2）：grid-column/row: span N，不做任意像素 */
.bw-1x1 { grid-column: span 1; grid-row: span 1; }
.bw-2x1 { grid-column: span 2; grid-row: span 1; }
.bw-2x2 { grid-column: span 2; grid-row: span 2; }
.bw-1x2 { grid-column: span 1; grid-row: span 2; }
.bw-head { display: flex; align-items: center; margin-bottom: 6px; flex-shrink: 0; }
.bw-name { font-size: 12px; font-weight: 600; color: var(--text-secondary); }
.bw-body { flex: 1; min-height: 0; overflow: auto; font-size: 13px; color: var(--text); }
.bw-row { padding: 5px 6px; border-radius: 6px; cursor: pointer; }
.bw-row:hover { background: var(--bg-hover); }
.bw-row-main { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bw-row-sub { font-size: 12px; color: var(--text-tertiary); margin-top: 1px; }
.bw-empty { color: var(--text-tertiary); font-size: 13px; line-height: 1.5; padding: 6px 2px; }
.bw-more { font-size: 12px; color: var(--text-tertiary); padding: 4px 6px; }
.bw-stat { display: flex; align-items: baseline; gap: 6px; margin: 4px 0; }
.bw-stat-num { font-size: 28px; font-weight: 700; }
.bw-stat-label { font-size: 12px; color: var(--text-tertiary); }
.board-dropzone {
  border: 1.5px dashed var(--border-strong); border-radius: 10px;
  padding: 18px; text-align: center; color: var(--text-tertiary);
  font-size: 13px; margin-top: 8px;
}

/* ---------- 首页看板交互（S4；全部走 base.css 令牌，深浅色自适应） ---------- */
/* 拖动占位符：拖动中只动它不动本体（本体留着 pointer capture） */
.bw-placeholder {
  border: 1.5px dashed var(--accent); border-radius: 10px;
  background: transparent; pointer-events: none;
}
/* 右下角尺寸手柄：28px 大热区（好选中），视觉抓手画在 ::after 角标里。
   拖动中卡片本体随鼠标连续伸缩，松手四档吸附（§2.2） */
.bw-resize {
  position: absolute; right: 0; bottom: 0; width: 28px; height: 28px;
  cursor: nwse-resize; touch-action: none;
}
.bw-resize::after {
  content: ""; position: absolute; right: 5px; bottom: 5px; width: 13px; height: 13px;
  border-right: 2.5px solid var(--border-strong); border-bottom: 2.5px solid var(--border-strong);
  border-bottom-right-radius: 5px; opacity: 0.7;
}
.board-widget:hover .bw-resize::after, .board-widget.bw-resizing .bw-resize::after {
  border-color: var(--accent); opacity: 1;
}
/* 缩放中：卡片本体随鼠标伸缩，浮在邻居之上、accent 描边 */
.board-widget.bw-resizing {
  z-index: 5; border-color: var(--accent);
  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
}
/* 当前吸附档徽标：贴左下，避开右下角的手柄与鼠标 */
.bw-resize-badge {
  position: absolute; left: 8px; bottom: 8px; padding: 1px 8px;
  border-radius: 6px; background: var(--accent); color: #fff;
  font-size: 12px; font-weight: 600; pointer-events: none;
}
.board-group-caret { cursor: pointer; }
/* 分组标题就地编辑态 */
.board-group-input {
  font-size: 14px; font-weight: 600; color: var(--text);
  background: var(--bg); border: 1px solid var(--accent); border-radius: 6px;
  padding: 1px 6px; outline: none;
}
/* 板尾操作条 */
.board-footer { display: flex; gap: 8px; margin-top: 4px; }
.board-footer-btn {
  padding: 6px 12px; border: 1px dashed var(--border-strong); border-radius: 8px;
  background: transparent; color: var(--text-tertiary); font-size: 13px; cursor: pointer;
}
.board-footer-btn:hover { color: var(--text); background: var(--bg-hover); }
/* 分组 ⋯ 弹层 */
.board-menu {
  position: fixed; z-index: 9999; min-width: 190px; padding: 4px;
  background: var(--bg); border: 1px solid var(--border); border-radius: 8px;
  box-shadow: var(--shadow-menu);
}
.board-menu-item {
  display: block; width: 100%; text-align: left; padding: 6px 10px;
  border: 0; background: transparent; color: var(--text); font-size: 13px;
  border-radius: 6px; cursor: pointer;
}
.board-menu-item:hover { background: var(--bg-hover); }
.board-menu-item[disabled], .board-menu-item[disabled]:hover {
  color: var(--text-tertiary); background: transparent; cursor: default;
}
/* 添加组件面板：只列已实现的组件，已在板上的禁用并标注（§2.3 裁决） */
.board-add-modal { width: 420px; max-width: 92vw; }
.board-add-group-name {
  font-size: 12px; font-weight: 600; color: var(--text-tertiary); margin: 12px 4px 4px;
}
.board-add-row {
  display: flex; align-items: center; width: 100%; text-align: left;
  padding: 7px 10px; border: 0; background: transparent; color: var(--text);
  font-size: 13px; border-radius: 6px; cursor: pointer;
}
.board-add-row:hover { background: var(--bg-hover); }
.board-add-row[disabled], .board-add-row[disabled]:hover {
  color: var(--text-tertiary); background: transparent; cursor: default;
}
.board-add-flag { margin-left: auto; font-size: 12px; color: var(--text-tertiary); }

/* ---------- 设置 · 日程页（占用块 S4：录入表单 + 未来 30 天清单） ---------- */
.sched-list { margin-top: 4px; }
.sched-row { display: flex; align-items: center; gap: 8px; padding: 7px 2px; border-bottom: 1px solid var(--border); }
.sched-row-main { flex: 1; min-width: 0; }
.sched-row-main > div:first-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sched-row-sub { font-size: 12px; color: var(--text-tertiary); margin-top: 1px; }

/* ---------- 看板 · 占用块组件（占用块 S5） ----------
   颜色不写死：全走 base.css 标签令牌（--tag-blue/--tag-red/…），
   深浅色两态各有一份令牌值，深色态天然过。 */
.bw-week { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.bw-week-day { border: 1px solid var(--border); border-radius: 6px; padding: 3px 4px; min-width: 0; overflow: hidden; }
.bw-week-day.today { border-color: var(--accent); }
.bw-week-day-head { font-size: 10px; color: var(--text-tertiary); white-space: nowrap; margin-bottom: 3px; }
.bw-week-day.today .bw-week-day-head { color: var(--accent); font-weight: 600; }
.bw-tb { font-size: 11px; line-height: 1.5; border-radius: 4px; padding: 0 4px; margin-bottom: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; border-left: 2px solid transparent; }
.bw-tb-course { background: var(--tag-blue); color: var(--tag-blue-text); border-left-color: var(--tag-blue-text); }
.bw-tb-exam { background: var(--tag-red); color: var(--tag-red-text); border-left-color: var(--tag-red-text); }
.bw-tb-deadline { background: var(--tag-yellow); color: var(--tag-yellow-text); border-left-color: var(--tag-yellow-text); }
.bw-tb-personal { background: var(--tag-gray); color: var(--tag-gray-text); border-left-color: var(--tag-gray-text); }
.bw-tb-lesson { background: var(--tag-green); color: var(--tag-green-text); cursor: pointer; }
.bw-lesson-row { display: flex; align-items: center; gap: 8px; }
.bw-lesson-row .bw-row-main { flex: 1; min-width: 0; }
.bw-lesson-action { flex: none; height: 26px; padding: 0 8px; font-size: 11px; }
.bw-deadline-row { display: flex; align-items: center; gap: 4px; }
.bw-deadline-row .bw-row-main { flex: 1; min-width: 0; }
.bw-empty-go { margin-top: 8px; height: 26px; padding: 0 10px; font-size: 12px; }

/* ---------- 考试周横幅（占用块 S6） ----------
   红标签令牌，与 .bw-tb-exam 同一来源；深色态靠令牌天然过。 */
.exam-week-banner {
  display: flex; align-items: center; gap: 12px;
  margin: 12px 0 4px; padding: 10px 14px;
  background: var(--tag-red); color: var(--tag-red-text);
  border-radius: 10px; font-size: 13px;
}
.exam-week-banner .ewb-text { flex: 1; line-height: 1.5; }
.exam-week-banner .ewb-actions { display: flex; gap: 8px; flex-shrink: 0; }

/* ---------- 备份提醒条（P1-3） ----------
   结构与考试周横幅同款，但语义不同类（smoke-test25 盯 .exam-week-banner
   的「无考试→无横幅」），颜色用黄令牌：是数据安全提醒，不是红色催办。 */
.backup-reminder-banner {
  display: flex; align-items: center; gap: 12px;
  margin: 12px 0 4px; padding: 10px 14px;
  background: var(--tag-yellow); color: var(--tag-yellow-text);
  border-radius: 10px; font-size: 13px;
}
.backup-reminder-banner .ewb-text { flex: 1; line-height: 1.5; }
.backup-reminder-banner .ewb-actions { display: flex; gap: 8px; flex-shrink: 0; }
.ewb-draft {
  width: calc(100% - 32px); min-height: 170px; margin: 0 16px 12px;
  font-size: 13px; line-height: 1.7; resize: vertical;
}

/* ---------- 搜索弹窗 ---------- */
.search-modal { width: 620px; max-width: 92vw; margin-top: 12vh; max-height: 60vh; }
.search-input-row {
  display: flex; align-items: center; gap: 10px;
  padding: 14px 16px; border-bottom: 1px solid var(--border);
}
.search-input-row .search-ico { color: var(--text-tertiary); font-size: 16px; }
.search-input { flex: 1; border: none; background: transparent; font-size: 16px; }
.search-input::placeholder { color: var(--text-tertiary); }
.search-results { overflow-y: auto; padding: 6px; }
.search-item {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 10px; border-radius: 6px; cursor: pointer; font-size: 14px;
}
.search-item .s-icon { font-size: 16px; width: 22px; text-align: center; }
.search-item .s-title { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.search-item .s-path { font-size: 12px; color: var(--text-tertiary); }
.search-item.highlight { background: var(--bg-hover); }
.search-footer {
  border-top: 1px solid var(--border); padding: 8px 14px;
  display: flex; gap: 16px; font-size: 12px; color: var(--text-tertiary);
}
.search-footer kbd {
  background: var(--bg-tertiary); border-radius: 4px; padding: 1px 5px;
  font-family: inherit; font-size: 11px;
}

/* ---------- 设置弹窗 ---------- */
.settings-modal { width: 880px; max-width: 94vw; height: 560px; max-height: 86vh; margin-top: 6vh; flex-direction: row; }
.settings-nav {
  width: 220px; min-width: 220px; background: var(--bg-secondary);
  padding: 14px 10px; display: flex; flex-direction: column; gap: 2px;
  border-right: 1px solid var(--border);
}
.settings-nav .sn-user {
  display: flex; align-items: center; gap: 10px; padding: 4px 8px 14px;
}
.settings-nav .sn-user .ws-avatar { width: 28px; height: 28px; }
.settings-nav .sn-user-meta { display: flex; flex-direction: column; min-width: 0; line-height: 1.35; }
.settings-nav .sn-user-name {
  font-size: 13px; font-weight: 500;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.settings-nav .sn-user-email {
  font-size: 11px; color: var(--text-tertiary);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.settings-tab {
  display: flex; align-items: center; gap: 8px;
  padding: 5px 8px; border-radius: 6px; font-size: 14px; line-height: 20px;
  color: var(--text-secondary); cursor: pointer; text-align: left; width: 100%;
  transition: background-color 80ms ease-in;
}
.settings-tab .ic { color: var(--text-tertiary); }
.settings-tab:hover { background: var(--bg-hover); }
.settings-tab:hover .ic, .settings-tab.active .ic { color: inherit; }
.settings-tab.active { background: var(--bg-active); color: var(--text); font-weight: 500; }
.settings-body { flex: 1; overflow-y: auto; padding: 32px 40px; }
.settings-body h2 {
  font-size: 20px; font-weight: 600; letter-spacing: -0.01em;
  margin-bottom: 18px;
}
.settings-row {
  display: flex; align-items: center; gap: 16px;
  padding: 12px 0; border-bottom: 1px solid var(--border);
}
.settings-row .sr-label { flex: 1; }
.settings-row .sr-label .sr-sub { font-size: 12px; color: var(--text-tertiary); margin-top: 2px; }
.settings-row .sr-value { font-size: 14px; color: var(--text-secondary); }
.generation-count-input { width: 112px; }

/* 模型设置：同一张设置页内建立清晰的「说明 → 服务商 → 高级设置」层级。
   默认态只保留一个低噪声操作面；输入新密钥后，保存按钮才升级为主操作。 */
.settings-modal.settings-modal-models {
  width: 1040px; height: 700px; max-height: calc(100vh - 72px); margin-top: 4vh;
}
.settings-modal-models .settings-body { padding: 36px 44px 56px; }
.model-settings-header {
  padding-bottom: 20px; border-bottom: 1px solid var(--border);
}
.settings-body .model-settings-header h2 {
  margin: 3px 0 7px; padding: 0; border: 0;
  font-size: 24px; line-height: 1.25; letter-spacing: -0.02em;
}
.model-settings-header .hint-text {
  max-width: 620px; font-size: 13px; line-height: 1.65; color: var(--text-secondary);
}
.model-settings-eyebrow {
  color: var(--accent); font-size: 11px; font-weight: 650;
  letter-spacing: 0.08em; text-transform: uppercase;
}
.model-settings-banners { margin-top: 16px; }
.model-settings-section { margin-top: 24px; }
.model-section-heading {
  display: flex; align-items: flex-start; justify-content: space-between; gap: 20px;
  margin-bottom: 8px;
}
.model-section-heading h3 {
  margin: 0 0 3px; font-size: 15px; line-height: 1.35; font-weight: 600;
}
.model-section-heading .hint-text { font-size: 12px; line-height: 1.55; }
.model-section-meta {
  flex-shrink: 0; margin-top: 1px; padding: 2px 8px; border-radius: 999px;
  background: var(--bg-secondary); color: var(--text-tertiary);
  font-size: 11px; line-height: 18px;
}
.model-provider-list { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }
.model-provider-list .model-provider-row:last-child { border-bottom: 0; }
.model-provider-row {
  min-height: 56px; padding: 10px 0; gap: 24px;
}
.model-provider-row > .sr-label {
  flex: 1 1 210px; min-width: 180px; font-size: 14px; font-weight: 550;
}
.model-provider-row .sr-sub { font-weight: 400; line-height: 1.45; }
.model-provider-row.is-unconfigured .sr-sub { display: none; }
.model-provider-control {
  display: flex; flex: 0 1 500px; min-width: 0;
  flex-direction: column; align-items: flex-end; gap: 4px;
}
.model-provider-actions {
  display: grid; grid-template-columns: auto minmax(190px, 1fr) auto auto;
  align-items: center; gap: 8px; width: 100%;
}
.model-provider-actions .tag {
  min-width: 58px; justify-content: center; margin: 0;
  padding: 1px 7px; font-size: 11px;
}
.model-provider-actions .tag.c-yellow { min-width: auto; }
.model-key-input { min-width: 0; height: 32px; }
.model-provider-row .model-test-btn,
.model-custom-row .model-test-btn {
  height: 30px; padding: 0 8px; border-color: transparent;
  background: transparent; color: var(--text-secondary); font-size: 13px;
}
.model-provider-row .model-test-btn:hover,
.model-custom-row .model-test-btn:hover { background: var(--bg-hover); color: var(--text); }
.model-provider-row .model-save-btn:not(.is-dirty) {
  height: 30px; padding: 0 10px; border-color: var(--border-strong);
  background: var(--bg-input); color: var(--text); font-size: 13px;
}
.model-provider-row .model-save-btn:not(.is-dirty):hover {
  background: var(--bg-hover); border-color: var(--text-tertiary);
}
.model-provider-row .model-save-btn.is-dirty { height: 30px; padding: 0 10px; font-size: 13px; }
.model-row-message {
  max-width: 100%; line-height: 1.45;
  text-align: right; overflow-wrap: anywhere;
}
.model-row-message:empty { display: none; }
.model-rebind-btn { height: 28px; font-size: 12px; }
.model-custom-row {
  min-height: 64px; padding: 12px 0; gap: 24px;
}
.model-custom-label { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.model-custom-actions { display: flex; align-items: center; gap: 6px; }
.model-delete-btn {
  height: 30px; padding: 0 8px; border-color: transparent;
  background: transparent; color: var(--text-tertiary); font-size: 13px;
}
.model-delete-btn:hover { background: var(--tag-red); color: var(--tag-red-text); }
.model-empty-state {
  padding: 13px 14px; border-radius: 8px; background: var(--bg-secondary);
  color: var(--text-secondary); font-size: 12px; line-height: 1.6;
}
.model-add-btn { margin-top: 10px; height: 30px; font-size: 13px; }
.model-add-form {
  margin-top: 10px; padding: 4px 14px 14px;
  border: 1px solid var(--border); border-radius: 8px; background: var(--bg-secondary);
}
.model-add-form .settings-row { gap: 24px; }
.model-advanced-details {
  margin-top: 24px; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
}
.model-advanced-summary {
  display: flex; align-items: center; gap: 10px; padding: 12px 0;
  color: var(--text-secondary); font-size: 13px; font-weight: 550; cursor: pointer;
  list-style: none;
}
.model-advanced-summary::-webkit-details-marker { display: none; }
.model-advanced-summary::before {
  content: '›'; width: 14px; color: var(--text-tertiary); font-size: 18px; line-height: 1;
  transform: rotate(0); transition: transform 0.12s ease;
}
.model-advanced-details[open] .model-advanced-summary::before { transform: rotate(90deg); }
.model-advanced-summary:hover { color: var(--text); }
.model-advanced-summary-note { margin-left: auto; color: var(--text-tertiary); font-size: 11px; font-weight: 400; }
.model-advanced-details .model-order-section { margin: 8px 0 20px 24px; }
.model-order-section { padding-bottom: 4px; }
.model-order-tier-row {
  margin-top: 12px; padding: 10px 12px; border: 0; border-radius: 7px;
  background: var(--bg-secondary); font-weight: 500;
}
.model-order-entry-row { padding: 9px 12px; }
.model-order-entry-row.is-disabled { opacity: 0.68; }
.model-order-section .ord-arrow { width: 30px; padding: 0; }
.model-section-footer { display: flex; gap: 8px; padding-top: 14px; }

@media (max-width: 1040px) {
  .settings-modal.settings-modal-models { width: 96vw; }
  .settings-modal-models .settings-nav { width: 190px; min-width: 190px; }
  .settings-modal-models .settings-body { padding-right: 32px; padding-left: 32px; }
  .model-provider-row { gap: 16px; }
  .model-provider-control { flex-basis: 455px; }
  .model-provider-actions { grid-template-columns: auto minmax(150px, 1fr) auto auto; gap: 6px; }
}

@media (max-width: 820px) {
  .settings-modal-models .settings-body { padding: 28px 24px 48px; }
  .model-provider-row { align-items: stretch; flex-direction: column; gap: 9px; }
  .model-provider-row > .sr-label { flex-basis: auto; min-width: 0; }
  .model-provider-control { flex-basis: auto; width: 100%; align-items: stretch; }
  .model-provider-actions { grid-template-columns: auto minmax(130px, 1fr) auto auto; }
  .model-row-message { text-align: left; }
}
.theme-options { display: flex; gap: 14px; }
.theme-opt {
  display: flex; flex-direction: column; align-items: center; gap: 6px;
  cursor: pointer; font-size: 13px; color: var(--text-secondary);
}
.theme-opt .theme-preview {
  width: 110px; height: 70px; border-radius: 8px;
  border: 2px solid var(--border-strong); overflow: hidden;
  display: flex; transition: border-color 0.12s ease;
}
.theme-opt.on .theme-preview { border-color: var(--accent); }
.theme-opt.on { color: var(--text); font-weight: 500; }
.theme-preview .tp-side { width: 26px; height: 100%; }
.theme-preview .tp-main { flex: 1; padding: 8px; display: flex; flex-direction: column; gap: 5px; }
.theme-preview .tp-line { height: 6px; border-radius: 3px; width: 80%; }
.theme-preview .tp-line.short { width: 55%; }
.tp-light .tp-side { background: #f7f7f5; } .tp-light .tp-main { background: #fff; } .tp-light .tp-line { background: #e9e9e7; }
.tp-dark .tp-side { background: #202020; } .tp-dark .tp-main { background: #191919; } .tp-dark .tp-line { background: #373737; }
.tp-system .tp-side { background: linear-gradient(135deg, #f7f7f5 50%, #202020 50%); }
.tp-system .tp-main { background: linear-gradient(135deg, #fff 50%, #191919 50%); }
.tp-system .tp-line { background: #9b9a97; }

/* ---------- 回收站 / 收件箱 / 分享弹窗 ---------- */
.simple-modal { width: 560px; max-width: 92vw; margin-top: 10vh; max-height: 70vh; }
.simple-modal-head {
  display: flex; align-items: center; gap: 8px;
  padding: 14px 16px; border-bottom: 1px solid var(--border);
  font-size: 15px; font-weight: 600;
}
.simple-modal-head .smh-close { margin-left: auto; }
.simple-modal-body { overflow-y: auto; padding: 8px; }
/* ============================================================
   对话视图（Notion AI）
   ============================================================ */
.chat-view {
  max-width: 720px; margin: 0 auto; padding: 0 24px 80px;
  min-height: 100%; display: flex; flex-direction: column; justify-content: center;
}
.chat-view.has-thread { justify-content: flex-start; padding-top: 32px; }
.chat-hero { text-align: center; margin-bottom: 26px; }
.chat-logo {
  width: 54px; height: 54px; margin: 0 auto 18px; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  background: var(--bg); color: var(--text);
  box-shadow: 0 0 0 1px var(--border), 0 2px 8px rgba(15,15,15,0.08);
}
.chat-title { font-size: 28px; font-weight: 700; letter-spacing: -0.5px; }

/* 消息流 */
.chat-thread { display: flex; flex-direction: column; gap: 18px; margin-bottom: 24px; }
.chat-msg { display: flex; gap: 10px; align-items: flex-start; }
.chat-msg.from-user { justify-content: flex-end; }
.chat-ai-avatar {
  width: 26px; height: 26px; border-radius: 50%; flex-shrink: 0; margin-top: 2px;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--bg); color: var(--text);
  box-shadow: 0 0 0 1px var(--border);
}
.chat-bubble { line-height: 1.65; white-space: pre-wrap; word-break: break-word; }
.chat-msg.from-user .chat-bubble {
  background: var(--bg-secondary); border-radius: 12px;
  padding: 9px 14px; max-width: 78%;
}
.chat-msg.from-ai .chat-bubble { flex: 1; min-width: 0; padding-top: 3px; }

/* 刀②「本轮参考」chips：assistant 气泡下方的确定性出处行
   （search_knowledge 转录兜底，不依赖模型正文标注）。 */
.chat-msg-body { flex: 1; min-width: 0; }
.chat-ref-chips { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; margin-top: 6px; }
.chat-ref-label { font-size: 11px; color: var(--text-tertiary); margin-right: 2px; }
.chat-ref-chip {
  font-size: 11px; line-height: 18px; padding: 0 8px; border-radius: 999px;
  border: 1px solid var(--border); background: transparent; color: var(--text-secondary);
  cursor: pointer; max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.chat-ref-chip:hover { background: var(--bg-hover); }
.chat-ref-warn { color: var(--tag-yellow-text); }

/* 输入框 */
.chat-composer {
  border: 1px solid var(--accent); border-radius: 12px;
  background: var(--bg); overflow: hidden;
  box-shadow: 0 0 0 3px var(--accent-soft), 0 2px 10px rgba(15,15,15,0.06);
}
.chat-notice {
  display: flex; align-items: center; gap: 6px;
  padding: 7px 14px; font-size: 12px;
  background: var(--accent-soft); color: var(--text-secondary);
}
.chat-notice-ic { color: var(--accent); flex-shrink: 0; }
.chat-notice-link { color: var(--accent); font-weight: 500; cursor: pointer; }
.chat-input {
  display: block; width: 100%; min-height: 46px; max-height: 220px;
  border: none; background: transparent; resize: none; outline: none;
  padding: 14px 14px 4px; font-size: 15px; line-height: 1.6; color: var(--text);
}
.chat-input::placeholder { color: var(--text-tertiary); }
.chat-bar { display: flex; align-items: center; gap: 6px; padding: 6px 10px 8px; }
.chat-bar-left { display: flex; align-items: center; gap: 2px; }
.chat-bar-btn { width: 26px; height: 26px; color: var(--text-tertiary); }
.chat-bar-right { margin-left: auto; display: flex; align-items: center; gap: 6px; }

/* ---------- 自定义下拉（ui.dropdown：按钮 + ui.popup 菜单，替代原生 select） ----------
   原生 select 的箭头与弹出层是操作系统样式，与整体设计语言断裂；
   弹层复用 base.css 的 .popup + .menu-item，与右键/分组菜单同一观感。 */
.nv-dropdown {
  display: inline-flex; align-items: center; gap: 4px; max-width: 100%;
  border: 1px solid var(--border); border-radius: 7px;
  background: var(--bg-secondary); color: var(--text);
  font: inherit; cursor: pointer; user-select: none;
  transition: border-color 0.12s ease, background 0.12s ease;
}
.nv-dropdown:hover { border-color: var(--border-strong); background: var(--bg-hover); }
.nv-dropdown:focus-visible { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); outline: none; }
.nv-dropdown.open { border-color: var(--accent); }
.nv-dropdown-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nv-dropdown-caret { display: inline-flex; align-items: center; color: var(--text-tertiary); flex-shrink: 0; transition: transform 0.12s ease; }
.nv-dropdown.open .nv-dropdown-caret { transform: rotate(180deg); }
.nv-dropdown-menu { min-width: 140px; }
.nv-dropdown-item { font-size: 13px; }
.nv-dropdown-check { display: inline-flex; align-items: center; color: var(--accent); flex-shrink: 0; }

/* 表单字段形态（弹窗/设置里的 settingsRow 控件）：与 .input 同高同宽同底色，
   左对齐标签 + 右侧 caret；prep-select 是备课面板的先行特例，这是通用件——
   全库弹窗下拉统一走它，不再出现原生 select 的系统样式。 */
button.nv-dropdown-field {
  width: 100%; height: 34px; padding: 0 10px; font-size: 14px;
  background: var(--bg-input); border-color: var(--border-strong);
}
button.nv-dropdown-field .nv-dropdown-label { flex: 1; text-align: left; }

/* 对话栏的思考档切换：与发送按钮同高（26px）的幽灵钮，不抢输入框的戏 */
.chat-thinking-btn {
  height: 26px; padding: 0 7px; font-size: 12px;
  border-color: transparent; background: transparent; color: var(--text-secondary);
}
.chat-thinking-btn:hover { border-color: transparent; background: var(--bg-hover); color: var(--text); }
.chat-thinking-btn.open { border-color: transparent; background: var(--bg-hover); }
.chat-thinking-label { font-size: 12px; color: var(--text-tertiary); }
.chat-send {
  width: 26px; height: 26px; border-radius: 50%; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--bg-tertiary); color: var(--text-tertiary);
  transition: background 0.12s ease, color 0.12s ease;
}
.chat-send:hover { background: var(--accent); color: #fff; }

/* 快捷操作 */
.chat-quick { display: flex; flex-wrap: wrap; justify-content: center; gap: 4px; margin-top: 18px; }
.chat-quick-btn {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 10px; border-radius: 6px;
  font-size: 13px; color: var(--text-secondary);
  cursor: pointer; transition: background 0.12s ease; user-select: none;
}
.chat-quick-btn:hover { background: var(--bg-hover); color: var(--text); }

/* ---------- AI 备课面板（版式重设计 刀三：#/prep 备课台，四条带 + 生成中） ---------- */
.prep-panel {
  border: 1px solid var(--border); border-radius: 10px;
  background: var(--bg-secondary);
  padding: 14px 16px; margin-bottom: 18px;
  text-align: left;
}
.prep-hint { font-size: 13px; color: var(--text-tertiary); margin-top: 8px; }

/* 带一 · 句式选择器「为 [学生 ▾] 备 [知识点 ▾]」：主字号 17px，副行小字在按钮外侧 */
.prep-sentence { display: flex; align-items: flex-start; gap: 10px; flex-wrap: wrap; }
.prep-sentence-word { font-size: 17px; line-height: 34px; color: var(--text); }
.prep-sentence-field { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 180px; }
/* 备课台选择器（ui.dropdown 的表单字段形态）：整行宽度、左对齐标签、右侧 caret */
button.prep-select {
  width: 100%; height: 34px; padding: 0 10px;
  background: var(--bg); font-size: 17px;
}
button.prep-select .nv-dropdown-label { flex: 1; text-align: left; }
.prep-sentence-sub { font-size: 12px; color: var(--text-tertiary); min-height: 15px; padding-left: 2px; }

/* 带二 · AI 会带进这次生成的上下文（键 : 值行；无数据该行/整条带不渲染） */
.prep-ctx {
  margin-top: 10px; padding: 8px 10px; border: 1px solid var(--border);
  border-radius: 8px; background: var(--bg);
  display: flex; flex-direction: column; gap: 6px;
}
.prep-ctx-row { display: flex; gap: 8px; font-size: 13px; line-height: 1.6; align-items: baseline; }
.prep-ctx-key { flex-shrink: 0; font-weight: 600; color: var(--text-secondary); }
.prep-ctx-val { color: var(--text-secondary); }
.prep-ctx-chips { display: inline-flex; flex-wrap: wrap; gap: 6px; }
.prep-chip {
  display: inline-flex; align-items: center; gap: 5px;
  padding: 2px 8px; border: 1px solid var(--border); border-radius: 999px;
  background: var(--bg-secondary); color: var(--text-secondary); font-size: 12px;
}
.prep-chip .tag { font-size: 11px; padding: 0 6px; }
.prep-chip-reason { color: var(--text-tertiary); }

/* 带三 · 本次参数 pills（常驻可见；覆盖过的 pill 高亮） */
.prep-adjustments { margin-top: 10px; }
.prep-pills { display: flex; flex-wrap: wrap; gap: 8px; }
.prep-pill {
  display: inline-flex; align-items: baseline; gap: 6px;
  padding: 5px 10px; border: 1px solid var(--border); border-radius: 999px;
  background: var(--bg); font-size: 12px; color: var(--text-secondary);
}
button.prep-pill { cursor: pointer; }
button.prep-pill:hover { background: var(--bg-hover); }
.prep-pill-label { font-weight: 600; color: var(--text-tertiary); }
.prep-pill-value { color: var(--text); }
.prep-pill-override { background: var(--accent-soft); border-color: var(--accent); }

/* 带四 · 出货预览 + 主按钮（讲法图标中性色，与刀一卡头同纪律） */
.prep-outs { display: flex; align-items: center; gap: 8px; margin-top: 12px; }
.prep-outs-label { font-size: 13px; color: var(--text-secondary); }
.prep-outs-icons { display: inline-flex; gap: 6px; color: var(--text-tertiary); }
.prep-outs-icon { display: inline-flex; }
.prep-outs .prep-go { margin-left: auto; flex-shrink: 0; }

/* 生成中（D4 便宜档：五行骨架 + 不确定态进度条；reduced-motion 退化成静态条） */
.prep-progress { display: flex; flex-direction: column; gap: 8px; }
.prep-progress-head { display: flex; align-items: center; gap: 10px; }
.prep-progress-title { font-size: 14px; font-weight: 600; }
.prep-progress-elapsed { font-size: 12px; color: var(--text-tertiary); }
.prep-progress-abandon { margin-left: auto; flex-shrink: 0; }
.prep-progress-row { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-secondary); }
.prep-progress-icon { display: inline-flex; color: var(--text-tertiary); }
.prep-progress-name { width: 64px; flex-shrink: 0; }
.prep-progress-bar { flex: 1; height: 6px; border-radius: 3px; background: var(--bg); overflow: hidden; }
.prep-progress-bar-fill {
  display: block; height: 100%; width: 40%; border-radius: 3px; background: var(--accent);
  animation: prep-progress-slide 1.2s ease-in-out infinite;
}
@keyframes prep-progress-slide {
  0% { transform: translateX(-100%); }
  100% { transform: translateX(250%); }
}
@media (prefers-reduced-motion: reduce) {
  .prep-progress-bar-fill { animation: none; }
}
.prep-progress-state { font-size: 12px; color: var(--text-tertiary); flex-shrink: 0; }

/* 结果验收单（版式重设计 刀四）：五路恒定五行，状态列只表状态
   （沿用刀一中性色纪律——失败红/降级黄复用下方 .prep-failed/.prep-degraded，
   ✓ 不给色）；进度条复用上方 .prep-progress-bar 不确定态；AI 草稿胶囊
   复用 .teach-review-chip（同语义不新造）。 */
.prep-effective {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 7px 9px; border-radius: 6px; background: var(--bg-secondary); color: var(--text-secondary);
}
.prep-pills-readonly .prep-pill { cursor: default; }
.prep-result { margin-top: 12px; display: flex; flex-direction: column; gap: 6px; }
.prep-line { font-size: 13px; line-height: 1.6; }
.prep-ok { color: var(--text); }
.prep-error, .prep-failed { color: #9f3431; }
html[data-theme="dark"] .prep-error, html[data-theme="dark"] .prep-failed { color: #eb9a97; }
.prep-degraded { color: #8a6a1d; }
html[data-theme="dark"] .prep-degraded { color: #e3c26f; }
.prep-actions { display: flex; gap: 8px; margin-top: 4px; }
.prep-result-head { display: flex; align-items: center; gap: 8px; }
.prep-sheet {
  display: flex; flex-direction: column; gap: 4px;
  padding: 8px 0; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
}
.prep-sheet-row { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--text-secondary); }
.prep-sheet-icon { display: inline-flex; color: var(--text-tertiary); }
.prep-sheet-name { width: 64px; flex-shrink: 0; color: var(--text); }
.prep-sheet-summary { flex: 1; min-width: 0; }
.prep-sheet-state { flex-shrink: 0; display: inline-flex; align-items: center; gap: 6px; font-size: 12px; }
.prep-sheet-bar { width: 72px; flex: none; }
.prep-result-foot { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; margin-top: 2px; }
.prep-result-note { font-size: 12px; color: var(--text-tertiary); margin-right: auto; }
@media (max-width: 760px) {
  .prep-sentence { flex-direction: column; }
  .prep-sentence-field { width: 100%; }
}

/* 收件箱主区卡片 */
.inbox-cards { display: flex; flex-direction: column; gap: 6px; margin-top: 18px; }
.inbox-card {
  position: relative; display: flex; align-items: flex-start; gap: 12px;
  padding: 12px 14px; border: 1px solid var(--border); border-radius: 10px;
  cursor: pointer; transition: background 0.12s ease, box-shadow 0.12s ease;
}
.inbox-card:hover { background: var(--bg-hover); }
.inbox-card.unread { border-color: var(--border-strong); }
.inbox-card .inbox-ic { color: var(--text-tertiary); margin-top: 2px; flex-shrink: 0; }
.inbox-card .inbox-avatar {
  width: 28px; height: 28px; border-radius: 50%; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  color: #fff; font-size: 12px; font-weight: 600;
}
.inbox-card-main { flex: 1; min-width: 0; }
.inbox-card-title { font-size: 14px; font-weight: 500; }
.inbox-card.unread .inbox-card-title { font-weight: 600; }
.inbox-card-desc { font-size: 13px; color: var(--text-secondary); margin-top: 3px; line-height: 1.5; }
.inbox-card-time { font-size: 12px; color: var(--text-tertiary); margin-top: 5px; }
.inbox-card .inbox-dot {
  width: 7px; height: 7px; border-radius: 50%; background: var(--accent);
  margin-top: 8px; flex-shrink: 0;
}

/* ============================================================
   垃圾箱浮层
   ============================================================ */
.trash-popup { padding: 0; width: 340px; max-width: 92vw; }
.trash-panel { display: flex; flex-direction: column; max-height: 460px; }
.trash-search-row { padding: 10px 10px 6px; }
.trash-search { height: 30px; font-size: 13px; }
.trash-filters { display: flex; gap: 6px; padding: 0 10px 8px; flex-wrap: wrap; }
.trash-chip {
  display: inline-flex; align-items: center; gap: 4px;
  height: 24px; padding: 0 8px; border-radius: 5px;
  background: var(--bg-secondary); color: var(--text-secondary);
  font-size: 12px; cursor: pointer; user-select: none;
}
.trash-chip:hover { background: var(--bg-hover); color: var(--text); }
.trash-list { flex: 1; overflow-y: auto; padding: 0 6px 6px; min-height: 60px; }
.trash-empty { padding: 22px 10px; text-align: center; font-size: 13px; color: var(--text-tertiary); }
.trash-foot {
  display: flex; align-items: center; gap: 6px;
  padding: 8px 12px; border-top: 1px solid var(--border);
  font-size: 12px; color: var(--text-tertiary);
}
.trash-foot-help { margin-left: auto; cursor: pointer; }
.trash-foot-help:hover { color: var(--text-secondary); }
.trash-item .t-text { flex: 1; min-width: 0; }
.trash-item .t-path { display: block; font-size: 12px; color: var(--text-tertiary); margin-top: 1px; }
.trash-item .t-act {
  width: 24px; height: 24px; border-radius: 5px; flex-shrink: 0;
  display: none; align-items: center; justify-content: center; color: var(--text-tertiary);
}
.trash-item:hover .t-act { display: inline-flex; }
.trash-item .t-act:hover { background: var(--bg-active); color: var(--text); }
.trash-item .t-act.danger:hover { color: var(--danger); }

.trash-item {
  display: flex; align-items: center; gap: 10px;
  padding: 7px 10px; border-radius: 6px; font-size: 14px;
}
.trash-item:hover { background: var(--bg-hover); }
.trash-item .t-icon { width: 20px; text-align: center; flex-shrink: 0; }
.trash-item .t-title {
  display: block; font-size: 13px; color: var(--text);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

.inbox-item {
  display: flex; gap: 10px; padding: 10px;
  border-radius: 8px; font-size: 14px;
}
.inbox-item:hover { background: var(--bg-hover); }
.inbox-item .ib-avatar {
  width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
  display: flex; align-items: center; justify-content: center;
  color: #fff; font-size: 13px; font-weight: 600;
}
.inbox-item .ib-text { line-height: 1.5; color: var(--text-secondary); }
.inbox-item .ib-text b { color: var(--text); font-weight: 600; }
.inbox-item .ib-time { font-size: 12px; color: var(--text-tertiary); margin-top: 2px; }

.share-link-row { display: flex; gap: 8px; padding: 14px 16px; }
.share-link-row .input { flex: 1; font-size: 13px; color: var(--text-secondary); }
.share-desc { padding: 0 16px 14px; font-size: 13px; color: var(--text-tertiary); line-height: 1.6; }
.share-toggle-row {
  display: flex; align-items: center; gap: 10px;
  padding: 10px 16px; border-top: 1px solid var(--border); font-size: 14px;
}
.share-toggle-row .st-label { flex: 1; }

/* 开关 */
.switch {
  width: 34px; height: 20px; border-radius: 10px;
  background: var(--border-strong); position: relative;
  cursor: pointer; transition: background 0.15s ease; flex-shrink: 0;
}
.switch::after {
  content: ""; position: absolute; top: 2px; left: 2px;
  width: 16px; height: 16px; border-radius: 50%; background: #fff;
  transition: left 0.15s ease;
}
.switch.on { background: var(--accent); }
.switch.on::after { left: 16px; }

/* 响应式 */
@media (max-width: 900px) {
  .page-body { padding: 0 28px; }
  .block-side { left: -40px; }
  .settings-modal { width: 96vw; }
  .settings-nav { width: 170px; min-width: 170px; }
}
@media (max-width: 640px) {
  .sidebar { position: fixed; left: 0; top: 36px; height: calc(100% - 36px); box-shadow: var(--shadow-modal); }
  .wt-tab { min-width: 0; }
  .page-body { padding: 0 16px; }
  .block-side { position: static; opacity: 1; }
}

/* ============================================================
   app.css（追加）— 抽屉面板（评论/AI）、功能视图、帮助与智能体
   ============================================================ */

/* ---------- 右侧抽屉面板 ---------- */
.drawer-panel {
  position: fixed; top: 36px; right: 0; bottom: 0; z-index: 300;
  width: 340px; max-width: 88vw;
  background: var(--bg); border-left: 1px solid var(--border);
  box-shadow: var(--shadow-menu);
  display: flex; flex-direction: column;
  animation: drawer-in 0.18s ease;
}
@keyframes drawer-in {
  from { transform: translateX(24px); opacity: 0; }
  to { transform: none; opacity: 1; }
}
.drawer-head {
  height: 44px; min-height: 44px; padding: 0 12px;
  display: flex; align-items: center; gap: 8px;
  border-bottom: 1px solid var(--border);
  color: var(--text-secondary);
}
.drawer-title { flex: 1; font-size: 14px; font-weight: 600; color: var(--text); }
.drawer-body { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; }

/* ---------- 副驾抽屉（知识护城河 刀③ B2）：复用 chat-* 类，只补布局壳 ---------- */
.panel-chat { height: 100%; display: flex; flex-direction: column; }
.panel-chat-toolbar { display: flex; justify-content: flex-end; gap: 12px; padding: 8px 12px 0; }
.panel-chat-link { font-size: 12px; color: var(--text-tertiary); cursor: pointer; text-decoration: none; }
.panel-chat-link:hover { color: var(--text); }
.panel-chat-thread { flex: 1; min-height: 0; overflow-y: auto; padding: 10px 12px; }
.panel-chat-empty { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 10px; padding: 0 20px; text-align: center; }
.panel-chat-composer { margin: 0 10px 10px; flex-shrink: 0; }

/* ---------- 评论面板 ---------- */
.comment-panel { height: 100%; }
.comment-list { flex: 1; overflow-y: auto; padding: 10px 12px; }
.comment-item { display: flex; gap: 10px; padding: 10px 2px; }
.comment-main { flex: 1; min-width: 0; }
.comment-head { display: flex; align-items: baseline; gap: 8px; }
.comment-author { font-size: 13px; font-weight: 600; }
.comment-time { font-size: 12px; color: var(--text-tertiary); }
.comment-del {
  margin-left: auto; font-size: 12px; color: var(--text-tertiary);
  padding: 1px 6px; border-radius: 4px; display: none;
}
.comment-item:hover .comment-del { display: inline-block; }
.comment-del:hover { background: var(--bg-hover); color: var(--danger); }
.comment-text { font-size: 14px; line-height: 1.6; margin-top: 2px; word-break: break-word; white-space: pre-wrap; }
.comment-input-row {
  display: flex; gap: 8px; padding: 10px 12px;
  border-top: 1px solid var(--border);
}
.comment-input { flex: 1; }

/* 顶栏评论角标 */
.topbar-comment { position: relative; }
.topbar-badge {
  position: absolute; top: 1px; right: 0;
  min-width: 14px; height: 14px; padding: 0 3px; border-radius: 7px;
  background: var(--badge-bg); color: #fff; font-size: 10px; line-height: 14px;
  text-align: center; font-weight: 600; pointer-events: none;
}

/* AI 助手面板（.ai-presets/.ai-chat/.ai-msg 等）已随 js/ai.js 一并删除
   （2026-08-20 演示残留清算）。 */

/* ---------- 功能视图通用 ---------- */
.view-page { max-width: 900px; margin: 0 auto; padding: 48px 48px 120px; }
.view-page-wide { max-width: 1080px; }
.view-head { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; margin-bottom: 26px; }
.view-title { font-size: 26px; font-weight: 700; letter-spacing: -0.3px; }
.view-desc { width: 100%; font-size: 14px; color: var(--text-tertiary); margin-top: -8px; }
.view-head-btn { margin-left: auto; }
.view-head-btn + .view-head-btn { margin-left: 8px; }
.btn-small { height: 28px; padding: 0 9px; font-size: 12px; }
.lesson-modal { width: 640px; max-height: 82vh; margin-top: 5vh; }
.lesson-form .settings-row { gap: 18px; }
.lesson-kp-box { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px 10px; max-width: 360px; }
.lesson-kp-option { display: inline-flex; align-items: center; gap: 4px; font-size: 13px; color: var(--text-secondary); }
.lesson-form-actions { display: flex; gap: 8px; justify-content: flex-end; padding-top: 14px; flex-wrap: wrap; }
.lesson-list { border-top: 1px solid var(--border); }
.lesson-row { gap: 14px; }
.lesson-row-actions { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; justify-content: flex-end; }
.hour-summary { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 12px 14px; background: var(--bg-secondary); border: 1px solid var(--border); border-radius: 8px; }
.hour-summary-main { min-width: 0; }
.hour-summary-value { font-size: 18px; font-weight: 700; color: var(--text-primary); }
.hour-summary-value.is-overdrawn { color: var(--danger); }
.hour-package-row, .hour-ledger-row { border-bottom: 1px solid var(--border); }
.view-head-export-btn { margin-left: 0; }

/* ---------- 会议视图 ---------- */
.meet-list { display: flex; flex-direction: column; gap: 4px; }
.meet-item {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; border-radius: 8px; cursor: pointer;
  border: 1px solid var(--border); background: var(--bg);
  transition: box-shadow 0.12s ease, transform 0.12s ease;
}
.meet-item:hover { box-shadow: var(--shadow-menu); transform: translateY(-1px); }
.meet-icon { font-size: 20px; flex-shrink: 0; }
.meet-main { flex: 1; min-width: 0; }
.meet-title { font-size: 14px; font-weight: 500; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.meet-sub { font-size: 12px; color: var(--text-tertiary); margin-top: 2px; }
.meet-go { color: var(--text-tertiary); flex-shrink: 0; }

/* ---------- 我的任务 ---------- */
.task-progress { margin-bottom: 24px; }
.task-progress-text { font-size: 13px; color: var(--text-secondary); margin-bottom: 6px; }
.task-progress-bar {
  height: 6px; border-radius: 3px; background: var(--bg-tertiary); overflow: hidden;
}
.task-progress-fill { height: 100%; background: var(--accent); border-radius: 3px; transition: width 0.25s ease; }
.task-group { margin-bottom: 18px; }
.task-group-head {
  display: flex; align-items: center; gap: 8px;
  padding: 4px 8px; border-radius: 6px; cursor: pointer;
  font-size: 14px; font-weight: 600; margin-bottom: 2px;
}
.task-group-head:hover { background: var(--bg-hover); }
.task-group-count { font-size: 12px; color: var(--text-tertiary); font-weight: 400; }
.task-row {
  display: flex; align-items: flex-start; gap: 8px;
  padding: 4px 8px 4px 28px; border-radius: 6px; cursor: pointer;
  font-size: 14px;
}
.task-row:hover { background: var(--bg-hover); }
.task-row .todo-checkbox { margin-top: 3px; }
.task-text { line-height: 1.6; word-break: break-word; }
.task-row.done .task-text { text-decoration: line-through; color: var(--text-tertiary); }

/* ---------- 库 ---------- */
/* ---------- 库 ---------- */
.lib-page { max-width: 1180px; padding-top: 34px; }
.lib-head { display: flex; align-items: center; gap: 12px; margin-bottom: 18px; }
.lib-head .view-title { flex: 1; font-size: 30px; }
.lib-tabs {
  display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  padding-bottom: 12px; margin-bottom: 6px;
}
.lib-tab {
  display: inline-flex; align-items: center; gap: 5px;
  height: 30px; padding: 0 11px; border-radius: 15px;
  font-size: 13px; color: var(--text-secondary);
  cursor: pointer; transition: background 0.12s ease; user-select: none;
}
.lib-tab:hover { background: var(--bg-hover); }
.lib-tab.active { background: var(--bg-active); color: var(--text); font-weight: 500; }
.lib-tools { margin-left: auto; display: flex; gap: 2px; }

.lib-table-wrap { overflow-x: auto; }
.lib-table { min-width: 780px; }
.lib-tr {
  display: flex; align-items: center;
  border-bottom: 1px solid var(--border);
  font-size: 14px; cursor: pointer;
  transition: background 0.12s ease;
}
.lib-tr:hover { background: var(--bg-hover); }
.lib-th {
  font-size: 12px; color: var(--text-tertiary);
  cursor: default; border-bottom-color: var(--border-strong);
}
.lib-th:hover { background: transparent; }
.lib-td {
  display: flex; align-items: center; gap: 6px;
  padding: 9px 10px; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.lib-td.c-name { flex: 2.4; }
.lib-td.c-user { flex: 1.1; color: var(--text-secondary); }
.lib-td.c-src  { flex: 1.3; color: var(--text-secondary); }
.lib-td.c-date { flex: 1; color: var(--text-secondary); font-size: 13px; }
.lib-row-icon { flex-shrink: 0; }
.lib-row-title { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lib-avatar {
  width: 18px; height: 18px; border-radius: 50%; flex-shrink: 0;
  display: inline-flex; align-items: center; justify-content: center;
  background: var(--avatar-orange); color: #fff; font-size: 10px; font-weight: 600;
}
.lib-src { display: inline-flex; align-items: center; gap: 5px; overflow: hidden; }
.lib-src span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.lib-skills { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 10px; }
.lib-skill {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 14px; border: 1px solid var(--border); border-radius: 10px; cursor: pointer;
}
.lib-skill:hover { background: var(--bg-hover); }
.lib-skill-emoji { font-size: 20px; }
.lib-skill-name { font-size: 14px; font-weight: 500; }
.lib-skill-desc { font-size: 12px; color: var(--text-tertiary); margin-top: 3px; line-height: 1.5; }

/* 市集样式（.mk-* 家族）已随 #/market 视图一并删除
   （2026-08-20 演示残留清算）。 */

/* .lib-list / .lib-item / .lib-icon / .lib-main / .lib-title / .lib-sub / .lib-meta
   已删除：这七个选择器在 js/ 与 index.html 里零匹配元素（已 grep 确认）。
   不参与任何级联竞争，也不含 @media / keyframes / 变量定义，删除对渲染的影响
   可证明为零。库视图实际用的是 .lib-skill 与 .lib-table 家族。 */

/* ---------- 日历 ---------- */
.cal-head { display: flex; align-items: center; gap: 16px; margin-bottom: 20px; flex-wrap: wrap; }
.cal-nav { display: flex; gap: 6px; margin-left: auto; }
.cal-grid {
  display: grid; grid-template-columns: repeat(7, 1fr); gap: 1px;
  background: var(--border); border: 1px solid var(--border); border-radius: 8px;
  overflow: hidden;
}
.cal-weekday {
  background: var(--bg-secondary); padding: 6px 8px;
  font-size: 12px; color: var(--text-tertiary); text-align: center;
}
.cal-cell {
  background: var(--bg); min-height: 96px; padding: 5px 6px;
  display: flex; flex-direction: column; gap: 3px;
}
.cal-cell.cal-blank { background: var(--bg-secondary); }
.cal-cell { cursor: pointer; } /* 空白格也能点：直接录这一天 */
.cal-cell.cal-has { cursor: pointer; }
.cal-cell:hover { background: var(--bg-hover); }
.cal-day { font-size: 12px; color: var(--text-secondary); font-weight: 500; }
.cal-today .cal-day {
  width: 20px; height: 20px; border-radius: 50%;
  background: var(--danger); color: #fff;
  display: inline-flex; align-items: center; justify-content: center;
}
.cal-entry {
  font-size: 11px; line-height: 1.4; padding: 2px 5px; border-radius: 4px;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.cal-meeting { background: var(--tag-purple); color: var(--tag-purple-text); }
.cal-db { background: var(--tag-blue); color: var(--tag-blue-text); }
/* 占用块四类（0026，store.calendarEntries 聚合）：与看板 .bw-tb-* 同一组标签令牌 */
.cal-course { background: var(--tag-blue); color: var(--tag-blue-text); }
.cal-exam { background: var(--tag-red); color: var(--tag-red-text); }
.cal-deadline { background: var(--tag-yellow); color: var(--tag-yellow-text); }
.cal-personal { background: var(--tag-gray); color: var(--tag-gray-text); }
/* 课次条目（0018，store.calendarEntries 聚合）：与看板 .bw-tb-lesson 同一组绿色标签令牌 */
.cal-lesson { background: var(--tag-green); color: var(--tag-green-text); }
.cal-more { font-size: 11px; color: var(--text-tertiary); padding: 0 5px; }
/* 学生详情掌握表：「掌握状态」列是老师覆写入口（0015 两值模型），可点 */
.mastery-state-cell { cursor: pointer; }
.mastery-state-cell:hover { text-decoration: underline; }

/* ---------- 帮助模态 ---------- */
.help-section-title {
  font-size: 13px; font-weight: 600; color: var(--text-secondary);
  margin: 18px 0 8px;
}
.help-section-title:first-child { margin-top: 0; }
.help-kbd-list { display: flex; flex-direction: column; gap: 6px; }
.help-kbd-row { display: flex; align-items: center; gap: 12px; font-size: 13px; }
.help-kbd-keys { width: 150px; flex-shrink: 0; }
.help-kbd-keys kbd {
  background: var(--bg-tertiary); border: 1px solid var(--border-strong);
  border-bottom-width: 2px; border-radius: 5px; padding: 2px 7px;
  font-family: inherit; font-size: 12px;
}

/* ---------- 智能体模态 ---------- */
.agent-item {
  display: flex; align-items: center; gap: 12px;
  padding: 12px; border-radius: 8px;
  border: 1px solid var(--border); margin-bottom: 8px; background: var(--bg);
}
.agent-item.agent-added { cursor: pointer; }
.agent-item.agent-added:hover { background: var(--bg-hover); }
.agent-emoji { font-size: 24px; flex-shrink: 0; }
.agent-main { flex: 1; min-width: 0; }
.agent-name { font-size: 14px; font-weight: 600; }
.agent-desc { font-size: 12px; color: var(--text-tertiary); line-height: 1.5; margin-top: 2px; }
.agent-add-btn { flex-shrink: 0; height: 30px; font-size: 13px; }

/* 响应式补充 */
@media (max-width: 900px) {
  .view-page { padding: 32px 20px 100px; }
  .drawer-panel { width: 300px; }
  .cal-cell { min-height: 72px; }
}

/* ---------- C4 课堂模式（全屏逐段 + 速记面板） ---------- */
.classroom-overlay {
  position: fixed; inset: 0; z-index: 1500;
  background: var(--bg); color: var(--text);
  display: flex; flex-direction: column;
}
.classroom-head {
  display: flex; align-items: center; gap: 12px;
  padding: 12px 24px; border-bottom: 1px solid var(--border);
}
.classroom-head-title { flex: 1; font-size: 16px; font-weight: 600; min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.classroom-progress { font-size: 13px; color: var(--text-tertiary); flex-shrink: 0; }
.classroom-main { flex: 1; display: flex; min-height: 0; }
.classroom-stage-wrap { flex: 1; overflow-y: auto; padding: 40px 48px; }
.classroom-stage { max-width: 780px; margin: 0 auto; }
/* 只读复用编辑器块渲染：课堂里不显示侧栏手柄的悬停位，内容占满整行 */
.classroom-stage .block { padding-left: 0; }
/* 版式重设计 刀一 §双密度：覆写一次讲法卡字号变量即得投影密度
   （题干 22 / 正文 18；脚注 --teach-note 保持小字不动） */
.classroom-stage .teach-card { --teach-stem: 22px; --teach-body: 18px; --teach-lead: 18px; }
.classroom-note {
  width: 300px; flex-shrink: 0; overflow-y: auto;
  border-left: 1px solid var(--border); padding: 20px;
  display: flex; flex-direction: column; gap: 10px;
}
.classroom-note-title { font-size: 15px; font-weight: 600; }
.classroom-note-target { font-size: 13px; color: var(--text-secondary); }
.classroom-note-tiers { display: flex; gap: 8px; }
.classroom-note-tiers .classroom-tier { flex: 1; }
/* 二级错因内联点选（错因树包）：不弹窗，chips 纵排在档位按钮下 */
.classroom-note-details { display: flex; flex-direction: column; gap: 6px; }
.classroom-note-detail-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.classroom-detail-chip { font-size: 12px; padding: 4px 10px; }
.classroom-nav {
  display: flex; justify-content: center; gap: 12px;
  padding: 12px; border-top: 1px solid var(--border);
}
/* 编辑器页的「进入课堂」入口行（仅 confirmed 的教学包渲染） */
.classroom-entry { display: flex; align-items: center; gap: 10px; margin: 4px 0 12px; }

@media (max-width: 900px) {
  .classroom-main { flex-direction: column; }
  .classroom-note { width: auto; border-left: none; border-top: 1px solid var(--border); }
}

/* ============================================================
   数学渲染（任务包-数学渲染 S1）
   ============================================================ */
/* 行内公式与正文基线对齐；KaTeX 自带字号略大于正文，收一点 */
.math-inline .katex { font-size: 1.02em; }
/* 公式解析失败：KaTeX throwOnError:false 会染红显示源码，这里补底色让错误可见但不炸块 */
.math-inline .katex-error { background: var(--hl-red-bg, rgba(192,57,43,.12)); border-radius: 3px; padding: 0 2px; }
.math-error { color: var(--red, #c0392b); }
/* 公式内中文混排：KaTeX 对 CJK 字符落在 .cjk_fallback 上，接系统中文字体防豆腐块（R6） */
.katex .cjk_fallback {
  font-family: "Microsoft YaHei", "PingFang SC", "Noto Sans CJK SC", "Source Han Sans SC",
    ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
}

/* ============================================================
   打印（任务包-数学渲染 S1 新建节；S6 补图解分页保护）
   现状全库此前零打印规则——教学包可打印是产品硬指标。
   ============================================================ */
@media print {
  @page { size: A4; margin: 16mm 14mm; }
  html, body, #screen-app, .app-shell, .main-area, .content-scroll {
    display: block !important; width: auto !important; height: auto !important;
    min-height: 0 !important; overflow: visible !important; position: static !important;
    background: #fff !important;
  }
  .win-tabbar, .sidebar, .topbar, .page-tool-row, .block-side,
  .classroom-entry, .cover-actions { display: none !important; }
  /* 版式重设计 刀二：教学包页头 / 讲法导航 / 页内审阅条是屏幕家具——
     教案打出来不该有审阅态胶囊、导航 chip 与确认按钮（标题本身走
     下方 .page-title-input 的打印规则，不在此列） */
  .teach-pagehead, .teach-nav, .teach-review-bar { display: none !important; }
  .page-editor { padding: 0 !important; }
  .page-body { max-width: none !important; padding: 0 !important; }
  .page-cover, .page-head-space, .page-icon-wrap { display: none !important; }
  .page-title-input {
    border: 0 !important; padding: 0 0 12px !important; color: #111 !important;
    font-size: 25px !important; white-space: normal !important;
  }
  .block { break-inside: avoid-page; }
  /* 公式与讲法卡片不被分页撕碎 */
  .math-inline, .katex-display { break-inside: avoid; }
  .teach-card { break-inside: avoid; }
  .teach-gate {
    color: #111 !important; background: #fff !important;
    border: 1px solid #777 !important; -webkit-print-color-adjust: exact; print-color-adjust: exact;
  }
  .teach-gate.gate-unverifiable { border-style: dashed !important; }
  /* 版式重设计 刀一：答案 <details> 屏幕默认折叠，打印强制展开——
     否则 PDF 会把答案整段吞掉（导出读渲染后 DOM，见 js/docgen.js print 链路） */
  .teach-ans > summary { list-style: none; }
  .teach-ans > summary::before { display: none !important; }
  .teach-ans .teach-ans-body { display: block !important; }
}

/* ============================================================
   视觉图解（任务包-数学渲染 S2）
   SVG 全部走 viewBox，宽度随容器缩放；颜色走主题变量，暗色主题跟随。
   ============================================================ */
.teach-diagram { flex: 1; min-width: 0; }
.diagram-svg { display: block; width: 100%; max-width: 640px; height: auto; }
.diagram-axis, .diagram-tick { stroke: var(--text-secondary); stroke-width: 1.2; }
.diagram-tick-label { fill: var(--text-tertiary); font-size: 11px; }
.diagram-arrowhead { fill: var(--text-secondary); }
.diagram-point { fill: var(--accent); }
.diagram-point-label { fill: var(--text); font-size: 12px; }
.diagram-range { stroke: var(--accent); stroke-width: 4; stroke-linecap: round; }
.diagram-range-end { fill: var(--accent); stroke: var(--accent); }
.diagram-range-end.diagram-open { fill: var(--bg, #fff); }
.diagram-range-label { fill: var(--accent); font-size: 12px; }
.diagram-step-box { fill: var(--accent-soft); stroke: var(--border-strong); rx: 8px; }
.diagram-step-title { fill: var(--text); font-size: 14px; font-weight: 600; }
.diagram-step-note { fill: var(--text-secondary); font-size: 12px; }
.diagram-arrow { stroke: var(--text-tertiary); stroke-width: 1.5; }
.diagram-template {
  font-size: 13px; color: var(--text-secondary); line-height: 1.7;
  padding: 8px 12px; background: var(--accent-soft); border-radius: 6px;
}
.diagram-pending { font-size: 13px; color: var(--text-tertiary); }
.diagram-fallback-hint { font-size: 12px; color: var(--text-secondary); margin-bottom: 4px; }
.diagram-raw summary, .teach-spec-raw summary {
  cursor: pointer; font-size: 12px; color: var(--text-tertiary); user-select: none;
}
.diagram-raw pre, .teach-spec-raw pre {
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 12px; white-space: pre-wrap; word-break: break-all;
  background: var(--accent-soft); border-radius: 6px; padding: 8px 12px; margin: 4px 0 0;
}
.agent-progress .chat-bubble {
  color: var(--text-secondary, #6b6b6b);
  font-size: 13px;
  background: var(--bg-secondary, #f6f5f4);
}

.agent-error .chat-bubble {
  color: #9f2f2f;
  background: #fff1f0;
}

.agent-cancel {
  background: #f1efed;
  color: #5f5a55;
}

/* ---------- 函数图像（S3） ---------- */
.diagram-grid { stroke: var(--border); stroke-width: 1; }
.diagram-frame { fill: none; stroke: var(--border-strong); stroke-width: 1; }
.diagram-curve { fill: none; stroke-width: 2; }
.diagram-legend { display: flex; flex-wrap: wrap; gap: 6px 16px; margin-top: 6px; }
.diagram-legend-item { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-secondary); }
.diagram-legend-swatch { width: 14px; height: 3px; border-radius: 2px; display: inline-block; }

/* ---------- 几何关系图（S4） ---------- */
.diagram-geo { stroke: var(--text); stroke-width: 1.5; fill: none; }
line.diagram-geo { stroke: var(--text); }
.diagram-geo-angle { stroke: var(--accent); stroke-width: 1.5; fill: none; }
.diagram-geo-label { fill: var(--text); font-size: 13px; }
.diagram-geo-mark { stroke: var(--text); stroke-width: 1.5; }

/* ---------- 图解打印保护（S6）：SVG 不被分页撕碎、尺寸钳制 ---------- */
@media print {
  .teach-diagram, .diagram-svg, .diagram-legend { break-inside: avoid; }
  .diagram-svg { max-width: 100%; }
}

/* ---------- 用量与额度（P2 额度制） ----------
   全走 base.css 令牌；语义色：告警=tag-yellow 组，触顶=tag-red 组，
   估算值标记=tag-red-text（红标行注明「估算值」是任务包硬性要求）。 */
.quota-banner {
  padding: 10px 12px; border-radius: 6px; margin-bottom: 16px;
  background: var(--tag-yellow); color: var(--tag-yellow-text);
  font-size: 13px; line-height: 1.55;
}
.quota-banner.is-blocked { background: var(--tag-red); color: var(--tag-red-text); }
.quota-progress-wrap { display: flex; flex-direction: column; gap: 6px; min-width: 220px; }
.quota-progress {
  height: 8px; border-radius: 4px; background: var(--bg-tertiary);
  overflow: hidden;
}
.quota-progress-fill { height: 100%; background: var(--accent); border-radius: 4px; }
.quota-progress-fill.is-alert { background: var(--tag-orange-text); }
.quota-progress-fill.is-blocked { background: var(--danger); }
.quota-table { width: 100%; border-collapse: collapse; font-size: 13px; }
.quota-table th {
  text-align: left; font-weight: 500; color: var(--text-tertiary);
  padding: 6px 8px; border-bottom: 1px solid var(--border-strong);
}
.quota-table td { padding: 6px 8px; border-bottom: 1px solid var(--border); color: var(--text); }
.quota-table td:last-child { white-space: nowrap; }
.quota-est { color: var(--tag-red-text); font-size: 12px; margin-left: 4px; }
.quota-dispute-btn { height: 26px; padding: 0 8px; font-size: 12px; }
.quota-dispute-input { width: 160px; height: 26px; margin-right: 6px; }
.quota-host .model-settings-section { margin-top: 20px; }

/* ===== 三代理预设面（2026-08-19 任务包）：诚实标签 / 事实清单 / 改稿提案 =====
   （选择器已移到侧边栏对话页签的 Notion AI 位，复用 .agent-tile 磁贴样式） */
.chat-honest-label { font-size: 12px; color: var(--tag-blue-text, #337ea9); border: 1px solid currentColor; border-radius: 999px; padding: 1px 8px; margin-left: 8px; }
mark.fact-unchecked { background: rgba(245, 194, 107, .55); color: inherit; border-radius: 2px; padding: 0 1px; }
.fact-hint { margin-top: 6px; font-size: 12px; color: var(--tag-orange-text, #b38125); }
.facts-body { padding: 12px 18px 16px; min-width: 420px; max-width: 560px; }
.facts-head { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.facts-label { font-size: 13px; color: var(--text-tertiary); }
.facts-list { max-height: 320px; overflow: auto; border: 1px solid var(--border, #e3e2df); border-radius: 6px; padding: 6px 8px; }
.facts-group { font-size: 12px; font-weight: 600; color: var(--text-tertiary); margin: 8px 0 2px; }
.facts-item { display: flex; gap: 6px; align-items: flex-start; font-size: 13px; line-height: 1.5; padding: 2px 0; cursor: pointer; }
.facts-cb { margin-top: 3px; }
.facts-note { font-size: 12px; color: var(--text-tertiary); line-height: 1.5; margin: 10px 0; }
.facts-confirm { align-self: flex-end; }
.patch-body { padding: 12px 18px 16px; min-width: 520px; max-width: 720px; max-height: 70vh; overflow: auto; }
.patch-card { border: 1px solid var(--border, #e3e2df); border-radius: 8px; padding: 10px 12px; margin-bottom: 10px; }
.patch-card-head { display: flex; align-items: baseline; gap: 8px; margin-bottom: 6px; }
.patch-status { font-size: 11px; border-radius: 999px; padding: 1px 8px; border: 1px solid currentColor; }
.patch-status-pending { color: var(--tag-orange-text, #b38125); }
.patch-status-applied { color: var(--tag-green-text, #448361); }
.patch-status-dismissed { color: var(--text-tertiary); }
.patch-note { font-size: 13px; flex: 1; }
.patch-time { font-size: 12px; color: var(--text-tertiary); }
.patch-stale-warn { font-size: 12px; color: var(--tag-red-text, #eb5757); background: rgba(235, 87, 87, .08); border-radius: 6px; padding: 6px 8px; margin-bottom: 6px; }
.patch-diff { font: 12px/1.6 ui-monospace, Consolas, monospace; border: 1px solid var(--border, #e3e2df); border-radius: 6px; padding: 6px 8px; max-height: 260px; overflow: auto; white-space: pre-wrap; }
.patch-line-add { background: rgba(68, 131, 97, .14); }
.patch-line-del { background: rgba(235, 87, 87, .12); color: var(--tag-red-text, #eb5757); }
.patch-line-ctx { color: var(--text-tertiary); }
.patch-actions { display: flex; gap: 8px; margin-top: 8px; }
.topbar-patch { position: relative; }
/* ---------- 资料入库确认面（任务包「资料入库」M3） ---------- */
.kb-import-row { display: flex; align-items: center; gap: 10px; margin: 4px 0 12px; }
.kb-import-hint { font-size: 12px; color: var(--muted, #787774); }
.ingest-modal { max-width: 640px; width: 92vw; max-height: 84vh; overflow-y: auto; }
.ingest-progress { padding: 18px 4px; font-size: 14px; }
.ingest-file-line { font-size: 13px; color: var(--muted, #787774); margin: 8px 0; }
.ingest-scanned-warn { background: #fdf3e0; color: #7a4d00; border-radius: 6px; padding: 8px 10px; font-size: 13px; margin: 8px 0; }
.ingest-attachment { font-size: 13px; padding: 4px 0; color: var(--muted, #787774); }
.ingest-rights { border: 1px solid var(--border, #e3e2de); border-radius: 8px; padding: 10px; margin: 10px 0; display: flex; flex-wrap: wrap; gap: 8px; }
.ingest-rights-title { width: 100%; font-size: 12px; color: var(--muted, #787774); }
.ingest-rights select, .ingest-rights input { font-size: 13px; padding: 4px 6px; }
.ingest-chunks-head { display: flex; justify-content: space-between; font-size: 13px; margin: 10px 0 6px; }
.ingest-count { color: var(--muted, #787774); }
.ingest-chunks { max-height: 320px; overflow-y: auto; border: 1px solid var(--border, #e3e2de); border-radius: 8px; padding: 6px; }
.ingest-chunk { display: flex; gap: 8px; align-items: flex-start; padding: 6px 4px; border-bottom: 1px solid var(--border, #e3e2de); font-size: 13px; }
.ingest-chunk:last-child { border-bottom: none; }
.ingest-chunk input { margin-top: 3px; }
.ingest-chunk-text { white-space: pre-wrap; word-break: break-word; }
/* 刀① 结构化预览：标题链组头 / 页码徽标 / 解析降级标注 */
.ingest-chain {
  font-size: 12px; font-weight: 600; color: var(--text-secondary);
  padding: 8px 4px 2px; border-bottom: 1px dashed var(--border, #e3e2de);
}
.ingest-page-badge {
  flex-shrink: 0; font-size: 11px; color: var(--accent);
  border: 1px solid var(--accent); border-radius: 4px; padding: 0 3px; margin-top: 1px;
}
.ingest-note {
  font-size: 12px; color: #7a4d00; background: #fdf3e0;
  border-radius: 6px; padding: 5px 8px; margin: 6px 0;
}
/* 刀④ 确认面「同时转写为知识库文档」勾选行（扫描件禁用+灰字） */
.ingest-transcribe { display: flex; gap: 8px; align-items: center; font-size: 13px; margin: 10px 0 0; }
.ingest-transcribe-off { font-size: 12px; color: var(--muted, #787774); }
.ingest-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 12px; }
.ingest-done { font-size: 14px; margin: 10px 0 4px; }
.ingest-done-sub { font-size: 12px; color: var(--muted, #787774); margin-bottom: 10px; }
/* ---------- 成绩导入确认面（任务包「成绩导入」G1-G4，风格照 ingest-* 族） ---------- */
.grades-map-section { margin: 10px 0; }
.grades-map-title { font-size: 12px; color: var(--muted, #787774); margin-bottom: 6px; }
.grades-map-list { border: 1px solid var(--border, #e3e2de); border-radius: 8px; padding: 6px; max-height: 220px; overflow-y: auto; }
.grades-map-row { display: flex; align-items: center; gap: 8px; padding: 5px 4px; border-bottom: 1px solid var(--border, #e3e2de); font-size: 13px; }
.grades-map-row:last-child { border-bottom: none; }
.grades-map-col { min-width: 120px; font-weight: 500; }
.grades-map-kind { font-size: 12px; color: var(--muted, #787774); }
.grades-map-row .nv-dropdown { margin-left: auto; }
.grades-answer-input { width: 90px; font-size: 13px; padding: 4px 6px; }
.grades-names { border: 1px solid var(--border, #e3e2de); border-radius: 8px; padding: 6px; max-height: 200px; overflow-y: auto; }
.grades-names-empty { font-size: 13px; color: var(--muted, #787774); padding: 4px; }
.grades-name-row { display: flex; align-items: center; gap: 8px; padding: 5px 4px; border-bottom: 1px solid var(--border, #e3e2de); font-size: 13px; }
.grades-name-row:last-child { border-bottom: none; }
.grades-name-cell { min-width: 90px; font-weight: 500; }
.grades-name-row .nv-dropdown { margin-left: auto; }
.grades-template-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.grades-template-name { font-size: 13px; padding: 4px 6px; }
.grades-irreversible { margin-top: 8px; }
.grades-suggest-list { max-height: 260px; }
.grades-suggest-row { font-size: 13px; }
.grades-preview-title { font-size: 12px; color: var(--muted, #787774); margin: 10px 0 4px; }
.grades-preview { font-size: 13px; white-space: pre-wrap; background: var(--sidebar-bg, #f7f7f5); border-radius: 8px; padding: 8px 10px; }
.grades-result-list { max-height: 320px; margin-top: 8px; }
.grades-result-row { font-size: 13px; }
.grades-result-skipped { color: var(--muted, #787774); }
/* ---------- 快速定级向导（任务包「迁移向导·快速定级」，风格照 grades-*/ingest-* 族） ---------- */
.placement-fork { display: flex; flex-direction: column; gap: 8px; margin: 10px 0; }
.placement-fork-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.placement-fork-btn { text-align: left; }
.placement-quiz-head { display: flex; justify-content: flex-end; margin: 6px 0; }
.placement-count { font-size: 12px; color: var(--muted, #787774); }
.placement-quiz-list { max-height: 52vh; overflow-y: auto; border: 1px solid var(--border, #e3e2de); border-radius: 8px; padding: 6px; }
.placement-card { padding: 8px 6px; border-bottom: 1px solid var(--border, #e3e2de); }
.placement-card:last-child { border-bottom: none; }
.placement-card-meta { font-size: 12px; color: var(--muted, #787774); margin-bottom: 4px; }
.placement-stem { font-size: 14px; margin-bottom: 6px; }
.placement-answer { font-size: 13px; margin-bottom: 6px; }
.placement-answer-body { padding: 4px 0 2px; color: var(--muted, #787774); }
.placement-grade-row { display: flex; gap: 8px; align-items: center; }
.placement-grade-btn.is-on { border-color: var(--accent); color: var(--accent); font-weight: 600; }
.placement-attr { margin-left: 4px; }
/* 二级错因内联候选（错因树包，spec §8 一层→两级升级） */
.placement-detail-row { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; }
.placement-detail-chip { font-size: 12px; padding: 3px 10px; }
.placement-detail-chip.is-on { border-color: var(--accent); color: var(--accent); font-weight: 600; }
.placement-detail-input { max-width: 200px; }
.placement-skip-hint { font-size: 12px; color: var(--muted, #787774); margin-right: auto; align-self: center; }

/* 错因画像（错因树包，学生详情分区） */
.error-portrait { display: flex; flex-direction: column; gap: 6px; font-size: 13px; }
.error-portrait-row { display: flex; gap: 10px; align-items: baseline; }
.error-portrait-label { color: var(--muted, #787774); flex-shrink: 0; }
