app.css 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. /* 观澜 新前端样式表 —— 设计基准 = docs/design/guanlan_v2.html
  2. * (2026-09-03 用户: "你帮我整体设计一下吧"; 纸底/印章/长卷那版已否, 留档 docs/design/_explored/)
  3. *
  4. * 六条决定:
  5. * 01 问题先于全貌 打开先看该管的几台; 全场状态压成 38 格一条带子放第二屏
  6. * 02 两条轴两枚chip 设备状态 (彩色) × 证据级 (单色) 并排 —— 两者不可互替, 这是产品的真正特色
  7. * 03 限定语不可分离 每个结论下的限定行在同一张卡, 带自己的标签
  8. * 04 一种强调色 海蓝只用于「可操作」; 红黄灰绿是语义不是装饰
  9. * 05 System font stack only; no external font request.
  10. * 06 不动 无入场动画, 只有悬停与选中
  11. *
  12. * 单主题 (显式底色)。深色版留作后续 —— token 已分层, 届时只改 :root。
  13. */
  14. :root{
  15. --ground:#F5F7F8; --panel:#FFFFFF; --ink:#1B2430; --muted:#5C6B78; --line:#DDE3E8; --hair:#C9D1D8;
  16. --accent:#1F6F8B; --accent-deep:#175A71; --accent-soft:#BFDCE6; --wash:#E8F2F6;
  17. --critical:#C8372D; --warning:#D48A1E; --unknown:#8A96A0; --good:#2E8B6A; --excellent:#8FCBB5;
  18. /* 迁移期: 旧 JS 里的变量名指到新语义 */
  19. --bad:var(--critical); --warn:var(--warning); --ok:var(--good); --info:var(--accent);
  20. --sans:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",Arial,sans-serif;
  21. --mono:"SF Mono",Menlo,Consolas,monospace;
  22. --r:10px;
  23. }
  24. *{box-sizing:border-box}
  25. html{background:var(--ground)}
  26. body{margin:0;background:var(--ground);color:var(--ink);font-family:var(--sans);font-size:14px;line-height:1.55;-webkit-font-smoothing:antialiased}
  27. body[data-lang=zh]{font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",Inter,ui-sans-serif,system-ui,sans-serif}
  28. a{color:var(--accent-deep);text-decoration:none}
  29. a:hover{text-decoration:underline}
  30. .wrap{max-width:1200px;margin:0 auto;padding:0 28px 72px}
  31. :focus-visible{outline:2px solid var(--accent);outline-offset:2px}
  32. .num{font-variant-numeric:tabular-nums}
  33. .small{font-size:12.5px} .muted{color:var(--muted)}
  34. h1,h2,h3{margin:0;font-weight:600;letter-spacing:-.005em;text-wrap:balance}
  35. h2{font-size:15px} h3{font-size:14px}
  36. @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
  37. /* ── 顶 ── */
  38. header.top{display:flex;align-items:center;gap:14px;padding:18px 0 12px}
  39. .mark{display:inline-flex;align-items:center;gap:9px}
  40. .mark svg{width:26px;height:26px;color:var(--accent)}
  41. .brand{font-weight:600;font-size:18px;letter-spacing:-.01em}
  42. .brand small{font-weight:400;color:var(--muted);margin-left:8px;font-size:13px}
  43. .tag{font-family:var(--mono);font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border:1px solid var(--hair);border-radius:4px;padding:2px 7px}
  44. header.top .right{margin-left:auto;display:flex;gap:8px;align-items:center}
  45. select,input,button{font:inherit;font-size:13px;color:var(--ink)}
  46. select,input{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:6px 10px}
  47. input::placeholder{color:var(--muted)}
  48. .toggle{display:inline-flex;border:1px solid var(--line);border-radius:7px;overflow:hidden;background:var(--panel)}
  49. .toggle button{border:0;background:transparent;padding:6px 12px;cursor:pointer;color:var(--muted)}
  50. .toggle button.on{background:var(--ink);color:#fff}
  51. /* ── 页签: 平铺 (用户 2026-08-28 裁定), 当前项一条下划线 ── */
  52. nav.tabs{display:flex;gap:2px;border-bottom:1px solid var(--line);flex-wrap:wrap}
  53. nav.tabs button{font-size:13.5px;border:0;background:transparent;color:var(--muted);padding:9px 12px 10px;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px}
  54. nav.tabs button.on{color:var(--accent-deep);border-bottom-color:var(--accent);font-weight:500}
  55. /* ── 节 ── */
  56. section{margin-top:26px}
  57. .sechead{display:flex;align-items:baseline;gap:12px;margin-bottom:10px}
  58. .sechead .meta{color:var(--muted);font-size:12.5px}
  59. .sechead .legend{margin-left:auto}
  60. .legend{display:flex;gap:14px;font-size:12px;color:var(--muted)}
  61. .legend i{display:inline-block;width:9px;height:9px;border-radius:2px;vertical-align:-1px;margin-right:5px}
  62. .eyebrow{font-family:var(--mono);font-size:10.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin:22px 0 8px}
  63. /* ── 按钮 ── */
  64. .btn{padding:7px 16px;border-radius:7px;border:1px solid var(--accent);background:var(--accent);color:#fff;font-weight:500;cursor:pointer}
  65. .btn:hover{background:var(--accent-deep);border-color:var(--accent-deep)}
  66. .btn.quiet{background:transparent;color:var(--accent-deep)}
  67. .btn:disabled{opacity:.5;cursor:not-allowed}
  68. /* ── 面板 / 表 ── */
  69. .panel{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px}
  70. .mb{margin-bottom:12px}
  71. .tblwrap{overflow-x:auto}
  72. table{width:100%;border-collapse:collapse;font-size:13px}
  73. th{font-weight:500;color:var(--muted);text-align:left;padding:7px 10px;border-bottom:1px solid var(--line);font-size:12px;letter-spacing:.02em;white-space:nowrap}
  74. td{padding:7px 10px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;vertical-align:top}
  75. tr:last-child td{border-bottom:0}
  76. td.r,th.r{text-align:right}
  77. /* ── KPI: 左边条 = 语义 ── */
  78. .kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:10px}
  79. .kpi{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px 11px;position:relative}
  80. .kpi::before{content:"";position:absolute;left:0;top:10px;bottom:10px;width:3px;border-radius:0 2px 2px 0;background:var(--accent)}
  81. .kpi.warn::before{background:var(--warning)} .kpi.bad::before{background:var(--critical)} .kpi.ok::before{background:var(--good)}
  82. .kpi b{display:block;font-size:24px;font-weight:600;letter-spacing:-.02em;line-height:1.15;font-variant-numeric:tabular-nums}
  83. .kpi b small{font-size:13px;font-weight:500;color:var(--muted);margin-left:2px}
  84. .kpi span{display:block;font-size:12px;color:var(--muted);margin-top:4px}
  85. /* ── chip: 设备状态 (彩色) ── */
  86. .chip{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:500;padding:2px 8px;border-radius:5px;white-space:nowrap;line-height:1.5}
  87. .chip.bad{background:rgba(200,55,45,.10);color:var(--critical)}
  88. .chip.warn{background:rgba(212,138,30,.14);color:#9C6410}
  89. .chip.unk{background:rgba(138,150,160,.16);color:#4F5B66}
  90. .chip.ok{background:rgba(46,139,106,.12);color:#22705A}
  91. .chip.ex{background:rgba(143,203,181,.22);color:#2E7A62}
  92. /* ── tier: 证据级 (单色) · rv: 审级 ── */
  93. .evid{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
  94. .tier{font-family:var(--mono);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;padding:2px 7px;border-radius:4px;border:1px solid var(--hair);color:var(--muted);white-space:nowrap}
  95. .tier.confirmed{background:var(--ink);border-color:var(--ink);color:#fff}
  96. .tier.near{border-color:var(--ink);color:var(--ink)}
  97. .tier.candidate{border-color:var(--muted);color:var(--muted)}
  98. .tier.reference{}
  99. .tier.insufficient{border-style:dashed}
  100. .tier.withdrawn{text-decoration:line-through}
  101. .rv{font-family:var(--mono);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase;color:var(--muted)}
  102. .rv::before{content:"·";margin-right:3px;color:var(--hair)}
  103. /* ── 关注卡: 左边条 = 设备状态 ── */
  104. .cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:12px}
  105. .card{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px 12px 18px;position:relative;transition:box-shadow .15s}
  106. .card::before{content:"";position:absolute;left:0;top:12px;bottom:12px;width:3px;border-radius:0 2px 2px 0;background:var(--sev,var(--hair))}
  107. .card.lit{box-shadow:0 0 0 2px var(--accent-soft)}
  108. .card .head{display:flex;align-items:baseline;gap:10px}
  109. .card .unit{font-weight:600;font-size:19px;letter-spacing:-.02em;font-variant-numeric:tabular-nums}
  110. .card .sys{color:var(--muted);font-size:13px}
  111. .card .head .chip{margin-left:auto}
  112. .card .why{margin:8px 0 9px;font-size:13.5px}
  113. .caveat{font-size:12px;color:var(--muted);border-top:1px solid var(--line);padding-top:7px;margin-top:2px;line-height:1.5}
  114. .caveat b{font-family:var(--mono);font-weight:500;font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted);margin-right:7px}
  115. /* ── 迷你趋势: 越早越淡 (JS 按序设 opacity), 末点实色 ── */
  116. .spark{height:28px;display:flex;align-items:flex-end;gap:2px;margin:9px 0 8px}
  117. .spark i{flex:1;display:block;background:var(--accent);border-radius:1px 1px 0 0}
  118. /* ── 全场状态条: 一格一台 ── */
  119. .strip{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:12px 14px 8px}
  120. .cells{display:grid;grid-template-columns:repeat(var(--n,38),1fr);gap:4px}
  121. .cell{aspect-ratio:1;border-radius:3px;background:var(--excellent);transition:transform .1s}
  122. .cell.hot{cursor:pointer} .cell.hot:hover{transform:translateY(-2px)}
  123. .cell.bad{background:var(--critical)} .cell.warn{background:var(--warning)} .cell.unk{background:var(--unknown)} .cell.ok{background:var(--good)}
  124. .cell.lit{outline:2px solid var(--ink);outline-offset:1px}
  125. .nums{display:grid;grid-template-columns:repeat(var(--n,38),1fr);gap:4px;margin-top:5px;font-family:var(--mono);font-size:9.5px;color:var(--muted);text-align:center}
  126. .nums span.hot{color:var(--ink);font-weight:500}
  127. .quiet{color:var(--muted);font-size:13px;margin-top:10px}
  128. .quiet b{color:var(--ink);font-weight:500}
  129. /* ── 系统入口 ── */
  130. .systems{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:10px}
  131. .sysc{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:11px 13px;display:grid;gap:7px}
  132. .sysc .t{display:flex;justify-content:space-between;align-items:baseline}
  133. .sysc .t b{font-weight:500}
  134. .sysc .t a{font-size:12px}
  135. .bar{display:flex;height:6px;border-radius:3px;overflow:hidden;background:var(--line)}
  136. .bar i{display:block;height:100%}
  137. .sysc .cnt{display:flex;gap:10px;font-size:11.5px;color:var(--muted);font-variant-numeric:tabular-nums}
  138. .sysc .cnt i{display:inline-block;width:7px;height:7px;border-radius:2px;margin-right:4px}
  139. /* ── 骨架 (载入中) ── */
  140. .skel{height:12px;border-radius:6px;background:linear-gradient(90deg,var(--line),var(--panel),var(--line));background-size:200% 100%;animation:sk 1.2s linear infinite}
  141. @keyframes sk{to{background-position:-200% 0}}
  142. /* 原文数据 (英文模式下按原文标注显示) */
  143. .verbatim{font-family:"PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif}
  144. code{font-family:var(--mono);font-size:11.5px}
  145. /* ── 问答: 类别 pill / 常用问题行 / 核验徽章 ── */
  146. .pill{font-size:13px;padding:6px 14px;border-radius:999px;border:1px solid var(--line);background:var(--panel);color:var(--ink);cursor:pointer}
  147. .pill.on{background:var(--accent);border-color:var(--accent);color:#fff;font-weight:500}
  148. .qitem{font-size:13px;cursor:pointer;border:1px solid var(--line);border-radius:8px;padding:8px 12px;margin-top:8px;background:var(--panel)}
  149. .qitem:hover{border-color:var(--accent-soft);background:var(--wash)}
  150. .badge{display:inline-block;font-size:11.5px;padding:1px 8px;border-radius:5px;border:1px solid var(--hair);color:var(--muted)}
  151. .badge.ok{border-color:var(--good);color:var(--good)} .badge.warn{border-color:var(--warning);color:#9C6410}
  152. /* ── 汇报定制: 一页纸预览 ── */
  153. .paper{background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:26px 30px;margin-top:14px}
  154. .paper-hd{display:flex;justify-content:space-between;align-items:flex-start;padding-bottom:12px;margin-bottom:16px;border-bottom:2px solid var(--ink)}
  155. .paper-ti{font-weight:600;font-size:17px;letter-spacing:-.01em}
  156. .paper-ft{display:flex;justify-content:space-between;gap:16px;font-size:11.5px;color:var(--muted);padding-top:10px;margin-top:16px;border-top:1px solid var(--line);flex-wrap:wrap}
  157. .paper .panel{border-radius:8px}
  158. svg.dt text{font-family:var(--sans)}
  159. @media print{.noprint,nav.tabs,header.top,footer{display:none!important}.wrap{padding:0;max-width:none}.paper{border:0;padding:0}body{background:#fff}}
  160. /* ── 双列网格 (故障/电量页): 窄屏单列, 宽屏两列; span2 占满 ── */
  161. .grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(480px,1fr));gap:12px}
  162. .grid2 .span2{grid-column:1/-1}
  163. i.bar{display:inline-block;height:10px;border-radius:2px;vertical-align:middle;margin-right:6px;opacity:.85}
  164. /* ── 振动融合: 状态|证据 双联 chip, 传动链小格, 矩阵表 ── */
  165. .duo{display:inline-flex;align-items:stretch;border:1px solid var(--c,var(--hair));border-radius:5px;overflow:hidden;font-size:11.5px;line-height:1.5;max-width:100%}
  166. .duo .st{padding:1px 7px;background:var(--c,var(--hair));color:#fff;font-weight:500;white-space:nowrap}
  167. .duo .ev{padding:1px 7px;color:var(--ink);background:var(--panel);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}
  168. .chain{display:inline-flex;gap:2px;vertical-align:middle}
  169. .chain i{display:inline-block;width:11px;height:11px;border-radius:2px;border:1px solid var(--hair);background:var(--panel)}
  170. .chain i.on{border-color:var(--accent)}
  171. table.fmx td{vertical-align:top;padding:6px 8px}
  172. table.fmx th div{line-height:1.3}
  173. /* ── 逐台/单问题浮层 (静态站上 /turbine /problem 是 404, 页内兜住) ── */
  174. .popm{position:fixed;inset:0;z-index:9999;background:rgba(27,36,48,.55);overflow:auto;padding:24px 16px}
  175. .popc{max-width:1120px;margin:0 auto;background:var(--ground);border:1px solid var(--line);border-radius:var(--r);padding:16px 18px}
  176. .poph{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;margin-bottom:12px;padding-bottom:10px;border-bottom:1px solid var(--line)}
  177. .poph h3{font-size:16px}
  178. /* 2026-09-03: reading hierarchy, work-order details and responsive layout. */
  179. :root{--r:12px;--shadow:0 3px 16px rgba(23,51,68,.035)} /* 2026-09-06 用户裁: 去中段 --ground/--line 覆盖, 令牌与门户一致 */
  180. .wrap{max-width:1360px;padding:0 32px 64px}
  181. header.top{padding:24px 0 20px;gap:24px}
  182. .brand{font-size:21px;letter-spacing:-.035em}
  183. .brand small{letter-spacing:0;font-size:12px}
  184. .mark{gap:12px}
  185. nav.tabs{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px;padding:6px;background:#EAF0F3;border:1px solid var(--line);border-radius:12px}
  186. nav.tabs button{margin:0;padding:10px 6px;min-height:40px;border:0;border-radius:7px;font-size:12px;line-height:1.3}
  187. nav.tabs button:hover{color:var(--accent-deep);background:#F5F9FA}
  188. nav.tabs button.on{color:var(--accent-deep);background:var(--panel);box-shadow:0 1px 5px #17334412;font-weight:600}
  189. .page-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:28px 0 16px}
  190. .page-head h1{font-size:28px;line-height:1.2;letter-spacing:-.035em}
  191. .window-badge{font-size:11px;font-weight:500;white-space:nowrap;color:var(--accent-deep);border:1px solid #CDDEE6;background:#ECF4F7;padding:5px 10px;border-radius:6px}
  192. .page-head+section{margin-top:0}
  193. .sechead{flex-wrap:wrap;row-gap:6px;margin-bottom:14px}
  194. .sechead h2{font-size:18px;letter-spacing:-.025em}
  195. .legend{flex-wrap:wrap;row-gap:5px}
  196. .panel,.card,.kpi,.strip,.sysc{box-shadow:var(--shadow)}
  197. .panel{padding:18px}
  198. .panel>h3{font-size:15px;line-height:1.45;margin-bottom:8px}
  199. .panel,.grid2>*{min-width:0}
  200. .kpis{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
  201. .kpi{padding:18px 20px;min-height:108px}
  202. .kpi::before{top:18px;bottom:18px}
  203. .kpi b{font-size:29px;line-height:1.1}
  204. .kpi b small{margin-left:5px;font-size:12px}
  205. .kpi span{font-size:12px;margin-top:9px;line-height:1.45;max-width:36ch}
  206. .cards{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:16px}
  207. .card{padding:20px 22px 18px}
  208. .card .head{align-items:start;flex-wrap:wrap;gap:8px}
  209. .card .unit{font-size:23px;line-height:1.15;white-space:nowrap}
  210. .card .sys{flex:1;min-width:90px;line-height:1.45}
  211. .card .head .chip{margin-left:auto}
  212. .card .evid{margin:12px 0 8px}
  213. .card .caveat{font-size:12px;line-height:1.65;padding-top:12px}
  214. .evidence-detail{margin-top:14px;background:#F5F8FA;border:1px solid #E5ECF0;border-radius:7px;padding:9px 12px}
  215. .evidence-detail summary{cursor:pointer;color:var(--accent-deep);font-size:12px;font-weight:500}
  216. .card .why{line-height:1.7;margin:10px 0 3px}
  217. .sysc{padding:16px;gap:12px}
  218. .sysc[role=button]{cursor:pointer}
  219. .sysc[role=button]:hover{border-color:#9DBECA;background:#FBFDFE}
  220. .grid2{grid-template-columns:repeat(auto-fit,minmax(min(100%,440px),1fr));gap:16px}
  221. .tblwrap{max-width:100%;border-radius:7px;overscroll-behavior-x:contain}
  222. th{background:#F4F7F9;font-size:11px;font-weight:600;letter-spacing:.025em;padding:10px 12px}
  223. td{padding:11px 12px;line-height:1.6}
  224. tr:hover>td{background:#F7FAFC}
  225. td.r,th.r{white-space:nowrap}
  226. .strip{overflow-x:auto;padding:18px}
  227. .strip .cells,.strip .nums{min-width:850px}
  228. footer{border-top:1px solid var(--line);padding-top:18px;line-height:1.7;font-size:11px!important}
  229. .popm{padding:24px;background:rgba(17,35,47,.58);backdrop-filter:blur(3px)}
  230. .popc{max-width:1240px;padding:0 0 8px;border-radius:16px;box-shadow:0 24px 80px #0E263640}
  231. .poph{position:sticky;top:-24px;z-index:2;align-items:center;padding:20px 24px;margin:0 0 20px;background:var(--panel);border-radius:16px 16px 0 0;box-shadow:0 2px 8px #17334405}
  232. .poph h3{font-size:23px;line-height:1.3;letter-spacing:-.025em}
  233. .poph .btn{flex-shrink:0;min-height:36px;border-color:var(--line);background:var(--ground)}
  234. .popc>.panel,.popc>p{margin:16px 20px}
  235. .popc>.panel{padding:20px}
  236. .popc>.panel>.head{align-items:center!important;margin-bottom:10px;font-size:17px}
  237. .popc>.panel>.small{max-width:105ch;line-height:1.7}
  238. .popc .grid2>.panel{padding:16px;box-shadow:none;background:#FBFCFD}
  239. .order-block{margin-top:24px;border-top:1px solid var(--line);padding-top:18px}
  240. .order-head{display:flex;align-items:center;gap:18px;flex-wrap:wrap;margin-bottom:12px}
  241. .order-head>b{font-size:14px}
  242. .action-counts{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
  243. .action-count{display:inline-flex;gap:7px;align-items:center;background:var(--wash);color:var(--accent-deep);border:1px solid #D5E7EF;border-radius:5px;padding:3px 8px;font-size:11px}
  244. .action-count b{font-variant-numeric:tabular-nums;font-weight:600}
  245. .order-table{table-layout:fixed;min-width:780px}
  246. .order-table .order-date{width:112px;white-space:nowrap}
  247. .order-table td{overflow-wrap:anywhere;padding-top:14px;padding-bottom:14px}
  248. .order-table td.order-date{overflow-wrap:normal;font-size:12px;color:var(--muted)}
  249. .popup-verbatim-note{color:var(--muted);font-size:11px;line-height:1.7;padding:0 4px}
  250. .verbatim{border-bottom:1px dotted #B9C6CF}
  251. @media(min-width:1440px){.kpis{grid-template-columns:repeat(6,minmax(0,1fr))}}
  252. @media(max-width:900px){.wrap{padding:0 20px 48px}.brand small{display:block;margin:3px 0 0}.cards{grid-template-columns:1fr}.sechead .legend{margin-left:0;width:100%}.popm{padding:12px}.poph{top:-12px}.systems{grid-template-columns:repeat(2,minmax(0,1fr))}}
  253. @media(max-width:600px){
  254. .wrap{padding:0 14px 40px}header.top{flex-wrap:wrap;gap:14px;padding:18px 0}.brand{font-size:20px}header.top .right{margin-left:0;width:100%;gap:8px}header.top select{flex:1;min-width:0}
  255. nav.tabs{grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;padding:5px}nav.tabs button{font-size:11.5px;min-height:36px;text-align:left;padding:8px 10px}
  256. .page-head{margin:22px 0 14px;align-items:flex-start}.page-head h1{font-size:23px}.window-badge{font-size:10px;padding:4px 7px}
  257. .kpis{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.kpi{padding:14px;min-height:116px}.kpi b{font-size:24px}.kpi span{font-size:11px}
  258. .systems{grid-template-columns:1fr}.panel{padding:14px}.card{padding:16px}.card .head .sys{font-size:12px}.card .unit{font-size:21px}
  259. .popm{padding:8px}.popc{border-radius:12px}.poph{top:-8px;padding:15px 14px;border-radius:12px 12px 0 0;margin-bottom:12px}.poph h3{font-size:19px}.popc>.panel,.popc>p{margin:12px 10px}.popc>.panel{padding:14px}.popc .grid2>.panel{padding:12px}
  260. .order-head{gap:8px}.paper{padding:18px 14px}.paper-hd{gap:12px;flex-wrap:wrap}
  261. }
  262. @media print{.evidence-detail{display:block}.poph{position:static}nav.tabs,header.top,.page-head .window-badge{display:none!important}.card,.panel,.kpi{box-shadow:none}}
  263. /* Singapore bay theme: a restrained Marina Bay silhouette, garden canopies, turbines and wind-flow traces. */
  264. /* 2026-09-06 用户裁: 删末块令牌覆盖, 与门户单文件浅色令牌 (#F5F7F8/#1B2430/#1F6F8B/#DDE3E8) 一致; 基线 detail_style_baseline */
  265. body{background:radial-gradient(ellipse at 95% 0,rgba(41,201,187,.075),transparent 40%),var(--ground)}
  266. header.top{position:relative;isolation:isolate;overflow:hidden;min-height:128px;margin:22px 0 12px;padding:28px 30px;border:1px solid #1F526A;border-radius:18px;background:radial-gradient(ellipse at 68% 120%,#08788788,transparent 60%),linear-gradient(115deg,#092438,#103E55);box-shadow:0 10px 32px #0A344416}
  267. header.top::before{content:"";position:absolute;z-index:-1;inset:0;opacity:.16;background-image:linear-gradient(#73B4C425 1px,transparent 1px),linear-gradient(90deg,#73B4C425 1px,transparent 1px);background-size:28px 28px;pointer-events:none}
  268. .wind-field{position:absolute;width:420px;height:130px;left:35%;bottom:0;color:#61DBCE;opacity:.4;pointer-events:none;z-index:-1}
  269. header.top .mark{gap:15px}header.top .mark>svg{width:36px;height:36px;color:#65E1D0;padding:5px;border:1px solid #66CCBE55;border-radius:10px;background:#73E4CE0D}
  270. header.top .brand{font-size:27px;color:#F4FFFF;letter-spacing:-.035em}
  271. header.top .brand small{display:block;margin:3px 0 0;font-size:11px;letter-spacing:.035em;color:#B3D6DF}
  272. header.top .right{position:relative;padding:9px 11px;border:1px solid #759EAD44;border-radius:10px;background:#092A3EBF}
  273. header.top .right label{color:#B9D7E1}header.top select{background:#153E52;color:#E5FAFF;border-color:#3A6576}
  274. header.top .toggle{background:#E9F5F7;border-color:#527887}
  275. nav.tabs{background:#E4EFF2;border-color:#D1E3E8;gap:5px}
  276. nav.tabs button.on{color:#fff;background:linear-gradient(110deg,#087788,#006975);box-shadow:0 3px 8px #08778820}
  277. nav.tabs button:hover:not(.on){background:#F7FFFF;color:#00636B}
  278. .page-head h1{position:relative;padding-left:14px}
  279. .page-head h1::before{content:"";position:absolute;left:0;top:4px;bottom:2px;width:4px;border-radius:3px;background:linear-gradient(#07949C,#46C7AB)}
  280. .window-badge{background:#E5F5F3;border-color:#BDDCD8;color:#00636B}
  281. .kpi{background:linear-gradient(140deg,#fff 65%,#EEF9F8)}
  282. .evidence-detail{background:#F0F8F9;border-color:#DAECEE}
  283. .panel,.card,.sysc{border-color:#D7E5EB}.sysc[role=button]:hover{border-color:#69AAA9}
  284. a:hover{color:#008591}
  285. :focus-visible{outline-color:#05A2AD;outline-width:3px}
  286. @media(max-width:900px){header.top{padding:24px;gap:16px}.wind-field{left:34%;width:280px;opacity:.25}}
  287. @media(max-width:600px){header.top{margin-top:14px;padding:20px 17px;min-height:156px;border-radius:14px;gap:18px}header.top .brand{font-size:25px}header.top .brand small{font-size:10px}header.top .right{padding:8px;width:100%}.wind-field{left:auto;right:-50px;bottom:46px;width:230px;opacity:.22}header.top .mark{gap:12px}}
  288. @media print{body{background:#fff}.page-head h1::before{display:none}.kpi{background:#fff}a{color:inherit}}
  289. .source-record{margin-top:5px;font-size:10px;color:var(--muted);font-weight:400;line-height:1.6}
  290. .source-record summary{cursor:pointer;display:list-item;color:var(--accent-deep)}
  291. .source-record[open]{background:var(--ground);border:1px solid var(--line);border-radius:6px;padding:7px}
  292. .source-record>div{margin-top:6px;font-size:12px;overflow-wrap:anywhere}
  293. /* 返回门户 / 重新选择机组·测点 (2026-09-06 用户裁: 补上再冻结) */
  294. header.top .right .back-portal,header.top .right .reselect{display:inline-block;margin-right:8px;padding:6px 11px;border:1px solid #759EAD66;border-radius:8px;background:#0E3446;color:#E5FAFF;font-size:12.5px;text-decoration:none;cursor:pointer;line-height:1.3}
  295. header.top .right .back-portal:hover,header.top .right .reselect:hover{background:#155069;border-color:#9BC6D3}