/* 磐隐商机情报 · 全站样式
 * 双主题:默认跟随系统(prefers-color-scheme),手动切换写入 data-theme 覆盖。
 * 无框架、无构建链;所有颜色一律走 token,禁止裸写色值到组件规则里。
 */

/* ---------- 0. 自托管字体 ---------- */
/* Reference Latin V13:留白照抄 Instrument Sans(OFL,库里已有)的每字度量,轮廓只做水平平移。
 * V12 按「边型」自己推留白,推出来的性质与专业字体相反:细竖(i/l)被压到 0.050em、
 * 斜笔(v/y)给到 0.042em,而真字体恰好反过来——细竖 0.074~0.080em、斜笔 0.018~0.020em,
 * 且 r/k 只在一侧留 0.020~0.024em。于是英文看着间隔忽宽忽窄。V13 直接取 Instrument Sans
 * 的左右留白(下界提到 0.020em 保底),字宽 = 墨宽 + 两侧留白;空格 0.26em。
 * 字母缝落在 0.042~0.172em。不做等宽格子:等宽格子得撑到 m/w 的 0.68em。
 * V14 在 V13 上按用户样张再收三处:细竖 i/l/I 两侧 0.080~0.074 -> 0.055;斜笔
 * (v y w x A V W X Y T 两侧、k K 的斜侧)0.018~0.032 -> 0.040;f/t 保底 0.034 防叠字距后粘连。
 * V15 再按用户反馈补四组:
 *   ① 字偶距(GPOS):VI/VA/AV 等 28 组大写斜笔对 -30、I 相关 -30、k/c 后接圆弧小写 -10;
 *   ② 大写平边侧 0.086 -> 0.074(大写标题里 P-H / H-I 这类平头对原本是全表最宽的缝);
 *   ③ 并入标点 , : ( )(取自 Instrument Sans,OFL):逗号右 77->57、冒号右 76->61、
 *      左括号右 50->58、右括号左 50->42(修「(n 太近、s) 太松」的不对称);
 *   ④ 空格 0.260 -> 0.235em,标点后不至于断句感生硬。
 * V16 三组:
 *   ⑤ 并入 em/en 破折号与撇号(内容里 U+2014 用 7146 次、U+0027 用 30669 次,此前不在字体里,
 *      是系统字体在渲染,所以两侧留白一直调不动):破折号两侧各 +28 units;
 *   ⑥ 括号两侧加垫:右括号左 +15、右 +8,左括号右 +8(修「(Q 太紧、s) 太挤」);
 *   ⑦ 小写斜笔字偶距 W+h/w+h/w+o/y+o -12,撇号后接 s/t +20(放开右上角墨迹聚集)。 */

 * V7/V8 的病根不是粘连本身而是不均匀:左右留白随手定(左 -6~42、右 0~160),
 * 任意两字母的墨迹缝隙从 74 到 201 units 差 2.7 倍,看着就是「有的挤有的松」。
 * V9/V10 一度改成恒定留白,另一端又出问题——**几何等距不等于视觉等距**:
 * 弧边(o/e/c)与尖边(A/V/T/W/y)的墨迹在边缘处退开,同样 0.15em 看着比平边宽一截;
 * 而整块墨迹就是一根竖的 l/i/I 两侧都是平边,同样 0.15em 又最显空。
 * V12 分三档:按每侧「最外沿点跨越的字高比例」——平边(H/M/n/x)0.075em、
 * 弧边与尖边 0.035em;另给墨迹宽 ≤0.15em 的孤竖字形(l/i/I;下一个最窄的 j 是 0.19em)
 * 单列一档 0.050em。字母缝隙落在 0.074~0.150em。字母自身宽度仍随墨迹走
 * (i 0.25em、m 0.84em),不做等宽格子:等宽格子得撑到 m/w 的 0.68em,窄字母前后
 * 会空出一大片,那是终端机字体,不是这套设计的样子。空格 0.30em。 */
@font-face {
  font-family: "Panyin Reference Latin";
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/panyin-reference-latin-v16.woff2") format("woff2");
  unicode-range: U+0020, U+0027, U+0028-0029, U+002C, U+0030-0039, U+003A, U+0041-005A, U+0061-007A, U+2013-2014, U+2019;
}
@font-face {
  font-family: "Panyin Reference Latin";
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/panyin-reference-latin-v16.woff2") format("woff2");
  unicode-range: U+0020, U+0027, U+0028-0029, U+002C, U+0030-0039, U+003A, U+0041-005A, U+0061-007A, U+2013-2014, U+2019;
}
/* 同一片 V16 轮廓只声明 w400:浏览器对「家族里没有更粗字面」的 700 请求会合成加粗,
 * 于是数字能真变粗而字形不变。上面那两片同族同文件同轮廓,写 700 等于没写——
 * 这是 Reference Latin 覆盖到的字符(数字、拉丁字母)全域成立的结论,不只是本处。
 * 只给更新日志的日期用,别扩散:合成粗体是描边加厚,不是真字面。 */
@font-face {
  font-family: "Panyin Reference Latin Synth";
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/panyin-reference-latin-v16.woff2") format("woff2");
  unicode-range: U+0020, U+0027, U+0028-0029, U+002C, U+0030-0039, U+003A, U+0041-005A, U+0061-007A, U+2013-2014, U+2019;
}
/* 参考图没有版本号标点；Mono 仅为 -./: 提供现有兜底，数字仍由上面的 V16 接管。 */
@font-face {
  font-family: "Panyin Anthropic Mono";
  font-weight: 400;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/anthrosevka-mono-numerals-400.woff2") format("woff2");
  unicode-range: U+002D-003A;
}
@font-face {
  font-family: "Panyin Anthropic Mono";
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/anthrosevka-mono-numerals-700.woff2") format("woff2");
  unicode-range: U+002D-003A;
}

/* Anthropic 字体来自 matthieuhuguet/anthropic-fonts;商用授权已由使用方确认。
 * 字体不含中文,中文继续走原系统/子集回退。 */
@font-face {
  font-family: "Anthropic Mono";
  font-weight: 300 800;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/AnthropicMono.woff2") format("woff2");
}
@font-face {
  font-family: "Anthropic Sans";
  font-weight: 300 800;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/AnthropicSans-Romans.woff2") format("woff2");
}

@font-face {
  font-family: "Anthropic Sans";
  font-weight: 300 800;
  font-style: italic;
  font-display: swap;
  src: url("/static/fonts/AnthropicSans-Italics.woff2") format("woff2");
}
@font-face {
  font-family: "Anthropic Serif";
  font-weight: 300 800;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/AnthropicSerif-Romans.woff2") format("woff2");
}
@font-face {
  font-family: "Anthropic Serif";
  font-weight: 300 800;
  font-style: italic;
  font-display: swap;
  src: url("/static/fonts/AnthropicSerif-Italics.woff2") format("woff2");
}

/* 自托管衬线(规格 U4:思源宋体子集,OFL) */
/* 同族名 "Panyin Serif" 两片、不同字重,按文案性质分层(U6 让跑马灯也用衬线之后,
 * 字符集不再封闭,单层不可行):
 *   w600 → text-600.woff2     680 KB,GB2312 一级 3755 字 → 跑马灯等**动态**文案
 *   w700 → display-700.woff2  32.7 KB,258 字(11 个方向名 + 页面/分区标题)→ 固定大标题
 * 只用小子集:动态文案掉回系统宋体,与大标题混排;
 * 只用大子集:页面主体(11 个大标题)要等 680 KB 才定妆。分层后主体瞬时可用。
 * 两片都 font-display:swap,同源自托管,运行期零外链、零依赖。
 * 生成脚本 scripts/subset_display_font.py(需先备好完整 NotoSerifSC[wght].ttf);
 * 字符集变了(新增方向名、改标题文案)必须重跑脚本并替换 woff2。 */
@font-face {
  font-family: "Panyin Serif";
  font-weight: 600;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/noto-serif-sc-text-600.woff2") format("woff2");
}
@font-face {
  font-family: "Panyin Serif";
  font-weight: 700;
  font-style: normal;
  font-display: swap;
  src: url("/static/fonts/noto-serif-sc-display-700.woff2") format("woff2");
}

/* ---------- 1. Design tokens ---------- */

:root {
  /* Dark reference: sampled solid pixels, 2026-09-12. One palette for every module.
   * See docs/experiments/2026-09-12-dark-theme-palette.md for coordinates and roles. */
  --dark-recessed: #0B0B0B;
  --dark-navigation: #111111;
  --dark-navigation-line: #292929;
  --dark-page: #151515;
  --dark-surface: #1F1F1F;
  --dark-input: #212121;
  --dark-control: #2D2D2D;
  --dark-selected: #343434;
  --dark-pressed: #363636;
  --dark-line: #2D2D2D;
  --dark-control-line: #414141;
  --dark-text: #F0EFEC;
  --dark-text-secondary: #C3C2B7;
  --dark-text-muted: #898781;
  --dark-primary: #FFFFFF;
  --dark-focus: #2A78D6;
  --dark-success: #55BF50;
  --dark-success-bg: #11260F;
  /* Light reference: measured screenshot solids, 2026-09-13. Roles, not interchangeable grays. */
  --light-page: #FCFCFB;
  --light-navigation: #FBFBF9;
  --light-surface: #FFFFFF;
  --light-input: #FEFEFD;
  --light-recessed: #F9F9F7;
  --light-control: #F0F0EF;
  --light-navigation-selected: #EDECE8;
  --light-selected: #D8D8D8;
  --light-pressed: #CECECD;
  --light-line: #E3E3E2;
  --light-control-line: #DEDEDD;
  --light-strong-line: #CECECD;
  --light-text: #0B0B0B;
  --light-secondary: #52514E;
  --light-muted: #898781;
  --light-label: #6F6D67;
  --light-link: #1E5BAA;
  --light-focus: #2A78D6;
  --nav-bg: var(--light-navigation);
  --nav-line: var(--light-line);
  --nav-selected-bg: var(--light-navigation-selected);
  --code-bg: var(--light-recessed);
  --panel-bg: var(--light-surface);
  --input-bg: var(--light-input);
  --input-line: var(--light-control-line);
  --input-placeholder: var(--light-muted);
  --control-bg: var(--light-control);
  --selected-bg: var(--light-selected);
  --pressed-bg: var(--light-pressed);
  --overlay-bg: var(--light-surface);
  --primary-bg: var(--light-text);
  --primary-fg: var(--light-surface);
  --primary-hover: var(--light-secondary);
  --disabled-bg: var(--light-control);
  --disabled-fg: var(--light-muted);
  --label-fg: var(--light-label);
  --link-fg: var(--light-link);
  --schedule-active-fg: #006300;
  --schedule-active-bg: #CCECCA;
  --schedule-active-line: #CCECCA;
  --schedule-paused-fg: var(--light-secondary);
  --schedule-paused-bg: var(--light-control);
  --schedule-paused-line: var(--light-line);
  --runtime-bg: #F9DCA4;
  --runtime-fg: #775013;
  --switch-active: var(--light-focus);
  --task-card-bg: var(--light-page);
  --task-card-outline: inset 0 0 0 1px var(--light-line);
  color-scheme: light;
  --bg: var(--light-page);
  --surface: var(--light-surface);
  /* --sunken:控件面(表头/输入/次级按钮底);--oat:可点击卡片面与表格行 hover */
  --sunken: var(--light-control);
  --oat: var(--light-navigation-selected);
  --text: var(--light-text);
  --text-2: var(--light-secondary);
  --text-3: var(--light-muted);
  /* --faded 只服务 U2 的「让位」态:悬停某个方向时其余方向褪到它。
   * 比 --text-3 更淡,不用于任何静止态文字(U7:静止态 11 个标题必须同色) */
  --faded: #C7C4B9;
  --border: var(--light-line);
  /* --border-strong 是「hover 才出现的灰框」,静态边一律用 --border */
  --border-strong: var(--light-strong-line);
  --accent: #D97757;
  --accent-strong: #B85C3F;
  --accent-soft: rgba(217, 119, 87, 0.10);
  --on-accent: #FFFFFF;
  --status-panel: #141413;
  --status-text: #F4F1E9;
  --status-muted: #BDB9AF;
  --status-line: #35332E;
  --policy-muted: var(--light-label);
  /* 密排列表的分类、机构、区域等辅助信息：浅色模式略深，降低长时阅读负担。 */
  --list-meta: var(--light-secondary);
  /* 等级色(规格 U3 红黄灰):A=「今天必须知道」故用红,原绿色读起来像「通过/正常」。
   * a/b 两档固定不随主题翻转,黑字在两个主题下都成立;只有 c 档的灰跟着主题走。 */
  --grade-a: #E8604C;
  --grade-b: #F2C14E;
  --grade-c: #D6D3C8;
  --on-grade: #141413;
  /* C 档字色单列一个 token:U3 说「黑字在两个主题下都成立」,对 A/B 成立
   * (5.45:1 / 10.98:1),对 C 不成立——暗色 --grade-c #57554E 配黑字实算
   * 2.47:1,徽章看得见、里面的「C」看不见。提亮 --grade-c 会让 C 比 --text-3
   * 还亮、破坏「C 是压暗档」的语义,故改翻字色:亮 12.30:1、暗 6.37:1。 */
  --on-grade-c: #141413;
  /* 日报正文重点强调(2026-09-03):芯片字/底/线三色,三处主题块同步声明。
     字色 0903 用户看过样张后拍板「再调深一点」:#A32D2D → #8C1F1F。 */
  --hl-fg: #8C1F1F;
  --hl-bg: #F8EDEA;
  --hl-line: #EBD5D0;
  --danger: #BE3B2B;
  --danger-bg: #FBEFEC;
  --ok: #1F6B3F;
  --ok-bg: #E6F0E8;
  --amber: #8F6708;
  --amber-bg: #F8EFD8;
  --neutral-bg: var(--light-control);
  --shadow: 0 1px 2px rgba(20, 20, 19, 0.04), 0 2px 8px rgba(20, 20, 19, 0.04);
  --control-hover: var(--light-control);
  --focus-ring: var(--light-focus);
  --focus-glow: rgba(47, 128, 237, 0.20);
  --tooltip-bg: #0B0B0B;
  --tooltip-fg: #FFFFFF;
  --tooltip-shadow: 0 1px 2px rgba(11, 11, 11, 0.06), 0 2px 8px rgba(11, 11, 11, 0.08);
  /* 日报封面缺图时的临时占位色；暗色主题也保持插画原色，不做滤镜或翻转。 */
  --brief-cover-ink: #141413;
  --brief-cover-ivory: #FAF9F5;
  --brief-cover-mon: #EBCECE;
  --brief-cover-tue: #6A9BCC;
  --brief-cover-wed: #BCD1CA;
  --brief-cover-thu: #E3DACC;
  --brief-cover-fri: #D97757;
  --brief-cover-sat: #788C5D;
  --brief-cover-sun: #CBCADB;
  --brief-page-bg: var(--bg);
  --brief-related-bg: var(--sunken);
  --header-h: 68px;
  --module-bar-h: 44px;
  --radius: 12px;
  --radius-lg: 18px;
  --font-sans: "Anthropic Sans", "Source Han Sans SC", system-ui, -apple-system,
               "Segoe UI", "PingFang SC",
               "Hiragino Sans GB", "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;
  --font-heading: "Anthropic Mono", "Source Han Sans SC", "PingFang SC", "Hiragino Sans GB",
                  "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;
  --font-body: "Anthropic Mono", "Source Han Sans SC", "PingFang SC", "Hiragino Sans GB",
               "Microsoft YaHei", "Noto Sans CJK SC", sans-serif;
  --font-mono: "Anthropic Mono", "Source Han Sans SC", "SFMono-Regular", "SF Mono", Menlo,
               Consolas, "Liberation Mono", "Microsoft YaHei", monospace;
  /* 首位是自托管子集;其后是 D9 的系统宋体兜底(iOS→Songti SC、
   * Android→Noto Serif CJK SC、Win→SimSun),子集未覆盖的字由它们接住。
   * text-600 只覆盖 GB2312 一级 3755 字,二级字必掉兜底栈,故 D9 点名的候选
   * 一个都不能少:漏掉 Source Han Serif SC / Noto Serif SC 这两个包名,
   * 部分 Linux 与国产发行版会直接落到 generic serif(多半是无衬线代打)。 */
  --font-serif: "Anthropic Serif", "Panyin Serif", Georgia,
                "Times New Roman", "Songti SC",
                "Noto Serif CJK SC", "Source Han Serif SC", "Noto Serif SC",
                SimSun, serif;
  /* ease-out-expo:起快收慢,U2 的「变速」转动与放大统一吃它 */
  --ease-expo: cubic-bezier(0.19, 1, 0.22, 1);
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    color-scheme: dark;
    --nav-bg: var(--dark-navigation);
    --nav-selected-bg: var(--dark-selected);
    --label-fg: var(--dark-text-muted);
    --link-fg: var(--accent);
    --nav-line: var(--dark-navigation-line);
    --code-bg: var(--dark-recessed);
    --panel-bg: var(--dark-surface);
    --input-bg: var(--dark-input);
    --input-line: var(--dark-control-line);
    --input-placeholder: var(--dark-text-secondary);
    --control-bg: var(--dark-control);
    --selected-bg: var(--dark-selected);
    --pressed-bg: var(--dark-pressed);
    --overlay-bg: var(--dark-input);
    --primary-bg: var(--dark-primary);
    --primary-fg: var(--dark-page);
    --primary-hover: var(--dark-text);
    --disabled-bg: var(--dark-control);
    --disabled-fg: var(--dark-text-muted);
    --status-text: var(--dark-text);
    --status-muted: var(--dark-text-secondary);
    --status-line: var(--dark-line);
    --schedule-active-fg: var(--dark-success);
    --schedule-active-bg: var(--dark-success-bg);
    --schedule-active-line: var(--dark-success-bg);
    --schedule-paused-fg: var(--dark-text-secondary);
    --schedule-paused-bg: var(--dark-input);
    --schedule-paused-line: var(--dark-line);
    --runtime-bg: var(--amber-bg);
    --runtime-fg: var(--amber);
    --switch-active: var(--dark-focus);
    --task-card-bg: var(--dark-page);
    --task-card-outline: inset 0 0 0 1px var(--dark-line);
    --bg: var(--dark-page);
    --surface: var(--dark-surface);
    --sunken: var(--dark-input);
    --oat: var(--dark-control);
    --text: var(--dark-text);
    --text-2: var(--dark-text-secondary);
    --text-3: var(--dark-text-muted);
    --faded: var(--dark-control-line);
    --border: var(--dark-line);
    --border-strong: var(--dark-control-line);
    --accent: #D97757;
    --accent-strong: #E89275;
    --accent-soft: rgba(217, 119, 87, 0.16);
    --on-accent: #FFFFFF;
    --status-panel: var(--dark-navigation);
    --policy-muted: var(--dark-text-muted);
    --list-meta: var(--dark-text-secondary);
    /* 只翻转 c 档底色与它的字色;--grade-a/--grade-b/--on-grade 沿用 :root
     * (U3 明令不随主题翻转,A/B 两档黑字实算 5.45:1 / 10.98:1 成立) */
    --grade-c: var(--dark-control-line);
    --on-grade-c: var(--dark-text);
    --hl-fg: #EE8C76;
    --hl-bg: #3A2E2B;
    --hl-line: #55403C;
    --danger: #F0876F;
    --danger-bg: rgba(224, 90, 60, 0.14);
    --ok: var(--dark-success);
    --ok-bg: var(--dark-success-bg);
    --amber: #D9B25C;
    --amber-bg: rgba(200, 150, 20, 0.15);
    --neutral-bg: var(--dark-input);
    --shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
    --control-hover: var(--dark-control);
    --focus-ring: var(--dark-focus);
    --focus-glow: rgba(42, 120, 214, 0.26);
    --tooltip-bg: var(--dark-control);
    --tooltip-fg: var(--dark-text);
    --tooltip-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.10), 0 1px 2px rgba(11, 11, 11, 0.06), 0 2px 8px rgba(0, 0, 0, 0.24);
    --brief-page-bg: var(--dark-page);
    --brief-related-bg: var(--dark-surface);
  }
}

:root[data-theme="dark"] {
  color-scheme: dark;
  --nav-bg: var(--dark-navigation);
    --nav-selected-bg: var(--dark-selected);
    --label-fg: var(--dark-text-muted);
    --link-fg: var(--accent);
    --nav-line: var(--dark-navigation-line);
    --code-bg: var(--dark-recessed);
  --panel-bg: var(--dark-surface);
  --input-bg: var(--dark-input);
  --input-line: var(--dark-control-line);
  --input-placeholder: var(--dark-text-secondary);
  --control-bg: var(--dark-control);
  --selected-bg: var(--dark-selected);
  --pressed-bg: var(--dark-pressed);
  --overlay-bg: var(--dark-input);
  --primary-bg: var(--dark-primary);
  --primary-fg: var(--dark-page);
  --primary-hover: var(--dark-text);
  --disabled-bg: var(--dark-control);
  --disabled-fg: var(--dark-text-muted);
  --status-text: var(--dark-text);
  --status-muted: var(--dark-text-secondary);
  --status-line: var(--dark-line);
  --schedule-active-fg: var(--dark-success);
  --schedule-active-bg: var(--dark-success-bg);
  --schedule-active-line: var(--dark-success-bg);
  --schedule-paused-fg: var(--dark-text-secondary);
  --schedule-paused-bg: var(--dark-input);
  --schedule-paused-line: var(--dark-line);
  --runtime-bg: var(--amber-bg);
  --runtime-fg: var(--amber);
  --switch-active: var(--dark-focus);
  --task-card-bg: var(--dark-page);
  --task-card-outline: inset 0 0 0 1px var(--dark-line);
  --bg: var(--dark-page);
  --surface: var(--dark-surface);
  --sunken: var(--dark-input);
  --oat: var(--dark-control);
  --text: var(--dark-text);
  --text-2: var(--dark-text-secondary);
  --text-3: var(--dark-text-muted);
  --faded: var(--dark-control-line);
  --border: var(--dark-line);
  --border-strong: var(--dark-control-line);
  --accent: #D97757;
  --accent-strong: #E89275;
  --accent-soft: rgba(217, 119, 87, 0.16);
  --on-accent: #FFFFFF;
  --status-panel: var(--dark-navigation);
  --policy-muted: var(--dark-text-muted);
  --list-meta: var(--dark-text-secondary);
  /* 只翻转 c 档底色与它的字色;--grade-a/--grade-b/--on-grade 沿用 :root
   * (U3 明令不随主题翻转,A/B 两档黑字实算 5.45:1 / 10.98:1 成立) */
  --grade-c: var(--dark-control-line);
  --on-grade-c: var(--dark-text);
  --hl-fg: #EE8C76;
  --hl-bg: #3A2E2B;
  --hl-line: #55403C;
  --danger: #F0876F;
  --danger-bg: rgba(224, 90, 60, 0.14);
  --ok: var(--dark-success);
  --ok-bg: var(--dark-success-bg);
  --amber: #D9B25C;
  --amber-bg: rgba(200, 150, 20, 0.15);
  --neutral-bg: var(--dark-input);
  --shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
  --control-hover: var(--dark-control);
  --focus-ring: var(--dark-focus);
  --focus-glow: rgba(42, 120, 214, 0.26);
  --tooltip-bg: var(--dark-control);
  --tooltip-fg: var(--dark-text);
  --tooltip-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.10), 0 1px 2px rgba(11, 11, 11, 0.06), 0 2px 8px rgba(0, 0, 0, 0.24);
  --brief-page-bg: var(--dark-page);
  --brief-related-bg: var(--dark-surface);
}

/* ---------- 2. 基础 ---------- */

* { box-sizing: border-box; }

/* Keep centered layouts stationary when disclosures add/remove the page scrollbar. */
html { -webkit-text-size-adjust: 100%; scrollbar-gutter: stable; }

/* Match the quiet scroll controls already used in the task editor. */
:where(*) { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--text-3) 45%, transparent) transparent; }
::-webkit-scrollbar { width: 8px; height: 8px; }
::-webkit-scrollbar-track, ::-webkit-scrollbar-corner { background: transparent; }
::-webkit-scrollbar-thumb {
  background: color-mix(in srgb, var(--text-3) 45%, transparent);
  border: 2px solid transparent; border-radius: 8px; background-clip: padding-box;
}
::-webkit-scrollbar-thumb:hover { background-color: color-mix(in srgb, var(--text-3) 70%, transparent); }
::-webkit-scrollbar-button { display: none; width: 0; height: 0; }
@supports selector(::-webkit-scrollbar) {
  html { scrollbar-width: auto; scrollbar-color: auto; }
}
@media (forced-colors: active) {
  :where(*) { scrollbar-color: auto; }
  ::-webkit-scrollbar-thumb { background-color: CanvasText; }
}

body {
  margin: 0;
  font-family: var(--font-body);
  /* Mono is intentionally dense in prose; fixed-width code and controls opt out. */
  letter-spacing: -0.04em;
  font-kerning: normal;
  font-variant-ligatures: common-ligatures;
  font-size: 15px;
  line-height: 1.65;
  color: var(--text);
  background: var(--bg);
}

h1, h2, h3, h4, h5, h6 { font-family: var(--font-heading); letter-spacing: normal; }
:where(pre, code, kbd, samp, input, textarea, select, button, nav, summary, label, .btn, [role="button"], .site-header, .module-bar, .home-story .chapter-nav, .prompt-md-pane-label) { letter-spacing: normal; }
:where(blockquote, .brief-lead, .standfirst) { letter-spacing: normal; }

a { color: inherit; text-decoration: none; }
/* 次级→主色的 hover 模式(不再变橙);正文内嵌链接(.brief-body a / .att-actions a)保留 accent */
a:hover { color: var(--text); }

/* Claude Blog 的页面切换机制：离场先用主题底色盖满视口，导航完成后遮罩淡出，
 * 页头从上、正文从下分层入场。不用截图交叉淡化，页面结构变化时也不会穿帮。
 * 时长(0905 收紧):离场 0.18s 只求盖住旧页;新页内容一到就换、就入场(app.js 就地换内容),
 * 遮罩 0.3s 淡出、正文错峰 60ms、入场 0.4s——此前 0.75s + 1s + 0.65s 的固定等待
 * 比服务端渲染(详情页 12ms)长两个量级,是「每次换页都要等一两秒」的主因。 */
.page-transition {
  z-index: 99999;
  position: fixed;
  inset: 0;
  width: 100%;
  height: 100vh;
  height: 100dvh;
  display: none;
  background: var(--bg);
  opacity: 0;
  visibility: hidden;
  pointer-events: auto;
}
.page-loading .page-transition {
  display: block;
  opacity: 1;
  visibility: visible;
}
.page-loading.page-entering .page-transition {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
  transition: opacity 0.3s linear, visibility 0s linear 0.3s;
}
.page-leaving .page-transition {
  display: block;
  opacity: 0;
  visibility: visible;
}
.page-leaving.page-leaving-active .page-transition {
  opacity: 1;
  transition: opacity 0.18s linear;
}

