/* 正式版第 4 轮文档页公共版式（研究专题列表、专题页、正式报告、资料库、持续监测共用；规格 §23.29）。
   来源：从设计稿 e-formal/base.css 移植，不另起设计——.sec / .sec-label / .sec-body（:204-207）→ .doc-section / .doc-label（h2）/ .doc-body，
         左侧 88px 标签栏（--ss-report-label）；.tbl（:380-386）→ .formal-table；.status（:234-249）→ .state-dot（不用 .status-dot，那个名字已由 site.css:89-90 占用）；
         新增 .region-error（区域读取失败）与 .row-menu（每行“更多操作”菜单）；列表页页头取 search.css:23-28 的做法。
   页面根（各页第一个子元素都是 .page-head）：
     专题列表 main > .doc-page.list-page.topic-register.categorized-topics；专题页 main > .doc-page.topic-page；正式报告 main > .doc-page.report-doc；
     资料库 main > .doc-page.list-page.library；持续监测 main > .doc-page.list-page.monitors。
   要点：.doc-page 本身不加内边距、不设 overflow（页头的负外边距依赖 #workspace 的 --mx / --my）；文档页整页为白纸（页头带与位置路径同一张纸，today.css:10 的做法，不改 formal-theme.css）；
         列表页页头：上 12 / 下 16 内边距，底部 1px 墨色细线与内容同宽，宋体 h1 28/40（≤800 为 24，≤480 为 20）；
         .formal-table 可与 site.css 的 .data-table 同用，此时去掉灰色表头底、斑马与“已选”行底色，只有预览中的行（tr[aria-current=true]）高亮并带声纳青内侧线；
         .table-card 内只有 .formal-table 时去掉外框，表格直接落在纸面上。
   断点 480 / 800 / 1100 / 1280；颜色只用 var(--ss-*) 令牌（深色主题由令牌切换）；不用 !important，不写内联样式；强制配色、打印与减少动态效果各有对应规则。
   加载顺序：search.css 之后、topic-list.css 之前（?v=formal-r4）。只定义其他页面没有使用的类名。
   第 4 轮整合：状态点改为按文字基线对齐（圆点自身居中），表格行内不再比同行文字低约 3px；深色主题下预览中的行（--ss-highlight 底）里的说明色文字改用 --ss-ink-2，
         因为深色 --ss-muted 在高亮底上只有 4.22:1。 */

