
:root {
  /* 颜色 token（2026-09-30 设计系统·24 个；2026-10-12 换「纸本」：纸面偏暖、墨色偏褐、靛蓝加深）。整站只从这里取色，不许再写裸色值。 */
  --paper: #f6f1e7;
  --paper-raised: #fffdf8;
  --paper-sunken: #efe8da;
  --rail: #f0e9dc;
  --rail-hover: #e9e1d1;
  --rail-active: #e3d9c6;
  --ink: #1f1b16;
  --ink-2: #3a342b;
  --ink-3: #544c40;
  --ink-4: #6c6355;
  --ink-5: #a69c8a;
  --line: #e3dccd;
  --line-strong: #d3c8b3;
  --zhu: #b5402e;
  --zhu-deep: #8a3b2c;
  --zhu-wash: #f7ede9;
  --zhu-tint: #fdf3ec;
  --zhu-line: #e8c3b8;
  --gold: #c9a86a;
  --gold-ink: #8a6d2f;
  --note: #fdf3d3;
  --note-line: #e8d68a;
  --note-ink: #6b5900;
  --ok: #4a7c59;
  --link: #2b4c7e;
  --link-wash: #ebeff5;   /* 能点的文字：靛蓝（朱红只留给印、主按钮和「正在读」那道线；DESIGN 2026-09-30 任务页统一） */
  --sidebar-w: 216px; --delivery-w: 360px; --rail-w: 52px;
  /* 字号变量（DESIGN 2026-09-30 测试反馈 Q5）：任务页一族（工作台/成果/开场）的规则一律用这几个，不再另写数字。
     这里是全站默认值；右栏 .wb-delivery 里整体换成比对话主栏（正文 15.5）小一档的那一套，见下。 */
  --fs-tag: 11px; --fs-small: 12.5px; --fs-body: 13.5px; --fs-body-l: 14px; --fs-h: 15.5px; --fs-title: 21px;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: "Noto Sans SC", -apple-system, "PingFang SC", "Helvetica Neue", sans-serif;
       background: var(--paper); color: var(--ink); line-height: 1.6; -webkit-font-smoothing: antialiased; }
a { color: var(--ink); text-decoration: none; }
a:hover { color: var(--link); text-decoration: underline; }
main { width: 100%; max-width: 1200px; margin: 0 auto; padding: 40px 48px 140px; }
h1 { font-family: "Noto Serif SC", serif; font-size: 36px; font-weight: 600; letter-spacing: 0.02em;
     line-height: 1.3; margin-bottom: 10px; }
h2 { font-family: "Noto Serif SC", serif; font-size: 18px; font-weight: 600; margin: 40px 0 14px;
     padding-bottom: 8px; border-bottom: 1px solid var(--line); }
.fy-sec { display: flex; align-items: baseline; gap: 10px; margin: 40px 0 14px; padding-bottom: 8px; border-bottom: 1px solid var(--line); }
.fy-sec h2 { margin: 0; padding: 0; border: 0; }
.fy-sec .c { font-size: 12.5px; color: var(--ink-4); }
.fy-sec .more { margin-left: auto; font-size: 12.5px; color: var(--link); }
.fy-aside .fy-sec { margin-top: 0; }
.fy-aside .fy-sec h2 { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; font-weight: 400;
                       letter-spacing: .12em; color: var(--ink-4); }
h3 { font-family: "Noto Serif SC", serif; font-size: 16px; font-weight: 600; margin: 0 0 6px; }
p.subtitle { font-family: "Noto Serif SC", serif; color: var(--ink-3); font-size: 15.5px; margin-bottom: 18px; line-height: 1.8; }
p.note { background: var(--note); border: 1px solid var(--note-line); border-radius: 4px; padding: 12px 16px;
         font-size: 13.5px; color: var(--note-ink); margin-bottom: 20px; }
ul.book-grid { list-style: none; display: grid; grid-template-columns: repeat(auto-fill, minmax(200px,1fr));
               gap: 0; border-top: 1px solid var(--line); border-left: 1px solid var(--line); margin: 12px 0 20px; }
ul.book-grid li { background: var(--paper); padding: 16px 16px;
                   border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); }
ul.book-grid li a { font-family: "Noto Serif SC", serif; font-weight: 600; font-size: 14px; }
ul.book-grid li .author { display: block; font-size: 12.5px; color: var(--ink-4); margin-top: 5px; }
ul.book-list { list-style: none; margin: 12px 0 20px; display: grid; gap: 1px; background: var(--line); border: 1px solid var(--line); }
ul.book-list li { background: var(--paper); padding: 16px 20px; margin-bottom: 0; }
ul.book-list li .book-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; flex-wrap: wrap; }
ul.book-list li .book-head a { font-family: "Noto Serif SC", serif; font-weight: 700; font-size: 15.5px; }
ul.book-list li .author { font-size: 12.5px; color: var(--ink-4); white-space: nowrap; }
ul.book-list li .one-liner { font-size: 13.5px; color: var(--ink-2); margin-top: 6px; line-height: 1.6; }
ul.book-list li .one-liner.pending { color: var(--ink-4); font-style: italic; }
article.insight, article.point, article.persona, article.further {
  background: var(--paper); border: 1px solid var(--line-strong); padding: 16px 20px; margin-bottom: 10px;
}
article.insight h3, article.point h3, article.persona h3, article.further h3 { font-size: 15.5px; margin-bottom: 8px; }
article.insight p, article.point p, article.persona p, article.further p {
  font-size: 14px; line-height: 1.8; color: var(--ink-2); margin: 0;
}
article.persona.gap { border-left-style: dashed; opacity: .85; }
/* "书单解读"卡片（书与书的对照/反复出现的主题）标题下方的关联书目行——
   小字号、跟.meta同一个视觉级别，不抢标题风头 */
p.insight-books { font-size: var(--fs-small); color: var(--ink-4); margin: -2px 0 8px; letter-spacing: 0.01em; }
p.insight-books a { color: var(--ink-4); }
p.insight-books a:hover { color: var(--link); }
blockquote.essay { border-left: 2px solid var(--zhu); padding: 4px 0 4px 20px; margin: 16px 0; }
blockquote.essay p { margin-bottom: 14px; font-family: "Noto Serif SC", serif; font-size: 15.5px; line-height: 2; color: var(--ink-2); }
/* 深色卡片（2026-07-31）——书籍页里"主线"和"核心回答"这类书童综合判断出来的合成
   内容，跟回答机制层的枚举类元素（冲突/象征/场景等）拉开视觉差，不发明新样式，
   只是把已有色板（header/avatar同款深底 + c9a86a点缀色）用到这类内容上。 */
.synthesis-card { background: var(--ink); border-top: 3px solid var(--gold); padding: 18px 22px; margin: 16px 0; }
.synthesis-card p { font-family: "Noto Serif SC", serif; font-size: 15.5px; line-height: 1.95; color: var(--paper); margin: 0; }
.meta { font-size: 12.5px; color: var(--ink-4); margin-bottom: 16px; letter-spacing: 0.01em; }
.pending { color: var(--ink-4); font-style: italic; }

/* 我的书社·理解优先（§9.5）：冷启动整页偏空是主基调。淡出预览 = 示例（明确标注、faded、
   不署名），告诉用户"我的理解"将来会长成什么，不冒充真数据。 */
.pending-preview { margin: 14px 0 4px; opacity: 0.6; }
.fade-preview { position: relative; border-left: 2px dashed var(--line-strong); padding: 4px 0 6px 16px;
                max-height: 96px; overflow: hidden; }
.fade-preview::after { content: ""; position: absolute; left: 0; right: 0; bottom: 0; height: 44px;
                       background: linear-gradient(to bottom, rgba(250,248,244,0), var(--paper)); }
.understanding-statement { font-family: "Noto Serif SC", serif; font-size: 16px; line-height: 1.8;
                           color: var(--ink-2); margin-bottom: 4px; }

/* 书页「这本书回应的问题」（2026-09-30 第八轮样稿）：第一问放大（宋体），其余一行一条，出处逐条挂在每问下面。 */
.fy-q-lead a, .fy-q-lead .question-text { font-family: "Noto Serif SC", serif; font-size: 21px; font-weight: 700; line-height: 1.6; color: var(--ink); }
.fy-q-row { padding: 10px 0; border-bottom: 1px solid var(--line); }
.fy-q-lead { padding-bottom: 12px; border-bottom: 1px solid var(--line); }
.fy-q-row a, .fy-q-row .question-text { font-family: "Noto Serif SC", serif; font-size: 15.5px; line-height: 1.8; color: var(--ink-3); }
.fy-qs .meta { margin: 10px 0 0; font-style: italic; }
.fy-main > .book-cells { margin-top: 48px; }
/* 对象页页头两列（2026-09-30 第八轮样稿）：书名在主栏那一列，主按钮落在侧栏那一列，页头不再空出右半边。 */
.fy-pagehead-split { align-items: end; margin: 0 0 8px; }
.fy-pagehead-split h1 { margin-bottom: 4px; }
.fy-head-acts .book-start-row { margin: 0; }
.fy-btnrow { display: flex; gap: 8px; flex-wrap: wrap; }
.fy-btnrow .save-icon { font-size: 13.5px; padding: 8px 16px; color: var(--ink-2); line-height: 1.4; }
h1.question-title { font-family: "Noto Serif SC", serif; line-height: 1.55; }
p.attribution { font-size: 12.5px; color: var(--ink-4); margin-top: 5px; line-height: 1.6; }
.attr-tag { display: inline-block; font-size: 11px; padding: 1px 7px; margin-right: 7px;
             border: 1px solid var(--line-strong); color: var(--ink-3); }
.attr-tag.stated { border-color: var(--ink-4); color: var(--ink); }
article.answer { background: var(--paper); padding: 18px 20px; margin-bottom: 14px;
                  border-left: 2px solid var(--line); }
article.answer h3 { font-size: 15.5px; margin-bottom: 4px; }
article.answer h3 .author { font-weight: 400; font-size: 13.5px; color: var(--ink-4); }
article.answer .answer-note { font-size: 14px; line-height: 1.85; color: var(--ink-2); margin-top: 8px; }
article.answer p.attribution { margin-top: 10px; }

/* 个人页 */
.profile-header { display: flex; gap: 20px; align-items: center; margin-bottom: 12px; }
.avatar-circle { width: 64px; height: 64px; border-radius: 999px; background: var(--ink); color: var(--paper);
                  display: flex; align-items: center; justify-content: center;
                  font-family: "Noto Serif SC", serif; font-size: 21px; font-weight: 700; flex-shrink: 0; }
.profile-header h1 { font-size: 36px; margin: 0 0 4px; }
.profile-handle { font-size: 13.5px; color: var(--ink-4); margin: 0; letter-spacing: 0.03em; }
.profile-bio { font-size: 15.5px; line-height: 1.8; color: var(--ink-2); margin: 16px 0 0; max-width: 560px; }
ul.personal-books { list-style: none; display: grid; gap: 1px; margin: 0; background: var(--line); border: 1px solid var(--line); }
ul.personal-books li { background: var(--paper); border: none; padding: 0; }
ul.personal-books a { display: block; text-decoration: none; color: inherit; padding: 20px 22px; }
ul.personal-books a:hover { background: var(--paper-sunken); text-decoration: none; }
ul.personal-books .title { font-family: "Noto Serif SC", serif; font-size: 16px; font-weight: 700; color: var(--ink); margin-bottom: 6px; }
ul.personal-books .desc { font-size: 13.5px; color: var(--ink-3); line-height: 1.7; margin-bottom: 8px; }
ul.personal-books .meta { font-size: 12.5px; color: var(--ink-4); margin: 0; }

/* 统一上下文输入框（底部常驻）：跟Claude Code/ChatGPT同一个模式，输入条固定在
   viewport底部，跟"跟书童对话是核心交互"这条定位更匹配——顶部是导航，底部才是
   "跟书童说话"的地方。2026-07-24视觉连续性收尾：背景从跟header同色的近黑改成
   跟正文对话区（.timeline-thread等）同一个暖米背景，不再像一条焊死在页面底部的
   独立工具栏，顶部加一道淡出渐变，让正文内容"流进"输入区，不是硬边界切断。 */
.composer-dock { position: fixed; left: 0; right: 0; bottom: 0; z-index: 40;
                  background: transparent; padding: 8px 24px 18px; }
.composer-dock::before { content: ""; position: absolute; left: 0; right: 0; bottom: 100%; height: 40px;
                          background: linear-gradient(to bottom, rgba(250,248,244,0), var(--paper)); pointer-events: none; }
/* 对话框＝浮层卡片（2026-09-22·Jim·参考 Perplexity）：整块加框（白底+描边+圆角+柔阴影），
   浮在对话流之上；内部 input 去掉自己的边框、融进卡片当一条输入行。 */
.context-input-wrap { max-width: 760px; margin: 0 auto; position: relative;
                       background: var(--paper-raised); border: 1px solid var(--line-strong); border-radius: 16px;
                       box-shadow: 0 6px 24px rgba(26,26,24,0.10); padding: 10px 12px; }
.context-input-form { display: flex; gap: 8px; align-items: center; }
.context-input-form textarea { flex: 1; min-width: 0; border: none; border-radius: 0; padding: 8px 8px; resize: none;
                             font-size: 15.5px; line-height: 1.5; font-family: inherit; background: transparent; color: var(--ink);
                             field-sizing: content; max-height: 220px; min-height: 1.5em; overflow-y: auto; }   /* 多行：贴一整段书目 / 文章不再被压成一行（10-01） */
.context-input-form textarea::placeholder { color: var(--ink-5); }
.context-input-form textarea:focus { outline: none; }
/* 发送按钮改成融合进输入条的圆形图标，不是一个独立的文字按钮——空状态应该"假设
   用户有能力"，不需要一个写着"提交"的大按钮反复提醒这是一个表单。 */
.context-input-form button { flex-shrink: 0; width: 36px; height: 36px; border-radius: 999px;
                              background: var(--zhu); color: var(--paper); border: none; font-size: 15.5px;
                              display: flex; align-items: center; justify-content: center; cursor: pointer; }
.context-input-form button:hover { background: var(--ink); }
/* 输入条最左边的「/」：调用技能菜单的入口，淡色、不抢发送按钮 */
.context-input-form button.slash-btn { width: 30px; height: 30px; background: var(--rail); color: var(--ink-3); font-size: 17px; font-family: inherit; border: 1px solid var(--line); }
.context-input-form:has(textarea:not(:placeholder-shown)) button.slash-btn { display: none; }   /* 输入框里有字了，「/」入口就收起（它只是空着时的提示） */
.context-input-form button.slash-btn:hover { background: var(--rail-hover); color: var(--link); }
/* 输入条在底部，"/"菜单跟其余聊天App一样向上弹出，不是往下（下面已经是视口边缘） */
.slash-menu { position: absolute; bottom: 100%; left: 0; margin-bottom: 4px; background: var(--paper); border: 1px solid var(--line-strong);
              min-width: 220px; z-index: 10; box-shadow: 0 -2px 8px rgba(0,0,0,0.06); }
.slash-menu button { display: block; width: 100%; text-align: left; background: none; border: none; color: var(--ink);
                      font-size: 12.5px; font-family: inherit; padding: 9px 14px; cursor: pointer; }
.slash-menu button:hover { background: var(--rail); color: var(--link); }
.slash-hint { margin-left: 10px; font-size: 12.5px; color: var(--ink-4); }
.slash-empty { margin: 0; padding: 8px 12px; font-size: 12.5px; color: var(--ink-4); }
/* 微信读书数据卡（v1 片4）：书童那一两句下面的一张确定性数据卡——真数字、书名、你的原话。 */
.wr-card { margin-top: 10px; max-width: 560px; border: 1px solid var(--line-strong); border-radius: 8px; background: var(--paper-raised); padding: 12px 14px; }
.wr-card-h { font-size: 13.5px; font-weight: 600; color: var(--ink); display: flex; flex-wrap: wrap; gap: 4px 10px; align-items: baseline; }
.wr-src { font-size: 11px; font-weight: 400; color: var(--ink-4); }
.wr-stats { display: flex; flex-wrap: wrap; gap: 8px 18px; margin-top: 10px; }
.wr-stat { font-size: 12.5px; color: var(--ink-3); display: flex; flex-direction: column; }
.wr-stat b { font-size: 17px; color: var(--ink); font-weight: 600; }
.wr-note { font-size: 12.5px; color: var(--ink-3); margin-top: 8px; }
.wr-empty { font-size: 13.5px; color: var(--ink-3); margin-top: 8px; }
.wr-items { margin-top: 8px; border-top: 1px solid var(--line); }
.wr-item { padding: 8px 0; border-bottom: 1px solid var(--line); font-size: 13.5px; }
.wr-item:last-child { border-bottom: none; }
.wr-tag { display: inline-block; font-size: 11px; color: var(--ink-4); border: 1px solid var(--line-strong); border-radius: 4px; padding: 0 5px; margin-right: 6px; }
.wr-it { display: inline; color: var(--ink); }
.wr-q { margin: 4px 0 0; padding-left: 10px; border-left: 2px solid var(--line-strong); color: var(--ink-3); font-size: 12.5px; }
.wr-tx { color: var(--ink-3); font-size: 12.5px; margin-top: 3px; }
.wr-meta { color: var(--ink-4); font-size: 11px; margin-top: 3px; }
.wr-act { display: inline-block; margin-top: 10px; font-size: 12.5px; color: var(--link); border: 1px solid var(--link); border-radius: 999px; padding: 4px 12px; text-decoration: none; }
.wr-act:hover { background: var(--link); color: var(--paper-raised); }
/* 模块化回复（2026-10-14）：对象＝行内链接色；快捷输入复用 .wr-open-btns；拍板选项用圆点 */
.rc-obj { display: inline; padding: 0; font-size: inherit; text-align: left; line-height: inherit; }
.rc-card .wr-open-btns { margin-top: 10px; }
.rc-choose { margin-top: 8px; display: flex; flex-direction: column; gap: 4px; }
.rc-opt { display: flex; gap: 8px; align-items: baseline; text-align: left; background: none; border: 1px solid var(--line); border-radius: 8px; padding: 7px 10px;
          font: inherit; font-size: 13.5px; color: var(--ink-2); cursor: pointer; }