/* 全站操作反馈:服务端重定向与就地导航共用,不改变页面布局。 */
.toast-region {
  position: fixed;
  z-index: 100001;
  right: 24px;
  bottom: 24px;
  width: min(380px, calc(100vw - 32px));
  pointer-events: none;
}
.toast-region.is-top {
  top: 24px;
  right: 50%;
  bottom: auto;
  width: min(560px, calc(100vw - 32px));
  transform: translateX(50%);
}
.toast-card {
  display: flex;
  align-items: center;
  gap: 14px;
  min-height: 52px;
  padding: 12px 18px 12px 22px;
  color: var(--text);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 16px;
  box-shadow: 0 8px 24px color-mix(in srgb, var(--text) 18%, transparent);
  pointer-events: auto;
  animation: toast-in 180ms ease-out both;
}
.toast-card--warning {
  border-color: color-mix(in srgb, var(--amber) 48%, var(--border));
}
.toast-card--danger {
  border-color: color-mix(in srgb, var(--danger) 48%, var(--border));
}
.toast-card--warning .toast-mark {
  color: var(--amber);
  border-color: var(--amber);
}
.toast-card--danger .toast-mark {
  color: var(--surface);
  background: var(--danger);
  border-color: var(--danger);
}
.toast-mark {
  display: inline-flex;
  flex: none;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  color: var(--text-2);
  background: transparent;
  border: 2px solid var(--text-2);
  border-radius: 50%;
  font-family: Arial, sans-serif;
  font-size: 14px;
  font-weight: 600;
  line-height: 1;
}
.toast-copy { display: grid; gap: 0; min-width: 0; font-size: 16px; line-height: 1.25; }
.toast-copy strong { font-weight: 500; }
.toast-copy span { color: var(--text-2); }
.toast-close {
  flex: none;
  width: 24px;
  height: 24px;
  margin: 0 -4px 0 auto;
  padding: 0;
  color: var(--text);
  background: transparent;
  border: 0;
  border-radius: 5px;
  font: inherit;
  font-size: 23px;
  line-height: 1;
  cursor: pointer;
}
.toast-close:hover { color: var(--text); background: var(--neutral-bg); }
@keyframes toast-in {
  from { opacity: 0; transform: translateY(-6px); }
  to { opacity: 1; transform: translateY(0); }
}
@media (max-width: 600px) {
  .toast-region { right: 16px; bottom: 16px; width: calc(100vw - 32px); }
  .toast-region.is-top { top: 16px; right: 16px; width: calc(100vw - 32px); transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .toast-card { animation: none; }
}

@keyframes page-nav-in {
  from { opacity: 0; transform: translateY(-20px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes page-main-in {
  from { opacity: 0; transform: translateY(20px); }
  to { opacity: 1; transform: translateY(0); }
}
.page-loading.page-entering .site-header,
.page-loading.page-entering .module-bar {
  animation: page-nav-in 0.4s cubic-bezier(0.215, 0.61, 0.355, 1) 0s both;
}
.page-loading.page-entering main.wrap {
  animation: page-main-in 0.4s cubic-bezier(0.215, 0.61, 0.355, 1) 0.06s both;
}

/* 全站键盘焦点环(设计稿末行,移植时漏了)。只在键盘/程序化聚焦时出现,鼠标点击
 * 不显示。§7 的输入控件另有一条 accent 焦点环排在后面,特异性更高,不受影响。 */
:focus-visible { outline: 2px solid var(--border-strong); outline-offset: 2px; }

h1, h2, h3 { font-weight: 600; line-height: 1.35; }
h2 { font-size: 17px; margin: 0 0 10px; }
h3 { font-size: 14.5px; margin: 20px 0 8px; }

.muted { color: var(--text-2); font-size: 13px; }
.sr-only {
  position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0;
}
.warn { color: var(--danger); font-weight: 700; }
.mark { text-align: center; }
.num { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }

.wrap { max-width: 1280px; margin: 0 auto; padding: 20px 28px 56px; }

/* ---------- 3. 页头 ---------- */

.site-header {
  position: sticky; top: 0; z-index: 50;
  height: var(--header-h); font-family: var(--font-sans);
  background: var(--nav-bg, color-mix(in srgb, var(--bg) 88%, transparent));
  backdrop-filter: blur(10px);
  -webkit-backdrop-filter: blur(10px);
  border-bottom: 1px solid var(--nav-line, var(--border));
}
.site-header .inner {
  max-width: 1280px; margin: 0 auto; height: 100%;
  padding: 0 28px;
  display: flex; align-items: center; gap: 24px; position: relative;
}
.brand { display: flex; align-items: center; gap: 10px; font-size: 16px;
         font-weight: 700; letter-spacing: 0.02em; white-space: nowrap; }
.brand-logo { display: block; flex: none; width: 30px; height: 30px;
              border-radius: 7px; object-fit: cover; }
.brand-logo-dark { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .brand-logo-light { display: none; }
  :root:not([data-theme="light"]) .brand-logo-dark { display: block; }
}
:root[data-theme="dark"] .brand-logo-light { display: none; }
:root[data-theme="dark"] .brand-logo-dark { display: block; }
.site-nav { display: flex; justify-content: flex-end; align-items: center; gap: 8px;
            flex: 1; min-width: 0; }
.mobile-site-menu { display: none; }
.site-menu > summary, .module-directory > summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; gap: 4px;
  color: var(--text-2); white-space: nowrap;
  transition: color 0.2s ease, background-color 0.2s ease;
}
.site-menu > summary::-webkit-details-marker,
.module-directory > summary::-webkit-details-marker { display: none; }
.site-menu > summary { padding: 10px 10px; border-radius: 8px; font-size: 14px; }
.site-menu > summary a { padding: 3px 2px; }
.site-menu > summary:hover, .site-menu[open] > summary,
.site-menu.current > summary {
  color: var(--text);
  background: transparent;
}
.site-menu.current > summary a { text-decoration: underline; text-underline-offset: 8px;
                                 text-decoration-thickness: 1px; }
.nav-chevron { width: 1rem; height: 1rem; display: inline-flex; flex: none;
               transition: transform 0.75s cubic-bezier(0.16, 1, 0.3, 1); }
.nav-chevron svg { width: 100%; height: 100%; }
.site-menu:not(.disclosure-ready)[open] > summary .nav-chevron,
.module-directory:not(.disclosure-ready)[open] > summary .nav-chevron,
.site-menu.is-open > summary .nav-chevron,
.prompt-option:not(.disclosure-ready)[open] > summary .nav-chevron,
.prompt-option.is-open > summary .nav-chevron,
.module-directory.is-open > summary .nav-chevron { transform: rotate(-180deg); }
.mega-menu {
  position: absolute; top: calc(100% - 5px); right: 72px; z-index: 60;
  display: grid; grid-template-rows: 1fr;
  background: var(--overlay-bg, var(--surface)); border: 1px solid var(--border);
  border-radius: 18px; box-shadow: 0 18px 45px rgba(20, 20, 19, 0.10);
}
/* 首个模块的展开层跟随“商机情报”触发项，移动指针时保持在可达路径上。 */
@media (min-width: 901px) {
  .site-menu:first-child { position: relative; }
  .site-menu:first-child > .mega-menu {
    left: 0; right: auto; width: min(632px, calc(100vw - 24px));
  }
  .site-menu:first-child > .mega-menu::before {
    content: ""; position: absolute; top: -12px; left: 0; right: 0; height: 12px;
  }
}
.mega-menu-content {
  min-height: 0; overflow: hidden; display: grid; grid-auto-flow: column;
  grid-auto-columns: 200px; padding: 8px;
}
.site-menu.disclosure-ready > .mega-menu,
.prompt-option.disclosure-ready > .prompt-option-panel,
.module-directory.disclosure-ready > .module-directory-panel {
  grid-template-rows: 0fr; opacity: 0; visibility: hidden; pointer-events: none;
  transition: grid-template-rows 0.3s cubic-bezier(0.16, 1, 0.3, 1),
              visibility 0s linear 0.3s,
              opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1);
  will-change: grid-template-rows, opacity;
}
.site-menu.disclosure-ready.is-open > .mega-menu,
.prompt-option.disclosure-ready.is-open > .prompt-option-panel,
.module-directory.disclosure-ready.is-open > .module-directory-panel {
  grid-template-rows: 1fr; opacity: 1; visibility: visible; pointer-events: auto;
  transition: grid-template-rows 0.6s cubic-bezier(0.16, 1, 0.3, 1),
              visibility 0s linear,
              opacity 0.6s cubic-bezier(0.16, 1, 0.3, 1);
}
.mega-column { min-height: 0; padding: 0 8px; border-left: 1px solid var(--border); }
.mega-column:first-child { padding-left: 0; border-left: 0; }
.mega-column:last-child { padding-right: 0; }
.mega-column h2, .module-directory-panel h2 {
  min-height: 30px; margin: 0; padding: 0 12px; display: flex; align-items: center;
  color: var(--text-3); font-size: 12px; font-weight: 500; letter-spacing: 0.02em;
}
.mega-column a, .module-directory-panel a {
  display: block; min-height: 40px; margin: 0; padding: 8px 12px;
  color: var(--text); font-size: 15px; border-radius: 7px;
  transition: color 0.2s ease, background-color 0.2s ease;
}
.mega-column a:hover, .mega-column a:focus-visible,
.module-directory-panel a:hover, .module-directory-panel a:focus-visible {
  color: var(--text);
  background: var(--nav-selected-bg, var(--sunken));
  font-weight: 600;
}

/* 紧凑第二层:当前位置与“浏览本栏”共用一条导航带。 */
.module-bar { position: sticky; top: var(--header-h); z-index: 40;
              height: var(--module-bar-h); background: var(--nav-bg, var(--bg));
              border-bottom: 1px solid var(--nav-line, var(--border)); }
.module-bar-inner { max-width: 1280px; height: 100%; margin: 0 auto; padding: 0 28px;
                    display: flex; align-items: center; justify-content: space-between; gap: 16px;
                    position: relative; }
.module-breadcrumbs { flex: 1; min-width: 0; margin: 0; overflow-x: auto;
                      white-space: nowrap; scrollbar-width: none; }
.module-breadcrumbs::-webkit-scrollbar { display: none; }
.module-directory { flex: none; }
.module-directory > summary { padding: 6px 0 6px 14px; font-size: 13.5px; }
.module-directory-panel {
  position: absolute; top: calc(100% - 3px); right: 28px; z-index: 55;
  display: grid; grid-template-rows: 1fr; background: var(--overlay-bg, var(--surface));
  border: 1px solid var(--border); border-radius: 16px; box-shadow: var(--shadow);
}
.module-directory-panel-content {
  min-height: 0; overflow: hidden; display: grid; grid-auto-flow: column;
  grid-auto-columns: minmax(150px, 190px); padding: 8px;
}
.module-directory-panel section { min-height: 0; padding: 0 8px; border-left: 1px solid var(--border); }
.module-directory-panel section:first-child { padding-left: 0; border-left: 0; }
.module-directory-panel section:last-child { padding-right: 0; }
.breadcrumbs { display: flex; align-items: center; gap: 10px;
               color: var(--text-3); font-size: 13.5px; }
.breadcrumbs a:hover, .breadcrumbs [aria-current="page"] { color: var(--text-2); }

/* 中立平台首页:只承担分流,不把任何业务模块伪装成“首页”。 */
.platform-hero { padding: clamp(64px, 10vw, 128px) 0 clamp(46px, 7vw, 82px);
                 max-width: 940px; }
.platform-kicker { margin: 0 0 22px; color: var(--text-3); font-size: 11px;
                   letter-spacing: 0.18em; }
.platform-hero h1 { margin: 0; max-width: 12ch; font-family: var(--font-heading);
                    font-size: clamp(42px, 7vw, 84px); font-weight: 600;
                    line-height: 1.05; letter-spacing: -0.035em; }
.platform-hero > p:last-child { max-width: 52ch; margin: 30px 0 0; color: var(--text-2);
                                font-size: 16px; }
.platform-modules { display: grid; grid-template-columns: repeat(3, 1fr);
                    border-top: 1px solid var(--border); }
.platform-module { display: grid; grid-template-columns: 1fr auto; gap: 16px;
                   min-height: 220px; padding: 26px 28px 28px;
                   border-right: 1px solid var(--border); transition: background 0.3s; }
.platform-module:last-child { border-right: 0; }
.platform-module:hover { background: var(--oat); }
.platform-module-index { color: var(--text-3); font-size: 12px; }
.platform-module-icon { width: 56px; height: 56px; justify-self: end; opacity: 0.82;
                        transition: opacity 0.3s; }
.platform-module-icon img { display: block; width: 100%; height: 100%; object-fit: contain; }
.platform-module-icon .platform-module-icon-dark { display: none; }
.platform-module:hover .platform-module-icon { opacity: 1; }
:root[data-theme="dark"] .platform-module-icon-light { display: none; }
:root[data-theme="dark"] .platform-module-icon-dark { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .platform-module-icon-light { display: none; }
  :root:not([data-theme="light"]) .platform-module-icon-dark { display: block; }
}

/* 通用空状态：用同构深浅线稿区分“无结果 / 未运行 / 已清空”，不挪用告警样式。 */
.ui-empty {
  display: grid; justify-items: center; align-content: center; gap: 14px;
  box-sizing: border-box; width: 100%; padding: 34px 20px;
  border: 1px dashed var(--border); border-radius: 12px;
  background: color-mix(in srgb, var(--sunken) 54%, transparent); text-align: center;
}
.ui-empty-visual { display: block; width: 72px; height: 72px; opacity: 0.86; }
.ui-empty-visual img { display: block; width: 100%; height: 100%; object-fit: contain; }
.ui-empty-visual .ui-empty-icon-dark { display: none; }
:root[data-theme="dark"] .ui-empty-icon-light { display: none; }
:root[data-theme="dark"] .ui-empty-icon-dark { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .ui-empty-icon-light { display: none; }
  :root:not([data-theme="light"]) .ui-empty-icon-dark { display: block; }
}
.ui-empty-copy { display: grid; justify-items: center; gap: 5px; max-width: 560px; }
.ui-empty-title { color: var(--text); font-size: 15px; font-weight: 620; line-height: 1.45; }
.ui-empty-description { color: var(--text-3); font-size: 13px; line-height: 1.6; }
.ui-empty-action { margin-top: 3px; color: var(--accent-strong); font-size: 13px; font-weight: 570; }
.ui-empty--page { min-height: 220px; padding: 48px 24px; }
.ui-empty--page .ui-empty-visual { width: 96px; height: 96px; }
.ui-empty--page .ui-empty-title { font-family: var(--font-heading); font-size: 19px; }
.ui-empty--section .ui-empty-visual { width: 72px; height: 72px; }
.ui-empty--compact {
  grid-template-columns: 40px minmax(0, 1fr); justify-items: start; align-content: initial;
  gap: 12px; padding: 14px 0; border: 0; border-radius: 0; background: transparent; text-align: left;
}
.ui-empty--compact .ui-empty-visual { width: 40px; height: 40px; }
.ui-empty--compact .ui-empty-copy { justify-items: start; align-self: center; gap: 2px; }
.ui-empty--compact .ui-empty-title { font-size: 13.5px; }
.ui-empty--compact .ui-empty-description { font-size: 12px; }
@media (max-width: 559px) {
  .ui-empty { padding-right: 14px; padding-left: 14px; }
  .ui-empty--page { min-height: 180px; padding-top: 38px; padding-bottom: 38px; }
  .ui-empty--page .ui-empty-visual { width: 80px; height: 80px; }
  .ui-empty--section .ui-empty-visual { width: 64px; height: 64px; }
  .ui-empty--page .ui-empty-title { font-size: 17px; }
}
.platform-module-name { grid-column: 1 / -1; align-self: end; font-family: var(--font-heading);
                        font-size: 28px; font-weight: 600; }
.platform-module-description { color: var(--text-2); font-size: 13px; }
.platform-module-arrow { align-self: end; color: var(--text-3); font-size: 28px;
                         transition: transform 0.3s var(--ease-expo), color 0.3s; }
.platform-module:hover .platform-module-arrow { color: var(--text); transform: translateX(6px); }

/* 团队访问验证。门禁是用户真正看到的第一页，沿用首页的编辑部式大标题与暖色
 * 卡片，不再保留临时内联样式；未验证时隐藏不可访问的站内目录。 */
body:has(.gate-page) .site-header .inner { justify-content: space-between; }
body:has(.gate-page) .site-nav,
body:has(.gate-page) .mobile-site-menu { display: none; }
.gate-page {
  min-height: calc(100dvh - var(--header-h) - 112px);
  display: grid; grid-template-columns: minmax(0, 1.18fr) minmax(340px, 0.82fr);
  gap: clamp(48px, 9vw, 132px); align-items: center; padding: 72px 0;
}
.gate-intro { min-width: 0; }
.gate-intro h1 {
  max-width: 760px; margin: 12px 0 26px;
  font: 700 clamp(58px, 7.3vw, 104px)/0.98 var(--font-heading);
  letter-spacing: -0.055em;
}
.gate-intro > p:last-child {
  max-width: 560px; margin: 0; color: var(--text-2); font-size: 17px; line-height: 1.75;
}
.gate-card {
  padding: clamp(28px, 4vw, 48px); background: var(--panel-bg, var(--oat)); border-radius: 24px;
}
.gate-eyebrow {
  margin: 0 0 34px; color: var(--text-3); font-size: 11.5px;
  letter-spacing: 0.12em; text-transform: uppercase;
}
.gate-card h2 { margin: 0 0 12px; font: 700 34px/1.2 var(--font-heading); }
.gate-copy { margin: 0 0 28px; color: var(--text-2); font-size: 14px; line-height: 1.7; }
.gate-error {
  margin: -10px 0 20px; padding: 10px 12px; color: var(--danger);
  background: var(--danger-bg); border-left: 3px solid var(--danger); border-radius: 8px;
  font-size: 13px;
}
.gate-form { display: grid; gap: 10px; }
.gate-form label { color: var(--text-2); font-size: 12.5px; }
.gate-form input[type="password"] {
  width: 100%; min-width: 0; height: 50px; padding: 0 14px; font: inherit;
  color: var(--text); background: var(--input-bg, var(--surface)); border: 1px solid var(--input-line, var(--border));
  border-radius: 10px;
}
.gate-form input[type="password"]::placeholder { color: var(--text-3); }
.gate-form input[type="password"]:focus-visible {
  outline: 2px solid var(--accent-soft); outline-offset: 0; border-color: var(--accent);
}
@keyframes credential-shake {
  0%, 100% { transform: translateX(0); }
  20%, 60% { transform: translateX(-5px); }
  40%, 80% { transform: translateX(5px); }
}
input.credential-shake { animation: credential-shake 360ms ease-in-out; }
input[type="password"].credential-shake[aria-invalid="true"] { border-color: var(--danger, var(--error)); }
@media (prefers-reduced-motion: reduce) {
  input.credential-shake { animation: none; }
}
.gate-form .btn-primary { min-height: 50px; margin-top: 4px; border-radius: 10px; }
.gate-footnote { margin: 18px 0 0; color: var(--text-3); font-size: 11.5px; line-height: 1.6; }

.header-actions { display: flex; align-items: center; gap: 6px; flex: none; }
.header-action-slot { display: flex; justify-content: flex-end; flex: none; }
.header-action-bar {
  --action-duration: 260ms;
  --action-ease: cubic-bezier(0.22, 0.61, 0.36, 1);
  position: relative;
  isolation: isolate;
  padding: 2px;
  border: 1px solid transparent;
  border-radius: 12px;
  transition: gap var(--action-duration) var(--action-ease), background-color var(--action-duration) ease,
              border-color var(--action-duration) ease, box-shadow var(--action-duration) ease;
}
.header-action-bar:hover,
.header-action-bar:has(.header-action:focus-visible):not(.is-restoring-focus),
.header-action-bar.is-expanded {
  --action-duration: 420ms;
  --action-ease: var(--ease-expo);
  gap: 3px;
  border-color: var(--border);
  background: color-mix(in srgb, var(--surface) 88%, transparent);
  box-shadow: 0 8px 20px color-mix(in srgb, var(--text) 8%, transparent);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
}
.header-action-item { display: inline-flex; flex: none; position: relative; }
.header-action {
  appearance: none; border: 1px solid var(--border); background: transparent;
  color: var(--text-2); cursor: pointer; padding: 0;
  width: auto; min-width: 32px; height: 32px; gap: 0; border-radius: 9px; overflow: visible;
  display: inline-flex; align-items: center; justify-content: center;
  line-height: 1;
  transition: color 60ms cubic-bezier(0.165, 0.84, 0.44, 1),
              background-color 60ms cubic-bezier(0.165, 0.84, 0.44, 1),
              border-color 60ms cubic-bezier(0.165, 0.84, 0.44, 1),
              box-shadow 60ms cubic-bezier(0.4, 0, 0.2, 1),
              transform 80ms ease-out,
              padding var(--action-duration) var(--action-ease), gap var(--action-duration) var(--action-ease);
}
.header-action-bar .header-action-label {
  display: inline-block; max-width: 0; margin-left: 0; opacity: 0;
  overflow: hidden; white-space: nowrap; color: currentColor;
  font-size: 12px; font-weight: 560;
  transform: translateX(-4px); filter: blur(3px);
  transition: max-width var(--action-duration) var(--action-ease), margin-left var(--action-duration) var(--action-ease),
              opacity var(--action-duration) ease, transform var(--action-duration) var(--action-ease), filter var(--action-duration) ease;
}
.header-action-bar:hover .header-action,
.header-action-bar:has(.header-action:focus-visible):not(.is-restoring-focus) .header-action,
.header-action-bar.is-expanded .header-action {
  width: auto; min-width: 32px; padding: 0 9px; gap: 7px;
}
.header-action-bar:hover .header-action-label,
.header-action-bar:has(.header-action:focus-visible):not(.is-restoring-focus) .header-action-label,
.header-action-bar.is-expanded .header-action-label {
  max-width: 6em; margin-left: 1px; opacity: 1;
  transform: translateX(0); filter: blur(0);
}
@media (min-width: 641px) and (max-width: 1240px) {
  .header-action-bar:is(:hover, :has(.header-action:focus-visible):not(.is-restoring-focus), .is-expanded) { gap: 6px; }
  .header-action-bar:is(:hover, :has(.header-action:focus-visible):not(.is-restoring-focus), .is-expanded) .header-action {
    width: 32px; padding: 0; gap: 0;
  }
  .header-action-bar:is(:hover, :has(.header-action:focus-visible):not(.is-restoring-focus), .is-expanded) .header-action-label {
    max-width: 0; margin-left: 0; opacity: 0;
  }
}
.header-action:hover {
  color: var(--text); border-color: var(--border-strong);
  background: var(--control-hover);
  box-shadow: 0 1px 3px color-mix(in srgb, var(--text) 10%, transparent);
}
.header-action:active { transform: scale(0.94); }
.header-action:focus-visible {
  outline: none;
  border-color: var(--focus-ring);
  box-shadow: 0 0 0 2px var(--bg), 0 0 0 4px var(--focus-ring),
              0 2px 8px var(--focus-glow);
}
.header-action svg {
  width: 20px; height: 20px; fill: none; stroke: currentColor;
  stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round;
}
.theme-toggle .ico-sun { stroke-width: 1.95; }
.theme-toggle .ico-moon { stroke-width: 2.1; }
.header-action-bar .header-action svg { flex: none; }
.account-head { transform-box: fill-box; transform-origin: center; }
.bell-glyph { transform-box: view-box; transform-origin: 12px 12px; }
.book-upper, .book-lower, .sun-rays, .settings-gear-rotor { transform-box: view-box; transform-origin: 12px 12px; }
.account-entry:is(:hover, :focus-visible) .account-head { animation: header-action-account 520ms var(--ease-expo); }
#bell-toggle:is(:hover, :focus-visible) .bell-glyph { animation: header-action-bell 620ms ease-in-out; }
#changelog-toggle:is(:hover, :focus-visible) .book-upper { animation: header-action-book-upper 500ms var(--ease-expo); }
#changelog-toggle:is(:hover, :focus-visible) .book-lower { animation: header-action-book-lower 500ms var(--ease-expo); }
.theme-toggle:is(:hover, :focus-visible) .sun-rays { animation: header-action-theme 520ms var(--ease-expo); }
.settings-entry:is(:hover, :focus-visible) .settings-gear-rotor { animation: header-action-settings 620ms var(--ease-expo); }
@keyframes header-action-account {
  0%, 100% { transform: translateY(0) scale(1); }
  40% { transform: translateY(1.4px) scale(1.12, .72); }
  68% { transform: translateY(-.5px) scale(.96, 1.09); }
}
@keyframes header-action-bell {
  0%, 100% { transform: rotate(0); }
  22% { transform: rotate(17deg); }
  46% { transform: rotate(-13deg); }
  68% { transform: rotate(6deg); }
}
@keyframes header-action-book-upper {
  0%, 100% { transform: translate(0) scale(1); }
  46% { transform: translate(-.9px, 1px) scale(.91); }
  72% { transform: translate(.2px, -.2px) scale(1.02); }
}
@keyframes header-action-book-lower {
  0%, 100% { transform: translate(0) scale(1); }
  46% { transform: translate(.9px, -1px) scale(.91); }
  72% { transform: translate(-.2px, .2px) scale(1.02); }
}
@keyframes header-action-theme {
  0%, 100% { transform: scale(1); }
  44% { transform: scale(1.18); }
  72% { transform: scale(.97); }
}
@keyframes header-action-settings {
  0%, 100% { transform: rotate(0); }
  50% { transform: rotate(30deg); }
  74% { transform: rotate(-4deg); }
}
.bell-wrap { position: relative; display: inline-flex; }
.bell-badge {
  position: absolute; top: -5px; right: -5px; min-width: 16px; height: 16px; padding: 0 4px;
  border-radius: 999px; background: var(--danger); color: #fff; font-size: 10.5px; line-height: 16px;
  font-weight: 600; text-align: center; letter-spacing: 0; pointer-events: none;
  box-shadow: 0 0 0 2px var(--bg);
}
.bell-panel {
  position: absolute; right: 0; top: 40px; width: 340px; max-width: calc(100vw - 24px); max-height: 420px;
  overflow: auto; z-index: 60; background: var(--overlay-bg, var(--bg)); border: 1px solid var(--border); border-radius: 12px;
  box-shadow: 0 8px 28px rgba(0, 0, 0, 0.14); padding: 6px 0;
}
.bell-head { display: flex; justify-content: space-between; align-items: center; padding: 6px 14px 8px; font-weight: 600; }
.bell-readall { appearance: none; border: 0; background: transparent; color: var(--text-2); font-size: 12px; cursor: pointer; }
.bell-readall:hover { color: var(--text); text-decoration: underline; }
.bell-list { list-style: none; margin: 0; padding: 0; }
.bell-item { padding: 8px 14px; border-top: 1px solid var(--border); display: flex; flex-direction: column; gap: 2px; }
.bell-item a { color: var(--text); text-decoration: none; }
.bell-item a:hover { text-decoration: underline; }
.bell-unread a { font-weight: 600; }
.bell-body { font-size: 12px; }
.bell-empty { padding: 10px 14px; margin: 0; }
.account-entry svg { fill: none; stroke: currentColor; stroke-width: 1.6; }
/* 无 data-theme:跟随系统 → 亮色显 ☾、暗色显 ☀;手动设置后按 data-theme 定 */
.theme-toggle .ico-sun { display: none; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .theme-toggle .ico-sun { display: inline; }
  :root:not([data-theme="light"]) .theme-toggle .ico-moon { display: none; }
}
:root[data-theme="dark"] .theme-toggle .ico-sun { display: inline; }
:root[data-theme="dark"] .theme-toggle .ico-moon { display: none; }

/* 主题切换沿用 circle-blur 的 View Transition:新主题从按钮位置向外扩散,
 * 边缘先轻微模糊再收清,旧主题保持静止避免两层同时闪烁。 */
html[data-theme-transition="circle-blur"]::view-transition-old(root) {
  animation: none;
  mix-blend-mode: normal;
}
html[data-theme-transition="circle-blur"]::view-transition-new(root) {
  mix-blend-mode: normal;
  animation: theme-circle-blur-reveal 700ms cubic-bezier(0.4, 0, 0.2, 1);
}
@keyframes theme-circle-blur-reveal {
  from {
    clip-path: circle(0% at var(--theme-transition-origin, 50% 100%));
    filter: blur(8px);
  }
  to {
    clip-path: circle(150% at var(--theme-transition-origin, 50% 100%));
    filter: blur(0);
  }
}

/* 全站更新日志: 1:1 精确复刻 Claude "What's new" 原生模态窗 */
/* 通用设置：保持参考图的近全屏比例，但沿用磐隐的细边框和暖色面。 */
.settings-dialog {
  width: min(1536px, calc(100vw - 56px));
  height: min(1200px, calc(100dvh - 40px));
  max-width: none; max-height: none; min-height: min(620px, calc(100dvh - 40px)); padding: 0;
  color: var(--text); background: var(--surface);
  border: 1px solid var(--border-strong); border-radius: 17px;
  box-shadow: 0 30px 100px color-mix(in srgb, var(--text) 26%, transparent);
  overflow: hidden;
}
.settings-dialog::backdrop {
  background: color-mix(in srgb, var(--text) 52%, transparent);
  backdrop-filter: blur(7px) saturate(.82);
  -webkit-backdrop-filter: blur(7px) saturate(.82);
}
.settings-dialog[open] { animation: settings-dialog-enter 220ms var(--ease-expo); }
.settings-dialog[open]::backdrop { animation: settings-backdrop-in 220ms ease-out; }
@keyframes settings-dialog-enter {
  from { opacity: 0; transform: translateY(12px) scale(.985); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes settings-backdrop-in { from { opacity: 0; } to { opacity: 1; } }
.settings-shell { display: grid; grid-template-columns: 286px minmax(0, 1fr); height: 100%; }
.settings-sidebar {
  min-width: 0; padding: 18px 18px 24px; background: color-mix(in srgb, var(--sunken) 48%, var(--surface));
  border-right: 1px solid var(--border); overflow-y: auto;
}
.settings-search {
  position: relative; display: flex; align-items: center; height: 48px; margin-bottom: 30px;
  border: 1px solid var(--border-strong); border-radius: 10px; background: var(--surface);
  color: var(--text-2); transition: border-color 160ms ease, box-shadow 160ms ease;
}
.settings-search:focus-within { border-color: var(--border-strong); box-shadow: 0 0 0 3px color-mix(in srgb, var(--text) 8%, transparent); }
.settings-search svg { width: 21px; height: 21px; margin-left: 13px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; }
.settings-search input { width: 100%; height: 100%; padding: 0 13px 0 11px; border: 0; outline: 0; background: transparent; color: var(--text); font: inherit; font-size: 15px; }
.settings-search input::placeholder { color: var(--text-3); }
.settings-sidebar-heading { padding: 0 12px 18px; }
.settings-sidebar-kicker, .settings-main-kicker {
  display: block; color: var(--text-3); font-size: 10px; letter-spacing: .13em;
}
.settings-sidebar-heading h2 { margin: 0; font: 650 18px/1.2 var(--font-sans); letter-spacing: -.01em; }
.settings-sidebar-heading p { margin: 0; color: var(--text-2); font-size: 12px; line-height: 1.55; }
.settings-nav { display: grid; gap: 3px; }
.settings-nav-item {
  appearance: none; width: 100%; min-height: 44px; padding: 0 12px; display: flex; align-items: center; gap: 12px;
  border: 1px solid transparent; border-radius: 10px; background: transparent; color: var(--text-2);
  font: inherit; font-size: 15px; text-align: left; cursor: pointer;
  transition: color 150ms ease, background-color 150ms ease, border-color 150ms ease,
              box-shadow 150ms ease;
}
.settings-nav-item svg { width: 18px; height: 18px; flex: none; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.settings-nav-item:hover { color: var(--text); background: var(--oat); }
.settings-nav-item:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.settings-nav-item.is-active { color: var(--text); background: color-mix(in srgb, var(--surface) 68%, var(--oat)); border-color: var(--border); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--text) 5%, transparent); font-weight: 600; }
.settings-search-empty { margin: 16px 12px; color: var(--text-3); font-size: 12px; }
.settings-main { min-width: 0; display: flex; flex-direction: column; background: var(--surface); }
.settings-main-header { display: flex; flex: none; align-items: flex-start; justify-content: space-between; gap: 24px; padding: 34px 38px 26px; border-bottom: 1px solid var(--border); }
.settings-main-header h2 { margin: 0 0 7px; font: 650 22px/1.2 var(--font-sans); letter-spacing: -.025em; }
.settings-main-header p { margin: 0; color: var(--text-2); font-size: 13px; line-height: 1.55; }
.settings-close {
  appearance: none; flex: none; width: 34px; height: 34px; margin: -4px -5px 0 0; padding: 0;
  border: 1px solid transparent; border-radius: 9px; background: transparent; color: var(--text-2); cursor: pointer;
  display: inline-flex; align-items: center; justify-content: center; transition: color 140ms ease, background 140ms ease, border-color 140ms ease;
}
.settings-close:hover { color: var(--text); background: var(--sunken); border-color: var(--border); }
.settings-close:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.settings-close svg { width: 21px; height: 21px; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; }
.settings-content { min-height: 0; overflow-y: auto; padding: 0 38px 46px; }
.settings-panel { max-width: none; padding-top: 30px; animation: settings-panel-in 150ms var(--ease-expo); }
.settings-panel[hidden] { display: none; }
@keyframes settings-panel-in { from { opacity: .25; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.settings-panel-heading { padding: 0 0 13px; }
.settings-panel-heading h3 { margin: 0; color: var(--text); font-size: 17px; font-weight: 650; }
.settings-panel-heading p { margin: 5px 0 0; color: var(--text-3); font-size: 12px; }
.settings-row { display: flex; align-items: center; justify-content: space-between; gap: 28px; min-height: 88px; padding: 21px 0; border-top: 1px solid var(--border); }
.settings-row > div:first-child { min-width: 0; }
.settings-row h4 { margin: 0; color: var(--text); font-size: 15px; font-weight: 600; }
.settings-row p { max-width: 680px; margin: 5px 0 0; color: var(--text-2); font-size: 13px; line-height: 1.55; }
.settings-choice-group { display: inline-flex; flex: none; gap: 3px; padding: 3px; border: 1px solid var(--border); border-radius: 10px; background: var(--sunken); }
.settings-choice { appearance: none; min-height: 31px; padding: 0 11px; border: 1px solid transparent; border-radius: 7px; background: transparent; color: var(--text-2); font: inherit; font-size: 12px; cursor: pointer; transition: color 140ms ease, background-color 140ms ease, border-color 140ms ease, box-shadow 140ms ease; }
.settings-choice:hover { color: var(--text); }
.settings-choice.is-selected { color: var(--text); background: var(--surface); border-color: var(--border); box-shadow: 0 1px 4px color-mix(in srgb, var(--text) 10%, transparent); font-weight: 600; }
.settings-row-link { min-height: 76px; }
.settings-row-status { min-height: 76px; }
.settings-inline-link { appearance: none; flex: none; padding: 0; border: 0; background: transparent; color: var(--accent-strong); font: inherit; font-size: 12.5px; text-decoration: none; cursor: pointer; white-space: nowrap; }
.settings-inline-link:hover { text-decoration: underline; text-underline-offset: 3px; }
.settings-status, .settings-version { flex: none; color: var(--text-3); font-size: 12px; }
.settings-version { padding: 5px 8px; border: 1px solid var(--border); border-radius: 6px; font-family: var(--font-mono); }
.settings-note { display: flex; gap: 10px; align-items: flex-start; margin-top: 22px; padding: 13px 14px; border: 1px solid var(--border); border-radius: 9px; background: color-mix(in srgb, var(--sunken) 58%, transparent); }
.settings-note-mark { display: inline-flex; width: 18px; height: 18px; flex: none; align-items: center; justify-content: center; border: 1px solid var(--border-strong); border-radius: 50%; color: var(--text-2); font-size: 11px; }
.settings-note p { margin: 0; color: var(--text-2); font-size: 12px; line-height: 1.55; }
body.settings-open { overflow: hidden; }
body.settings-open { overflow: hidden; }
body.settings-open { overflow: hidden; }

/* 全站更新日志:原生 dialog 提供焦点圈定与 Esc 关闭，内容区独立滚动。 */
.changelog-dialog {
  width: min(520px, calc(100vw - 32px)); height: min(688px, calc(100dvh - 32px));
  max-width: none; max-height: none; padding: 0;
  color: var(--text); background: var(--overlay-bg, var(--surface));
  border: 1px solid var(--border); border-radius: 14px;
  box-shadow: 0 20px 48px -12px rgba(20, 20, 18, 0.22), 0 4px 16px rgba(20, 20, 18, 0.08);
  overflow: hidden;
  /* 标题栏底与版本号徽章底必须是同一个色:参考图实测两者都是 #F3F3F3(浅色)。
   * 提取成 token 而不是各写一遍,是为了「一样」由构造保证,不会改一处漏一处。 */
  --changelog-chip-bg: color-mix(in srgb, var(--text) 5%, var(--surface));
  /* 关闭按钮 hover 底板:--control-hover 在标题栏的 #F3F3F3 上几乎看不见,
   * 这里要的是「看得出来的一块深色圆角矩形」,故另起一档。 */
  --changelog-close-hover: color-mix(in srgb, var(--text) 16%, var(--surface));
  /* 标题栏底下的分隔细线:浅色主题要比 #898781 更浅、深色主题要比它更深,深浅方向
   * 相反,单个色 token 的取值做不到。--input-line 恰好就是这一对(浅 #DEDEDD /
   * 深 #414141,同为细线量级),直接借用;深色下它压得住 #292929 的栏底。 */
  --changelog-header-line: var(--input-line);
  /* 正文色比 --text 退一档(用户看过样张:太深)。要更浅就把 86% 调小,
   * 调到 100% 就是纯 --text;再浅一档则是 --text-2。 */
  --changelog-body: color-mix(in srgb, var(--text) 86%, var(--surface));
  /* 版本号文字:比 --text-2 再强调一点。用 text/surface 混合而不是直接换 --text,
   * 是为了浅色下更深、深色下更亮——两侧都加对比,方向不会在暗色主题里反过来。 */
  --changelog-version-fg: color-mix(in srgb, var(--text) 84%, var(--surface));
}
.changelog-dialog::backdrop {
  background: rgba(20, 20, 18, 0.44);
  backdrop-filter: blur(3px);
  -webkit-backdrop-filter: blur(3px);
}
.changelog-dialog[open] { animation: changelog-enter 180ms var(--ease-expo); }
.changelog-dialog[open]::backdrop { animation: changelog-backdrop-in 180ms ease-out; }
@keyframes changelog-enter {
  from { opacity: 0; transform: translateY(10px) scale(0.985); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes changelog-backdrop-in { from { opacity: 0; } to { opacity: 1; } }
.changelog-panel {
  display: flex; flex-direction: column; height: 100%;
  font-family: var(--font-body);
  color: var(--text);
}
.changelog-header {
  display: flex; align-items: center; justify-content: space-between; flex: none;
  height: 47px; padding: 0 18px 0 24px;
  background: var(--changelog-chip-bg);
  border-bottom: 1px solid var(--changelog-header-line);
}
.changelog-header h2 {
  margin: 0; color: var(--text); font-family: var(--font-heading);
  font-size: 16px; font-weight: 600; line-height: 22px; letter-spacing: -0.2px;
}
/* 关闭按钮:墨迹再缩 20%(14 -> 11.2px),笔画 1.7 -> 1.4 变细。
 * viewBox 与框同为 22px、path 内缩 5.4 => 墨迹 11.2px。 */
.changelog-close {
  appearance: none; width: 28px; height: 28px; flex: none; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  color: var(--text); background: transparent; border: 0;
  border-radius: 6px; cursor: pointer; transition: all 120ms ease-out;
}
.changelog-close:hover { background: var(--changelog-close-hover); }
.changelog-close:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 1px; }
.changelog-close svg { width: 22px; height: 22px; fill: none; stroke: currentColor;
                        stroke-width: 1.4; stroke-linecap: round; }
.changelog-content {
  flex: 1; min-height: 0; margin: 0; padding: 6px 24px 24px; overflow-y: auto; scrollbar-gutter: stable;
  overscroll-behavior: contain; scrollbar-width: thin; scrollbar-color: var(--border-strong) transparent;
  overflow-wrap: anywhere;
}
/* 说明文字常驻:它放在 .changelog-content **之外**,不随正文滚动。
 * 下方不留间距,滚动区的上边缘(正文被裁掉的那条线)就落在第二行字下划线的位置。 */
.changelog-intro {
  flex: none; margin: 0; padding: 14px 24px 0; color: var(--text-3);
  font-size: 12px; line-height: 17px; letter-spacing: -0.1px;
}
/* 每个版本保留完整日期和细分隔线；不再以同日特例挤掉日期行。 */
.changelog-day { padding: 20px 0 16px; border-top: 1px solid var(--changelog-header-line); }
.changelog-day:first-of-type { border-top: 0; padding-top: 0; }
/* 分批加载后,滚动区末尾多了一条常驻的状态条,最后一块版本块就不再是 :last-child。
 * 按元素类型取最后一节,收尾间距才不会被状态条顶掉。 */
.changelog-day:last-of-type { padding-bottom: 0; }
.changelog-day-heading {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  margin-bottom: 12px;
}
/* 日期标题使用 Anthropic Sans,正文与版本号仍使用 Anthropic Mono。 */
.changelog-day h3 {
  margin: 0; color: var(--text);
  font-family: var(--font-heading);
  font-size: 15px; font-weight: 700; line-height: 20px; letter-spacing: -0.2px;
  font-variant-numeric: lining-nums;
}
/* 日期数字稍放大,使其在中英混排时与汉字视觉高度相近。 */
.changelog-date-number { font-size: 18px; vertical-align: -1px; }
.changelog-date-unit { margin: 0 0.05em; font-size: 0.9em; }
/* 参考图的版本号胶囊只有底色、没有描边(实测底色到白底之间没有更暗的一行),
  底色的 token 与标题栏共用,保证两处永远同深。 */
.changelog-version {
  display: inline-flex; flex: none; align-items: center;
  height: 20px; padding: 0 6px;
  color: var(--changelog-version-fg); background: var(--changelog-chip-bg);
  border-radius: 6px; font: 12px/1 var(--font-mono);
  font-variant-numeric: tabular-nums; letter-spacing: normal;
}
.changelog-group { margin-top: 14px; }
.changelog-group:first-of-type { margin-top: 4px; }
.changelog-group h4 {
  margin: 0 0 8px; color: var(--text-3); font-family: inherit;
  font-size: 11px; font-weight: 600; line-height: 15px;
  letter-spacing: 0.05em; text-transform: uppercase;
}
/* 正文规格见 CLAUDE.md 第六节:15.5px / 行高 1.36 / 字距 -0.025em / 相邻条目 2px。
 * 字号用户看过样张后要求再小一号,故正文取 14.5px。字距 -0.01em 是用户要的「微收」:
 * 上界只到 -0.01 是因为最紧的一对(f/t)叠字距后是 0.84px,再收就贴到一起了。
 * 「紧凑」是硬要求,条目之间的呼吸感由行高给,不再额外加外边距。 */
.changelog-day ul {
  margin: 0; padding-left: 16px; list-style: disc; color: var(--changelog-body);
  font-size: 14.5px; line-height: 1.36; letter-spacing: -0.01em;
}
.changelog-day li { padding-left: 2px; }
/* 圆点与文字之间留出约 0.5em:标记里补三个不断行空格(标记字号 11px,每个 0.235em) */
.changelog-day li::marker { content: "•   "; font-size: 11px; color: var(--text-2); }
.changelog-day li + li { margin-top: 2px; }
.changelog-day code {
  padding: 0.12em 0.38em; color: var(--changelog-body); background: color-mix(in srgb, var(--text) 6%, var(--surface));
  border: 1px solid color-mix(in srgb, var(--text) 7%, transparent);
  border-radius: 4px; font: 0.9em/1.4 var(--font-mono);
  box-decoration-break: clone; -webkit-box-decoration-break: clone;
}
.changelog-empty { color: var(--text-2); font-size: 13px; text-align: center; margin: 24px 0; }
/* 分批加载状态条。正常到达底部时不出现(旧版也没有结尾提示),
 * 只在加载中与加载失败时占位——失败必须写在用户看得见的地方。 */
.changelog-more {
  display: flex; align-items: center; justify-content: center; gap: 8px;
  margin: 18px 0 0; color: var(--text-3); font-size: 12px; line-height: 17px;
}
.changelog-more[hidden] { display: none; }
.changelog-more[data-state="loading"] .changelog-more-text { color: var(--text-3); }
.changelog-more[data-state="error"] .changelog-more-text { color: var(--danger); }
.changelog-more-retry {
  padding: 3px 10px; color: var(--text-2); background: none; cursor: pointer;
  border: 1px solid var(--input-line); border-radius: 6px;
  font: inherit; font-size: 12px; line-height: 15px;
}
.changelog-more-retry[hidden] { display: none; }
.changelog-more-retry:is(:hover, :focus-visible) {
  color: var(--text); border-color: var(--border-strong);
}
.changelog-more-retry:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 1px; }
body.changelog-open { overflow: hidden; }

/* Claude 风格全站 Tooltip；由 app.js 接管原生 title，避免浏览器粗边框提示。 */
.app-tooltip {
  position: fixed; z-index: 1000; top: 0; left: 0;
  max-width: min(240px, calc(100vw - 16px)); min-height: 24px;
  padding: 3px 8px; border-radius: 6px;
  display: inline-flex; align-items: center;
  color: var(--tooltip-fg); background: var(--tooltip-bg);
  box-shadow: var(--tooltip-shadow);
  font-size: 13px; font-weight: 400; line-height: 18px;
  text-align: left; overflow-wrap: anywhere; pointer-events: none;
  opacity: 0; visibility: hidden;
  transform: translateY(2px) scale(0.98);
  transform-origin: center bottom;
  transition: opacity 60ms cubic-bezier(0.165, 0.84, 0.44, 1),
              transform 60ms cubic-bezier(0.165, 0.84, 0.44, 1),
              visibility 0s linear 60ms;
}
.app-tooltip[data-side="bottom"] { transform-origin: center top; }
.app-tooltip.is-visible {
  opacity: 1; visibility: visible; transform: translateY(0) scale(1);
  transition-delay: 0s;
}

/* ---------- 4. 卡片与分区 ---------- */

.card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
}
.card + .card, section.card { margin-bottom: 18px; }
.card-pad { padding: 16px 20px; }

.section-head { display: flex; align-items: baseline; gap: 10px; margin: 0 0 10px; }
.section-head .count { color: var(--text-3); font-size: 13px; font-weight: 400; }

/* 浅色无框点击模块:默认透明边,hover 显灰框(全站工具类) */
.hoverable {
  border: 1px solid transparent;
  border-radius: var(--radius);
  transition: border-color 0.3s;
}
.hoverable:hover { border-color: var(--border-strong); }

/* 详情页折叠分区 */
details.card { padding: 0; }
details.card > summary {
  list-style: none; cursor: pointer;
  padding: 13px 20px;
  display: flex; align-items: baseline; gap: 10px;
  font-size: 16px; font-weight: 600;
  border-radius: var(--radius);
}
details.card > summary::-webkit-details-marker { display: none; }
details.card > summary::before {
  content: "▸"; color: var(--text-3); font-size: 12px;
  transition: transform 0.45s cubic-bezier(0.16, 1, 0.3, 1);
  display: inline-block; translate: 0 -1px;
}
details.card:not(.disclosure-ready)[open] > summary::before,
details.card.is-open > summary::before { transform: rotate(90deg); }
details.card[open] > summary { border-bottom: 1px solid var(--border);
                               border-radius: var(--radius) var(--radius) 0 0; }
details.card > .body { padding: 14px 20px 18px; }
details.card.disclosure-ready > .body {
  opacity: 0; transform: translateY(-6px);
  transition: opacity 0.3s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.42s cubic-bezier(0.16, 1, 0.3, 1);
}
details.card.disclosure-ready.is-open > .body { opacity: 1; transform: translateY(0); }

/* ---------- 5. 表格 ---------- */

.table-scroll { overflow-x: auto; border-radius: var(--radius); }

table.data {
  border-collapse: collapse; width: 100%;
  font-size: 13.5px; line-height: 1.5;
}
table.data th, table.data td {
  padding: 8px 12px; text-align: left; vertical-align: top;
  border-bottom: 1px solid var(--border);
}
/* D1 的射程内:表头下边线是**静态**边,原先吃 --border-strong(hover 级深灰),
 * 与设计稿的表格一致降到 --border——全站 --border-strong 只出现在 :hover 里 */
table.data thead th {
  background: var(--sunken); color: var(--text-2);
  font-size: 12.5px; font-weight: 600; white-space: nowrap;
  border-bottom: 1px solid var(--border);
}
table.data tbody tr:last-child td { border-bottom: none; }
/* .num 工具类特异性低于 table.data td,需在此显式覆盖对齐 */
table.data th.num, table.data td.num,
table.kv th.num, table.kv td.num { text-align: right; }
/* V7 数字为扁平字形；表格数值单独补偿一档，使其与同列中文字段视觉等高。 */
table.data td.num, table.kv td.num { font-size: 15px; }
/* 行 hover 用 --oat 而非 --sunken:后者是表头底色,吸顶长表滚动时会与表头粘连 */
table.data tbody tr:hover td { background: var(--oat); }
/* 吸顶表头:仅整页长表(列表/运维)启用,吸在站头之下。
 * 注意不能包 overflow 容器,否则 sticky 相对滚动容器定位而失效 */
table.data.sticky thead th { position: sticky; top: var(--header-h); z-index: 5; }
/* 卡片内直贴顶部的表格:表头两角跟随卡片圆角 */
.card > table.data thead th:first-child { border-top-left-radius: var(--radius); }
.card > table.data thead th:last-child { border-top-right-radius: var(--radius); }

/* 键值小表(详情资质等):首列为行头 */
table.kv { border-collapse: collapse; width: 100%; font-size: 13.5px; }
table.kv th, table.kv td { padding: 7px 12px; border-bottom: 1px solid var(--border);
                           text-align: left; vertical-align: top; }
table.kv tr:last-child th, table.kv tr:last-child td { border-bottom: none; }
table.kv th { color: var(--text-2); font-weight: 500; white-space: nowrap; width: 9em; }

.row-title a { font-weight: 550; }
.row-title a:hover { text-decoration: underline; text-underline-offset: 3px; }

.deadline-soon { color: var(--amber); font-weight: 650; }
.deadline-past { color: var(--text-3); }

.fb-cell { color: var(--text-3); font-size: 12.5px; white-space: nowrap; }
.fb-cell .has { color: var(--text); font-weight: 600; }

.star { color: var(--accent); font-size: 13px; }

/* ---------- 6. 徽章 ---------- */

/* 设计稿的徽章是 20×20 正圆,但那份稿里只有单字母 A/B/C;实际模板还用 .badge 挂
 * 带文案的标签(/daily 的「意向·提前期」「78 分」、/policies 的「⭐ 优势契合」、
 * /pushes 的通道名),写死 width 会把它们压碎。改成 min-width:
 * 单字母恰好 20×20 得到设计稿要的正圆,长文案撑成同高药丸。
 * ⚠ 圆角必须写 999px 不能写 50%:50% 在被文案撑宽后会拉成椭圆。 */
.badge {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 20px; height: 20px; flex: none;
  /* 侧边距 5px 是量出来的:6px 时内容盒只剩 8px,「A」的字身宽 8.66px 会把徽章
   * 顶成 20.66×20 的微椭圆;5px 留出 10px 内容盒,A/B/C 三档都正好 20×20 */
  padding: 0 5px; border-radius: 999px;
  font-size: 11.5px; font-weight: 700; line-height: 1;
  color: var(--on-grade);
}
.badge-a { background: var(--grade-a); }
.badge-b { background: var(--grade-b); }
/* C 档单独吃 --on-grade-c:暗色下 --grade-c 压到 #57554E,再配 --on-grade 的黑字
 * 只有 2.47:1,徽章会变成「一个认不出字的灰点」。见 §1 该 token 的说明。 */
.badge-c { background: var(--grade-c); color: var(--on-grade-c); }
/* badge-p / badge-none / badge-tag 不在 U3 射程,各自的语义色照旧;
 * 它们排在 .badge 之后,自身的 color 声明覆盖上面的 --on-grade */
.badge-p { background: var(--danger-bg); color: var(--danger); }
.badge-none { background: transparent; color: var(--text-3); font-weight: 400; }

/* 覆盖/回验标记(详情需求比对) */
.cov { font-size: 13px; }
.cov-full { color: var(--ok); }
.cov-partial { color: var(--amber); }
.cov-gap { color: var(--danger); }

/* ---------- 7. 控件 ---------- */

input[type="text"], select {
  font: inherit; color: var(--text);
  background: var(--input-bg, var(--surface));
  border: 1px solid var(--input-line, var(--border));
  border-radius: 8px;
  padding: 5px 10px;
}
select {
  font-family: var(--font-sans);
  appearance: none; padding-right: 26px;
  background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6' viewBox='0 0 10 6'%3E%3Cpath d='M1 1l4 4 4-4' fill='none' stroke='%23888580' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 9px center;
}
input[type="text"]:focus-visible, select:focus-visible {
  outline: 2px solid var(--accent-soft); outline-offset: 0;
  border-color: var(--accent);
}
input[type="checkbox"] { accent-color: var(--accent); }

/* 主次按钮 hover 都保持原配色，只用 2.5% 的克制放大提示可点击。 */
.btn, .btn-primary {
  display: inline-flex; align-items: center; justify-content: center;
  font: inherit; font-family: var(--font-sans); cursor: pointer;
  border: 1px solid var(--border); border-radius: 8px;
  background: var(--control-bg, var(--sunken)); color: var(--text);
  padding: 5px 16px;
  transform-origin: center;
  transition: transform 160ms ease-out;
}
.btn:hover {
  color: var(--text); background: var(--selected-bg, var(--sunken)); border-color: var(--border);
  transform: scale(1.025);
}
/* ⚠ .btn-primary 必须排在 .btn 之后:两者 hover 特异性同为 (0,2,0),靠源码顺序决胜,
 * 而 /ai/baseline 的保存按钮用的是 class="btn btn-primary" 双类。
 * 主按钮吃 --text 底 + --bg 字:暗色下自动反转为米白底墨字,无需额外分支。 */
.btn-primary {
  background: var(--primary-bg, var(--text)); border-color: var(--primary-bg, var(--text)); color: var(--primary-fg, var(--bg));
  font-weight: 500;
}
.btn-primary:hover {
  color: var(--primary-fg, var(--bg)); background: var(--primary-hover, var(--text)); border-color: var(--primary-hover, var(--text));
  transform: scale(1.025);
}

/* ---------- 8. 筛选栏 ---------- */

form.filters {
  display: flex; flex-wrap: wrap; gap: 10px 16px; align-items: center;
  padding: 12px 16px; margin-bottom: 16px;
  font-size: 13.5px;
}
form.filters label { display: inline-flex; align-items: center; gap: 6px;
                     color: var(--text-2); max-width: 100%; }
/* 窄屏收口(0827):option 文案长的 select(/ai 的「方向」,固有宽度 387px)
 * 在 375px 视口下会把整页顶出横向滚动。label 封到筛选栏宽度,select 解掉
 * flex 项默认的 min-width:auto(= min-content = 最宽 option),否则压不动。
 * 宽屏有余量时两条都不生效,option 全文照旧显示。
 * text-overflow 各浏览器对 select 的支持不一,不支持的退回裁切=改前行为。 */
form.filters select { min-width: 0; text-overflow: ellipsis; }
form.filters .reset { color: var(--text-3); font-size: 13px; margin-left: 2px; }
form.filters .reset:hover { color: var(--text); }

/* ---------- 9. 分页 ---------- */

.pager {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  margin: 16px 0 4px; font-size: 14.5px;
}
.pager .info { color: var(--text-3); margin-right: 8px; }
.pager a, .pager .cur, .pager .gap {
  min-width: 30px; height: 30px; padding: 0 8px;
  display: inline-flex; align-items: center; justify-content: center;
  border-radius: 8px;
}
.pager a { border: 1px solid var(--border); color: var(--text-2); }
.pager a:hover { border-color: var(--border-strong); color: var(--text);
                 background: var(--sunken); }
/* 当前页码与主按钮同体系(实心墨块);字色吃 --bg 而非 --on-accent,
 * 否则暗色下会是「米白底 + 纯白字」,对比 ≈1.2:1 直接消失 */
.pager .cur { background: var(--text); color: var(--bg); font-weight: 600; }
.pager .gap { color: var(--text-3); }

/* ---------- 10. 待人工区 + 心跳状态条 ---------- */

.pending-box {
  border: 1px solid color-mix(in srgb, var(--danger) 42%, var(--border));
  border-left: 4px solid var(--danger);
  background: var(--danger-bg);
  border-radius: var(--radius);
  padding: 12px 16px 14px; margin-bottom: 18px;
}
.pending-box h2 { color: var(--danger); font-size: 15px; margin: 0 0 2px; }
.pending-box .table-scroll { background: var(--surface); border: 1px solid var(--border);
                             margin-top: 10px; }
.pending-details { margin: 0 0 28px; padding: 0 0 28px;
                   border-bottom: 1px solid var(--border); }
.pending-details-head { display: flex; align-items: baseline; gap: 10px;
                        margin: 0 0 10px; }
.pending-details-head h3 { margin: 0; font: 600 19px/1.3 var(--font-heading); }
.pending-details-head span { color: var(--text-3); font-size: 12.5px; }
.manual-review-guide { margin: 14px 0 4px; padding: 14px 16px;
                       border-left: 3px solid var(--accent); background: var(--sunken); }
.manual-review-reasons { max-width: 760px; margin: 14px 0 4px; padding: 14px 16px;
                         border: 1px solid var(--border); border-radius: 10px;
                         background: var(--surface); }
.manual-review-reasons h3 { margin: 0 0 7px; font-size: 15px; }
.manual-review-reasons .reasons { margin: 0; color: var(--text-2); font-size: 13px;
                                  line-height: 1.6; }
.manual-review-guide h3 { margin: 0 0 7px; font-size: 15px; }
.manual-review-guide ol { margin: 0; padding-left: 20px; color: var(--text-2);
                          font-size: 13px; line-height: 1.65; }
.manual-review-guide p { margin: 8px 0 0; color: var(--text-2);
                         font-size: 13px; line-height: 1.65; }
.manual-review-form {
  max-width: 760px; margin: 18px 0 6px; padding: 22px;
  border: 1px solid var(--border); border-radius: 14px; background: var(--surface);
}
.manual-grade-picker { margin: 0 0 18px; padding: 0; border: 0; }
.manual-grade-picker legend { margin-bottom: 9px; color: var(--text);
                              font-size: 13px; font-weight: 650; }
.manual-grade-picker label { display: inline-flex; margin-right: 7px; }
.manual-grade-picker input { position: absolute; width: 1px; height: 1px;
                             overflow: hidden; opacity: 0; }
.manual-grade-picker label span {
  min-width: 44px; height: 38px; display: inline-flex; align-items: center;
  justify-content: center; border: 1px solid var(--border); border-radius: 10px;
  color: var(--text-2); background: var(--sunken); font-weight: 650; cursor: pointer;
  transition: transform 100ms ease-out, color 120ms ease-out,
              background-color 120ms ease-out, border-color 120ms ease-out;
}
.manual-grade-picker label span:hover { transform: scale(1.025); color: var(--text); }
.manual-grade-picker input:checked + span {
  color: var(--bg); background: var(--text); border-color: var(--text);
}
.manual-grade-picker input:focus-visible + span {
  outline: 2px solid var(--focus-ring); outline-offset: 2px;
}
.manual-grade-picker small { display: block; margin-top: 9px; color: var(--text-3);
                             font-size: 12px; }
.manual-review-fields { display: grid; grid-template-columns: minmax(150px, 0.34fr) 1fr;
                        gap: 14px; }
.manual-review-fields label { display: flex; flex-direction: column; gap: 6px;
                              color: var(--text-2); font-size: 13px; }
.manual-review-fields input, .manual-review-fields textarea {
  width: 100%; min-width: 0; border: 1px solid var(--input-line, var(--border)); border-radius: 9px;
  padding: 10px 11px; color: var(--text); background: var(--input-bg, var(--bg)); font: inherit;
}
.manual-review-fields textarea { min-height: 86px; resize: vertical; line-height: 1.55; }
.manual-review-fields input:focus-visible, .manual-review-fields textarea:focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 1px; border-color: var(--border-strong);
}
.manual-review-error { min-height: 18px; margin: 7px 0 0; color: var(--danger);
                       font-size: 12.5px; }
.manual-review-status { margin: 7px 0 0; color: var(--text-2); font-size: 12.5px; }
.manual-review-actions { display: flex; flex-wrap: wrap; gap: 9px; }
.manual-review-actions .btn { min-height: 38px; padding: 7px 16px; }
.manual-archive-button { color: var(--danger); }
.manual-review-result {
  max-width: 760px; margin: 14px 0 4px; padding: 14px 16px;
  border-left: 3px solid var(--text); background: var(--sunken);
}
.manual-review-result strong { margin-right: 10px; font-size: 14px; }
.manual-review-result span { color: var(--text-3); font-size: 12px; }
.manual-review-result p { margin: 7px 0 0; color: var(--text-2); line-height: 1.6; }

/* 首页政策品牌信号带：橙色只承担栏目锚点，正文保持开放排版，待办统一进黑色区。 */
.policy-signal {
  display: grid; grid-template-columns: 96px minmax(0, 1fr) minmax(280px, 320px);
  min-height: 278px; margin: 18px 0 56px;
  border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
}
.policy-signal.pending-only {
  min-height: 0; grid-template-columns: minmax(280px, 320px); justify-content: end;
  border: 0;
}
.policy-signal-band, .policy-masthead-band {
  display: flex; flex-direction: column; align-items: center; justify-content: center;
  gap: 1px; min-width: 0; padding: 20px 10px;
  color: var(--on-accent); background: var(--accent);
}
.policy-signal-band { transition: background-color 160ms ease-out; }
.policy-signal-band:hover { color: var(--on-accent); background: var(--accent-strong); }
.policy-signal-band:focus-visible, .policy-archive-row:focus-visible {
  outline: 2px solid var(--accent); outline-offset: 3px;
}
.policy-signal-band strong, .policy-masthead-band strong {
  font-size: 44px; font-weight: 700; line-height: 1; letter-spacing: -0.04em;
}
.policy-signal-band span, .policy-masthead-band span {
  font-size: 12.5px; opacity: 0.9; white-space: nowrap;
}
.policy-signal-main { min-width: 0; padding: 22px 28px 20px; }
.policy-signal-heading { display: flex; align-items: flex-end; gap: 20px; margin-bottom: 8px; }
.policy-signal-kicker {
  margin: 0 0 2px; color: var(--policy-muted); font-size: 11.5px;
  font-weight: 650; letter-spacing: 0.1em;
}
.policy-signal-heading h1 {
  margin: 0; font: 600 clamp(26px, 2.35vw, 32px)/1.24 var(--font-heading);
  letter-spacing: -0.025em;
}
.policy-signal-all { margin-left: auto; padding-bottom: 3px; color: var(--text-2);
                     font-size: 13px; white-space: nowrap; }
.policy-signal-all:hover { color: var(--text); }
.policy-signal-list { list-style: none; margin: 0; padding: 0; }
.policy-signal-list li { border-top: 1px solid var(--border); }
.policy-signal-list a {
  display: grid; grid-template-columns: minmax(0, 1fr) auto 18px; gap: 14px;
  align-items: center; min-height: 39px; margin: 0 -10px; padding: 5px 10px;
  transition: background-color 160ms ease-out;
}
.policy-signal-list a:hover { background: var(--accent-soft); }
.policy-signal-title { min-width: 0; overflow: hidden; text-overflow: ellipsis;
                       white-space: nowrap; font-size: 14px; font-weight: 600; }
.policy-signal-priority { color: var(--accent); margin-right: 5px; font-size: 10px; }
.policy-signal-meta { color: var(--policy-muted); font-size: 11.5px; white-space: nowrap; }
.policy-signal-arrow, .policy-archive-arrow {
  color: var(--policy-muted); transition: transform 160ms ease-out, color 160ms ease-out;
}
.policy-signal-list a:hover .policy-signal-arrow,
.policy-archive-row:hover .policy-archive-arrow { color: var(--text); transform: translateX(4px); }
.policy-status-panel, .policy-composition {
  min-width: 0; padding: 25px 28px; color: var(--status-text);
  background: var(--status-panel);
}
.policy-status-panel { display: flex; flex-direction: column; }
.policy-status-panel h2, .policy-composition h2 {
  margin: 0; color: var(--status-muted); font-size: 12.5px; font-weight: 600;
  letter-spacing: 0.08em;
}
.policy-status-panel > strong {
  margin: 8px 0 3px; color: var(--accent); font-size: 62px; line-height: 1;
  letter-spacing: -0.05em;
}
.policy-status-panel p { margin: 7px 0 0; color: var(--status-muted);
                         font-size: 13px; line-height: 1.55; }
.policy-status-panel .policy-status-note { font-size: 12px; }
.policy-status-panel > a { margin-top: auto; padding-top: 16px; color: var(--status-text);
                           font-size: 13px; }
.policy-status-panel > a:hover { color: var(--accent); }

/* 政策栏目档案页：与首页复用信号带、近黑统计块与开放式索引语言。 */
.policy-masthead {
  display: grid; grid-template-columns: 96px minmax(0, 1fr) 300px;
  min-height: 318px; margin: 18px 0 58px;
  border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
}
.policy-masthead-main { min-width: 0; padding: 28px 34px 24px; }
.policy-masthead-main .backlink { display: inline-flex; min-height: 28px; align-items: center; }
.policy-masthead-main h1 {
  margin: 10px 0 13px; font: 600 clamp(36px, 4.2vw, 48px)/1.12 var(--font-heading);
  letter-spacing: -0.04em; text-wrap: balance;
}
.policy-masthead-main > p { max-width: 760px; margin: 0; color: var(--text-2);
                            font-size: 14px; line-height: 1.7; }
.policy-masthead-main .policy-updated { margin-top: 9px; color: var(--policy-muted);
                                       font-size: 12.5px; }
.policy-scope-note { max-width: 760px; margin-top: 12px; }
.policy-scope-note summary { width: fit-content; color: var(--text-2); font-size: 13px;
                             cursor: pointer; }
.policy-scope-note summary:hover { color: var(--text); }
.policy-scope-note > div { padding: 10px 0 0; }
.policy-scope-note p { margin: 0 0 7px; color: var(--text-2); font-size: 12.5px;
                       line-height: 1.65; }
.policy-composition { display: flex; flex-direction: column; justify-content: center; }
.policy-composition dl { margin: 10px 0 0; }
.policy-composition dl > div {
  display: flex; align-items: baseline; justify-content: space-between; gap: 18px;
  padding: 12px 0; border-top: 1px solid var(--status-line);
}
.policy-composition dt { color: var(--status-text); font-size: 14px; }
.policy-composition dd { order: -1; margin: 0; color: var(--accent);
                          font-size: 32px; font-weight: 700; line-height: 1; }

.policy-archive { scroll-margin-top: calc(var(--header-h) + var(--module-bar-h) + 18px); }
.policy-archive-heading { display: flex; align-items: baseline; gap: 14px; margin-bottom: 18px; }
.policy-archive-heading h2 {
  margin: 0; font: 600 clamp(27px, 3vw, 34px)/1.25 var(--font-heading);
  letter-spacing: -0.025em;
}
.policy-archive-heading > span { color: var(--policy-muted); font-size: 13px; }
.policy-archive-controls {
  display: flex; align-items: flex-end; justify-content: space-between; gap: 24px;
  padding-bottom: 18px; border-bottom: 1px solid var(--border);
}
.policy-tabs { display: flex; min-width: 0; gap: 24px; overflow-x: auto;
               scrollbar-width: thin; }
.policy-tabs a {
  position: relative; display: inline-flex; align-items: center; min-height: 44px;
  flex: none; color: var(--text-2); font-size: 14px; white-space: nowrap;
}
.policy-tabs a span { margin-left: 5px; color: var(--list-meta); font-size: 14px; }
.policy-tabs a:hover, .policy-tabs a.is-active { color: var(--text); }
.policy-tabs a.is-active::after {
  content: ""; position: absolute; left: 0; bottom: 0; width: 26px; height: 2px;
  background: var(--accent);
}
.policy-archive-search { display: flex; flex: 0 1 410px; align-items: center; gap: 8px;
                         min-width: 260px; }
.policy-archive-search label { position: relative; flex: 1; min-width: 0; }
.policy-archive-search svg { position: absolute; left: 13px; top: 50%; width: 15px;
                             height: 15px; transform: translateY(-50%);
                             fill: none; stroke: var(--text-3); stroke-width: 2; }
.policy-archive-search input {
  width: 100%; height: 42px; min-width: 0; padding: 8px 12px 8px 38px;
  font: inherit; font-size: 14px; color: var(--text); background: var(--input-bg, var(--surface));
  border: 1px solid var(--input-line, var(--border)); border-radius: 7px;
}
.policy-archive-search input:hover { border-color: var(--border-strong); }
.policy-archive-search .btn-primary { flex: none; min-height: 42px; padding: 7px 17px;
                                      border-radius: 7px; }
.policy-archive-header, .policy-archive-row {
  display: grid;
  grid-template-columns: 42px 88px 82px minmax(240px, 1fr) minmax(120px, 160px)
                         minmax(140px, 190px) 24px;
  grid-template-areas: "index date kind title org keywords arrow";
  gap: 14px; align-items: center;
}
.policy-archive-header { min-height: 40px; color: var(--policy-muted); font-size: 11.5px;
                         letter-spacing: 0.05em; }
.policy-archive-list { list-style: none; margin: 0; padding: 0;
                       border-top: 1px solid var(--border); }
.policy-archive-list li { margin: 0; border-bottom: 1px solid var(--border); }
.policy-archive-row {
  min-height: 74px; margin: 0 -10px; padding: 10px;
  transition: background-color 160ms ease-out;
}
.policy-archive-row:hover { color: var(--text); background: var(--accent-soft); }
/* V7 数字的实际字面较低：列表数据加大后与 12.5px 的分类中文视觉等高。 */
.policy-archive-index { grid-area: index; color: var(--list-meta); font-size: 14px;
                        font-variant-numeric: tabular-nums; }
.policy-archive-date { grid-area: date; color: var(--list-meta); font-size: 14px;
                       white-space: nowrap; }
.policy-archive-kind { grid-area: kind; color: var(--list-meta); font-size: 12.5px; }
.policy-archive-title { grid-area: title; min-width: 0; }
.policy-archive-title strong { display: -webkit-box; overflow: hidden;
                               font: 600 15.5px/1.4 var(--font-heading);
                               -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
.policy-archive-title small { display: block; margin-top: 2px; color: var(--accent-strong);
                              font-size: 11.5px; font-weight: 500; }
.policy-archive-org { grid-area: org; min-width: 0; color: var(--list-meta); font-size: 12px;
                      line-height: 1.4; overflow-wrap: anywhere; }
.policy-archive-org small { display: block; margin-top: 2px; color: var(--policy-muted);
                            font-size: 11px; }
.policy-archive-keywords { grid-area: keywords; display: flex; flex-wrap: wrap; gap: 4px;
                           color: var(--policy-muted); font-size: 11.5px; }
.policy-archive-keywords em { padding: 1px 5px; color: var(--text-2); background: var(--sunken);
                              border-radius: 4px; font-style: normal; white-space: nowrap; }
.policy-archive-arrow { grid-area: arrow; justify-self: end; font-size: 17px; }
.policy-pager { justify-content: flex-end; margin-top: 24px; }

@media (min-width: 768px) and (max-width: 1199px) {
  .policy-signal { grid-template-columns: 80px minmax(0, 1fr); min-height: 0; }
  .policy-signal-band { grid-row: 1 / 3; }
  .policy-status-panel {
    grid-column: 2; display: grid; grid-template-columns: auto auto minmax(0, 1fr) auto;
    align-items: center; gap: 16px; padding: 18px 24px;
  }
  .policy-status-panel > strong { margin: 0; font-size: 42px; }
  .policy-status-panel p { margin: 0; }
  .policy-status-panel .policy-status-note { display: none; }
  .policy-status-panel > a { margin: 0; padding: 0; white-space: nowrap; }
  .policy-signal.pending-only { display: flex; justify-content: flex-end; }
  .policy-signal.pending-only .policy-status-panel { width: min(100%, 760px); }

  .policy-masthead { grid-template-columns: 80px minmax(0, 1fr); min-height: 0; }
  .policy-masthead-band { grid-row: 1 / 3; }
  .policy-composition { grid-column: 2; padding: 16px 26px 19px; }
  .policy-composition dl { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .policy-composition dl > div { padding: 9px 16px; border-top: 1px solid var(--status-line);
                                 border-left: 1px solid var(--status-line); }
  .policy-composition dl > div:first-child { border-left: 0; }
  .policy-composition dd { font-size: 27px; }
  .policy-archive-controls { flex-wrap: wrap; }
  .policy-tabs { width: 100%; }
  .policy-archive-search { flex: 1 1 100%; max-width: none; }
  .policy-archive-header, .policy-archive-row {
    grid-template-columns: 42px 88px 82px minmax(220px, 1fr) minmax(130px, 180px) 24px;
    grid-template-areas: "index date kind title org arrow";
  }
  .policy-archive-keywords { display: none; }
}

@media (max-width: 767px) {
  .policy-signal, .policy-signal.pending-only, .policy-masthead {
    display: flex; flex-direction: column; min-height: 0; margin: 10px 0 44px;
    border: 0;
  }
  .policy-signal-band, .policy-masthead-band {
    flex-direction: row; min-height: 64px; gap: 8px; padding: 10px 16px;
  }
  .policy-signal-band strong, .policy-masthead-band strong { font-size: 36px; }
  .policy-signal-main { padding: 22px 0 18px; }
  .policy-signal-heading { align-items: flex-start; }
  .policy-signal-heading h1 { font-size: 25px; }
  .policy-signal-kicker { margin-bottom: 4px; }
  .policy-signal-all { padding-top: 5px; font-size: 12px; }
  .policy-signal-list a {
    grid-template-columns: minmax(0, 1fr) 18px; gap: 1px 10px;
    min-height: 58px; margin: 0; padding: 8px 2px;
  }
  .policy-signal-title { grid-column: 1; white-space: normal; display: -webkit-box;
                         -webkit-box-orient: vertical; -webkit-line-clamp: 2; }
  .policy-signal-meta { grid-column: 1; white-space: normal; }
  .policy-signal-arrow { grid-column: 2; grid-row: 1 / 3; align-self: center; }
  .policy-status-panel {
    display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 7px 18px;
    padding: 20px; min-height: 178px;
  }
  .policy-status-panel h2 { align-self: center; }
  .policy-status-panel > strong { margin: 0; font-size: 46px; }
  .policy-status-panel p, .policy-status-panel .policy-status-note,
  .policy-status-panel > a { grid-column: 1 / -1; margin: 0; padding: 0; }

  .policy-masthead-main { padding: 24px 0 22px; }
  .policy-masthead-main h1 { margin-top: 12px; font-size: 31px; }
  .policy-masthead-main > p { font-size: 13.5px; }
  .policy-composition { padding: 20px; }
  .policy-composition dl { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .policy-composition dl > div {
    display: flex; flex-direction: column; align-items: flex-start; gap: 7px;
    padding: 12px 10px; border-top: 1px solid var(--status-line);
    border-left: 1px solid var(--status-line);
  }
  .policy-composition dl > div:first-child { border-left: 0; padding-left: 0; }
  .policy-composition dt { font-size: 12px; white-space: nowrap; }
  .policy-composition dd { order: -1; font-size: 28px; }
  .policy-archive-heading { display: block; }
  .policy-archive-heading > span { display: block; margin-top: 3px; }
  .policy-archive-controls { display: flex; flex-direction: column; align-items: stretch;
                             gap: 12px; padding-bottom: 14px; }
  .policy-tabs { width: calc(100vw - 32px); gap: 22px; }
  .policy-archive-search { width: 100%; min-width: 0; flex-basis: auto; }
  .policy-archive-header { display: none; }
  .policy-archive-list { border-top: 0; }
  .policy-archive-row {
    grid-template-columns: auto minmax(0, 1fr) 24px;
    grid-template-areas: "date kind arrow" "title title arrow" "org org arrow";
    gap: 4px 10px; min-height: 124px; margin: 0; padding: 15px 2px;
  }
  .policy-archive-index, .policy-archive-keywords { display: none; }
  .policy-archive-date { align-self: center; }
  .policy-archive-kind { align-self: center; color: var(--policy-muted); }
  .policy-archive-title strong { font-size: 16px; }
  .policy-archive-org { padding-top: 2px; }
  .policy-archive-arrow { align-self: center; }
  .policy-pager { justify-content: flex-start; }
}

.statusbar {
  display: flex; flex-wrap: wrap; gap: 6px 22px; align-items: center;
  margin-top: 20px; padding: 10px 16px;
  font-size: 12.5px; color: var(--text-2);
}
.statusbar .item { display: inline-flex; align-items: center; gap: 7px; }
.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.dot-ok { background: var(--ok); }
.dot-warn { background: var(--danger); }

/* ---------- 11. 详情页 ---------- */

.backlink { font-size: 13px; color: var(--text-2); }
.backlink:hover { color: var(--text); }

.page-title { font-size: 20px; font-weight: 650; line-height: 1.4; margin: 8px 0 14px; }

.anchor-nav { display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 16px; }
.anchor-nav a {
  font-size: 12.5px; color: var(--text-2);
  border: 1px solid var(--border); border-radius: 999px;
  padding: 3px 12px; background: var(--surface);
}
.anchor-nav a:hover { color: var(--text); border-color: var(--border-strong); }

/* 关键信息网格 */
.meta-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
  gap: 0; margin: 0;
}
.meta-grid > div { padding: 10px 20px; border-bottom: 1px solid var(--border);
                   border-right: 1px solid var(--border); }
.meta-grid dt { font-size: 12px; color: var(--text-3); margin-bottom: 1px; }
.meta-grid dd { margin: 0; font-size: 13.5px; }
.meta-grid .wide { grid-column: 1 / -1; border-right: none; }

.judge-verdict { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap;
                 margin: 2px 0 6px; }
.judge-verdict .badge { font-size: 14px; padding: 2px 12px; }

ul.reasons { margin: 6px 0 4px; padding-left: 20px; }
ul.reasons li { margin: 2px 0; }

pre.raw {
  white-space: pre-wrap; word-break: break-word;
  background: var(--sunken); border: 1px solid var(--border);
  border-radius: 8px; padding: 12px 14px;
  font-size: 12.5px; line-height: 1.7; color: var(--text-2);
  max-height: 480px; overflow-y: auto;
}
pre.raw-full { max-height: none; font-size: 13px; color: var(--text); }
.att-actions a { color: var(--accent-strong); }
.att-actions a + a, .att-actions a + span { margin-left: 10px; }
details.fulltext > summary { cursor: pointer; color: var(--text-3); font-size: 12.5px; }
details.fulltext > summary:hover { color: var(--text); }

.meta-line { color: var(--text-3); font-size: 12px; margin-top: 10px; }

/* 反馈表单 */
form.feedback { display: flex; flex-wrap: wrap; gap: 10px 14px; align-items: center;
                margin: 10px 0 6px; }
/* 反馈按钮按参考图重画：窄袖口、无底色、无外框。 */
.fb-cell { display: flex; gap: 12px; }
.fb-cell form { display: inline-flex; margin: 0; }
.fbbtn-mini {
  appearance: none; display: inline-flex; align-items: center; justify-content: center;
  width: 48px; height: 48px; padding: 0;
  border: 0; border-radius: 10px; background: transparent; color: var(--text);
  cursor: pointer; opacity: 1;
  transition: color 120ms ease-out, background-color 120ms ease-out, opacity 120ms ease-out, transform 80ms ease-out;
}
.fbbtn-mini:hover { color: var(--text); background: var(--sunken); transform: none; }
.fbbtn-mini:active { transform: scale(.92); }
.fbbtn-mini:focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 2px; opacity: 1;
}
.fbbtn-mini.fbbtn-active { color: var(--accent-strong); opacity: 1; }
.fb-icon {
  width: 24px; height: 24px; overflow: visible; fill: none; stroke: currentColor;
  stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round;
}
.fbbtn-mini .fb-icon { transform: translateY(1.5px); }
.opportunity-feedback { gap: 12px; }
.feedback-result-icon { display: inline-flex; align-items: center; gap: 6px; }
.feedback-result-icon .fb-icon { width: 18px; height: 18px; }
/* 就地提交(0905):提交中按钮变淡;结果提示紧跟按钮,登录提示带链接 */
.fb-cell[aria-busy="true"] .fbbtn-mini { opacity: .55; cursor: progress; }
.fb-note { align-self: center; font-size: 12px; color: var(--text-3); white-space: nowrap; }
.fb-note a { color: var(--accent-strong); text-decoration: underline; }

/* ---------- 12. 返回顶部 ---------- */

.back-top {
  position: fixed; right: 28px; bottom: 28px; z-index: 40;
  width: 38px; height: 38px; border-radius: 50%;
  border: 1px solid var(--border);
  background: var(--surface); color: var(--text-2);
  cursor: pointer; box-shadow: var(--shadow);
  display: none; align-items: center; justify-content: center;
}
.back-top-icon {
  width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 1.8;
  stroke-linecap: round; stroke-linejoin: round;
}
.back-top.show { display: inline-flex; }
.back-top:hover { color: var(--text); border-color: var(--border-strong); }
@media (min-width: 641px) {
  .back-top {
    width: 46px; height: 46px; border-color: var(--text);
    background: var(--text); color: var(--bg);
  }
  .back-top-icon { width: 22px; height: 22px; stroke-width: 2.5; }
  .back-top:hover { background: var(--accent); color: var(--on-accent); border-color: var(--accent); }
}

/* ── 招标日报(/daily):手机上一屏看完一条,按钮直达原文 ────────────── */
.seg-title { margin: 18px 0 10px; font-size: 15px; color: var(--text-2, var(--text)); }

.brief-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
  padding: 14px 16px;
  margin-bottom: 12px;
}
.brief-head { display: flex; align-items: center; gap: 8px; }
.brief-no {
  display: inline-flex; align-items: center; justify-content: center;
  min-width: 22px; height: 22px; border-radius: 6px;
  background: var(--sunken); font-size: 12px;
}
.brief-title { margin: 6px 0 8px; font-size: 16px; line-height: 1.4; }
.brief-title a { text-decoration: none; }
.brief-meta {
  display: flex; flex-wrap: wrap; gap: 6px 14px;
  margin: 0 0 10px; font-size: 13px; color: var(--text-2, inherit);
}
.brief-label {
  margin: 10px 0 4px; font-size: 12px; font-weight: 600;
  color: var(--text-3, inherit);
}
.brief-list { margin: 0; padding-left: 18px; font-size: 13px; line-height: 1.7; }
.brief-actions { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 0; }
/* Keep flex on an inner wrapper, never on the table cell itself. */
.brief-actions.table-actions { margin: 0; }
.brief-actions .btn { padding: 4px 12px; font-size: 13px; text-decoration: none; }
.btn-ghost { background: transparent; }

/* 手机窄屏:元信息改为纵排,按钮撑满一行更好点 */
@media (max-width: 480px) {
  .brief-meta { flex-direction: column; gap: 3px; }
  .brief-actions .btn { flex: 1 1 auto; text-align: center; }
}
.brief-scope { margin: 0 0 8px; font-size: 13px; line-height: 1.6; }

/* 看板筛选页签与历史推送(0824) */
.board-note { margin: 0 0 12px; line-height: 1.7; }
.board-tabs { display: flex; gap: 6px; margin: 0 0 14px; flex-wrap: wrap; }
/* --line / --card 从未定义过,整条声明作废 → 药丸此前根本没有边框、底色透明;
 * 收口到既有 token(顺带修复的既有缺陷) */
.board-tabs a {
  padding: 5px 14px; border: 1px solid var(--border); border-radius: 999px;
  font-size: 13px; text-decoration: none; color: var(--text-2); background: var(--surface);
}
.board-tabs a:hover { border-color: var(--border-strong); }
.board-tabs a.active {
  background: var(--accent); border-color: var(--accent);
  color: var(--on-accent); font-weight: 500;
}
.board-pager { justify-content: center; margin: 22px 0 8px; }
.board-opportunity { scroll-margin-top: calc(var(--header-h) + var(--module-bar-h) + 14px); }
/* Reference horizontal resource cards: colored artwork left, structured content right. */
.board-opportunity { display: grid; grid-template-columns: 190px minmax(0, 1fr);
  padding: 0; overflow: hidden; border-radius: 16px; box-shadow: none; margin-bottom: 16px; }
.board-art { display: flex; align-items: center; justify-content: center; }
.board-art-tender { background: #DB6E4F; }
.board-art-intent { background: #6196CB; }
.board-art img { display: block; width: 100%; height: auto; }
.board-content { min-width: 0; padding: 9px 26px; overflow-wrap: anywhere; }
.board-content .brief-head { flex-wrap: wrap; }
.board-content .brief-title { font-family: var(--font-heading); font-size: 20px; font-weight: 600; margin: 6px 0; }
.board-content .brief-meta { gap: 8px 22px; padding: 6px 0; border-bottom: 1px solid var(--border); }
.board-decision { display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px 14px; margin: 6px 0; }
.board-decision .brief-label, .board-decision p { margin: 0; }
.board-decision p { font-size: 14px; }
.board-gap-note { font-size: 12px; color: var(--text-2); }
.board-detail-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 6px 0 8px; }
.board-detail { min-width: 0; border-radius: 12px; background: var(--sunken); padding: 0 14px; }
.board-detail > summary { padding: 8px 0; cursor: pointer; font-size: 13px; }
.board-detail > summary span { color: var(--text-3); font-size: 12px; margin-left: 8px; }
.board-detail .brief-list { padding-bottom: 14px; margin-bottom: 0; }
.board-match { margin: 0; padding-bottom: 14px; font-size: 13px; line-height: 1.7; }
.board-match > div + div { margin-top: 10px; }
.board-match dt { color: var(--text-3); font-size: 12px; }
.board-match dd { margin: 2px 0 0; }
.board-scope { margin-bottom: 10px; font-size: 13px; }
.board-scope > summary { cursor: pointer; color: var(--text-2); }
.board-scope .brief-scope { margin-top: 8px; }
.board-content .brief-actions { margin-bottom: 0; }


/* 当前页快速定位轨道:10px 节距增加 30%；默认显色 .48 × 1.2，当前项完整显色。
 * 静止时等长，悬停时由 JS 按距离写入近似高斯分布的伸长量。 */
.opportunity-rail {
  position: fixed; z-index: 38; left: 22px; top: 50%;
  transform: translateY(-50%); padding: 9px 8px;
  background: transparent; border: 0; box-shadow: none;
}
.opportunity-rail ol { list-style: none; margin: 0; padding: 0; }
.opportunity-rail li { height: 13px; margin: 0; padding: 0; }
.opportunity-rail-link {
  position: relative; display: flex; align-items: center;
  width: 54px; height: 13px; text-decoration: none;
  background: transparent;
  opacity: .576; transition: opacity 120ms ease-out;
}
.opportunity-rail-bar {
  display: block; width: calc(22px + var(--rail-hover-stretch, 0px));
  height: 3px; border-radius: 999px;
  transform: scaleX(var(--rail-scale, 1)); transform-origin: left center;
  transition: width 180ms var(--ease-expo), transform 220ms var(--ease-expo);
}
.opportunity-rail-link.grade-a .opportunity-rail-bar,
.opportunity-rail-link.grade-a .opportunity-rail-grade { background: var(--grade-a); color: var(--on-grade); }
.opportunity-rail-link.grade-b .opportunity-rail-bar,
.opportunity-rail-link.grade-b .opportunity-rail-grade { background: var(--grade-b); color: var(--on-grade); }
.opportunity-rail-link.grade-c .opportunity-rail-bar,
.opportunity-rail-link.grade-c .opportunity-rail-grade { background: var(--grade-c); color: var(--on-grade-c); }
.opportunity-rail-link:hover,
.opportunity-rail-link:focus-visible,
.opportunity-rail-link.is-active { opacity: 1; }
.opportunity-rail-link:focus-visible { outline: none; }
.opportunity-rail-link:focus-visible .opportunity-rail-bar {
  outline: 2px solid var(--focus-ring); outline-offset: 3px;
}
.opportunity-rail-tooltip {
  position: absolute; left: 58px; top: 50%;
  width: max-content; max-width: min(360px, calc(100vw - 110px));
  padding: 11px 13px 12px; border-radius: 12px;
  background: var(--tooltip-bg); color: var(--tooltip-fg);
  box-shadow: var(--tooltip-shadow); pointer-events: none;
  opacity: 0; visibility: hidden; filter: blur(6px); transform: translate(5px, -50%);
  transition: opacity 120ms ease-out, filter 180ms var(--ease-expo), transform 160ms var(--ease-expo), visibility 0s 180ms;
}
.opportunity-rail-tooltip::before {
  content: ""; position: absolute; right: 100%; top: 50%;
  border: 6px solid transparent; border-right-color: var(--tooltip-bg);
  transform: translateY(-50%);
}
.opportunity-rail-link:hover .opportunity-rail-tooltip,
.opportunity-rail-link:focus-visible .opportunity-rail-tooltip {
  opacity: 1; visibility: visible; filter: blur(0); transform: translate(0, -50%);
  transition-delay: 80ms, 80ms, 80ms, 0s;
}
.opportunity-rail-meta {
  display: flex; align-items: center; gap: 8px; margin-bottom: 6px;
  color: color-mix(in srgb, var(--tooltip-fg) 72%, transparent);
  font-size: 12px; line-height: 1;
}
.opportunity-rail-grade {
  display: inline-flex; min-width: 29px; height: 20px; padding: 0 7px;
  align-items: center; justify-content: center; border-radius: 999px;
  font-size: 11px; font-weight: 700;
}
.opportunity-rail-tooltip strong {
  display: block; overflow-wrap: anywhere; font-size: 14.5px;
  font-weight: 700; line-height: 1.45;
}
@media (max-width: 1180px), (max-height: 520px) {
  .opportunity-rail { display: none; }
}
.push-list { list-style: none; margin: 0; padding: 0; }
.push-item {
  display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap;
  padding: 7px 0; border-bottom: 1px solid var(--border); font-size: 13px; line-height: 1.6;
}
.push-item:last-child { border-bottom: none; }
.push-time { color: var(--text-3); font-variant-numeric: tabular-nums; }

/* 极窄屏动作按钮继续保持紧凑；主导航由 §16 的独立手机菜单接管。 */
@media (max-width: 560px) {
  .header-action { width: 30px; height: 30px; }
}

/* 规格书 §五 标注徽章(0824):重点单位/大额/制造标杆 */
.badge-tag { background: var(--accent); color: var(--on-accent); }

/* ---------- 13. /ai 情报板结构层(设计稿移植,只服务 /ai) ---------- */
/* 来源:docs/specs/2026-08-27-AI板块设计稿-参考实现.html(用户已确认的参考实现)。
 * 数值/选择器/曲线照抄,只做三处生产化调整,各自就近注明。
 * 这一节的类名全是新增的,商机侧页面不受影响;唯一与全站共享的 .section-head
 * 一律用 .section 前缀圈住,不动其它页面的分区标题。 */

/* 桌面首页对齐参考图：正文占可用宽度 85%，两侧各留 7.5%。
 * 额外 56px 抵消容器内距；按 main 标记限定，软导航离开后自动恢复。 */
@media (min-width: 1280px) {
  .wrap.ai-frontier-page,
  body:has(main.ai-frontier-page) .site-header .inner,
  body:has(main.ai-frontier-page) .module-bar-inner {
    width: calc(85% + 56px); max-width: none;
  }
  .ai-frontier-page .marquee-label { max-width: none; }
}

.hero { display: grid; grid-template-columns: 22% 1fr; gap: 36px;
        padding: 64px 0 40px; align-items: start; }
.hero-label { font-size: 20px; font-weight: 700; margin: 0 0 18px; }
.hero-desc { color: var(--text-2); margin: 0 0 24px; max-width: 30ch;
             font-size: 14px; line-height: 1.7; }
.hero-brief-text { transform: translateY(1px); }
.hero-stats { margin: 26px 0 0; padding-top: 18px; border-top: 1px solid var(--border);
              display: grid; gap: 8px; font-size: 13px; line-height: 1.6; }
.hero-stats > div, .hero-pending-link { display: flex; align-items: baseline;
                                      justify-content: space-between; gap: 16px; }
.hero-stats dt { color: var(--text-2); }
.hero-stats dd { margin: 0; color: var(--text); font-variant-numeric: tabular-nums;
                 white-space: nowrap; }
.hero-pending { margin-top: 24px; font-size: 13px; line-height: 1.6; }
.hero-pending-link { color: var(--text-2); font-variant-numeric: tabular-nums; }
.hero-pending-link > span:last-child { white-space: nowrap; }
.hero-pending-link:hover { color: var(--text); text-decoration: underline;
                           text-underline-offset: 4px; }
.hero-note { margin: 8px 0 0; color: var(--text-3); font-size: 12px; line-height: 1.7; }
.hero-source-gap { margin-top: 18px; color: var(--text-2); }
/* 入报为空但存在待校验条目时保留醒目状态，不把处理异常美化成无消息。 */
.hero-pending-empty .hero-pending-link, .hero-pending-status { color: var(--danger); }
.hero-pending-status { margin: 8px 0 0; font-size: 12px; font-weight: 500; }

/* 方向详情保留完整的待校验告警卡，避免把判定异常误读为今日无信号。
 * 首页使用上方独立的轻量状态行，不改变详情页的告警权重。 */
.cats-alert {
  margin: 0 0 14px; padding: 8px 14px;
  border: 1px solid color-mix(in srgb, var(--danger) 42%, var(--border));
  border-left: 4px solid var(--danger);
  background: var(--danger-bg); border-radius: var(--radius);
  color: var(--text-2); font-size: 13px; line-height: 1.6;
}
.cats-alert b { color: var(--danger); }

/* 11 个方向分为 5 个核心方向与 6 个次要方向。 */
.cats { display: grid; grid-template-columns: minmax(0, 3fr) minmax(0, 2fr);
        gap: 0 48px; align-items: start; }
.cats-col {
  display: flex; flex-direction: column; align-items: center; justify-content: space-between;
  text-align: center;
}
.cat { display: block; width: 100%; padding: 1px 0; cursor: pointer; }
.cat-head { display: inline-flex; align-items: center; justify-content: center;
            gap: 10px; padding: 3px 0; width: 100%; }
/* 字号必须跟视口走:固定 50px 时 8 字标题要 400px 而列宽只有 391px,会折行(实测) */
.cat-title {
  font-family: var(--font-heading); font-size: clamp(23px, 2.5vw, 32px);
  font-weight: 700; line-height: 1.3; margin: 0; color: var(--text);
  letter-spacing: 0.01em;
  transition: font-size 0.5s var(--ease-expo), color 0.4s var(--ease-expo);
}
.cats-col-primary .cat-title {
  font-size: clamp(36px, 3.75vw, 48px);
}
.cat-arrow {
  justify-content: flex-start; align-items: center;
  width: 1em; height: 0.75em; flex: none;
  font-family: var(--font-heading); font-size: clamp(23px, 2.5vw, 32px);
  line-height: 1; color: var(--text-3);
  display: inline-flex; transform: translateX(-0.2em);
  transition: color 0.3s, transform 0.3s;
}
.cats-col-primary .cat-arrow { font-size: clamp(36px, 3.75vw, 48px); }
.cat-arrow svg { display: block; width: 100%; height: 100%; }
/* U7:静止态 11 个标题必须同色(全 --text)。虚化只由「鼠标真的压在某个方向上」
 * 触发,空方向不许默认渲染成浅色——那会让人以为虚化坏了。此处**不得**新增
 * .cat-empty .cat-title 之类的颜色规则。
 * ⚠ 触发写 .cats:hover 会有「全灭」态:两列之间 40px 的 gap、以及较短那列下方的
 * 空白都属于 .cats 自己(align-items:start,列高只到内容),鼠标落在那里时 11 个
 * 标题一起虚化而无一被拉回主色,整个方向区看起来像失焦/加载失败——而那正是鼠标
 * 从一列滑到另一列的必经路径。:has(…:hover) 把触发收到「某个 .cat 自己被指着」。
 * 不支持 :has 的浏览器整条规则失效 = 不虚化、标题保持主色,可接受的降级。
 * ⚠ .cat 必须包在 :where() 里,这不是风格问题:裸写 .cats:has(.cat:hover) .cat-title
 * 是 (0,4,0),会压过下面那条把被指着的标题拉回主色的 (0,3,0) —— 于是**每次**悬停
 * 都全灭,比原缺陷更糟。:where() 特异性恒为 0,整条回到与原 .cats:hover 逐位相同的
 * (0,3,0):下面的拉回靠源码顺序取胜(原来也是这么赢的),≤900px 的关闭规则也照旧
 * 压得住,一处都不用改。改这两行前先算特异性。 */
/* 键盘那一支用 :focus-visible 而不是 :focus-within(0827 用户实测):.cat 就是
 * 那个 <a>,鼠标点它会留下焦点,:focus-within 于是在点击后一直命中——用户点完
 * 标题回来,该方向就永久停在展开态,与「移上去才展开」的设计相反。
 * :focus-visible 只在 UA 判定该显示焦点时命中(键盘 Tab 命中、鼠标点击不命中),
 * 键盘可达性一分不少。特异性与 :focus-within 同为 (0,1,0),整条仍是 (0,3,0),
 * 下面的拉回规则照旧靠源码顺序取胜,≤900px 的关闭规则也不用动。 */
.cats:has(:where(.cat):hover) .cat-title,
.cats:has(:where(.cat):focus-visible) .cat-title {
  color: var(--faded); font-size: clamp(24px, 2.5vw, 32px);
}
.cats:has(:where(.cat):hover) .cat-arrow,
.cats:has(:where(.cat):focus-visible) .cat-arrow { color: var(--faded); }
.cat:hover .cat-title, .cat:focus-visible .cat-title {
  color: var(--text); font-size: clamp(38px, 4vw, 52px); white-space: nowrap;
}
.cat:hover .cat-arrow, .cat:focus-visible .cat-arrow {
  color: var(--text); transform: translateX(0);
}

.cat-body { display: grid; grid-template-rows: 0fr;
            transition: grid-template-rows 0.5s var(--ease-expo); }
.cat:hover .cat-body, .cat:focus-visible .cat-body { grid-template-rows: 1fr; }
/* ⚠ 0fr 实为 minmax(auto, 0fr):子项必须 overflow:hidden;min-height:0 才压得下去,
 * 否则 11 个方向进页面就全是展开的。选择器跟着标记走(> *,别写死 > div)。 */
.cat-body > * { overflow: hidden; min-height: 0; }
.cat-inner { max-width: 46ch; margin: 0 auto; padding: 12px 0 8px; text-align: left; }
.cat-list { list-style: none; margin: 0; padding: 0; }
.cat-list li { display: flex; gap: 12px; align-items: baseline; padding: 8px 12px;
               border: 1px solid transparent; border-radius: 8px;
               transition: border-color 0.3s; }
.cat-list li:hover { border-color: var(--border-strong); }
.cat-list .t { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.55; }
.cat-list .src { font-size: 12.5px; color: var(--text-3); white-space: nowrap; }
.cat-none { padding: 2px 12px 10px; font-size: 13.5px; color: var(--text-3); margin: 0; }
/* 「累计 0 条 · 信源缺口」是 R1 在消费侧的核心区分信号(「压根没监控」≠「今天没消息」),
 * 必须比周围正文更显眼。设计稿这里是 --accent,但 #D97757 on #FAF9F5 实算 2.96:1,
 * 比旁边 --text-3 的正文(3.37:1)还淡——强调反成弱化。改吃 --danger:
 * 亮 5.18:1、暗 6.52:1,且「信源缺口」本就是缺陷告警而非强调色。
 * .dir-gap b:方向页(§14)那句「累计 0 条 · 信源缺口」是同一句话、同一档强调,
 * 共用这一条,别让两处分头漂移。 */
.cat-none b, .dir-gap b { font-weight: 500; color: var(--danger); }
/* 第 4 条只露上半截:mask 的 #000 是**透明度斜坡**不是颜色(alpha 之外的分量不参与
 * 遮罩计算),没有主题维度,故不走 token */
.peek {
  position: relative; height: 34px; overflow: hidden;
  -webkit-mask-image: linear-gradient(to bottom, #000 0%, transparent 92%);
  mask-image: linear-gradient(to bottom, #000 0%, transparent 92%);
}
.peek ul { list-style: none; margin: 0; padding: 0; }
.peek li { display: flex; gap: 12px; align-items: baseline; padding: 8px 12px; }
.peek .t { flex: 1; min-width: 0; font-size: 14.5px; line-height: 1.55; }
/* 三颗圆点是「还有更多」的非文字暗示。这里的 --border-strong 是 4px 圆点的**填充**
 * 不是边框,D1(静态边一律 --border)管的是边,不在其射程内 */
.cat-dots { display: flex; justify-content: center; gap: 5px; padding: 4px 0 14px; }
.cat-dots i { width: 4px; height: 4px; border-radius: 50%; background: var(--border-strong);
              display: block; opacity: 0.55;
              transition: opacity 0.4s, transform 0.4s var(--ease-expo); }
.cat:hover .cat-dots i:nth-child(1) { opacity: 0.9; transform: translateY(1px); }
.cat:hover .cat-dots i:nth-child(2) { opacity: 0.7; transform: translateY(2px); }
.cat:hover .cat-dots i:nth-child(3) { opacity: 0.5; transform: translateY(3px); }

/* 跑马灯。设计稿里它是通栏的,生产的正文在 main.wrap(左右各 28px)里,
 * 用等量负边距把它顶回 wrap 边缘;自身 overflow:hidden,不会撑出横向滚动条 */
.marquee { border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
           overflow: hidden; margin: 16px -28px 0; }
.marquee-label { max-width: 1280px; margin: 0 auto; padding: 14px 28px 0;
                 font-size: 12.5px; color: var(--text-3); letter-spacing: 0.06em; }
.marquee-track { display: flex; width: max-content; padding: 14px 0 20px;
                 animation: mq-slide 46s linear infinite; }
/* focus-within 与 hover 并列:容器带了 tabindex 却只认鼠标暂停,键盘用户无法
 * 让滚动停下(WCAG 2.2.2 移动内容需可暂停),顺带让那个 tab 停靠点有实际用处。 */
.marquee:hover .marquee-track,
.marquee:focus-within .marquee-track { animation-play-state: paused; }
/* 动画名加 mq- 前缀:style.css 是全站共享的,slide 这种通名早晚撞车 */
@keyframes mq-slide { from { transform: translateX(0); } to { transform: translateX(-50%); } }
.mq-card { display: block; min-width: 22rem; max-width: 22rem; padding: 4px 28px;
           border-left: 1px solid var(--border); color: var(--text); text-decoration: none; }
/* U6:动态文案也用衬线(text-600 子集覆盖常用字),徽章浮到文首 */
.mq-title { font-family: var(--font-heading); font-size: 19px; line-height: 1.45;
            font-weight: 600; margin: 0 0 8px; text-align: left;
            transition: color 0.3s; }
.mq-title .badge { float: left; margin: 4px 8px 0 0; }
/* 设计稿是 --accent,但亮色下 #D97757 on #FAF9F5 只有 2.96:1:标题从 --text
 * (17.50:1)掉到它,悬停反而更难读。--accent-strong 亮 4.30:1 / 暗 6.83:1。 */
.mq-card:hover .mq-title { color: var(--accent-strong); }
.mq-meta { font-size: 12.5px; color: var(--text-3); margin: 0; }

/* 设计稿是 52px 0 72px;下边距交给 .wrap 已有的 56px,否则页尾空 128px。
 * scroll-margin-top:#list 锚点的落点(方向块已改为进 /ai/d/N,但外部链接还落在
 * 这个 id 上),站头是 sticky 的,不留出这一档分区标题会被压在站头下面。 */
.section { padding: 52px 0 0; scroll-margin-top: var(--header-h); }
.marquee + #list { padding-top: 150px; }
.section .section-head { gap: 12px; margin: 0 0 18px; }
/* ⚠ 字重 700 不是审美选择,是**选片**:两片 @font-face 同族名不同字重,写 600 会
 * 精确命中 680 KB 的 text-600,写 700 才命中 33 KB 的 display-700。U4 表格给
 * display-700 的用途就是「11 个大标题、分区标题」。分区标题文案是固定的,已在
 * subset_display_font.py 的 FIXED 里;改文案必须同步那里并重跑脚本。 */
.section .section-head h2 { font-family: var(--font-heading); font-size: 28px;
                            font-weight: 700; margin: 0; }

/* 衬线大标题工具类:给不在 .section 里的 /ai 页面标题用(日报详情的 .page-title、
 * 存档页与基线页的分区 h2)。字重 700 = 命中 display-700(理由同上一条规则)。
 * ⚠ 必须排在 §11 的 .page-title 之后:两者 font-size 特异性同为 (0,1,0),
 * 靠源码顺序决胜。只管字族/字号/字重,margin 留给各自的既有规则,不越界。 */
.display { font-family: var(--font-heading); font-size: 28px; font-weight: 700;
           line-height: 1.3; }

/* 日报存档双视图:网格面向阅读浏览,列表面向连续日期与推送状态核对。 */
.wrap:has(.brief-archive) { max-width: 1496px; }
body:has(.brief-archive) .site-header .inner,
body:has(.brief-archive) .module-bar-inner { max-width: 1496px; }
.brief-archive-header {
  margin: 0 0 28px;
}
.brief-archive-heading .section-head { margin: 0 0 4px; }
.brief-archive-heading p { margin: 0; color: var(--text-2); font-size: 13px; }
.brief-archive-layout { margin-top: 6px; }
.layout .toolbar.brief-archive-toolbar {
  justify-content: space-between; margin-bottom: 32px;
}
.layout .brief-archive-toolbar .search {
  flex: 0 0 300px; min-width: 0; max-width: 300px;
}
.brief-archive-toolbar .search input { height: 49px; border-radius: 12px; }
.brief-viewtabs {
  --brief-view-x: 0%;
  position: relative; isolation: isolate; display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr)); flex: none;
  width: 167px; min-width: 167px; height: 49px; padding: 4px;
  background: var(--sunken); border-radius: 16px;
  box-shadow: inset 0 0 0 1px var(--border);
}
.brief-viewtabs[data-active-view="list"] { --brief-view-x: 100%; }
.brief-viewtabs::before {
  content: ""; position: absolute; z-index: -1; top: 4px; bottom: 4px; left: 4px;
  width: calc(50% - 4px); background: var(--surface); border-radius: 12px;
  box-shadow: var(--shadow); transform: translateX(var(--brief-view-x));
  transition: transform 420ms cubic-bezier(0.16, 1, 0.3, 1);
}
.brief-viewtabs a {
  position: relative; z-index: 1; display: inline-flex; align-items: center;
  justify-content: center; gap: 8px; min-height: 40px; padding: 8px 10px;
  color: var(--text-2); border-radius: 12px; font-size: 12.5px; line-height: 1;
  text-decoration: none; transition: color 180ms ease-out;
}
.brief-viewtabs a:hover { color: var(--text); }
.brief-viewtabs a[aria-current="page"] { color: var(--text); }
.brief-viewtabs:has(a[data-view="grid"]:hover),
.brief-viewtabs:has(a[data-view="grid"]:focus-visible) { --brief-view-x: 0%; }
.brief-viewtabs:has(a[data-view="list"]:hover),
.brief-viewtabs:has(a[data-view="list"]:focus-visible) { --brief-view-x: 100%; }
.brief-viewtabs a:focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 2px;
}
.brief-viewtabs svg { width: 17px; height: 17px; fill: none; stroke: currentColor;
                      stroke-width: 1.5; stroke-linecap: round; stroke-linejoin: round; }

.brief-archive-grid {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 32px;
}
.brief-load-more-wrap { display: flex; justify-content: center; margin-top: 48px; }
.brief-load-more-wrap[hidden] { display: none; }
.brief-load-more {
  min-width: 140px; min-height: 48px; padding: 10px 26px; border-radius: 12px;
  font-size: 15px;
}
.brief-archive-card {
  min-width: 0; overflow: hidden; color: var(--text); background: var(--panel-bg, var(--oat));
  border: 0; border-radius: 24px; text-decoration: none;
}
.brief-archive-card:focus-visible {
  outline: 2px solid var(--focus-ring); outline-offset: 3px;
}
.brief-archive-cover {
  position: relative; display: block; aspect-ratio: 3 / 2; overflow: hidden;
  background: var(--brief-cover-sun);
}
.brief-archive-cover--mon { background: var(--brief-cover-mon); }
.brief-archive-cover--tue { background: var(--brief-cover-tue); }
.brief-archive-cover--wed { background: var(--brief-cover-wed); }
.brief-archive-cover--thu { background: var(--brief-cover-thu); }
.brief-archive-cover--fri { background: var(--brief-cover-fri); }
.brief-archive-cover--sat { background: var(--brief-cover-sat); }
.brief-archive-cover--sun { background: var(--brief-cover-sun); }
.brief-archive-cover img { display: block; width: 100%; height: 100%; object-fit: cover; }
.brief-archive-cover-placeholder { position: absolute; inset: 0; display: block; }
.brief-archive-cover-placeholder::before {
  content: ""; position: absolute; left: 18%; top: 14%; width: 64%; height: 72%;
  background: var(--brief-cover-ivory); border-radius: 56% 44% 49% 51% / 43% 57% 46% 54%;
  transform: rotate(-3deg);
}
.brief-archive-cover-placeholder::after {
  content: ""; position: absolute; left: 36%; top: 32%; width: 25%; height: 27%;
  border: 5px solid var(--brief-cover-ink); border-left-color: transparent;
  border-radius: 48% 52% 44% 56%; transform: rotate(17deg);
}
.brief-archive-card-body {
  display: grid; grid-template-rows: auto 1fr auto; gap: 16px;
  min-height: 222px; padding: 32px; background: var(--panel-bg, var(--oat));
}
.brief-archive-card:hover .brief-archive-card-body { background: var(--sunken); }
.brief-archive-card-body time { color: var(--text-2); font-size: 12.5px;
                                font-variant-numeric: tabular-nums; }
.brief-archive-card-title {
  display: -webkit-box; overflow: hidden; font-family: var(--font-heading); font-size: 19px;
  font-weight: 600; line-height: 1.2; -webkit-box-orient: vertical; -webkit-line-clamp: 4;
}
.brief-archive-card-meta { align-self: end; color: var(--text-2); font-size: 12.5px;
                           white-space: nowrap; }

/* 日报列表列名来自真实可追溯字段；方向列显示成文时排第一的主方向及覆盖数。 */
.brief-list-cols-head, .brief-row {
  display: grid; grid-template-columns: minmax(0, 1fr) 180px 108px 92px;
  gap: 0 20px; align-items: center;
}
.brief-list-cols-head {
  padding: 0 12px 10px; border-bottom: 1px solid var(--border);
}
.brief-list-cols-head span {
  color: var(--text-2); font-size: 12px; letter-spacing: 0.03em;
}
.brief-rows { border-bottom: 1px solid var(--border); }
.brief-row {
  min-width: 0; padding: 12px; color: var(--text); border-top-color: var(--border);
  text-decoration: none; transition: border-color 0.3s, opacity 0.3s;
}
.brief-rows .brief-row:first-child { border-top-color: transparent; }
.brief-rows:has(.brief-row:hover) .brief-row:not(:hover) { opacity: 0.3; }
.brief-row-main { display: grid; min-width: 0; gap: 3px; }
/* 日期是纯数字与连字符,两片子集都覆盖;取 700 是为了让 /ai/briefs 这一页的衬线
 * 日期落在轻量 display-700 上。 */
.brief-row .d { color: var(--list-meta); font-family: var(--font-body); font-size: 14.5px;
                font-weight: 700; font-variant-numeric: tabular-nums; }
.brief-row-title { min-width: 0; overflow: hidden; font-family: var(--font-heading);
                   font-size: 17px; font-weight: 600; line-height: 1.38;
                   text-overflow: ellipsis; white-space: nowrap; }
.brief-row-submeta { color: var(--text-3); font-size: 11.5px; }
.brief-row-field { color: var(--list-meta); font-size: 13px; line-height: 1.35; }
.brief-row-direction { color: var(--text); }
.brief-row-direction small { display: block; margin-top: 3px; color: var(--text-3);
                             font-size: 11.5px; }

@media (max-width: 899px) {
  .brief-archive-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .brief-list-cols-head { display: none; }
  .brief-row { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 18px; }
  .brief-row-main { grid-column: 1 / -1; }
}
@media (max-width: 559px) {
  .brief-archive-grid { grid-template-columns: 1fr; }
  .layout .brief-archive-toolbar .search { flex-basis: 100%; max-width: none; }
  .brief-viewtabs { width: 100%; min-width: 0; }
  .brief-row { grid-template-columns: 1fr; gap: 6px; padding: 12px 10px; }
  .brief-row-title { white-space: normal; }
}

/* 日报前后日导航仍复用 .cat-arrow 的降动效入口,但它是文字箭头,须撤掉分类页
 * SVG 容器的尺寸与默认位移。角度按规格 §一.4 的 -45°:→ 转成 ↗、← 转成 ↖。 */
.brief-nav { display: flex; justify-content: space-between; margin-top: 1.2em; }
.brief-nav a { display: inline-flex; align-items: baseline; gap: 8px;
               color: var(--text-2); }
.brief-nav a:hover { color: var(--text); }
.brief-nav .cat-arrow { width: auto; height: auto; font-size: 17px; transform: none; }
.brief-nav a:hover .cat-arrow, .brief-nav a:focus-visible .cat-arrow {
  color: var(--text); transform: rotate(-45deg);
}

/* 首屏标线：统计收至 180px，方向标题按参考图每行前进 64px。
 * 右列多出一行，只把多出的尾部探出共同底线；下内距为其预留空间。
 * 介绍栏最小高度匹配核心方向底线；额外告警自然延展，不裁剪内容。 */
@media (min-width: 901px) {
  .ai-frontier-page .hero { align-items: start; gap: 48px; padding-bottom: 88px; }
  .hero-intro { display: flex; flex-direction: column; justify-content: space-between; gap: 8px;
                min-height: calc(256px + clamp(36px, 3.75vw, 48px) * 1.2); }
  .hero-intro .hero-label, .hero-intro .hero-desc, .hero-intro .hero-stats,
  .hero-intro .hero-pending { margin: 0; }
  .hero-intro .hero-label { line-height: 1.2; }
  .hero-intro .hero-brief-link { align-self: flex-start; }
  .hero-intro .hero-stats { padding-top: 14px; }
  .hero-stats > div, .hero-pending-link { width: min(100%, 180px); }
  .hero-stats dd { text-align: right; }
  .hero-pending-link { position: relative; }
  .hero-pending-arrow { position: absolute; right: -10px; }
  .cats {
    --cat-row-step: 64px;
    --cat-primary-size: clamp(36px, 3.75vw, 48px);
    --cat-secondary-size: clamp(23px, 2.5vw, 32px);
  }
  .cats-col { justify-content: flex-start; }
  .cats-col-primary { gap: calc(var(--cat-row-step) - var(--cat-primary-size) * 1.2); }
  .cats-col-secondary {
    gap: calc(var(--cat-row-step) - var(--cat-secondary-size) * 1.2);
    margin-bottom: calc(var(--cat-primary-size) * 1.2 - var(--cat-secondary-size) * 1.2 - var(--cat-row-step));
  }
  .cat { padding: 0; }
  .cat-head { display: flex; padding: 0; }
  .cats-col-primary .cat-head { justify-content: flex-start; text-align: left; }
  .cats-col-secondary .cat-head { justify-content: flex-end; text-align: right; }
  .cat-title { line-height: 1.2; }
}

@media (min-width: 901px) {
  /* Pointer intent owns the preview so a reflow under the cursor cannot switch it back. */
  .cats.intent-ready .cat:hover .cat-title,
  .cats.intent-ready:has(.cat.is-active) .cat-title {
    color: var(--faded); font-size: clamp(24px, 2.5vw, 32px);
  }
  .cats.intent-ready .cat:hover .cat-arrow,
  .cats.intent-ready:has(.cat.is-active) .cat-arrow { color: var(--faded); transform: translateX(-0.2em); }
  .cats.intent-ready .cat:hover .cat-body { grid-template-rows: 0fr; }
  .cats.intent-ready .cat.is-active .cat-title,
  .cats.intent-ready .cat:focus-visible .cat-title {
    color: var(--text); font-size: clamp(38px, 4vw, 52px); white-space: nowrap;
  }
  .cats.intent-ready .cat.is-active .cat-arrow,
  .cats.intent-ready .cat:focus-visible .cat-arrow { color: var(--text); transform: translateX(0); }
  .cats.intent-ready .cat.is-active .cat-body,
  .cats.intent-ready .cat:focus-visible .cat-body { grid-template-rows: 1fr; }
}

/* 手机端(≤900px):只列标题不展开(触屏无 hover),点标题直接进该方向筛选页;
 * 标题不参与放大/虚化。:focus-within 的三条也要一并按住——设计稿只按了 :hover,
 * 窄屏用键盘走焦点时方向块仍会展开 */
@media (max-width: 900px) {
  .hero { grid-template-columns: 1fr; gap: 28px; padding: 36px 0 20px; }
  .cats { grid-template-columns: 1fr; gap: 0; }
  .cats-col { min-height: 0; transform: none; text-align: left; align-items: stretch;
              justify-content: flex-start; }
  .cats-col-primary .cat:first-child { margin-top: 0; }
  .cat { border-bottom: 1px solid var(--border); }
  .cat-head { display: flex; justify-content: space-between; width: 100%; padding: 13px 2px; }
  /* 关闭虚化必须把 :hover 与 :focus-within 两支都列上。只列 :hover 会漏掉纯键盘
   * 路径:窄屏 Tab 到某个方向时 .cats 并不 :hover,基础段那条 (0,3,0) 的
   * .cats:has(:where(.cat):focus-within) 就压过裸 .cat-title (0,1,0),其余 10 个
   * 标题照样虚化放大——正是手机端明令禁止的。这里用 .cats:focus-within 而非
   * :has(...):同为 (0,3,0)、排在文件最后靠源码顺序取胜,且不把 :has 带进窄屏。 */
  .cats-col-primary .cat-title, .cat-title,
  .cats:hover .cat-title, .cats:focus-within .cat-title,
  .cat:hover .cat-title, .cat:focus-visible .cat-title {
    font-size: 23px; color: var(--text); }
  .cats-col-primary .cat-arrow, .cat-arrow,
  .cats:hover .cat-arrow, .cats:focus-within .cat-arrow {
    font-size: 23px; color: var(--text-3); transform: translateX(-0.2em); }
  .cat:hover .cat-arrow, .cat:focus-visible .cat-arrow {
    font-size: 23px; color: var(--text); transform: translateX(0); }
  .cat-body, .cat:hover .cat-body, .cat:focus-visible .cat-body { grid-template-rows: 0fr; }
  .mq-card { min-width: 17rem; max-width: 17rem; padding: 4px 18px; }
  /* 桌面 wrap 是 28px、手机 wrap 是 16px；仍拉 -28px 会左右各溢出 12px。 */
  .marquee { margin-inline: -16px; }
  .section { padding: 32px 0 0; }
  .section .section-head h2 { font-size: 22px; }
}

/* ---------- 14. /ai/d/{num} 方向资讯页(设计稿移植,只服务方向页) ---------- */
/* 来源:docs/specs/2026-08-27-AI方向页设计稿-参考实现.html(用户已确认的参考实现)。
 * 数值/选择器/过渡曲线照抄,生产化调整就近注明,共四处:
 *   ① 稿里的 .wrap(1180px)与 .cols 的 72px 下边距由 base.html 的 main.wrap
 *      接管(1280px + 56px),同 §13 的既有做法,否则页尾空 128px;
 *   ② 稿里字体是 data URI 内嵌,生产走 §0 已有的两片自托管子集;
 *   ③ 动态文案的衬线一律 font-weight 600(选片,见 .lead-title 处的说明);
 *   ④ .body / .meta / .dot 三个通名必须由 .cols 圈住(见下),稿里是裸类名。
 * ⚠ .body 与 .meta 在本站已有别的主人(detail.html 的正文块、ai_briefs 的行尾
 * 元信息),裸写会窜到那两页上去。同 §13 用 .section 圈住 .section-head 的先例:
 * 类名在 DOM 里与设计稿逐字相同,只在样式表里加一层 .cols 作用域。 */

.crumb { padding: 22px 0 0; font-size: 13px; color: var(--text-3); }
.crumb a:hover { color: var(--text); }
.crumb b { font-weight: 400; color: var(--text-2); }

/* 2px 主色分隔线:masthead 与正文之间唯一的重线,报头的骨架 */
.masthead { padding: 10px 0 26px; border-bottom: 2px solid var(--text); }
/* 字重 700 = 命中 display-700(33 KB,258 字含 11 个方向名);方向名是固定文案,
 * 已在 subset_display_font.py 的字符集里。理由同 §13 的 .section-head h2。 */
.masthead h1 { font-family: var(--font-heading); font-weight: 700;
               font-size: clamp(34px, 4.6vw, 56px); line-height: 1.16;
               margin: 6px 0 12px; letter-spacing: 0.01em; }
.mast-meta { display: flex; flex-wrap: wrap; gap: 6px 18px; font-size: 13px;
             color: var(--text-3); font-variant-numeric: tabular-nums; margin: 0; }
.mast-meta b { color: var(--text); font-weight: 600; }
/* 「A 级 N 条」在 N>0 时是链接(通往列表页该方向的 A 级筛选):头条只在近 7 日里
 * 挑,窗口外的 A 得有落点。稿里这一格是纯文本,加的只是 hover 反馈,机制照抄
 * .crumb a:hover(淡→深),不新造语汇、不引入第二种链接色。 */
.mast-meta a:hover { color: var(--text); }

/* 方向内筛选:Claude Blog 栏目选择器的形状与间距；原生 details/checkbox 保留
 * 无脚本可用性，脚本只补摘要同步、互斥展开和 Escape。 */
.direction-filter-shell { padding: 18px 0; border-bottom: 1px solid var(--border); }
.direction-filterbar {
  display: grid; grid-template-columns: minmax(210px, 1.6fr) repeat(4, minmax(112px, 1fr)) auto;
  gap: 12px; align-items: end;
}
.direction-filterbar label, .direction-filterbar .filter-field { min-width: 0; }
.direction-filter-search > span, .filter-label {
  display: block; margin: 0 0 6px; color: var(--text-3);
  font-size: 11.5px; letter-spacing: 0.08em;
}
.direction-filter-search input { width: 100%; min-width: 0; }
.filter-multiselect { position: relative; min-width: 0; }
.filter-multiselect[open] { z-index: 30; }
.filter-multiselect > summary {
  min-height: 43px; display: grid; grid-template-columns: minmax(0, 1fr) auto;
  gap: 10px; align-items: center; padding: 9px 16px; list-style: none;
  color: var(--text); background: var(--control-bg, var(--bg)); border: 1px solid var(--border);
  border-radius: var(--radius); cursor: pointer; font-size: 15px; line-height: 24px;
  transition: background-color 0.3s, color 0.3s;
}
.filter-multiselect > summary::-webkit-details-marker { display: none; }
.filter-multiselect > summary:hover,
.filter-multiselect > summary:focus-visible,
.filter-multiselect[open] > summary { background: var(--oat); }
.filter-multiselect[open] > summary {
  border-bottom-left-radius: 0; border-bottom-right-radius: 0;
}
.filter-multiselect-value {
  min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.filter-multiselect-arrow {
  width: 1rem; height: 1rem; color: var(--text-2);
  transition: transform 0.3s var(--ease-expo);
}
.filter-multiselect[open] .filter-multiselect-arrow { transform: rotate(-180deg); }
.filter-multiselect-panel {
  position: absolute; z-index: 1; top: 100%; left: 0; width: 100%; max-height: 12.5rem;
  overflow-y: auto; margin-top: -1px; padding: 6px; background: var(--overlay-bg, var(--bg));
  border: 1px solid var(--border); border-radius: 0 0 var(--radius) var(--radius);
}
.filter-choice {
  position: relative; min-height: 45px; display: grid;
  grid-template-columns: minmax(0, 1fr) auto 22px; gap: 12px; align-items: center;
  padding: 10px 12px; color: var(--text); background: var(--oat);
  border: 1px solid transparent; border-radius: 8px; cursor: pointer;
  font-size: 15px; line-height: 24px;
  transition: color 0.3s, background-color 0.3s, border-color 0.2s,
              box-shadow 0.2s;
}
.filter-choice + .filter-choice { margin-top: 4px; }
.filter-choice:hover { border-color: var(--border-strong); }
.filter-choice:has(:where(.filter-choice-input:checked)) {
  background: var(--selected-bg, var(--surface)); border-color: var(--border);
}
.filter-choice-input {
  position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0;
  overflow: hidden; clip: rect(0 0 0 0); clip-path: inset(50%); white-space: nowrap;
}
.filter-choice-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.filter-choice-count { color: var(--text-3); font-size: 12px;
                       font-variant-numeric: tabular-nums; }
.filter-choice-check {
  width: 22px; height: 22px; display: grid; place-items: center;
  box-sizing: border-box; color: #fff; background: var(--input-bg, #fbfaf6);
  border: 1px solid var(--input-line, #c9c6bd);
  border-radius: 6px; transition: background-color 0.3s, border-color 0.3s;
}
.filter-choice-check svg { width: 18px; height: 18px; opacity: 0; }
.filter-choice-input:checked ~ .filter-choice-check {
  background: var(--primary-bg, #171715); border-color: var(--primary-bg, #171715); color: var(--primary-fg, #fff);
}
.filter-choice-input:checked ~ .filter-choice-check svg { opacity: 1; }
.direction-filter-actions { display: flex; gap: 8px; align-items: center; }
.direction-filter-actions .btn { min-height: 42px; white-space: nowrap; }
.direction-filter-count {
  margin: 10px 0 0; color: var(--text-3); font-size: 12.5px;
  font-variant-numeric: tabular-nums;
}
.direction-filter-count b { color: var(--text); font-weight: 600; }

.cols { display: grid; grid-template-columns: 1fr 300px; gap: 0 52px;
        align-items: start; }
.cols .main { min-width: 0; padding-top: 6px; }
/* .rail 由 .cols 圈住,理由同 .body / .meta:§16 的列表页筛选栏也叫 .rail(两份
 * 设计稿用了同一个通名),裸写会让这条 sticky 与下面 .rail h2 的小字号窜到 /ai 上。 */
.cols .rail { padding-top: 28px; position: sticky; top: calc(var(--header-h) + 20px); }

/* 板块判定(编者按):方向级小结,不是聚合来的,是当天读完全部条目后写的结论。
 * 燕麦底把它从资讯流里拎出来——这页最有料的一块。 */
.brief { background: var(--panel-bg, var(--oat)); border-radius: var(--radius);
         padding: 22px 26px; margin: 28px 0 40px; }
.brief-kicker { font-size: 11.5px; letter-spacing: 0.14em; color: var(--text-3);
                margin: 0 0 12px; }
.brief-lead { font-family: var(--font-serif); font-size: 19px; line-height: 1.72;
              font-weight: 600; margin: 0; }
/* ⚠ 这条分隔线与下面 .plain p 的引用竖线用 --border-strong 是**照抄设计稿**,不违
 * D1:D1 治的是「控件默认态顶着 hover 级深边、把『默认淡框→hover 显框』的层次吃掉」,
 * 射程是有 hover 态的控件。这两处是排版线,自身没有 hover;而且它压在 --oat 面上,
 * 换 --border(#E8E6DC on #F0EEE6)几乎看不见,分隔就白设了。 */
.brief dl { margin: 18px 0 0; padding: 16px 0 0; border-top: 1px solid var(--border-strong); }
.brief dt { font-size: 11.5px; letter-spacing: 0.12em; color: var(--text-3); margin: 0 0 5px; }
.brief dd { margin: 0 0 14px; font-size: 14.5px; line-height: 1.75; color: var(--text-2); }
.brief dd:last-child { margin-bottom: 0; }

/* 头条。⚠ .lead-title / .story-title 的字重是 600 不是 700:两片 @font-face 同族名
 * 不同字重,600 命中 680 KB 的 text-600(GB2312 一级 3755 字),700 命中 33 KB 的
 * display-700(258 字,只装得下 11 个方向名与固定标题)。资讯标题是**动态文案**,
 * 写 700 会让绝大多数汉字逐字掉回系统宋体,与命中的那几个字混排。设计稿在
 * .lead-title 上写的是 700 —— 那份稿内嵌的是完整字体,没有选片问题,这是移植到
 * 生产分层子集时必须改的一处(规格 U4 的分层规则)。 */
.lead { padding: 0 0 34px; border-bottom: 1px solid var(--border); }
.lead .badge { margin: 0 0 14px; }
.lead-title { font-family: var(--font-heading); font-weight: 600;
              font-size: clamp(26px, 2.9vw, 34px); line-height: 1.3;
              margin: 0 0 14px; text-wrap: balance; }
.lead-title a { transition: color 0.3s; }
.lead-title a:hover { color: var(--accent); }
/* 不写 font-weight(照设计稿):400 在本族里没有精确匹配,按 CSS Fonts 4 的匹配
 * 顺序(400-500 内 → 更轻 → 更重)最终仍落到 text-600 那片,字面照旧命中子集;
 * 而显式写 600 会让子集没覆盖的字在回退字体上被加粗,反倒与周围不齐。 */
.standfirst { font-family: var(--font-serif); font-size: 18px;
              line-height: 1.7; color: var(--text-2); margin: 0 0 14px; }
.cols .body { font-size: 14.5px; line-height: 1.8; color: var(--text-2); margin: 0 0 12px; }

/* 大白话:默认收起的 <details>,零 JS。summary 的 ＋/− 由 ::before 换字符,
 * 不是图标字体也不是内联 svg。 */
.plain { margin: 0 0 14px; }
.plain summary { font-size: 13px; color: var(--text-3); cursor: pointer;
                 list-style: none; display: inline-flex; align-items: center; gap: 6px;
                 padding: 3px 10px; border-radius: 999px;
                 border: 1px solid transparent;
                 transition: border-color 0.3s, color 0.3s; }
.plain summary::-webkit-details-marker { display: none; }
.plain summary::before { content: "＋"; font-size: 11px; }
.plain:not(.disclosure-ready)[open] summary::before,
.plain.is-open summary::before { content: "−"; }
.plain summary:hover { color: var(--text); border-color: var(--border-strong); }
.plain p { margin: 10px 0 0; font-size: 14px; line-height: 1.8; color: var(--text-2);
           padding-left: 14px; border-left: 2px solid var(--border-strong); }
.plain.disclosure-ready > .disclosure-panel,
.fgroup.disclosure-ready > .disclosure-panel {
  display: grid; grid-template-rows: 0fr; opacity: 0;
  transform: translateY(-5px);
  transition: grid-template-rows 0.44s cubic-bezier(0.16, 1, 0.3, 1),
              opacity 0.28s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.44s cubic-bezier(0.16, 1, 0.3, 1);
}
.plain.disclosure-ready.is-open > .disclosure-panel,
.fgroup.disclosure-ready.is-open > .disclosure-panel {
  grid-template-rows: 1fr; opacity: 1; transform: translateY(0);
}
.disclosure-inner { min-height: 0; overflow: hidden; }

.cols .meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0 9px;
              margin: 0; font-size: 12.5px; color: var(--text-3); }
/* 3px 分隔点。§10 的 .dot 是 8px 心跳灯,同名不同物,故必须由 .cols .meta 圈住。 */
.cols .meta .dot { width: 3px; height: 3px; border-radius: 50%;
                   background: var(--border-strong); display: block; }
.stance { font-weight: 600; }
.st-op { color: var(--ok); }
.st-th { color: var(--danger); }
/* 中性不加重:它是「不构成明显正负向」,给它一个醒目的颜色等于凭空造出一档语义 */
.st-ne { color: var(--text-3); font-weight: 400; }
.src-link { color: var(--text-2); }
.src-link:hover { color: var(--accent); }

.stream { padding: 6px 0 0; }
.story { display: flex; gap: 16px; padding: 26px 0; border-bottom: 1px solid var(--border); }
.story:last-child { border-bottom: none; }
.story-main { min-width: 0; flex: 1; }
/* 字重 600 的理由同 .lead-title(选片,不是审美) */
.story-title { font-family: var(--font-heading); font-weight: 600; font-size: 21px;
               line-height: 1.42; margin: 0 0 8px; text-wrap: balance; }
.story-title a { transition: color 0.3s; }
.story-title a:hover { color: var(--accent); }
.value { font-size: 14.5px; line-height: 1.7; color: var(--text); margin: 0 0 7px; }
.cols .story .body { margin: 0 0 9px; font-size: 14px; }
.story .badge { margin-top: 4px; }

/* 「累计 0 条 · 信源缺口」与首页方向块是同一句话、同一档强调,共用 §13 那条
 * --danger 规则(见 .cat-none b),别让两处分头漂移。 */
.dir-gap { padding: 26px 0 0; font-size: 14.5px; color: var(--text-2); margin: 0; }

.cols .rail section { margin: 0 0 30px; }
.cols .rail h2 { font-size: 11.5px; letter-spacing: 0.14em; color: var(--text-3);
                 font-weight: 400; margin: 0 0 12px; padding: 0 0 9px;
                 border-bottom: 1px solid var(--border); }
.cols .rail p { font-size: 13.5px; line-height: 1.75; color: var(--text-2); margin: 0; }
.dirlist { list-style: none; margin: 0; padding: 0; }
.dirlist li { border-bottom: 1px solid var(--border); }
.dirlist li:last-child { border-bottom: none; }
.dirlist a { display: block; padding: 8px 10px; font-size: 14px; color: var(--text-2);
             border: 1px solid transparent; border-radius: 8px;
             transition: border-color 0.3s, color 0.3s; }
.dirlist a:hover { color: var(--text); border-color: var(--border-strong); }
.dirlist .cur a { color: var(--text); font-weight: 600; background: var(--nav-selected-bg, var(--oat)); }
.railbriefs { list-style: none; margin: 0; padding: 0; font-size: 14px; }
.railbriefs li { padding: 7px 0; border-bottom: 1px solid var(--border); }
.railbriefs li:last-child { border-bottom: none; }
.railbriefs a { color: var(--text-2); font-variant-numeric: tabular-nums; }
.railbriefs a:hover { color: var(--text); }

/* 「更多 N 条」:设计稿是 <button>,这里是链接(服务端分页,零 JS),
 * 行内元素吃不住 .btn 的纵向内边距,同 .hero .btn 的处理。
 * ⚠ §15 的列表页复用这两条(同一个部件、同一份文案),改动会同时影响两页。 */
/* 分页行:左「上一页」/ 中页码 / 右「更多」。回退路径不是可选项——只给「更多」
 * 的话翻页后页内没有任何回第 1 页的通道(左栏筛选与搜索都把 page 重置为 1)。 */
.more { display: flex; justify-content: center; align-items: center; gap: 14px;
        padding: 34px 0 0; }
.more .btn { display: inline-block; padding: 8px 22px; }
.more .btn-quiet { background: transparent; border-color: var(--border); }
.more-at { font-size: 14.5px; color: var(--list-meta);
           font-variant-numeric: tabular-nums; }

/* ≤900px:侧栏落到正文下方(不再 sticky),正文与卡片各收一档留白 */
@media (max-width: 900px) {
  .direction-filterbar { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .direction-filter-search { grid-column: 1 / -1; }
  .cols { grid-template-columns: 1fr; gap: 0; }
  .cols .rail { position: static; padding-top: 8px; border-top: 1px solid var(--border);
                margin-top: 8px; }
  .brief { padding: 18px 18px; margin: 22px 0 30px; }
  .story { gap: 12px; padding: 22px 0; }
  .story-title { font-size: 19px; }
}

/* ---------- 15. Claude 风格密排列表(/ai 情报 + / 商机) ---------- */
/* 来源:docs/specs/2026-08-28-AI列表页设计稿-参考实现.html(用户已确认的参考实现,
 * 内容是生产库真实数据)。数值/选择器/过渡曲线照抄,生产化调整四处,就近注明:
 *   ① 稿里 .layout 的 padding-bottom:80px 由 base.html 的 main.wrap(56px)接管,
 *      同 §13/§14 的既有做法,否则页尾空一大截;
 *   ② 行标题 .row-t 是**动态文案**,衬线字重必须 600 不是稿里的 700(选片,
 *      理由见 §14 .lead-title 处的长注);
 *   ③ .rail / .main / .row / .rows / .search / .toolbar / .cols-head 是通名,
 *      DOM 里与稿逐字相同,样式表侧由 .layout 圈住(同 §14 用 .cols 圈 .body 的
 *      先例)。.rail 是硬冲突:§14 方向页的侧栏也叫 .rail,那边已一并收进 .cols;
 *   ④ 稿里 ≤900px 的 .row-g 排在 .row-m **之前**,而等级格的 class 是
 *      "row-m row-g" 两个都吃 —— 同为 (0,1,0),后者靠源码顺序把 grid-column
 *      改回 2,圆点会窜到标题那一列去。这里把 .row-g 挪到 .row-m 之后(同
 *      §7「.btn-primary 必须排在 .btn 之后」的处理),稿的其余数值不动。 */

.layout { display: grid; grid-template-columns: 232px 1fr; gap: 0 48px;
          align-items: start; }
.layout .main { min-width: 0; }
.mobile-filter-toggle { display: none; }
.layout.brief-archive-layout {
  grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 32px;
}
.brief-archive-layout > .rail { width: 216px; }
.brief-archive-layout > .main { grid-column: 2 / -1; }

/* 左栏筛选:零 JS,折叠是原生 <details>,每个选项是改一个查询参数的链接。 */
.layout .rail h2 { font-size: 17px; font-weight: 600; margin: 0 0 4px;
                   padding: 0 0 12px; border-bottom: 1px solid var(--border); }
.fgroup { border-bottom: 1px solid var(--border); }
.fgroup > summary { list-style: none; cursor: pointer; display: flex;
                    align-items: center; justify-content: space-between;
                    padding: 14px 2px; font-size: 15px; color: var(--text-2);
                    border: 1px solid transparent; border-radius: 8px;
                    transition: color 0.3s; }
.fgroup > summary::-webkit-details-marker { display: none; }
.fgroup > summary:hover { color: var(--text); }
.fgroup-arrow { width: 1rem; height: 1rem; flex: 0 0 auto; margin-left: auto;
                color: var(--text-3); overflow: visible;
                transition: transform 0.5s cubic-bezier(0.16, 1, 0.3, 1),
                            color 0.5s cubic-bezier(0.16, 1, 0.3, 1); }
.fgroup-arrow svg { display: block; width: 100%; height: 100%; }
.fgroup > summary:hover .fgroup-arrow { color: var(--text); }
.fgroup:not(.disclosure-ready)[open] > summary .fgroup-arrow,
.fgroup.is-open > summary .fgroup-arrow { transform: rotate(-180deg); }
.fgroup:not(.disclosure-ready)[open] > summary,
.fgroup.is-open > summary { color: var(--text); }
.filter-group .filter-choice-list { padding: 0 0 12px; }
.filter-sidebar-form { margin: 0; }
.filter-apply-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
                        margin-top: 14px; }
.filter-apply-actions button[hidden],
.direction-filter-actions button[hidden] { display: none; }
.filter-sidebar-form .filter-apply-actions .btn { min-height: 40px; padding: 7px 14px; }
.filter-sidebar-form .rail-reset { margin-top: 0; }
/* 日期组里的精确区间小表单:快捷项走链接(同其余三组),精确区间还是要两个
 * date 控件。窄栏里 232px 放不下并排两个,纵排。 */
.layout .frange { display: flex; flex-direction: column; gap: 7px;
                  padding: 2px 8px 14px; }
.layout .frange label { display: flex; align-items: center; gap: 7px;
                        font-size: 13px; color: var(--text-3); }
.layout .frange input[type="date"] { flex: 1; min-width: 0; font: inherit;
  font-size: 13px; color: var(--text); background: var(--input-bg, var(--surface));
  border: 1px solid var(--input-line, var(--border)); border-radius: 8px; padding: 4px 8px;
  transition: border-color 0.3s; }
.layout .frange input[type="date"]:hover { border-color: var(--border-strong); }
.filter-date-shortcuts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
                         gap: 4px; padding: 0 8px 8px; }
.filter-date-shortcuts a { padding: 6px 8px; color: var(--text-2); font-size: 13px;
                           border: 1px solid transparent; border-radius: 8px; }
.filter-date-shortcuts a:hover, .filter-date-shortcuts a:focus-visible {
  color: var(--text); border-color: var(--border-strong); background: var(--surface);
}

.rail-reset { display: inline-block; margin-top: 16px; font-size: 13px;
              color: var(--text-3); }
.rail-reset:hover { color: var(--text); }

/* 工具条(本轮只有搜索框;稿里的「列表 / 卡片」切换等卡片视图做出来再摆上去) */
.layout .toolbar { display: flex; align-items: center; gap: 16px; margin: 0 0 22px; }
.layout .search { flex: 1; max-width: 420px; position: relative; }
/* 特异性 (0,2,1) 压过 §7 的 input[type="text"] (0,1,1):那条给的是筛选栏小控件的
 * 5px 内边距与 8px 圆角,搜索框要的是稿里 40px 左内边距(给放大镜让位)。 */
.layout .search input { width: 100%; font: inherit; font-size: 15px;
                        color: var(--text); background: var(--input-bg, var(--surface));
                        border: 1px solid var(--input-line, var(--border)); border-radius: var(--radius);
                        padding: 11px 14px 11px 40px; transition: border-color 0.3s; }
.layout .search input:hover { border-color: var(--border-strong); }
.layout .search svg { position: absolute; left: 14px; top: 50%;
                      transform: translateY(-50%); width: 15px; height: 15px;
                      stroke: var(--text-3); fill: none; stroke-width: 2; }

/* 密排行列表。悬停时其余行淡出到 0.3 —— 官网原式 `:has(项:hover) 项:not(:hover)`,
 * 被指的那行由 :not 直接排除,不靠源码顺序也不用 :where() 压特异性(与 §13 方向块
 * 那条要压回 (0,3,0) 的情形不同:这里没有第二条规则要赢)。
 * 不支持 :has 的浏览器整条失效 = 不淡出,可接受的降级。 */
.layout .cols-head { display: grid;
                     grid-template-columns: 1fr 124px 64px 96px 88px; gap: 0 18px;
                     padding: 0 0 9px; border-bottom: 1px solid var(--border); }
.layout .cols-head span { font-size: 12px; letter-spacing: 0.12px;
                          color: var(--text-2); text-transform: uppercase; }
.layout .rows { border-bottom: 1px solid var(--border); }
.layout .row { display: grid; grid-template-columns: 1fr 124px 64px 96px 88px;
               gap: 0 18px; align-items: center; padding: 10px 0;
               border-top: 1px solid var(--border); transition: opacity 0.3s; }
.layout .rows .row:first-child { border-top: none; }
.layout .rows:has(.row:hover) .row:not(:hover) { opacity: 0.3; }
/* 字重 600 = text-600(GB2312 一级 3755 字)。资讯标题是动态文案,写 700 会精确
 * 命中 33 KB 的 display-700 而绝大多数汉字逐字掉回系统宋体(理由同 §14 .story-title)。 */
.row-t { font-family: var(--font-heading); font-weight: 600;
         font-size: clamp(15.5px, 1.22vw, 17.5px); line-height: 1.32;
         margin: 0; text-wrap: balance; transition: color 0.3s; }
.layout .row:hover .row-t { color: var(--accent); }
.row-m { font-size: 12.5px; color: var(--list-meta); margin: 0; }
.row-g { display: flex; justify-content: center; }
/* 价值判断与 👍👎 同一行:反馈评的就是这句判断。稿里 .row-v 自己吃单行截断,这里
 * 截断下放到 .row-vt —— .row-v 要当 flex 容器盛住反馈按钮。 */
/* ⚠ overflow:hidden 不是为了裁切(裁切在 .row-vt 上),是为了把这个 grid 项的
 * **自动最小尺寸**压到 0:默认 auto = min-content,而 .row-vt 的 white-space:nowrap
 * 让 min-content = 整句价值判断的宽度,标题那一列会被它顶到几百 px、整行溢出
 * (实测 215px 的窄屏容器里行宽 494px)。稿里 .row-v 自己带 overflow:hidden,
 * 改成 flex 容器时这一条必须跟着留下。 */
.row-v { grid-column: 1 / -1; display: flex; align-items: center; gap: 10px;
         margin: 1px 0 0; font-size: 12.5px; line-height: 1.45;
         color: var(--text-3); max-width: 88ch; overflow: hidden; }
.row-vt { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis;
          white-space: nowrap; }
.row-v .fb-cell { flex: none; }

/* 商机主列表恢复原来的无插图密排行。 */
.opportunity-list-page { padding-top: 16px; }
.opportunity-list-page .layout .cols-head,
.opportunity-list-page .layout .row {
  grid-template-columns: minmax(0, 1fr) 90px 56px 120px 124px;
}
.opportunity-list-page .layout .cols-head span:nth-child(4),
.opportunity-budget { text-align: right; font-variant-numeric: tabular-nums; }
.opportunity-budget, .opportunity-row .row-m.hide-sm { font-size: 14px; }
.opportunity-row .row-t { text-wrap: wrap; }
.opportunity-row .row-t a { display: block; }
.opportunity-star { color: var(--accent); margin-right: 7px; font-family: var(--font-sans); }
/* 可选的结果、关注和分派信息不能参与五列自动排位，否则会把档位、预算和日期
 * 推进隐式新行，并让控件在窄列内纵向换行。它们统一收进第二行元信息栏。 */
.opportunity-row { row-gap: 4px; }
.opportunity-row .row-v { max-width: none; min-width: 0; flex-wrap: wrap; }
.opportunity-assignment { flex: none; flex-wrap: wrap; gap: 6px; margin: 0; }
.opportunity-assignment select { min-width: 0; max-width: 112px; }
.opportunity-assignment .btn { flex: none; padding: 5px 12px; white-space: nowrap; }
.opportunity-list-page .toolbar > .btn-primary {
  flex: none; padding: 11px 18px; border-radius: var(--radius);
}

@media (max-width: 900px) {
  .board-opportunity { grid-template-columns: 140px minmax(0, 1fr); }
  .board-content { padding: 12px 18px; }
}
@media (max-width: 600px) {
  .board-opportunity { grid-template-columns: 76px minmax(0, 1fr); }
  .board-art { align-items: flex-start; padding-top: 22px; }
  .board-content { padding: 10px 14px; }
  .board-content .brief-title { font-size: 17px; }
  .board-detail-grid { grid-template-columns: minmax(0, 1fr); }
}


/* ≤900px:左栏收到顶部,行收成两列(等级圆点 + 标题/元信息),类型与来源列隐藏 */
@media (max-width: 900px) {
  .layout { grid-template-columns: 1fr; gap: 0; }
  .layout.brief-archive-layout { grid-template-columns: 1fr; gap: 0; }
  .brief-archive-layout > .rail { width: auto; }
  .brief-archive-layout > .main { grid-column: auto; }
  .layout .rail { border-bottom: 1px solid var(--border); margin: 0 0 24px;
                  padding: 0 0 8px; }
  .layout .cols-head { display: none; }
  .layout .row { grid-template-columns: auto 1fr; gap: 0 12px; padding: 9px 0;
                 align-items: start; }
  .row-t { grid-column: 2; font-size: 16.5px; }
  .row-m { grid-column: 2; font-size: 12.5px; color: var(--list-meta); }
  .row-m.hide-sm { display: none; }
  /* ⚠ 必须排在 .row-m 之后:等级格的 class 是 "row-m row-g",两条同为 (0,1,0),
   * 反过来写(稿里就是反的)会让 .row-m 的 grid-column:2 赢,圆点窜到标题那列。 */
  .row-g { grid-row: 1; grid-column: 1; justify-content: flex-start;
           padding-top: 3px; }
  .row-v { grid-column: 2; }
  .layout .toolbar { flex-wrap: wrap; }
  /* 桌面五列规则多一层页面作用域,必须在这里以同等特异性明确收回两列。 */
  .opportunity-list-page .layout .row { grid-template-columns: auto minmax(0, 1fr); }
  .opportunity-list-page .toolbar > .btn-primary { padding: 9px 16px; }
}



@media (max-width: 900px) {
  .gate-page { grid-template-columns: 1fr; gap: 42px; padding: 48px 0; }
  .gate-intro h1 { font-size: clamp(52px, 13vw, 78px); }
  .gate-card { max-width: 620px; }
  /* 桌面宽表保留吸顶表头；窄屏改为卡片内横滑，不能把根页面撑宽。 */
  .ops-page .card { max-width: 100%; overflow-x: auto; }
  .ops-page table.data.sticky thead th { position: static; }
  .ops-page td.ops-source { min-width: 8.5em; }
  .mega-menu { position: fixed; top: calc(var(--header-h) - 5px); left: 12px; right: 12px;
               width: auto; }
  .mega-menu-content { grid-auto-flow: row; grid-template-columns: repeat(2, minmax(0, 1fr));
                       grid-auto-columns: auto; }
  .mega-column, .mega-column:first-child, .mega-column:last-child {
    min-height: 0; padding: 0 18px 12px; border-left: 1px solid var(--border);
  }
  .mega-column:nth-child(odd) { padding-left: 0; border-left: 0; }
  .module-directory-panel { position: fixed; top: calc(var(--header-h) + var(--module-bar-h) - 4px);
                            left: 12px; right: 12px; }
  .module-directory-panel-content { grid-auto-flow: row;
                                    grid-template-columns: repeat(2, minmax(0, 1fr));
                                    grid-auto-columns: auto; }
  .module-directory-panel section { padding-bottom: 10px; }
  .platform-modules { grid-template-columns: 1fr; }
  .platform-module { min-height: 170px; border-right: 0; border-bottom: 1px solid var(--border); }
}

@media (max-width: 640px) {
  .wrap { padding-left: 16px; padding-right: 16px; }
  .module-bar-inner { padding: 0 16px; }
  .nav-chevron { width: 0.85rem; height: 0.85rem; }
  .platform-hero { padding-top: 58px; }
  .platform-hero h1 { font-size: clamp(38px, 13vw, 58px); }
  .platform-module { padding-left: 18px; padding-right: 18px; }
  .platform-module-icon { width: 42px; height: 42px; }
}

/* ---------- 16. 公司介绍与资源库 ---------- */
/* 参考编辑部式信息架构：大标题、目录先行、细分隔线。沿用本站 token 与双主题。 */
.company-hero {
  display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(360px, 1.15fr);
  gap: clamp(50px, 8vw, 120px); align-items: end; padding: 72px 0 54px;
  border-bottom: 1px solid var(--border);
}
.company-hero-intro { min-width: 0; }
.company-hero h1 {
  margin: 8px 0 24px; font: 600 clamp(48px, 6.8vw, 88px)/1.07 var(--font-heading);
  letter-spacing: -0.045em;
}
.company-hero-intro > p:not(.platform-kicker) {
  max-width: 580px; margin: 0; color: var(--text-2); font-size: 17px; line-height: 1.8;
}
.editorial-link {
  display: inline-flex; gap: 12px; align-items: center; margin-top: 26px; color: var(--text);
  border-bottom: 1px solid var(--text); font-weight: 600;
}
.company-directory { border-bottom: 1px solid var(--border); }
.company-directory a {
  display: flex; align-items: baseline; justify-content: space-between; gap: 24px;
  padding: 14px 2px 16px; border-top: 1px solid var(--border); color: var(--text);
  font: 600 clamp(22px, 2.35vw, 34px)/1.2 var(--font-heading);
  letter-spacing: -0.025em; transition: color 0.2s, padding-left 0.2s;
}
.company-directory a:hover, .company-directory a[aria-current="page"] {
  color: var(--accent-strong); padding-left: 8px;
}
.company-directory-copy { display: grid; gap: 5px; min-width: 0; }
.company-directory-copy strong { font: inherit; }
.company-directory-copy small {
  color: var(--text-3); font: 400 14px/1.45 var(--font-body); letter-spacing: 0;
}
.company-hero-compact { align-items: start; padding-top: 54px; }
.company-hero-compact h1 { font-size: clamp(42px, 5.3vw, 70px); }
.knowledge-notice {
  margin: 0; padding: 13px 0; border-bottom: 1px solid var(--border);
  color: var(--text-3); font-size: 12.5px;
}
.company-copy {
  max-width: 860px; margin: clamp(52px, 8vw, 96px) auto;
  font-size: 16px; line-height: 1.85;
}
.company-copy h1, .company-copy h2 {
  font-family: var(--font-heading); letter-spacing: -0.02em;
}
.company-copy > :first-child { margin-top: 0; }
.company-copy > :last-child { margin-bottom: 0; }
.knowledge-sources { margin: 0 0 36px; }
.knowledge-sources .section-head { align-items: baseline; justify-content: space-between; }

/* 资源库按参考页的窄栏排布:页头带与行式横条共用一条 952px 居中列宽 */
.resources-page { max-width: 952px; margin-inline: auto; }
.resources-hero { padding: 80px 0 18.5px; }
.resources-hero h1 {
  /* 参考页 h1 是 400 字重的 Copernicus;中文衬线只备了 600/700,只能落到 600 */
  margin: 0; font: 600 74px/1.4 var(--font-heading); letter-spacing: -1.92px;
}
.resources-hero > p:last-child {
  max-width: 660px; margin: 8px 0 0; color: var(--text-2);
  font: 400 16px/1.75 var(--font-body);
}
.resources-bridge {
  display: flex; align-items: center; justify-content: space-between; gap: 20px;
  max-width: 660px; margin-top: 24px; padding: 14px 16px;
  border: 1px solid var(--border); border-radius: 10px; background: var(--surface);
}
.resources-bridge span { display: grid; gap: 2px; min-width: 0; }
.resources-bridge strong { font-size: 14px; line-height: 1.4; }
.resources-bridge small { color: var(--text-2); font-size: 12px; line-height: 1.5; }
.resources-bridge a { flex: none; color: var(--text); font-size: 13px; font-weight: 600; text-decoration: none; white-space: nowrap; }
.resources-bridge a:hover { text-decoration: underline; text-underline-offset: 3px; }
@media (max-width: 968px) { .resources-hero h1 { font-size: 40px; } }
@media (max-width: 640px) { .resources-hero h1 { font-size: 32px; } }
.resource-categories {
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0 20px;
  margin: 12px 0 38px; border-top: 1px solid var(--border);
}
.resource-categories a {
  padding: 14px 0; border-bottom: 1px solid var(--border);
  color: var(--text-2); font-size: 14px; text-decoration: none;
}
.resource-categories a:hover, .resource-categories a[aria-current="page"] {
  color: var(--text); border-bottom-color: var(--text);
}
.resource-list-heading { display: flex; align-items: baseline; justify-content: space-between; gap: 20px; margin: 0 0 18px; }
.resource-list-heading h2 { margin: 0; font: 600 27px/1.35 var(--font-heading); }
.resource-list-heading span { color: var(--text-3); font-size: 13px; white-space: nowrap; }
@media (max-width: 640px) {
  .resource-categories { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0 16px; margin-bottom: 28px; }
  .resources-hero > p:last-child { font-size: 14px; }
  .resource-list-heading h2 { font-size: 23px; }
}

.resource-grid {
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px;
  margin-bottom: 34px;
}
.resource-card {
  display: flex; flex-direction: column; gap: 10px; min-width: 0; min-height: 168px;
  padding: 20px; color: var(--text); transition: border-color 0.3s, transform 0.3s;
}
.resource-card:hover { border-color: var(--border-strong); transform: translateY(-2px); }
.resource-category-icon { display: block; width: 124px; height: 124px; }
.resource-category-icon img { display: block; width: 100%; height: 100%; object-fit: contain; }
.resource-category-icon .resource-category-icon-dark { display: none; }
:root[data-theme="dark"] .resource-category-icon-light { display: none; }
:root[data-theme="dark"] .resource-category-icon-dark { display: block; }
@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .resource-category-icon-light { display: none; }
  :root:not([data-theme="light"]) .resource-category-icon-dark { display: block; }
}
.resource-card h2 { margin: 2px 0 0; font-size: 19px; line-height: 1.35; }
.resource-card p { margin: 0; color: var(--text-2); font-size: 13.5px; line-height: 1.55; }
.resource-card strong { font-size: 16px; line-height: 1.4; }
.resource-card > span, .resource-meta { margin-top: auto; color: var(--text-3); font-size: 12.5px; }
.resource-card-kicker { margin-top: 0 !important; text-transform: uppercase; letter-spacing: 0.08em; }

/* 资源库行式横条:整行横条、图标内嵌左侧、标题与图标顶部对齐。数值 1:1 取自参考页的
 * 课程行——952 宽、padding 32、圆角 16、行距 8、图标 124、图标与正文间距 24。
 * 行内只放图标与标题;分类、核实状态、来源归属、摘要不进列表。
 * 无图标的 other 分类渲染等宽 .resource-row-gutter 占位,保证各行文字左边对齐。 */
.resource-row-list { display: grid; grid-template-columns: 1fr; gap: 8px; margin: 0 0 34px; }
.resource-row-list .resource-card {
  display: grid; grid-template-columns: 124px minmax(0, 1fr);
  gap: 0 24px; align-items: start; min-height: 0; padding: 32px;
  border: 0; border-radius: 16px; background: var(--surface);
  /* 参考页靠象牙底衬托白卡,我们的页面底色更浅,卡片与底色几乎分不开。
   * 这里照搬系统运维「运维概览」卡片的画法:不用真边框,用 0 0 0 1px 的环,
   * 颜色取同一枚 --border 令牌(即那边的 --ops-ring),不占布局也不会顶开圆角。 */
  box-shadow: 0 0 0 1px var(--border);
  color: var(--text); transition: background-color 0.2s, box-shadow 0.2s;
}
.resource-row-list .resource-card:hover { background: var(--oat); transform: none; }
.resource-row-list .resource-category-icon,
.resource-row-list .resource-row-gutter {
  grid-column: 1; grid-row: 1 / -1; margin-top: 0; width: 124px; height: 124px;
}
.resource-row-list .resource-row-body { grid-column: 2; grid-row: 1; min-width: 0; }
.resource-row-kicker { display: block; margin: 0 0 4px; color: var(--text-3); font-size: 11px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; }
.resource-row-list .resource-card h2 {
  margin: 0; font: 600 24px/1.3 var(--font-heading); letter-spacing: -0.54px;
}
/* 简介按参考页的 20px / 行高 28px;字族改用无衬线——中文衬线只有 600 字重,
 * 20px 正文落不到 400,会整段发粗。 */
.resource-row-list .resource-card p {
  margin: 0; font: 400 20px/1.4 var(--font-body); color: var(--text-2);
}
@media (max-width: 768px) {
  .resources-bridge { align-items: flex-start; flex-direction: column; gap: 10px; }
  .resource-row-list .resource-card {
    grid-template-columns: minmax(0, 1fr); gap: 16px; padding: 20px;
  }
  .resource-row-list .resource-category-icon,
  .resource-row-list .resource-row-gutter {
    grid-column: 1; grid-row: 1; width: 88px; height: 88px;
  }
  .resource-row-list .resource-row-body { grid-column: 1; grid-row: 2; }
}
.status-dot { color: var(--text-2); font-size: 12px; white-space: nowrap; }
.status-dot::before { content: ""; display: inline-block; width: 7px; height: 7px;
                      margin-right: 6px; border-radius: 50%; background: var(--text-3); }
.status-confirmed::before { background: var(--ok); }
.status-rejected::before { background: var(--danger); }

.filter-form { display: flex; align-items: flex-end; flex-wrap: wrap; gap: 14px;
               padding: 24px 0; margin: 0; }
.filter-form > .filter-field { flex: 1 1 190px; min-width: 0; }
.filter-form > .filter-field .filter-multiselect-panel { min-width: 220px; }
.filter-form > .filter-apply-actions { margin-top: 0; }
.policy-filters { max-width: 560px; }

.resource-filters > label input {
  width: 100%; min-width: 0; font: inherit; color: var(--text); background: var(--input-bg, var(--surface));
  border: 1px solid var(--input-line, var(--border)); border-radius: 8px; padding: 9px 11px;
}
.resource-filters > label input:focus-visible {
  outline: 2px solid var(--accent-soft); border-color: var(--accent);
}
.resource-filters > label { display: flex; flex-direction: column; gap: 6px;
                            color: var(--text-2); font-size: 13px; }
.resource-filters .form-grow { flex: 1 1 320px; min-width: 0; }
.resource-filters .btn { padding: 9px 16px; }
.resource-detail-hero {
  display: flex; align-items: flex-end; justify-content: space-between; gap: 40px;
  padding: 42px 0 34px; border-bottom: 1px solid var(--border); margin-bottom: 30px;
}
.resource-detail-hero > div { min-width: 0; max-width: 820px; }
.resource-detail-hero h1 {
  margin: 8px 0 14px; font: 600 clamp(38px, 5.5vw, 64px)/1.15 var(--font-heading);
  letter-spacing: -0.035em;
}
.resource-detail-hero p:last-child { margin: 0; color: var(--text-2); }
.resource-detail-hero > .btn { flex: none; }
.resource-facts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
                  gap: 0 28px; padding: 8px 24px; margin: 0 0 34px; }
.resource-facts > div { display: grid; grid-template-columns: 92px minmax(0, 1fr);
                        gap: 12px; padding: 13px 0; border-bottom: 1px solid var(--border); }
.resource-facts dt { color: var(--text-3); font-size: 13px; }
.resource-facts dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.resource-facts code { font-size: 11px; word-break: break-all; }
.resource-text { max-height: 720px; overflow: auto; padding: 22px; white-space: pre-wrap;
                 overflow-wrap: anywhere; font: 13px/1.7 var(--font-mono); }

@media (max-width: 900px) {
  .company-hero { grid-template-columns: 1fr; }
  .resource-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .resource-facts { grid-template-columns: 1fr; }
}

@media (max-width: 640px) {
  .site-header .inner { padding: 0 10px; gap: 6px; }
  .site-header .brand { display: flex; gap: 7px; min-width: 0; }
  .site-header .brand-name { display: block; max-width: 7em; overflow: hidden;
                             font-size: 14px; text-overflow: ellipsis; }
  .site-nav { display: none; }
  .mobile-site-menu { display: block; margin-left: auto; }
  .mobile-site-menu > summary {
    min-height: 40px; padding: 0 8px; list-style: none; cursor: pointer;
    display: flex; align-items: center; gap: 7px; color: var(--text-2);
    font-size: 13px; border-radius: 8px;
  }
  .mobile-site-menu > summary::-webkit-details-marker { display: none; }
  .mobile-site-menu > summary:hover,
  .mobile-site-menu.is-open > summary { color: var(--text); background: var(--sunken); }
  .mobile-menu-icon { position: relative; width: 16px; height: 14px; flex: none; }
  .mobile-menu-icon i { position: absolute; left: 1px; width: 14px; height: 1.5px;
                        background: currentColor; border-radius: 2px;
                        transition: top 0.3s var(--ease-expo), transform 0.3s var(--ease-expo); }
  .mobile-menu-icon i:first-child { top: 4px; }
  .mobile-menu-icon i:last-child { top: 10px; }
  .mobile-site-menu.is-open .mobile-menu-icon i:first-child { top: 7px; transform: rotate(45deg); }
  .mobile-site-menu.is-open .mobile-menu-icon i:last-child { top: 7px; transform: rotate(-45deg); }
  .mobile-site-menu-panel {
    position: fixed; z-index: 70; top: var(--header-h); left: 0; right: 0;
    display: grid; grid-template-rows: 1fr; background: var(--overlay-bg, var(--surface));
    border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
    box-shadow: 0 18px 45px rgba(20, 20, 19, 0.10);
  }
  .mobile-site-menu-panel > nav { min-height: 0; overflow: hidden; padding: 10px 16px 14px; }
  .mobile-site-menu-panel a {
    min-height: 52px; display: grid; grid-template-columns: 30px 1fr auto;
    gap: 10px; align-items: center; border-bottom: 1px solid var(--border);
    color: var(--text-2); font-size: 12px;
  }
  .mobile-site-menu-panel a:last-child { border-bottom: 0; }
  .mobile-site-menu-panel a strong { color: var(--text); font: 600 18px/1.2 var(--font-sans); }
  .mobile-site-menu-panel a[aria-current="page"] strong { color: var(--accent); }
  .mobile-site-menu.disclosure-ready > .mobile-site-menu-panel {
    grid-template-rows: 0fr; opacity: 0; visibility: hidden; pointer-events: none;
    transition: grid-template-rows 0.3s var(--ease-expo), opacity 0.3s var(--ease-expo),
                visibility 0s linear 0.3s;
  }
  .mobile-site-menu.disclosure-ready.is-open > .mobile-site-menu-panel {
    grid-template-rows: 1fr; opacity: 1; visibility: visible; pointer-events: auto;
    transition: grid-template-rows 0.5s var(--ease-expo), opacity 0.5s var(--ease-expo),
                visibility 0s linear;
  }
  body:has(.gate-page) .mobile-site-menu { display: none; }
  .layout.mobile-filter-ready .mobile-filter-toggle,
  .direction-filter-shell.mobile-filter-ready .mobile-filter-toggle {
    width: 100%; min-height: 46px; margin: 0 0 16px; padding: 0 14px;
    display: flex; align-items: center; justify-content: space-between;
    color: var(--text); background: var(--oat); border: 1px solid var(--border);
    border-radius: var(--radius); font: 600 14px/1 var(--font-sans); cursor: pointer;
  }
  .layout.mobile-filter-ready .mobile-filter-toggle::after,
  .direction-filter-shell.mobile-filter-ready .mobile-filter-toggle::after {
    content: ""; width: 8px; height: 8px; border-right: 1.5px solid currentColor;
    border-bottom: 1.5px solid currentColor; transform: rotate(45deg) translate(-2px, 2px);
    transition: transform 0.3s var(--ease-expo);
  }
  .layout.mobile-filter-ready.mobile-filter-open .mobile-filter-toggle::after,
  .direction-filter-shell.mobile-filter-ready.mobile-filter-open .mobile-filter-toggle::after {
    transform: rotate(225deg) translate(-2px, 2px);
  }
  .layout.mobile-filter-ready:not(.mobile-filter-open) > .rail { display: none; }
  .layout.mobile-filter-ready.mobile-filter-open > .rail { display: block; }
  .direction-filter-shell.mobile-filter-ready:not(.mobile-filter-open) > .direction-filterbar { display: none; }
  .direction-filter-shell.mobile-filter-ready.mobile-filter-open > .direction-filterbar { display: grid; }
  .direction-filterbar { grid-template-columns: 1fr; }
  .direction-filter-search { grid-column: auto; }
  .direction-filter-actions .btn { flex: 1; text-align: center; }
  .gate-page { gap: 34px; padding: 38px 0; }
  .gate-intro h1 { margin-bottom: 20px; font-size: clamp(46px, 14vw, 62px); }
  .gate-intro > p:last-child { font-size: 15px; }
  .gate-card { padding: 26px 22px; border-radius: 18px; }
  .gate-eyebrow { margin-bottom: 24px; }
  .gate-card h2 { font-size: 29px; }
  .header-actions { flex: none; gap: 4px; }
  .header-action-bar { padding: 1px; }
  .header-action-bar:hover,
  .header-action-bar:has(.header-action:focus-visible):not(.is-restoring-focus),
  .header-action-bar.is-expanded { gap: 4px; }
  .header-action-bar .header-action { width: 30px; min-width: 30px; height: 30px; }
  .header-action-bar:hover .header-action,
  .header-action-bar:has(.header-action:focus-visible):not(.is-restoring-focus) .header-action,
  .header-action-bar.is-expanded .header-action { width: 30px; min-width: 30px; padding: 0; gap: 0; }
  .header-action-bar:hover .header-action-label,
  .header-action-bar:has(.header-action:focus-visible):not(.is-restoring-focus) .header-action-label,
  .header-action-bar.is-expanded .header-action-label { max-width: 0; margin-left: 0; opacity: 0; }
  .header-action-bar .header-action svg { width: 18px; height: 18px; }
  .settings-dialog {
    width: calc(100vw - 16px); height: calc(100dvh - 16px); min-height: 0;
    border-radius: 13px;
  }
  .settings-shell { grid-template-columns: 142px minmax(0, 1fr); }
  .settings-sidebar { padding: 22px 8px 16px; }
  .settings-sidebar-heading { padding: 0 9px 17px; }
  .settings-sidebar-heading h2 { font-size: 18px; }
  .settings-sidebar-heading p { font-size: 11px; }
  .settings-sidebar-kicker { font-size: 8px; letter-spacing: .09em; }
  .settings-nav-item { min-height: 38px; padding: 0 9px; gap: 7px; font-size: 12px; }
  .settings-nav-item svg { width: 16px; height: 16px; }
  .settings-main-header { padding: 24px 20px 18px; }
  .settings-main-header h2 { font-size: 20px; }
  .settings-main-header p { font-size: 12px; }
  .settings-content { padding: 0 20px 28px; }
  .settings-row { align-items: flex-start; flex-direction: column; gap: 13px; padding: 17px 0; }
  .settings-choice-group { align-self: stretch; }
  .settings-choice { flex: 1; padding: 0 6px; }
  .settings-inline-link, .settings-status, .settings-version { align-self: flex-start; }
  .changelog-dialog { width: calc(100vw - 24px); height: min(688px, calc(100dvh - 24px)); }
  .changelog-header { padding-left: 16px; }
  .changelog-intro { padding: 14px 16px 0; }
  .changelog-content { padding: 16px 16px 20px; }
  .company-hero { gap: 38px; padding: 38px 0 32px; }
  .company-hero h1 { font-size: clamp(42px, 14vw, 58px); }
  .company-hero-intro > p:not(.platform-kicker) { font-size: 15px; }
  .company-directory a { font-size: 25px; }
  .resources-hero { padding: 40px 0 14px; }
  .resource-detail-hero { align-items: flex-start; flex-direction: column; gap: 22px; }
  .resource-detail-hero h1 { font-size: 40px; }
  .knowledge-sources .section-head { display: block; }
  .resource-grid { grid-template-columns: 1fr; }
  .resource-card { min-height: 0; }
  .resource-filters { align-items: stretch; }
  .resource-filters > label, .resource-filters > .filter-field,
  .resource-filters > .filter-apply-actions { width: 100%; }
  .filter-form > .filter-field .filter-multiselect-panel { min-width: 0; }
  .manual-review-form { padding: 18px 15px; }
  .manual-review-fields { grid-template-columns: 1fr; }
  .manual-review-actions { display: grid; grid-template-columns: 1fr 1fr; }
  .manual-review-actions .btn:first-child { grid-column: 1 / -1; }
  .manual-review-actions .btn { width: 100%; }
  .resource-facts { padding: 6px 16px; }
  .resource-facts > div { grid-template-columns: 1fr; gap: 4px; }
}

/* 用户在设置页选择「减少动态」时，立即作用到整个页面；系统媒体查询仍可独立生效。 */
:root[data-motion="reduced"] *,
:root[data-motion="reduced"] *::before,
:root[data-motion="reduced"] *::after {
  animation-duration: 0.01ms !important;
  animation-iteration-count: 1 !important;
  scroll-behavior: auto !important;
  transition-duration: 0.01ms !important;
}

/* ---------- 17. 可访问性:降低动效 ---------- */
/* 系统开启「减少动态效果」时关闭旋转、展开过渡与跑马灯(marquee 退化为可横向滚动的列表) */
@media (prefers-reduced-motion: reduce) {
  details.card > summary::before,
  .hoverable,
  .site-menu > summary, .module-directory > summary,
  .mobile-site-menu > summary, .mobile-menu-icon i,
  .site-menu.disclosure-ready > .mega-menu,
  .module-directory.disclosure-ready > .module-directory-panel,
  .mobile-site-menu.disclosure-ready > .mobile-site-menu-panel,
  .site-menu.disclosure-ready .mega-column,
  .module-directory.disclosure-ready .module-directory-panel section,
  .mega-column a, .module-directory-panel a,
  .prompt-option.disclosure-ready > .prompt-option-panel,
  .plain.disclosure-ready > .disclosure-panel,
  .fgroup.disclosure-ready > .disclosure-panel,
  details.card.disclosure-ready > .body,
  .cat-title, .cat-arrow, .cat-body, .cat-dots i, .cat-list li, .mq-title,
  /* 方向页(§14)的 color/border-color 过渡也一并关掉:这一档用户要的是
   * 「界面不要自己动」,渐变的颜色同属此列(§13 的 .cat-title 已是先例)。 */
  .lead-title a, .story-title a, .plain summary, .dirlist a,
  .filter-multiselect > summary, .filter-multiselect-arrow,
  .filter-choice, .filter-choice-check,
  .manual-grade-picker label span,
  /* 列表页(§15):行的淡出、标题变色、折叠箭头转动、筛选项与搜索框的边框渐变。
   * 这一档用户要的是「界面不要自己动」,颜色渐变同属此列。 */
  .layout .row, .row-t, .fgroup > summary, .fgroup-arrow, .nav-chevron,
  .platform-module, .platform-module-arrow, .resource-card, .brief-archive-card,
  .brief-viewtabs::before, .brief-viewtabs a,
  .layout .search input, .mobile-filter-toggle::after,
  .policy-signal-band, .policy-signal-list a, .policy-signal-arrow,
  .policy-archive-row, .policy-archive-arrow,
  .btn, .btn-primary, .header-action, .header-action-bar,
  .header-action-bar .header-action-label, .header-action-bar .header-action svg,
  .fbbtn-mini, .app-tooltip,
  .settings-dialog, .settings-dialog::backdrop, .settings-panel,
  .changelog-dialog, .changelog-dialog::backdrop,
  .page-transition,
  .page-loading.page-entering .site-header,
  .page-loading.page-entering .module-bar,
  .page-loading.page-entering main.wrap {
    transition: none;
    animation: none;
  }
  .btn:hover, .btn-primary:hover { transform: none; }
  .fbbtn-mini:hover { transform: none; }
  .marquee-track { animation: none; }
  .marquee { overflow-x: auto; }
  /* 轨道里的内容是渲染两遍接成无缝循环的,第二遍挂 aria-hidden。动画一关,
   * 跑马灯退化成一条手动横滑的列表,那份副本仍在流内 —— 用户滑到底会把每条
   * 标题原样再看一遍。读屏已被 aria-hidden 挡住,视觉侧也一并收掉。 */
  .marquee-track > [aria-hidden="true"] { display: none; }
}

/* ---------- §17. AI 日报详情:文章版式(2026-08-31 叙事版) ----------
 * 完全复刻 Claude blog 详情页(2026-09-01):hero 三分栏(内容列+右侧 meta),
 * 正文无侧栏居中单栏。颜色一律走 token(混色用 color-mix + var(--bg)),明暗主题自适应。
 * hero 大标题是**动态文案**(叙事工序产出),必须用 w600 文字子集
 * (GB2312 一级 3755 字),不能用 258 字的 w700 display 子集——否则生僻字
 * 掉回系统宋体混排(见 §0 字体分层说明)。 */
.brief-article { max-width: none; }
body:has(.brief-article) { background: var(--brief-page-bg); }
/* 参考稿 hero 是近全宽比例(内容列左缘 ≈30% 视口)——详情页把 .wrap 上限
 * 放宽到 2000px,页头/面包屑栏同步,否则 meta 顶不到参考位置。 */
.wrap:has(.brief-article) { max-width: 2000px; }
body:has(.brief-article) .site-header .inner,
body:has(.brief-article) .module-bar-inner { max-width: 2000px; }
/* hero 完全复刻参考稿(2026-09-01 拍板,丝毫不差):三分栏——左右留白等宽,
 * 内容列 760px(方图 200/圆角 44 → 大标题 → 副标题,全部左对齐),meta 落在
 * 右侧留白栏内居中、与副标题底对齐;上下大留白(96/120px);≤1100px 单列堆叠。 */
.brief-hero { display: grid;
              grid-template-columns: minmax(0, 1fr) minmax(0, 640px) minmax(0, 1fr);
              column-gap: 24px; padding: 96px 0 168px;
              border-bottom: 1px solid var(--border); margin-bottom: 260px; }
.brief-hero-main { grid-column: 2; }
.brief-hero-cover { display: block; width: 200px; height: 200px;
                    border-radius: 44px; object-fit: cover; margin: 0 0 52px; }
.brief-hero-title { font-family: var(--font-heading); font-weight: 600;
                    font-size: clamp(30px, 2.9vw, 46px); line-height: 1.22;
                    letter-spacing: 0.01em; margin: 0; }
.brief-hero-dek { color: var(--text-2); font-size: 20px; line-height: 1.6;
                  margin: 18px 0 0; }
/* 右列 meta:复刻参考稿——每项 = 16px 线性图标 + 灰标签同行,值行缩进与
 * 标签左缘对齐;链接与「复制链接」用下划线文字样式(下划线偏移 4px、
 * 混色淡一档);项与项之间只留空距,不画分隔线。 */
/* 右下角锚定(2026-09-01 拍板):列底与副标题底对齐(align-end),右缘用
 * margin-right 固定在改版前位置——内部间距再收缩时整列向左上收,不再外扩。 */
.brief-hero-meta { grid-column: 3; justify-self: end; align-self: end;
                   margin-right: clamp(20px, 4vw, 82px); display: flex;
                   flex-direction: column; gap: 15px;
                   width: 240px; max-width: calc(100% - 24px); }
/* 官网 caption/value 都做了 leading-trim(label 文字盒 9px、值盒 12px),同样的
 * gap 视觉更紧——这里用等效参数复刻:label 行高 1 + 图标负 margin 不撑行,
 * item 内 gap 8、item 间 20,值行高 1.5。 */
.hm-item { display: flex; flex-direction: column; gap: 4px; }
.hm-head { display: flex; align-items: center; gap: 8px; line-height: 1;
           color: var(--text-2); font-size: 12px; letter-spacing: 0.12px; }
.hm-head svg { width: 19px; height: 19px; margin: -4px 0; flex: none; fill: none;
               stroke: currentColor; stroke-width: 1.5;
               stroke-linecap: round; stroke-linejoin: round; }
.hm-v { margin-left: 27px; font-size: 15px; color: var(--text);
        line-height: 1.5; }
.hm-v a { color: var(--text); text-decoration: underline;
          text-underline-offset: 3px; text-decoration-thickness: 1px;
          text-decoration-color: color-mix(in srgb, var(--text) 35%, var(--bg)); }
/* 悬停不变色(2026-09-01 拍板:去掉橙色高亮),只把下划线加深到正文全色。 */
.hm-v a:hover { text-decoration-color: var(--text); }
.hm-sub { margin-left: 27px; font-size: 12px; color: var(--text-2); }
.hm-degraded { color: var(--amber); font-weight: 600; }
.brief-copy { font: inherit; font-size: 15px; line-height: 1.6; color: var(--text);
              background: none; border: 0; padding: 0; cursor: pointer;
              text-decoration: underline; text-underline-offset: 3px;
              text-decoration-thickness: 1px;
              text-decoration-color: color-mix(in srgb, var(--text) 35%, var(--bg)); }
.brief-copy:hover { text-decoration-color: var(--text); }
/* 「已复制!」态与参考稿一致:样式不变只换文字,.copied 仅供 JS 状态标记。 */

/* 正文:参考稿式无侧栏居中单栏(760px),前后日导航同宽对齐。 */
.brief-layout { display: block; }
.brief-layout .brief-body { max-width: 640px; margin: 0 auto; }
.brief-article .brief-nav { max-width: 640px; margin: 0 auto; }

/* 文末「转给同事」卡片带(2026-09-04 晚拍板):复刻参考稿文末 Related posts——
 * 亮色通栏比正文深一档；暗色按 0907 拍板与正文底色互换。左标题右说明,下面一排卡片。
 * 企微机会卡整体迁到这里:卡图沿用立场配图(static/ai-forward-cards,2:1),
 * 标题 / 价值 / 转给谁 / 看原文照旧,只是画在浏览器里。通栏靠抵消 .wrap 的
 * 左右内边距(28px,≤640px 时 16px),不用 100vw——那会把竖滚动条宽度算进去
 * 撑出横向滚动。颜色一律走 token,明暗主题自适应。 */
.brief-related { margin: 128px -28px 0; padding: 72px 28px 84px; background: var(--brief-related-bg); }
.brief-related-inner { max-width: 1496px; margin: 0 auto; }
.brief-related-head { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
                      gap: 24px 48px; align-items: start; margin: 0 0 56px; }
.brief-related-title { font-family: var(--font-heading); font-weight: 600;
                       font-size: clamp(32px, 3.2vw, 52px); line-height: 1.1;
                       letter-spacing: 0.01em; margin: 0; }
.brief-related-lede { margin: 6px 0 0; max-width: 560px; justify-self: end;
                      color: var(--text-2); font-size: 18px; line-height: 1.6; }
.brief-related-note { color: var(--amber); }
.brief-fcards { list-style: none; margin: 0; padding: 0; display: grid;
                grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 24px; }
.brief-fcard { display: flex; flex-direction: column; min-width: 0; overflow: hidden;
               background: var(--surface); border-radius: 24px; }
/* 缺图时的占位底色按立场取:与四张立场配图的色底同调(clay / 赭红 / heather / 橄榄)。 */
.brief-fcard-cover { display: block; aspect-ratio: 2 / 1; overflow: hidden;
                     background: var(--brief-cover-sat); }
.brief-fcard[data-stance="opportunity"] .brief-fcard-cover { background: var(--brief-cover-fri); }
.brief-fcard[data-stance="threat"] .brief-fcard-cover { background: var(--grade-a); }
.brief-fcard[data-stance="neutral"] .brief-fcard-cover { background: var(--brief-cover-sun); }
.brief-fcard-cover img { display: block; width: 100%; height: 100%; object-fit: cover; }
.brief-fcard-body { display: flex; flex-direction: column; gap: 10px; flex: 1;
                    padding: 22px 24px 24px; }
/* 立场芯片与正文里的 .hl-op / .hl-th 同一套颜色语义:机会绿、威胁红、其余灰。 */
.brief-fcard-stance { align-self: flex-start; display: inline-block; padding: 0 0.5em;
                      border-radius: 5px; font-size: 12px; font-weight: 600; line-height: 1.6;
                      color: var(--text-2);
                      background: color-mix(in srgb, var(--text-2) 14%, var(--bg)); }
.brief-fcard[data-stance="opportunity"] .brief-fcard-stance { color: var(--ok);
                                                              background: var(--ok-bg); }
.brief-fcard[data-stance="threat"] .brief-fcard-stance { color: var(--hl-fg);
                                                         background: var(--hl-bg); }
.brief-fcard-title { margin: 0; font-family: var(--font-heading); font-size: 19px;
                     font-weight: 600; line-height: 1.3; display: -webkit-box;
                     -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden; }
.brief-fcard-value { margin: 0; color: var(--text-2); font-size: 14px; line-height: 1.55;
                     display: -webkit-box; -webkit-box-orient: vertical;
                     -webkit-line-clamp: 3; overflow: hidden; }
.brief-fcard-actions { margin: auto 0 0; padding-top: 8px; display: flex; flex-wrap: wrap;
                       gap: 8px; align-items: center; }
/* 转发按钮 = 全站次级按钮 .btn(用户 0903:UI 风格一致),这里只收紧尺寸;
 * 底色、边框、圆角与明暗主题全部跟 .btn 的 token 走,不另写颜色。 */
.bf-btn { padding: 5px 14px; font-size: 13.5px; text-decoration: none; }
.brief-fcard-actions form { margin: 0; }
.brief-fcard-status { margin: 0; color: var(--text-2); font-size: 13px; line-height: 1.55; }
.brief-fcard-status:empty { display: none; }
.bf-source { margin-left: auto; font-size: 13.5px; color: var(--text-2);
             text-decoration: underline; text-underline-offset: 3px;
             text-decoration-thickness: 1px;
             text-decoration-color: color-mix(in srgb, var(--text) 35%, var(--bg)); }
.bf-source:hover { color: var(--text); text-decoration-color: var(--text); }
/* 前后日导航与「转给同事」同底色；顶线复用 hero 的 1px var(--border)。
 * 外层负责通栏色带，内层 nav 仍与 640px 正文对齐。底部抵消 .wrap 的 56px padding，
 * 避免导航下方再露出一截正文底色。 */
.brief-nav-band { margin: 128px -28px -56px; padding: 28px 28px 32px;
                  background: var(--brief-related-bg); border-top: 1px solid var(--border); }
.brief-related + .brief-nav-band { margin-top: 0; }
@media (max-width: 1100px) {
  .brief-related { margin-top: 72px; padding: 48px 28px 56px; }
  .brief-related-head { grid-template-columns: 1fr; gap: 12px; margin-bottom: 32px; }
  .brief-related-lede { justify-self: start; }
  .brief-fcards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .brief-related { margin-left: -16px; margin-right: -16px;
                   padding-left: 16px; padding-right: 16px; }
  .brief-nav-band { margin-left: -16px; margin-right: -16px;
                    padding-left: 16px; padding-right: 16px; }
  .brief-related-title { font-size: 30px; }
  .brief-fcards { grid-template-columns: 1fr; gap: 16px; }
}
@media (max-width: 1100px) {
  .brief-hero { grid-template-columns: 1fr; row-gap: 26px;
                padding: 36px 0 44px; margin-bottom: 30px; }
  .brief-hero-main { grid-column: 1; }
  .brief-hero-meta { grid-column: 1; justify-self: stretch; width: auto;
                     margin-right: 0; }
  .brief-hero-cover { width: 156px; height: 156px; border-radius: 34px;
                      margin-bottom: 34px; }
}

/* 文章正文与围栏块(render_brief_article 的受控输出)。
 * 2026-09-01 议论文改版:正文以自然段为主,文段排版对齐参考稿——衬线大节题、
 * 17px/1.82 正文;正文内链接为下划线文字样式,悬停只加深下划线不变色
 * (须压过模板内联 .brief-body a 的 accent 规则,故用双类提高特异度)。 */
.brief-article-body { font-size: 17px; line-height: 1.8; }
/* 双类写法不是冗余:模板内联 <style> 的 .brief-body h3/p 规则在文档流里
 * 靠后,同特异度会赢——文章体的节题/段距必须用 (0,2,1) 压回来。 */
.brief-body.brief-article-body h3 { font-family: var(--font-heading);
                         font-weight: 600; font-size: 28px;
                         margin: 2.2em 0 0.8em; scroll-margin-top: 90px; }
.brief-body.brief-article-body h3:first-child { margin-top: 0.3em; }
.brief-body.brief-article-body p { margin: 0.9em 0; }
.brief-body.brief-article-body a {
  color: inherit; word-break: normal; text-decoration: underline;
  text-underline-offset: 4px; text-decoration-thickness: 1px;
  text-decoration-color: color-mix(in srgb, var(--text) 45%, var(--bg)); }
.brief-body.brief-article-body a:hover { text-decoration-color: var(--text); }
.brief-article-body h4 { font-size: 17px; font-weight: 650; margin: 0 0 0.35em;
                         display: flex; align-items: baseline; gap: 8px; }
.bb-overview { font-size: 17.5px; }
.bb-overview p { margin: 0.9em 0; }
.bb-verdict, .bb-action, .bb-watch { border-left: 3px solid var(--border);
                                     padding: 2px 0 2px 14px; margin: 0.9em 0; }
.bb-verdict { border-left-color: var(--amber); }
.bb-action { border-left-color: var(--ok); }
.bb-label { display: block; font-size: 12px; letter-spacing: 0.08em;
            color: var(--text-2); margin-bottom: 2px; }
.bb-verdict .bb-label { color: var(--amber); }
.bb-action .bb-label { color: var(--ok); }
.bb-entry { border-bottom: 1px solid var(--border); padding: 14px 0; }
.grade { flex: none; display: inline-flex; align-items: center; justify-content: center;
         min-width: 20px; height: 20px; padding: 0 4px; border-radius: 6px;
         font-size: 12px; font-weight: 700; line-height: 1; }
/* A 级用全站列表页同款 --grade-a 红(2026-09-03):此前是琥珀色,与徽标体系不一致。 */
.brief-article-body .grade-a { background: color-mix(in srgb, var(--grade-a) 18%, var(--bg));
                               color: var(--grade-a); }
.brief-article-body .grade-b {
  background: color-mix(in srgb, var(--text-2) 14%, var(--bg));
  color: var(--text-2);
}
.entry-value { color: color-mix(in srgb, var(--text) 82%, var(--bg));
               font-style: italic; }
.entry-plain { color: var(--text-2); border-left: 3px solid var(--border);
               padding-left: 12px; }
.entry-meta { font-size: 13px; color: var(--text-2); }
/* —— 重点字句的确定性强调(2026-09-03 用户拍板,克制版)——
 * 渲染层按文本节点标出:判断句整句(「对磐隐……」「整体判断……」,红字)、带单位
 * 的数字(红字加重)、≤10 字的短引语(Claude 风格内联芯片,每段最多两个)、元信息行
 * 的立场(机会绿 / 威胁红);写手自己加粗的关键句同样红字。不上斜体、下划线与任何
 * 符号;标题、链接、来源、图表、索引不碰。判「哪一段」在 brief_html._emphasize,
 * 这里只管颜色与形状。 */
.brief-article-body .hl-sent { color: var(--hl-fg); }
.brief-article-body p strong { color: var(--hl-fg); }
/* 超过 80 字的整段粗体(brief_html._BOLD_RUN_MAX)降回普通字重与字色 */
.brief-article-body p strong.hl-long { color: inherit; font-weight: 500; }
.brief-article-body .hl-num { color: var(--hl-fg); font-weight: 600; }
.brief-article-body .hl-chip { color: var(--hl-fg); background: var(--hl-bg);
                               border: 1px solid var(--hl-line); border-radius: 5px;
                               padding: 0 0.32em; margin: 0 0.06em; font-size: 0.94em;
                               line-height: 1.35; white-space: nowrap; }
.brief-article-body .hl-op, .brief-article-body .hl-th {
  display: inline-block; padding: 0 0.42em; border-radius: 5px; font-size: 12px;
  font-weight: 600; line-height: 1.55; border: 1px solid transparent; }
.brief-article-body .hl-op { color: var(--ok); background: var(--ok-bg); }
.brief-article-body .hl-th { color: var(--hl-fg); background: var(--hl-bg);
                             border-color: var(--hl-line); }
.bb-entry-index ul { list-style: none; padding: 0; margin: 0.5em 0;
                     display: flex; flex-direction: column; gap: 8px; }
.bb-entry-index li { display: flex; align-items: baseline; gap: 8px;
                     color: var(--text-2); font-size: 14.5px; line-height: 1.55; }
.bb-stats { margin-top: 2.4em; border-top: 1px solid var(--border); padding-top: 12px; }
.bb-stats .stat-line { font-size: 13px; color: var(--text-2); margin: 0.3em 0; }
.bb-stats .stat-warn { font-size: 13px; color: var(--amber); font-weight: 600;
                       margin: 0.3em 0; }
/* —— 方向热度图(:::chart,0901):代码渲染的堆叠柱,固定六色盘 —— */
.bb-chart { margin: 44px 0; }
.bb-chart .chart-title { font-size: 12px; font-weight: 600; letter-spacing: 0.08em;
                         color: var(--text-2); margin: 0 0 14px; }
.bb-chart .chart-svg { display: block; width: 100%; height: auto; }
.bb-chart .chart-axis { stroke: var(--border); stroke-width: 1; }
.bb-chart .chart-val { fill: var(--text-2); font-size: 11px; }
.bb-chart .chart-lab { fill: var(--text-2); font-size: 11px; }
.bb-chart .chart-legend { display: flex; flex-wrap: wrap; gap: 6px 18px;
                          margin-top: 12px; font-size: 12.5px; color: var(--text-2); }
.bb-chart .chart-key { display: inline-flex; align-items: center; gap: 6px; }
.bb-chart .ck { flex: none; width: 10px; height: 10px; border-radius: 3px; }
/* —— 文章方向配图(:::figure,0901):生图 webp 优先,svg 占位兜底 —— */
.bb-figure { margin: 44px 0; }
.bb-figure .fig-img { display: block; width: 100%; border-radius: 24px; }
/* 色值对亮暗两套底都保持中间明度,fill 供 rect,background 供图例色块 */
.chart-c0 { fill: #d97757; background: #d97757; }
.chart-c1 { fill: #7a93ac; background: #7a93ac; }
.chart-c2 { fill: #6b8f71; background: #6b8f71; }
.chart-c3 { fill: #c9a227; background: #c9a227; }
.chart-c4 { fill: #9c7ba6; background: #9c7ba6; }
.chart-c5 { fill: #b0aca2; background: #b0aca2; }
.follow-chip { display: inline-block; padding: 1px 8px; border-radius: 999px; font-size: 11.5px;
  border: 1px solid var(--border); color: var(--text-2); background: var(--control-hover); }
.follow-chip-muted { color: var(--text-3); background: transparent; }
.follow-box .follow-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 8px 0 0; }
.follow-inline { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 8px 0 0; }
.filter-check { display: inline-flex; align-items: center; gap: 6px; font-size: 13px;
  color: var(--text-2); cursor: pointer; }

/* 我的视图(0904):工具栏「保存当前筛选」+ 侧栏视图列表 */
.save-view { display: flex; gap: 8px; align-items: center; margin: 10px 0 0; }
.save-view input[type="text"] { flex: 1; min-width: 0; }
.saved-views { list-style: none; margin: 0 0 16px; padding: 0; }
.saved-views li { display: flex; align-items: center; justify-content: space-between;
  gap: 6px; padding: 4px 0; font-size: 13.5px; }
.saved-views .inline { display: inline-flex; margin: 0; }
.saved-views .linklike { appearance: none; border: 0; background: transparent;
  color: var(--text-3); cursor: pointer; padding: 0 2px; font-size: 14px; line-height: 1; }
.saved-views .linklike:hover { color: var(--danger); }

/* prompts(0.52.0 一期):提示词管理页——工序图、占位符、正文编辑、版本对比 */
/* Reference 5: repeated horizontal bordered panels. Reference 6: quiet vertical rail. */
.pipe-flow { list-style: none; margin: 20px 0 28px; padding: 0; display: grid; gap: 14px; }
.pipe-node { min-width: 0; padding-left: 40px; position: relative; }
.pipe-node:not(:last-child)::after { content: ""; position: absolute; left: 11px;
  top: 46px; bottom: -30px; width: 1px; background: var(--border); }
.pipe-marker { position: absolute; left: 0; top: 21px; width: 24px; }
.pipe-marker img { display: block; width: 24px; height: 24px; object-fit: contain; }
.pipe-panel, .pipe-context { display: grid; border: 1px solid var(--border); border-radius: 16px;
  background: var(--surface); }
/* Compact the short edge, never the horizontal span or text/image proportions.
 * 154px targets ~80% of the former closed panels; long/expanded content grows naturally. */
.pipe-panel { grid-template-columns: 180px minmax(0, 1fr); min-height: 154px;
  box-sizing: border-box; overflow: hidden; }
.pipe-art { min-width: 0; min-height: 144px; position: relative; background: var(--art-bg); }
.pipe-art img { position: absolute; display: block; width: 100%; height: 100%; object-fit: contain; }
.pipe-body { min-width: 0; padding: 10px 26px; }
.pipe-body .pipe-options { margin-top: 8px; }
.pipe-context { grid-template-columns: minmax(210px, 0.8fr) minmax(0, 2fr); align-items: start; gap: 20px 28px; padding: 22px 24px; }
.pipe-context { margin-top: 22px; margin-left: 40px; }
.pipe-heading { display: flex; align-items: flex-start; gap: 14px; min-width: 0; }
.pipe-copy { min-width: 0; }
.pipe-title-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 12px; }
.pipe-title-row .pipe-name { margin: 0; }
.pipe-name, .pipe-context h3 { margin: 0 0 6px; font-family: var(--font-heading); font-size: 19px; font-weight: 600; color: var(--text); }
.pipe-kind { font-size: 12px; color: var(--text-3); }
.pipe-note { margin: 7px 0 0; font-size: 13px; line-height: 1.6; color: var(--text-2); }
/* Reference cards: regular serif Chinese body, muted ink, lighter metadata. */
.pipe-description { margin: 4px 0 0;
  font-family: "Anthropic Mono", "Songti SC", "Noto Serif CJK SC", "Source Han Serif SC", "Noto Serif SC", SimSun, serif;
  font-size: 15px;
  font-weight: 400; line-height: 1.65; color: var(--text-2); }
.pipe-steps { list-style: none; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr));
  max-width: 360px; margin: 8px 0 0; padding: 0; }
.pipe-step { position: relative; min-width: 0; display: flex; flex-direction: column; align-items: center; }
.pipe-step:not(:last-child)::after { content: ""; position: absolute; top: 14px;
  left: calc(50% + 18px); width: calc(100% - 36px); height: 1px; background: var(--border); }
.pipe-step img { display: block; width: 28px; height: 28px; object-fit: contain; }
.pipe-step-label { display: flex; flex-direction: column; align-items: center; margin-top: 4px;
  color: var(--text-2); font-size: 12px; line-height: 1.5; }
.pipe-step-label > span { white-space: nowrap; }
.pipe-options { display: flex; flex-wrap: wrap; align-items: start; gap: 8px; min-width: 0; }
.prompt-option { max-width: 100%; min-width: 0; }
/* Same 4px inset, 16/12px radii and 40px control height as the daily view switch. */
.prompt-option > summary { display: flex; align-items: center; justify-content: space-between; gap: 16px;
  min-height: 40px; box-sizing: border-box; padding: 8px 14px; list-style: none;
  border-radius: 12px; background: var(--control-hover); color: var(--text); font-size: 13px; cursor: pointer; }
.prompt-option > summary::-webkit-details-marker { display: none; }
.prompt-option > summary:hover { background: var(--sunken); }
.prompt-option > summary:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.prompt-option > summary .nav-chevron { color: var(--text-3); }
.prompt-option-panel { display: grid; grid-template-rows: 1fr; }
.prompt-option[open] { flex-basis: 100%; padding: 4px; border-radius: 16px; background: var(--sunken); }
.prompt-option[open] > summary { background: var(--control-bg, var(--surface)); box-shadow: var(--shadow); }
.prompt-option-detail { padding: 11px 10px 8px; }
.prompt-option-heading { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px; }
.prompt-metadata { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 20px;
  margin: 12px 0 0; font-size: 12px; line-height: 1.6; }
.prompt-metadata > div { min-width: 0; }
.prompt-metadata dt { color: var(--text-3); }
.prompt-metadata dd { margin: 3px 0 0; color: var(--text-2); overflow-wrap: anywhere; }
@media (max-width: 900px) {
  .pipe-panel { grid-template-columns: 140px minmax(0, 1fr); }
  .pipe-context { grid-template-columns: minmax(0, 1fr); gap: 16px; padding: 18px; }
  .pipe-body { padding: 10px 18px; }
}
@media (max-width: 520px) {
  .pipe-panel { grid-template-columns: 76px minmax(0, 1fr); }
  .pipe-art { min-height: 112px; }
  .pipe-body { padding: 10px 12px; }
  .pipe-node { padding-left: 28px; }
  .pipe-context { margin-left: 28px; }
  .pipe-marker { left: -2px; }
  .pipe-node:not(:last-child)::after { left: 9px; }
  .prompt-metadata { grid-template-columns: minmax(0, 1fr); }
}
.prompt-form { display: flex; flex-direction: column; gap: 8px; }
.prompt-text { width: 100%; box-sizing: border-box; padding: 10px 12px; resize: vertical;
  font: 13.5px/1.55 var(--font-mono);
  border: 1px solid var(--input-line, var(--border)); border-radius: var(--radius); background: var(--input-bg, transparent); color: var(--text); }
.prompt-text[readonly] { color: var(--text-2); background: var(--control-hover); }
.prompt-note { display: flex; gap: 8px; align-items: center; font-size: 13px; color: var(--text-2); }
.prompt-note input[type="text"] { flex: 1; min-width: 0; }
code.ph { margin-right: 6px; }
.ph-opt { color: var(--text-3); }
pre.diff { margin: 10px 0 0; padding: 10px 12px; border: 1px solid var(--border); border-radius: var(--radius);
  background: var(--control-hover); font-size: 12.5px; line-height: 1.5; white-space: pre-wrap;
  word-break: break-all; overflow-x: auto; }
pre.diff .diff-add { color: var(--ok); }
pre.diff .diff-del { color: var(--danger); }
pre.diff .diff-hunk, pre.diff .diff-file { color: var(--text-3); }
pre.diff .diff-ctx { color: var(--text-2); }

/* 商机范围采用紧凑分段栏；统计独立于按钮，避免长胶囊抢占层级。 */
.scope-tabs { display: flex; align-items: center; gap: 8px 14px; flex-wrap: wrap; margin: 0 0 16px; }
.scope-tab-group { display: inline-flex; flex: none; align-items: center; gap: 2px;
  height: 30px; padding: 2px; border: 1px solid var(--border); border-radius: 8px;
  background: var(--control-bg); }
.scope-tab-group a { display: inline-flex; align-items: center; height: 24px; padding: 0 10px;
  border: 1px solid transparent; border-radius: 5px; color: var(--text-2);
  font-size: 14px; line-height: 20px; white-space: nowrap; text-decoration: none; }
.scope-tab-group a:hover { color: var(--text); background: var(--surface); }
.scope-tab-group a.active { color: var(--text); border-color: var(--border);
  background: var(--surface); font-weight: 500; }
.scope-tab-group a:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 1px; }
.scope-tabs > span { color: var(--text-3); font-size: 13px; line-height: 20px; }

/* 只收紧商机筛选控件，不改变其他页面或列表正文的字号与密度。 */
.opportunity-list-page .layout .toolbar { gap: 8px; margin-bottom: 12px; flex-wrap: nowrap; }
.opportunity-list-page .layout .search { min-width: 0; }
.opportunity-list-page .layout .search input,
.opportunity-list-page .toolbar > .btn-primary,
.opportunity-list-page .save-view input[type="text"],
.opportunity-list-page .save-view .btn,
.opportunity-list-page .filter-apply-actions .btn {
  height: 28px; min-height: 28px; padding: 2px 10px; border-radius: 6px;
  border-width: 1px; font-size: 15px; line-height: 22px;
}
/* 搜索比保存栏大一号；上下内距差 2px，让文字视觉中心下移 1px。 */
.opportunity-list-page .layout .search input,
.opportunity-list-page .toolbar > .btn-primary {
  height: 36px; min-height: 36px; padding-top: 7px; padding-bottom: 5px; border-radius: 8px;
}
.opportunity-list-page .save-view input[type="text"],
.opportunity-list-page .save-view .btn { padding-top: 3px; padding-bottom: 1px; }
.opportunity-list-page .layout .search input { padding-left: 30px; }
.opportunity-list-page .layout .search svg { left: 10px; width: 14px; height: 14px; }
.opportunity-list-page .save-view { margin: 0 0 16px; gap: 8px; }
.opportunity-list-page .save-view .btn { flex: none; white-space: nowrap; }
.opportunity-list-page .fgroup > summary { padding: 8px 2px; }
.opportunity-list-page .filter-choice { min-height: 32px; padding: 4px 10px;
  grid-template-columns: minmax(0, 1fr) auto 18px; gap: 8px; line-height: 22px;
  border-color: var(--border); border-radius: 6px; background: var(--control-bg); }
.opportunity-list-page .filter-choice:hover { border-color: var(--border-strong); }
.opportunity-list-page .filter-choice:has(.filter-choice-input:checked) { background: var(--selected-bg); }
.opportunity-list-page .filter-choice-check { width: 18px; height: 18px; border-radius: 5px; }
.opportunity-list-page .filter-choice-check svg { width: 14px; height: 14px; }

/* ---------- 18. 栏目配置入口与管理表单(0.58.1) ---------- */
/* Compact configuration frame; the inset follows the daily view switch interaction. */
.module-tools { flex: none; display: flex; align-items: center; gap: 8px; white-space: nowrap;
  padding: 2px; border: 1px solid var(--border); border-radius: 9px; background: var(--sunken); }
.module-tools-label { display: inline-flex; align-items: center; gap: 5px; padding: 0 9px 0 7px;
  border-right: 1px solid var(--border); color: var(--text-2); font-size: 12px; line-height: 18px; }
.module-tool-tabs { --module-tool-x: 0%; position: relative; isolation: isolate;
  display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); }
.module-tool-tabs::before { content: ""; position: absolute; z-index: -1; inset: 0 auto 0 0;
  width: calc(100% / 3); border-radius: 6px; background: var(--selected-bg, var(--surface));
  box-shadow: var(--shadow); opacity: 0; transform: translateX(var(--module-tool-x));
  transition: transform 420ms cubic-bezier(0.16, 1, 0.3, 1), opacity 180ms ease-out; }
.module-tool-tabs:has(a[aria-current="page"])::before,
.module-tool-tabs:has(a:hover)::before,
.module-tool-tabs:has(a:focus-visible)::before { opacity: 1; }
.module-tool-tabs:has(a:nth-child(2)[aria-current="page"]) { --module-tool-x: 100%; }
.module-tool-tabs:has(a:nth-child(3)[aria-current="page"]) { --module-tool-x: 200%; }
.module-tool-tabs:has(a:nth-child(1):focus-visible) { --module-tool-x: 0%; }
.module-tool-tabs:has(a:nth-child(2):focus-visible) { --module-tool-x: 100%; }
.module-tool-tabs:has(a:nth-child(3):focus-visible) { --module-tool-x: 200%; }
.module-tool-tabs:has(a:nth-child(1):hover) { --module-tool-x: 0%; }
.module-tool-tabs:has(a:nth-child(2):hover) { --module-tool-x: 100%; }
.module-tool-tabs:has(a:nth-child(3):hover) { --module-tool-x: 200%; }
.module-tools a { position: relative; display: inline-flex; align-items: center; justify-content: center;
  gap: 5px; min-height: 26px; box-sizing: border-box; padding: 4px 9px; border-radius: 6px;
  color: var(--text-2); font-size: 12px; line-height: 18px; text-decoration: none;
  transition: color 180ms ease-out; }
.module-tools a:hover, .module-tools a[aria-current="page"] { color: var(--text); }
.module-tools a:focus-visible { outline: 2px solid var(--focus-ring); outline-offset: 1px; }
.module-tool-text { transform: translateY(1px); }
.module-tool-icon { display: inline-block; flex: none; width: 18px; height: 18px; background: currentColor;
  mask: var(--module-tool-icon) center / contain no-repeat; }
.module-tool-icon--config { --module-tool-icon: url("/static/config-nav-icons/config.png"); }
.module-tool-icon--prompts { --module-tool-icon: url("/static/config-nav-icons/prompts.png"); }
.module-tool-icon--sources { --module-tool-icon: url("/static/config-nav-icons/sources.png"); mask-size: 16px 16px; }
.module-tool-icon--tasks { --module-tool-icon: url("/static/config-nav-icons/tasks.png"); }
@media (prefers-reduced-motion: reduce) {
  .module-tool-tabs::before, .module-tools a { transition: none; }
}
.section-head .section-head-action { margin-left: auto; }
.btn-ghost { background: transparent; }
@media (max-width: 900px) { .module-tools { display: none; } }

/* AI source directory: five bounded columns, secondary metrics wrap inside their column. */
.source-table { table-layout: fixed; width: 100%; }
.source-col-identity { width: 24%; }
.source-col-status { width: 13%; }
.source-col-fetch { width: 22%; }
.source-col-observation { width: 24%; }
.source-col-actions { width: 17%; }
table.source-table td, table.source-table th { padding: 14px 16px; vertical-align: top; }
table.source-table td { font-size: 12.5px; line-height: 1.65; overflow-wrap: anywhere; }
table.source-table th { font-size: 12px; white-space: nowrap; }
.source-identity > strong, .source-identity > code, .source-identity > span { display: block; }
.source-identity > strong { font-size: 14px; margin-bottom: 3px; }
.source-identity > code { font-size: 11px; color: var(--text-3); }
.source-identity .src-url { font-size: 11px; overflow-wrap: anywhere; }
.source-meta, .source-metrics { display: flex; flex-wrap: wrap; gap: 2px 10px; }
.source-meta > span, .source-metrics > span { white-space: nowrap; }
.source-state { color: var(--text); }
.source-subtitle { display: block; font-size: 11px; color: var(--text-3); margin-bottom: 3px; }
.source-trial { margin-top: 10px; }
.source-zero { margin-top: 4px; font-size: 11px; }
.source-table .src-actions > form, .source-table .src-actions > a, .source-change { display: inline-block; margin: 0 4px 6px 0; }
.source-table .src-actions > .muted { display: block; font-size: 11px; }
.source-table .src-actions .btn { min-height: 32px; padding: 5px 10px; font-size: 12px; white-space: nowrap; }
.source-change > summary { list-style: none; cursor: pointer; }
.source-change > summary::-webkit-details-marker { display: none; }
.source-change[open] { display: block; margin-right: 0; }
.source-table .lifecycle-form { display: grid; grid-template-columns: minmax(0, 1fr); gap: 6px; margin-top: 8px; }
.source-table .lifecycle-form input, .source-table .lifecycle-form select { width: 100%; min-width: 0; box-sizing: border-box; }
.source-table .lifecycle-form button { justify-self: start; }
.source-table .trial-detail { overflow-wrap: anywhere; }
@media (max-width: 1100px) {
  table.source-table td, table.source-table th { padding: 12px 10px; }
}
@media (max-width: 900px) {
  .source-table, .source-table tbody { display: block; }
  table.source-table thead, .source-table colgroup { display: none; }
  .source-table tr { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); padding: 14px; border-bottom: 1px solid var(--border); }
  table.source-table td { display: block; border: 0; padding: 8px; }
  table.source-table td::before { content: attr(data-label); display: block; margin-bottom: 5px; font-size: 11px; color: var(--text-3); }
  .source-table .source-identity { grid-column: 1 / -1; }
}
@media (max-width: 520px) {
  .source-table tr { grid-template-columns: minmax(0, 1fr); }
}

/* 管理表单(信源登记 / 任务新建编辑):两列网格,标签在上控件在下;复选清单按列自动排。
   控件沿用 §7 的 input/select 外观,只把 number / time 补成同一副皮。 */
.source-form { display: grid; gap: 14px; }
.source-form h3 { margin: 6px 0 -6px; font-size: 14px; font-weight: 600; color: var(--text-2); letter-spacing: 0.02em; }
.source-form > label { display: inline-flex; align-items: center; gap: 8px; font-size: 13.5px; }
.source-form-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 18px; }
.source-form-grid > label { display: flex; flex-direction: column; gap: 5px; font-size: 13px; color: var(--text-2); }
.source-form-grid > label > .muted { font-size: 12px; }
.source-form-grid .wide { grid-column: 1 / -1; }
.source-form input[type="text"], .source-form input[type="number"], .source-form input[type="time"],
.source-form input[type="url"], .source-form select { width: 100%; box-sizing: border-box; }
.source-form input[type="number"], .source-form input[type="time"] {
  font: inherit; color: var(--text); background: var(--input-bg, var(--surface));
  border: 1px solid var(--input-line, var(--border)); border-radius: 8px; padding: 5px 10px;
}
.source-form input[type="number"]:focus-visible, .source-form input[type="time"]:focus-visible {
  outline: 2px solid var(--accent-soft); outline-offset: 0; border-color: var(--accent);
}
.source-form input[readonly], .source-form input:disabled, .source-form select:disabled { color: var(--text-3); background: var(--sunken); }
.task-sources, .task-directions { grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 2px 14px; }
.task-sources > label, .task-directions > label {
  flex-direction: row; align-items: center; gap: 8px; padding: 4px 6px;
  border-radius: 7px; font-size: 13.5px; color: var(--text);
}
.task-sources > label:hover, .task-directions > label:hover { background: var(--oat); }
.task-sources code { font-size: 12px; color: var(--text-3); }
.task-recipients > div { display: flex; flex-direction: column; gap: 2px; font-size: 13.5px; }
.task-recipients > div > strong { margin-bottom: 4px; font-size: 13px; color: var(--text-2); }
.task-recipients label { display: inline-flex; align-items: center; gap: 8px; padding: 3px 6px; border-radius: 7px; }
.task-recipients label:hover { background: var(--oat); }
.task-days { grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: 13px; color: var(--text-2); }
.task-days label { display: inline-flex; align-items: center; gap: 6px; padding: 3px 10px; border: 1px solid var(--border); border-radius: 999px; color: var(--text); }
.task-days label:has(input:checked) { border-color: var(--accent); background: var(--accent-soft); }