/* ── 纸面：文档页整页为白色表面（位置路径带与页面同一张纸） ─────────────── */
body:has(#workspace > .doc-page),#workspace:has(> .doc-page){background:var(--ss-surface)}

/* ── 页面根：不加内边距、不裁切；页头的负外边距仍按 #workspace 的 --mx / --my 伸到边缘 ─────────────── */
.doc-page{display:block;min-width:0;color:var(--ss-ink)}

/* ── 列表页页头（研究专题、资料库、持续监测）：衬线 h1、底部墨色细线与内容同宽、不铺到页面边缘 ─────────────── */
.doc-page.list-page>.page-head{position:relative;gap:4px;margin-bottom:16px;padding-top:12px;padding-bottom:16px;border-bottom:0;
  background:linear-gradient(var(--ss-ink),var(--ss-ink)) center bottom / calc(100% - 2 * var(--mx)) 1px no-repeat,var(--ss-surface)}
.doc-page.list-page>.page-head .page-title-row{align-items:center}
.doc-page.list-page>.page-head .page-title h1{font-family:var(--ss-font-serif);font-size:28px;line-height:40px;font-weight:700;letter-spacing:0;color:var(--ss-ink)}
.doc-page.list-page>.page-head .page-meta{margin:0;color:var(--ss-muted);font-size:var(--ss-text-sm);line-height:1.6;overflow-wrap:anywhere}

/* ── 章节：左侧窄标签栏（88px）+ 正文栏，章节之间一条细线；页头后的第一节不再画线 ─────────────── */
.doc-section{display:grid;grid-template-columns:var(--ss-report-label) minmax(0,1fr);column-gap:24px;margin:0;padding:14px 0 16px;border-top:1px solid var(--ss-line)}
.doc-section:first-child,.doc-page>.page-head+.doc-section{border-top:0}
/* 标签占第一行第一列；其余子元素一律落在正文栏，按顺序向下排（没有 .doc-body 包装时也不会掉进标签栏） */
.doc-section>.doc-label{grid-column:1;grid-row:1}
.doc-section>:not(.doc-label){grid-column:2;min-width:0}
/* 小标签：无衬线 500、12px、字距 .14em、说明色（设计稿 .label）；h2 不带默认外边距 */
.doc-label{margin:0;padding-top:3px;color:var(--ss-muted);font:500 var(--ss-text-xs)/1.5 var(--ss-font);letter-spacing:.14em;overflow-wrap:anywhere}
/* 标签下的计数（如“火箭”下的“3 个”）：桌面在标签下方另起一行，窄屏与标签同行 */
.doc-label .doc-count{display:block;margin-top:2px;color:var(--ss-muted);font-weight:400;letter-spacing:.04em;font-variant-numeric:tabular-nums}
.doc-body{min-width:0}

/* ── 正式表格：表头细字 + 墨色底线；行间细线；数字等宽（设计稿 .tbl） ─────────────── */
table.formal-table{width:100%;border-collapse:collapse;font-size:var(--ss-text-md);line-height:1.6;font-variant-numeric:tabular-nums;color:var(--ss-ink)}
table.formal-table :is(th,td){padding:10px 16px 10px 0;border-bottom:1px solid var(--ss-line);background:none;color:inherit;text-align:left;vertical-align:top}
/* 首列留 8px，预览中的行左侧声纳青内侧线不压字；末列不留右侧空白 */
table.formal-table :is(th,td):first-child{padding-left:8px}
table.formal-table :is(th,td):last-child{padding-right:0}
table.formal-table thead th{padding-top:0;padding-bottom:6px;border-bottom:1px solid var(--ss-ink);background:none;color:var(--ss-muted);font-size:var(--ss-text-xs);font-weight:500;letter-spacing:.1em;line-height:1.5;white-space:nowrap}
table.formal-table tbody th{color:var(--ss-ink);font-weight:600;white-space:nowrap}
table.formal-table tbody td{color:var(--ss-ink)}
/* 与 .data-table 同用时：最后一行保留底线；悬停与“已选”都不加底色（规格 D76：已选行不着色） */
table.formal-table tbody tr:last-child>:is(th,td){border-bottom:1px solid var(--ss-line)}
table.formal-table tbody tr:is(:hover,.selected){background:none}
/* 预览中的行：引句高亮底 + 声纳青内侧线（规格 D77，与搜罗结果行一致） */
table.formal-table tbody tr[aria-current="true"]{background:var(--ss-highlight)}
table.formal-table tbody tr[aria-current="true"]>:first-child{box-shadow:inset 2px 0 0 var(--ss-accent)}
/* 深色主题：高亮底上的说明色文字（第二行说明、提示与中性状态点）改用 --ss-ink-2，对比度回到 4.5:1 以上（浅色主题不变） */
[data-theme="dark"] table.formal-table tbody tr[aria-current="true"] :is(.sub,.cell-sub,.hint,.state-dot.is-muted){color:var(--ss-ink-2)}
/* 单元格内的第二行说明（来源 · 类型等） */
table.formal-table .sub{display:block;color:var(--ss-muted);font-size:var(--ss-text-xs);line-height:1.5}
/* 只装一张正式表格的卡片：去掉外框与底色，窄屏仍可横向滚动（overflow-x 沿用 site.css） */
.table-card:has(> table.formal-table){border:0;border-radius:0;background:none;box-shadow:none}

/* ── 状态标记：形状 + 颜色双重编码（设计稿 .status）；不用绿色（规格 D59、23.100） ─────────────── */
/* 修饰类：is-active 监测中（声纳青实心点带浅环）、is-paused 已暂停（两道竖线）、is-pending 待核验（赭黄空心圈）、
   is-confirmed 已确认（人工或代理核对；海军蓝实心点，不用绿色）、is-warn 需要留意（赭黄实心点）、is-danger 失败或说法不一（砖红菱形）、
   is-plan 计划（石板灰虚线圈）、is-muted 尚未执行 / 已归档等中性说明（浅灰空心圈）；不加修饰类时为说明色实心点 */
/* 文字按基线对齐（与同行文字、表格行的基线一致），圆点自身在行内居中 */
.state-dot{display:inline-flex;align-items:baseline;gap:6px;color:var(--ss-ink-2);font-size:var(--ss-text-sm);font-weight:500;line-height:1.4;white-space:nowrap}
.state-dot::before{content:"";flex:none;align-self:center;box-sizing:border-box;width:7px;height:7px;border-radius:50%;background:var(--ss-muted)}
.state-dot.is-active{color:var(--ss-accent-text)}
.state-dot.is-active::before{background:var(--ss-accent);box-shadow:0 0 0 3px var(--ss-accent-soft)}
.state-dot.is-paused{color:var(--ss-ink)}
.state-dot.is-paused::before{width:7px;height:9px;border-radius:0;border-left:2px solid var(--ss-muted);border-right:2px solid var(--ss-muted);background:none}
.state-dot.is-pending{color:var(--ss-warn-text)}
.state-dot.is-pending::before{border:1.5px solid var(--ss-warn-text);background:none}
.state-dot.is-confirmed{color:var(--ss-ink)}
.state-dot.is-confirmed::before{background:var(--ss-primary-text)}
.state-dot.is-warn{color:var(--ss-warn-text)}
.state-dot.is-warn::before{background:var(--ss-warn)}
.state-dot.is-danger{color:var(--ss-danger-text)}
.state-dot.is-danger::before{width:6px;height:6px;margin:0 1px;border-radius:0;background:var(--ss-danger-text);transform:rotate(45deg)}
.state-dot.is-plan{color:var(--ss-plan-text)}
.state-dot.is-plan::before{border:1.5px dashed var(--ss-plan);background:none}
.state-dot.is-muted{color:var(--ss-muted)}
.state-dot.is-muted::before{border:1.5px solid var(--ss-faint);background:none}

/* ── 区域读取失败（workspace.js regionError）：一句说明 + “重试”；管理员另有“技术详情（管理员）”折叠 ─────────────── */
.region-error{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin:12px 0;padding:12px 16px;border:1px solid var(--ss-line);border-left:3px solid var(--ss-danger-text);background:var(--ss-surface);color:var(--ss-ink)}
.region-error>p{flex:1 1 240px;min-width:0;margin:0;font-size:var(--ss-text-md);line-height:1.6;overflow-wrap:anywhere}
.region-error>button{flex:none;min-height:32px;padding:5px 12px;font-size:var(--ss-text-sm);box-shadow:none}
.region-error>.region-error-details{flex:1 1 100%;margin:0}
.region-error>.region-error-details .long-text{color:var(--ss-ink-2);font-size:var(--ss-text-sm)}

/* ── 每行“更多操作”菜单（actionMenu(…, 'row-menu')）：安静的小按钮，悬停、聚焦与展开时才显出边框 ─────────────── */
.action-menu.row-menu>summary{justify-content:center;min-width:32px;min-height:32px;padding:4px 8px;border-color:transparent;background:none;color:var(--ss-ink-2)}
.action-menu.row-menu>summary:hover,.action-menu.row-menu>summary:focus-visible,.action-menu.row-menu[open]>summary{border-color:var(--ss-line);color:var(--ss-primary-text)}
.action-menu.row-menu>.action-menu-panel{min-width:176px}

/* ── 窄屏 ─────────────── */
@media(max-width:1100px){
  .doc-section{column-gap:20px}
}
@media(max-width:800px){
  .doc-page.list-page>.page-head .page-title h1{font-size:var(--ss-text-2xl);line-height:1.35}
  /* 章节标签折到内容上方，计数与标签同行 */
  .doc-section{grid-template-columns:minmax(0,1fr);row-gap:8px}
  .doc-section>.doc-label,.doc-section>:not(.doc-label){grid-column:1;grid-row:auto}
  .doc-label{padding-top:0}
  .doc-label .doc-count{display:inline;margin:0 0 0 10px}
}
@media(max-width:480px){
  .doc-page.list-page>.page-head .page-title h1{font-size:var(--ss-text-xl)}
  .region-error>button{min-height:44px}
  .action-menu.row-menu>summary{min-width:44px;min-height:44px}
}

/* ── 强制配色：细线、表头底线、状态点与菜单按钮保持可见 ─────────────── */
@media(forced-colors:active){
  .doc-page.list-page>.page-head{border-bottom:1px solid CanvasText;background:Canvas}
  table.formal-table thead th{border-bottom-color:CanvasText}
  table.formal-table tbody tr[aria-current="true"]{outline:2px solid Highlight;outline-offset:-2px}
  /* 与各修饰类同特异度、位置在后，才能盖过修饰类的令牌颜色 */
  .state-dot::before,.state-dot:is(.is-active,.is-confirmed,.is-warn,.is-danger)::before{forced-color-adjust:none;background:CanvasText;box-shadow:none}
  .state-dot:is(.is-pending,.is-plan,.is-muted,.is-paused)::before{forced-color-adjust:none;border-color:CanvasText;background:Canvas}
  .region-error{border-color:CanvasText}
  .action-menu.row-menu>summary{border-color:ButtonText}
}

/* ── 打印：白纸、页头只留标题与细线；菜单与重试不打印；表格行不跨页、表头每页重复 ─────────────── */
@media print{
  body:has(#workspace > .doc-page),#workspace:has(> .doc-page){background:none}
  .doc-page.list-page>.page-head{margin:0 0 12px;padding:0 0 8px;border-bottom:1px solid var(--ss-ink);background:none}
  .doc-label{break-after:avoid}
  .table-card:has(> table.formal-table){overflow:visible}
  table.formal-table thead{display:table-header-group}
  table.formal-table tr{break-inside:avoid}
  table.formal-table tbody tr[aria-current="true"]{background:none}
  table.formal-table tbody tr[aria-current="true"]>:first-child{box-shadow:none}
  .action-menu.row-menu,.region-error>button{display:none}
}

/* ── 减少动态效果：本文件的按钮与行不做过渡 ─────────────── */
@media(prefers-reduced-motion:reduce){
  .action-menu.row-menu>summary,.region-error>button{transition:none}
}