.rc-opt:hover { border-color: var(--link); }
.rc-opt.on { border-color: var(--link); color: var(--ink); }
.rc-dot { color: var(--link); flex-shrink: 0; }
.rc-log { font-size: 12px; color: var(--ink-4); margin-top: 2px; }
/* 微信读书skill 页（/weread.html·v1 片6）：一页三态——data-state 决定显示哪几段。 */
.wr-page [data-for] { display: none; }
.wr-page[data-state="anon"] [data-for~="anon"], .wr-page[data-state="unconnected"] [data-for~="unconnected"],
.wr-page[data-state="connected"] [data-for~="connected"], .wr-page[data-state="down"] [data-for~="down"],
.wr-page[data-state="loading"] [data-for~="loading"] { display: block; }
.wr-page h2 { font-size: 16px; margin: 28px 0 10px; }
.wr-sees { list-style: none; padding: 0; margin: 0; border-top: 1px solid var(--line); }
.wr-sees li { padding: 9px 0; border-bottom: 1px solid var(--line); font-size: 14px; color: var(--ink); }
.wr-sees li span { color: var(--ink-4); font-size: 13.5px; margin-left: 6px; }
.wr-point { margin: 18px 0 0; padding: 10px 14px; background: var(--note); border: 1px solid var(--note-line); border-radius: 8px; font-size: 13.5px; color: var(--ink-2); }
.wr-steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; margin-top: 12px; }
.wr-step { border: 1px solid var(--line); border-radius: 8px; padding: 12px; background: var(--paper-raised); font-size: 13.5px; color: var(--ink); }
.wr-step svg { display: block; width: 100%; height: 86px; color: var(--ink-4); margin-bottom: 8px; }
.wr-step b { color: var(--ink-4); margin-right: 4px; }
.wr-mobile-note { display: none; margin-top: 12px; font-size: 13.5px; color: var(--ink-2); }
.wr-form { margin-top: 18px; border: 1px solid var(--line-strong); border-radius: 8px; padding: 16px; background: var(--paper-raised); max-width: 560px; }
.wr-keyrow { display: flex; gap: 8px; }
.wr-keyrow input { flex: 1; min-width: 0; font-size: 15.5px; padding: 9px 11px; border: 1px solid var(--line-strong); border-radius: 8px; font-family: inherit; background: var(--paper); }
.wr-keyrow input:focus { outline: none; border-color: var(--zhu); }
.wr-recog { font-size: 12.5px; color: var(--ink-3); min-height: 18px; margin-top: 6px; }
.wr-recog.bad { color: var(--zhu); }
.wr-tell { font-size: 12.5px; color: var(--ink-4); margin-top: 8px; line-height: 1.7; }
.wr-btn { margin-top: 12px; }
.wr-msg { margin-top: 10px; font-size: 13.5px; color: var(--ink-2); }
.wr-msg.bad { color: var(--zhu); }
.wr-status { font-size: 14px; color: var(--ink); margin-top: 4px; }
.wr-status b { color: var(--ok); font-weight: 600; margin-right: 6px; }
.wr-nums { display: flex; flex-wrap: wrap; gap: 10px 36px; margin: 16px 0; }
.wr-num { display: flex; flex-direction: column; font-size: 13.5px; color: var(--ink-3); }
.wr-num b { font-family: "Noto Serif SC", serif; font-size: 21px; color: var(--ink); font-weight: 600; }
.wr-sync { margin: 8px 0 4px; font-size: 13.5px; color: var(--ink-2); }
.wr-bar { height: 6px; background: var(--rail); border-radius: 4px; overflow: hidden; max-width: 420px; margin-top: 6px; }
.wr-bar i { display: block; height: 100%; background: var(--zhu); width: 0; transition: width .4s; }
.wr-row { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 16px; margin-top: 14px; }
.wr-weak { background: none; border: none; color: var(--ink-4); cursor: pointer; font-family: inherit; font-size: 12.5px; padding: 0; text-decoration: underline; margin-top: 28px; }
.wr-confirm { margin-top: 10px; padding: 12px 14px; border: 1px solid var(--zhu-line); border-radius: 8px; background: var(--zhu-tint); font-size: 13.5px; color: var(--ink-2); max-width: 560px; }
.wr-danger { margin-top: 10px; }
.wr-erase { margin-top: 36px; padding-top: 18px; border-top: 1px solid var(--line); }
.wr-erase-btn { background: #b3261e; color: #fff; border: none; border-radius: 8px; padding: 8px 16px; font: inherit; font-size: 13.5px; cursor: pointer; margin-top: 6px; }
.wr-erase-btn:disabled { background: var(--line-strong); cursor: not-allowed; }
@media (max-width: 700px) {
  .wr-steps { grid-template-columns: 1fr; }
  .wr-mobile-note { display: block; }
}
/* 选项 = 可点的**轻**建议——⚑ 对话流里**文字才是主角**，选项要低于文字一档、贴着文字
   （不是抢戏的大药丸）：小字、淡边、透明底、前导 → 淡，hover 才提亮成朱红。长句换行。 */
/* CC 式方向选择器（P2a·2026-09-01）：盒式一体·逐行·当前行高亮+caret·↑↓选 Enter 确认（P2b）。 */
.shutong-opts { display: block; margin-top: 10px; max-width: 480px; border: 1px solid var(--line-strong);
                border-radius: 8px; overflow: hidden; background: var(--paper-raised); counter-reset: shutongopt; }
.shutong-opts-head { display: flex; justify-content: space-between; font-size: 11px; color: var(--ink-4);
                     padding: 7px 12px 5px; }
.shutong-opt { display: block; width: 100%; border: none; border-radius: 0; background: transparent;
               padding: 7px 12px 7px 32px; position: relative; font-size: 13.5px; line-height: 1.5;
               color: var(--ink-3); cursor: pointer; text-align: left; }
/* 序号 1/2/3——用户回"1"也能选（submitContext 里接住数字）。 */
.shutong-opt::before { counter-increment: shutongopt; content: counter(shutongopt); position: absolute;
                       left: 15px; top: 7px; color: var(--zhu); font-size: 12.5px; font-weight: 700; }
.shutong-opt.sel { background: var(--zhu-wash); color: var(--zhu); text-decoration: none; }
.shutong-opt:hover { background: var(--link-wash); color: var(--link); text-decoration: none; }
.shutong-opt.sel::after { content: "❯"; position: absolute; left: 4px; top: 7px; color: var(--zhu);
                          font-size: 11px; }
/* CC picker 第 4 行：内联自由输入（P2c·2026-09-01·选 (b)·composer 让位）。 */
.shutong-free { padding: 0; }
.shutong-free-input { width: 100%; border: none; background: transparent; padding: 7px 12px 7px 32px;
                      font-family: inherit; font-size: 13.5px; color: var(--ink); line-height: 1.5; }
.shutong-free-input::placeholder { color: var(--ink-5); }
.shutong-free-input:focus { outline: none; background: var(--zhu-wash); }
/* composer 让位：picker 内联输入聚焦时·底部输入条淡出退让（不消失·只递退焦点）。 */
.composer-dock.picker-free-active { opacity: .35; transition: opacity .15s; }
.shutong-open { color: var(--ink-4); font-size: 12.5px; font-style: italic; margin-top: 7px; }
.shutong-thinking { color: var(--ink-4); }
/* ② 对象地图（2026-08-14 · S3/#12）：读透任务右栏顶部的「这个对象的地图」——一句话 + 主线。
   编辑感——不是运营卡片。主线＝合成类内容，复用深色卡片（var(--ink) 底 + 米字 + 金点缀，CLAUDE.md）。
   在窄栏（300px）里，比旧的对话流上方骨架尺寸收一号。 */
.re-map-obj { display: flex; align-items: baseline; gap: 8px; margin-bottom: 10px; }
.re-map-label { font-family: "Noto Serif SC", serif; font-size: 15.5px; color: var(--ink); line-height: 1.4; }
.re-map .re-open { font-size: 12.5px; color: var(--link); flex-shrink: 0; }
.re-map .re-open:hover { color: var(--ink); }
.rs-oneliner { font-size: var(--fs-body); line-height: 1.75; color: var(--ink-2); margin: 0 0 10px;
               font-family: "Noto Serif SC", serif; }
.rs-throughline { background: var(--ink); color: var(--paper); border-radius: 8px; padding: 12px 14px;
                  font-size: var(--fs-body); line-height: 1.85; margin-bottom: 2px; }
.rs-throughline .rs-tl-label { display: inline-block; font-size: var(--fs-small); letter-spacing: 0.08em;
                  color: var(--gold); margin-right: 8px; }
/* 工作台对话流（最核心体验）——不是时间线：用户右对齐浅米色气泡，书童左侧带「书」头像纯
   文本 + 选项。去掉竖线/圆点那套日志感。 */
.chat-thread { margin: 16px 0; display: flex; flex-direction: column; gap: 18px; }
.chat-turn { min-width: 0; }
/* 用户：右对齐浅米色气泡（Jim 09-29：黑底白字刺眼）（气泡随内容宽、右贴；turn 本身占满整行，不 shrink——否则短句
   会把整块挤成一条竖排，"书童在想…" 断成"书童在/想…"就是这个坑）。 */
.chat-you { display: flex; justify-content: flex-end; }
.chat-you .chat-bubble { background: var(--rail); color: var(--ink); border-radius: 16px 16px 4px 16px;
                         padding: 10px 15px; max-width: 82%; font-size: 15.5px; line-height: 1.75; }
/* 书童：左侧头像+名，正文是**占满整列的块**（不 shrink-to-content）。 */
.chat-st-head { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.chat-avatar { width: 24px; height: 24px; border-radius: 999px; background: var(--paper-sunken); color: var(--zhu); border: 1px solid var(--rail-active);
               display: flex; align-items: center; justify-content: center;
               font-family: "Noto Serif SC", serif; font-size: 13.5px; font-weight: 700; flex-shrink: 0; }
.chat-name { font-size: 12.5px; color: var(--ink-4); letter-spacing: 0.03em; }
.chat-st-body { font-size: 15.5px; line-height: 1.85; color: var(--ink); padding-left: 32px; }
.chat-st-body p { margin: 0 0 12px; }                 /* ③ 段落之间空行（Jim 2026-09-04·基本阅读体验） */
.chat-st-body p:last-child { margin-bottom: 0; }
.shutong-thinking { white-space: nowrap; }
/* 选过的一组选项：变灰、不再点（选项 = 一次用户输入，选完这组就定了）。 */
.shutong-opts.opts-used { opacity: .45; pointer-events: none; }
/* 一键立成任务（§10 转 task，显式按钮、不埋在选项/文字里）。 */
.to-task-row { margin: 12px 0 2px; }
.to-task-done { font-size: 13.5px; color: var(--ink-3); }
/* A3 一键改判（book↔theme）：次按钮轻量——描边而非实心，跟主按钮拉开，一眼是「或者」。 */
.to-task-or { font-size: 12.5px; color: var(--ink-4); margin: 0 6px 0 10px; }
/* 「这次阅读」右栏（2026-08-06 Understand ①）：脊梁四块（进度 / 追问的问题 / 碰过的场景 /
   查证来源）。沿用编辑感——1px 分隔、小标题、留白，不是圆角卡片堆。 */
.re-block { margin-bottom: 20px; }
.re-block h3 { font-family: inherit; font-size: var(--fs-small); letter-spacing: 0.04em; color: var(--ink-4); margin: 0 0 6px;
               font-weight: 600; text-transform: none; }
.re-progress-line { font-size: 13.5px; color: var(--ink-2); margin: 0 0 6px; }
.re-forming { font-size: 12.5px; color: var(--ink-4); font-style: italic; line-height: 1.7; margin: 0; }
.re-empty { font-size: 12.5px; color: var(--ink-4); font-style: italic; margin: 0; }
/* 成果 tab 公共模块投影（2026-09-22 片3·甲）：一个模块＝标签（衬线）+ 正文。 */
.ps-mod { margin: 0 0 14px; }
.ps-mod-label { font-family: "Noto Serif SC", serif; font-size: 13.5px; font-weight: 700; color: var(--ink); margin: 0 0 4px; }
.ps-mod-text { font-size: 13.5px; line-height: 1.8; color: var(--ink-2); }
.ps-mod-text p { margin: 0 0 8px; }
.ps-mod-text p:last-child { margin-bottom: 0; }
.ps-mod-text ul { margin: 4px 0 8px; padding-left: 18px; }
.ps-mod-text ul li { margin: 0 0 3px; }
/* 要你拍板的（书童消息里，DESIGN 2026-10-06 右栏撤工作台 Q2）：小标题 + 一行一条，点完底下记一行你选了什么。 */
.dec-card .dec-sec { margin: 10px 0 0; }
.dec-card .dec-h { margin: 0 0 4px; color: var(--ink-3); font-size: var(--fs-body); }
.dec-card .dec-row, .dec-card .bl-line { margin: 4px 0; }
.dec-card .fb-cand { border-top: 1px solid var(--line); padding: 8px 0; }
.dec-card .dec-log { margin: 6px 0 0; }
.rf-flash { animation: rf-flash 1.8s ease-out; }
@keyframes rf-flash { 0% { background: var(--zhu-tint); } 100% { background: transparent; } }
.rm-deepening { font-size: var(--fs-tag); color: var(--ink-4); margin: 0 0 10px; }
.rel-graph { width: 100%; max-width: 340px; height: auto; display: block; margin: 4px auto 0; }
.rel-edge { stroke: var(--line-strong); stroke-width: 1.2; }
.rel-label { font-size: 11px; fill: var(--ink-4); text-anchor: middle; }
.rel-node { cursor: pointer; }
.rel-node circle { fill: var(--zhu); }
.rel-node text { font-size: 12.5px; fill: var(--ink); text-anchor: middle; font-family: "Noto Serif SC", serif; }
.rel-node:hover text { fill: var(--link); }
.rel-note { font-size: 11px; color: var(--ink-5); margin: 4px 0 0; }
/* 书页的格（DESIGN 2026-09-27）：公共书页与成果页同一骨架。一格＝h2；格里一条内容单元＝一张卡。 */
.book-titleline { font-size: 14px; margin-bottom: 8px; }
.book-cell .fy-sec { margin-top: 36px; }
.book-cell:first-child .fy-sec { margin-top: 0; }
.cell-unit { position: relative; padding: 12px 0 14px; border-bottom: 1px solid var(--line); }
.cell-unit:last-of-type { border-bottom: none; }
.cell-unit .cu-title { font-size: 15.5px; margin-bottom: 8px; display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; }
.cell-unit p { font-size: 14px; line-height: 1.85; color: var(--ink-2); margin: 0 0 8px; }
.cell-unit ul { margin: 4px 0 8px 18px; font-size: 14px; line-height: 1.8; color: var(--ink-2); }
.cu-chapter { font-size: 11px; color: var(--ink-4); border: 1px solid var(--line); padding: 0 6px; font-weight: 400; }
.cu-badge { font-size: 11px; color: var(--ink-4); border: 1px solid var(--line-strong); background: none; padding: 0 7px; font-weight: 400; }
.cu-field { margin: 6px 0 10px; }
.cu-flabel { display: block; font-size: 12.5px; color: var(--ink-4); letter-spacing: 0.04em; margin-bottom: 2px; }
.cu-lead-cap { font-size: 11px !important; color: var(--ink-4) !important; letter-spacing: 0.1em; margin: 0 0 4px !important; }
.cell-unit p.cu-lead { font-family: "Noto Serif SC", serif; font-size: 21px; line-height: 1.7; font-weight: 700; color: var(--ink);
                       border-left: 3px solid var(--zhu); padding-left: 14px; margin: 0 0 12px; }
.cu-holds { margin: 0 0 6px; }
.cu-quotes, .cu-prev, .cu-blocked { margin: 8px 0 4px; font-size: 13.5px; color: var(--ink-3); }
.cu-quotes summary, .cu-prev summary, .cu-blocked summary { cursor: pointer; color: var(--ink-4); font-size: 12.5px; }
.cu-quotes ul { margin-top: 6px; }
.cu-src { color: var(--ink-4); font-size: 12.5px; }
.cu-prev-item { border-left: 2px solid var(--line); padding: 6px 0 4px 12px; margin: 8px 0; opacity: .85; }
.cu-prev-sig { font-size: 11px; color: var(--ink-4); margin-bottom: 4px; }
.cu-public-note { font-size: 12.5px !important; color: var(--ink-4) !important; }
.cu-blocked ul { margin: 6px 0 0 18px; }
.cu-block-why { display: block; font-size: 12.5px; color: var(--ink-4); }
.cell-unit .byline { font-size: 11px; color: var(--ink-4); margin: 6px 0 0; }
ol.sg { list-style: none; margin: 6px 0 12px; padding: 0; }
ol.sg li { position: relative; display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline;
           border: 1px solid var(--line-strong); background: var(--paper-raised); padding: 8px 12px; margin: 0 0 22px; font-size: 14px; line-height: 1.7; }
ol.sg li:last-child { margin-bottom: 0; }
ol.sg-chain li:not(:last-child)::after { content: "↓"; position: absolute; left: 50%; bottom: -21px; color: var(--ink-5); font-size: 14px; }
.sg-i { font-size: 11px; color: var(--ink-4); font-weight: 700; min-width: 14px; }
.sg-t { flex: 1 1 60%; }
.sg-note { flex-basis: 100%; font-size: 12.5px; color: var(--ink-4); }
.result-banner { background: var(--zhu-tint); border: 1px solid var(--zhu-line); padding: 10px 14px; font-size: 13.5px; color: var(--ink-2); margin: 8px 0 18px; }
.result-banner a { color: var(--link); text-decoration: underline; }
/* 枚举型元素（冲突/象征等对象数组·narrative 那种）：一条＝小标题 + 正文。 */
.ps-point { margin: 0 0 8px; }
.ps-point-head { font-size: 12.5px; font-weight: 600; color: var(--ink); margin: 0 0 2px; }
.ps-point-body { font-size: 13.5px; line-height: 1.75; color: var(--ink-2); }
/* 象征等多条枚举 value 之间加分隔线（2026-09-22·Jim 拍）。 */
.ps-point + .ps-point { border-top: 1px solid var(--line); padding-top: 8px; }
/* 成果 tab「这次结晶为主·盖过+标出这次」（2026-09-22·findings 层·目标态）：这次＝朱红边框卡打头，
   此前＝灰垫底直接摊开无标记，改过的条挂 ▸此前 回溯。参照 Cursor：最新结晶主视图 + 这次像 diff 标出。 */
.rt-prev { margin-top: 8px; border-top: 1px dashed var(--line); padding-top: 6px; }
.rt-prev summary { font-size: var(--fs-small); color: var(--ink-4); cursor: pointer; list-style: none; }
.rt-prev summary::-webkit-details-marker { display: none; }
.rt-prev summary::before { content: '\25b8\00a0'; color: var(--ink-5); }
.rt-prev[open] summary::before { content: '\25be\00a0'; }
.rt-prev-body { font-size: var(--fs-body); line-height: 1.75; color: var(--ink-4); padding: 6px 0 0; }
/* 解读作者·材料区（2026-09-23 片5）：档案三维＋他写的书/关于他的书。复用 ps-mod 排版；每条事实一行＋显源小字；
   空维度用已有诚实占位条配色（var(--note)/var(--note-line)），不跟有内容的模块同排版。 */
.pa-facts { margin: 2px 0 0; padding-left: 18px; font-size: var(--fs-body); line-height: 1.75; color: var(--ink-2); }
.pa-facts li { margin: 0 0 4px; }
.pa-src { font-size: var(--fs-small); color: var(--ink-4); margin-left: 4px; white-space: nowrap; }
.pa-src a { color: var(--ink-4); }
.pa-empty { background: var(--note); border: 1px solid var(--note-line); border-radius: 8px; padding: 6px 10px;
            font-size: var(--fs-body); color: var(--ink-3); margin: 2px 0 0; }
/* 解读作者·当前判断（片6）：合成判断复用深色卡（跟枚举材料拉开视觉差），排档案最后（依赖决定位置）。 */
.pa-thesis { margin-top: 18px; }
.pa-thesis p { margin: 6px 0 0; }
.pa-th-sub { font-size: var(--fs-small); letter-spacing: 0.08em; color: var(--gold); margin: 12px 0 2px; }
.pa-th-list { margin: 0; padding-left: 16px; font-size: var(--fs-body); line-height: 1.7; color: var(--line); }
.pa-th-list li { margin: 0 0 3px; }
.pa-th-book { color: var(--gold); white-space: nowrap; }
.pa-th-meta { font-size: var(--fs-small); color: var(--ink-4); margin: 10px 0 0; }
/* 工作台（读透 task 右栏·N3·2026-08-26）：状态组（当前在读/在追的问题）→ 任务库（能钻的·实线）→
   你的成果（钻出来的·虚线）。任务库地图＝透镜单卡 + 对象节点可展开模块卡。 */
.re-group-state { margin-bottom: 22px; }
.re-crumb { font-size: 12.5px; color: var(--ink-4); margin: 0 0 6px; letter-spacing: 0.02em; }
.re-now-line { font-size: 12.5px; color: var(--ink-2); line-height: 1.7; margin: 0; }
.re-now-line b { color: var(--ink); font-weight: 600; }
.re-lib { border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); padding: 16px 0; margin-bottom: 22px; }
.re-lib-hint { font-size: 12.5px; color: var(--ink-4); line-height: 1.6; margin: 0 0 12px; }
/* 读透分界（T5·⑦）：确认读透前的普通聊天在上·读透在下。 */
.rt-divider { display: flex; align-items: center; gap: 12px; margin: 26px 0 20px; }
.rt-divider::before, .rt-divider::after { content: ""; flex: 1; height: 1px; background: var(--line-strong); }
.rt-divider-label { font-size: var(--fs-small); letter-spacing: 0.12em; color: var(--ink-4); white-space: nowrap; }
/* 透镜＝单卡（实线·能钻）：completed 可钻 / pending 待书童去读 / S6 待现搜（低调）。 */
.rt-lens-grid { display: flex; flex-wrap: wrap; gap: 7px; margin-bottom: 14px; }
.rt-lens { display: inline-flex; align-items: center; gap: 5px; font-size: var(--fs-body); padding: 5px 11px;
           border: 1px solid var(--line-strong); border-radius: 999px; color: var(--ink); background: var(--paper-raised);
           font-family: inherit; }
button.rt-lens-on { cursor: pointer; }
button.rt-lens-on:hover { border-color: var(--link); color: var(--link); }
.rt-lens-pending { border-style: dashed; color: var(--ink-4); background: none; }
.rt-lens-hint { font-size: var(--fs-small); color: var(--ink-4); }
.rt-lens-src { font-size: var(--fs-small); color: var(--gold-ink); background: var(--paper-sunken); border-radius: 8px; padding: 1px 5px; margin-left: 4px; }
.rt-lens.rt-scope-on { border-color: var(--zhu); background: var(--zhu-tint); color: var(--zhu); }
/* 对象节点＝可展开模块卡（实线·能钻）：header 显 label(count)，展开列成员（label + note 预览）。 */
.rt-ask-reading { font-size: var(--fs-body-l); margin: 6px 0; }
.rt-ask-q { font-size: var(--fs-body-l); color: var(--ink); margin: 8px 0 0; }
/* 收尾（Slice3·落点② 边界）：闭合前沿走完 → 待背书快照。 */
.rt-wrap { border-top: 1px solid var(--line); padding-top: 14px; margin-top: 4px; }
.rt-wrap-line { font-size: var(--fs-body); color: var(--ink-2); line-height: 1.7; margin: 0 0 10px; }
.rt-wrap-line b { color: var(--ink); }
.rt-complete { display: flex; justify-content: center; width: 100%; }
.rt-wrap-done .rt-wrap-line { color: var(--ink-3); }
/* 追问的问题：一行一个，点条目 body=跳回对话流；↗=去问题页。 */
.re-item { display: flex; align-items: baseline; gap: 6px; padding: 7px 0; line-height: 1.6;
           border-top: 1px solid var(--line); }
.re-item:first-of-type { border-top: none; }
.re-q { cursor: pointer; }
.re-q:hover .re-q-text { color: var(--link); }
.re-q-text { flex: 1; font-size: 13.5px; color: var(--ink); }
.re-open { flex-shrink: 0; font-size: 13.5px; color: var(--link); text-decoration: none; padding: 0 2px; }
.re-open:hover { color: var(--ink); }
/* ○/✓ 标记（Jim 定 2026-08-11：每题级）。✓=canonical 正式问题（朱红）· ○=candidate 候选（灰）
   ——不是打分/进度条，只是「这个问题在站里转正了没」这一个二态。 */
.pv-mark { font-weight: 600; margin-right: 2px; flex-shrink: 0; }
.pv-mark-on { color: var(--ink-4); }                              /* ✓：canonical 正式问题 */
.pv-mark-off { color: var(--ink-4); }                             /* ○：candidate 候选，还没转正 */
/* 碰过的场景：描边 chips（跟广场的方角标签同一种），点=跳回；场景页后置、暂不 ↗。 */
.re-chips { display: flex; flex-wrap: wrap; gap: 6px; }
.re-chip { border: 1px solid var(--line-strong); border-radius: 999px; padding: 3px 11px; font-size: 12.5px;
           color: var(--ink-3); cursor: pointer; }
.re-chip:hover { border-color: var(--link); color: var(--link); }
/* 查证来源：链接=打开查证（离开·新标签）+ 小号轮次标。 */
.re-src { display: flex; align-items: baseline; justify-content: space-between; gap: 8px;
          padding: 6px 0; font-size: 13.5px; color: var(--link); text-decoration: none;
          border-top: 1px solid var(--line); }
.re-src:first-of-type { border-top: none; }
.re-src:hover { color: var(--ink); }
.re-src-turn { font-size: 11px; color: var(--ink-4); flex-shrink: 0; }
/* 下一步读什么（③ A）：软提案按钮 + 确定性 Reading Path。理由＝真实关系 note，不是打分/相似度。 */
.re-path-propose { font-size: 13.5px; color: var(--ink-2); line-height: 1.7; margin: 0 0 10px; }
.re-path-item { padding: 10px 0; border-top: 1px solid var(--line); }
.re-path-item:first-of-type { border-top: none; }
.re-path-title { font-family: "Noto Serif SC", serif; font-size: 14px; color: var(--ink); }
.re-path-title:hover { color: var(--link); }
.re-path-via { font-size: 11px; color: var(--ink-4); margin: 4px 0 5px; }
.re-path-reason { font-size: 12.5px; line-height: 1.7; color: var(--ink-3); margin: 0; }
/* 跳回落点闪一下提示 */
.turn-flash .chat-bubble { animation: turn-flash-kf 1.2s ease; }
@keyframes turn-flash-kf { 0%, 40% { box-shadow: 0 0 0 3px var(--note-line); } 100% { box-shadow: 0 0 0 3px rgba(232,214,138,0); } }
/* 冷实体实时抓取卡（A8/v4）：书童当场从公开资料抓回的东西。刻意跟站内内容拉开——浅框 + 「据
   公开资料」标注，一眼是"外部草稿、未结晶"，不冒充站内结论。 */
.cf-box { margin: 10px 0 2px; border: 1px solid var(--line-strong); border-radius: 8px; padding: 12px 14px; background: var(--paper); }
.cf-box.cf-ask { background: var(--note-bg, var(--note)); border-color: var(--note-line); }
.cf-kind { font-size: 11px; letter-spacing: 0.06em; color: var(--ink-4); margin-bottom: 6px; }
.cf-name { font-family: "Noto Serif SC", serif; font-size: 16px; color: var(--ink); }
.cf-desc { font-size: 12.5px; color: var(--ink-4); margin-left: 8px; }
.cf-summary { font-size: 13.5px; line-height: 1.7; color: var(--ink-2); margin: 8px 0; }
.cf-thin { font-size: 12.5px; color: var(--ink-4); font-style: italic; margin: 6px 0; }
.cf-src { font-size: 12.5px; color: var(--ink-4); margin: 6px 0; }
.cf-src a { color: var(--link); }
.cf-cands { display: flex; flex-direction: column; gap: 6px; }
.cf-cand { text-align: left; background: var(--paper-raised); border: 1px solid var(--line-strong); border-radius: 8px;
           padding: 8px 12px; cursor: pointer; font-family: inherit; font-size: 14px; color: var(--ink); }
.cf-cand:hover { border-color: var(--link); color: var(--link); }
.cf-opts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 8px; }
.cf-opt { font-family: inherit; font-size: 13.5px; padding: 6px 12px; border-radius: 999px;
          border: 1px solid var(--link); background: var(--paper); color: var(--link); cursor: pointer; }