/* 信源页行内动作与试抓 / 探测结果 */
.lifecycle-form select, .lifecycle-form input[type="text"] { min-width: 0; }
.lifecycle-form input[type="text"] { flex: 1 1 140px; }
.trial-detail { margin-top: 6px; padding: 8px 10px; background: var(--sunken); border-radius: 8px; font-size: 12.5px; }
.trial-samples { margin: 6px 0 0 18px; padding: 0; font-size: 12.5px; color: var(--text-2); }
.probe-result { margin: 10px 0 4px; }

/* 存档页任务切换条 + 试跑结果正文 */
.brief-task-switch { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }
.brief-task-switch .btn { border-radius: 999px; }
.dry-text {
  margin: 0; padding: 12px 14px; max-height: 60vh; overflow: auto;
  white-space: pre-wrap; word-break: break-word;
  font: 13px/1.55 var(--font-mono); color: var(--text);
  background: var(--sunken); border: 1px solid var(--border); border-radius: 8px;
}
@media (max-width: 640px) {
  .source-form-grid, .task-recipients { grid-template-columns: 1fr; }
}

/* ---------- 任务管理：Routine 式列表、周历与编辑器（0.61.0） ---------- */
.routine-page { display: grid; gap: 18px; padding-top: 4px; }
.routine-hero { display: flex; align-items: flex-start; justify-content: space-between; gap: 24px; }
.routine-heading { min-width: 0; }
.routine-title-row { display: flex; align-items: center; gap: 9px; min-height: 34px; }
.routine-title-row h1 { margin: 0; font-size: 21px; line-height: 1.25; font-weight: 650; letter-spacing: -0.02em; }
.routine-title-icon { display: grid; place-items: center; width: 22px; height: 22px; color: var(--text-2); }
.routine-title-icon svg, .routine-new-button svg, .routine-search svg,
.routine-filter summary svg, .routine-health-icon svg, .routine-editor-crumb svg,
.routine-editor-banner svg { width: 100%; height: 100%; fill: none; stroke: currentColor; stroke-width: 1.7; stroke-linecap: round; stroke-linejoin: round; }
.routine-count { color: var(--text-3); font-size: 13px; font-weight: 450; }
.routine-heading > p { margin: 3px 0 0 31px; color: var(--text-3); font-size: 14px; }
.routine-new-button { min-height: 36px; gap: 7px; padding: 7px 13px; white-space: nowrap; }
.routine-new-button svg { width: 16px; height: 16px; }
.routine-notice, .routine-health, .routine-readonly { border: 1px solid var(--border); border-radius: 10px; background: var(--sunken); }
.routine-notice { display: flex; align-items: center; gap: 9px; padding: 9px 12px; color: var(--text-2); font-size: 13px; }
.routine-notice span { display: grid; place-items: center; width: 18px; height: 18px; border-radius: 50%; background: var(--ok-bg); color: var(--ok); font-weight: 700; }
.routine-notice.is-warn span { background: var(--amber-bg); color: var(--amber); }
.routine-notice p { margin: 0; }
.routine-health { display: flex; align-items: center; gap: 10px; padding: 10px 13px; }
.routine-health-icon { flex: 0 0 19px; width: 19px; height: 19px; color: var(--ok); }
.routine-health strong { display: inline; color: var(--text); font-size: 13px; font-weight: 620; }
.routine-health p { display: inline; margin: 0 0 0 7px; color: var(--text-3); font-size: 12.5px; }
.routine-health.is-stale { background: var(--danger-bg); border-color: var(--danger); }
.routine-health.is-stale .routine-health-icon, .routine-health.is-stale strong { color: var(--danger); }
.routine-readonly { margin: 0; padding: 9px 12px; color: var(--text-2); font-size: 13px; }
.routine-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; margin-top: 4px; }
.routine-view-switch { display: inline-flex; align-items: center; padding: 2px; border-radius: 9px; background: var(--sunken); }
.routine-view-switch button { border: 0; border-radius: 7px; background: transparent; color: var(--text-3); padding: 5px 11px; font: inherit; font-size: 13.5px; cursor: pointer; }
.routine-view-switch button[aria-pressed="true"] { background: var(--selected-bg, var(--surface)); color: var(--text); box-shadow: var(--shadow); }
.routine-toolbar-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }
.routine-toggle { display: inline-flex; align-items: center; gap: 7px; color: var(--text-3); font-size: 13px; cursor: pointer; white-space: nowrap; }
.routine-toggle input { position: absolute; opacity: 0; pointer-events: none; }
.routine-toggle i { position: relative; width: 28px; height: 16px; border-radius: 999px; background: var(--border-strong); transition: background .16s ease; }
.routine-toggle i::after { content: ""; position: absolute; top: 2px; left: 2px; width: 12px; height: 12px; border-radius: 50%; background: var(--surface); box-shadow: var(--shadow); transition: transform .16s ease; }
.routine-toggle input:checked + i { background: var(--text-2); }
.routine-toggle input:checked + i::after { transform: translateX(12px); }
.routine-toggle input:focus-visible + i { outline: 2px solid var(--focus-ring); outline-offset: 2px; }
.routine-filter { position: relative; }
.routine-filter summary { display: inline-flex; align-items: center; gap: 6px; min-height: 34px; box-sizing: border-box; padding: 5px 10px; border: 1px solid var(--border); border-radius: 8px; background: var(--control-bg, var(--surface)); color: var(--text); font-size: 13.5px; cursor: pointer; list-style: none; box-shadow: var(--shadow); }
.routine-filter summary::-webkit-details-marker, .routine-action-menu summary::-webkit-details-marker { display: none; }
.routine-filter summary svg { width: 16px; height: 16px; }
.routine-filter summary span { min-width: 17px; padding: 1px 5px; border-radius: 999px; background: var(--accent-soft); color: var(--accent-strong); font-size: 11px; text-align: center; }
.routine-filter-popover { position: absolute; z-index: 12; top: calc(100% + 7px); right: 0; width: 210px; padding: 12px; border: 1px solid var(--border); border-radius: 11px; background: var(--overlay-bg, var(--surface)); box-shadow: var(--tooltip-shadow); }
.routine-filter-popover fieldset { display: grid; gap: 4px; margin: 0; padding: 0; border: 0; }
.routine-filter-popover legend { margin-bottom: 6px; color: var(--text-3); font-size: 12px; }
.routine-filter-popover label { display: flex; align-items: center; gap: 8px; padding: 7px 8px; border-radius: 7px; color: var(--text); font-size: 13.5px; cursor: pointer; }
.routine-filter-popover label:hover { background: var(--sunken); }
.routine-search { display: flex; align-items: center; gap: 7px; width: min(250px, 25vw); min-height: 34px; box-sizing: border-box; padding: 4px 10px; border: 1px solid var(--border); border-radius: 8px; background: var(--input-bg, var(--surface)); }
.routine-search:focus-within { border-color: var(--focus-ring); box-shadow: 0 0 0 2px var(--focus-glow); }
.routine-search svg { flex: 0 0 16px; width: 16px; height: 16px; color: var(--text-3); }
.routine-search input { width: 100%; min-width: 0; padding: 0; border: 0; outline: 0; background: transparent; color: var(--text); font: inherit; font-size: 13.5px; }
.routine-search input::placeholder { color: var(--text-3); }
.routine-list { display:grid; gap:10px; }
.routine-card { display:grid; grid-template-columns:minmax(180px,.75fr) minmax(440px,1.6fr) minmax(310px,1fr); align-items:stretch; min-height:112px; border:1px solid var(--border); border-radius:12px; background:var(--sunken); overflow:visible; transition:border-color .16s ease,background .16s ease,box-shadow .16s ease; }
.routine-card:hover { border-color:var(--border-strong); background:var(--surface); box-shadow:var(--shadow); }
.routine-card-main,.routine-card-meta,.routine-card-foot { padding:16px; }
.routine-card-main { position:relative; min-width:0; }
.routine-card-titleline { display:flex; align-items:center; gap:7px; min-width:0; }
.routine-card-titleline h2 { min-width:0; margin:0; font-size:15px; line-height:1.3; font-weight:640; }
.routine-card-titleline h2 a { color:var(--text); text-decoration:none; }
.routine-card-titleline h2 a:hover { text-decoration:underline; text-underline-offset:3px; }
.routine-status-dot { flex:0 0 7px; width:7px; height:7px; border-radius:50%; background:var(--text-3); }
.routine-status-dot.is-active { background:var(--ok); }
.routine-badge,.routine-state { flex:0 0 auto; padding:2px 6px; border-radius:6px; font-size:10.5px; line-height:1.35; }
.routine-badge { background:var(--accent-soft); color:var(--accent-strong); }
.routine-state { margin-left:auto; background:var(--neutral-bg); color:var(--text-2); }
.routine-goal { display:-webkit-box; overflow:hidden; -webkit-box-orient:vertical; -webkit-line-clamp:2; margin:8px 0 0 14px; color:var(--text-2); font-size:12.5px; line-height:1.5; }
.routine-key { margin:7px 0 0 14px; }
.routine-key code { color:var(--text-3); font-size:11px; }
.routine-card-meta { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:13px 18px; min-width:0; border-left:1px solid var(--border); border-right:1px solid var(--border); background:var(--surface); }
.routine-card-meta>div { display:grid; align-content:start; min-width:0; }
.routine-card-meta span,.routine-last>span { color:var(--text-3); font-size:10.5px; text-transform:uppercase; letter-spacing:.04em; }
.routine-card-meta strong { overflow:hidden; color:var(--text); font-size:12.5px; font-weight:560; text-overflow:ellipsis; white-space:nowrap; }
.routine-card-meta small { overflow:hidden; margin-top:2px; color:var(--text-3); font-size:11.5px; text-overflow:ellipsis; white-space:nowrap; }
.routine-card-meta em { color:var(--danger); font-style:normal; }
.routine-card-foot { position:relative; display:grid; grid-template-columns:minmax(0,1fr) auto auto; align-items:center; gap:10px; min-width:0; }
.routine-stages { display:flex; flex-wrap:wrap; gap:5px; min-width:0; }
.routine-stage { display:inline-flex; align-items:center; gap:4px; padding:3px 6px; border-radius:6px; background:var(--neutral-bg); color:var(--text-2); font-size:10.5px; white-space:nowrap; }
.routine-stage i { width:5px; height:5px; border-radius:50%; background:var(--text-3); }
.routine-stage strong { font-weight:620; }
.routine-stage.is-good { background:var(--ok-bg); color:var(--ok); }.routine-stage.is-good i { background:var(--ok); }
.routine-stage.is-danger { background:var(--danger-bg); color:var(--danger); }.routine-stage.is-danger i { background:var(--danger); }
.routine-stage.is-running { background:var(--amber-bg); color:var(--amber); }.routine-stage.is-running i { background:var(--amber); }
.routine-stage.is-empty { background:var(--accent-soft); color:var(--accent-strong); }.routine-stage.is-empty i { background:var(--accent); }
.routine-last { display:grid; min-width:72px; }.routine-last a,.routine-last strong { color:var(--text); font-size:12px; font-weight:570; text-decoration:none; }.routine-last small { color:var(--text-3); font-size:10.5px; }
.routine-action-menu { position:relative; }.routine-action-menu summary { display:grid; place-items:center; width:30px; height:30px; border-radius:7px; color:var(--text-2); cursor:pointer; list-style:none; }.routine-action-menu summary:hover,.routine-action-menu[open] summary { background:var(--oat); color:var(--text); }.routine-action-menu summary svg { width:18px; height:18px; fill:currentColor; }
.routine-action-popover { position:absolute; z-index:14; top:calc(100% + 4px); right:0; width:150px; padding:5px; border:1px solid var(--border); border-radius:10px; background:var(--overlay-bg, var(--surface)); box-shadow:var(--tooltip-shadow); }
.routine-action-popover a,.routine-action-popover button { display:block; width:100%; box-sizing:border-box; padding:8px 10px; border:0; border-radius:7px; background:transparent; color:var(--text); font:inherit; font-size:13px; text-align:left; text-decoration:none; cursor:pointer; }.routine-action-popover a:hover,.routine-action-popover button:hover { background:var(--sunken); }.routine-action-popover form:last-child button { color:var(--danger); }
.routine-calendar { display:grid; gap:26px; }.routine-week { display:grid; grid-template-columns:repeat(7,1fr); gap:6px; }
.routine-week button { display:grid; justify-items:center; gap:3px; min-height:78px; padding:11px 5px; border:1px solid transparent; border-radius:11px; background:transparent; color:var(--text-3); font:inherit; cursor:pointer; }.routine-week button:hover { background:var(--sunken); color:var(--text-2); }.routine-week button.is-selected { border-color:var(--border); background:var(--sunken); color:var(--text); }
.routine-week span { font-size:11px; font-weight:620; }.routine-week strong { font-size:22px; font-weight:540; line-height:1; }.routine-week small { font-size:10.5px; }
.routine-calendar-days { min-width:0; }.routine-calendar-day { display:grid; gap:12px; padding:18px 20px; border:1px solid var(--border); border-radius:12px; background:var(--sunken); }.routine-calendar-day>header { display:flex; align-items:center; justify-content:space-between; gap:16px; }.routine-calendar-day>header>div { display:flex; align-items:center; gap:8px; }.routine-calendar-day h2 { margin:0; font-size:15px; }.routine-calendar-day header p { margin:0; color:var(--text-3); font-size:12px; }.routine-calendar-dot { width:7px; height:7px; border-radius:50%; background:var(--accent); }
.routine-calendar-events { display:grid; gap:7px; }.routine-calendar-event { display:grid; grid-template-columns:74px 1fr auto; align-items:center; gap:14px; padding:11px 12px; border:1px solid var(--border); border-radius:9px; background:var(--surface); }.routine-calendar-event>div:first-child { display:flex; align-items:center; gap:8px; }.routine-event-time { color:var(--text-2); font:12px var(--font-mono); }.routine-calendar-event h3 { margin:0; font-size:13.5px; }.routine-calendar-event h3 a { color:var(--text); text-decoration:none; }.routine-calendar-event p { margin:2px 0 0; color:var(--text-3); font-size:11.5px; }.routine-footnote { margin:0; color:var(--text-3); font-size:12px; }

/* Routine 编辑器：复刻参考图的窄栏、连续单列表单、组合指令区与底部双操作。 */
.routine-editor-page { display:grid; gap:46px; padding-top:2px; }.routine-editor-crumb { display:inline-flex; align-items:center; justify-self:start; gap:7px; color:var(--text-3); font-size:14px; text-decoration:none; }.routine-editor-crumb svg { width:19px; height:19px; color:var(--text-2); }.routine-editor-crumb strong { color:var(--text); font-weight:620; }
.routine-editor { width:min(100%,1000px); margin:0 auto; }.routine-editor-banner { display:flex; align-items:center; gap:9px; margin-bottom:35px; padding:12px 14px; border-radius:10px; background:var(--sunken); color:var(--text-2); font-size:13px; }.routine-editor-banner svg { flex:0 0 18px; width:18px; height:18px; }.routine-editor-banner.is-readonly { background:var(--amber-bg); color:var(--amber); }
.routine-form-linear { display:grid; gap:30px; }.routine-linear-field,.source-form>label.routine-linear-field { display:grid; align-items:initial; gap:7px; margin:0; padding:0; border:0; }.routine-field-heading { display:grid; gap:3px; }.routine-field-label { color:var(--text-2); font-size:14px; font-style:normal; font-weight:560; }.routine-field-label i { color:var(--danger); font-style:normal; }.routine-field-hint { color:var(--text-3); font-size:11.5px; font-weight:400; line-height:1.5; }
.routine-form input[type="text"],.routine-form input[type="number"],.routine-form input[type="time"],.routine-form textarea,.routine-form select { width:100%; min-height:38px; box-sizing:border-box; padding:8px 11px; border:1px solid var(--input-line, var(--border)); border-radius:8px; background: var(--input-bg, var(--surface)); color:var(--text); font:inherit; font-size:13.5px; }.routine-form textarea { min-height:88px; resize:vertical; line-height:1.5; }.routine-form input::placeholder,.routine-form textarea::placeholder { color:var(--text-3); }.routine-form input:focus-visible,.routine-form textarea:focus-visible,.routine-form select:focus-visible { outline:0; border-color:var(--focus-ring); box-shadow:0 0 0 2px var(--focus-glow); }.routine-form input[readonly],.routine-form textarea[readonly],.routine-form select:disabled { background:var(--sunken); color:var(--text-3); }
.routine-instructions-panel,.routine-delivery-panel,.routine-schedule-control { overflow:hidden; border:1px solid var(--border); border-radius:10px; background:var(--surface); }.routine-instructions-section { border-top:1px solid var(--border); }.routine-instructions-section:first-child { border-top:0; }.routine-choice-title { display:flex; align-items:center; justify-content:space-between; gap:16px; padding:11px 13px; background:var(--sunken); }.routine-choice-title>div { display:grid; gap:1px; }.routine-choice-title strong { color:var(--text); font-size:13px; }.routine-choice-title small { color:var(--text-3); font-size:11.5px; }.routine-check { display:inline-flex; align-items:center; gap:7px; color:var(--text-2); font-size:12px; white-space:nowrap; }
.routine-choice-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:0; padding:7px; }.routine-choice-grid label { display:flex; align-items:center; gap:8px; min-width:0; padding:7px 8px; border-radius:7px; color:var(--text-2); font-size:12px; cursor:pointer; }.routine-choice-grid label:hover { background:var(--sunken); }.routine-choice-grid label:has(input:checked) { background:var(--accent-soft); color:var(--accent-strong); }.routine-choice-grid label span { overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }.routine-choice-grid b { display:inline-grid; place-items:center; width:18px; height:18px; margin-right:6px; border-radius:5px; background:var(--neutral-bg); color:var(--text-2); font-size:10px; }
.routine-prompt-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; padding:13px; }.routine-prompt-grid label,.routine-select-field { display:grid; gap:6px; color:var(--text-2); font-size:12px; }.routine-panel-note { margin:0; padding:0 13px 13px; color:var(--text-3); font-size:11.5px; line-height:1.5; }
.routine-delivery-panel { padding:13px; }.routine-delivery-panel>.routine-select-field { max-width:calc(50% - 6px); }.routine-delivery-panel>.routine-panel-note { padding:9px 0 0; }.routine-recipient-grid { display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:12px; margin-top:13px; }.routine-recipient-grid fieldset { display:grid; align-content:start; gap:3px; margin:0; padding:11px; border:1px solid var(--border); border-radius:8px; }.routine-recipient-grid legend { padding:0 4px; color:var(--text); font-size:12px; font-weight:620; }.routine-recipient-grid label { display:flex; align-items:center; gap:8px; padding:7px; border-radius:7px; color:var(--text-2); font-size:12px; }.routine-recipient-grid label:hover { background:var(--sunken); }.routine-recipient-grid label span { display:flex; align-items:baseline; justify-content:space-between; width:100%; gap:8px; }.routine-recipient-grid small { color:var(--text-3); font-size:10.5px; }
.routine-schedule-control { display:grid; gap:15px; padding:13px; }.routine-days { margin:0; padding:0; border:0; }.routine-days legend { margin-bottom:7px; color:var(--text-2); font-size:12px; }.routine-days>div { display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); padding:3px; border-radius:9px; background:var(--sunken); }.routine-days label { cursor:pointer; }.routine-days input { position:absolute; opacity:0; pointer-events:none; }.routine-days span { display:grid; place-items:center; min-height:34px; border-radius:7px; color:var(--text-3); font-size:12px; }.routine-days input:checked+span { background:var(--surface); color:var(--text); box-shadow:var(--shadow); }.routine-days input:focus-visible+span { outline:2px solid var(--focus-ring); outline-offset:1px; }
.routine-schedule-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:13px; }.routine-schedule-grid>label { display:grid; gap:6px; color:var(--text-2); font-size:12px; }.routine-schedule-grid small { color:var(--text-3); font-size:10.5px; line-height:1.45; }.routine-number-field { position:relative; display:block; }.routine-number-field input { padding-right:36px; }.routine-number-field i { position:absolute; top:50%; right:11px; color:var(--text-3); font-style:normal; font-size:12px; transform:translateY(-50%); }
.routine-enabled { display:flex; align-items:center; gap:10px; padding:10px 11px; border-radius:8px; background:var(--sunken); color:var(--text-2); }.routine-enabled>span { display:grid; }.routine-enabled strong { color:var(--text); font-size:12.5px; }.routine-enabled small { color:var(--text-3); font-size:11px; }.routine-form-footer { display:flex; justify-content:flex-end; gap:8px; padding-top:2px; }.routine-form-footer .btn { min-height:36px; padding:7px 16px; }
@media (max-width:1050px) { .routine-card { grid-template-columns:minmax(180px,.8fr) minmax(420px,1.7fr); }.routine-card-foot { grid-column:1/-1; border-top:1px solid var(--border); background:var(--surface); }.routine-card-meta { border-right:0; } }
@media (max-width:800px) { .routine-toolbar { align-items:stretch; flex-direction:column; }.routine-toolbar-actions { justify-content:flex-start; flex-wrap:wrap; }.routine-search { flex:1 1 220px; width:auto; }.routine-card { grid-template-columns:1fr; }.routine-card-meta { border:0; border-top:1px solid var(--border); border-bottom:1px solid var(--border); }.routine-card-foot { grid-column:auto; border-top:0; }.routine-choice-grid { grid-template-columns:repeat(2,minmax(0,1fr)); }.routine-schedule-grid { grid-template-columns:1fr; } }
@media (max-width:640px) { .routine-page { gap:15px; }.routine-hero { align-items:stretch; flex-direction:column; }.routine-heading>p { margin-left:0; }.routine-new-button { align-self:flex-start; }.routine-count { margin-left:auto; }.routine-health { align-items:flex-start; }.routine-health strong,.routine-health p { display:block; margin-left:0; }.routine-toolbar-actions { display:grid; grid-template-columns:1fr auto; }.routine-toggle { grid-column:1/-1; }.routine-search { width:100%; }.routine-card-meta { grid-template-columns:1fr; }.routine-card-foot { grid-template-columns:1fr auto; }.routine-last { display:none; }.routine-week { gap:2px; overflow-x:auto; }.routine-week button { min-width:64px; min-height:68px; }.routine-calendar-day { padding:14px; }.routine-calendar-day>header { align-items:flex-start; flex-direction:column; gap:3px; }.routine-calendar-event { grid-template-columns:62px 1fr auto; gap:8px; }.routine-calendar-event p { white-space:normal; }.routine-editor-page { gap:28px; }.routine-editor-banner { margin-bottom:24px; }.routine-form-linear { gap:24px; }.routine-choice-title { align-items:flex-start; }.routine-choice-grid,.routine-prompt-grid,.routine-recipient-grid,.routine-schedule-grid { grid-template-columns:1fr; }.routine-delivery-panel>.routine-select-field { max-width:none; }.routine-days>div { grid-template-columns:repeat(4,minmax(0,1fr)); gap:3px; } }