.cf-opt:hover { background: var(--link-wash); }
.cf-done { font-size: 13.5px; color: var(--ink-3); }
/* S1 Resolver 一键读透入口（work-first·§七）：best-guess 那句由 reply 渲，这里是进读透的动作。 */
/* resolver 认书入口（2026-09-02·像 Claude 直接开任务）：「我把它认成《X》…」这句本身就可点·点了进读透。 */
.rz-box { margin: 8px 0 2px; }
.rz-open { display: block; width: 100%; text-align: left; font-family: inherit; font-size: 14px;
           line-height: 1.6; padding: 9px 13px; border: 1px solid var(--line-strong); border-radius: 8px;
           background: var(--paper); color: var(--ink); cursor: pointer; margin-bottom: 6px; }
.rz-open:hover { border-color: var(--link); background: var(--link-wash); }
.rz-hint { display: block; font-size: 12.5px; color: var(--ink-4); }
/* 书单skill 先查站里：找到的书单一份一行，点开在右栏看 */
         font-size: 14px; line-height: 1.6; padding: 9px 13px; border: 1px solid var(--line-strong); border-radius: 8px;
         background: var(--paper); color: var(--ink); cursor: pointer; margin-bottom: 6px; }
/* 技能调用要看得见：书童消息开头那一行「我认为你要做一份书单 → 调用 建书单」 */
.skill-call { margin: 0 0 6px; font-size: 13.5px; color: var(--zhu-deep); }
.skill-call-turn .chat-st-body { padding-top: 0; }
/* 「待你确认」——她自证关于自己的 fact（§十-3）。诚实占位提示条同色系，表示"待处理"。 */
.conn-banner { max-width: 760px; margin: 12px auto 0; padding: 8px 14px; border: 1px solid var(--zhu-line); background: var(--zhu-wash);
               color: var(--zhu-deep); border-radius: 8px; font-size: 13.5px; }
.conn-banner a { margin-left: 8px; color: var(--link); font-weight: 700; }
.ay-tag { margin-left: 6px; background: var(--paper-sunken); border: 1px solid var(--note-line); color: var(--gold-ink); border-radius: 8px;
          font: inherit; font-size: var(--fs-small); padding: 0 7px; cursor: pointer; vertical-align: middle; }
.ay-tag:hover { border-color: var(--gold); }
.ay-sent { background: linear-gradient(transparent 65%, var(--note) 65%); }
.ay-pop { margin: 6px 0; padding: 8px 10px; border: 1px solid var(--line); border-radius: 8px; background: var(--paper); font-size: var(--fs-body); }
.ay-fact { border-top: 1px dashed var(--line); padding: 4px 0; }
.mem-switch { display: flex; align-items: center; gap: 8px; font-size: 14px; margin: 6px 0 10px; cursor: pointer; }
.mem-row { border: 1px solid var(--line); padding: 14px 18px; margin: 0 0 10px; }
.mem-text { font-size: 14px; color: var(--ink); line-height: 1.6; }
.mem-acts { display: flex; gap: 6px; margin-top: 4px; }
.rec-day { margin-top: 22px; }
.rec-item { border-top: 1px solid var(--line); padding: 16px 0; display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 8px 32px; }
.rec-left .meta { display: block; margin-top: 4px; }
.rec-why { font-size: 15.5px; }
.rec-kind { display: inline-block; font-size: 12.5px; color: var(--gold-ink); border: 1px solid var(--rail-active); border-radius: 4px; padding: 0 5px; margin-right: 6px; }
.rec-book { margin-top: 4px; font-weight: 600; }
.rec-book .meta { font-weight: normal; }
.rec-says { margin-top: 4px; color: var(--ink-2); }
.rec-acts { display: flex; gap: 8px; margin-top: 6px; align-items: center; }
.pending-item { background: var(--note); border: 1px solid var(--note-line); border-radius: 8px;
                padding: 12px 14px; margin: 8px 0; }
.pending-fact { color: var(--ink); font-size: 15.5px; margin-bottom: 10px; }
.pending-actions { display: flex; gap: 8px; }
/* 工作台三层（§9.4）：Task Context（head）+ 对话列 + 右侧交付面。⚑ 交付面只对**被升级的
   Task** 出现（JS 加 .has-delivery）——随口 chat 不出。交付面独立滚动（sticky）。
   交付面四地基元素目前全是**诚实空态**（Planning→原子Task→Artifact 执行引擎未落地，M3 尾）：
   理解回显有内容（goal），主线/路径是 .pending 空态（空态不长深色卡片——byline 空时不显示同理），
   诚实边界用蜜色条。⚑ 无完成度% / 无 N本M个计分板（DESIGN 五层第 1 层）。 */
/* 工作台页的 <main> 用 .wide 撑满主列（默认 main 是 760 居中，会把交付面挤成细条）。
   ⚑ 必须 margin:0——继承 main 的 margin:0 auto 在 flex 列里会把它收缩回内容宽（760），
   于是整条对话浮在中间、显窄。margin:0 让它 stretch 到整个主列。 */
main.wide { max-width: none; margin: 0; padding-left: 0; padding-right: 0; }
#task-view { position: relative; }
/* 真两栏工作台（2026-09-22 片0·从 position:fixed 浮层改回真·并排列）：workbench-body 是 flex 行——
   中栏对话 .wb-conversation 与右栏 .wb-delivery **各自独立滚**，中间一条可拖 .wb-divider 隔开。
   两条滚动条被分隔线物理隔开、不再挤在屏幕右端（旧浮层病根：main 全宽滚 + rail 固定右端，两条滚动条重叠）。
   关掉右栏时对话列 flex:1 自然回居中；宽度走 --delivery-w（可拖 320–640·记 localStorage）。 */
.workbench-body { display: flex; height: 100%; min-height: 0; }
.wb-conversation { flex: 1 1 auto; min-width: 0; overflow-y: auto; }
.wb-conv-inner { max-width: 760px; margin: 0 auto; padding: 24px 24px 168px; }
.wb-divider { display: none; flex: 0 0 6px; cursor: col-resize; background: transparent; }
.wb-divider:hover, .wb-divider.dragging { background: var(--line-strong); }
.wb-delivery { display: none; }
.wb-delivery { --fs-tag: 12px; --fs-small: 13px; --fs-body: 14.5px; --fs-body-l: 14.5px; --fs-h: 14.5px; --fs-title: 20px; font-size: var(--fs-body); }
.has-delivery.delivery-open .wb-divider { display: block; }
.has-delivery.delivery-open .wb-delivery { display: block; flex: 0 0 var(--delivery-w); width: var(--delivery-w);
                             overflow-y: auto; background: var(--paper-sunken); border-left: 1px solid var(--line); padding: 18px 20px; }
.wb-delivery h3 { margin-top: 16px; }
/* 输入条固定在对话列底部，右到右栏左沿（跟着可拖的 --delivery-w 走）。 */
.composer-dock.has-delivery { right: var(--delivery-w); }
/* 右栏头（相关内容 + 收起）——⚑ 开关在**右栏里**，不在中间对话区。 */
.pv-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-bottom: 12px; }
.pv-head h2 { margin: 0; font-size: var(--fs-h); padding-top: 0; border-top: none; flex: 1; }
.pv-collapse { background: none; border: none; color: var(--ink-4); font-size: var(--fs-h); cursor: pointer; padding: 2px 4px; line-height: 1; }
/* 收成你的成果按钮（N9·右上角菜单）+ 成果 hosted 私有页（/artifact.html）。 */
/* 右上角 icon 栏（2026-09-11·Jim·CC 式可扩展）：成果 / ＋上传 / 收起。紧凑·不抢标题。 */
.pv-actions { display: flex; align-items: center; gap: 5px; flex-shrink: 0; }
/* 候选池工作现场（找书片2·2026-09-23）：复用现有配色/组件语言（1px 分隔·朱红强调·蜜色诚实条），
   不另起皮肤。候选卡＝理由 + 显源，不用星级/百分比这类打分视觉。 */
.fb-body { padding: 4px 16px 24px; }
.fb-intro { margin: 8px 0 4px; }
.fb-intro h3 { margin: 0 0 2px; font-family: "Noto Serif SC", serif; font-size: var(--fs-h); }
.fb-cand { border-top: 1px solid var(--line); padding: 12px 0; }
.fb-cand:first-of-type { border-top: none; }
.fb-cand-title { font-family: "Noto Serif SC", serif; font-size: var(--fs-body-l); color: var(--ink); }
.fb-cand-reason { margin: 5px 0 6px; font-size: var(--fs-body); line-height: 1.6; color: var(--ink); }
.fb-cand-src { font-size: var(--fs-tag); }
.fb-cand-quote { margin: 0 0 6px; padding-left: 8px; border-left: 2px solid var(--line); font-size: var(--fs-small); line-height: 1.6; color: var(--ink-3); }
.fb-cand-src a { color: var(--link); text-decoration: none; }
.fb-cand-acts { display: flex; gap: 6px; margin-top: 6px; }
.fb-ask { margin-top: 14px; }
.fb-empty { background: var(--note); border: 1px solid var(--note-line); border-radius: 8px; padding: 12px 14px;
   font-size: var(--fs-body); line-height: 1.6; color: var(--ink-3); margin-top: 8px; }
.fb-struck { margin-top: 18px; border-top: 1px dashed var(--line-strong); padding-top: 10px; }
.fb-struck h4 { margin: 0 0 6px; font-size: var(--fs-small); color: var(--ink-4); font-weight: 500; }
.fb-struck-row { font-size: var(--fs-small); color: var(--ink-4); text-decoration: line-through; padding: 2px 0; }
.fb-unread-row { font-size: var(--fs-small); color: var(--ink-3); padding: 2px 0; }
/* 找书片戊：书童的理解（方向可改）——描边标签横排，跟广场的方角标签同一语言，不另起皮肤。 */
.fb-understand { border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; margin: 10px 0 6px; background: var(--paper-raised); }
.fb-understand-h { font-size: var(--fs-tag); color: var(--ink-4); margin-bottom: 2px; }
.fb-understand p { margin: 2px 0 6px; font-size: var(--fs-body); }
.fb-dirs { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.fb-dir { display: inline-flex; align-items: center; gap: 2px; border: 1px solid var(--line-strong); border-radius: 999px;
   padding: 1px 4px 1px 9px; font-size: var(--fs-small); color: var(--ink-3); }
.fb-dir button { background: none; border: none; cursor: pointer; color: var(--ink-4); font-size: var(--fs-body); padding: 0 3px; }
.fb-dir button:hover { color: var(--link); }
.fb-dir-add input { width: 76px; border: 1px dashed var(--line-strong); border-radius: 999px; padding: 1px 8px; font: inherit;
   font-size: var(--fs-small); background: transparent; }
.fb-dir-add button { background: none; border: none; cursor: pointer; color: var(--ink-4); }
.fb-off { opacity: .55; }
/* 建书单片8：书单草稿（右栏）——块间留白、差异一行一条、没认出的原文用等宽灰底。 */
.bl-sec { margin-top: 16px; }
.bl-line { margin: 4px 0; font-size: var(--fs-small); }
.bl-file-sec { margin-top: 16px; }
.bl-file-lead, .bl-file-quote { margin: 6px 0; padding-left: 8px; border-left: 2px solid var(--line); font-size: var(--fs-small); line-height: 1.7; }
.bl-file-wait { margin-top: 14px; }
.bl-more-sec summary { cursor: pointer; }
.bl-work-in-file { margin-top: 22px; border-top: 1px solid var(--line); padding-top: 10px; }
.gt-site summary { cursor: pointer; font-size: var(--fs-body); color: var(--ink-3); line-height: 1.6; padding: 2px 0; }
.gt-site summary:hover { color: var(--link); }
.gt-search { font-size: var(--fs-body); line-height: 1.6; padding: 4px 0; border-top: 1px dashed var(--line); }
.bl-note { margin: 4px 0; font-size: 13.5px; line-height: 1.6; }
.bl-diff { margin: 4px 0; font-size: 12.5px; color: var(--zhu-deep); }
.bl-raw { font-family: inherit; font-size: 13.5px; color: var(--ink-3); }
.bl-why { margin: 4px 0 0; }
.bl-shelf-row { display: block; font-size: 12.5px; padding: 2px 0; cursor: pointer; }
.bl-shelf-row .meta { margin-left: 6px; }
.bl-pub { margin-top: 12px; border: 1px solid var(--line); border-radius: 8px; padding: 10px 12px; background: var(--paper-raised); }
.bl-pub-title { width: 100%; border: 1px solid var(--line); border-radius: 8px; padding: 4px 8px; font: inherit; margin: 4px 0 8px; }
.bl-priv { display: block; font-size: 12.5px; line-height: 1.6; padding: 3px 0; cursor: pointer; }
.bl-priv .gt-kind { margin-right: 6px; }
.bl-crop { width: 120px; height: 90px; border: 1px solid var(--line); border-radius: 4px; background-repeat: no-repeat; margin: 4px 0; }
.photo-ask { padding-left: 40px; margin-top: 8px; font-size: 13.5px; color: var(--ink-2); }
.photo-ask p { margin: 0 0 6px; }
.bl-principle { margin: 4px 0; font-size: 13.5px; line-height: 1.7; }
.bl-principle .gt-kind { margin-right: 6px; }
.bl-critic { margin-top: 14px; }
.bl-choose, .bl-tools { display: flex; flex-wrap: wrap; gap: 6px; margin: 2px 0 6px; }
.bl-cand-row { font-size: 12.5px; padding: 2px 0; }
.bl-retry { display: flex; gap: 6px; margin-top: 6px; }
.bl-retry-in { flex: 1; min-width: 0; border: 1px solid var(--line); border-radius: 8px; padding: 3px 8px; font: inherit; font-size: 12.5px; }
.bl-foot { margin-top: 20px; border-top: 1px dashed var(--line-strong); padding-top: 10px; }
.bl-foot .fb-ask[disabled] { opacity: .5; cursor: not-allowed; }
.fb-off-note { font-size: var(--fs-tag); margin-bottom: 2px; }
/* 通用任务交付物（片6）：三分法小标签——描边、不打分；空白用蜜色（跟诚实占位同一语言）。 */
.gt-label { color: var(--ink-4); }
.gt-kind { display: inline-block; margin-left: 8px; font-family: "Noto Sans SC", sans-serif; font-size: var(--fs-small);
   border: 1px solid var(--line-strong); border-radius: 8px; padding: 0 7px; color: var(--ink-3); vertical-align: 2px; }
.gt-k-fact { border-color: var(--gold); color: var(--gold-ink); }
.gt-k-judg { border-color: var(--line-strong); color: var(--ink-3); }
.gt-k-gap { background: var(--note); border-color: var(--note-line); color: var(--gold-ink); }
.gt-k-fresh { border-color: var(--ink-4); color: var(--ink-2); }   /* 这次新写的（盖过旧版·同成果栏「这次朱红打头」） */
/* 通用任务片丙：右栏（工作台＝书童的理解 + 相关的人、书、问题 / 成果）——小标题 + 1px 分隔，不另起卡片皮肤。 */
.gt-sec { border-top: 1px solid var(--line); margin-top: 14px; padding-top: 10px; }
.gt-sec-h { font-family: "Noto Serif SC", serif; font-size: var(--fs-body-l); color: var(--ink); margin-bottom: 6px; }
.gt-und { margin: 0 0 8px; font-size: var(--fs-body); line-height: 1.6; }
.gt-grp { margin: 6px 0 10px; }
.gt-grp-h { font-size: var(--fs-small); color: var(--ink-4); margin-bottom: 2px; }
.gt-obj { padding: 8px 0; border-top: 1px dashed var(--line); }
.gt-obj:first-of-type { border-top: none; }
.gt-obj-t { font-size: var(--fs-body); color: var(--ink); }
.gt-obj-why { font-size: var(--fs-body); color: var(--ink); margin: 3px 0; line-height: 1.55; }
.gt-obj-q { font-size: var(--fs-small); line-height: 1.5; }
.gt-obj-via { font-size: var(--fs-small); }
.gt-obj-dug { font-size: var(--fs-small); margin-top: 2px; }
.gt-ap { margin: 0 0 8px; color: var(--ink-3); }
.gt-trail { margin-top: 6px; font-size: var(--fs-small); color: var(--ink-4); }
.gt-trail summary { cursor: pointer; }
.gt-trail div { margin: 2px 0 0 4px; }
.gt-obj-t a { color: inherit; text-decoration: none; border-bottom: 1px solid var(--line-strong); }
.gt-ext { margin: 6px 0; font-size: var(--fs-body); }
.gt-ext summary { cursor: pointer; color: var(--ink-3); }
.gt-gaps { margin-top: 8px; }
/* 放大（一键拉到最宽 640·2026-09-22 片0）：enlargeRail 直设 --delivery-w，还原回记住的拖拽宽度。 */
.pv-enlarge { background: none; border: none; cursor: pointer; color: var(--ink-4); font-size: 18px; padding: 6px 8px; line-height: 1; border-radius: 8px; }
.pv-enlarge:hover { color: var(--link); background: var(--rail); }
.pv-icon { display: inline-flex; align-items: center; gap: 3px; border: 1px solid var(--line); background: var(--paper);
           color: var(--ink-3); border-radius: 8px; font-size: var(--fs-small); font-family: inherit; padding: 3px 7px; cursor: pointer; line-height: 1.4; }
.pv-icon:hover { border-color: var(--gold); color: var(--gold-ink); }
.pv-icon-glyph { font-size: var(--fs-small); opacity: .8; }
.borrow-progress { font-size: 13.5px; color: var(--gold-ink); background: var(--paper-sunken); border-radius: 8px; padding: 6px 10px; }
.artifact-body { max-width: 720px; margin: 0 auto; padding: 8px 0 60px; }
.artifact-head h1 { font-family: "Noto Serif SC", serif; font-size: 36px; font-weight: 600; color: var(--ink); margin: 0 0 8px; line-height: 1.4; }
.artifact-meta { font-size: 12.5px; color: var(--ink-4); margin: 0 0 28px; }
.artifact-zero { color: var(--ink-4); }
.artifact-sec { margin: 0 0 30px; }
.artifact-sec h2 { font-family: "Noto Serif SC", serif; font-size: 17px; color: var(--ink); margin: 0 0 10px; }
.artifact-sec p { font-size: 15.5px; color: var(--ink); line-height: 1.85; margin: 0 0 8px; }
.artifact-link { font-size: 12.5px; color: var(--link); text-decoration: none; }
.artifact-link:hover { text-decoration: underline; }
/* 片6·6c：右栏创作成果卡 + Canvas 浮起（读+起打磨·主体仍在对话·延续编辑感视觉语言） */
.rt-art { display: flex; align-items: baseline; gap: 8px; cursor: pointer; padding: 8px 0; border-bottom: 1px solid var(--line); }
.rt-art:hover .rt-art-open { color: var(--link); }
.rt-art-kind { flex-shrink: 0; font-size: var(--fs-small); color: var(--gold-ink); border: 1px solid var(--gold); border-radius: 4px; padding: 1px 6px; }
.rt-art-title { flex: 1; min-width: 0; font-family: "Noto Serif SC", serif; font-size: var(--fs-body); color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rt-art-ver { flex-shrink: 0; font-size: var(--fs-small); color: var(--ink-4); }
.rt-art-open { flex-shrink: 0; font-size: var(--fs-small); color: var(--ink-5); }
/* 片6·6d Canvas 已退役（slice3·2026-09-17）——成果改在右栏「成果」子页里就地渲，下面这些是成果详情
   的内容样式（沿用·只是不再浮在遮罩里）。 */
.canvas-kind { font-size: var(--fs-body); color: var(--gold-ink); margin-bottom: 6px; }
.canvas-title { font-family: "Noto Serif SC", serif; font-size: var(--fs-title); color: var(--ink); margin: 0 0 8px; line-height: 1.4; }
/* 创作扩展片5（交付·综述复用同一渲染器）：署名（你+书童共写）/ 打磨史 / per-span 显源标 / 轻修正 diff。 */
.canvas-byline { font-size: var(--fs-body); color: var(--ink-3); margin: 0 0 4px; }
.canvas-byline-draft { color: var(--gold-ink); background: var(--note); border: 1px solid var(--note-line); border-radius: 8px; padding: 5px 9px; }
.canvas-history { font-size: var(--fs-small); color: var(--ink-4); margin: 0 0 18px; }
.canvas-prov { font-family: -apple-system, "PingFang SC", sans-serif; font-size: var(--fs-small); font-weight: normal; margin-left: 8px;
               padding: 1px 6px; border-radius: 4px; vertical-align: middle; }
.canvas-prov-user { color: var(--ink-4); border: 1px solid var(--line-strong); background: none; }
.canvas-prov-synth { color: var(--ink-3); border: 1px solid var(--line-strong); background: var(--paper-sunken); }
.canvas-prov-grounded { color: var(--gold-ink); border: 1px solid var(--zhu-line); background: var(--paper-sunken); }
.canvas-diff { margin: 6px 0 2px; }
.canvas-diff summary { font-size: var(--fs-small); color: var(--ink-4); cursor: pointer; }
.canvas-diff summary:hover { color: var(--link); }
.canvas-diff-prev { border-left: 2px solid var(--line); padding-left: 10px; margin-top: 6px; color: var(--ink-4); font-size: var(--fs-body); }
.canvas-sec { margin: 0 0 24px; }
.canvas-sec h3 { font-family: "Noto Serif SC", serif; font-size: var(--fs-h); color: var(--ink); margin: 0 0 8px; }
.canvas-sec p { font-size: var(--fs-body-l); color: var(--ink); line-height: 1.8; margin: 0 0 8px; }
.canvas-foot { border-top: 1px solid var(--line); padding-top: 14px; margin-top: 8px; display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }
.canvas-hint { font-size: var(--fs-small); color: var(--ink-4); }
.artifact-sources { font-size: 12.5px; color: var(--ink-4); margin: 20px 0 0; }
.artifact-sources a { color: var(--ink-4); }
.artifact-foot { display: flex; align-items: center; justify-content: space-between; gap: 12px;
                 margin-top: 36px; padding-top: 18px; border-top: 1px solid var(--line); }
.artifact-back { font-size: 13.5px; color: var(--ink-3); text-decoration: none; }
.artifact-back:hover { color: var(--link); }
.pv-collapse:hover { color: var(--link); }
/* 收起后：**对话栏右上角**一个小图标把右栏请回来（2026-09-22 片0·从旧的 fixed 飘屏幕角改成
   贴对话栏·◨＝右侧面板·替代旧「‹ 相关内容」四字）。绝对定位相对 #task-view（position:relative）。 */
.delivery-reopen { position: absolute; top: 8px; right: 12px; z-index: 21; background: var(--paper);
                   border: 1px solid var(--line-strong); border-radius: 8px; width: 30px; height: 28px; line-height: 1;
                   font-size: 15.5px; font-family: inherit; color: var(--ink-3); cursor: pointer; padding: 0; }
.delivery-reopen:hover { border-color: var(--link); color: var(--link); }
.rf-back { display: none; background: none; border: none; padding: 6px 10px 6px 0; font: inherit; font-size: 13px; color: var(--link); cursor: pointer; }
.rc-expand { display: none; }
@media (max-width: 900px){
  /* 手机浏览器（2026-10-14 片7）：右栏是从底部拉上来的整屏面板——点成果行就升起来，左上「← 回到对话」，对话停在原处不动；
     进页默认收着（deliveryDefaultOpen）。 */
  .has-delivery.delivery-open .wb-delivery { position: fixed; top: 48px; left: 0; right: 0; bottom: 0; z-index: 45;
                             width: auto; border-left: none; animation: rf-up .22s ease-out; }
  .has-delivery.delivery-open .wb-divider { display: none; }
  .composer-dock.has-delivery { right: 0; }
  .rf-back { display: inline-block; }
  /* 对话里的卡：大数字折行；条目先露 3 条、长想法先露 3 行；快捷输入一行横滑；拍板选项竖排、一项一整行 */
  .rc-card { max-width: 100%; }
  .rc-card .wr-stat { min-width: 0; overflow-wrap: anywhere; }
  .rc-card:not(.open) .rc-extra { display: none; }
  .rc-card:not(.open) .wr-it, .rc-card:not(.open) .wr-q, .rc-card:not(.open) .wr-tx { display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
  .rc-expand { display: block; margin-top: 8px; background: none; border: none; padding: 0; font: inherit; font-size: 12.5px; color: var(--link); cursor: pointer; }
  .rc-card .rc-next { flex-wrap: nowrap; overflow-x: auto; -webkit-overflow-scrolling: touch; scrollbar-width: none; }
  .rc-card .rc-next button { flex: none; white-space: nowrap; }
  .rc-choose .rc-opt { width: 100%; }
}
@keyframes rf-up { from { transform: translateY(40px); opacity: 0; } to { transform: none; opacity: 1; } }
}
/* 独立滚（2026-09-17 shell-fixed + 2026-09-22 片0 真两栏）：整页不随 body 滚——main 也不滚，
   改由 .wb-conversation / .wb-delivery **各自独立滚**（片0）。内容页不挂·仍 body 滚。 */
.app-shell.shell-fixed { height: 100vh; box-sizing: border-box; overflow: hidden; }
.app-shell.shell-fixed .main-col { height: 100%; min-height: 0; overflow: hidden; }
/* ⚑ shell-fixed 下 main 必须清零 padding（base main 是 48/24/140·border-box 会把列高吃掉→"没到底"）。
   上/下留白改到列内（wb-conv-inner / rail 自己的 padding）。 */
.app-shell.shell-fixed .main-col > main { height: 100%; overflow: hidden; padding: 0; }
.app-shell.shell-fixed main.wide > #task-view { height: 100%; }
/* Task Context 头（片1·2026-09-22 挪进顶栏·横跨工作区）：一行内联·不自带边框/边距
   （顶栏已有 44px 高 + 底边框 + sticky）·长标题省略号。 */
#task-head { display: flex; align-items: baseline; gap: 10px; min-width: 0; }
.th-title { font-family: "Noto Serif SC", serif; font-size: 17px; font-weight: 700; color: var(--ink);
            white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; flex-shrink: 1; }
.th-meta { font-size: 12.5px; color: var(--ink-4); flex-shrink: 0; }
/* 书童的理解（Task 上存的一行·读者可改）：钉在对话栏顶上（DESIGN 2026-10-06 右栏撤工作台 Q5）。没有这行就整条不占位。 */
.th-intent-bar { position: sticky; top: 0; z-index: 3; background: var(--paper); }
.th-intent-bar:not(:empty) { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; padding: 8px 24px; border-bottom: 1px solid var(--line); font-size: 13.5px; }
.th-intent-k { font-size: 11px; letter-spacing: 0.06em; color: var(--ink-4); flex-shrink: 0; }
.th-intent-t { color: var(--ink-2); min-width: 0; }
.th-intent-in { flex: 1; min-width: 200px; font: inherit; padding: 2px 6px; border: 1px solid var(--line); border-radius: 4px; background: var(--paper); color: var(--ink); }
.th-intent-btn { font-size: 12px; color: var(--ink-4); background: none; border: none; cursor: pointer; padding: 0 4px; }
.th-intent-btn:hover { color: var(--zhu); }
/* 作用域头（当前对话锚在哪个问题上，§10.2）——随对话推进更新。 */
.task-scope { flex-basis: 100%; margin-top: 6px; display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
              border-left: 2px solid var(--zhu); padding: 2px 0 2px 12px; }
.task-scope .scope-label { font-size: 11px; letter-spacing: 0.06em; color: var(--ink-4); flex-shrink: 0; }
.task-scope .scope-q { font-family: "Noto Serif SC", serif; font-size: 14px; color: var(--ink); line-height: 1.5; }
.task-scope a.scope-q:hover { color: var(--link); }
.honest-note { background: var(--note); border: 1px solid var(--note-line); border-radius: 8px;
               padding: 12px 14px; color: var(--ink-3); font-size: 14px; }
.honest-note code { background: rgba(0,0,0,0.05); padding: 1px 5px; border-radius: 4px; }
/* 底部输入条下方的四个场景卡片（2026-09-24·首页发射台，替掉旧的「试试：」示例 chip 行；
   2026-09-24 补·落码后照 Perplexity 首页截图改版：文字药丸 → 图标+标题+说明的大卡片；
   同日再补：Jim 指出 Perplexity 参考里卡片在输入框**那个白底描边卡片之外**、下方——不是
   卡片里的一部分。挪到 `.context-input-wrap` 外面当兄弟节点，不再继承输入框内部的缩进）——
   点了纯预填不自动提交，跟"/"菜单/收藏聊聊入口同一个"先填好、用户自己点提交"的原则，不替
   用户做发送这个决定。2 列网格，手机宽度自然收窄成单列堆叠，不做横滑。 */
.scene-cards { max-width: 760px; margin: 10px auto 0; display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; }
@media (max-width: 700px) { .scene-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
.scene-cards button { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; text-align: left;
                       background: transparent; border: 1px solid var(--line); border-radius: 8px;
                       padding: 10px 12px; font-family: inherit; cursor: pointer; }
.scene-cards button:hover { border-color: var(--link); }
.scene-cards button:hover .scene-card-title { color: var(--link); }
.scene-card-title { font-size: 13.5px; font-weight: 500; color: var(--ink); }
.scene-card-desc { font-size: 12.5px; color: var(--ink-4); line-height: 1.5; }

/* 技能页（DESIGN 2026-09-26 Q74）：文案逐字来自 skills/<id>/SKILL.md；顶上一排走 topnav-cats。 */
.skill-page { max-width: 720px; }
.skill-page h2 { font-size: 17px; margin-top: 28px; }
.skill-page p, .skill-page li { color: var(--ink-2); line-height: 1.8; }
.skill-page ul, .skill-page ol { padding-left: 22px; }
.skill-use { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin: 4px 0 20px; }
.skill-starter { font-size: 14px; color: var(--ink-3); background: var(--paper); border: 1px solid var(--line); border-radius: 8px; padding: 6px 12px; }
.works-links { margin: -6px 0 10px; font-size: 12.5px; }

/* 首页 hero */
.hero-title { font-family: "Noto Serif SC", serif; font-size: 40px; font-weight: 600; line-height: 1.35;
              margin: 0 0 20px; letter-spacing: 0.01em; }
/* 首页发射台（2026-09-23·参考 Perplexity）：登录/未登录同一个壳——问候语 + 居中输入框是主角，
   落在视口上部约 1/3（不是死正中）。提交＝startSession 起新会话跳 task.html，首页本身不承载对话流。
   标题跟框左对齐；框下的未登录内容（副文案/CTA/书童看到的）放宽到 960 两栏以上的宽度。不铺满全宽——
   「用好空间」≠拉到边，守编辑感。 */
.home-launcher { max-width: 820px; margin: 0 auto; padding: 14vh 24px 0; }
.home-launcher .hero-title { margin: 0 0 10px; }
.home-launcher .hero-sub { margin: 0 0 22px; font-size: 15px; line-height: 1.7; color: var(--ink-3); }
.home-launcher .context-input-wrap { max-width: none; padding: 22px 20px; }
.home-launcher .context-input-form textarea { font-size: 17px; padding: 14px 8px; }
/* 框在页面上部、下面还有内容——「/」菜单改往下弹（底部 dock 才往上弹）。 */
.home-launcher .slash-menu { bottom: auto; top: 100%; margin: 4px 0 0; box-shadow: 0 4px 12px rgba(0,0,0,0.08); }
.home-launcher .scene-cards { max-width: none; margin-top: 14px; }
.home-launcher 
/* 跟你的关联（PRD-04）：呈现关联，不下判断，所以刻意不用强调色/星级这类"打分"视觉 */
.connection-module { border: 1px solid var(--line-strong); padding: 18px 20px; margin: 12px 0 20px; }
.connection-text { font-size: 14px; line-height: 1.9; color: var(--ink-2); margin: 0 0 12px; }
.module-badge { font-size: 11px; color: var(--ink-4); font-weight: 400; letter-spacing: 0.02em; margin-left: 8px; }
/* 落点③ 回流复利（私有段 hydrate）：回访态 + 反向回指桥。 */
.rt-revisit { background: var(--paper-sunken); border-left: 2px solid var(--gold); padding: 10px 14px; margin: 0 0 14px; border-radius: 4px; }
.rt-revisit-line { font-size: var(--fs-body); color: var(--ink-2); line-height: 1.7; margin: 0 0 4px; }
.rt-revisit-link { font-size: var(--fs-body); color: var(--link); text-decoration: none; }
.rt-revisit-link:hover { text-decoration: underline; }
.rt-backlinks { margin-top: 16px; padding-top: 12px; border-top: 1px solid var(--line); }
.rt-backlinks-h { font-size: var(--fs-small); letter-spacing: 0.08em; color: var(--ink-4); font-weight: 700; margin: 0 0 8px; }
/* 读透 N2：开场领入 opener-as-move（chat）。定位/它真正写的是什么/一个可停的点（显源）/快捷 chip。 */
.rt-open-oneliner { font-family: "Noto Serif SC", serif; font-size: var(--fs-h); color: var(--ink); line-height: 1.75; margin: 0 0 10px; }
.rt-open-essay { font-size: var(--fs-body); color: var(--ink-2); line-height: 1.8; margin: 4px 0 10px; }
/* V4·冷书书童运行时判的主导机制·显源小字（灰·据公开材料未经核·暖书不显）。 */
/* 第一条「讲全」（DESIGN 2026-09-30 片4） */
.tell-pos { margin: 0 0 10px; }
.tell-notice { margin: 0 0 12px; padding: 8px 12px; font-size: 14px; color: var(--ink-3); background: var(--paper); border-left: 3px solid var(--line); border-radius: 4px; }
/* 对话里只有两档字：正文 15.5 黑、小字 12.5 灰；模块名是灰色小字（不可点），能点的是靛蓝。 */
.tell-mod, .tell-label { display: block; margin: 16px 0 4px; font-size: 12.5px; color: var(--ink-4); letter-spacing: 0.04em; font-weight: 600; }
.tell-src { margin: 0 6px 0 4px; font-size: 12.5px; color: var(--ink-5); }
.tell-threads { margin: 0 0 10px; padding-left: 20px; }
.tell-threads li { margin: 0 0 8px; line-height: 1.8; }
.tell-raw { display: block; font-size: 12.5px; color: var(--ink-5); }
.tell-block { margin: 0 0 10px; line-height: 1.8; }
.tell-progress { margin: 6px 0; font-size: 12.5px; color: var(--ink-4); }
.tell-next-lead { margin: 14px 0 6px; color: var(--ink-3); }
.tell-nexts { display: flex; flex-direction: column; gap: 8px; }
.tell-next { text-align: left; background: none; border: 0; padding: 0; cursor: pointer; font: inherit; color: var(--ink); }
.tell-next-label { display: block; color: var(--link); }
.tell-next:hover .tell-next-label { text-decoration: underline; }
.tell-next-why { display: block; font-size: var(--fs-small); color: var(--ink-4); margin-top: 1px; }
.tell-ask { margin: 10px 0 0; color: var(--ink-3); }
.tell-sig { margin: 6px 0 0; font-size: 12.5px; color: var(--ink-5); }
/* 右栏成果标签（DESIGN 2026-10-06）：像浏览器标签，一份文件一个；当前那份跟页面底色连成一片；放不下的收进最右「›› N」。 */
.rf-head { align-items: flex-end; margin-bottom: 0; position: relative; }
.rf-bar { flex: 1; min-width: 0; display: flex; align-items: flex-end; gap: 2px; border-bottom: 1px solid var(--line); }
.rf-tab { position: relative; flex: 1 1 0; min-width: 32px; max-width: 150px; display: flex; align-items: center; gap: 2px; margin-bottom: -1px;
          padding: 0 4px 0 8px; border: 1px solid transparent; border-bottom: 0; border-radius: 8px 8px 0 0; }
.rf-tab[hidden], .rf-more[hidden], .rf-menu[hidden], .rf-jump[hidden] { display: none; }
.rf-tab:hover { background: var(--rail); }
.rf-tab.on { flex: 0 0 auto; min-width: 96px; background: var(--paper); border-color: var(--line); padding-bottom: 1px; }
.rf-tab-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; background: none; border: 0; cursor: pointer; text-align: left;
               font-family: inherit; font-size: var(--fs-small); color: var(--ink-4); padding: 6px 0; }
.rf-tab.on .rf-tab-name { color: var(--ink); font-weight: 600; }
.rf-tab.empty .rf-tab-name { color: var(--ink-5); }
.rf-dot { flex-shrink: 0; width: 6px; height: 6px; border-radius: 50%; background: var(--zhu); }
.rf-x { flex-shrink: 0; background: none; border: 0; cursor: pointer; color: var(--ink-5); font-size: var(--fs-body); line-height: 1; padding: 2px 3px; border-radius: 6px; visibility: hidden; }
.rf-tab:hover .rf-x, .rf-tab.on .rf-x { visibility: visible; }
.rf-tab:not(.on):not(:hover) .rf-x { display: none; }
.rf-tab:not(.on) { padding-left: 6px; }   /* 像 Chrome：没在看的标签收窄，× 只在悬停时出现 */
.rf-x:hover { color: var(--ink); background: var(--rail-hover); }
.rf-more { flex-shrink: 0; background: none; border: 0; cursor: pointer; font-family: inherit; font-size: var(--fs-small); color: var(--ink-4); padding: 6px 6px; }
.rf-more:hover { color: var(--link); }
.rf-menu { position: absolute; right: 0; top: 34px; z-index: 5; min-width: 220px; max-width: 320px; background: var(--paper-raised); border: 1px solid var(--line-strong);
           border-radius: 10px; padding: 4px; box-shadow: 0 6px 18px rgba(0,0,0,.08); }
.rf-menu-row { display: flex; align-items: baseline; gap: 8px; width: 100%; background: none; border: 0; cursor: pointer; text-align: left; font: inherit;
               font-size: var(--fs-small); color: var(--ink-2); padding: 6px 8px; border-radius: 6px; }
.rf-menu-row:hover { background: var(--rail); }
.rf-menu-row.on { font-weight: 600; }
.rf-menu-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rf-menu-st, .rf-menu-src { flex-shrink: 0; color: var(--ink-5); }
.rf-jump { margin: 8px 0 0; padding: 5px 9px; background: var(--note); border: 1px solid var(--note-line); border-radius: 8px; color: var(--note-ink); font-size: var(--fs-small); }
.rf-back { background: none; border: 0; padding: 0; cursor: pointer; font: inherit; color: var(--link); }
.rf-cur-row { display: flex; align-items: baseline; justify-content: flex-end; gap: 8px; margin: 12px 0 0; }
#rf-detail .rf-body > h1 { display: none; }
/* 文件共用件（shutong/file_parts.py）：第一屏、四种声音、句后出处记号、文末依据；选中一段「问书童」。 */
.fp-first { margin: 0 0 14px; padding: 10px 12px; border: 1px solid var(--line); border-radius: 10px; background: var(--paper-raised); }
.fp-headline { margin: 0 0 4px; font-size: var(--fs-body-l); font-weight: 600; color: var(--ink); }
.fp-first .byline { margin: 0 0 4px; }
.fp-delta { margin: 6px 0 0; }
.vc-tag { display: inline-block; font-size: var(--fs-tag); letter-spacing: .04em; padding: 0 5px; border-radius: 4px; margin-right: 2px; vertical-align: 1px; }
.vc-quote { background: var(--note); color: var(--note-ink); }
.vc-source { background: var(--link-wash); color: var(--link); }
.vc-shutong { background: var(--rail); color: var(--ink-3); }
.vc-you { background: var(--zhu-wash); color: var(--zhu-deep); }
.vc-quote-block { margin: 8px 0; padding: 6px 12px; border-left: 3px solid var(--gold); background: var(--note); color: var(--ink-2); }
.cite { cursor: pointer; color: var(--link); font-size: 0.72em; margin-left: 1px; }
.cite:hover { text-decoration: underline; }
.cite-pop { display: block; margin: 4px 0 6px 12px; padding: 5px 9px; border-left: 2px solid var(--gold); background: var(--note); font-size: var(--fs-small); color: var(--ink-2); }
.cite-pop[hidden] { display: none; }
.fp-basis { margin: 14px 0 0; }
.fp-basis summary { cursor: pointer; color: var(--ink-4); font-size: var(--fs-small); }
/* 主图（shutong/file_figures.py）：内嵌 SVG，颜色全走这几个类。 */
.fp-fig { display: block; width: 100%; height: auto; margin: 8px 0 2px; }
.fp-fig-empty { margin: 8px 0 2px; padding: 8px 10px; border: 1px dashed var(--line-strong); border-radius: 8px; }
.fg-t { font-size: 11px; fill: var(--ink-2); } .fg-n { font-size: 10.5px; fill: var(--ink-4); } .fg-sp { font-size: 9px; fill: var(--ink-3); }
.fg-num { font-size: 9px; fill: var(--paper); } .fg-warn-t { fill: var(--zhu-deep); }
.fg-line { stroke: var(--line-strong); stroke-width: 1.2; fill: none; } .fg-edge { stroke: var(--ink-5); }
.fg-bar { fill: var(--ink-4); } .fg-dash { fill: none; stroke: var(--ink-5); stroke-dasharray: 3 2; }
.fg-cell { fill: var(--rail-hover); } .fg-on { fill: var(--zhu); }
.fg-dot.fg-you { fill: var(--zhu); } .fg-dot.fg-sh { fill: var(--ink-3); } .fg-dot.fg-warn { fill: var(--gold); }
.fg-box { fill: var(--paper-raised); stroke: var(--line-strong); } .fg-box.fg-sh { fill: var(--rail); }
.fg-spine { fill: var(--rail-active); stroke: var(--line-strong); } .fg-spine.fg-on { fill: var(--zhu-wash); stroke: var(--zhu); }
.fg-jump { cursor: pointer; } .fg-jump:hover .fg-t { fill: var(--link); }
#ask-pop { position: fixed; z-index: 30; padding: 4px 10px; border: 0; border-radius: 8px; background: var(--ink); color: var(--paper); font: inherit; font-size: var(--fs-small); cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,.18); }
#quote-chip { display: flex; align-items: baseline; gap: 6px; margin: 0 0 6px; padding: 4px 8px; border-left: 2px solid var(--gold); background: var(--note); font-size: var(--fs-small); color: var(--ink-2); }
#quote-chip .qc-k { color: var(--ink-4); flex-shrink: 0; }
#quote-chip .qc-t { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
#quote-chip button { margin-left: auto; background: none; border: 0; cursor: pointer; color: var(--ink-4); }
.rf-card { display: flex; align-items: baseline; gap: 6px; margin: 8px 0 4px; }
.rf-card-open { display: flex; align-items: baseline; gap: 6px; background: none; border: 0; padding: 0; cursor: pointer; font: inherit; color: var(--link); text-align: left; }
.rf-card-open:hover .rf-card-name { text-decoration: underline; }
.rf-card-name { font-size: inherit; }
.rt-understand { margin: 0 0 8px; padding: 6px 10px; border-left: 2px solid var(--gold); background: var(--note); color: var(--ink-2); font-size: var(--fs-small); }   /* 书童的理解：认成了哪本 */
.rt-open-count { margin: 10px 0; color: var(--ink-4); font-size: var(--fs-small); }   /* 开场里一句：右栏摊了什么 */
/* 收尾反应快捷 chip（3c·2026-09-03·跟在书童收尾问句后·点=当你表这个态·非"读哪条"菜单）。 */
.rt-react-chips { display: flex; flex-wrap: wrap; gap: 8px; margin: 2px 0 4px; }
.rt-react-chip { font-family: inherit; font-size: var(--fs-body); line-height: 1.5; padding: 7px 13px; border-radius: 999px;
                 border: 1px solid var(--line-strong); background: var(--paper); color: var(--ink); cursor: pointer; text-align: left; }
.rt-react-chip:hover { border-color: var(--link); background: var(--link-wash); color: var(--link); }
/* 创作扩展片2（2026-09-23·起手卡·模型 C）：书童在对话流里发的一条起手卡消息（跟气泡同级·往上滚翻过去·
   不盖对话）。取向/直接写主行 + 带料旁支。选完 .opts-used 变灰不再点。 */
.rt-invite-row { display: flex; flex-wrap: wrap; gap: 8px; margin: 4px 0 8px; }
.rt-invite-do { font-family: inherit; font-size: var(--fs-body); line-height: 1.5; padding: 8px 16px; border-radius: 999px;
                border: 1px solid var(--line-strong); background: var(--paper); color: var(--ink); cursor: pointer; }
.rt-invite-do:hover { border-color: var(--link); background: var(--link-wash); color: var(--link); }
.rt-invite-do.sel { border-color: var(--zhu); background: var(--zhu); color: var(--paper); }
.rt-invite-feed { font-size: var(--fs-body); color: var(--ink-4); display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.rt-invite-feed-btn { font-family: inherit; font-size: var(--fs-body); padding: 4px 10px; border-radius: 999px;
                      border: 1px dashed var(--line-strong); background: transparent; color: var(--ink-3); cursor: pointer; }
.rt-invite-feed-btn:hover { border-color: var(--link); color: var(--link); }
.rt-invite-note { flex-basis: 100%; font-size: var(--fs-body); color: var(--ink-3); margin-top: 4px; }
.rt-invite.opts-used .rt-invite-row, .rt-invite.opts-used .rt-invite-feed-btn { opacity: .45; pointer-events: none; }
.rt-invite-upload { margin-top: 8px; display: flex; flex-direction: column; gap: 6px; align-items: flex-start; }
.rt-invite-ta { width: 100%; min-height: 64px; font-family: inherit; font-size: var(--fs-body); line-height: 1.6; padding: 8px 10px;
                border: 1px solid var(--line-strong); border-radius: 8px; background: var(--paper); color: var(--ink); box-sizing: border-box; resize: vertical; }
.rt-invite-ta:focus { outline: none; border-color: var(--zhu); }
/* 带料轻提示（拖放 / 粘贴 / 书童递的卡收到东西时）。 */
.composer-hint { font-size: 12.5px; color: var(--ink-3); margin-top: 6px; padding: 6px 10px; background: var(--note);
                 border: 1px solid var(--note-line); border-radius: 8px; }
.composer-hint-act { margin-left: 10px; color: var(--link); font-weight: 600; text-decoration: underline; }
/* 微信读书 v1 片7：输入框里的「微信读书」标签（粘住·× 才关）+ 下方快捷文字 + 开场。 */
.wr-chip { flex-shrink: 0; display: inline-flex; align-items: center; gap: 2px; font-size: 12.5px; color: var(--zhu);
           background: var(--zhu-tint); border: 1px solid var(--zhu-line); border-radius: 999px; padding: 2px 4px 2px 10px; white-space: nowrap; }
.wr-chip.gone { color: var(--ink-4); background: var(--rail); border-color: var(--line-strong); cursor: pointer; }
.context-input-form .wr-chip .wr-chip-x { width: 20px; height: 20px; border-radius: 999px; background: none; color: inherit;
           font-size: 14px; line-height: 1; padding: 0; border: none; cursor: pointer; }
.context-input-form .wr-chip .wr-chip-x:hover { background: var(--zhu-line); color: var(--ink); }
/* 书评skill 的书名框（10-01 收笔记 ②）：标签后面紧跟空的《　》，不放灰色提示字；书名定下后收成标签，框隐掉。 */
.rv-hint { font-size: 12.5px; color: var(--zhu); margin-top: 6px; }
.rv-pending { font-size: 12px; color: var(--ink-3); margin-left: 6px; }
.wr-chip.rv-by-shutong { cursor: pointer; }
.wr-chip .wr-chip-book { margin-left: 8px; padding-left: 8px; border-left: 1px solid var(--zhu-line); color: var(--ink); font-weight: 500; }
.rv-sec { margin: 14px 0; padding-bottom: 10px; border-bottom: 1px solid var(--line); }
.rv-sec h3 { margin: 0 0 6px; font-size: 15px; }
.rv-why { font-size: 13.5px; color: var(--ink-2); }
.rv-notes { list-style: none; margin: 6px 0 0; padding: 0; }
.rv-note { font-size: 13.5px; line-height: 1.6; padding: 4px 0; color: var(--ink); }
.rv-n { display: inline-block; min-width: 1.6em; color: var(--ink-4); font-size: 12px; }
.rv-origin { display: inline-block; font-size: 11.5px; color: var(--zhu); background: var(--zhu-tint); border-radius: 999px; padding: 0 8px; margin-left: 4px; white-space: nowrap; }
.rv-para { line-height: 1.8; margin: 10px 0; }
.rv-limits { background: var(--note); border-radius: 8px; padding: 8px 12px; border: 1px solid var(--note-line); }
.rv-src { margin-top: 14px; font-size: 13px; color: var(--ink-3); }
.rv-offer .rv-card-head { cursor: pointer; }
#scene-chip .wr-chip-label { overflow: hidden; text-overflow: ellipsis; max-width: 34ch; }
.rv-chip-line { font-size: 12.5px; color: var(--ink-3); margin-bottom: 4px; }
.rv-bench .rv-row { display: flex; align-items: baseline; gap: 8px; padding: 7px 0; border-bottom: 1px solid var(--line); font-size: 13.5px; }
.rv-bench .rv-click { cursor: pointer; }
.rv-bench .rv-click:hover { background: var(--zhu-tint); }
.rv-bench .rv-mark { width: 16px; text-align: center; color: var(--ink-4); }
.rv-bench .rv-mark.ok { color: var(--zhu); }
.rv-bench .rv-mark.run { color: var(--ink-2); }
.rv-bench .rv-k { color: var(--ink-3); min-width: 3.5em; }
.rv-bench .rv-v { flex: 1; color: var(--ink); }
.rv-bench .rv-sub { font-size: 12.5px; color: var(--ink-3); padding: 4px 0 4px 24px; }
.rv-bench .rv-sec { margin: 14px 0 2px; font-size: 12px; letter-spacing: .08em; color: var(--ink-4); }
.rv-cards { display: flex; flex-direction: column; gap: 6px; margin-top: 8px; }
.rv-cards:empty { display: none; }
.rv-card { border: 1px solid var(--line-strong); border-radius: 10px; background: var(--paper); font-size: 13px; color: var(--ink-2); }
.rv-card-head { display: flex; align-items: center; gap: 8px; padding: 6px 10px; }
.rv-card-head .rv-card-t { flex: 1; cursor: pointer; }
.rv-card-head button { border: none; background: none; color: var(--ink-3); cursor: pointer; font-size: 14px; padding: 0 4px; }
.rv-card-head button:hover { color: var(--ink); }
.rv-card pre { margin: 0; padding: 8px 12px 10px; max-height: 220px; overflow: auto; white-space: pre-wrap; font: inherit; font-size: 12.5px;
               color: var(--ink-3); border-top: 1px solid var(--line); }
/* 微信读书连接引导（未挂标签时的入口，2026-09-24 二补·改成输入框底部独立一条状态条——
   Jim 给的参考截图是「在项目中工作 / 连接应用」那种：卡片底边一条分隔线隔开的状态区，
   不是跟内容混一起的小按钮。整条横贯输入框底边、圆角跟外层卡片对齐；点了**只去
   /weread.html**，不在这里分支判断连没连——已连/未连的下一步都在那页处理（已连有
   「去对话里用」，没连有连接表单），这里只负责说清楚「现在是什么状态」+ 给个入口。
   挂了标签后这条状态条隐掉，输入框行内的彩色标签（.wr-chip）顶上，那部分设计不变。 */
            background: var(--paper); border-radius: 0 0 16px 16px; }
                    padding: 0; font-size: 12.5px; font-family: inherit; color: var(--ink-3); cursor: pointer; }
.wr-quick { margin: 10px -12px -10px; padding: 9px 12px; border-top: 1px solid var(--line);
            background: var(--paper); border-radius: 0 0 16px 16px; }
.home-launcher .wr-quick { margin: 14px -20px -22px; padding: 10px 20px; }
.wr-quick button { display: inline-flex; align-items: center; gap: 6px; background: none; border: none;
                   padding: 0; font-size: 12.5px; font-family: inherit; color: var(--ink-3); cursor: pointer; }
.wr-quick button:hover { color: var(--link); }
.wr-quick-off { color: var(--ink-5); }
.wr-quick.hot { background: var(--rail); }
.wr-quick.hot button { color: var(--ink); }
.wr-open { padding-left: 40px; margin-top: 8px; font-size: 13.5px; color: var(--ink-2); line-height: 1.7; }
.wr-open-btns { display: flex; flex-wrap: wrap; gap: 6px 8px; margin-top: 8px; }
.wr-open-btns button { background: var(--paper); border: 1px solid var(--line-strong); color: var(--ink-3); border-radius: 999px; padding: 5px 12px;
           font-size: 12.5px; cursor: pointer; font-family: inherit; text-align: left; max-width: 100%; }
.wr-open-btns button:hover { border-color: var(--link); color: var(--link); }
/* E2b 工作轨迹（实时步骤·合成完折进「书童干了这些活」）：像 agent 边做边显。 */
.rt-steps { margin: 0 0 10px; }
.rt-step { display: flex; align-items: baseline; gap: 8px; font-size: var(--fs-body); color: var(--ink-3); padding: 2px 0; }
.rt-step-icon { width: 12px; text-align: center; flex-shrink: 0; }
.rt-step-label { flex: 1; }
.rt-step-detail { color: var(--ink-4); font-size: var(--fs-small); }
.rt-step-at { color: var(--ink-5); font-size: var(--fs-small); flex-shrink: 0; }
.rt-step-ok .rt-step-icon { color: var(--ok); }
.rt-step-fail .rt-step-icon { color: var(--zhu); }
.rt-step-skip { color: var(--ink-4); }
.rt-step-doing .rt-step-icon { color: var(--ink-4); }
.rt-step-doing .rt-step-label { color: var(--ink); }
.rt-marquee { display: flex; align-items: baseline; gap: 8px; color: var(--ink-3); padding: 2px 0; }
.rt-marq-icon { width: 12px; text-align: center; flex-shrink: 0; color: var(--ink-4); }
.rt-marq-label { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; animation: rt-marq-in .3s ease-out; }
.rt-elapsed { flex-shrink: 0; color: var(--ink-5); font-size: var(--fs-small); }
@keyframes rt-marq-in { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: none; } }
.rt-tl-say { margin: 3px 0; padding-left: 8px; border-left: 2px solid var(--line); color: var(--ink-4); font-size: var(--fs-small); line-height: 1.7; }
.rt-tl-lab { margin-right: 8px; color: var(--ink-4); font-size: 11px; font-weight: 700; }
.rt-steps-fold { margin: 0 0 12px; }
.rt-steps-fold > summary { font-size: var(--fs-small); color: var(--ink-4); cursor: pointer; list-style: none; padding: 2px 0; }
.rt-steps-fold > summary::-webkit-details-marker { display: none; }
.rt-steps-fold > summary::before { content: '▸ '; }
.rt-steps-fold[open] > summary::before { content: '▾ '; }
.rt-steps-fold > .rt-steps { margin-top: 6px; padding-left: 4px; border-left: 2px solid var(--line); }
/* 片3·3b：开场完整解读线（Workbuddy 模块·内容前置·显源）+ 完成后收缩条 */
.rt-lines { margin: 4px 0 12px; }
.rt-line { padding: 10px 0; border-top: 1px solid var(--line); }
.rt-line:first-child { border-top: none; }
.rt-line-head { font-weight: 600; font-size: var(--fs-small); color: var(--ink-4); letter-spacing: 0.04em; margin-bottom: 4px; }
.rt-line-text { line-height: 1.8; color: var(--ink); }
.rt-line-src { font-size: var(--fs-small); color: var(--ink-4); text-decoration: none; }
a.rt-line-src { color: var(--link); }
.rt-line-foot { display: flex; align-items: center; justify-content: space-between; gap: 8px; margin-top: 5px; }
.rt-line-talk { background: none; border: none; font-family: inherit; color: var(--link); font-size: var(--fs-small); cursor: pointer; padding: 2px 4px; border-radius: 4px; flex-shrink: 0; }
.rt-line-talk:hover { text-decoration: underline; }
.rt-lines-fold { margin: 4px 0 12px; }
.rt-lines-fold > summary { font-size: var(--fs-small); color: var(--ink-4); cursor: pointer; list-style: none; padding: 3px 0; }
.rt-lines-fold > summary::-webkit-details-marker { display: none; }
.rt-lines-fold > summary::before { content: '▸ '; }
.rt-lines-fold[open] > summary::before { content: '▾ '; }
.rt-lines-fold > .rt-lines { margin-top: 6px; padding-left: 8px; border-left: 2px solid var(--line); }
/* ⑩ dev 源诊断面板（右栏子菜单·只 DEV_FAKE_USER）：给 Jim 定位源覆盖/质量。 */
.rt-dev { margin-top: 22px; border-top: 1px dashed var(--line-strong); padding-top: 12px; }
.rt-dev > summary { font-size: var(--fs-small); color: var(--ink-4); cursor: pointer; letter-spacing: 0.04em; }
.rt-dev-row { display: flex; align-items: baseline; gap: 6px; font-size: var(--fs-small); color: var(--ink-3); padding: 3px 0; }
.rt-dev-icon { width: 10px; flex-shrink: 0; }
.rt-dev-src { font-weight: 600; white-space: nowrap; }
.rt-dev-meta { flex: 1; color: var(--ink-4); word-break: break-all; }
.rt-dev-at { color: var(--ink-5); flex-shrink: 0; }
.rt-dev-hit .rt-dev-icon { color: var(--ok); }
.rt-dev-fail .rt-dev-icon { color: var(--zhu); }
/* 读透工作台的方向选项也走 CC 盒式（P2·2026-09-01·跟 .shutong-opts 一套观感）。 */
.rt-entry-opts { display: block; margin-top: 10px; max-width: 480px; border: 1px solid var(--line-strong);
                 border-radius: 8px; overflow: hidden; background: var(--paper-raised); counter-reset: rtentry; }