/* Routine panels and filtered rows must honor the native hidden state despite grid display rules. */
.routine-page [hidden] { display: none !important; }

/* 核验/状态管理复用列表筛选与参考空态，不重复顶部信息横幅。 */
.opportunity-sections { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 20px; }
.opportunity-sections a { padding: 8px 16px; border: 1px solid var(--border); border-radius: var(--radius); color: var(--text-2); }
.opportunity-sections a[aria-current="page"] { background: var(--selected-bg, var(--surface)); color: var(--text); }
.review-page-note { color: var(--text-3); margin: 0 0 24px; line-height: 1.7; }
.review-complete { display: flex; flex-direction: column; align-items: center; text-align: center; padding: 48px 24px; border: 1px dashed var(--border); border-radius: 16px; background: var(--sunken); }
.review-complete img { width: 104px; height: 104px; object-fit: contain; margin: 0 0 18px; }
@media (max-width: 559px) {
  .review-complete img { width: 88px; height: 88px; }
}
.review-complete h3 { margin: 0 0 12px; font-size: 18px; }
.review-complete p { margin: 0 0 18px; color: var(--text-3); line-height: 1.7; }
.review-next { margin: 32px 0; padding-top: 24px; border-top: 1px solid var(--border); text-align: center; }
.review-next-button { display: inline-block; padding: 12px 24px; border-radius: 12px; background: var(--status-panel); color: var(--status-text); }
.review-next-button[aria-disabled="true"] { opacity: .55; pointer-events: none; }
.review-next-title { color: var(--text-3); margin: 12px 0; overflow-wrap: anywhere; }
.review-queue-back { display: inline-block; margin-top: 12px; color: var(--text-2); }
.status-review-form { display: grid; gap: 16px; }
.status-review-form label { display: grid; gap: 8px; }
.status-review-form textarea {
  box-sizing: border-box; width: 100%; resize: vertical;
  padding: 10px 12px; border: 1px solid var(--input-line, var(--border)); border-radius: 8px;
  background: var(--input-bg, var(--surface)); color: var(--text); font: inherit; line-height: 1.55;
}
.status-review-form textarea:hover { border-color: var(--border-strong); }
.status-review-form textarea:focus-visible {
  outline: 0; border-color: var(--focus-ring); box-shadow: 0 0 0 2px var(--focus-glow);
}
.status-review-event { border-top: 1px solid var(--border); margin-top: 20px; padding-top: 16px; }
.status-review-event p { white-space: pre-wrap; overflow-wrap: anywhere; }