.rt-entry-opt { display: block; width: 100%; border: none; border-radius: 0; background: transparent;
                color: var(--ink-3); font-family: inherit; font-size: var(--fs-body); text-align: left; cursor: pointer;
                padding: 7px 12px 7px 32px; position: relative; line-height: 1.5; }
.rt-entry-opt::before { counter-increment: rtentry; content: counter(rtentry); position: absolute;
                        left: 15px; top: 7px; color: var(--zhu); font-size: var(--fs-body); font-weight: 700; }
.rt-entry-opt.sel { background: var(--zhu-wash); color: var(--zhu); }
.rt-entry-opt:hover { background: var(--link-wash); color: var(--link); }
.rt-entry-opt.sel::after { content: "❯"; position: absolute; left: 4px; top: 7px; color: var(--zhu);
                           font-size: var(--fs-small); }
.re-now-line { font-size: 12.5px; color: var(--ink-2); line-height: 1.7; margin: 0; }
.re-now-line b { color: var(--ink); font-weight: 600; }
.rt-reveal-wrap { margin: 14px 0; text-align: center; }
.rt-reveal { margin-top: 12px; }
/* 「为什么读」目标 chip（S2·征询式·撞上 reader 已有 concern 才出）——深色卡拉开视觉，是书童合成的判断。 */
.rt-goal { margin: 14px 0 4px; background: var(--ink); border-radius: 8px; padding: 13px 15px; }
.rt-goal-tag { font-size: var(--fs-small); letter-spacing: 0.08em; color: var(--gold); }
.rt-goal-text { font-size: var(--fs-body); color: var(--paper); line-height: 1.7; margin: 6px 0 0; }
.rt-goal-fact { font-size: var(--fs-body); color: var(--ink-5); line-height: 1.6; margin: 7px 0 0; }
.rt-goal-acts { display: flex; gap: 10px; margin-top: 11px; }
.rt-goal-claim { border: 1px solid var(--gold); background: var(--gold); color: var(--ink); border-radius: 8px;
                 font-family: inherit; font-size: var(--fs-body); padding: 6px 13px; cursor: pointer; }