/* Intent cards have one disclosure: keep its source links on the same row. */
.board-intent-footer { display: flex; flex-wrap: wrap; align-items: flex-start; gap: 8px 16px; margin-top: 6px; }
.board-intent-footer .board-detail-grid { flex: 1 1 230px; grid-template-columns: minmax(0, 1fr); margin: 0; }
.board-intent-footer .brief-actions { flex: 0 1 auto; justify-content: flex-end; align-items: center; margin: 0 0 0 auto; min-height: 37px; }

[data-theme="dark"] .review-complete img { filter: invert(0.7); }

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) .review-complete img { filter: invert(0.7); }
}

/* 项目详情：主信息优先；压缩空白而非正文与页面宽度。 */
.project-detail { min-width: 0; }
.project-detail details.project-section { margin-bottom: 18px; }
.project-detail .project-heading { margin-bottom: 20px; }
.project-detail .project-heading-main { margin-top: 18px; }
.project-detail .project-heading-main .project-eyebrow { margin-top: 0; }
.project-detail .project-heading-top { display: flex; align-items: center; justify-content: space-between; gap: 16px; }
.project-detail .project-back, .project-detail .project-back:hover { background: var(--status-panel); color: var(--status-text); border-color: var(--status-line); }
.project-detail .project-state { display: inline-flex; align-items: center; padding: 5px 12px; border-radius: 8px; font-weight: 600; line-height: 1.5; background: var(--neutral-bg); color: var(--text-2); }
.project-detail .project-state--tender { background: var(--grade-a); color: var(--on-grade); }
.project-detail .project-state--intent { background: var(--accent); color: var(--on-grade); }
.project-detail .project-state--failed { background: var(--danger-bg); color: var(--danger); }
.project-detail .project-state--awarded { background: var(--ok-bg); color: var(--ok); }
.project-detail .project-eyebrow { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 16px; margin: 18px 0 8px; color: var(--text-3); font-size: 13px; }
.project-detail .project-eyebrow span + span { border-left: 1px solid var(--border); padding-left: 16px; }
.project-detail .page-title { margin: 0; line-height: 1.5; overflow-wrap: anywhere; }
.project-detail .project-overview { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 18px; overflow: hidden; }
.project-detail .project-top-row { display: grid; grid-template-columns: minmax(0, 1.618fr) minmax(0, 1fr); gap: 18px; margin-bottom: 20px; }
.project-detail .project-top-row > section { min-width: 0; margin-bottom: 0; }
.project-detail .project-top-row:not(:has(.personal-project)) { grid-template-columns: 1fr; }
.project-detail .project-top-row .personal-detail-grid { grid-template-columns: 1fr; }
.project-detail dl { margin: 0; }
.project-detail dt { color: var(--text-3); font-weight: 400; }
.project-detail dd { margin: 0; overflow-wrap: anywhere; }
.project-detail .project-keyfacts { display: grid; grid-template-columns: minmax(220px, 1fr) minmax(0, 1.4fr) minmax(150px, .8fr); }
.project-detail .project-keyfacts > div { padding: 16px 20px; }
.project-detail .project-keyfacts > div + div { border-left: 1px solid var(--border); }
.project-detail .project-keyfacts dt { font-size: 12.5px; margin-bottom: 6px; }
.project-detail .project-keyfacts dd { line-height: 1.6; }
.project-detail .project-budget { font-size: 22px; font-variant-numeric: tabular-nums; }
.project-detail .project-record { display: flex; flex-wrap: wrap; gap: 8px 24px; border-top: 1px solid var(--border); padding: 12px 20px; font-size: 13px; line-height: 1.6; }
.project-detail .project-record > div { display: flex; align-items: baseline; gap: 8px; min-width: 0; max-width: 100%; }
.project-detail .project-record dt { flex-shrink: 0; }
.project-detail .project-record small { display: block; color: var(--text-3); font-size: inherit; }
.project-detail .anchor-nav { gap: 8px; margin-bottom: 20px; }
.project-detail details.project-section > summary { align-items: center; justify-content: space-between; padding: 12px 20px; }
.project-detail details.project-section > summary::before { content: none; }
.project-detail details.project-section:not(.disclosure-ready)[open] > summary .nav-chevron,
.project-detail details.project-section.is-open > summary .nav-chevron { transform: rotate(-180deg); }
.project-detail details.project-section > .body { padding: 16px 20px; }
.project-detail .project-conclusion { padding-bottom: 18px; border-bottom: 1px solid var(--border); }
.project-detail .project-verdict { display: grid; grid-template-columns: auto minmax(0, 1fr); align-items: start; gap: 14px; margin: 0; }
.project-detail .project-summary { margin: 0; line-height: 1.8; overflow-wrap: anywhere; }
.project-detail .project-conclusion .reasons { margin: 14px 0 0; padding-left: 20px; color: var(--text-2); line-height: 1.7; }
.project-detail .project-conclusion .reasons li + li { margin-top: 6px; }
.project-detail .manual-review-result { max-width: none; margin: 18px 0; }
.project-detail .decision-checks { display: grid; grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); gap: 16px; margin: 20px 0; }
.project-detail .decision-check { min-width: 0; padding: 16px; border: 1px solid var(--border); border-radius: var(--radius); }
.project-detail .decision-check h3 { margin: 0 0 12px; }
.project-detail .decision-check p { margin: 8px 0; line-height: 1.7; }
.project-detail .qualification-list > div { display: grid; grid-template-columns: minmax(100px, .65fr) minmax(0, 1fr); gap: 12px; padding: 8px 0; border-bottom: 1px solid var(--border); line-height: 1.6; }
.project-detail .qualification-list > div:last-child { border-bottom: 0; }
.project-detail .qualification-missing { margin-top: 8px; }
.project-detail .qualification-missing > summary { color: var(--text-2); font-size: 13px; }
.project-detail .lock-conclusion { font-weight: 600; }
.project-detail .lock-indicators > div { border-top: 1px solid var(--border); margin-top: 12px; padding-top: 12px; line-height: 1.7; }
.project-detail .lock-indicators dt { color: var(--text); overflow-wrap: anywhere; }
.project-detail .lock-indicators dd { color: var(--text-2); margin-top: 4px; }
.project-detail .project-requirements { margin: 20px 0; }
.project-detail .project-requirements-heading { display: flex; align-items: baseline; flex-wrap: wrap; gap: 6px 16px; }
.project-detail .project-requirements-heading h3, .project-detail .project-requirements-heading p { margin: 0; }
.project-detail .project-requirements-heading p { color: var(--text-2); font-size: 13px; }
.project-detail .requirement-list { padding: 0; margin: 12px 0; list-style: none; }
.project-detail .requirement-item { border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; margin-top: 12px; }
.project-detail .requirement-heading { display: flex; align-items: baseline; gap: 10px; }
.project-detail .requirement-heading h4 { font-size: 14px; line-height: 1.7; margin: 0; overflow-wrap: anywhere; }
.project-detail .requirement-context { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); gap: 16px; margin-top: 12px; line-height: 1.7; }
.project-detail .requirement-context dt { font-size: 12.5px; margin-bottom: 4px; }
.project-detail .requirement-evidence { margin-top: 12px; padding: 12px 16px; border-left: 2px solid var(--border-strong); border-radius: 0 8px 8px 0; background: var(--code-bg); }
.project-detail .requirement-evidence p { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; margin: 0 0 6px; font-size: 12.5px; color: var(--text-3); }
.project-detail .requirement-evidence strong { font-weight: 400; }
.project-detail .requirement-evidence blockquote { margin: 0; padding: 0; border: 0; color: var(--text-2); line-height: 1.8; white-space: pre-wrap; overflow-wrap: anywhere; }
.project-detail .project-basis { margin-top: 20px; padding: 16px; background: var(--code-bg); border: 1px solid var(--border); border-radius: var(--radius); }
.project-detail .project-material { display: flex; align-items: center; justify-content: space-between; gap: 12px; line-height: 1.7; }
.project-detail .project-material h3 { margin: 0; font-size: 14px; }
.project-detail .project-material p { margin: 4px 0 0; color: var(--text-2); font-size: 12.5px; }
.project-detail .project-material .btn { flex-shrink: 0; font-size: 13px; }
.project-detail .project-assessment-meta { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px 20px; margin-top: 14px; padding-top: 14px; border-top: 1px solid var(--border); font-size: 12.5px; line-height: 1.6; }
.project-detail .project-assessment-meta dt { color: var(--text-2); margin-bottom: 3px; }
.project-detail .project-audit { margin-top: 16px; border: 1px solid var(--border-strong); border-radius: var(--radius); }
.project-detail .project-audit > summary { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border: 0; border-radius: var(--radius); background: var(--control-bg); color: var(--text); font-size: 14px; font-weight: 600; }
.project-detail .project-audit > summary::before { content: none; }
.project-detail .project-audit > summary:hover, .project-detail .project-audit > summary:focus-visible { background: var(--oat); }
.project-detail .project-audit:not(.disclosure-ready)[open] > summary .nav-chevron, .project-detail .project-audit.is-open > summary .nav-chevron { transform: rotate(-180deg); }
.project-detail .project-audit .table-scroll { margin: 0; padding: 12px; }
.project-detail table.data .announcement-cell { background: var(--surface); }
.project-detail .fulltext { background: var(--code-bg); border-radius: 8px; padding: 10px 12px; transition: background 160ms ease-out; }
.project-detail .fulltext:hover, .project-detail .fulltext:focus-within, .project-detail .fulltext[open] { background: var(--oat); }
.project-detail .fulltext > summary { color: var(--text-2); }
.project-detail .fulltext:hover > summary, .project-detail .fulltext[open] > summary { color: var(--text); }
.project-detail .fulltext .raw { background: var(--surface); }
.project-detail .announcement-content { width: 0; min-width: 100%; max-height: 480px; overflow: auto; box-sizing: border-box; margin-top: 12px; padding: 14px; border: 1px solid var(--border); border-radius: 8px; background: var(--surface); color: var(--text-2); font-size: 13px; line-height: 1.8; overflow-wrap: anywhere; }
.project-detail .announcement-content table { width: 100%; min-width: 680px; border-collapse: collapse; table-layout: fixed; margin: 12px 0; }
.project-detail .announcement-content th, .project-detail table.data .announcement-content td { border: 1px solid var(--border); padding: 10px 12px; vertical-align: top; white-space: normal; background: var(--surface); color: var(--text); }
.project-detail .announcement-content th { background: var(--sunken); font-weight: 600; }
.project-detail .announcement-content p { margin: 8px 0; }
@media (max-width: 1000px) {
  .project-detail .project-top-row { grid-template-columns: 1fr; }
}
@media (prefers-reduced-motion: reduce) {
  .project-detail .fulltext { transition: none; }
}
@media (max-width: 767px) {
  .project-detail .project-keyfacts { grid-template-columns: 1fr; }
  .project-detail .project-keyfacts > div { padding: 12px 16px; }
  .project-detail .project-keyfacts > div + div { border-left: 0; border-top: 1px solid var(--border); }
  .project-detail .project-record { padding: 12px 16px; }
  .project-detail .project-record > div { flex-wrap: wrap; gap: 2px 8px; }
  .project-detail .decision-checks, .project-detail .requirement-context { grid-template-columns: 1fr; }
  .project-detail .project-verdict { grid-template-columns: 1fr; gap: 10px; }
  .project-detail .project-verdict .badge { justify-self: start; }
  .project-detail .project-assessment-meta { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .project-detail details.project-section > summary, .project-detail details.project-section > .body { padding: 12px 16px; }
  .project-detail .requirement-item, .project-detail .decision-check { padding: 12px; }
}

.project-detail .project-outcome-form { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px 12px; align-items: end; margin: 10px 0 0; }
.project-detail .project-outcome-form .manual-grade-picker { grid-column: 1 / -1; margin: 0; }
.project-detail .project-outcome-form .manual-grade-picker legend { float: left; margin: 0 10px 0 0; line-height: 32px; font-size: 13px; }
.project-detail .project-outcome-form .manual-grade-picker label { margin-right: 4px; }
.project-detail .project-outcome-form .manual-grade-picker label span { min-width: 0; height: 32px; box-sizing: border-box; padding: 5px 8px; font-size: 13px; }
.project-detail .project-outcome-form > label { display: grid; gap: 4px; font-size: 12.5px; }
.project-detail .project-outcome-form input[type="text"] { width: 100%; min-width: 0; box-sizing: border-box; }
.project-detail .project-outcome-form > button { grid-column: 1 / -1; justify-self: end; }
.project-detail #feedback .feedback { display: grid; grid-template-columns: minmax(80px, .5fr) minmax(0, 1fr) auto auto; align-items: end; gap: 10px; order: 1; margin: 0; padding-top: 16px; }
.project-detail #feedback .feedback > label { display: grid; gap: 6px; min-width: 0; max-width: 100%; }
.project-detail #feedback .feedback input { width: 100%; min-width: 0; box-sizing: border-box; }
.project-detail .project-actions-row { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 18px; align-items: stretch; margin-bottom: 18px; }
.project-detail .project-actions-row > details.card { min-width: 0; margin: 0; }
.project-detail .project-actions-row > details[open] { display: flex; flex-direction: column; }
.project-detail .project-actions-row > details[open]::details-content { display: flex; flex-direction: column; flex: 1; }
.project-detail .project-actions-row > details[open] > .body { flex: 1; }
.project-detail .follow-box, .project-detail .project-feedback-body { display: flex; flex-direction: column; }
.project-detail .project-feedback-body { justify-content: flex-end; }
.project-detail .project-feedback-body > p { margin: 0; }
.project-detail .follow-empty { display: flex; flex: 1; flex-direction: column; align-items: center; justify-content: center; gap: 12px; padding: 8px 0 20px; text-align: center; }
.project-detail .follow-empty p { margin: 0; }
.project-detail .follow-empty-icon { display: block; width: 112px; height: 112px; flex-shrink: 0; background: var(--text-2); mask: url('/static/icons/project/follow-owner.png?v=20260929-1') center / contain no-repeat; }
.project-detail .follow-controls { margin-top: auto; }
.project-detail .follow-controls .follow-actions { margin-top: 0; }
.project-detail .project-feedback-body > .table-scroll { margin-top: 16px; max-height: 160px; }
.project-detail .project-feedback-intro { display: flex; flex: 1; min-height: 0; flex-direction: column; align-items: center; justify-content: center; gap: 10px; text-align: center; }
.project-detail .project-feedback-intro > p { max-width: 96%; margin: 0; }
.project-detail .project-feedback-icon { display: block; width: 88px; height: 88px; flex-shrink: 0; background: var(--text-2); mask: url('/static/icons/project/feedback-reaction.png?v=20260929-1') center / contain no-repeat; }
.project-detail .project-actions-row .body { overflow-wrap: anywhere; }
.project-detail .project-actions-row .body > p:first-child { margin-top: 0; }
.project-detail .project-actions-row input[type="text"], .project-detail .project-actions-row select { max-width: 100%; min-width: 0; box-sizing: border-box; }
.project-detail .project-actions-row .follow-inline > label { min-width: 0; max-width: 100%; }
@media (max-width: 900px) {
  .project-detail .project-actions-row { grid-template-columns: 1fr; }
}
@media (max-width: 767px) {
  .project-detail .project-outcome-form { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 480px) {
  .project-detail .project-outcome-form { grid-template-columns: 1fr; }
  .project-detail #feedback .feedback > label { width: 100%; }
  .project-detail #feedback .feedback input { width: 100%; min-width: 0; box-sizing: border-box; }
}

/* Placeholder contrast is paired to its input surface, not to the page background. */
html[data-theme="dark"] input::placeholder, html[data-theme="dark"] textarea::placeholder { color: var(--input-placeholder); opacity: 1; }
@media (prefers-color-scheme: dark) {
  html:not([data-theme="light"]) input::placeholder, html:not([data-theme="light"]) textarea::placeholder { color: var(--input-placeholder); opacity: 1; }
}

/* Shared dark pressed state. Light themes keep their existing interaction palette. */
html[data-theme="dark"] :is(.btn:not(.btn-primary),.wf-toolbar button,.ops-button:not(.ops-button-primary)):active { background-color: var(--pressed-bg); }
@media (prefers-color-scheme: dark) {
  html:not([data-theme="light"]) :is(.btn:not(.btn-primary),.wf-toolbar button,.ops-button:not(.ops-button-primary)):active { background-color: var(--pressed-bg); }
}

/* Reading links have their own role; navigation stays neutral. */
@media (prefers-color-scheme: light) {
  :root:not([data-theme="dark"]) :is(.brief-body.brief-article-body, .brief-body, .ar-document) a { color: var(--link-fg); text-decoration: underline; text-underline-offset: 3px; }
}
:root[data-theme="light"] :is(.brief-body.brief-article-body, .brief-body, .ar-document) a { color: var(--link-fg); text-decoration: underline; text-underline-offset: 3px; }

/* User-private opportunity controls: retain the shared light/dark semantic palette. */
.personal-reading { font-size: 12px; white-space: nowrap; color: var(--text-3); }
.personal-reading-updated { color: var(--accent); font-weight: 600; }
.personal-reading-unread { color: var(--text); }
.personal-bookmark-form { display: inline-flex; margin: 0; }
.personal-bookmark.btn { display: inline-flex; align-items: center; justify-content: center; width: 32px; min-width: 32px; height: 32px; padding: 5px; background: transparent; color: var(--text-3); }
.personal-bookmark-icon { display: block; width: 18px; height: 20px; background: currentColor; mask: url("/static/icons/personal/bookmark.png") center / contain no-repeat; }
.personal-bookmark[aria-pressed="true"] { color: var(--focus-ring); }
.personal-project-actions [data-bookmark-note][hidden] { display: none; }
.personal-note-preview { grid-column: 1 / -1; margin: 0; font-size: 12px; color: var(--text-3); overflow-wrap: anywhere; white-space: pre-wrap; }
.personal-reading-filter { display: grid; gap: 6px; margin: 8px 0 12px; font-size: 12px; }
.personal-reading-filter select { width: 100%; min-width: 0; height: 32px; }
.personal-project { margin-bottom: 20px; }
.personal-project-heading, .personal-project-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 12px; }
.personal-project-heading h2 { margin: 0; font-size: 16px; }
.personal-project > p { margin: 8px 0 12px; font-size: 12px; }
.personal-note-form { display: grid; gap: 8px; }
.personal-note-form label, .personal-project-actions a { font-size: 12px; }
.personal-note-form textarea { width: 100%; min-width: 0; resize: vertical; box-sizing: border-box;
  border: 1px solid var(--input-line); border-radius: 6px; background: var(--input-bg);
  color: var(--text); font: inherit; font-size: 13px; line-height: 1.6; padding: 8px 10px; }
.personal-note-form textarea::placeholder { color: var(--input-placeholder); }
.personal-project [data-project-read] { margin-top: 12px; }
.personal-project [data-project-read][hidden] { display: none; }

/* Private workspace uses existing theme tokens; no global density changes. */
.personal-center { padding-block: 24px; }
.personal-center h1 { margin: 4px 0 8px; font-size: 26px; }
.personal-center .section-head { align-items: start; flex-wrap: wrap; gap: 16px; }
.personal-center .muted, .personal-disclosure .muted { font-size: 13px; line-height: 1.7; }
.personal-tabs, .personal-list-links { display: flex; flex-wrap: wrap; gap: 12px 20px; margin: 16px 0; font-size: 13px; }
.personal-center-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; }
.personal-panel { padding: 20px; min-width: 0; margin: 0; scroll-margin-top: 100px; }
.personal-panel h2 { font-size: 18px; margin: 0 0 8px; }
.personal-form { display: grid; gap: 12px; margin: 16px 0; }
.personal-form label { display: grid; gap: 6px; min-width: 0; font-size: 13px; }
.personal-form > button { justify-self: start; }
.personal-form input, .personal-form select, .personal-inline select { min-width: 0; max-width: 100%; width: 100%; height: 36px; padding: 6px 10px; box-sizing: border-box; border: 1px solid var(--input-line); border-radius: 6px; background: var(--input-bg); color: var(--text); font: inherit; font-size: 13px; }
.personal-form input::placeholder { color: var(--input-placeholder); }
.personal-items { list-style: none; padding: 0; margin: 20px 0 0; }
.personal-items li { display: flex; align-items: start; justify-content: space-between; gap: 12px; padding: 14px 0; border-top: 1px solid var(--line); font-size: 13px; }
.personal-items li > div { min-width: 0; overflow-wrap: anywhere; }
.personal-items li > form { flex-shrink: 0; }
.personal-items small { display: block; margin-top: 6px; color: var(--text-3); font-size: 12px; }
.personal-items p { margin-bottom: 0; white-space: pre-wrap; }
.personal-inline { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
.personal-inline select { width: auto; }
.personal-subscriptions li { flex-direction: column; }
.personal-subscriptions li > form { max-width: 100%; }
.personal-notice { display: inline-block; padding: 5px 10px; border: 1px solid var(--line); border-radius: 6px; font-size: 13px; }
.personal-disclosure { margin-top: 18px; border-top: 1px solid var(--line); padding-top: 14px; }
.personal-disclosure summary { font-size: 13px; cursor: pointer; }
.personal-detail-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; margin-top: 16px; }
.personal-detail-grid > div { min-width: 0; }
.personal-detail-grid h3 { font-size: 14px; margin: 0 0 10px; }
.personal-detail-grid > div:last-child { grid-column: 1 / -1; }
.personal-unit-quick { display: flex; gap: 12px; align-items: center; justify-content: space-between; margin-bottom: 10px; font-size: 13px; }
.personal-unit-quick span { min-width: 0; overflow-wrap: anywhere; }
.personal-unit-quick button { flex-shrink: 0; }
.opportunity-list-page[data-density="compact"] .opportunity-row { padding-top: 10px; padding-bottom: 10px; row-gap: 4px; }
@media (max-width: 900px) { .personal-center-grid { grid-template-columns: 1fr; } }
@media (max-width: 600px) {
  .personal-panel { padding: 16px; }
  .personal-detail-grid { grid-template-columns: 1fr; }
  .personal-detail-grid > div:last-child { grid-column: auto; }
  .personal-unit-quick { align-items: start; flex-wrap: wrap; }
}

/* Personal workbench: scoped, semantic theme tokens; navigation remains normal links. */
.workbench-page { padding: 28px 0 40px; }
.workbench-header { display: flex; justify-content: space-between; align-items: center; gap: 24px; margin-bottom: 28px; }
.workbench-eyebrow { font-size: 11px; letter-spacing: .08em; color: var(--text-3); margin: 0 0 10px; }
.workbench-header h1 { font-size: 32px; margin: 0 0 10px; }
.workbench-header .muted { margin: 0; font-size: 14px; }
.workbench-header-side { text-align: right; font-size: 12px; }
.workbench-header-side p { margin: 0 0 14px; color: var(--text-2); }
.workbench-header-side p span { margin-left: 10px; }
.workbench-actions { display: flex; gap: 10px; flex-wrap: wrap; }
.workbench-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 14px; margin-bottom: 24px; }
.workbench-stat { display: block; min-width: 0; padding: 18px 20px 14px; border: 1px solid var(--border); border-radius: 10px; background: var(--panel-bg); color: var(--text); text-decoration: none; }
.workbench-stat:hover { border-color: var(--text-3); text-decoration: none; }
.workbench-stat.is-current { border-color: var(--accent); box-shadow: inset 0 3px 0 var(--accent); }
.workbench-stat-heading, .workbench-stat-foot { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.workbench-stat-heading { font-size: 14px; font-weight: 600; }
.workbench-index { color: var(--text-3); font-size: 11px; font-weight: 400; }
.workbench-stat-value { display: flex; align-items: baseline; gap: 10px; margin: 14px 0 16px; }
.workbench-stat-value strong { font-size: 38px; line-height: 1.2; font-weight: 400; font-variant-numeric: tabular-nums; }
.workbench-stat-value > span, .workbench-stat-foot { color: var(--text-2); font-size: 11px; }
.workbench-stat-foot { border-top: 1px solid var(--border); padding-top: 12px; }
.workbench-body { display: grid; grid-template-columns: minmax(0, 1fr) 280px; gap: 24px; align-items: start; }
.workbench-panel { min-width: 0; border: 1px solid var(--border); border-radius: 10px; background: var(--panel-bg); }
#workbench-list { scroll-margin-top: 100px; }
.workbench-list-header { padding: 22px 24px 18px; border-bottom: 1px solid var(--border); }
.workbench-list-header h2, .workbench-aside h2 { font-size: 18px; margin: 0; }
.workbench-list-header h2 span { margin-left: 8px; color: var(--text-3); font-size: 13px; font-weight: 400; }
.workbench-list-header .muted { font-size: 12px; line-height: 1.8; margin: 8px 0 0; }
.workbench-items { list-style: none; margin: 0; padding: 0 24px; }
.workbench-item { display: flex; gap: 16px; padding: 22px 0; }
.workbench-item + .workbench-item { border-top: 1px solid var(--border); }
.workbench-item-rail { flex: 0 0 22px; display: flex; flex-direction: column; align-items: center; color: var(--text-3); font-size: 11px; gap: 14px; padding-top: 3px; }
.workbench-item-rail i { width: 1px; background: var(--border); flex: 1; }
.workbench-item-content { min-width: 0; flex: 1; overflow-wrap: anywhere; }
.workbench-item-top { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; font-size: 11px; color: var(--text-2); }
.workbench-badge { border: 1px solid var(--border); border-radius: 4px; padding: 2px 6px; color: var(--text-2); background: var(--selected-bg); }
.workbench-badge.is-overdue { color: var(--accent); border-color: var(--accent); }
.workbench-item h3 { font-size: 16px; line-height: 1.7; margin: 10px 0 6px; }
.workbench-item h3 a { color: var(--text); }
.workbench-meta { font-size: 12px; color: var(--text-2); margin: 0; line-height: 1.7; }
.workbench-note { white-space: pre-wrap; line-height: 1.8; font-size: 12px; margin: 12px 0 0; padding: 10px 12px; border-left: 2px solid var(--border); background: var(--input-bg); color: var(--text-2); max-height: 140px; overflow-y: auto; }
.workbench-note > span { display: block; color: var(--text-3); font-size: 11px; margin-bottom: 3px; }
.workbench-row-actions { display: flex; gap: 18px; align-items: center; flex-wrap: wrap; margin-top: 14px; font-size: 12px; }
.workbench-row-actions form { margin: 0; }
.workbench-row-actions .btn { font-size: 12px; padding: 4px 10px; }
.workbench-pagination { display: flex; align-items: center; justify-content: center; flex-wrap: wrap; gap: 14px; padding: 18px; border-top: 1px solid var(--border); font-size: 12px; }
.workbench-feedback { margin: 16px 24px 0; padding: 10px; font-size: 13px; border: 1px solid var(--border); border-radius: 6px; }
.workbench-empty { text-align: center; padding: 48px 24px 56px; }
.workbench-empty-line { display: block; width: 32px; height: 2px; background: var(--accent); margin: 0 auto 22px; }
.workbench-empty h3 { margin: 0; font-size: 17px; }
.workbench-empty p { max-width: 380px; margin: 14px auto 24px; color: var(--text-2); font-size: 13px; line-height: 1.8; }
.workbench-shortcuts { padding: 22px 20px 6px; }
.workbench-shortcuts h2 { margin-bottom: 18px; font-size: 16px; }
.workbench-shortcuts > a { display: flex; align-items: center; justify-content: space-between; gap: 12px; border-top: 1px solid var(--border); padding: 17px 0; color: var(--text); }
.workbench-shortcuts strong { font-size: 13px; font-weight: 500; }
.workbench-shortcuts small { display: block; margin-top: 7px; color: var(--text-2); line-height: 1.7; font-size: 11px; }
.workbench-private { padding: 22px 10px; }
.workbench-private h2 { font-size: 13px; }
.workbench-private p { font-size: 12px; color: var(--text-2); line-height: 1.9; margin: 10px 0; }
.workbench-private a { font-size: 12px; }
.workbench-page a:focus-visible { outline: 2px solid var(--accent); outline-offset: 4px; }
@media (max-width: 1050px) {
  .workbench-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .workbench-body { grid-template-columns: minmax(0, 1fr) 240px; gap: 16px; }
}
@media (max-width: 700px) {
  .workbench-header { align-items: start; flex-direction: column; gap: 18px; }
  .workbench-header h1 { font-size: 28px; }
  .workbench-header-side { text-align: left; }
  .workbench-summary { gap: 10px; }
  .workbench-stat { padding: 14px 12px 12px; }
  .workbench-stat-heading { font-size: 12px; }
  .workbench-stat-value { gap: 6px; margin: 12px 0; }
  .workbench-stat-value strong { font-size: 32px; }
  .workbench-stat-foot { font-size: 10px; align-items: start; line-height: 1.7; }
  .workbench-body { grid-template-columns: 1fr; }
  .workbench-list-header { padding: 18px 16px; }
  .workbench-items { padding: 0 16px; }
  .workbench-item { gap: 10px; }
  .workbench-item h3 { font-size: 15px; }
  .workbench-item-rail { flex-basis: 16px; }
}

/* Editorial quotation uses Serif; UI and code remain Sans and Mono. */
.brief-body blockquote, .prompt-markdown blockquote, .workflow-markdown-preview blockquote,
.academy-prose blockquote, .policy-intel-prose blockquote, .ar-document blockquote {
  font-family: var(--font-serif); letter-spacing: normal;
}