.rt-goal-claim:hover { background: var(--note-line); }
.rt-goal-skip { border: 1px solid var(--ink-3); background: none; color: var(--ink-5); border-radius: 8px;
                font-family: inherit; font-size: var(--fs-body); padding: 6px 13px; cursor: pointer; }
.rt-goal-skip:hover { color: var(--paper); border-color: var(--ink-5); }
.rt-cz-mark.rt-cz-goal { background: var(--gold); color: var(--ink); }
.rt-fact { align-items: flex-start; }
.rt-fact-note { font-size: var(--fs-body); color: var(--ink-4); font-style: italic; margin: 6px 0 0; }
/* 上传门（Jim 2026-09-04·双落）。 */
.rt-pq { align-items: flex-start; justify-content: space-between; gap: 8px; }
.rt-pq-text { font-size: var(--fs-body); color: var(--ink-2); line-height: 1.6; }
.rt-pq-x { flex-shrink: 0; border: none; background: none; color: var(--ink-5); font-size: var(--fs-h); line-height: 1;
           cursor: pointer; padding: 0 2px; }
.rt-pq-x:hover { color: var(--zhu); }
/* R4 理解结晶：待认领（书童征询·你认领/推翻）/ 已认领（你的证据节点）。 */
.rt-cz { flex-direction: column; align-items: stretch; gap: 6px; }
.rt-cz-proposed { background: var(--note); border: 1px solid var(--note-line); border-radius: 8px; padding: 9px 11px; }
.rt-cz-head { display: flex; gap: 6px; align-items: flex-start; }
.rt-cz-mark { flex-shrink: 0; font-size: var(--fs-small); letter-spacing: 0.06em; color: var(--paper); background: var(--gold);
              border-radius: 4px; padding: 1px 5px; margin-top: 2px; }
.rt-cz-mark.rt-cz-claimed { background: var(--ink); color: var(--gold); }
.rt-cz-text { font-size: var(--fs-body); color: var(--ink-2); line-height: 1.6; }
.rt-cz-acts { display: flex; gap: 8px; }
/* R5 轮内自主·Surface L1：书童自己接着做时，对话里的轻提示。 */
.rt-auto-note { font-size: var(--fs-body); color: var(--ink-4); font-style: italic; margin: 6px 0 0; padding-left: 10px;
                border-left: 2px solid var(--line-strong); }

/* 时间线（PRD-05，2026-07-23重做）：原来是"你说的"/"书童做的工作"两段独立堆砌的
   bullet list，改成因果交替的回合结构——每条"你说的"事实后面紧跟它触发的"书童做的
   工作"（用reader_book_connections.json真实的based_on_facts字段追溯，不是编的顺序），
   左侧一条连接线+圆点区分"你"/"书童"两种身份，更接近Claude Code那种"你说一句、
   Agent做一串"的工作记录感，不是无差别的事实清单。 */
.timeline-thread { position: relative; padding-left: 26px; margin: 20px 0; }
.timeline-thread::before { content: ""; position: absolute; left: 7px; top: 6px; bottom: 6px; width: 1px; background: var(--line-strong); }
.turn { position: relative; margin-bottom: 22px; }
.turn::before { content: ""; position: absolute; left: -26px; top: 3px; width: 9px; height: 9px; border-radius: 999px;
                background: var(--ink); border: 2px solid var(--paper); box-shadow: 0 0 0 1px var(--line-strong); }
.turn.turn-agent::before { background: var(--zhu); box-shadow: 0 0 0 1px var(--zhu-line); }
.turn-role { font-size: 11px; letter-spacing: 0.08em; text-transform: uppercase; color: var(--ink-4); margin-bottom: 5px; }
.turn.turn-agent .turn-role { color: var(--ink-4); }
.turn-body { font-size: 14px; line-height: 1.75; color: var(--ink-2); }
.turn.turn-you .turn-body { font-family: "Noto Serif SC", serif; font-size: 14px; }
.turn-body ul { list-style: none; margin: 2px 0 0; }
.turn-body li { margin-bottom: 5px; }
.turn-body .module-tag { font-size: 12.5px; color: var(--ink-4); }

/* 收藏 + 跟书童聊聊（2026-07-22取代点赞）：聊聊是主CTA，收藏是权重更轻的小图标——
   界面本身表态"这不是靠点赞互动的内容网站，是可以直接对话的读书Agent"，不是同等权重的两个按钮。 */
.engage-row { margin-top: 10px; display: flex; align-items: center; gap: 10px; }
/* 书页深执行入口（§9.2）——填充朱红，比开放式「聊聊」权重更高：这是"起一个能深执行
   的任务"，不是随口一问。 */
.book-start-row { margin: 14px 0 4px; }
.save-icon { background: transparent; border: none; font-size: 16px; color: var(--ink-4); cursor: pointer; padding: 4px; line-height: 1; }
.save-icon:hover { color: var(--gold); }

/* 身份头像圆点（账号块 + 登录页复用）。 */
.mini-avatar { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px;
               border-radius: 999px; background: var(--zhu); color: var(--paper); font-size: 11px; font-weight: 700;
               font-family: "Noto Serif SC", serif; }

/* 我的邀请码 */
.invite-list { list-style: none; padding: 0; }
.invite-list li { padding: 8px 0; border-bottom: 1px solid var(--line); }
.invite-code { font-size: 17px; letter-spacing: 2px; font-weight: 700; color: var(--ink); margin-right: 10px; }
.invite-code.used { color: var(--ink-5); text-decoration: line-through; }

/* 登录 / 注册页 */
.auth-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--line-strong); margin: 18px 0 20px; max-width: 360px; }
.auth-tab { background: none; border: none; border-bottom: 2px solid transparent; padding: 8px 18px; font-family: inherit;
            font-size: 15.5px; color: var(--ink-4); cursor: pointer; margin-bottom: -1px; }
.auth-tab.active { color: var(--zhu); border-bottom-color: var(--zhu); font-weight: 700; }
.auth-form { max-width: 360px; }
.auth-field { display: block; font-size: 14px; color: var(--ink-2); margin-bottom: 14px; }
.auth-field input { display: block; width: 100%; box-sizing: border-box; margin-top: 5px; padding: 9px 11px; font-size: 15.5px;
                    font-family: inherit; border: 1px solid var(--line-strong); border-radius: 8px; background: var(--paper-raised); color: var(--ink); }
.auth-field input:focus { outline: none; border-color: var(--zhu); }
.auth-hint { display: block; font-size: 12.5px; color: var(--ink-4); margin-top: 4px; }
.auth-error { color: var(--zhu); font-size: 13.5px; min-height: 1.2em; margin: 4px 0 0; }
.auth-note { margin-top: 14px; }

/* ───────────────────────────────────────────────────────────────────────
   App 壳（M3.9 §9.1）：左侧 Task/随口 chat 常驻列表 + 主区工作台。
   俯仰从"一个有很多页面的内容网站"变成"一个 app 壳"（DESIGN 2026-08-04）。
   内容页不消失、降级为"在主区被调出来看的东西"。
   ─────────────────────────────────────────────────────────────────────── */
.app-shell { min-height: 100vh; }
/* 左栏头（2026-09-22·拆通栏归左栏 片0）：logo + 收起 ☰。取代原来横跨全宽的通栏 appbar——
   logo / 折叠 / 身份 / 首页入口全部归左栏，主栏只剩内容。 */
.sidebar-head { display: flex; align-items: center; gap: 8px; padding: 2px 14px 10px; }
.sidebar-brand { flex: 1; color: var(--ink); font-family: "Noto Serif SC", serif; font-weight: 700;
                 font-size: 16px; letter-spacing: 0.04em; white-space: nowrap; }
.sidebar-brand:hover { text-decoration: none; }
.fy-logo { display: inline-block; background: var(--zhu); color: var(--paper); font-family: "Noto Serif SC", serif;
           font-weight: 700; font-size: 14px; letter-spacing: 0.12em; line-height: 1; padding: 6px 4px 6px 8px; border-radius: 4px; }
.sidebar-toggle { background: none; border: none; cursor: pointer; color: var(--ink-4); font-size: 16px;
                  padding: 4px 6px; line-height: 1; border-radius: 8px; flex-shrink: 0; }
.sidebar-toggle:hover { color: var(--link); background: var(--rail-hover); }
/* 收起态浮动展开钮（片0·片4 会做成完整图标轨）：宽屏收起时 / 窄屏未开时露出，否则 ☰ 藏进左栏就唤不回。 */
/* 身份/账号（片0·从通栏右端挪到左栏底·弹窗改向上开）。 */
.sidebar-identity { position: relative; }
.sidebar-identity .acct-row { display: flex; align-items: center; gap: 4px; }
.sidebar-identity .acct-name { background: none; border: none; cursor: pointer; font-family: inherit; text-align: left; display: flex; align-items: center; gap: 7px; color: var(--ink);
                              font-size: 13.5px; font-weight: 500; padding: 6px 8px; border-radius: 8px; flex: 1; overflow: hidden; }
.sidebar-identity .acct-name span:last-child { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sidebar-identity .acct-name:hover { background: var(--rail-hover); color: var(--ink); text-decoration: none; }
.sidebar-identity .acct-caret { background: none; border: none; cursor: pointer; color: var(--ink-4);
                               font-size: 12.5px; padding: 6px 7px; border-radius: 8px; line-height: 1; }
.sidebar-identity .acct-caret:hover, .sidebar-identity.open .acct-caret { background: var(--rail-hover); color: var(--ink); }
.sidebar-identity .acct-menu { position: absolute; bottom: calc(100% + 6px); left: 0; right: auto; top: auto;
             background: var(--paper); border: 1px solid var(--line-strong); border-radius: 8px; min-width: 170px;
             box-shadow: 0 6px 22px rgba(26,26,24,0.14); padding: 8px 0; z-index: 40; }
.sidebar-identity:not(.open) .acct-menu { display: none; }
.sidebar-identity .acct-login { font-size: 12.5px; color: var(--ink-4); line-height: 1.6; padding: 4px 8px; }
.sidebar-identity .acct-login a, .sidebar-identity .acct-login button { color: var(--link); background: none; border: none; cursor: pointer; font-family: inherit; font-size: 12.5px; padding: 0; }
/* 左栏 = 浅暖色 rail，跟正文同一表面（2026-08-05 从纯黑改，消除"两个网站"感）。 */
.sidebar { position: fixed; left: 0; top: 0; bottom: 0; width: var(--sidebar-w); z-index: 50;
           background: var(--rail); color: var(--ink); border-right: 1px solid var(--rail-active);
           display: flex; flex-direction: column; padding: 12px 0 10px; overflow: hidden; }
.sidebar-new { display: block; margin: 4px 14px 12px; padding: 9px 14px; border: 1px solid var(--line-strong);
               border-radius: 8px; color: var(--ink-2); font-size: 13.5px; text-align: left; background: var(--paper); }
.sidebar-new:hover { border-color: var(--link); color: var(--link); text-decoration: none; }
/* 固定入口区（在 ＋新任务 与 任务 之间）：推荐 / 技能 / 广场公开可点。 */
.sidebar-fixed { padding: 0 8px 8px; margin-bottom: 4px; border-bottom: 1px solid var(--line); }
.sb-fixed { display: block; padding: 8px 12px; border-radius: 8px; color: var(--ink-2); font-size: 13.5px; margin-bottom: 2px; }
.sb-fixed:hover { background: var(--rail-hover); color: var(--ink); text-decoration: none; }
.sb-fixed.active { background: var(--rail-active); color: var(--ink); }
.sb-empty.sb-gated { cursor: pointer; }
.sb-empty.sb-gated:hover { color: var(--ink-3); }
/* 片4·收缩态图标轨：展开态只显文字（.nav-label），图标藏着；收起成窄轨时反过来（见下方 min-width 段）。 */
.nav-icon { display: none; align-items: center; justify-content: center; width: 20px; height: 20px; }
.nav-icon svg { width: 19px; height: 19px; fill: none; stroke: currentColor; stroke-width: 1.6;
                stroke-linecap: round; stroke-linejoin: round; }
/* 账号区永远钉在左栏底（DESIGN 2026-09-30 测试反馈 Q1）：任务列表在中间自己滚，任务再多也不用往下拉找「我的」。 */
.sidebar-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; padding: 4px 8px; }
.sb-more { display: block; width: 100%; text-align: left; background: none; border: none; cursor: pointer; font-family: inherit;
           padding: 6px 12px; border-radius: 8px; color: var(--ink-4); font-size: 12.5px; }
.sb-more:hover { background: var(--rail-hover); color: var(--ink); }
/* 左栏底（片0·身份/账号从通栏挪来）。 */
.sidebar-foot { flex-shrink: 0; padding: 8px 14px 2px; margin-top: 4px; border-top: 1px solid var(--line); }
.sidebar-list .sb-empty { color: var(--ink-4); font-size: 12.5px; padding: 8px 12px; line-height: 1.6; }
.sb-item { display: block; padding: 8px 12px; border-radius: 8px; color: var(--ink-3); font-size: 13.5px;
           line-height: 1.45; margin-bottom: 2px; }
.sb-item:hover { background: var(--rail-hover); color: var(--ink); text-decoration: none; }
.sb-item.active { background: var(--rail-active); color: var(--ink); }
/* 被升级的 Task 给一点点独特标记（§9.3）；随口 chat 更淡、无标记。 */
.sb-item .sb-title { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.sb-item.sb-chat { color: var(--ink-4); }
/* 左栏分段头（P4·2026-09-08 Task 化）：「在跑的任务」/「对话」两段。 */
.sb-group-head { font-size: 11px; letter-spacing: 0.08em; color: var(--ink-4); font-weight: 700;
                 padding: 10px 12px 4px; }
.sb-group-head:first-child { padding-top: 4px; }
/* 任务行 = 跳进（整行链接）+ 放下（× ·hover 才显·操舵动词，不喧宾夺主）。 */
.sb-row { display: flex; align-items: center; gap: 2px; margin-bottom: 2px; }
.sb-row .sb-item { flex: 1; min-width: 0; margin-bottom: 0; }
.sb-drop { flex-shrink: 0; background: none; border: none; color: var(--ink-5); font-size: 15.5px;
           line-height: 1; padding: 4px 8px; cursor: pointer; border-radius: 8px; opacity: 0;
           font-family: inherit; }
.sb-row:hover .sb-drop { opacity: 1; }
.sb-drop:hover { background: var(--rail-hover); color: var(--link); }
/* 账号菜单项（身份弹窗内·2026-09-22 弹窗本体在左栏底 .sidebar-identity·见上）。 */
.acct-menu-item { display: block; width: 100%; text-align: left; box-sizing: border-box;
                  padding: 8px 14px; color: var(--ink-2); font-size: 13.5px; background: none; border: none;
                  cursor: pointer; font-family: inherit; }
.acct-menu-item:hover { background: var(--rail); color: var(--link); text-decoration: none; }
.main-col { margin-left: var(--sidebar-w); min-height: 100vh; display: flex; flex-direction: column; }
/* 中间栏上下文条（可选·仅 breadcrumb 非空时渲）：面包屑「你在哪」/ 分类导航，sticky 在主栏顶。 */
.topbar { height: 44px; flex-shrink: 0; display: flex; align-items: center; gap: 12px;
          padding: 0 24px; border-bottom: 1px solid var(--line); background: var(--paper);
          position: sticky; top: 0; z-index: 30; }
.topnav { min-width: 0; overflow: hidden; }
.topnav .meta { margin: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.topnav a:hover { color: var(--link); }
/* 总览页顶栏：分类快速导航（总览/发现/热书/问题/场景/书单/人物），每项直达一个独立
   页面（不是页内锚点），让优质公共内容更快够到。 */
.topnav-cats { display: flex; gap: 18px; white-space: nowrap; overflow-x: auto; scrollbar-width: none; }
.topnav-cats::-webkit-scrollbar { display: none; }
.topnav-cats a { color: var(--ink-3); font-size: 13.5px; }
.topnav-cats a:hover { color: var(--link); }
.topnav-cats a.active { color: var(--zhu); }
.topnav-cats a.active { font-weight: 600; }
/* 收起左栏（localStorage 记住·☰ 切换）：桌面＝收成 --rail-w 窄图标轨（片4），不再整幅隐藏；
   窄屏另在下方 media 里维持整幅浮层，不走图标轨。 */
@media (min-width: 861px) {
  .app-shell.sidebar-collapsed .sidebar { width: var(--rail-w); }
  .app-shell.sidebar-collapsed .main-col { margin-left: var(--rail-w); }
  .app-shell.sidebar-collapsed .composer-dock { left: var(--rail-w); }
  .app-shell.sidebar-collapsed .nav-label,
  .app-shell.sidebar-collapsed .sidebar-brand,
  .app-shell.sidebar-collapsed .sidebar-list { display: none; }             /* 轨里收起任务列表，展开再看 */
  /* 轨里身份只剩头像，点了弹同一个账号菜单（fixed：不被窄轨的 overflow 裁掉）。 */
  .app-shell.sidebar-collapsed .sidebar-foot { padding: 8px 0 2px; }
  .app-shell.sidebar-collapsed .acct-name span:last-child,
  .app-shell.sidebar-collapsed .acct-caret,
  .app-shell.sidebar-collapsed .acct-login { display: none; }
  .app-shell.sidebar-collapsed .acct-row { justify-content: center; }
  .app-shell.sidebar-collapsed .acct-name { flex: 0 0 auto; padding: 6px; }
  .app-shell.sidebar-collapsed .sidebar-identity .acct-menu { position: fixed; left: calc(var(--rail-w) + 6px); bottom: 12px; }
  .app-shell.sidebar-collapsed .nav-icon { display: inline-flex; }
  .app-shell.sidebar-collapsed .sidebar-head { justify-content: center; padding: 2px 0 10px; }
  .app-shell.sidebar-collapsed .sidebar-new { margin: 4px 8px 12px; padding: 9px 0; text-align: center; }
  .app-shell.sidebar-collapsed .sidebar-fixed { border-bottom: none; padding: 0 8px 6px; }
  .app-shell.sidebar-collapsed .sb-fixed { padding: 9px 0; margin: 0 0 2px; text-align: center; }
}
.main-col main { flex: 1; }
/* 底部输入条只在工作台（§9.2）：落对话列底部、不跨左栏——左偏移一个 sidebar 宽度。
   首页的输入框是发射台 hero 里的居中主角（.home-launcher），不走这个 dock。 */
.composer-dock { left: var(--sidebar-w); }
@media (max-width: 860px) {
  :root { --sidebar-w: 0px; }
  /* 窄屏（2026-09-30 第八轮样稿·手机）：左栏收成浮层，平时主栏顶上一条顶栏（「俯仰」印 + ☰），点 ☰ 挂 .sidebar-open 滑出左栏。
     主列铺满；有面包屑的上下文条贴在顶栏下面；任务页（shell-fixed）把顶栏的高度从正文里扣掉。 */
  .sidebar { width: 220px; transform: translateX(-100%); transition: transform .18s ease; }
  .app-shell.sidebar-open .sidebar { transform: translateX(0); box-shadow: 6px 0 22px rgba(26,26,24,0.12); }
  .main-col { margin-left: 0; }
  .composer-dock { left: 0; }
  .topbar { top: 48px; }
  .app-shell.shell-fixed .main-col > main { height: calc(100% - 48px); }
}
.m-topbar { position: sticky; top: 0; z-index: 40; height: 48px; flex-shrink: 0; box-sizing: border-box;
            display: flex; align-items: center; justify-content: space-between; padding: 0 16px; background: var(--paper); border-bottom: 1px solid var(--line); }
.m-menu { background: none; border: none; cursor: pointer; font-size: 18px; color: var(--ink-3); padding: 8px; margin-right: -8px; line-height: 1; }
.m-menu:hover { color: var(--link); }
@media (min-width: 861px) { .m-topbar { display: none; } }   /* 放在 .m-topbar 默认样式之后，才盖得住 */

/* 按钮三种（2026-09-30 设计系统 片3）：主 primary / 次 secondary / 文字 text。整站动作按钮只走这一套，
   旧的各写各的按钮类已并入；位置类（margin/宽度/flex）留在各自的类上。 */
.fy-btn { display: inline-flex; align-items: center; gap: 4px; font-family: inherit; font-size: 13.5px; line-height: 1.4;
          padding: 8px 16px; border-radius: 8px; cursor: pointer; border: 1px solid transparent; text-decoration: none; }
.fy-btn--sm { font-size: 12.5px; padding: 4px 10px; }
.fy-btn:disabled { opacity: .5; cursor: default; }
.fy-btn--primary { background: var(--zhu); color: var(--paper); }
.fy-btn--primary:hover:not(:disabled) { background: var(--zhu-deep); }
.fy-btn--secondary { background: var(--paper); border-color: var(--line-strong); color: var(--ink-2); }
.fy-btn--secondary:hover:not(:disabled) { background: var(--link-wash); border-color: var(--link); color: var(--link); }
.fy-btn--text { background: none; border-color: transparent; color: var(--link); padding: 4px 0; border-radius: 0; }
.fy-btn--text:hover:not(:disabled) { color: var(--zhu-deep); text-decoration: underline; }

/* ───────────────────────────────────────────────────────────────────────
   版式（2026-09-30 设计升级 片5）：对象页（书、书单、人物）主栏 + 320 侧栏；模块角落悬停出「聊这条」。
   ─────────────────────────────────────────────────────────────────────── */
.fy-split { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: 48px; align-items: start; margin-top: 8px; }
.fy-split > * { min-width: 0; }
.fy-main .cell-unit p, .fy-main .cell-unit ul { max-width: 680px; }
.fy-aside .fy-sec { margin-top: 32px; }
.fy-aside > .fy-sec:first-child, .fy-aside > :first-child { margin-top: 0; }
.fy-aside h3 { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; font-weight: 400;
               letter-spacing: .12em; color: var(--ink-4); margin: 24px 0 8px; }
.fy-aside ul.book-list li, .fy-aside ul.book-grid li { padding: 10px 0; }
.fy-pending { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 10px; }
.fy-pending li { font-size: 13.5px; line-height: 1.6; color: var(--ink-4); }
.fy-pending b { display: block; font-weight: 500; color: var(--ink-3); }
.chat-this { position: absolute; top: 8px; right: 0; opacity: 0; transition: opacity .12s; }
.cell-unit:hover .chat-this, .chat-this:focus-visible { opacity: 1; }
@media (hover: none) { .chat-this { opacity: 1; } }
@media (max-width: 900px) { .fy-split { grid-template-columns: minmax(0, 1fr); } main { padding-left: 16px; padding-right: 16px; } }
.booklist-rows li.with-side, .bl-cols-head { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: 8px 32px; align-items: start; }
/* 书单页书目（2026-09-30 第八轮样稿）：左书右推荐人说，列头一行；原话楷体放大；多出来的折起来。 */
.bl-cols-head { padding-bottom: 6px; border-bottom: 1px solid var(--line); }
.li-side .recommender b { font-weight: 500; color: var(--ink); }
.li-side .recommender b a { color: var(--ink); }
.li-side .said-big { font-size: 15.5px; line-height: 1.8; color: var(--ink-2); margin-top: 4px; }
.bl-more > summary { list-style: none; cursor: pointer; margin: 12px 0 0; }
.bl-more > summary::-webkit-details-marker { display: none; }
.bl-more[open] > summary { display: none; }
.fy-quote { margin: 0; padding: 4px 0 4px 20px; border-left: 2px solid var(--zhu); }
.fy-quote .source-said { font-family: "Kaiti SC", "STKaiti", "KaiTi", "Noto Serif SC", serif; font-size: 15.5px; line-height: 1.8; color: var(--ink-2); margin: 0 0 6px; }
.fy-head-acts { display: flex; flex-direction: column; gap: 14px; }
.fy-head-acts .meta { margin: 0; }
.li-side p { font-size: 13.5px; line-height: 1.7; margin: 0; }
.li-side .recommender { color: var(--ink-4); margin-bottom: 4px; }
.quote-kai { font-family: "Kaiti SC", "STKaiti", "KaiTi", "Noto Serif SC", serif; color: var(--ink-2); }
@media (max-width: 900px) { .booklist-rows li.with-side { grid-template-columns: minmax(0, 1fr); } .bl-cols-head { display: none; } }
.fy-cols-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 48px; }
.fy-cols-3 { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0 40px; align-items: start; }
.fy-row { margin-top: 24px; }
.fy-cols-2 > *, .fy-cols-3 > * { min-width: 0; }
.fy-cols-3 .fy-sec { margin-top: 24px; }
ul.book-grid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
/* 广场一族的行和格（2026-09-30 第八轮样稿，组件同设计系统 bundle）：一行一条（左名右数）、1px 发丝线书格、方角标签。 */
.fy-pagehead h1 { margin: 0 0 4px; }
.fy-sub { font-family: "Noto Serif SC", serif; font-size: 15.5px; line-height: 1.8; color: var(--ink-3); margin: 0; }
.fy-meta { font-size: 12.5px; color: var(--ink-4); }
.fy-meta a { color: var(--ink-4); }
.fy-mono { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; letter-spacing: .04em; color: var(--ink-4); }
.fy-count { flex-shrink: 0; display: inline-block; font-size: 11px; color: var(--ink-4); background: var(--paper-sunken); border-radius: 999px; padding: 1px 8px; }
.fy-rowlink { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; padding: 12px 0; border-bottom: 1px solid var(--line); color: var(--ink); }
.fy-rowlink:hover { text-decoration: none; }
.fy-rowlink:hover .t, .fy-rowlink:hover .q { color: var(--link); }
.fy-rowlink-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fy-rowlink .t { font-family: "Noto Serif SC", serif; font-weight: 700; font-size: 15.5px; line-height: 1.5; }
.fy-rowlink .q { font-size: 14px; line-height: 1.7; }
.fy-cells { display: grid; border-top: 1px solid var(--line); border-left: 1px solid var(--line); }
.fy-cells--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.fy-cells--4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.fy-cell { display: flex; flex-direction: column; gap: 4px; padding: 16px; border-right: 1px solid var(--line); border-bottom: 1px solid var(--line); min-width: 0; }
.fy-cell .t { font-family: "Noto Serif SC", serif; font-weight: 700; font-size: 15.5px; line-height: 1.5; color: var(--ink); }
a.fy-cell:hover, .fy-cell:hover { background: var(--paper-sunken); text-decoration: none; }
.fy-cell--hot .x { margin: 6px 0 0; font-size: 13.5px; line-height: 1.7; color: var(--ink-2); display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; }
.fy-cell--hot .meta { margin: 0; }
/* 书单列表页一份书单一条（2026-10-12 书童解读跟着书单走）：书单名 + 本数 → 来路 → 它问的问题 → 每类一条书童解读标题 */
.fy-chap#interpretations { scroll-margin-top: 110px; }   /* 列表页「全部 N 条 →」落到章标题，不被顶栏盖住 */
.bl-entry { display: flex; flex-direction: column; gap: 4px; padding: 18px 0 20px; border-bottom: 1px solid var(--line); }
.bl-entry-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; }
.bl-entry-head .t { font-family: "Noto Serif SC", serif; font-weight: 700; font-size: 16.5px; line-height: 1.5; color: var(--ink); }
.bl-entry > p { margin: 0; }
.bl-entry-q { margin-top: 6px !important; max-width: 680px; font-family: "Noto Serif SC", serif; font-size: 15px; line-height: 1.7; color: var(--ink-2); }
.bl-entry-q a { color: inherit; }
.bl-entry-q .fy-mono, .bl-entry-interp > .fy-mono { display: block; margin-bottom: 2px; }
.bl-entry-interp { margin-top: 10px; max-width: 680px; padding: 10px 0 0 14px; border-left: 2px solid var(--line-strong); }
.bl-entry-interp ul { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.bl-entry-interp li { display: grid; grid-template-columns: 7em minmax(0, 1fr); gap: 10px; align-items: baseline; font-size: 14px; line-height: 1.6; }
.bl-entry-interp li a { color: var(--ink-2); }
.bl-entry-more { display: inline-block; margin-top: 8px; font-size: 12.5px; color: var(--link); }
@media (max-width: 600px) { .bl-entry-interp li { grid-template-columns: minmax(0, 1fr); gap: 0; } }
.fy-tags { list-style: none; display: flex; flex-wrap: wrap; gap: 10px; margin: 0; padding: 0; }
.fy-tag { display: inline-block; border: 1px solid var(--line-strong); padding: 7px 18px; font-size: 14px; font-weight: 500; color: var(--ink); }
.fy-tag:hover { border-color: var(--link); color: var(--link); text-decoration: none; }
.fy-cols-75 { display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr); gap: 0 48px; }
.fy-cols-75 > * { min-width: 0; }
@media (max-width: 900px) { .fy-cols-75 { grid-template-columns: minmax(0, 1fr); } .fy-cells--2 { grid-template-columns: minmax(0, 1fr); } .fy-cells--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 900px) { .fy-cols-2, .fy-cols-3 { grid-template-columns: minmax(0, 1fr); } ul.book-grid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 900px) { .rec-item { grid-template-columns: minmax(0, 1fr); } }
.home-plaza { margin: 18px 0 0; text-align: center; font-size: 13.5px; }
.home-foot { max-width: 820px; margin: 96px auto 0; padding: 0 24px 48px; display: flex; flex-wrap: wrap; align-items: center; gap: 10px; font-size: 12.5px; color: var(--ink-4); }
.legal { max-width: 720px; margin: 0 auto; padding: 8px 0 0; }
.legal h1 { margin: 0 0 6px; }
.legal h2 { margin: 28px 0 8px; font-size: 17px; }
.legal p, .legal li { line-height: 1.85; color: var(--ink-2); }
.legal ul { padding-left: 1.3em; }
.foot-links { margin-left: auto; display: inline-flex; flex-wrap: wrap; gap: 4px 16px; }
.foot-links a { color: var(--ink-4); text-decoration: none; }
.foot-links a:hover { color: var(--link); text-decoration: underline; }
.site-foot { margin: 96px 0 0; padding: 18px 0 0; border-top: 1px solid var(--line); display: flex; flex-wrap: wrap; align-items: center; gap: 10px; font-size: 12.5px; color: var(--ink-4); }
/* 未登录：左栏只留「广场」（推荐/技能/新任务/任务列表都是登录后的），登录在左下角 */
body.is-public .sidebar-new, body.is-public .sb-fixed[data-nav="recommend"], body.is-public .sb-fixed[data-nav="skills"],
body.is-public .sidebar-list { display: none; }
body.is-public .sidebar-foot { margin-top: auto; }
body.is-public .sidebar-identity .acct-login { font-size: 13.5px; padding: 6px 12px; }
/* 「我的」系列（2026-09-30 设计升级）：每页独立，页头标题 + 一句说明，右边主按钮或开关；下面一条一个模块纵向排。 */
.my-page { max-width: 820px; }
.my-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 24px; margin-bottom: 28px; }
.my-head .subtitle { margin-bottom: 0; }
.my-head-act { flex-shrink: 0; padding-top: 6px; }
.my-head-act .mem-switch { margin: 0; }
.my-item { border: 1px solid var(--line); padding: 14px 18px; margin: 0 0 10px; }
.my-item h3 { margin: 0 0 4px; }
/* 设置页（DESIGN 2026-09-30 测试反馈 Q2）：昵称 / 首字头像底色 / 改密码。 */
.set-form { max-width: 360px; margin-top: 10px; }
.auth-error.ok { color: var(--ok); }
.av-row { display: flex; align-items: center; gap: 18px; margin-top: 10px; }
.av-preview { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; border-radius: 999px;
              background: var(--zhu); color: var(--paper); font-family: "Noto Serif SC", serif; font-weight: 700; font-size: 20px; }
.av-swatches { display: flex; gap: 10px; flex-wrap: wrap; }
.av-swatch { width: 26px; height: 26px; border-radius: 999px; border: 2px solid var(--paper); box-shadow: 0 0 0 1px var(--line-strong); cursor: pointer; padding: 0; }
.av-swatch.on { box-shadow: 0 0 0 2px var(--ink); }
@media (max-width: 700px) { .my-head { flex-direction: column; gap: 12px; } }
/* 人文四样（2026-09-30）：楷体写原话（人说的话、书里原句、划线）· 等宽小字写出处日期 · 汉字序号（只给真有先后的）· 「俯仰」印。 */
.cu-quotes li, blockquote.essay, .source-said, .quote-kai { font-family: "Kaiti SC", "STKaiti", "KaiTi", "Noto Serif SC", serif; }
.cell-unit .byline, .cu-src, .li-side .said, .rec-left .meta { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; letter-spacing: 0; }
.cell-unit .byline, .cu-src, .li-side .said { font-size: 11px; }
/* ── 公共页层级（DESIGN 2026-10-12）：跟成果文件同一套五级，只是整页尺度（大一档、宋体标题）：
   ①页名 h1 32 宋 ②一节 h2 19 宋 + 一条线 ③一条 h3 / .cu-title 16 宋 ④正文 15 / 1.9 ink-2 ⑤旁注 12 / 11 灰。
   一页里不许出现第二种正文字号、第二种说明条、第二种署名样式。 */
main .cell-unit .cu-title { font-size: 16px; line-height: 1.6; }
main .cell-unit p, main .cell-unit ul, main .cell-unit li { font-size: 15px; line-height: 1.9; }
main .cell-unit li { margin-bottom: 4px; }
/* 署名：处处一样，等宽小灰字，跟上面的正文隔开一行 */
.byline { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; line-height: 1.6; letter-spacing: 0; color: var(--ink-4); margin: 10px 0 0; }
/* 说明条：一种。左侧一道线 + 淡底，不再有粉框 / 黄框两种；诚实状态（没过审、AI 生成）仍然看得见 */
p.note, .result-banner { background: var(--note); border: 0; border-left: 3px solid var(--note-line); border-radius: 0 4px 4px 0;
                         padding: 10px 14px; font-size: 13px; line-height: 1.7; color: var(--note-ink); margin: 8px 0 20px; }
.result-banner a { color: var(--link); }
/* 一节：线统一用 line-strong，节与节间距统一 40 */
h2, .fy-sec { border-bottom-color: var(--line-strong); }

/* ── 卡片列表（书单索引 / 人物页作品 / 问题索引 / 侧栏问题）：四种长相合成一套 ──
   标题宋体 15 / 700 · 作者名 12 灰 · 日期来源等宽 11 灰 · 描述 13.5 / 1.7 ink-2；
   格子一律细线分隔、内边距 16 / 18，能点的整格 hover 淡底。 */
ul.book-grid li a, ul.book-list li .book-head a, ul.book-list li > a, .fy-rowlink .t
  { font-family: "Noto Serif SC", serif; font-size: 15px; line-height: 1.55; font-weight: 700; color: var(--ink); }
ul.book-grid li .author, ul.book-list li .author, .fy-rowlink-main .author { font-size: 12px; line-height: 1.6; color: var(--ink-4); }
ul.book-grid li .author { margin-top: 6px; }
ul.book-list li .one-liner, ul.personal-books .desc { font-size: 13.5px; line-height: 1.7; color: var(--ink-2); margin-top: 6px; }
ul.book-grid li, ul.book-list li { padding: 16px 18px; }
ul.personal-books a { padding: 16px 18px; }
ul.personal-books .title { font-size: 15px; }
.fy-rowlink { padding: 14px 0; border-bottom-color: var(--line); }
ul.book-grid li:hover, ul.book-list li:hover { background: var(--paper-sunken); }

/* ── 书页分层（DESIGN 2026-10-12「页面分层」）：页头 → 章 → 条目 → 收束。成果文件同一套，见 result_file 的窄栏版。
   页头：书名 + 来路一行 → 「这本书回应的问题」大字 → 入口；下面一道深线。
   章：一行等宽小标签（格名）+ 一句话标题（宋体 26 / 600）+ 内容 + 章末一次署名；章与章一道细线，不用框。
   条目：并列的（象征、概念、视角/结构/节奏）排成「名字 | 解释」的细线行，不编号；有先后的（因果链）汉字序号一行一步。 */
.fy-bookhead { padding: 0 0 36px; margin: 0 0 4px; border-bottom: 1px solid var(--line-strong); }
.fy-bookhead h1 { margin: 0 0 6px; }
.fy-bookhead .book-titleline { margin: 0; }
.fy-chap-label { font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; letter-spacing: .12em; color: var(--ink-4); }
.fy-qs--head { margin: 26px 0 0; max-width: 760px; }
.fy-qs--head .fy-q-lead { border-bottom: 0; padding: 6px 0 0; }
.fy-qs--head .fy-q-lead a, .fy-qs--head .fy-q-lead .question-text { font-size: 28px; font-weight: 600; line-height: 1.5; }
.fy-qs--head .fy-q-row:first-of-type { border-top: 1px solid var(--line); margin-top: 10px; }
.fy-bookhead .fy-head-acts { margin: 24px 0 0; }
.fy-main > .book-cells { margin-top: 0; }

.fy-chap { padding: 44px 0 40px; border-bottom: 1px solid var(--line); }
.fy-chap:last-child { border-bottom: 0; }
.fy-main > .fy-chap:first-child, .book-cells > .fy-chap:first-child { padding-top: 40px; }
.fy-chap-head { display: flex; justify-content: space-between; align-items: baseline; gap: 16px; }
.fy-chap-title { font-family: "Noto Serif SC", serif; font-size: 26px; font-weight: 600; line-height: 1.45;
                 margin: 10px 0 20px; padding: 0; border: 0; max-width: 720px; }
.fy-chap-head--plain .fy-chap-title { font-size: 20px; margin: 0 0 16px; }
.fy-chap-sig { margin: 22px 0 0; }
.fy-chap .chat-this { position: static; opacity: 0; }
.fy-chap:hover .chat-this, .fy-chap .chat-this:focus-visible { opacity: 1; }
@media (hover: none) { .fy-chap .chat-this { opacity: 1; } }
.fy-chap-count { margin-left: 10px; font-family: inherit; font-size: 12.5px; font-weight: 400; letter-spacing: 0; color: var(--ink-4); }
.fy-chap-title a { color: inherit; }
.fy-chap-title a:hover { color: var(--link); }
.fy-chap-note { display: block; margin-top: 4px; font-family: inherit; font-size: 12.5px; font-weight: 400; color: var(--ink-4); }
.fy-chap > p, .fy-chap > .attribution { max-width: 680px; }
.fy-chap > p:not(.meta):not(.note):not(.pending):not(.byline) { font-size: 15.5px; line-height: 1.95; color: var(--ink-2); margin: 0 0 12px; }
.fy-bookhead .question-title { margin-top: 6px; }
.fy-bookhead > .fy-chap-label { display: block; }
.fy-bookhead .subtitle, .fy-bookhead > .meta { margin: 6px 0 0; }
.fy-bookhead .fy-quote { margin: 18px 0 0; max-width: 680px; }
/* 书页头的封面和原书名（2026-10-12 片4/5）：封面只放真的（微信读书），下面一行出处；原书名斜体西文衬线，出处进悬停 */
.fy-bookhead--cover { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 40px; align-items: end; }
.fy-bookhead-main { min-width: 0; }
.fy-cover { margin: 0; }
.fy-cover img { display: block; width: 150px; height: auto; border: 1px solid var(--line-strong); box-shadow: 6px 8px 0 -2px var(--paper-sunken); }
.fy-cover figcaption { margin-top: 10px; font-family: ui-monospace, "SF Mono", Menlo, Consolas, monospace; font-size: 11px; color: var(--ink-4); }
.fy-orig-title { margin: 2px 0 8px; font-family: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, "Times New Roman", serif;
                 font-style: italic; font-size: 20px; line-height: 1.4; color: var(--ink-3); }
/* ── 列表里的封面（DESIGN 2026-10-12 第十节，封面片2）：尺寸三档、一个比例 2:3。s＝行内 44 宽 · m＝格子 96 宽（书页头 150 在上面）。
   封面原图比例不一，统一放进 2:3 的框、居中、不裁字（框底纸面色）；没有封面的书留同样大小的空位保持对齐，不画假封面。 */
.fy-thumb { display: block; flex-shrink: 0; aspect-ratio: 2 / 3; object-fit: contain; object-position: center bottom; background: var(--paper-sunken); }
.fy-thumb--s { width: 44px; }
.fy-thumb--m { width: 96px; }
.fy-thumb--none { background: none; }
img.fy-thumb { border: 1px solid var(--line); }
/* 书的一行（书单书目、人物页作品、同问题的书、主题 / 场景页）：左封面右字 */
ul.book-list li.has-thumb { display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 0 16px; align-items: start; }
.booklist-rows li.with-side.has-thumb, .bl-cols-head { grid-template-columns: 44px minmax(0, 5fr) minmax(0, 6fr); gap: 8px 16px; }
.booklist-rows li.with-side.has-thumb .li-side { padding-left: 16px; }
/* 侧栏相邻书籍：小封面 + 书名作者 */
.fy-rowlink.has-thumb { justify-content: flex-start; align-items: center; gap: 12px; }
.fy-rowlink.has-thumb .fy-thumb--s { width: 32px; }
/* 问题页「这些书怎么回答」左栏 */
.fy-pair-l.has-thumb { display: grid; grid-template-columns: 44px minmax(0, 1fr); gap: 12px; align-items: start; }
/* 热书格子：封面在上（封面墙） */
.fy-cell--hot .fy-cell-cover { display: block; margin-bottom: 10px; }
.fy-cell--hot .fy-thumb--m { width: 100%; max-width: 120px; }
/* 书单的「封面」：前几本书的真封面叠成一摞（书单列表、广场书单行） */
ul.personal-books a.has-cover { display: flex; align-items: flex-start; gap: 14px; }
ul.personal-books a.has-cover .pb-text { flex: 1; min-width: 0; }
ul.personal-books a.has-cover .fy-thumb--s { width: 40px; }
.fy-stack { display: inline-flex; flex-shrink: 0; align-items: flex-end; }
.fy-stack img { width: 40px; aspect-ratio: 2 / 3; object-fit: contain; object-position: center bottom; background: var(--paper-sunken);
                border: 1px solid var(--line); box-shadow: 2px 0 0 var(--paper); }
.fy-stack img + img { margin-left: -22px; }
.fy-rowlink .fy-stack { margin-right: 4px; }
.fy-rowlink:has(.fy-stack) { justify-content: flex-start; align-items: center; gap: 14px; }
.fy-rowlink:has(.fy-stack) .fy-count { margin-left: auto; }
.bl-entry.has-stack { display: grid; grid-template-columns: 112px minmax(0, 1fr); gap: 0 20px; align-items: start; }
.bl-entry.has-stack .fy-stack img { width: 56px; }
.bl-entry.has-stack .fy-stack img + img { margin-left: -38px; }
.bl-entry-body { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.bl-entry-body > p { margin: 0; }
/* 找书候选、书单草稿里刚认出来的书：书名前一个小封面（/covers/ 按需取，取不到图自己消失） */
.fb-cand-title:has(.fb-cover), .dec-row:has(.fb-cover) { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.fb-cover.fy-thumb--s { width: 36px; }
/* 推荐页：书名左边中封面 */
.rec-right .rec-cover { float: left; margin: 0 16px 8px 0; width: 72px; }
@media (max-width: 900px) {
  .booklist-rows li.with-side.has-thumb { grid-template-columns: 44px minmax(0, 1fr); }
  .booklist-rows li.with-side.has-thumb .li-side { grid-column: 2; padding-left: 0; }
  .bl-entry.has-stack { grid-template-columns: 76px minmax(0, 1fr); gap: 0 14px; }
  .bl-entry.has-stack .fy-stack img { width: 40px; }
  .bl-entry.has-stack .fy-stack img + img { margin-left: -28px; }
}

/* 并列的「左名右说」细线行（问题页「这些书怎么回答」、候选分组页）：不编号 */
.fy-pair { display: grid; grid-template-columns: 220px minmax(0, 1fr); gap: 24px; padding: 16px 0; border-top: 1px solid var(--line); max-width: 860px; }
.fy-pair:last-of-type { border-bottom: 1px solid var(--line); }
.fy-pair h3 { margin: 0; font-size: 15.5px; line-height: 1.6; }
.fy-pair .author { display: block; margin-top: 4px; font-size: 12.5px; color: var(--ink-4); }
.fy-pair .answer-note { margin: 0; font-size: 15px; line-height: 1.85; color: var(--ink-2); }
.fy-pair .attribution { margin: 6px 0 0; }

main .fy-chap .cell-unit { padding: 0; margin: 0 0 28px; border: 0; }
main .fy-chap .cell-unit:last-of-type { margin-bottom: 0; }
main .fy-chap .cell-unit .cu-title { font-family: inherit; font-size: 13px; font-weight: 400; color: var(--ink-4); margin: 0 0 8px; }
main .fy-chap .cell-unit p { font-size: 15.5px; line-height: 1.95; color: var(--ink-2); }
/* 书童解读（书单页）这章里的子分类：跟书页章里的小标签同一档 */
.fy-chap > h3 { font-family: inherit; font-size: 13px; font-weight: 400; color: var(--ink-4); margin: 28px 0 8px; }
.fy-chap > h3:first-of-type { margin-top: 0; }

.cu-fields { max-width: 720px; border-bottom: 1px solid var(--line); }
.cu-fields .cu-field { display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: 20px; margin: 0; padding: 12px 0;
                       border: 0; border-top: 1px solid var(--line); }
.cu-fields .cu-flabel { font-family: "Noto Serif SC", serif; font-size: 15px; font-weight: 600; letter-spacing: 0; color: var(--ink); margin: 0; line-height: 1.8; }
main .cu-fields .cu-field p, main .cu-fields .cu-field ul { margin: 0; font-size: 15px; line-height: 1.8; }
main .cu-fields .cu-field ul { padding-left: 18px; }

/* 收束（适合谁读这章）：标题是「读完得到什么」那一句，下面几项横排成格 */
#cell-fit .cu-fields { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); border-top: 1px solid var(--line-strong); border-bottom: 0; }
#cell-fit .cu-fields .cu-field { display: block; border-top: 0; padding: 16px 20px 0 0; }
#cell-fit .cu-fields .cu-field + .cu-field { border-left: 1px solid var(--line); padding-left: 20px; }
#cell-fit .cu-fields .cu-flabel { font-family: inherit; font-size: 13px; font-weight: 400; color: var(--ink-4); }
#cell-fit .fy-chap-title { font-size: 24px; }

ol.sg { margin: 6px 0 12px; max-width: 720px; border-bottom: 1px solid var(--line); }
ol.sg li { display: grid; grid-template-columns: 36px minmax(0, 1fr); gap: 4px 12px; border: 0; border-top: 1px solid var(--line);
           background: none; padding: 12px 0; margin: 0; font-size: 15px; line-height: 1.8; }
ol.sg-chain li:not(:last-child)::after { content: none; }
.sg-i { font-family: "Noto Serif SC", serif; font-size: 15px; font-weight: 400; color: var(--ink-4); }
.sg .attr-tag, .sg-note { grid-column: 2; }
@media (max-width: 640px) {
  .cu-fields .cu-field { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .fy-chap-title { font-size: 22px; }
  .fy-pair { grid-template-columns: minmax(0, 1fr); gap: 6px; }
  .fy-bookhead--cover { grid-template-columns: 96px minmax(0, 1fr); gap: 18px; align-items: start; }
  .fy-cover img { width: 96px; }
  .fy-qs--head .fy-q-lead a, .fy-qs--head .fy-q-lead .question-text { font-size: 23px; }
}
/* ── 成果文件正文版式（DESIGN 2026-10-11）：整套字号 / 间距 / 颜色只在这里定一次，右栏窄着和放大着都吃这一套。
   层级只有四级（文件名就是右栏标签，正文里不再重复写；10-12 撤了右栏头的书名行）：①一节（h2：小字 · 字距 · 一条线）
   ②一条（.cu-title：15px 粗）③正文（14.5 / 1.85）④旁注（标签 · 署名 · 版本 · 依据：12 / 11 小字、灰）。
   颜色三档：正文 ink-2 · 旁注 ink-4 · 能点的 link；朱红不进正文（只留给印、主按钮、小红点）。
   版面：一节与一节之间留白 + 一条线；一条与一条之间只一条淡线；条内的「字段」靠左侧竖线挂在正文下，不另起框。 */
.rf-body { --rf-measure: 700px; font-size: 14.5px; line-height: 1.85; color: var(--ink-2); padding-bottom: 40px; }
.rf-body > * { max-width: var(--rf-measure); }
.rf-body h1 { font-size: 20px; margin: 0 0 12px; }
.rf-body .rf-head.has-cover { display: flex; align-items: center; gap: 14px; margin: 0 0 12px; }
.rf-body .rf-head.has-cover h1 { margin: 0; }
.rf-body .rf-head .fy-thumb--s { width: 40px; }

/* 一句话说明（谁的、没过审、第几版）：旁注，不做彩色大框 */
.rf-body .result-banner { margin: 0 0 16px; padding: 0 0 0 10px; border: 0; border-left: 2px solid var(--line-strong); background: none;
                          font-size: 12px; line-height: 1.7; color: var(--ink-4); }

/* 第一屏：唯一一张卡，其余都是平铺 */
.rf-body .fp-first { margin: 0 0 8px; padding: 14px 16px; border: 1px solid var(--line); border-radius: 12px; background: var(--paper-raised); }
.rf-body .fp-headline { margin: 0 0 6px; font-size: 15.5px; line-height: 1.6; font-weight: 700; color: var(--ink); }
.rf-body .fp-fig { max-width: 520px; margin: 10px 0 4px; }
/* 解读地图：每条思路一行，底下是它牵到的人物（圆角）和场景（方角） */
.fp-map { margin: 12px 0 2px; }
.fp-map-h { margin: 0 0 6px; font-size: 12px; color: var(--ink-4); letter-spacing: .04em; }
.fp-map-list { list-style: none; margin: 0; padding: 0; }
.fp-map-row { padding: 8px 0; border-top: 1px solid var(--line); }
.fp-map-thread { margin: 0 0 4px; font-size: 14px; line-height: 1.55; font-weight: 600; color: var(--ink); }
.fp-map-uses, .fp-map-rest { margin: 0; font-size: 12.5px; line-height: 2; color: var(--ink-4); }
.fp-map-rest { margin-top: 6px; padding-top: 8px; border-top: 1px solid var(--line); }
.fp-chip { display: inline-block; margin: 0 4px 0 0; padding: 0 8px; font-size: 12.5px; line-height: 1.7; color: var(--ink-2); border: 1px solid var(--line-strong); }
.fp-chip-p { border-radius: 999px; background: var(--zhu-wash); border-color: transparent; color: var(--zhu-deep); }
.fp-chip-s { border-radius: 3px; background: var(--paper); }
.fp-chip-c { border-radius: 3px; border-style: dashed; background: transparent; }
.rf-body .fp-delta { margin: 8px 0 0; font-size: 12px; color: var(--ink-4); }
.rf-body .fp-basis summary { font-size: 12px; }

/* 一节 */
.rf-body .book-cell { margin: 36px 0 0; }
.rf-body .book-cell:first-of-type { margin-top: 28px; }
.rf-body .fy-sec { margin: 0 0 4px; padding: 0 0 8px; border-bottom: 1px solid var(--line-strong); }
.rf-body .book-cell > h2, .rf-body .fy-sec h2 { margin: 0; padding: 0; border: 0; font-family: inherit; font-size: 12px; line-height: 1.6; font-weight: 700;
                                               letter-spacing: .14em; color: var(--ink-3); }
.rf-body .book-cell > h2 { padding-bottom: 8px; margin-bottom: 4px; border-bottom: 1px solid var(--line-strong); }
.rf-body .fy-sec .c { font-size: 12px; color: var(--ink-4); }

/* 一条 */
.rf-body .cell-unit { padding: 16px 0 14px; border-bottom: 1px solid var(--line); }
.rf-body .cell-unit:last-of-type { border-bottom: 0; }
.rf-body .cu-title { margin: 0 0 8px; font-family: inherit; font-size: 15px; line-height: 1.6; font-weight: 700; color: var(--ink); }
.rf-body .cell-unit p, .rf-body .cell-unit ul { max-width: none; font-size: 14.5px; line-height: 1.85; color: var(--ink-2); margin: 0 0 8px; }
.rf-body .cell-unit ul { margin-left: 18px; padding: 0; }
.rf-body .cell-unit li { font-size: 14px; line-height: 1.8; margin: 0 0 4px; }
.rf-body .cu-badge { font-size: 11px; line-height: 1.5; padding: 0 7px; border: 1px solid var(--line-strong); border-radius: 999px; color: var(--ink-4); font-weight: 400; }

/* 条里的字段：标签小灰字在上，内容靠左线挂着；「依据」这种出处字段再淡一档 */
.rf-body .cu-field { margin: 12px 0 0; padding: 0 0 0 12px; border-left: 2px solid var(--line); }
.rf-body .cu-flabel { display: block; margin: 0 0 3px; font-size: 12px; line-height: 1.6; letter-spacing: .06em; color: var(--ink-4); }
.rf-body .cu-field p, .rf-body .cu-field li { font-size: 14px; color: var(--ink-2); }
.rf-body .cu-field:last-of-type p { margin-bottom: 0; }

/* 署名 / 版本 / 折叠：全是旁注 */
.rf-body .byline, .rf-body .cell-unit .byline { margin: 10px 0 0; font-size: 11px; line-height: 1.6; color: var(--ink-4); }
.rf-body .cu-prev, .rf-body .cu-quotes, .rf-body .cu-blocked { margin: 6px 0 0; font-size: 12px; color: var(--ink-4); }
.rf-body .cu-prev summary, .rf-body .cu-quotes summary, .rf-body .cu-blocked summary { font-size: 12px; }
.rf-body .cu-prev ul { margin: 6px 0 0 18px; font-size: 12px; }
.rf-body .rf-ver { color: var(--link); }

/* 没有 fy-sec 的小节（依据的材料 / 这次读了什么）：清单，比正文小一档 */
.rf-body .book-cell > ul, .rf-body .book-cell > ol { margin: 8px 0 0 20px; padding: 0; }
.rf-body .book-cell > ul li, .rf-body .book-cell > ol li { font-size: 13px; line-height: 1.75; color: var(--ink-3); margin: 0 0 4px; }
.rf-body .book-cell > p { font-size: 14.5px; line-height: 1.85; margin: 8px 0 0; }

/* 章（DESIGN 2026-10-12「页面分层」）：跟书页同一套，窄栏缩一档——标签同、标题宋体 19、署名一章一次 */
.rf-body .book-cell { margin: 28px 0 0; padding: 24px 0 0; border-top: 1px solid var(--line); border-bottom: 0; }
.rf-body .book-cell:first-of-type { margin-top: 24px; border-top-color: var(--line-strong); }
.rf-body .fy-chap-title { font-size: 19px; line-height: 1.5; margin: 8px 0 12px; letter-spacing: 0; color: var(--ink); font-weight: 600; font-family: "Noto Serif SC", serif; }
.rf-body .fy-chap-head--plain .fy-chap-title { font-size: 16px; margin: 0 0 10px; }
.rf-body .book-cell .cell-unit { padding: 0; margin: 0 0 18px; border: 0; }
.rf-body .book-cell .cell-unit .cu-title { font-size: 12.5px; font-weight: 400; color: var(--ink-4); }
.rf-body .cu-fields .cu-field { grid-template-columns: minmax(0, 1fr); gap: 2px; padding: 9px 0; border-left: 0; }
.rf-body .cu-fields .cu-flabel { font-size: 14.5px; }
.rf-body .cu-fields .cu-field p, .rf-body .cu-fields .cu-field li { font-size: 13.5px; }
.rf-body ol.sg li { grid-template-columns: 24px minmax(0, 1fr); gap: 4px 8px; padding: 9px 0; font-size: 14px; }
.rf-body #cell-fit .cu-fields { grid-template-columns: minmax(0, 1fr); }
.rf-body #cell-fit .cu-fields .cu-field + .cu-field { border-left: 0; padding-left: 0; border-top: 1px solid var(--line); }

/* 放大着的时候（右栏拉宽，app-shell 挂 rail-zoom）：正文留足呼吸 */
.rail-zoom .rf-body .book-cell { margin-top: 44px; }
.rail-zoom .rf-body .fp-first { padding: 18px 22px; }
.rail-zoom .rf-body { font-size: 15px; }
/* 右栏里开一份站里已有的公开页（书单skill 先查站里）：整页的两栏骨架压成一栏，页脚不要 */
.rf-body .fy-split { display: block; margin-top: 4px; }
.rf-body .fy-split > * { margin-bottom: 14px; }
.rf-body .site-foot { display: none; }
/* ── 消息下面的一行按钮：电脑上悬停才出来，手机上只有最后一条书童消息常显 ── */
.msg-acts { display: flex; gap: 2px; margin-top: 4px; padding-left: 32px; opacity: 0; transition: opacity .15s; }
.msg-acts-you { justify-content: flex-end; padding-left: 0; }
.chat-turn:hover > .msg-acts, .chat-turn:focus-within > .msg-acts, .msg-acts[data-mark] { opacity: 1; }
@media (hover: none) {
  .msg-acts { display: none; }
  .msg-last > .msg-acts, .msg-acts[data-mark] { display: flex; opacity: 1; }
}
.msg-act { display: inline-flex; align-items: center; gap: 4px; border: 0; background: none; color: var(--ink-4);
  padding: 4px 6px; border-radius: 6px; cursor: pointer; font: inherit; font-size: var(--fs-small); line-height: 1; }
.msg-act:hover { background: var(--rail-hover); color: var(--ink-2); }
.msg-act[aria-pressed="true"] { color: var(--zhu); }
.msg-act.fy-act-done .fy-act-lab { position: static; width: auto; height: auto; clip: auto; overflow: visible; }
.fy-sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
/* ── 成果文件操作行：下载 · 分享，图标按钮 ── */
#rf-nav-win { display: inline-flex; align-items: center; gap: 2px; flex-shrink: 0; }
.rf-file-acts { display: inline-flex; gap: 0; margin-right: 4px; }
.rf-file-acts .msg-act { padding: 5px; }
/* ── 分享对话框 ── */
.fy-modal { position: fixed; inset: 0; z-index: 1000; display: flex; align-items: center; justify-content: center; padding: 16px;
  background: rgba(20, 16, 10, .32); }
.fy-modal-card { position: relative; width: min(520px, 100%); max-height: calc(100vh - 32px); overflow: auto; padding: 20px 22px;
  background: var(--paper-raised); border: 1px solid var(--line); border-radius: 12px; box-shadow: 0 12px 40px rgba(0, 0, 0, .18); color: var(--ink); }
.fy-modal-title { margin: 0 28px 12px 0; font-size: var(--fs-body-l); }
.fy-modal-x { position: absolute; top: 10px; right: 12px; border: 0; background: none; font-size: 20px; color: var(--ink-4); cursor: pointer; }
.fy-modal-body p { margin: 0 0 10px; line-height: 1.7; }
.fy-modal-acts { display: flex; justify-content: flex-end; gap: 8px; margin-top: 14px; }
.fy-share-priv { list-style: none; margin: 0; padding: 0; max-height: 240px; overflow: auto; border-top: 1px solid var(--line); }
.fy-share-priv li { padding: 8px 0; border-bottom: 1px solid var(--line); font-size: var(--fs-small); color: var(--ink-2); }
.fy-share-priv label { display: block; cursor: pointer; }
.fy-share-hits { margin: 0 0 10px; padding-left: 18px; font-size: var(--fs-small); }
.fy-share-err { color: var(--zhu-deep); }
.fy-share-link { display: flex; gap: 8px; margin: 0 0 10px; }
.fy-share-link input { flex: 1; min-width: 0; padding: 6px 8px; border: 1px solid var(--line-strong); border-radius: 8px; font: inherit; font-size: var(--fs-small); background: var(--paper); color: var(--ink); }
/* ── 分享出去的只读页 /s/… ── */
.share-page { max-width: 720px; margin: 0 auto; padding: 24px 16px 48px; }
.share-head { margin-bottom: 18px; padding-bottom: 12px; border-bottom: 1px solid var(--line); }
.share-title { margin: 0 0 6px; }
.share-foot { margin-top: 28px; padding-top: 14px; border-top: 1px solid var(--line); display: flex; flex-direction: column; gap: 10px; align-items: flex-start; }
.my-sec-title { margin: 22px 0 8px; font-size: var(--fs-body); color: var(--ink-3); font-weight: 600; }
.fy-share-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; }
/* ── 书摘图：选中一段后「做成图」，跟「问书童」并排 ── */
#card-pop { position: fixed; z-index: 30; padding: 4px 10px; border: 1px solid var(--line-strong); border-radius: 8px; background: var(--paper-raised);
  color: var(--ink); font: inherit; font-size: var(--fs-small); cursor: pointer; box-shadow: 0 2px 8px rgba(0,0,0,.12); }
#card-pop:disabled { color: var(--ink-4); cursor: default; }
.fy-card-img { display: block; width: 100%; height: auto; border: 1px solid var(--line); border-radius: 8px; margin: 0 0 10px; }
