app.css 123 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627
  1. /* Layout: one-screen field console — header bar; map stage with a floating left rail (stats + crop tree); a narrow fixed base list on the right */
  2. :root{
  3. --bg:#0a0c08; --grid:#14170f; --panel:#12150e; --panel-2:#181c12; --line:#272b1c; --line-hi:#4b4223;
  4. --amber:#ffd489; --amber-ink:#1a1204; --amber-soft:rgba(255,212,137,.12);
  5. --text:#ece7d3; --muted:#9d9a83; --faint:#66654f;
  6. --land:#1a2013; --land-hi:#28311b; --land-sel:#36421f; --land-dim:#121609; --border-geo:#b9892a;
  7. --c-grain:#e9c75a; --c-fruit:#ef80ba; --c-veg:#5fd48e; --c-cash:#5ab7ec;
  8. --sev-light:#f0a531; --sev-medium:#ec6a2a; --sev-heavy:#e0393a; --w-red:#ff4d4f; --w-orange:#ff8a2a; --w-yellow:#ffd23f; --w-blue:#4a90ff; --w-ok:#4cc27e;
  9. --f-num:"Barlow Semi Condensed","DIN Alternate","Arial Narrow",ui-sans-serif,sans-serif;
  10. --f-ui:"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Noto Sans SC","Source Han Sans SC",system-ui,sans-serif;
  11. color-scheme:dark;
  12. }
  13. [hidden]{display:none!important}
  14. html,body{height:100%;margin:0}
  15. body{background:var(--bg);color:var(--text);font-family:var(--f-ui);font-size:13px;overflow:hidden;
  16. background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);background-size:44px 44px}
  17. button,select,input{font:inherit;color:inherit}
  18. button{cursor:pointer}
  19. :focus-visible{outline:2px solid var(--amber);outline-offset:2px}
  20. .num{font-family:var(--f-num);font-variant-numeric:tabular-nums}
  21. .app{height:100%;display:grid;grid-template-rows:auto minmax(0,1fr);gap:12px;
  22. padding-left:max(16px,env(safe-area-inset-left,0px));padding-right:max(16px,env(safe-area-inset-right,0px));padding-block:0 14px}
  23. /* header */
  24. .top{display:flex;align-items:center;gap:18px;padding-block:12px;border-bottom:1px solid var(--line);min-width:0}
  25. .brand{display:flex;align-items:center;gap:12px;flex:none}
  26. .logo{width:40px;height:40px;display:grid;place-items:center;flex:none}
  27. .logo img{width:40px;height:40px;object-fit:contain;display:block;filter:drop-shadow(0 0 8px rgba(255,212,137,.35))}
  28. .bt{font-size:19px;font-weight:800;letter-spacing:.04em}
  29. .bs{font-family:var(--f-num);font-size:11px;letter-spacing:.14em;color:var(--muted)}
  30. .pill{flex:none;background:var(--amber);color:var(--amber-ink);font-weight:800;padding:8px 18px;border-radius:999px;font-size:14px}
  31. .hint{color:var(--muted);margin:0;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  32. .sys{margin-left:auto;flex:none;display:flex;align-items:center;gap:8px;font-weight:700;font-size:12.5px}
  33. .sys i{width:8px;height:8px;border-radius:50%;background:var(--w-ok);box-shadow:0 0 8px var(--w-ok)}
  34. .sys .num{color:var(--muted);font-weight:500;font-size:13px}
  35. /* main */
  36. .main{display:grid;grid-template-columns:minmax(0,1fr) 372px;gap:14px;min-height:0}
  37. .stage{position:relative;border:1px solid var(--line);border-radius:12px;overflow:hidden;min-height:0;
  38. background:radial-gradient(ellipse at 60% 45%,#161b10 0%,var(--bg) 70%)}
  39. #map{position:absolute;inset:0}
  40. .rail{position:absolute;top:12px;left:12px;bottom:12px;width:262px;display:flex;flex-direction:column;gap:10px;pointer-events:none;z-index:3}
  41. .rail>*{pointer-events:auto}
  42. .glass{background:rgba(16,19,12,.86);border:1px solid var(--line);border-radius:10px;backdrop-filter:blur(6px)}
  43. .stats{display:grid;grid-template-columns:repeat(3,1fr);padding:10px 4px}
  44. .stat{padding:2px 9px;min-width:0}
  45. .stat+.stat{border-left:1px solid var(--line)}
  46. .stat .l{font-size:11px;color:var(--muted);letter-spacing:.04em}
  47. .stat .v{font-family:var(--f-num);font-weight:700;font-size:22px;line-height:1.15;color:var(--text);white-space:nowrap}
  48. .stat .v small{font-family:var(--f-ui);font-size:11px;font-weight:700;margin-left:2px;color:var(--muted)}
  49. .stat .s{font-size:10.5px;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  50. .stats-cap{grid-column:1/-1;font-size:10.5px;color:var(--faint);padding:6px 9px 0;border-top:1px dashed var(--line);margin-top:8px}
  51. .stats-cap b{color:var(--amber);font-weight:700}
  52. .cats{flex:1;min-height:0;overflow:auto;padding:8px;scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent}
  53. .cats-h{display:flex;justify-content:space-between;align-items:baseline;padding:2px 6px 8px;color:var(--muted);font-size:11px;letter-spacing:.08em}
  54. .row{display:flex;align-items:center;gap:8px;width:100%;border:0;background:none;text-align:left;border-radius:7px;padding:6px 8px}
  55. .row:hover{background:var(--panel-2)}
  56. .row.on{background:var(--amber-soft);box-shadow:inset 0 0 0 1px rgba(255,212,137,.35)}
  57. .row b{margin-left:auto;font-family:var(--f-num);font-weight:600;color:var(--muted);font-size:13px}
  58. .row.on b{color:var(--amber)}
  59. .row-all{font-weight:700}
  60. .cat{margin-top:4px}
  61. .cat-h{font-weight:700;font-size:13.5px}
  62. .cat-h .sw{width:10px;height:10px;border-radius:3px;background:var(--cc);box-shadow:0 0 8px var(--cc);flex:none}
  63. .cat-h .caret{width:16px;color:var(--faint);transition:transform .15s;flex:none;text-align:center}
  64. .cat.closed .caret{transform:rotate(-90deg)}
  65. .cat.closed .crops{display:none}
  66. .cat-h b small{font-family:var(--f-ui);font-size:10.5px;font-weight:500;margin-left:1px}
  67. .crops{padding-left:14px;border-left:1px dashed var(--line);margin-left:13px}
  68. .crop{font-size:12.5px;padding:4px 8px}
  69. .crop.zero{opacity:.38}
  70. .ic{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:800;flex:none;
  71. background:#0f120a;box-shadow:inset 0 0 0 1.4px var(--cc);color:var(--cc)}
  72. .mapbar{position:absolute;top:12px;right:12px;left:290px;display:flex;justify-content:flex-end;align-items:center;gap:10px;z-index:3;flex-wrap:wrap;pointer-events:none}
  73. .mapbar>*{pointer-events:auto}
  74. .crumbs{display:flex;align-items:center;gap:2px;padding:4px 6px;font-size:13px}
  75. .crumbs button{border:0;background:none;padding:4px 7px;border-radius:6px;color:var(--muted)}
  76. .crumbs button:hover{color:var(--text);background:var(--panel-2)}
  77. .crumbs button.cur{color:var(--amber);font-weight:800}
  78. .crumbs .sep{color:var(--faint)}
  79. .seg{display:flex;padding:3px;gap:2px}
  80. .seg button{border:0;background:none;padding:6px 12px;border-radius:7px;color:var(--muted);font-size:12.5px;display:flex;align-items:center;gap:6px}
  81. .seg button i{font-style:normal;font-family:var(--f-num);font-weight:700;font-size:11px;color:var(--faint)}
  82. .seg button:hover:not(:disabled){color:var(--text)}
  83. .seg button.on{background:var(--amber);color:var(--amber-ink);font-weight:800}
  84. .seg button.on i{color:var(--amber-ink)}
  85. .seg button:disabled{opacity:.35;cursor:not-allowed}
  86. .legend{position:absolute;right:12px;bottom:12px;z-index:3;display:flex;flex-wrap:wrap;gap:6px 14px;align-items:center;padding:8px 12px;font-size:11.5px;color:var(--muted);max-width:calc(100% - 300px)}
  87. .legend span{display:inline-flex;align-items:center;gap:5px}
  88. .legend .d{width:9px;height:9px;border-radius:50%;background:var(--cc)}
  89. .legend .ring{width:10px;height:10px;border-radius:50%;border:2px solid var(--w-red)}
  90. .legend .ib{width:16px;height:16px;border-radius:50%;border:1.4px solid var(--amber);display:inline-block}
  91. .legend hr{width:1px;height:14px;border:0;background:var(--line-hi);margin:0}
  92. .levelhint{position:absolute;left:290px;right:12px;top:62px;z-index:2;font-size:12px;color:var(--faint);text-align:right;pointer-events:none}
  93. .levelhint b{color:var(--muted)}
  94. .toast{position:absolute;left:50%;top:64px;transform:translateX(-50%);z-index:9;padding:8px 14px;font-size:12.5px;border-color:var(--line-hi)}
  95. /* side list */
  96. .side{display:flex;flex-direction:column;min-height:0;border:1px solid var(--line);border-radius:12px;background:rgba(16,19,12,.92);padding:14px 12px 10px}
  97. .side-h{display:flex;align-items:baseline;gap:10px;padding:0 2px}
  98. .side-h h2{margin:0;font-size:17px;font-weight:800;color:var(--amber);padding-left:10px;border-left:3px solid var(--amber);line-height:1.1}
  99. .side-h .cnt{margin-left:auto;color:var(--muted);font-size:12px}
  100. .side-h .cnt .num{color:var(--text);font-size:16px;font-weight:700}
  101. .scope{margin:6px 2px 10px;color:var(--faint);font-size:11.5px}
  102. .scope b{color:var(--muted);font-weight:600}
  103. .geoidx{display:grid;grid-template-columns:1fr 1fr 1fr;gap:6px}
  104. .geoidx label,.tools label{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  105. select,input[type=search]{background:var(--panel-2);border:1px solid var(--line);border-radius:7px;padding:6px 8px;font-size:12px;min-width:0;width:100%}
  106. select:hover,input[type=search]:hover{border-color:var(--line-hi)}
  107. .tools{display:grid;grid-template-columns:1fr 128px;gap:6px;margin-top:6px}
  108. .wf{display:flex;gap:5px;margin:8px 0 8px;flex-wrap:wrap}
  109. .wf button{border:1px solid color-mix(in srgb,var(--wc) 55%,transparent);background:transparent;color:var(--wc);border-radius:999px;padding:2px 9px;font-size:11.5px;display:flex;gap:4px;align-items:baseline}
  110. .wf button .num{font-size:13px;font-weight:700}
  111. .wf button.on{background:color-mix(in srgb,var(--wc) 20%,transparent);box-shadow:0 0 0 1px var(--wc)}
  112. .wf button.all{--wc:var(--muted)}
  113. .rows{flex:1;min-height:0;overflow:auto;display:flex;flex-direction:column;gap:6px;padding-right:2px;scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent}
  114. .empty{color:var(--faint);text-align:center;padding:40px 10px;line-height:1.8}
  115. .card{border:1px solid var(--line);border-radius:9px;padding:8px 10px 8px 12px;background:var(--panel);position:relative;display:grid;gap:4px;cursor:default}
  116. .card::before{display:none}
  117. .card:hover,.card.hot{border-color:var(--line-hi);background:var(--panel-2)}
  118. .card.flash{animation:flash 1.2s ease}
  119. @keyframes flash{0%,40%{box-shadow:0 0 0 2px var(--amber)}100%{box-shadow:0 0 0 0 transparent}}
  120. .c1{display:flex;align-items:center;gap:8px;min-width:0}
  121. .c1 .nm{color:var(--amber);font-weight:800;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
  122. .c1 .go{margin-left:auto;flex:none;border:0;background:var(--amber);color:var(--amber-ink);font-weight:800;font-size:11.5px;padding:3px 9px;border-radius:6px}
  123. .c1 .go:hover{filter:brightness(1.1)}
  124. .c2{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:11.5px;white-space:nowrap}
  125. .c2 .ic{width:16px;height:16px;font-size:9px}
  126. .c2 .sp{color:var(--faint)}
  127. .fl{margin-left:auto;display:flex;align-items:center;gap:5px}
  128. .bar{width:54px;height:5px;border-radius:3px;background:var(--line);overflow:hidden}
  129. .bar i{display:block;height:100%;background:var(--bc);border-radius:3px}
  130. .fl .num{font-size:12.5px;color:var(--text);font-weight:600}
  131. .c3{display:flex;align-items:center;gap:6px;font-size:11.5px;flex-wrap:wrap}
  132. .wtag .wsep{font-style:normal;opacity:.6;margin:0 4px}
  133. .wtag{color:var(--wc);border:1px solid color-mix(in srgb,var(--wc) 50%,transparent);background:color-mix(in srgb,var(--wc) 12%,transparent);border-radius:4px;padding:0 5px;font-weight:700;white-space:nowrap}
  134. .c3 .st{color:var(--text);white-space:nowrap}
  135. .c3 .st em{font-style:normal;color:var(--muted)}
  136. .c4{display:flex;align-items:center;gap:6px;font-size:11.5px;color:var(--muted);min-width:0}
  137. .c4 .when{color:var(--text);white-space:nowrap}
  138. .c4 .when.soon{color:var(--amber);font-weight:700}
  139. .kpi{border:1px dashed var(--line-hi);border-radius:4px;padding:0 5px;color:var(--text);white-space:nowrap}
  140. /* detail modal */
  141. .modal{position:absolute;inset:0;z-index:20;background:rgba(5,6,4,.62);display:grid;place-items:center;padding:16px}
  142. .sheet{width:min(520px,100%);max-height:100%;overflow:auto;background:var(--panel);border:1px solid var(--line-hi);border-radius:14px;padding:18px 20px;box-shadow:0 20px 60px rgba(0,0,0,.6)}
  143. .sheet h3{margin:0;font-size:19px;color:var(--amber);text-wrap:balance}
  144. .sheet .sub{color:var(--muted);margin:4px 0 14px;font-size:12px}
  145. .kv{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:14px}
  146. .kv div{background:var(--panel-2);border:1px solid var(--line);border-radius:8px;padding:8px 10px;min-width:0}
  147. .kv span{display:block;color:var(--faint);font-size:11px}
  148. .kv strong{font-family:var(--f-num);font-size:20px}
  149. .kv strong small{font-family:var(--f-ui);font-size:11px;color:var(--muted);margin-left:2px}
  150. .tabs{display:flex;gap:6px;flex-wrap:wrap;margin:10px 0}
  151. .tabs span{border:1px solid var(--line);border-radius:999px;padding:4px 11px;color:var(--muted);font-size:12px}
  152. .sheet p{color:var(--muted);font-size:12.5px;line-height:1.7;margin:8px 0 0}
  153. .sheet .acts{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}
  154. .btn{border:1px solid var(--line-hi);background:none;border-radius:8px;padding:7px 14px}
  155. .btn.pri{background:var(--amber);border-color:var(--amber);color:var(--amber-ink);font-weight:800}
  156. @media (max-width:1180px){ .main{grid-template-columns:minmax(0,1fr) 330px} .hint{display:none} }
  157. @media (max-width:860px){
  158. body{overflow:auto}
  159. .app{height:auto;min-height:100%}
  160. .top{flex-wrap:wrap;gap:10px}
  161. .pill{padding:6px 12px}
  162. .sys{margin-left:0}
  163. .main{grid-template-columns:1fr}
  164. .stage{display:flex;flex-direction:column;overflow:visible}
  165. #map{position:relative;inset:auto;height:62vh;min-height:380px;order:2}
  166. .rail{position:static;width:auto;padding:10px 10px 0;order:0}
  167. .cats{max-height:200px}
  168. .mapbar{position:static;padding:8px 10px 0;justify-content:flex-start;order:1}
  169. .legend{position:static;max-width:none;margin:0 10px 10px;order:3}
  170. .levelhint{display:none}
  171. .side{min-height:70vh}
  172. .toast{top:10px}
  173. }
  174. @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
  175. /* ================= 基地详情页 ================= */
  176. body.in-detail{overflow:auto}
  177. body.in-detail .app{height:auto;min-height:100%}
  178. .sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0)}
  179. .detail{display:flex;flex-direction:column;gap:12px;min-width:0}
  180. .d-top{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
  181. .d-crumbs{display:flex;align-items:center;gap:6px;flex-wrap:wrap;color:var(--muted);font-size:13px;min-width:0}
  182. .d-crumbs button{border:0;background:none;padding:2px 0;color:var(--muted)}
  183. .d-crumbs button:hover{color:var(--amber)}
  184. .d-crumbs .sep{color:var(--faint)}
  185. .d-crumbs .base{color:var(--amber);font-weight:700}
  186. .d-crumbs .cur{color:var(--text);font-weight:800}
  187. .d-right{margin-left:auto;display:flex;gap:8px;align-items:center;min-width:0}
  188. .d-right select{width:auto;max-width:260px;padding:7px 10px}
  189. .d-tabs{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  190. .tabbar{display:flex;gap:6px}
  191. .tabbar button,.tabbar-r{border:1px solid var(--line-hi);background:var(--panel);border-radius:9px;padding:9px 26px;font-size:15px;font-weight:700;color:var(--muted)}
  192. .tabbar button:hover,.tabbar-r:hover{color:var(--text)}
  193. .tabbar button.on,.tabbar-r.on{background:var(--amber);border-color:var(--amber);color:var(--amber-ink)}
  194. .tabbar-r{margin-left:auto}
  195. .panel{border:1px solid var(--line);border-radius:12px;background:rgba(16,19,12,.92);padding:12px 14px;min-width:0}
  196. .ph-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px}
  197. .ph-h h3{margin:0;font-size:16px;font-weight:800;color:var(--amber);padding-left:10px;border-left:3px solid var(--amber);line-height:1.15}
  198. .ph-h .meta{color:var(--muted);font-size:12px}
  199. .ph-h .r{margin-left:auto;display:flex;gap:6px;align-items:center;flex-wrap:wrap}
  200. .ph-h select{width:auto;padding:5px 8px}
  201. .chip-btn{border:1px solid var(--line-hi);background:var(--panel-2);border-radius:999px;padding:5px 13px;font-size:12.5px;font-weight:600;white-space:nowrap}
  202. .chip-btn:hover{border-color:var(--amber)}
  203. .chip-btn.on{background:var(--amber);border-color:var(--amber);color:var(--amber-ink);font-weight:800}
  204. .chip-btn:disabled{opacity:.35;cursor:not-allowed}
  205. .btn-amber{border:0;background:var(--amber);color:var(--amber-ink);font-weight:800;border-radius:7px;padding:6px 12px;font-size:12.5px}
  206. /* 地图区 */
  207. .mapwrap{position:relative;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#20261a;min-height:140px}
  208. .mapcanvas{position:absolute;inset:0;touch-action:none;cursor:grab}
  209. .mapcanvas.panning{cursor:grabbing}
  210. .mapcanvas .pt circle.rdot{transition:transform .12s;transform-box:fill-box;transform-origin:center}
  211. .mapcanvas .pt:hover circle.rdot{transform:scale(1.3)}
  212. .mzoom{position:absolute;right:14px;bottom:36px;z-index:6;display:flex;flex-direction:column;gap:4px;align-items:center}
  213. .mzoom button{width:30px;height:30px;border-radius:8px;border:1px solid var(--line);background:rgba(10,12,8,.82);color:var(--fg,#ece7d3);font-size:16px;line-height:1;cursor:pointer}
  214. .mzoom button:hover{border-color:var(--amber)}
  215. .mzoom span{font-size:11px;color:var(--amber);min-height:14px}
  216. .mapcanvas svg{width:100%;height:100%;display:block}
  217. .mapcanvas .pt{cursor:pointer}
  218. .mapcanvas .pt circle.dot{transition:r .12s}
  219. .mapcanvas .pt:hover circle.dot{r:10}
  220. .mapcanvas .plot{cursor:pointer}
  221. .bcard{position:absolute;left:10px;top:10px;width:min(340px,calc(100% - 20px));box-sizing:border-box;max-height:calc(100% - 30px);overflow:auto;padding:9px 10px;z-index:3;scrollbar-width:thin;display:grid;gap:7px}
  222. .pcard{position:absolute;right:10px;top:10px;width:264px;max-height:calc(100% - 30px);overflow:auto;padding:8px;z-index:3;scrollbar-width:thin}
  223. .mapwrap.narrow .bcard,.mapwrap.narrow .pcard{display:none}
  224. .maplegend{position:absolute;left:50%;transform:translateX(-50%);bottom:20px;z-index:2;display:flex;gap:12px;align-items:center;padding:6px 12px;font-size:11.5px;color:var(--muted);white-space:nowrap}
  225. .maplegend i{display:inline-block;width:14px;height:10px;border-radius:2px;margin-right:4px;vertical-align:-1px}
  226. .mapwrap.narrow .maplegend{display:none}
  227. .mapwrap.narrow .mapsize{bottom:24px;left:50%;right:auto;transform:translateX(-50%);color:var(--muted)}
  228. .resizer{position:absolute;left:0;right:0;bottom:0;height:16px;cursor:ns-resize;display:grid;place-items:center;z-index:4;background:linear-gradient(transparent,rgba(0,0,0,.55));touch-action:none}
  229. .resizer span{width:56px;height:4px;border-radius:2px;background:var(--line-hi)}
  230. .resizer:hover span,.resizer.drag span{background:var(--amber)}
  231. .mapsize{position:absolute;right:12px;bottom:22px;z-index:2;font-size:11px;color:var(--faint);font-family:var(--f-num)}
  232. .bc-h{display:flex;align-items:flex-start;gap:8px}
  233. .bc-h h4{margin:0;font-size:15px;color:var(--amber);font-weight:800;line-height:1.3}
  234. .bc-h .id{font-family:var(--f-num);color:var(--faint);font-size:12px;margin-left:auto;white-space:nowrap}
  235. .bc-sec{border-top:1px dashed var(--line);padding-top:8px;margin-top:8px;display:grid;gap:5px}
  236. .bc-sec .t{font-size:10.5px;color:var(--faint);letter-spacing:.08em}
  237. .kvr{display:flex;gap:8px;font-size:12px;align-items:baseline}
  238. .kvr span{color:var(--faint);flex:none;width:64px}
  239. .kvr b{font-weight:600;color:var(--text);min-width:0}
  240. .kvr b em{font-style:normal;color:var(--muted);font-weight:500}
  241. .mini{display:grid;grid-template-columns:repeat(2,1fr);gap:6px}
  242. .mini div{background:var(--panel-2);border:1px solid var(--line);border-radius:7px;padding:5px 8px;min-width:0}
  243. .mini span{display:block;font-size:10.5px;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  244. .mini strong{font-family:var(--f-num);font-size:17px;font-weight:700}
  245. .mini strong small{font-family:var(--f-ui);font-size:10.5px;color:var(--muted);margin-left:2px;font-weight:500}
  246. .prog{display:grid;grid-template-columns:76px 1fr 64px;gap:8px;align-items:center;font-size:12px}
  247. .prog span{color:var(--faint)}
  248. .prog .bar{width:auto;height:6px}
  249. .prog b{font-family:var(--f-num);text-align:right;font-weight:600}
  250. .plan{display:grid;gap:5px}
  251. .plan div{display:grid;grid-template-columns:44px 1fr;gap:8px;font-size:11.5px;background:var(--panel-2);border:1px solid var(--line);border-radius:7px;padding:5px 8px}
  252. .plan .d{font-family:var(--f-num);font-weight:700;color:var(--amber);font-size:13px}
  253. .plan .w{color:var(--text)}
  254. .plan .m{color:var(--muted);display:block}
  255. .pc-h{display:flex;align-items:center;gap:8px;margin-bottom:8px}
  256. .pc-h .lb{font-size:11px;color:var(--faint)}
  257. .pc-h .code{font-family:var(--f-num);font-size:18px;font-weight:700;color:var(--amber)}
  258. .pc-h .grp{margin-left:auto;font-size:11.5px;color:var(--muted)}
  259. .pc-photo{position:relative;border-radius:8px;overflow:hidden;border:1px solid var(--line)}
  260. .pc-photo img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}
  261. .pc-photo .nav{position:absolute;top:50%;transform:translateY(-50%);width:30px;height:44px;border:0;border-radius:6px;background:rgba(10,12,8,.72);color:var(--text);font-size:18px}
  262. .pc-photo .nav:hover:not(:disabled){background:var(--amber);color:var(--amber-ink)}
  263. .pc-photo .nav:disabled{opacity:.3;cursor:not-allowed}
  264. .pc-photo .prev{left:6px}.pc-photo .next{right:6px}
  265. .vw-img .vw-stamp{position:absolute;left:12px;bottom:12px;z-index:2;background:rgba(10,12,8,.75);color:var(--text);border-radius:6px;padding:3px 10px;font-size:13px;font-family:var(--f-num);pointer-events:none}
  266. .pc-photo .stamp{position:absolute;left:8px;bottom:8px;background:rgba(10,12,8,.75);border-radius:5px;padding:2px 7px;font-size:11px;font-family:var(--f-num)}
  267. .pc-seq{display:flex;gap:4px;margin:8px 0;overflow-x:auto;scrollbar-width:thin;padding-bottom:2px}
  268. .pc-seq button{flex:none;border:1px solid var(--line);background:var(--panel-2);border-radius:5px;padding:2px 6px;font-size:11px;font-family:var(--f-num);color:var(--muted)}
  269. .pc-seq button.on{border-color:var(--amber);color:var(--amber);font-weight:700}
  270. .ibox{border:1px solid rgba(255,212,137,.4);border-radius:8px;padding:8px 10px;background:rgba(255,212,137,.05)}
  271. .ibox .t{font-size:11px;color:var(--amber);font-weight:700;margin-bottom:4px;display:flex;justify-content:space-between}
  272. .ibox .t em{font-style:normal;color:var(--faint);font-weight:500}
  273. .ibox table{width:100%;border-collapse:collapse;font-size:12px}
  274. .ibox td{padding:3px 0;border-top:1px dashed var(--line)}
  275. .ibox tr:first-child td{border-top:0}
  276. .ibox td:last-child{text-align:right;font-family:var(--f-num);font-size:14px;font-weight:600}
  277. .ibox td small{color:var(--faint);font-family:var(--f-ui);font-size:10.5px;margin-left:2px}
  278. .ibox .up{color:var(--w-ok)}.ibox .dn{color:var(--w-orange)}
  279. .pc-empty{color:var(--faint);text-align:center;padding:30px 8px;line-height:1.8;font-size:12.5px}
  280. /* 第二部分 7:3 */
  281. .row73{display:grid;grid-template-columns:minmax(0,7fr) minmax(0,3fr);gap:12px}
  282. #curve{display:flex;flex-direction:column;min-height:0}
  283. #curve .cv-plot{position:relative;flex:1 1 0;min-height:150px}
  284. #curve .cv-plot svg{position:absolute;left:0;top:0;width:100%;height:100%}
  285. #curve .cv-note{margin-top:4px}
  286. .tl-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
  287. .tl-head h3{margin:0;font-size:17px;font-weight:800;color:var(--amber)}
  288. .tl-head select{width:auto;padding:6px 10px;font-weight:600;font-size:13px}
  289. .tl-legend{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12px;color:var(--text)}
  290. .tl-legend span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap}
  291. .tl-legend hr{width:1px;height:14px;border:0;background:var(--line-hi);margin:0}
  292. .lg-sq{width:11px;height:13px;border-radius:3px;display:inline-block}
  293. .lg-ln{width:14px;height:5px;border-radius:3px;display:inline-block}
  294. .tl-body{display:grid;grid-template-columns:110px minmax(0,1fr);border-top:1px solid var(--line)}
  295. .tl.collapsed .tl-body{display:none}
  296. .tl-labels{display:grid;grid-template-rows:62px 56px 52px 36px;border-right:1px solid var(--line)}
  297. .tl-labels div{padding:8px 8px 0 0;font-size:13.5px;font-weight:700}
  298. .tl-labels small{display:block;font-size:10.5px;font-weight:500;color:var(--faint);margin-top:2px}
  299. .tl-scroll{overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent}
  300. .tl-canvas{position:relative;height:206px}
  301. .tl-canvas>*{position:absolute}
  302. .tl-sep{top:0;height:170px;width:1px;background:var(--line)}
  303. .tl-cur{top:0;height:170px;background:rgba(255,212,137,.045)}
  304. .tk{width:11px;height:14px;border-radius:3px;border:2px solid transparent;cursor:pointer}
  305. .tk.fly{background:var(--amber)}.tk.man{background:var(--w-blue)}
  306. .tk.pending{background:transparent;border-color:var(--amber)}
  307. .tk.man.pending{border-color:var(--w-blue)}
  308. .tk.future{background:transparent;border-color:var(--muted)}
  309. .tk.expired{background:transparent;border-color:var(--w-red)}
  310. .tk.extra{box-shadow:0 0 0 2px var(--bg),0 0 0 3.5px var(--w-orange);width:17px;height:18px;display:grid;place-items:center;color:#2a1a02;padding:0;box-sizing:border-box}
  311. .tk.extra svg{width:13px;height:13px;display:block}
  312. .tk.extra.pending,.tk.extra.future{color:var(--amber)}
  313. .tk.extra.future{color:var(--muted)}
  314. .tk.extra.expired{color:var(--w-red)}
  315. .tk.extra.grp{display:flex;align-items:center;justify-content:center;gap:2px;border-radius:9px;padding:0 4px}
  316. .tk.extra.grp b{font-size:11px;font-weight:800;line-height:1;font-family:var(--f-num)}
  317. .tl-legend .lg-tk{position:static;display:inline-grid;margin:0 3px}
  318. .tl-inds{top:68px;display:flex;flex-wrap:wrap;gap:5px;align-content:flex-start;height:50px;overflow:hidden}
  319. .ichip{border:1px solid var(--line-hi);background:var(--panel-2);border-radius:5px;padding:2px 7px;font-size:12px;white-space:nowrap;color:var(--text)}
  320. .ichip.man{border-style:dashed;color:var(--muted)}
  321. .ichip:hover{border-color:var(--amber)}
  322. .ichip.on{border-color:var(--amber);background:rgba(255,212,137,.16);color:var(--amber);font-weight:700}
  323. .phbar{top:124px;height:26px;border-radius:5px;background:#2a2d1a;border:1px solid #4a452a;box-shadow:0 0 0 2px var(--panel);color:var(--text);font-size:12.5px;font-weight:700;display:flex;align-items:center;gap:8px;padding:0 8px;white-space:nowrap;overflow:hidden}
  324. .phbar.key{background:#8f6a12;border-color:#b98a1a}
  325. .phbar.now{box-shadow:inset 0 0 0 1.5px var(--amber)}
  326. .phbar .phl{display:inline-flex;align-items:center;gap:8px;will-change:transform;overflow:hidden;white-space:nowrap;flex:none}
  327. .phbar .phl>.kb{flex:none}
  328. .phbar .kb{background:var(--amber);color:var(--amber-ink);border-radius:999px;padding:0 7px;font-size:11px}
  329. .sline{top:154px;height:5px;border-radius:3px}
  330. .tl-today{top:0;height:172px;border-left:1.5px dashed var(--amber)}
  331. .tl-today{z-index:2}
  332. .tl-today span{position:absolute;top:1px;left:3px;background:var(--amber);color:var(--amber-ink);font-size:10px;font-weight:800;border-radius:3px;padding:0 4px;white-space:nowrap}
  333. .tl-axis{top:172px;height:1px;background:var(--muted)}
  334. .tick{top:172px;width:1px;height:4px;background:var(--faint)}
  335. .tick.m{height:8px;width:2px;background:var(--text)}
  336. .tlab{top:182px;font-size:11px;color:var(--faint);transform:translateX(-50%);font-family:var(--f-num)}
  337. .tlab.m{color:var(--text);font-weight:800;font-family:var(--f-ui);font-size:12.5px}
  338. .cv-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
  339. .cv-h .tag{background:var(--amber);color:var(--amber-ink);font-weight:800;border-radius:6px;padding:4px 10px;font-size:13px;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  340. .gsel{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--muted);white-space:nowrap}
  341. .gsel select{width:auto;padding:5px 8px;font-weight:700;color:var(--amber);border-color:var(--line-hi)}
  342. .gsel select:disabled{opacity:.7;cursor:not-allowed;color:var(--text)}
  343. .gsel em{font-style:normal;color:var(--faint);font-size:11px}
  344. .cv-h .gsel{margin-left:auto}
  345. .cv-sub{display:flex;gap:10px;font-size:11.5px;color:var(--muted);flex-wrap:wrap;margin-bottom:4px}
  346. .cv-sub i{display:inline-block;width:18px;height:0;border-top:2px solid;vertical-align:middle;margin-right:4px}
  347. .cv-svg{width:100%;height:auto;display:block}
  348. .cv-svg .hit{cursor:pointer}
  349. .cv-note{font-size:11px;color:var(--faint);margin-top:2px}
  350. .cv-empty{color:var(--faint);font-size:12.5px;text-align:center;padding:50px 10px;line-height:1.8}
  351. /* 第三、四部分 */
  352. .cmp-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
  353. .cmp-col{border:1px solid var(--line);border-radius:10px;padding:10px;background:var(--panel)}
  354. .cmp-col h4{margin:0 0 8px;display:flex;align-items:center;gap:8px;font-size:13.5px}
  355. .cmp-col h4 .role{border-radius:5px;padding:2px 9px;font-size:12px;font-weight:800}
  356. .cmp-col h4 .role.exp{background:var(--amber);color:var(--amber-ink)}
  357. .cmp-col h4 .role.ctl{background:transparent;color:var(--c-cash);border:1px dashed var(--c-cash)}
  358. .cmp-col h4 .avg{margin-left:auto;font-weight:500;color:var(--muted);font-size:12px}
  359. .cmp-col h4 .avg b{font-family:var(--f-num);color:var(--text);font-size:15px}
  360. .pgrid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
  361. .pgrid.wide{grid-template-columns:repeat(auto-fill,minmax(170px,1fr))}
  362. .ph{border:1px solid var(--line);border-radius:8px;overflow:hidden;background:var(--panel-2);padding:0;text-align:left;display:block;width:100%}
  363. .ph:hover{border-color:var(--amber)}
  364. .ph img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}
  365. .ph .cap{display:flex;justify-content:space-between;gap:6px;padding:4px 7px;font-size:11px;color:var(--muted)}
  366. .ph .cap b{font-family:var(--f-num);color:var(--text);font-weight:600;font-size:12px}
  367. .lt-filters{display:flex;gap:6px;flex-wrap:wrap;align-items:center;margin-bottom:10px}
  368. .lt-filters select{width:auto;padding:6px 9px}
  369. .dev{display:flex;align-items:center;gap:6px;border:1px solid var(--line-hi);border-radius:7px;background:var(--panel-2);padding:0 4px 0 9px;font-size:12px}
  370. .dev select{border:0;background:transparent;padding:6px 4px;font-weight:700;color:var(--amber)}
  371. .lt-more{margin-left:auto}
  372. .ph-placeholder{display:grid;gap:10px;padding:26px;border:1px dashed var(--line-hi);border-radius:12px;color:var(--muted);line-height:1.8}
  373. .ph-placeholder h3{margin:0;color:var(--amber)}
  374. .d-toast{position:fixed;left:50%;bottom:28px;transform:translateX(-50%);z-index:50;padding:8px 14px;font-size:12.5px}
  375. @media (max-width:1100px){ .row73{grid-template-columns:1fr} }
  376. @media (max-width:860px){
  377. .mapwrap{height:auto!important}
  378. .mapcanvas{position:relative;height:320px}
  379. .bcard,.pcard{position:static;width:auto;max-height:none;margin:10px;border-radius:10px}
  380. .mapwrap.narrow .bcard,.mapwrap.narrow .pcard{display:block}
  381. .resizer,.mapsize{display:none}
  382. .maplegend{display:none}
  383. .bcard,.pcard{backdrop-filter:none;background:var(--panel)}
  384. .cmp-grid{grid-template-columns:1fr}
  385. .pgrid{grid-template-columns:repeat(2,minmax(0,1fr))}
  386. .tabbar button,.tabbar-r{padding:8px 16px;font-size:14px}
  387. .d-right{margin-left:0;width:100%}
  388. .d-right select{flex:1;max-width:none}
  389. }
  390. /* 紧凑版浮窗 */
  391. .bc-h{align-items:center}
  392. .bc-h h4{font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
  393. .bc-h .id{font-size:11px}
  394. .bc-grid{display:grid;grid-template-columns:1fr 1fr;gap:4px 8px;border-top:1px dashed var(--line);padding-top:7px}
  395. .bc-grid div{min-width:0}
  396. .bc-grid span,.bc-ind span,.bc-plan .t{display:block;font-size:10px;color:var(--faint);line-height:1.3}
  397. .bc-grid b{display:block;font-size:12px;font-weight:600;white-space:normal;overflow:visible;text-overflow:clip;line-height:1.3}
  398. .bc-grid em,.bc-line em{font-style:normal;color:var(--muted);font-weight:400;font-size:11px}
  399. .bc-grid div:nth-child(4) em{display:block;margin:2px 0 0 11px}
  400. @media(max-width:860px){.bcard{width:auto;max-width:none}}
  401. .wd{display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--wc);margin-right:4px;vertical-align:1px;box-shadow:0 0 6px var(--wc)}
  402. .bc-line{display:flex;gap:6px;align-items:baseline;font-size:12px;border-top:1px dashed var(--line);padding-top:7px;white-space:nowrap;min-width:0}
  403. .bc-line span{font-size:10px;color:var(--faint)}
  404. .bc-line b{font-family:var(--f-num);font-size:13px}
  405. .bc-line em{overflow:hidden;text-overflow:ellipsis}
  406. .bc-ind{display:grid;grid-template-columns:1fr 1fr;gap:5px}
  407. .bc-ind div{background:var(--panel-2);border:1px solid var(--line);border-radius:6px;padding:3px 7px;min-width:0}
  408. .bc-ind span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  409. .bc-ind b{font-family:var(--f-num);font-size:15px;font-weight:700}
  410. .bc-ind small{font-size:10px;color:var(--muted);margin-left:1px}
  411. .bc-prog{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  412. .bc-prog span{display:flex;justify-content:space-between;font-size:10px;color:var(--faint);margin-bottom:3px}
  413. .bc-prog span b{font-family:var(--f-num);font-size:12px;color:var(--text)}
  414. .bc-prog .bar{width:100%;height:5px}
  415. .bc-plan{display:grid;gap:3px;border-top:1px dashed var(--line);padding-top:6px}
  416. .bc-plan>div{display:grid;grid-template-columns:auto auto minmax(0,1fr) auto;gap:5px;align-items:baseline;font-size:11px;white-space:nowrap}
  417. .bc-plan>div b{font-family:var(--f-num);color:var(--amber);font-size:12.5px}
  418. .bc-plan>div em{font-style:normal;color:var(--muted)}
  419. .bc-plan>div span{overflow:hidden;text-overflow:ellipsis}
  420. .bc-plan>div i{font-style:normal;color:var(--faint);font-size:10.5px}
  421. .pc-h{margin-bottom:6px;gap:6px}
  422. .pc-h .lb{font-size:10px}
  423. .pc-h .code{font-size:15px}
  424. .pc-h .grp{font-size:10.5px}
  425. .pc-photo img{aspect-ratio:16/10}
  426. .pc-photo .nav{width:22px;height:34px;font-size:15px}
  427. .pc-photo .stamp{font-size:10px;left:6px;bottom:6px;padding:1px 6px}
  428. .pc-seq{margin:5px 0;gap:3px}
  429. .pc-seq button{font-size:10px;padding:1px 5px}
  430. .ibox{padding:5px 8px}
  431. .ibox .t{font-size:10px;margin-bottom:2px}
  432. .ibox table{font-size:11px}
  433. .ibox td{padding:2px 0}
  434. .ibox td:last-child{font-size:12.5px}
  435. .grpchip{font-size:10.5px;border-radius:4px;padding:0 5px;font-weight:700;margin-left:4px}
  436. .cv-h{flex-wrap:nowrap}
  437. .cv-h .tag{min-width:0;flex:0 1 auto}
  438. .cv-g{margin-left:auto;flex:none;width:auto;padding:5px 8px;font-weight:700;color:var(--amber);border-color:var(--line-hi)}
  439. .cv-g:disabled{opacity:.7;color:var(--text)}
  440. /* 照片详情查看器 */
  441. .viewer{position:fixed;inset:0;z-index:1000;background:rgba(5,6,4,.82);display:grid;place-items:center;padding:16px max(16px,env(safe-area-inset-right,0px)) 16px max(16px,env(safe-area-inset-left,0px))}
  442. .vw{width:min(1500px,100%);max-height:100%;overflow:auto;background:var(--panel);border:1px solid var(--line-hi);border-radius:14px;padding:14px 16px;display:grid;gap:12px;box-shadow:0 24px 70px rgba(0,0,0,.6)}
  443. .vw-top{display:flex;align-items:center;gap:8px}
  444. .vw-modes{display:flex;gap:8px;flex-wrap:wrap}
  445. .vw-modes .chip-btn{font-size:14px;padding:7px 16px}
  446. .vw-close{margin-left:auto;width:38px;height:38px;border-radius:50%;border:1px solid var(--line-hi);background:var(--panel-2);font-size:15px;flex:none}
  447. .vw-close:hover{border-color:var(--amber);color:var(--amber)}
  448. .vw-body{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(0,1fr);gap:20px;align-items:start}
  449. .vw-img{position:relative;border-radius:10px;overflow:hidden;border:1px solid var(--line)}
  450. .vw-img img{display:block;width:100%;aspect-ratio:3/2;object-fit:cover}
  451. .vw-nav{position:absolute;top:50%;transform:translateY(-50%);width:44px;height:68px;border-radius:8px;border:1px solid var(--amber-dim);background:rgba(10,12,8,.72);color:var(--amber);font-size:26px}
  452. .vw-nav:hover:not(:disabled){background:var(--amber);color:var(--amber-ink)}
  453. .vw-nav:disabled{opacity:.25;cursor:not-allowed}
  454. .vw-nav.prev{left:12px}.vw-nav.next{right:12px}
  455. .vw-count{position:absolute;right:12px;bottom:12px;background:rgba(10,12,8,.78);border-radius:6px;padding:3px 10px;font-size:14px}
  456. .vw-scale{position:absolute;left:12px;bottom:12px;display:flex;align-items:center;gap:6px;background:rgba(10,12,8,.78);border-radius:6px;padding:4px 8px;font-size:11px;color:var(--muted)}
  457. .vw-scale i{order:1;width:110px;height:8px;border-radius:4px;background:linear-gradient(90deg,#140c28,#301e6e,#1e788c,#3cbe5a,#f0e646)}
  458. .vw-scale em{font-style:normal}.vw-scale em:last-child{order:2}
  459. .vw-info{min-width:0}
  460. .vw-info h3{margin:2px 0 12px;font-size:20px;font-weight:700;word-break:break-all}
  461. .vw-kv{display:grid;grid-template-columns:92px minmax(0,1fr);gap:8px 10px;margin:0 0 14px;font-size:13.5px}
  462. .vw-kv dt{color:var(--muted)}
  463. .vw-kv dd{margin:0;font-weight:600}
  464. .vw-kv dd em{font-style:normal;color:var(--faint);font-weight:400;font-size:12px}
  465. .vw-kv dd.num{font-size:15px}
  466. .vw-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid #3fb8a0;color:#7fe0c8;border-radius:999px;padding:1px 10px;font-size:12px;background:rgba(63,184,160,.12)}
  467. .vw-chip i{width:8px;height:8px;border-radius:2px;background:#3fb8a0}
  468. .vw-rt{font-size:15px;color:var(--muted);margin-bottom:6px}
  469. .vw-rt b{color:var(--amber)}
  470. .vw-tb{width:100%;border-collapse:collapse;font-size:13px}
  471. .vw-tb th{text-align:left;font-weight:500;color:var(--muted);padding:7px 10px;border-bottom:1px solid var(--line-hi);font-size:12px}
  472. .vw-tb td{padding:8px 10px;border-bottom:1px solid var(--line)}
  473. .vw-tb td:first-child{font-weight:700;white-space:nowrap}
  474. .vw-tb td:nth-child(2){color:var(--muted)}
  475. .vw-tb td:last-child,.vw-tb th:last-child{text-align:right;white-space:nowrap}
  476. .vw-tb td.num{font-size:15px}
  477. .vw-tb tr.hl td{background:rgba(255,212,137,.1);color:var(--amber)}
  478. .vw-tb tr.hl td:nth-child(2){color:var(--amber-dim)}
  479. .vw-acts{display:flex;justify-content:flex-end;margin-top:12px}
  480. @media (max-width:900px){.vw-body{grid-template-columns:1fr}.vw-modes .chip-btn{font-size:12.5px;padding:5px 10px}.vw-info h3{font-size:16px}}
  481. /* ===== 地图左右列(共用) ===== */
  482. .mleft,.mright{position:absolute;top:10px;bottom:22px;z-index:3;display:flex;flex-direction:column;gap:8px;pointer-events:none}
  483. .mleft{left:10px;width:248px}
  484. .mright{right:10px;width:264px;align-items:stretch}
  485. .mleft>*,.mright>*{pointer-events:auto}
  486. .mleft .bcard,.mright .pcard{position:static;width:auto;max-height:none;min-height:0;flex:0 1 auto;overflow:auto}
  487. .mapwrap.narrow .mleft,.mapwrap.narrow .mright{display:none}
  488. .newzone{align-self:flex-end;flex:none;padding:7px 14px;font-size:13px;box-shadow:0 4px 14px rgba(0,0,0,.4)}
  489. .zlist{flex:0 0 auto;max-height:46%;overflow:auto;padding:8px 9px;scrollbar-width:thin}
  490. .zl-h{display:flex;align-items:baseline;justify-content:space-between;margin-bottom:6px}
  491. .zl-h b{font-size:13px;color:var(--amber)}
  492. .zl-h em{font-style:normal;font-size:11px;color:var(--faint)}
  493. .zl-list{display:grid;gap:5px}
  494. .zl-item{display:grid;gap:2px;text-align:left;border:1px solid var(--line);background:var(--panel-2);border-radius:7px;padding:5px 8px}
  495. .zl-item:hover{border-color:var(--line-hi)}
  496. .zl-item.on{border-color:var(--amber);background:rgba(255,212,137,.12);box-shadow:inset 3px 0 0 var(--amber)}
  497. .zl-n{font-size:12.5px;font-weight:800;display:flex;align-items:center;gap:6px}
  498. .zl-item.on .zl-n{color:var(--amber)}
  499. .zl-new{font-style:normal;font-size:10px;background:var(--w-ok);color:#06210f;border-radius:3px;padding:0 4px;font-weight:800}
  500. .zl-m{font-size:10.5px;color:var(--muted)}
  501. .zl-f{display:flex;gap:4px;flex-wrap:wrap;align-items:center;font-size:10px}
  502. .zl-f i{font-style:normal;border:1px solid var(--line-hi);border-radius:3px;padding:0 4px;color:var(--text)}
  503. .zl-f em{font-style:normal;color:var(--faint);margin-left:auto;font-family:var(--f-num);font-size:11px}
  504. /* 新建试验区弹窗 */
  505. .nz{width:min(620px,100%)}
  506. .nz-t{margin:0;font-size:18px;color:var(--amber)}
  507. .nz-body{display:grid;gap:14px}
  508. .nz-f{display:grid;gap:6px}
  509. .nz-f>span{font-size:12.5px;color:var(--muted);font-weight:700}
  510. .nz-f input[type=text],.nz-f input[type=date]{background:var(--panel-2);border:1px solid var(--line-hi);border-radius:8px;padding:8px 10px;font-size:14px;color:var(--text)}
  511. .nz-f input:focus{border-color:var(--amber);outline:none}
  512. .nz-chips{display:flex;gap:6px;flex-wrap:wrap}
  513. .nz-dates{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
  514. .nz-dates em{font-style:normal;color:var(--faint)}
  515. .nz-hint{font-size:11.5px;color:var(--faint)}
  516. .nz-plots{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:6px}
  517. .nz-plot{display:flex;align-items:center;justify-content:space-between;gap:8px;border:1px solid var(--line);border-radius:8px;padding:6px 8px;background:var(--panel-2)}
  518. .nz-plot b{font-size:12.5px;font-weight:600}
  519. .seg3{display:flex;border:1px solid var(--line-hi);border-radius:6px;overflow:hidden;flex:none}
  520. .seg3 button{border:0;background:none;font-size:11.5px;padding:3px 7px;color:var(--muted)}
  521. .seg3 button+button{border-left:1px solid var(--line-hi)}
  522. .seg3 button.on{background:var(--line-hi);color:var(--text);font-weight:700}
  523. .seg3 button.on.exp{background:var(--amber);color:var(--amber-ink)}
  524. .seg3 button.on.ctl{background:var(--c-cash);color:#04131d}
  525. .nz-err{color:var(--w-red);font-size:12.5px;border:1px solid rgba(255,77,79,.4);background:rgba(255,77,79,.08);border-radius:7px;padding:7px 10px}
  526. .nz-acts{display:flex;justify-content:flex-end;gap:8px}
  527. /* 逐日气象 */
  528. .wx-note{font-size:12px;color:var(--muted);margin:-4px 0 6px}
  529. .wx-note b{color:var(--text)}
  530. .wx-note .pin{display:inline-block;background:var(--amber);color:var(--amber-ink);font-weight:800;font-size:10.5px;border-radius:8px 8px 8px 2px;padding:0 5px}
  531. .wx-box{position:relative}
  532. .wx-wrap{overflow-x:auto;scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent}
  533. #wx{height:290px;min-width:760px}
  534. .wx-axis{position:absolute;left:0;top:0;bottom:0;pointer-events:none;background:linear-gradient(90deg,var(--panel) 82%,transparent);z-index:2}
  535. .wx-axis span,.wx-axis b{position:absolute;white-space:nowrap}
  536. .wx-axis .tk{right:10px;font-size:12px;color:var(--faint);font-family:var(--f-num)}
  537. .wx-axis .u{right:10px;font-size:12px;color:var(--muted)}
  538. .wx-axis b{left:4px;font-size:12px;color:var(--text)}
  539. /* 关键物候节点 Hover:只呈现地块、进入日期与组间时间差,不改气象事件提示。 */
  540. .wx-key-pop{position:fixed;z-index:1000;pointer-events:none;box-sizing:border-box;width:270px;max-width:calc(100vw - 20px);padding:12px 14px;background:rgba(16,19,12,.98);border:1px solid var(--line-hi);border-radius:9px;box-shadow:0 8px 24px rgba(0,0,0,.55);font-size:12px;color:var(--text)}
  541. .wx-key-pop .kh{display:flex;align-items:center;justify-content:space-between;gap:8px;font-weight:800;font-size:13px;margin-bottom:9px}
  542. .wx-key-pop .kr{display:flex;justify-content:space-between;align-items:baseline;gap:12px;margin:6px 0}
  543. .wx-key-pop .kr span{color:var(--muted);white-space:nowrap}
  544. .wx-key-pop .kr b{text-align:right;font-weight:600}
  545. .wx-key-pop .kfoot{border-top:1px dashed var(--line);padding-top:8px;margin-top:10px;font-size:11px;font-weight:700}
  546. /* 分析面板 */
  547. .sel-amber{width:auto;max-width:100%;border-color:var(--amber);color:var(--amber);font-weight:700;background:rgba(255,212,137,.08);padding:6px 10px}
  548. .ana-split{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(0,1fr);gap:14px}
  549. .ana-l,.ana-r{min-width:0;border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:10px 12px}
  550. .ana-r{display:grid;gap:10px;align-content:start}
  551. .rp-kpi{display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:6px}
  552. .rp-kpi div{background:var(--panel-2);border:1px solid var(--line);border-radius:8px;padding:6px 9px;min-width:0}
  553. .rp-kpi span{display:block;font-size:11px;color:var(--faint)}
  554. .rp-kpi b{font-family:var(--f-num);font-size:20px;font-weight:700}
  555. .rp-kpi b.ok{color:var(--w-ok)}
  556. .rp-kpi b small{font-family:var(--f-ui);font-size:11px;color:var(--muted);margin-left:2px;font-weight:500}
  557. .rp-kpi em{display:block;font-style:normal;font-size:10.5px;color:var(--muted)}
  558. .rp h4{margin:0 0 6px;font-size:14px;display:flex;align-items:center;gap:6px}
  559. .rp h4 i{width:8px;height:8px;border-radius:2px}
  560. .rp-sec{border-top:1px dashed var(--line);padding:7px 0 2px}
  561. .rp-sec>b{font-size:12px;color:var(--amber)}
  562. .rp-sec p,.rp-sec li{margin:3px 0 0;font-size:12.5px;line-height:1.75;color:var(--text)}
  563. .rp-sec p b{color:var(--amber);font-family:var(--f-num);font-size:13.5px}
  564. .rp-sec ul{margin:2px 0 0;padding-left:18px}
  565. .ybars{display:grid;grid-template-columns:1fr 1fr;gap:10px 16px;margin-top:6px}
  566. .yb{border:1px solid var(--line);border-radius:8px;padding:8px 10px;background:var(--panel-2)}
  567. .yb-h{display:flex;align-items:baseline;gap:6px;margin-bottom:6px}
  568. .yb-h b{font-size:13px}
  569. .yb-h em{font-style:normal;font-size:11px;color:var(--faint)}
  570. .yb-h span{margin-left:auto;font-family:var(--f-num);font-weight:700;font-size:14px}
  571. .yb-h .up{color:var(--w-ok)}.yb-h .dn{color:var(--w-orange)}
  572. .yb-rings{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:6px;align-items:center;justify-items:center;padding:2px 0 0}
  573. .yb-rings .yv.d{text-align:center}.yb-rings .yv.d span{justify-content:center}
  574. .yr{display:flex;flex-direction:column;align-items:center;gap:3px}
  575. .yr svg{width:82px;height:82px;display:block}
  576. .yr .tk{fill:none;stroke:var(--line-hi);stroke-width:6}
  577. .yr .pg{fill:none;stroke-width:6;stroke-linecap:round}
  578. .yr.e .pg{stroke:var(--amber)}.yr.c .pg{stroke:var(--c-cash)}
  579. .yr text{text-anchor:middle;font-family:var(--f-num)}
  580. .yr text.num{font-size:14px;font-weight:800;fill:var(--text)}
  581. .yr.e text.num{fill:var(--amber)}
  582. .yr text.pc{font-size:8.5px;fill:var(--faint)}
  583. .yr span{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muted)}
  584. .yr span i{width:8px;height:8px;border-radius:50%;display:inline-block}
  585. .yr.e span i{background:var(--amber)}.yr.c span i{background:var(--c-cash)}
  586. .yb-rings .yv.d em{display:block;font-style:normal;font-size:10.5px;color:var(--faint);margin-top:6px}
  587. .yb-rings .yv.d b{font-size:18px}
  588. .yb-vals{display:grid;grid-template-columns:1fr 1fr auto;gap:8px;align-items:end}
  589. .yv span{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--muted)}
  590. .yv span i{width:8px;height:8px;border-radius:50%;display:inline-block}
  591. .yv.e span i{background:var(--amber)}
  592. .yv.c span i{border:1.5px solid var(--c-cash);box-sizing:border-box}
  593. .yv b{display:block;font-family:var(--f-num);font-size:19px;font-weight:800;line-height:1.25;color:var(--text)}
  594. .yv.e b{color:var(--amber)}
  595. .yv.d{text-align:right}.yv.d span{justify-content:flex-end}
  596. .yv.d b{font-size:14px;line-height:1.7}.yv.d b.up{color:var(--w-ok)}.yv.d b.dn{color:var(--w-orange)}
  597. .yb-db{position:relative;height:14px;margin:7px 4px 2px}
  598. .yb-db s{position:absolute;left:0;right:0;top:6px;height:2px;border-radius:2px;background:var(--line-hi)}
  599. .yb-db u{position:absolute;top:5px;height:4px;border-radius:2px;opacity:.85}
  600. .yb-db u.up{background:var(--w-ok)}.yb-db u.dn{background:var(--w-orange)}
  601. .yb-db em{position:absolute;top:-1px;transform:translateX(-50%);font-style:normal;font-size:9.5px;color:var(--faint);display:none}
  602. .yb-db::after{content:"";position:absolute;left:50%;top:1px;width:1px;height:12px;background:var(--line-hi)}
  603. .yb-db i{position:absolute;z-index:1;top:2px;width:10px;height:10px;margin-left:-5px;border-radius:50%;box-sizing:border-box}
  604. .yb-db i.e{background:var(--amber);box-shadow:0 0 0 2px var(--panel-2)}
  605. .yb-db i.c{background:var(--panel-2);border:2px solid var(--c-cash)}
  606. .yb-row{display:grid;grid-template-columns:42px 1fr 58px;align-items:center;gap:6px;font-size:11px;color:var(--muted);margin-top:4px}
  607. .yb-row i{display:block;height:9px;border-radius:5px}
  608. .yb-row i.e{background:var(--amber)}
  609. .yb-row i.c{background:repeating-linear-gradient(90deg,var(--c-cash) 0 6px,transparent 6px 9px);border:1px solid var(--c-cash);height:7px}
  610. .yb-row b{font-family:var(--f-num);text-align:right;color:var(--text);font-size:14px}
  611. .yst{margin-left:auto;font-size:11.5px;border:1px solid var(--w-ok);color:var(--w-ok);border-radius:999px;padding:1px 9px}
  612. .yst.fut{border-color:var(--muted);color:var(--muted)}
  613. @media (max-width:1100px){.ana-split{grid-template-columns:1fr}}
  614. @media (max-width:860px){
  615. .mleft,.mright{position:static;width:auto;padding:10px 10px 0}
  616. .mapwrap.narrow .mleft,.mapwrap.narrow .mright{display:flex}
  617. .zlist{max-height:none}
  618. .ybars{grid-template-columns:1fr}
  619. .newzone{align-self:stretch}
  620. }
  621. /* 新建试验区:地图勾选 */
  622. .nz{width:min(1040px,100%)}
  623. .nz-cols{display:grid;grid-template-columns:minmax(0,320px) minmax(0,1fr);gap:18px;align-items:start}
  624. .nz-colL{display:grid;gap:14px}
  625. .nz-f>span em{font-style:normal;font-weight:400;color:var(--faint);font-size:11.5px;margin-left:6px}
  626. .nz-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px;font-size:12px;color:var(--muted)}
  627. .nz-tools .seg3 button{padding:4px 10px;font-size:12px}
  628. .nz-tools .seg3 button.on:not(.exp):not(.ctl){background:var(--w-red);color:#fff}
  629. .nz-link{border:0;background:none;color:var(--amber);font-size:12px;text-decoration:underline;text-underline-offset:3px;padding:2px 4px}
  630. .nz-map{position:relative;border:1px solid var(--line-hi);border-radius:10px;overflow:hidden;background:#2a3220}
  631. .nz-map svg{display:block;width:100%;height:340px;cursor:crosshair;touch-action:none;user-select:none}
  632. .nz-map .nzp{cursor:pointer}
  633. .nz-map .nzp:hover rect{stroke:#fff}
  634. .nz-maphint{position:absolute;left:8px;bottom:8px;background:rgba(10,12,8,.78);border-radius:5px;padding:2px 8px;font-size:11px;color:var(--muted);pointer-events:none}
  635. .nz-sum{display:flex;gap:14px;flex-wrap:wrap;margin-top:8px;font-size:12.5px;font-weight:700}
  636. .nz-sum .e{color:var(--amber)}.nz-sum .c{color:var(--c-cash)}
  637. @media (max-width:860px){.nz-cols{grid-template-columns:1fr}.nz-map svg{height:240px}}
  638. /* 新建试验区:四步流程 */
  639. .nz{width:min(1060px,100%)}
  640. .nz .vw-top{gap:14px;flex-wrap:wrap}
  641. .nz-steps{display:flex;gap:4px;list-style:none;margin:0 auto;padding:0;flex-wrap:wrap}
  642. .nz-steps li{display:flex;align-items:center;gap:6px;font-size:12.5px;color:var(--faint);padding:4px 10px 4px 4px;border-radius:999px}
  643. .nz-steps li i{font-style:normal;width:22px;height:22px;border-radius:50%;display:grid;place-items:center;border:1px solid var(--line-hi);font-family:var(--f-num);font-weight:700;font-size:12px}
  644. .nz-steps li+li::before{content:"";width:18px;height:1px;background:var(--line-hi);margin-right:6px}
  645. .nz-steps li.on{color:var(--amber);font-weight:800}
  646. .nz-steps li.on i{background:var(--amber);border-color:var(--amber);color:var(--amber-ink)}
  647. .nz-steps li.done{color:var(--muted)}
  648. .nz-steps li.done i{background:var(--panel-2);color:var(--w-ok);border-color:var(--w-ok)}
  649. .nz-s1{display:grid;gap:14px;max-width:520px}
  650. .nz-tip{font-size:12.5px;color:var(--muted);border:1px dashed var(--line-hi);border-radius:8px;padding:8px 12px}
  651. .nz-tip .e{color:var(--amber)}.nz-tip .c{color:var(--c-cash)}
  652. .seg3.big button{padding:6px 14px;font-size:13px}
  653. .btn.sm{padding:5px 11px;font-size:12.5px}
  654. .btn.sm:disabled{opacity:.35;cursor:not-allowed}
  655. .btn-amber.sm{padding:5px 12px}
  656. .nz-map{border-width:2px}
  657. .nz-map.exp{border-color:rgba(255,212,137,.6)}
  658. .nz-map.ctl{border-color:rgba(90,183,236,.6)}
  659. .nz-map svg{height:380px}
  660. .nz-map .nzp.pick{cursor:pointer}
  661. .nz-map .nzp.pick:hover polygon{stroke:#fff;stroke-width:4}
  662. .nz-map .nzpt{cursor:pointer}
  663. .nz-map .nzpt:hover circle{fill:var(--w-red)}
  664. .nz-maphint{font-size:12px;color:var(--text);background:rgba(10,12,8,.85);padding:4px 10px}
  665. .nz-sum span{padding:2px 8px;border-radius:5px}
  666. .nz-sum span.cur{background:var(--panel-2);box-shadow:inset 0 0 0 1px currentColor}
  667. .nz-sum .warn{color:var(--w-red);background:rgba(255,77,79,.1)}
  668. .nz-sum .hint{color:var(--w-yellow);font-weight:500}
  669. .nz-sum .ok{color:var(--w-ok);font-weight:500}
  670. .nz-pctl{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:8px}
  671. .nz-pc{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border:1px solid var(--line);border-radius:8px;padding:7px 10px;background:var(--panel-2);font-size:12.5px}
  672. .nz-pc.exp{box-shadow:inset 3px 0 0 var(--amber)}.nz-pc.ctl{box-shadow:inset 3px 0 0 var(--c-cash)}
  673. .nz-pc>b{font-size:13px}.nz-pc.exp>b{color:var(--amber)}.nz-pc.ctl>b{color:var(--c-cash)}
  674. .nz-pc .m{color:var(--muted)}
  675. .num-ctl{display:flex;align-items:center;gap:6px}
  676. .num-ctl b{font-size:17px;min-width:22px;text-align:center}
  677. .num-ctl em{font-style:normal;color:var(--muted)}
  678. @media (max-width:860px){.nz-pctl{grid-template-columns:1fr}.nz-map svg{height:280px}.nz-steps{margin:0}}
  679. /* 新建试验区 v3:左右布局 */
  680. .nz{width:min(1180px,100%)}
  681. .nz-grid2{display:grid;grid-template-columns:minmax(0,300px) minmax(0,1fr);gap:18px;align-items:start}
  682. .nz-left{display:grid;gap:14px}
  683. .nz-flow{margin:0;padding:10px 12px 10px 30px;border:1px dashed var(--line-hi);border-radius:8px;font-size:12px;color:var(--faint);display:grid;gap:6px}
  684. .nz-flow li.on{color:var(--amber);font-weight:700}
  685. .nz-flow li.done{color:var(--w-ok)}
  686. .nz-right{border:1px solid var(--line-hi);border-radius:12px;background:var(--panel-2);padding:10px 12px;min-width:0;display:grid;gap:10px}
  687. .nz-rtabs{display:flex;gap:8px}
  688. .nz-rtab{border:1px solid var(--line-hi);background:var(--panel);border-radius:9px;padding:8px 18px;font-size:14px;font-weight:700;color:var(--muted);display:flex;align-items:center;gap:6px}
  689. .nz-rtab em{font-style:normal;font-family:var(--f-num);font-size:12px;background:var(--line-hi);color:var(--text);border-radius:999px;padding:0 7px}
  690. .nz-rtab.on.exp{background:var(--amber);border-color:var(--amber);color:var(--amber-ink)}
  691. .nz-rtab.on.ctl{background:var(--c-cash);border-color:var(--c-cash);color:#04131d}
  692. .nz-rtab.on em{background:rgba(0,0,0,.2);color:inherit}
  693. .nz-rtab.done:not(.on){color:var(--w-ok);border-color:rgba(76,194,126,.5)}
  694. .nz-rtab:disabled{opacity:.4;cursor:not-allowed}
  695. .nz-list{display:grid;gap:8px}
  696. .nz-lh{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;color:var(--muted)}
  697. .nz-mini{border:1px solid var(--line);border-radius:8px;overflow:hidden}
  698. .nz-mini svg{display:block;width:100%;height:170px}
  699. .nz-mini .nzp.pick{cursor:pointer}
  700. .nz-mini .nzp.pick:hover polygon{stroke:#fff;stroke-width:5}
  701. .nzc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:8px;max-height:252px;overflow:auto;padding:2px;scrollbar-width:thin}
  702. .nzc{position:relative;border:1.5px solid var(--line-hi);border-radius:9px;background:var(--panel);cursor:pointer;display:grid;text-align:left;padding:0;overflow:hidden}
  703. .nzc:hover{border-color:var(--text)}
  704. .nzc.on.exp{border-color:var(--amber);box-shadow:0 0 0 2px rgba(255,212,137,.25)}
  705. .nzc.on.ctl{border-color:var(--c-cash);box-shadow:0 0 0 2px rgba(90,183,236,.25)}
  706. .nzc.lock{opacity:.5;cursor:not-allowed}
  707. .nzc-th{height:62px;background:#232a1b;position:relative}
  708. .nzc-th svg{width:100%;height:100%;display:block}
  709. .nzc-del{position:absolute;top:4px;right:4px;width:20px;height:20px;border-radius:50%;border:0;background:rgba(10,12,8,.8);color:var(--muted);font-size:11px;line-height:1}
  710. .nzc-del:hover{background:var(--w-red);color:#fff}
  711. .nzc-b{display:grid;gap:1px;padding:6px 8px 7px}
  712. .nzc-b b{font-size:12.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  713. .nzc-b>span{font-size:11px;color:var(--muted)}
  714. .nzc-b .st{font-weight:800;color:#e9d24a}
  715. .nzc.on.exp .st{color:var(--amber)}.nzc.on.ctl .st{color:var(--c-cash)}
  716. .nzc.lock .st{color:var(--faint)}
  717. .nzc-b em{font-style:normal;font-size:10.5px;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  718. .pn{display:inline-flex;align-items:center;gap:3px;font-family:var(--f-num);color:var(--text);font-weight:700}
  719. .pn button{width:17px;height:17px;border-radius:4px;border:1px solid var(--line-hi);background:var(--panel-2);font-size:11px;line-height:1;padding:0}
  720. .nzc.add{border-style:dashed;place-content:center;justify-items:center;text-align:center;gap:4px;padding:10px;min-height:120px;color:var(--amber);background:rgba(255,212,137,.05)}
  721. .nzc.add b{font-size:14px}
  722. .nzc.add span{font-size:11px;color:var(--muted)}
  723. .nzc.add:hover{background:rgba(255,212,137,.12);border-color:var(--amber)}
  724. .nz-rfoot{display:flex;align-items:center;gap:10px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:8px}
  725. .nz-rfoot .nz-sum{margin:0;flex:1;min-width:0}
  726. .nz-rfoot .btn.pri:disabled{opacity:.4;cursor:not-allowed}
  727. .nz-confd{color:var(--w-ok);font-weight:800;font-size:13px}
  728. .nz-draw{display:grid;gap:8px}
  729. .nz-dt{font-size:13.5px}.nz-dt.exp{color:var(--amber)}.nz-dt.ctl{color:var(--c-cash)}
  730. .nz-back{margin-left:auto}
  731. .nz-draw .nz-map svg{height:400px}
  732. .nz-note{font-size:12px;color:var(--muted)}
  733. .nz-acts .btn.pri:disabled{opacity:.4;cursor:not-allowed}
  734. @media (max-width:900px){.nz-grid2{grid-template-columns:1fr}.nz-draw .nz-map svg{height:300px}}
  735. .nzc-grid{grid-auto-rows:max-content;align-content:start}
  736. .nzc{min-height:118px;align-content:start}
  737. .nz-mini svg{height:180px}
  738. .sev-lg{display:inline-flex;align-items:center;gap:5px;margin-left:10px;white-space:nowrap;color:var(--text)}
  739. .sev-lg i{width:14px;height:9px;border-radius:5px;display:inline-block;margin-left:4px}
  740. .wx-lg{font-size:12px;color:var(--muted);gap:12px}
  741. .wx-lg span{display:inline-flex;align-items:center;gap:5px}
  742. .wx-lg i{width:16px;height:3px;border-radius:2px;display:inline-block}
  743. .wx-lg i.bar{width:10px;height:10px;border-radius:2px}
  744. .wx-lg .mut{color:var(--faint)}
  745. /* ===== 统一下拉框:黑金风格(覆盖以上所有局部样式) ===== */
  746. .app select,.viewer select{
  747. -webkit-appearance:none;appearance:none;box-sizing:border-box;
  748. height:32px;padding:0 30px 0 11px;width:auto;max-width:100%;min-width:0;
  749. font-family:var(--f-ui);font-size:12.5px;font-weight:600;line-height:30px;color:var(--text);
  750. background-color:#14170e;
  751. background-image:url("data:image/svg+xml,%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='%23f6b81c' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  752. background-repeat:no-repeat;background-position:right 11px center;background-size:10px 6px;
  753. border:1px solid rgba(255,212,137,.28);border-radius:8px;
  754. cursor:pointer;transition:border-color .15s,box-shadow .15s,background-color .15s;
  755. text-overflow:ellipsis;white-space:nowrap;overflow:hidden
  756. }
  757. .app select:hover,.viewer select:hover{border-color:rgba(255,212,137,.6);background-color:#191d11}
  758. .app select:focus,.viewer select:focus{outline:none;border-color:var(--amber);box-shadow:0 0 0 3px rgba(255,212,137,.18)}
  759. .app select:focus-visible,.viewer select:focus-visible{outline:none}
  760. .app select:disabled,.viewer select:disabled{opacity:.45;cursor:not-allowed;border-color:var(--line-hi);background-color:#14170e}
  761. .app select option,.viewer select option{background:#14170e;color:var(--text);font-weight:500}
  762. .app select option:checked,.viewer select option:checked{background:#3a2f0f;color:var(--amber)}
  763. /* 宽度:列表筛选区铺满格子,其余按内容 */
  764. .app .geoidx select,.app .tools select{width:100%}
  765. .app .d-right select{width:auto;max-width:280px}
  766. /* 去掉旧的包裹样式差异 */
  767. .app .dev{border:0;background:none;padding:0;gap:8px;color:var(--muted);font-size:12px}
  768. .app .gsel span{color:var(--muted)}
  769. /* 搜索框、日期、文本输入与下拉框同高同边框 */
  770. .app input[type=search],.viewer input[type=text],.viewer input[type=date]{height:32px;box-sizing:border-box;padding:0 11px;background:#14170e;border:1px solid rgba(255,212,137,.28);border-radius:8px;font-size:12.5px;color:var(--text)}
  771. .app input[type=search]:hover,.viewer input[type=text]:hover,.viewer input[type=date]:hover{border-color:rgba(255,212,137,.6)}
  772. .app input[type=search]:focus,.viewer input[type=text]:focus,.viewer input[type=date]:focus{outline:none;border-color:var(--amber);box-shadow:0 0 0 3px rgba(255,212,137,.18)}
  773. .viewer input[type=text]{height:36px;font-size:14px}
  774. .viewer input[type=date]{height:36px;font-size:13.5px}
  775. .viewer input[type=date]::-webkit-calendar-picker-indicator{filter:invert(.75) sepia(1) saturate(4) hue-rotate(5deg);cursor:pointer}
  776. @media (max-width:860px){.app .d-right select{flex:1;max-width:none}}
  777. /* 自绘下拉菜单 */
  778. .dd-menu{position:fixed;z-index:1100;overflow:auto;padding:4px;background:#14170e;border:1px solid rgba(255,212,137,.35);border-radius:8px;box-shadow:0 12px 32px rgba(0,0,0,.55);scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent;font-family:var(--f-ui)}
  779. .dd-opt{padding:7px 12px;border-radius:5px;font-size:12.5px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:pointer}
  780. .dd-grp{padding:7px 12px 3px;font-size:11px;color:var(--faint);letter-spacing:.06em}
  781. .dd-grp~.dd-opt{padding-left:18px}
  782. .dd-opt.hi{background:rgba(255,255,255,.09)}
  783. .dd-opt.sel{color:var(--amber);font-weight:700}
  784. .dd-opt.dis{opacity:.4;cursor:not-allowed}
  785. .app select.dd-open,.viewer select.dd-open{border-color:var(--amber)}
  786. /* ===== Element Plus 下拉:统一黑金风格(对齐原型) ===== */
  787. .fn-select,
  788. .app .el-select,
  789. .viewer .el-select{
  790. --el-select-input-color:var(--text);
  791. --el-select-multiple-input-color:var(--text);
  792. --el-select-input-focus-border-color:var(--amber);
  793. --el-border-color:rgba(255,212,137,.28);
  794. --el-border-color-hover:rgba(255,212,137,.6);
  795. --el-fill-color-blank:#14170e;
  796. --el-text-color-regular:var(--text);
  797. --el-text-color-placeholder:var(--faint);
  798. }
  799. .fn-select .el-select__wrapper,
  800. .app .el-select .el-select__wrapper,
  801. .viewer .el-select .el-select__wrapper{
  802. min-height:32px!important;
  803. padding:0 11px!important;
  804. background:#14170e!important;
  805. box-shadow:0 0 0 1px rgba(255,212,137,.28) inset!important;
  806. border-radius:8px!important;
  807. transition:box-shadow .15s,background-color .15s!important;
  808. }
  809. .fn-select .el-select__wrapper:hover,
  810. .app .el-select .el-select__wrapper:hover,
  811. .viewer .el-select .el-select__wrapper:hover{
  812. background:#191d11!important;
  813. box-shadow:0 0 0 1px rgba(255,212,137,.6) inset!important;
  814. }
  815. .fn-select .el-select__wrapper.is-focused,
  816. .fn-select .el-select__wrapper.is-hovering:not(.is-focused),
  817. .app .el-select .el-select__wrapper.is-focused,
  818. .viewer .el-select .el-select__wrapper.is-focused{
  819. background:#191d11!important;
  820. box-shadow:0 0 0 1px var(--amber) inset,0 0 0 3px rgba(255,212,137,.18)!important;
  821. }
  822. .fn-select .el-select__selected-item,
  823. .fn-select .el-select__placeholder,
  824. .app .el-select .el-select__selected-item,
  825. .app .el-select .el-select__placeholder,
  826. .viewer .el-select .el-select__selected-item{
  827. color:var(--text)!important;
  828. font-size:12.5px!important;
  829. font-weight:600!important;
  830. }
  831. .fn-select .el-select__caret,
  832. .app .el-select .el-select__caret,
  833. .viewer .el-select .el-select__caret{
  834. color:var(--amber)!important;
  835. font-size:12px!important;
  836. }
  837. .fn-select.is-disabled .el-select__wrapper,
  838. .app .el-select.is-disabled .el-select__wrapper{
  839. opacity:.45!important;
  840. background:#14170e!important;
  841. box-shadow:0 0 0 1px var(--line-hi) inset!important;
  842. }
  843. /* 下拉面板(挂到 body) */
  844. .fn-select-popper.el-popper,
  845. .fn-select-popper{
  846. background:#14170e!important;
  847. border:1px solid rgba(255,212,137,.35)!important;
  848. border-radius:8px!important;
  849. box-shadow:0 12px 32px rgba(0,0,0,.55)!important;
  850. overflow:visible!important;
  851. }
  852. .fn-select-popper .el-popper__arrow::before{
  853. background:#14170e!important;
  854. border:1px solid rgba(255,212,137,.35)!important;
  855. }
  856. .fn-select-popper .el-select-dropdown{
  857. background:transparent!important;
  858. border:0!important;
  859. box-shadow:none!important;
  860. }
  861. .fn-select-popper .el-select-dropdown__list{
  862. padding:4px!important;
  863. margin:0!important;
  864. }
  865. .fn-select-popper .el-select-dropdown__item{
  866. padding:7px 12px!important;
  867. border-radius:5px!important;
  868. font-size:12.5px!important;
  869. color:var(--text)!important;
  870. font-weight:500!important;
  871. height:auto!important;
  872. line-height:1.45!important;
  873. }
  874. .fn-select-popper .el-select-dropdown__item.is-hovering{
  875. background:rgba(255,255,255,.09)!important;
  876. color:var(--text)!important;
  877. }
  878. .fn-select-popper .el-select-dropdown__item.is-selected{
  879. background:rgba(255,212,137,.16)!important;
  880. color:var(--amber)!important;
  881. font-weight:700!important;
  882. }
  883. .fn-select-popper .el-select-dropdown__item.is-selected.is-hovering{
  884. background:rgba(255,212,137,.22)!important;
  885. color:var(--amber)!important;
  886. }
  887. .fn-select-popper .el-select-dropdown__empty{
  888. color:var(--faint)!important;
  889. padding:10px!important;
  890. }
  891. /* 布局辅助:列表筛选项铺满 */
  892. .app .geoidx .fn-select,
  893. .app .tools .fn-select{width:100%}
  894. .app .geoidx .fn-select .el-select__wrapper,
  895. .app .tools .fn-select .el-select__wrapper{width:100%}
  896. .wx-lg .sep{width:1px;height:12px;background:var(--line-hi)}
  897. .wx-lg .lgt{color:var(--text);font-weight:700}
  898. /* 全国总览 · 右侧紧凑基地列表:约 308px,地图自动扩展 */
  899. @media (min-width:861px){
  900. .main{grid-template-columns:minmax(0,1fr) 308px;gap:10px}
  901. .side{padding:12px 9px 9px;border-radius:11px}
  902. .side-h h2{font-size:16px}
  903. .geoidx{grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:6px}
  904. .geoidx label[for="selCity"]{position:absolute;width:1px;height:1px;overflow:hidden}
  905. #selCity{grid-column:1/-1}
  906. .tools{grid-template-columns:minmax(0,1fr) 113px;gap:6px}
  907. .rows{gap:6px;padding-right:2px}
  908. .card{padding:8px 8px 9px 10px;gap:5px}
  909. .c1{gap:5px}
  910. .c1 .nm{font-size:12.5px;line-height:1.4}
  911. .c1 .go{padding:3px 7px;font-size:11px}
  912. .c2{display:flex;flex-wrap:wrap;gap:4px 5px;white-space:normal;line-height:1.25}
  913. .c2 .fl{width:100%;margin-left:0;justify-content:flex-start;padding-left:21px;gap:6px;color:var(--muted)}
  914. .c2 .fl .bar{width:83px}
  915. .c3{gap:4px 5px;line-height:1.45;font-size:11px}
  916. .c3 .st{white-space:normal}
  917. .c4{flex-wrap:wrap;gap:4px 5px;line-height:1.45;font-size:11px}
  918. .kpi{padding:0 4px}
  919. }
  920. @media (min-width:861px) and (max-width:1100px){
  921. .main{grid-template-columns:minmax(0,1fr) 288px;gap:8px}
  922. .side{padding-left:8px;padding-right:8px}
  923. }
  924. /* v5照片档案整合:独立全屏档案,沿用当前基地模型与图像生成器 */
  925. .archive{position:fixed;inset:0;z-index:990;background:#0a0c08;color:var(--text);overflow:auto;padding:22px 28px 48px;box-sizing:border-box}
  926. .archive[hidden]{display:none!important}.archive button,.archive select,.archive input{font:inherit}
  927. .ar-head{display:flex;align-items:flex-start;justify-content:space-between;gap:15px}.ar-head h2{font-size:23px;color:var(--amber);margin:0 0 8px}.ar-head p{color:var(--muted);margin:0;font-size:13px;line-height:1.55}
  928. .ar-close,.ar-btn{border:1px solid var(--line-hi);border-radius:26px;background:#191d12;color:var(--text);padding:8px 16px;cursor:pointer}.ar-close:hover,.ar-btn:hover{border-color:var(--amber)}.ar-btn.on{background:var(--amber);color:#151106;border-color:var(--amber);font-weight:700}
  929. .ar-tools{display:flex;align-items:center;gap:9px;flex-wrap:wrap;position:sticky;top:-22px;background:#0a0c08;z-index:3;padding:18px 0 12px;border-bottom:1px solid var(--line-hi);margin-bottom:14px}
  930. .ar-tools select,.ar-tools input{background:#171b11;border:1px solid var(--line-hi);border-radius:8px;color:var(--text);padding:9px 11px;max-width:100%}.ar-tools label{color:var(--muted);display:flex;align-items:center;gap:5px;font-size:12px}
  931. .ar-layout{display:grid;grid-template-columns:minmax(0,1fr) minmax(300px,375px);align-items:start;gap:18px}
  932. .ar-date{font-size:17px;font-weight:700;margin:20px 0 9px}.ar-date small{font-size:12px;color:var(--muted);font-weight:400;margin-left:10px}
  933. .ar-task{border-left:2px solid #4a4328;padding:0 0 11px 16px;margin-left:4px}.ar-taskhead{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:10px 0;color:var(--muted);font-size:12px}.ar-taskhead b{color:var(--text)}.ar-tag{padding:2px 8px;border:1px solid #5e4c20;border-radius:20px;color:var(--amber)}
  934. .ar-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(135px,1fr));gap:9px}.ar-thumb{min-width:0;padding:0;border:2px solid #353521;border-radius:8px;overflow:hidden;background:#14170f;cursor:pointer;text-align:left}.ar-thumb.sel,.ar-thumb:hover{border-color:var(--amber)}.ar-thumb img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}.ar-thumb span{display:flex;justify-content:space-between;padding:4px 6px;color:var(--muted);font-size:11px}
  935. .ar-expand{margin:9px 0;font-size:12px}.ar-side{position:sticky;top:74px;border:1px solid var(--line-hi);border-radius:12px;padding:16px;background:#16190f;max-height:calc(100vh - 105px);overflow:auto}.ar-modes{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}.ar-modes button{padding:7px 12px;font-size:12px}.ar-view{position:relative}.ar-view img{width:100%;display:block;aspect-ratio:4/3;object-fit:cover;border:1px solid #4b4428;border-radius:8px}.ar-arrow{position:absolute;top:50%;transform:translateY(-50%);background:#1119;border:1px solid #9b761c;color:var(--amber);border-radius:7px;cursor:pointer;font-size:24px;padding:9px 13px}.ar-arrow.prev{left:8px}.ar-arrow.next{right:8px}
  936. .ar-file{color:var(--amber);font-size:15px;font-weight:700;word-break:break-all;margin:11px 0}.ar-info{display:grid;grid-template-columns:76px minmax(0,1fr);gap:8px;font-size:12px;line-height:1.5}.ar-info dt{color:var(--muted)}.ar-info dd{margin:0;word-break:break-word}.ar-empty{padding:32px;color:var(--muted);text-align:center}.ar-foot{font-size:11px;color:var(--muted);margin-top:16px}
  937. @media(max-width:960px){.ar-layout{grid-template-columns:1fr}.ar-side{position:static;max-height:none;order:-1}}@media(max-width:580px){.archive{padding:14px}.ar-tools{top:-14px}.ar-head h2{font-size:18px}.ar-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
  938. /* 照片档案筛选条:独立于全局 .tools/select 布局 */
  939. .archive .ar-tools{display:flex!important;flex-flow:row nowrap!important;gap:8px;align-items:center;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin;scrollbar-color:#665022 #0a0c08;white-space:nowrap;padding:12px 2px 13px;top:-22px;width:100%;max-width:none}
  940. .archive .ar-tools>select,.archive .ar-tools>label,.archive .ar-tools>.ar-btn{display:inline-flex!important;flex:0 0 auto!important;width:auto!important;min-width:0!important;margin:0!important;max-width:none!important;line-height:1.4}
  941. .archive .ar-tools>select{height:38px;padding:7px 9px;font-size:12px;cursor:pointer}
  942. .archive .ar-tools #arPlot{width:138px!important;max-width:138px!important}
  943. .archive .ar-tools #arStage{width:135px!important;max-width:135px!important}
  944. .archive .ar-tools #arTask{width:225px!important;max-width:225px!important}
  945. .archive .ar-tools #arDev{width:236px!important;max-width:236px!important}
  946. .archive .ar-tools>label{gap:5px;align-items:center;font-size:12px}
  947. .archive .ar-tools input[type=date]{width:132px!important;min-width:132px!important;height:38px;padding:6px 7px;font-size:12px;color-scheme:dark}
  948. .archive .ar-tools .ar-btn{height:38px;padding:6px 12px;align-items:center;font-size:12px}
  949. .archive .ar-tools .ar-reset{color:var(--muted);border-style:dashed}
  950. .archive .ar-tools .ar-reset:hover{color:var(--amber)}
  951. @media(max-width:760px){.archive .ar-tools{top:-14px}.archive .ar-tools #arTask{width:190px!important;max-width:190px!important}}
  952. #tab-strategy{min-width:0;padding:10px 0 32px}#tab-strategy[hidden]{display:none!important}
  953. .strategy-intro{display:flex;flex-wrap:wrap;align-items:center;gap:12px;padding:8px 4px 14px;color:#a9a68e;font-size:12px}
  954. .strategy-kicker{color:#ffd489;font-size:15px;font-weight:700}
  955. .strategy-sub{flex:1}
  956. @media(max-width:800px){#v5StrategyFrame{height:1480px!important}}
  957. /* 照片档案:日期框与其他筛选框同宽同高,前缀在框内 */
  958. .archive .ar-tools>label.ar-dt{height:38px;box-sizing:border-box;border:1px solid var(--line-hi);border-radius:8px;background:#171b11;padding:0 4px 0 10px;gap:6px!important;width:150px!important}
  959. .archive .ar-tools>label.ar-dt:hover{border-color:rgba(255,212,137,.6)}
  960. .archive .ar-tools>label.ar-dt:focus-within{border-color:var(--amber);box-shadow:0 0 0 3px rgba(255,212,137,.18)}
  961. .archive .ar-tools>label.ar-dt span{color:var(--faint);font-size:12px;flex:none}
  962. .archive .ar-tools>label.ar-dt input[type=date]{width:auto!important;min-width:0!important;flex:1;height:34px;border:0!important;background:transparent!important;box-shadow:none!important;padding:0 2px!important;font-size:12px;color:var(--text)}
  963. .archive .ar-tools>label.ar-dt input[type=date]::-webkit-calendar-picker-indicator{filter:invert(.75) sepia(1) saturate(4) hue-rotate(5deg);cursor:pointer;margin-left:2px}
  964. .archive .ar-thumb{transition:transform .12s,border-color .12s}
  965. .archive .ar-thumb:hover{transform:translateY(-2px);border-color:rgba(255,212,137,.7)}
  966. .nz-draw .nz-cnt{font-size:12px;color:var(--muted);font-family:var(--f-num)}
  967. .nz-draw .btn:disabled,.nz-draw .btn-amber:disabled{opacity:.35;cursor:not-allowed}
  968. #nzSvg .ed-v{cursor:grab}#nzSvg .ed-v:active{cursor:grabbing}
  969. #nzSvg .ed-mid{cursor:copy;opacity:.85}#nzSvg .ed-mid:hover{opacity:1}
  970. /* 产量和质量估计:三层均衡排版 */
  971. #anaY{display:grid;gap:12px}
  972. #anaY .ph-h{margin-bottom:0}
  973. .y-kpi{display:grid;grid-template-columns:1.2fr repeat(4,1fr);gap:8px}
  974. .y-kpi>div{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:9px 12px;min-width:0}
  975. .y-kpi>div>span{display:block;font-size:11.5px;color:var(--faint)}
  976. .y-kpi b{font-family:var(--f-num);font-size:24px;font-weight:700}
  977. .y-kpi b.ok{color:var(--w-ok)}
  978. .y-kpi b small{font-family:var(--f-ui);font-size:11.5px;color:var(--muted);margin-left:3px;font-weight:500}
  979. .y-kpi em{display:block;font-style:normal;font-size:11px;color:var(--muted)}
  980. .y-kpi .y-k1{display:flex;flex-direction:column;justify-content:center;gap:6px;align-items:flex-start}
  981. .y-kpi .y-k1 .yst{margin-left:0}
  982. .y-kpi .y-k1 .tag{color:var(--amber);font-weight:800;font-size:15px}
  983. .y-mid{align-items:start;grid-template-columns:minmax(0,1fr)}
  984. .y-mid .ana-r .rp{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 18px}
  985. .y-mid .ana-r .rp>h4{grid-column:1/-1}
  986. .y-mid .ana-r .rp>.rp-sec{min-width:0}
  987. .y-mid .ana-r,.y-mid .ana-r .rp{height:auto}
  988. .y-mid .ana-r .rp{display:block;box-sizing:border-box}
  989. .y-basis{width:100%;border-collapse:collapse;margin-top:5px;font-size:12.5px}
  990. .y-basis th{font-weight:500;color:var(--faint);font-size:11.5px;text-align:right;padding:4px 6px;border-bottom:1px solid var(--line)}
  991. .y-basis th:first-child,.y-basis td:first-child{text-align:left;padding-left:0}
  992. .y-basis td{padding:6px;text-align:right;font-family:var(--f-num);color:var(--text);border-bottom:1px dashed var(--line)}
  993. .y-basis td:first-child{font-family:inherit;color:var(--muted)}
  994. .y-basis td.e{color:var(--amber);font-weight:700}.y-basis td.c{color:var(--c-cash)}
  995. .y-basis td.up{color:var(--w-ok);font-weight:700}.y-basis td.dn{color:var(--w-orange);font-weight:700}
  996. .y-basis tr:last-child td{border-bottom:0}
  997. .y-meta{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px;margin-top:6px}
  998. .y-meta span{background:var(--panel-2);border:1px solid var(--line);border-radius:7px;padding:6px 8px}
  999. .y-meta em{display:block;font-style:normal;font-size:11px;color:var(--faint)}
  1000. .y-meta b{font-family:var(--f-num);font-size:14px;color:var(--text)}
  1001. .y-meta b small{font-size:10.5px;color:var(--faint);margin-left:2px;font-weight:400}
  1002. .y-mid .ybars{margin-top:8px}
  1003. .y-h{margin:0;font-size:14px;display:flex;align-items:center;gap:6px}
  1004. .y-h i{width:8px;height:8px;border-radius:2px;background:var(--amber)}
  1005. .y-trend .cv-svg{width:100%}
  1006. @media (max-width:1100px){.y-kpi{grid-template-columns:repeat(2,1fr)}.y-kpi .y-k1{grid-column:1/-1;flex-direction:row}}
  1007. /* 照片档案自绘日期框 */
  1008. .archive .ar-tools>.ar-dt{display:inline-flex!important;flex:0 0 auto!important;align-items:center;gap:6px;height:38px;box-sizing:border-box;width:150px!important;border:1px solid var(--line-hi);border-radius:8px;background:#171b11;padding:0 8px 0 10px;cursor:pointer}
  1009. .archive .ar-tools>.ar-dt:hover{border-color:rgba(255,212,137,.6)}
  1010. .archive .ar-tools>.ar-dt.open{border-color:var(--amber);box-shadow:0 0 0 3px rgba(255,212,137,.18)}
  1011. .ar-dt>span{color:var(--faint);font-size:12px;flex:none}
  1012. .ar-dtb{flex:1;min-width:0;border:0;background:none;color:var(--text);font-size:12.5px;text-align:left;padding:0;cursor:pointer;font-family:var(--f-num)}
  1013. .ar-dtb.ph{color:var(--faint);font-family:var(--f-ui)}
  1014. .ar-dtb:focus-visible{outline:none}
  1015. .ar-dti,.ar-dtx{font-style:normal;color:var(--amber);font-size:12px;flex:none}
  1016. .ar-dtx{color:var(--muted);font-size:15px;line-height:1;padding:2px}
  1017. .ar-dtx:hover{color:var(--amber)}
  1018. .ar-cal{position:fixed;z-index:995;width:252px;background:#14170e;border:1px solid rgba(255,212,137,.35);border-radius:10px;padding:10px;box-shadow:0 12px 32px rgba(0,0,0,.55)}
  1019. .ar-cal[hidden]{display:none!important}
  1020. .ac-h{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
  1021. .ac-h b{font-size:13.5px;color:var(--text)}
  1022. .ac-h button{width:28px;height:28px;border-radius:6px;border:1px solid var(--line-hi);background:var(--panel-2);color:var(--amber);font-size:16px;cursor:pointer}
  1023. .ac-w,.ac-g{display:grid;grid-template-columns:repeat(7,1fr);gap:2px;text-align:center}
  1024. .ac-w span{font-size:11px;color:var(--faint);padding:4px 0}
  1025. .ac-g button{height:30px;border:0;border-radius:6px;background:none;color:var(--text);font-size:12.5px;font-family:var(--f-num);cursor:pointer;position:relative}
  1026. .ac-g button:hover:not(:disabled){background:rgba(255,255,255,.09)}
  1027. .ac-g button.has::after{content:"";position:absolute;left:50%;bottom:3px;width:4px;height:4px;margin-left:-2px;border-radius:50%;background:var(--amber)}
  1028. .ac-g button.inr{background:rgba(255,212,137,.1)}
  1029. .ac-g button.on{background:var(--amber);color:var(--amber-ink);font-weight:800}
  1030. .ac-g button.on::after{background:var(--amber-ink)}
  1031. .ac-g button:disabled{color:#4a4a3a;cursor:not-allowed}
  1032. .ac-f{display:flex;align-items:center;justify-content:space-between;margin-top:8px;padding-top:8px;border-top:1px solid var(--line);font-size:11.5px;color:var(--faint)}
  1033. .ac-f i{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--amber);margin-right:5px;vertical-align:2px}
  1034. .ac-f button{border:1px solid var(--line-hi);background:none;color:var(--muted);border-radius:6px;padding:3px 10px;font-size:12px;cursor:pointer}
  1035. .ac-f button:hover{color:var(--amber);border-color:var(--amber)}
  1036. /* 当前基地原生采集策略组件,共享表型采集的数据模型 */
  1037. .strategyNative{min-width:0;color:var(--text);font-size:13px}
  1038. .sn-head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:12px}
  1039. .sn-head h2{margin:0;color:var(--amber);font-size:21px}.sn-head p{margin:6px 0 0;color:var(--muted);font-size:12px}.sn-head p b{color:var(--text)}
  1040. .sn-id{font-family:var(--f-num);font-size:12px;color:var(--amber);border:1px solid var(--line-hi);padding:1px 6px;border-radius:4px}
  1041. .sn-headline{display:flex;align-items:center;gap:18px;flex-wrap:wrap;background:#11170e;border:1px solid var(--line);border-radius:9px;padding:9px 14px;margin-bottom:12px;color:var(--muted);font-size:12px}
  1042. .sn-headline b{font-family:var(--f-num);color:var(--text);font-size:17px;margin-left:6px}.sn-muted{margin-left:auto;color:var(--faint);font-size:11px}
  1043. .sn-main{display:grid;grid-template-columns:minmax(0,1fr) 310px;gap:12px;align-items:start}
  1044. .sn-mapcol,.sn-aside{border:1px solid var(--line-hi);border-radius:11px;background:rgba(16,19,12,.9);overflow:hidden}
  1045. .sn-maphead{padding:12px 13px;display:flex;align-items:center;gap:12px;font-size:13px}.sn-maphead strong{font-size:15px;color:var(--amber)}.sn-maphead>span{color:var(--muted)}
  1046. .sn-mapzoom{margin-left:auto;display:flex;gap:5px}.sn-mapzoom button{background:#0b100a;color:var(--text);border:1px solid var(--line-hi);border-radius:5px;padding:3px 9px}
  1047. .sn-mapview{background:#293521;height:540px;overflow:hidden}.sn-mapview svg{height:100%;width:100%;display:block}
  1048. .sn-mapfoot{display:flex;gap:15px;align-items:center;flex-wrap:wrap;color:var(--muted);font-size:11px;padding:10px 14px}.sn-gold{color:var(--amber)}.sn-red{color:#ff7272}
  1049. .sn-aside{padding:12px}.sn-block{display:flex;align-items:baseline;gap:10px;margin-bottom:8px}.sn-block strong{color:var(--amber);font-size:14px}.sn-block span{margin-left:auto;font-size:11px;color:var(--muted)}
  1050. .sn-tasks{max-height:242px;overflow-y:auto;display:grid;gap:5px;scrollbar-width:thin}
  1051. .sn-task{width:100%;background:var(--panel);border:1px solid var(--line);border-radius:7px;color:var(--text);padding:8px 10px;display:grid;gap:3px;text-align:left}
  1052. .sn-task:hover,.sn-task.on{border-color:var(--amber);background:rgba(255,212,137,.09)}
  1053. .sn-task div{display:flex;gap:6px;justify-content:space-between;align-items:center}.sn-task b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}.sn-task em{font-style:normal;color:var(--amber);font-family:var(--f-num);white-space:nowrap}
  1054. .sn-task small{font-size:11px;color:var(--muted)}.sn-form{display:grid;gap:9px}.sn-form label,.sn-dialog>label{display:grid;gap:5px;color:var(--muted);font-size:11.5px}
  1055. .sn-form select,.sn-form input,.sn-dialog select,.sn-dialog input[type=date]{width:100%;box-sizing:border-box;border:1px solid var(--line-hi);background:var(--panel-2);color:var(--text);border-radius:6px;padding:6px 8px;min-width:0;height:34px}
  1056. .sn-pair{display:grid;grid-template-columns:1fr 1fr;gap:8px}.sn-desc{color:var(--muted);font-size:11.5px;line-height:1.5;padding:8px 9px;background:#11160e;border:1px dashed var(--line-hi);border-radius:7px}
  1057. .sn-btnrow{display:flex;gap:7px;flex-wrap:wrap}.sn-btnrow button{font-size:11.5px}.sn-obslist{display:grid;gap:4px;max-height:100px;overflow:auto;font-size:11px;color:var(--muted)}.sn-obslist div{display:flex;justify-content:space-between;align-items:center}.sn-obslist button{border:0;background:transparent;color:var(--amber)}
  1058. .sn-modal{position:fixed;inset:0;background:#050704bb;z-index:850;display:grid;place-items:center;padding:14px}.sn-dialog{width:min(590px,100%);max-height:92vh;overflow:auto;background:var(--panel);border:1px solid var(--line-hi);border-radius:12px;padding:20px;display:grid;gap:12px;box-shadow:0 20px 70px #000c}
  1059. .sn-dialog header{display:flex;align-items:center;justify-content:space-between}.sn-dialog h3{margin:0;color:var(--amber);font-size:18px}.sn-dialog p{margin:0;color:var(--muted);font-size:12px}.sn-dialog p b{color:var(--text)}
  1060. .sn-choices{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;max-height:200px;overflow:auto}.sn-choices label{display:flex;gap:5px;align-items:center;font-size:12px;background:var(--panel-2);border:1px solid var(--line);border-radius:6px;padding:7px}.sn-choices input{accent-color:var(--amber)}.sn-dialog footer{display:flex;justify-content:flex-end}
  1061. @media(max-width:1150px){.sn-main{grid-template-columns:1fr}.sn-mapview{height:400px}.sn-tasks{max-height:200px}.sn-choices{grid-template-columns:repeat(2,1fr)}}
  1062. /* 照片墙影像任务来源:保持黑金布局,只追加示意标记,不覆盖既有照片控件 */
  1063. #latest .ph .cap{gap:4px;align-items:center}
  1064. #latest .ph .cap span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  1065. #latest .ph .cap b{white-space:nowrap}
  1066. #archive .ar-thumb span{gap:4px}
  1067. #archive .ar-thumb span>i{flex:none}
  1068. /* 基地档案 */
  1069. #tab-dossier{gap:12px}
  1070. .ba-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;padding:4px 2px}
  1071. .ba-head h2{margin:0;font-size:20px;color:var(--amber)}
  1072. .ba-head p{margin:4px 0 0;color:var(--muted);font-size:12.5px}
  1073. .ba-sum{display:flex;gap:8px;flex-wrap:wrap}
  1074. .ba-sc{display:flex;align-items:center;gap:10px;border:1px solid var(--line-hi);border-radius:10px;background:var(--panel);padding:8px 12px;color:var(--text);text-decoration:none;font-size:13px}
  1075. .ba-sc:hover{border-color:var(--amber)}
  1076. .ba-g{display:inline-grid;place-items:center;min-width:26px;height:22px;padding:0 6px;border-radius:6px;font-weight:800;font-size:12.5px;color:#0a0c08;background:var(--gc)}
  1077. .ba-sec .ph-h .ba-g{margin-left:-2px}
  1078. .ba-grid{display:grid;grid-template-columns:minmax(0,1.6fr) minmax(0,1fr);gap:14px;align-items:start}
  1079. .tblw{overflow-x:auto}
  1080. .ba-tb{width:100%;border-collapse:collapse;font-size:12.5px}
  1081. .ba-tb th{text-align:left;font-weight:500;color:var(--muted);padding:7px 10px;border-bottom:1px solid var(--line-hi);font-size:12px;white-space:nowrap}
  1082. .ba-tb td{padding:7px 10px;border-bottom:1px solid var(--line);white-space:nowrap}
  1083. .ba-tb .r{text-align:right}
  1084. .ba-tb small{color:var(--faint);margin-left:3px}
  1085. .ba-tb .mut,.ba-tb td.mut{color:var(--faint)}
  1086. .ba-tb .ok{color:var(--w-ok)}.ba-tb .warn{color:var(--w-orange)}
  1087. .ba-sev{display:inline-block;border-radius:4px;padding:0 7px;font-size:12px;line-height:18px;font-weight:800;color:#fff;background:var(--sc);text-shadow:0 1px 1px rgba(0,0,0,.35)}
  1088. .ba-desc{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:12px 14px}
  1089. .ba-desc b{color:var(--amber);font-size:13px}
  1090. .ba-desc p{margin:6px 0 0;font-size:13px;line-height:1.85}
  1091. .ba-foot{color:var(--faint);font-size:11.5px;margin:0}
  1092. @media (max-width:1000px){.ba-grid{grid-template-columns:1fr}}
  1093. /* 基地档案巡园记录:复用已有照片档案的快捷入口(仅作用于基地档案) */
  1094. #tab-dossier .ba-photo-link{display:inline-flex;align-items:center;justify-content:center;gap:5px;white-space:nowrap;border:1px solid rgba(255,212,137,.48);border-radius:6px;background:rgba(255,212,137,.06);color:var(--amber);font-size:11.5px;font-weight:700;line-height:1.35;padding:4px 9px;cursor:pointer}
  1095. #tab-dossier .ba-photo-link:hover{border-color:var(--amber);background:var(--amber);color:var(--amber-ink)}
  1096. #tab-dossier .ba-photo-all{margin-left:auto;padding:6px 12px;font-size:12px}
  1097. #tab-dossier .ba-tb .ba-photo-link{padding:3px 8px;font-size:11px}
  1098. #archive .ar-source-note{font-size:11.5px;color:var(--muted);line-height:1.5;margin-top:7px}
  1099. /* 识别结果修订 */
  1100. .vw-tb.rv td:last-child,.vw-tb.rv th:last-child{text-align:right}
  1101. .vw-tb .r{text-align:right}
  1102. .vw-tb td.old{color:var(--faint);opacity:.52;text-decoration:none}
  1103. .vw-tb tr.edited td:first-child{color:var(--amber)}
  1104. .rv-dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--amber);margin-right:6px;vertical-align:2px}
  1105. .rv-c{white-space:nowrap}
  1106. .rv-in{display:inline-flex;align-items:center;gap:3px;border:1px solid var(--line-hi);border-radius:6px;background:#14170e;padding:0 6px;height:26px}
  1107. .rv-in:focus-within{border-color:var(--amber);box-shadow:0 0 0 2px rgba(255,212,137,.18)}
  1108. .viewer .rv-in input[type=text]{width:52px!important;height:24px!important;border:0!important;background:none!important;box-shadow:none!important;padding:0!important;color:var(--text);font:600 13px var(--f-num);text-align:right;outline:none;border-radius:0}
  1109. .rv-in input::placeholder{color:var(--faint);font-weight:400}
  1110. .rv-in input.bad{color:var(--w-red)}
  1111. .rv-in em{font-style:normal;color:var(--faint);font-size:11px}
  1112. tr.edited .rv-in{border-color:rgba(255,212,137,.6)}
  1113. .rv-undo{margin-left:4px;width:22px;height:22px;border-radius:5px;border:1px solid var(--line-hi);background:none;color:var(--muted);cursor:pointer;font-size:12px}
  1114. .rv-undo:hover{color:var(--amber);border-color:var(--amber)}
  1115. .rv-n{margin-left:8px;font-size:11.5px;color:var(--amber);border:1px solid rgba(255,212,137,.5);border-radius:999px;padding:0 8px}
  1116. .rv-note{margin:8px 0 0;font-size:11.5px;color:var(--faint);line-height:1.6}
  1117. /* 新建试验区:试验变量配置(仅第三步,替换旧基线一致性表) */
  1118. .nz-rtab.on.vars{background:var(--amber);border-color:var(--amber);color:var(--amber-ink)}
  1119. .nzv{display:grid;gap:12px}
  1120. .nzv-head{display:flex;align-items:center;justify-content:space-between;gap:10px;font-size:12px;color:var(--muted)}
  1121. .nzv-head b{font-size:14px;color:var(--amber)}
  1122. .nzv-pane{display:grid;gap:10px;padding:12px;border:1px solid var(--line-hi);border-radius:9px;background:rgba(10,12,8,.28)}
  1123. .nzv-cap{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px;font-weight:800;color:var(--text)}
  1124. .nzv-cap em{font-size:11px;color:var(--muted);font-style:normal;font-weight:400}
  1125. .nzv-label{display:grid;gap:5px;font-size:11.5px;font-weight:700;color:var(--muted)}
  1126. .nzv input[type=text]{box-sizing:border-box;display:block;width:100%;min-width:0;background:#151a12;border:1px solid var(--line-hi);border-radius:7px;padding:9px 10px;font-size:12.5px;color:var(--text);outline:none}
  1127. .nzv input[type=text]:focus{border-color:var(--amber);box-shadow:0 0 0 2px rgba(255,212,137,.12)}
  1128. .nzv input[type=text]::placeholder{color:var(--faint);font-weight:400}
  1129. .nzv-pair{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}
  1130. .nzv-pair .exp{color:var(--amber)}
  1131. .nzv-pair .ctl{color:var(--c-cash)}
  1132. .nzv-note{font-size:11.5px;color:var(--muted);line-height:1.65}
  1133. .nzv-ctl-head,.nzv-ctl{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr) minmax(0,1fr) 30px;gap:8px;align-items:center}
  1134. .nzv-ctl-head{font-size:11.5px;color:var(--faint);padding:0 2px}
  1135. .nzv-ctl{margin-top:6px}
  1136. .nzv-ctl-head .nzv-exp{color:var(--amber)}
  1137. .nzv-ctl-head .nzv-comp{color:var(--c-cash)}
  1138. .nzv-del{height:30px;width:30px;border-radius:6px;border:1px solid var(--line-hi);background:var(--panel);color:var(--muted);font-size:16px;line-height:1}
  1139. .nzv-del:hover{color:var(--w-red);border-color:var(--w-red)}
  1140. .nzv-empty{font-size:12px;color:var(--faint);padding:10px;text-align:center;border:1px dashed var(--line-hi);border-radius:7px}
  1141. .nzv-footer{display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap}
  1142. .nzv-ok{color:var(--w-ok);font-size:12px;font-weight:700}
  1143. @media(max-width:650px){.nzv-pair{grid-template-columns:1fr}.nzv-ctl-head{display:none}.nzv-ctl{grid-template-columns:repeat(2,minmax(0,1fr)) 28px;grid-template-areas:"name name del" "exp ctl del"}.nzv-ctl .nzv-cn{grid-area:name}.nzv-ctl .nzv-ce{grid-area:exp}.nzv-ctl .nzv-cc{grid-area:ctl}.nzv-ctl .nzv-del{grid-area:del}}
  1144. .wx-lg .sens-legend{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap}
  1145. .wx-lg .sens-legend em{font-style:normal;color:var(--muted);font-size:11.5px}
  1146. .wx-lg .sens-legend i{width:14px;height:10px;border-radius:3px;display:inline-block;border:1px solid rgba(255,255,255,.08)}
  1147. .wx-lg .sens-legend i.lv1{background:#5c4632}
  1148. .wx-lg .sens-legend i.lv2{background:#8c6234}
  1149. .wx-lg .sens-legend i.lv3{background:#c4843a}
  1150. .wx-lg .sens-legend i.lv4{background:#f2ad48}
  1151. .wx-lg .mut{color:var(--faint)}
  1152. .rp h4 .ov-btn{margin-left:auto;border:1px solid rgba(255,212,137,.55);background:rgba(255,212,137,.08);color:var(--amber);border-radius:7px;padding:3px 12px;font-size:12px;font-weight:700;cursor:pointer}
  1153. .rp h4 .ov-btn:hover,.rp h4 .ov-btn.on{background:var(--amber);color:var(--amber-ink)}
  1154. .ov-tags{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 8px}
  1155. .ov-tag{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--line-hi);border-radius:999px;padding:2px 10px;font-size:12px}
  1156. .ov-tag i{width:8px;height:8px;border-radius:2px;background:var(--sc)}
  1157. .ov-tag em{font-style:normal;color:var(--muted)}
  1158. .ov-tb td,.ov-tb th{padding:5px 8px;font-size:12px}
  1159. /* 10.23 原位修订:气象/病虫胁迫分析二级指标标签(纯文字 + 下划线,不使用填充底色) */
  1160. .stress-dates{color:var(--muted);font-size:12px;font-family:var(--f-num);font-weight:600;white-space:nowrap;margin-left:auto}
  1161. #anaW .ana-l .cv-h,#anaP .ana-l .cv-h{display:flex;align-items:center;gap:12px;justify-content:flex-start;flex-wrap:wrap;margin:0 0 3px;min-height:25px}
  1162. #anaW .ana-l .cv-h .tag,#anaP .ana-l .cv-h .tag{background:transparent;color:var(--amber);padding:0 0 0 9px;border-left:3px solid var(--amber);border-radius:0;font-size:14px;font-weight:800;line-height:1.3;flex:0 0 auto}
  1163. #anaW .stress-tabs,#anaP .stress-tabs{display:flex;gap:8px;align-items:center;overflow-x:auto;overflow-y:hidden;white-space:nowrap;padding:4px 0 6px;margin:2px 0 10px;scrollbar-width:thin;scrollbar-color:var(--line-hi) transparent}
  1164. #anaW .stress-tab,#anaP .stress-tab{flex:0 0 auto;max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border:1px solid var(--line-hi);border-radius:8px;padding:6px 14px;background:rgba(255,255,255,.02);color:var(--muted);font-size:12.5px;font-weight:600;cursor:pointer;transition:color .12s,border-color .12s,background .12s}
  1165. #anaW .stress-tab:hover,#anaP .stress-tab:hover{color:var(--text);border-color:rgba(255,212,137,.55)}
  1166. #anaW .stress-tab.on,#anaP .stress-tab.on{background:var(--amber);border-color:var(--amber);color:var(--amber-ink);font-weight:800}
  1167. #anaW .stress-tab:focus-visible,#anaP .stress-tab:focus-visible{outline:2px solid var(--amber);outline-offset:2px}
  1168. /* 10.23 基地档案:三项评分一级重点与紧凑自适应说明栏,不影响其它页面 */
  1169. #tab-dossier .ba-head{display:flex;flex-direction:column;align-items:stretch;gap:14px;padding:6px 2px 2px}
  1170. #tab-dossier .ba-head h2{font-size:21px}
  1171. #tab-dossier .ba-sum{width:100%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
  1172. #tab-dossier .ba-sc{min-height:92px;box-sizing:border-box;display:flex;flex-direction:column;justify-content:center;align-items:flex-start;gap:12px;padding:14px 20px;background:linear-gradient(130deg,rgba(35,40,25,.95),rgba(16,19,12,.95));border-radius:12px;position:relative;overflow:hidden}
  1173. #tab-dossier .ba-sc::after{content:"";position:absolute;bottom:0;left:0;right:0;height:3px;background:var(--line-hi)}
  1174. #tab-dossier .ba-sc span:first-child{color:var(--muted);font-weight:700;font-size:14px}
  1175. #tab-dossier .ba-sc .ba-g{min-width:52px;height:34px;font-size:24px;border-radius:8px;padding:4px 12px}
  1176. /* 2026-10-23:评分卡 / 土壤方框 / 历史时间轴 */
  1177. #tab-dossier .ba-sc{flex-direction:row;align-items:center;justify-content:flex-start;gap:18px;position:relative;overflow:hidden}
  1178. #tab-dossier .ba-sc::after{background:var(--gc);opacity:.85}
  1179. .ba-ring{width:76px;height:76px;flex:none}
  1180. .ba-ring .tk{fill:none;stroke:rgba(255,255,255,.08);stroke-width:7}
  1181. .ba-ring .pg{fill:none;stroke:var(--gc);stroke-width:7;stroke-linecap:round}
  1182. .ba-ring text{text-anchor:middle;font-family:var(--f-num);font-weight:800;font-size:21px;fill:var(--text)}
  1183. .ba-sci{display:grid;gap:4px;min-width:0}
  1184. .ba-sci .t{color:var(--muted);font-weight:700;font-size:14px}
  1185. .ba-sci .g{display:flex;align-items:baseline;gap:10px}
  1186. .ba-sci .g b{font-size:22px;color:var(--gc);font-weight:800}
  1187. .ba-sci .g em{font-style:normal;font-size:12px;color:var(--faint)}
  1188. .ba-sci p{margin:0;font-size:12px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  1189. .ba-sg{min-width:0!important;padding:0 8px!important;gap:2px;display:inline-flex!important;align-items:baseline}
  1190. .ba-sg small{font-size:10.5px;font-weight:700}
  1191. .ba-soil{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;min-width:0}
  1192. #tab-dossier #ba1 .ba-grid{grid-template-columns:minmax(0,1fr);align-items:start;gap:8px}
  1193. #tab-dossier #ba1 .ba-soil{align-content:start}
  1194. @media(max-width:1100px){#tab-dossier #ba1 .ba-grid{grid-template-columns:1fr}}
  1195. @media(max-width:720px){.ba-soil{grid-template-columns:1fr}}
  1196. .ba-sbox{border:1px solid var(--line);border-radius:10px;background:var(--panel-2);padding:11px 13px;display:grid;gap:7px}
  1197. .ba-sbox .h{display:flex;justify-content:space-between;align-items:baseline;gap:6px}
  1198. .ba-sbox .h span{font-size:13px;font-weight:700;color:var(--text)}
  1199. .ba-sbox .h b{font-family:var(--f-num);font-size:15px;color:var(--amber)}
  1200. .ba-sbox .h b small{font-size:10.5px;margin-left:1px}
  1201. .ba-sbox .v{display:flex;align-items:baseline;gap:4px}
  1202. .ba-sbox .v b{font-size:24px;font-weight:800;color:var(--text)}
  1203. .ba-sbox .v b.txt{font-size:22px;letter-spacing:.04em}
  1204. .ba-sbox .v small{font-size:11.5px;color:var(--faint)}
  1205. .ba-sbox .v em{margin-left:auto;font-style:normal;font-size:11.5px;font-weight:700;color:var(--muted);border:1px solid var(--line-hi);border-radius:5px;padding:0 7px}
  1206. .ba-sbox.bad .v em{color:var(--w-orange);border-color:rgba(255,138,42,.55)}
  1207. .ba-sbox.bad{border-color:rgba(255,138,42,.35)}
  1208. .ba-sbox .bar{height:5px;border-radius:3px;background:rgba(255,255,255,.07);overflow:hidden}
  1209. .ba-sbox .bar i{display:block;height:100%;background:var(--amber);opacity:.85;border-radius:3px}
  1210. .ba-sbox .ref{font-size:11.5px;color:var(--faint)}
  1211. /* 宽屏土壤卡片:稍增字号与内边距,让整行卡片更匀称 */
  1212. #tab-dossier #ba1 .ba-sbox{min-height:164px;box-sizing:border-box;padding:16px 20px;gap:10px}
  1213. #tab-dossier #ba1 .ba-sbox .h span{font-size:15px}
  1214. #tab-dossier #ba1 .ba-sbox .h b{font-size:17px}
  1215. #tab-dossier #ba1 .ba-sbox .v b{font-size:29px}
  1216. #tab-dossier #ba1 .ba-sbox .v b.txt{font-size:26px}
  1217. #tab-dossier #ba1 .ba-sbox .v em{font-size:12.5px}
  1218. #tab-dossier #ba1 .ba-sbox .bar{width:min(45%,260px)}
  1219. #tab-dossier #ba1 .ba-sbox .ref{font-size:13px}
  1220. @media(max-width:720px){#tab-dossier #ba1 .ba-sbox{min-height:0;padding:12px 14px;gap:7px}#tab-dossier #ba1 .ba-sbox .v b{font-size:25px}#tab-dossier #ba1 .ba-sbox .ref{font-size:11.5px}}
  1221. .ba-tl{display:grid;gap:10px}
  1222. .ba-tl-lg{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:11.5px;color:var(--muted)}
  1223. .ba-tl-lg span{display:inline-flex;align-items:center;gap:5px}
  1224. .ba-tl-lg > span:first-child::before{content:"";width:12px;height:12px;border-radius:3px;border:1px solid var(--line-hi);background:var(--panel-2)}
  1225. .ba-tl-lg span.pe::before{content:"";width:12px;height:12px;border-radius:3px;border:1px dashed var(--line-hi)}
  1226. .ba-tl-lg i{width:10px;height:10px;border-radius:2px;display:inline-block}
  1227. .ba-tl-lg .sep{width:1px;height:12px;background:var(--line-hi)}
  1228. .ba-tl-row{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:12px;position:relative;padding-top:4px}
  1229. .ba-tl-row::before{content:"";position:absolute;left:8px;right:8px;top:13px;height:2px;background:linear-gradient(90deg,var(--line-hi),rgba(255,212,137,.55))}
  1230. .ba-ty{display:grid;grid-template-rows:auto 1fr;gap:9px;position:relative}
  1231. .ba-ty .node{display:grid;grid-template-columns:auto auto 1fr;align-items:center;column-gap:7px;row-gap:3px}
  1232. .ba-ty .node i{width:14px;height:14px;border-radius:50%;background:var(--panel);border:3px solid var(--line-hi);position:relative;z-index:1}
  1233. .ba-ty.now .node i{border-color:var(--amber);box-shadow:0 0 0 4px rgba(255,212,137,.15)}
  1234. .ba-ty .node b{font-size:16px;font-weight:800;color:var(--text)}
  1235. .ba-ty.now .node b{color:var(--amber)}
  1236. .ba-ty .node em{font-style:normal;font-size:10.5px;color:var(--amber-ink);background:var(--amber);border-radius:4px;padding:0 5px;justify-self:start}
  1237. .ba-ty .node span{grid-column:1/-1;font-size:11.5px;color:var(--faint);padding-left:21px}
  1238. .ba-ty .evs{display:flex;flex-direction:column;gap:6px;border:1px solid var(--line);border-radius:10px;background:var(--panel-2);padding:9px}
  1239. .ba-ty .evs .lb{font-size:11px;color:var(--faint);margin:2px 0 -1px}
  1240. .ba-ty .ev{display:grid;grid-template-columns:minmax(0,1fr) auto auto;align-items:center;gap:8px;border:1px solid var(--line-hi);border-left:3px solid var(--sc);border-radius:7px;padding:5px 8px;font-size:12px;background:rgba(255,255,255,.015)}
  1241. .ba-ty .ev.pe{border-style:dashed;border-left-style:solid}
  1242. .ba-ty .ev b{font-weight:700;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  1243. .ba-ty .ev small{color:#c9c2ad;font-size:12px;white-space:nowrap}
  1244. .ba-ty .ev i{font-style:normal;font-size:12px;line-height:18px;font-weight:800;color:#fff;background:var(--sc);border-radius:4px;padding:0 7px;min-width:34px;text-align:center;text-shadow:0 1px 1px rgba(0,0,0,.35)}
  1245. .ba-ty .none{font-size:11.5px;color:var(--faint);padding:4px 2px}
  1246. @media(max-width:1100px){.ba-tl-row{grid-template-columns:repeat(2,minmax(0,1fr))}.ba-tl-row::before{display:none}}
  1247. #tab-dossier .ba-grid{grid-template-columns:minmax(0,1fr);align-items:start;gap:8px}
  1248. #tab-dossier .ba-desc{display:flex;flex-direction:column;justify-content:flex-start;min-height:0;background:linear-gradient(100deg,rgba(255,212,137,.055),rgba(16,19,12,.85));padding:10px 14px;border-left:3px solid rgba(255,212,137,.65)}
  1249. #tab-dossier .ba-desc b{font-size:13px}
  1250. #tab-dossier .ba-desc p{font-size:12.5px;line-height:1.75;overflow-wrap:anywhere;margin-top:4px}
  1251. #tab-dossier .ba-desc2 .sum{font-size:13px;color:var(--text);margin:6px 0 10px}
  1252. #tab-dossier .ba-desc2 .sum b{color:var(--amber)}
  1253. .ba-desc2 .cols{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
  1254. .ba-desc2 .bx{border:1px solid var(--line-hi);border-radius:10px;background:rgba(10,12,8,.55);padding:10px 14px 12px;min-width:0}
  1255. .ba-desc2 h5{margin:0 0 8px;padding-bottom:7px;border-bottom:1px dashed var(--line);font-size:13px;color:var(--amber);font-weight:700;display:flex;align-items:center;gap:6px}
  1256. .ba-desc2 h5::before{content:"";width:3px;height:12px;border-radius:2px;background:var(--amber)}
  1257. .ba-desc2 ul{margin:0;padding-left:16px;display:grid;gap:6px}
  1258. .ba-desc2 li{font-size:12.5px;line-height:1.6;color:var(--text);overflow-wrap:anywhere}
  1259. .ba-desc2 li b{color:var(--text);font-weight:700}
  1260. .ba-desc2 li::marker{color:var(--amber)}
  1261. .ba-desc2 .mut{color:var(--faint)}
  1262. @media(max-width:1100px){.ba-desc2 .cols{grid-template-columns:1fr}}
  1263. #tab-dossier .ba-sec .ph-h{gap:8px}
  1264. #tab-dossier .ba-tb td{padding-top:6px;padding-bottom:6px}
  1265. @media(max-width:1100px){#tab-dossier .ba-grid{grid-template-columns:1fr}}
  1266. @media(max-width:720px){#tab-dossier .ba-sum{grid-template-columns:1fr}#tab-dossier .ba-sc{min-height:76px;flex-direction:row;align-items:center;justify-content:space-between}}
  1267. /* 2026-10-28 基地档案:四板块 / 风险等级 / 关键节点矩阵 / 病虫害三因子时间轴 */
  1268. #tab-dossier .ba-sum{grid-template-columns:repeat(4,minmax(0,1fr))}
  1269. #tab-dossier .ba-sc{min-height:84px;padding:14px 18px}
  1270. #tab-dossier .ba-sci .g b{font-size:24px}
  1271. @media(max-width:1200px){#tab-dossier .ba-sum{grid-template-columns:repeat(2,minmax(0,1fr))}}
  1272. .ba-rk{display:inline-flex;align-items:center;justify-content:center;min-width:22px;height:20px;padding:0 7px;border-radius:5px;font-size:12px;font-weight:800;color:#fff;background:var(--rc);text-shadow:0 1px 1px rgba(0,0,0,.35);white-space:nowrap;line-height:1}
  1273. .ba-pt-lg{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:11.5px;color:var(--muted)}
  1274. .ba-pt-lg>span{display:inline-flex;align-items:center;gap:5px}
  1275. .ba-pt-lg b{color:var(--text);font-weight:700;margin-right:2px}
  1276. .ba-pt-lg small{color:var(--faint);font-size:11.5px;margin-left:4px}
  1277. .ba-pt-lg .sep{width:1px;height:12px;background:var(--line-hi)}
  1278. .ba-pt-lg .rule{color:var(--faint)}
  1279. .ba-pt-lg .kn{width:14px;height:4px;border-radius:2px;background:var(--amber);display:inline-block}
  1280. .ba-pt-lg .yd1{width:8px;height:8px;border-radius:50%;background:var(--amber);display:inline-block}
  1281. /* 02 关键节点 × 灾害矩阵 */
  1282. .ba-rm-wrap,.ba-pt-wrap{overflow-x:auto}
  1283. .ba-rm{display:grid;grid-template-columns:minmax(170px,1.25fr) repeat(var(--nh),minmax(92px,1fr)) minmax(220px,1.6fr);gap:6px;min-width:1080px}
  1284. .ba-rm .hd{font-size:12px;color:var(--muted);font-weight:700;padding:4px 8px;text-align:center;align-self:end}
  1285. .ba-rm .hd.nd,.ba-rm .hd.fx{text-align:left}
  1286. .ba-rm>.nd:not(.hd){border:1px solid var(--line-hi);border-left:3px solid var(--amber);border-radius:9px;background:var(--panel-2);padding:9px 11px;display:grid;gap:2px;align-content:start}
  1287. .ba-rm>.nd:not(.hd) b{font-size:14.5px;color:var(--amber)}
  1288. .ba-rm>.nd span{font-size:11.5px;color:var(--muted)}
  1289. .ba-rm>.nd small{font-size:11.5px;color:var(--faint);line-height:1.5}
  1290. .ba-rm .imp{justify-self:start;font-style:normal;font-size:11px;font-weight:700;color:var(--amber-ink);background:var(--amber);border-radius:4px;padding:0 6px;margin:3px 0 1px}
  1291. .ba-rm .c{border:1px solid color-mix(in srgb,var(--rc) 45%,transparent);border-radius:9px;background:color-mix(in srgb,var(--rc) 13%,rgba(10,12,8,.6));padding:9px 8px;display:grid;gap:6px;align-content:center;justify-items:center}
  1292. .ba-rm .c .v{display:flex;align-items:baseline;gap:3px}
  1293. .ba-rm .c .v{align-items:center;gap:8px}
  1294. .ba-rm .c .v b{font-size:28px;font-weight:800;color:var(--text);line-height:1}
  1295. .ba-rm .c .v b small{font-size:15px;font-weight:700;margin-left:1px;color:var(--text)}
  1296. .ba-rm .c .sub{font-size:11.5px;color:var(--muted);margin-top:-2px}
  1297. .ba-rm .c .v small{font-size:11px;color:var(--muted);margin-right:4px}
  1298. .ba-rm .c .v .ba-rk{align-self:center}
  1299. .ba-rm .c.na{background:transparent;border:1px dashed var(--line);color:var(--faint);font-size:16px}
  1300. .yd{display:grid;grid-template-columns:repeat(10,7px);gap:3px}
  1301. .yd i{width:7px;height:7px;border-radius:50%;background:rgba(255,255,255,.1)}
  1302. .yd i.on{background:var(--rc,var(--amber))}
  1303. .ba-rm .fx{border:1px solid var(--line);border-radius:9px;background:rgba(10,12,8,.55);padding:8px 11px;display:grid;gap:5px;align-content:center}
  1304. .ba-rm .fx p{margin:0;font-size:12px;line-height:1.55;color:var(--text)}
  1305. .ba-rm .fx p b{color:var(--amber);margin-right:6px;font-weight:700}
  1306. .ba-rm .fx p.mut{color:var(--faint)}
  1307. .ba-rm .hd.fx{border:0;background:none;padding:4px 8px}
  1308. /* 03 病虫害三因子时间轴(10.28 二版:全称因子 / 横向滑动 / 低风险弱化) */
  1309. .ba-pt-wrap{overflow-x:auto;padding-bottom:6px;scrollbar-color:var(--line-hi) transparent}
  1310. .ba-pt{display:grid;grid-template-columns:136px repeat(var(--ns),160px) 104px;gap:6px;width:max-content;position:relative}
  1311. .ba-pt .hd{font-size:11.5px;color:var(--muted);padding:2px 4px;align-self:end}
  1312. .ba-pt .hd.st{display:grid;gap:2px;border-bottom:2px solid var(--line-hi);padding-bottom:6px}
  1313. .ba-pt .hd.st b{color:var(--text);font-size:12.5px;font-weight:700;white-space:nowrap}
  1314. .ba-pt .hd.st em{font-style:normal;font-size:11px;height:16px;line-height:16px}
  1315. .ba-pt .hd.st.key{border-bottom-color:var(--amber)}
  1316. .ba-pt .hd.st.key em{color:var(--amber-ink);background:var(--amber);border-radius:4px;padding:0 5px;justify-self:start;font-weight:700}
  1317. .ba-pt .lb{position:sticky;left:0;z-index:2;display:flex;flex-direction:column;justify-content:center;gap:6px;padding:8px 10px;border:1px solid var(--line-hi);border-radius:8px;background:#1a1d14;box-shadow:0 0 0 5px #11140d,12px 0 10px -6px rgba(0,0,0,.7)}
  1318. .ba-pt .lb b{font-size:13.5px;color:var(--text)}
  1319. .ba-pt .lb .ba-rk{align-self:flex-start}
  1320. .ba-pt .hd.lb{border:0;border-radius:0;background:#11140d;box-shadow:0 0 0 5px #11140d;align-self:stretch;justify-content:flex-end;padding:2px 4px 8px}
  1321. .ba-pt .c{border:1px solid color-mix(in srgb,var(--rc) 50%,transparent);border-top:3px solid var(--rc);border-radius:8px;background:color-mix(in srgb,var(--rc) 11%,rgba(10,12,8,.6));padding:8px 10px 9px;display:grid;gap:7px;align-content:start;cursor:default}
  1322. .ba-pt .c .t{display:flex;align-items:center;justify-content:space-between;gap:6px}
  1323. .ba-pt .c .t .num{font-size:17px;color:var(--text);font-weight:800}
  1324. .ba-pt .c .sub{font-size:11px;color:var(--muted);text-align:right;margin-top:-6px}
  1325. .ba-pt .c.lo .sub{color:var(--faint)}
  1326. .ba-pt .c dl{margin:0;display:grid;gap:3px}
  1327. .ba-pt .c dl div{display:flex;justify-content:space-between;align-items:baseline;font-size:12px;line-height:1.5}
  1328. .ba-pt .c dt{color:var(--muted)}
  1329. .ba-pt .c dd{margin:0;font-weight:800;color:var(--rc)}
  1330. .ba-pt .c.lo{border:1px solid var(--line);border-top:1px solid var(--line);background:rgba(255,255,255,.015)}
  1331. .ba-pt .c.lo .ba-rk{background:transparent;color:#e3c14b;border:1px solid rgba(227,193,75,.45);text-shadow:none}
  1332. .ba-pt .c.lo .t .num{color:var(--muted)}
  1333. .ba-pt .c.lo dt{color:var(--faint)}
  1334. .ba-pt .c.lo dd{color:var(--muted)!important;font-weight:600}
  1335. .ba-pt .c.na{border:1px dashed rgba(255,255,255,.06);background:transparent}
  1336. .ba-pt .yr{display:flex;flex-direction:column;align-items:center;gap:4px;align-self:center;padding:6px 4px}
  1337. .ba-pt .yr b small{font-size:13px;margin-left:1px}
  1338. .ba-pt .yr .sub{font-size:11px;color:var(--muted)}
  1339. .ba-pt .yr b{font-size:22px;font-weight:800;color:var(--text);line-height:1}
  1340. .ba-pt .yr small{font-size:11px;color:var(--muted)}
  1341. .ba-pt .hd.yr{padding:2px 4px;justify-content:center}
  1342. /* 04 照片链接 */
  1343. .ba-ph{appearance:none;border:1px solid var(--line-hi);background:rgba(255,212,137,.06);color:var(--amber);font:inherit;font-size:12px;font-weight:700;border-radius:6px;padding:2px 9px;cursor:pointer;white-space:nowrap}
  1344. .ba-ph:hover{border-color:var(--amber);background:rgba(255,212,137,.14)}
  1345. .ba-ph:focus-visible{outline:2px solid var(--amber);outline-offset:2px}
  1346. .ba-ph.all{margin-left:auto;padding:4px 12px}
  1347. /* 总结段落 + 三栏 */
  1348. #tab-dossier .ba-desc2 .sumbox{border:1px solid rgba(255,212,137,.3);border-radius:10px;background:rgba(255,212,137,.06);padding:10px 14px;margin:8px 0 10px}
  1349. #tab-dossier .ba-desc2 .sumbox h5{border-bottom:0;padding-bottom:0;margin-bottom:5px}
  1350. #tab-dossier .ba-desc2 .sumbox p.sum{margin:0;font-size:13px;line-height:1.85;color:var(--text)}
  1351. .ba-pt .hd.st em.ph{visibility:hidden}
  1352. .card .nm .rtag{font-style:normal;font-size:10px;font-weight:800;color:#1a1204;background:var(--amber,#ffd489);border-radius:3px;padding:0 4px;margin-right:5px;vertical-align:1px}
  1353. .vw-metric-title{margin:16px 0 8px;padding-top:12px;border-top:1px solid var(--line);font-size:15px;color:var(--amber)}/* ===================== 农事作业 ===================== */
  1354. #tab-farm,#farmPage{gap:12px}
  1355. .d-tabs[hidden]{display:none!important}
  1356. .fm-lg{display:flex;align-items:center;gap:12px;flex-wrap:wrap;font-size:12px;color:var(--text)}
  1357. .fm-lg span{display:inline-flex;align-items:center;gap:5px;white-space:nowrap}
  1358. .fm-lg hr{width:1px;height:14px;border:0;background:var(--line-hi);margin:0}
  1359. .fm-dot{display:inline-grid;place-items:center;width:18px;height:18px;border-radius:50%;font-size:10.5px;font-weight:800;font-style:normal;background:var(--c);color:#10130b;border:2px solid var(--c);box-sizing:border-box;line-height:1}
  1360. .fm-dot.sy{background:transparent;color:var(--c)}
  1361. /* 时间轴 */
  1362. .fm-tlb{display:grid;grid-template-columns:96px minmax(0,1fr);border-top:1px solid var(--line)}
  1363. .fm-tll{display:grid;grid-template-rows:34px 30px repeat(4,34px) 28px;border-right:1px solid var(--line)}
  1364. .fm-tll div{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:700;padding-right:8px}
  1365. .fm-tll small{font-size:10.5px;color:var(--faint);font-weight:500}
  1366. .fm-tlc{position:relative;height:262px;margin:0 12px 0 8px}
  1367. .fm-tlc>*{position:absolute}
  1368. .fm-row{left:0;right:0;height:34px;border-bottom:1px dashed rgba(75,66,35,.45)}
  1369. .fm-st{top:5px;height:24px;border:1px solid var(--line-hi);background:rgba(255,212,137,.05);border-radius:5px;font-size:11.5px;color:var(--muted);display:flex;align-items:center;padding:0 6px;overflow:hidden;white-space:nowrap;box-sizing:border-box}
  1370. .fm-st.cur{border-color:var(--amber);color:var(--amber);background:rgba(255,212,137,.1);font-weight:700}
  1371. .fm-fl{top:46px;width:3px;height:14px;border-radius:2px;background:var(--amber);transform:translateX(-1px);opacity:.85}
  1372. .fm-fl.fu{background:none;border:1px solid var(--muted);width:2px;opacity:.6}
  1373. .fm-mk{width:22px;height:22px;transform:translate(-11px,0);border-radius:50%;border:2px solid var(--c);background:var(--c);color:#10130b;font-size:11px;font-weight:800;padding:0;display:grid;place-items:center;cursor:pointer;z-index:2;transition:transform .12s,opacity .12s}
  1374. .fm-mk.sy{background:var(--panel);color:var(--c)}
  1375. .fm-mk:hover,.fm-mk:focus-visible{transform:translate(-11px,0) scale(1.25);z-index:3;outline:none;box-shadow:0 0 0 3px rgba(255,212,137,.35)}
  1376. .fm-mk.dim{opacity:.18}
  1377. .fm-today{top:0;height:236px;border-left:1.5px dashed var(--amber);z-index:1}
  1378. .fm-today span{position:absolute;top:-1px;left:3px;background:var(--amber);color:var(--amber-ink);font-size:10px;font-weight:800;border-radius:3px;padding:0 4px;white-space:nowrap}
  1379. .fm-ax{top:236px;left:0;right:0;height:1px;background:var(--muted)}
  1380. .fm-tk{top:240px;font-size:11px;color:var(--muted);transform:translateX(-50%);font-family:var(--f-num);white-space:nowrap}
  1381. .fm-tk b{color:var(--text)}
  1382. /* 列表 */
  1383. .fm-filters{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
  1384. .fm-filters select{width:auto;max-width:320px}
  1385. .fm-filters .cnt{color:var(--muted);font-size:12px;margin-left:4px}
  1386. .fm-filters .btn-amber{margin-left:auto;font-size:13px;padding:7px 14px}
  1387. .fm-tbl{width:100%;border-collapse:collapse;font-size:13px}
  1388. .fm-tbl th{text-align:left;color:var(--muted);font-weight:700;font-size:12px;padding:8px 10px;border-bottom:1px solid var(--line-hi);white-space:nowrap}
  1389. .fm-tbl td{padding:10px;border-bottom:1px solid var(--line);vertical-align:middle}
  1390. .fm-tbl tbody tr{cursor:pointer;transition:background .12s}
  1391. .fm-tbl tbody tr:hover{background:rgba(255,212,137,.06)}
  1392. .fm-tbl tbody tr.hl{background:rgba(255,212,137,.12);box-shadow:inset 3px 0 0 var(--amber)}
  1393. .fm-tbl .d{font-family:var(--f-num);font-weight:700;white-space:nowrap}
  1394. .fm-tbl .sub{display:block;color:var(--faint);font-size:11.5px;margin-top:2px}
  1395. .fm-tbl .go{color:var(--amber);font-weight:700;white-space:nowrap;font-size:12.5px}
  1396. .fm-ty{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;font-weight:700}
  1397. .fm-tag{display:inline-block;border-radius:5px;padding:2px 8px;font-size:11.5px;font-weight:800;white-space:nowrap}
  1398. .fm-tag.tr{background:var(--amber);color:var(--amber-ink)}
  1399. .fm-tag.sy{border:1px solid var(--line-hi);color:var(--muted)}
  1400. .fm-res{display:inline-flex;align-items:center;gap:6px;font-size:12.5px;white-space:nowrap}
  1401. .fm-res i{width:8px;height:8px;border-radius:50%;background:var(--rc);flex:none}
  1402. .fm-res b{color:var(--rc)}
  1403. .fm-res em{font-style:normal;color:var(--muted)}
  1404. .fm-empty{color:var(--faint);text-align:center;padding:36px 10px;font-size:13px}
  1405. .fm-scroll{overflow-x:auto}
  1406. /* 详情页 */
  1407. .fm-pg-top{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
  1408. .fm-pg-top h2{margin:0;font-size:20px;font-weight:800;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
  1409. .fm-pg-top h2 .fm-dot{width:28px;height:28px;font-size:14px}
  1410. .fm-pg-nav{margin-left:auto;display:flex;gap:6px}
  1411. .fm-pg-nav .btn{padding:6px 12px;font-size:12.5px}
  1412. .fm-pg-nav .btn:disabled{opacity:.35;cursor:not-allowed}
  1413. .fm-back{font-weight:700;color:var(--amber);border-color:rgba(255,212,137,.5)}
  1414. .fm-back:hover{background:var(--amber);color:var(--amber-ink)}
  1415. .fm-g2{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:12px;align-items:stretch}
  1416. .fm-kv{display:grid;grid-template-columns:auto minmax(0,1fr);gap:7px 16px;margin:0;font-size:13px}
  1417. .fm-kv dt{color:var(--muted);white-space:nowrap}
  1418. .fm-kv dd{margin:0;font-weight:600;overflow-wrap:anywhere}
  1419. .fm-kv dd.num{font-family:var(--f-num)}
  1420. .fm-sep{grid-column:1/-1;height:1px;background:var(--line);margin:3px 0}
  1421. .fm-site{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:12px}
  1422. .fm-site figure{margin:0;border:1px solid var(--line);border-radius:8px;overflow:hidden;position:relative}
  1423. .fm-site img{display:block;width:100%;aspect-ratio:16/9;object-fit:cover}
  1424. .fm-site figcaption{position:absolute;left:6px;bottom:6px;background:rgba(10,12,8,.78);font-size:11px;border-radius:4px;padding:1px 6px;color:var(--text)}
  1425. .fm-cap{font-size:12px;color:var(--muted);font-weight:700;margin-top:12px}
  1426. .fm-verdict{display:flex;align-items:center;gap:18px;flex-wrap:wrap;border:1px solid var(--line-hi);border-radius:12px;padding:14px 18px;background:linear-gradient(120deg,rgba(35,40,25,.95),rgba(16,19,12,.95));position:relative;overflow:hidden}
  1427. .fm-verdict::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--rc)}
  1428. .fm-verdict .lab{font-size:12px;color:var(--muted);font-weight:700}
  1429. .fm-verdict .big{font-size:24px;font-weight:800;color:var(--rc);line-height:1.2}
  1430. .fm-verdict .net{font-family:var(--f-num);font-size:30px;font-weight:700;color:var(--text);line-height:1.1}
  1431. .fm-verdict .net small{font-size:14px;color:var(--muted);margin-left:3px}
  1432. .fm-verdict .rel{font-size:12px;color:var(--muted)}
  1433. .fm-verdict .div{width:1px;align-self:stretch;background:var(--line-hi)}
  1434. .fm-sumtx{font-size:13px;line-height:1.85;margin:12px 0 0;color:var(--text)}
  1435. .fm-sumtx b{color:var(--amber)}
  1436. .fm-mini{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
  1437. .fm-mini span{border:1px solid var(--line);border-radius:7px;padding:4px 10px;font-size:12px;color:var(--muted)}
  1438. .fm-mini span b{color:var(--text);font-family:var(--f-num);font-size:14px;margin-left:3px}
  1439. .fm-warn{margin:12px 0 0;padding:0;list-style:none;display:grid;gap:6px}
  1440. .fm-warn li{border:1px solid rgba(240,165,49,.45);background:rgba(240,165,49,.08);border-radius:7px;padding:6px 10px 6px 34px;font-size:12.5px;line-height:1.7;display:block;position:relative}
  1441. .fm-warn li::before{content:"!";flex:none;width:16px;height:16px;border-radius:50%;background:var(--sev-light);color:#1a1204;font-weight:900;font-size:11px;display:grid;place-items:center;position:absolute;left:10px;top:9px}
  1442. .fm-warn li.ok{border-color:rgba(76,194,126,.4);background:rgba(76,194,126,.07)}
  1443. .fm-warn li.ok::before{content:"✓";background:var(--w-ok)}
  1444. .fm-advice{margin-top:12px;font-size:12.5px;color:var(--muted);line-height:1.7;border-top:1px dashed var(--line-hi);padding-top:10px}
  1445. .fm-advice b{color:var(--text)}
  1446. /* 关联飞巡轨道 */
  1447. .fm-track{display:flex;align-items:stretch;gap:8px;overflow-x:auto;padding:2px 2px 6px;scrollbar-width:thin}
  1448. .fm-fc{flex:none;min-width:118px;border:1px solid var(--line-hi);border-radius:9px;background:var(--panel-2);padding:7px 11px;text-align:left;display:grid;gap:2px;font-size:12px;color:var(--muted)}
  1449. .fm-fc b{font-family:var(--f-num);font-size:16px;color:var(--text)}
  1450. .fm-fc em{font-style:normal;font-size:11px}
  1451. .fm-fc.pre{border-color:var(--c-cash);border-style:dashed}
  1452. .fm-fc.pre em{color:var(--c-cash);font-weight:700}
  1453. .fm-fc.post{cursor:pointer}
  1454. .fm-fc.post:hover{border-color:var(--amber)}
  1455. .fm-fc.on{background:var(--amber);border-color:var(--amber);color:var(--amber-ink)}
  1456. .fm-fc.on b,.fm-fc.on em{color:var(--amber-ink)}
  1457. .fm-fc.job{border:2px solid var(--c);background:rgba(255,255,255,.03);color:var(--text)}
  1458. .fm-fc.job b{color:var(--c)}
  1459. .fm-fc.next{border-style:dotted;opacity:.75}
  1460. .fm-arrow{flex:none;align-self:center;color:var(--faint);font-size:16px}
  1461. /* 指标对比表 */
  1462. .fm-it{width:100%;border-collapse:collapse;font-size:13px}
  1463. .fm-it th{text-align:right;color:var(--muted);font-weight:700;font-size:12px;padding:8px 10px;border-bottom:1px solid var(--line-hi);white-space:nowrap}
  1464. .fm-it th:first-child,.fm-it td:first-child{text-align:left}
  1465. .fm-it td{text-align:right;padding:9px 10px;border-bottom:1px solid var(--line);font-family:var(--f-num);font-size:14px;white-space:nowrap}
  1466. .fm-it td:first-child{font-family:inherit;font-size:13px;font-weight:700}
  1467. .fm-it tbody tr{cursor:pointer}
  1468. .fm-it tbody tr:hover{background:rgba(255,212,137,.05)}
  1469. .fm-it tbody tr.on{background:rgba(255,212,137,.1);box-shadow:inset 3px 0 0 var(--amber)}
  1470. .fm-it .arr{color:var(--faint);margin:0 4px}
  1471. .fm-it .dl{font-size:12px;color:var(--muted);margin-left:6px}
  1472. .fm-it .net{font-weight:700;font-size:15px}
  1473. .fm-it .rel-tag{display:inline-block;font-family:inherit;font-size:10.5px;font-weight:800;color:var(--amber);border:1px solid rgba(255,212,137,.5);border-radius:4px;padding:0 5px;margin-left:6px;vertical-align:1px}
  1474. .fm-it .ex{color:var(--amber)}
  1475. .fm-it .ct{color:var(--c-cash)}
  1476. .fm-note{font-size:11.5px;color:var(--faint);margin-top:8px;line-height:1.6}
  1477. /* 曲线 + 照片 */
  1478. .fm-cvsub{display:flex;gap:14px;font-size:11.5px;color:var(--muted);flex-wrap:wrap;margin-bottom:4px}
  1479. .fm-cvsub i{display:inline-block;width:18px;height:0;border-top:2px solid;vertical-align:middle;margin-right:4px}
  1480. .fm-cvsub i.box{height:10px;width:14px;border:0;background:rgba(255,212,137,.16)}
  1481. .fm-svg{width:100%;height:auto;display:block}
  1482. .fm-ph-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
  1483. .fm-pcol{border:1px solid var(--line);border-radius:10px;padding:10px;background:var(--panel)}
  1484. .fm-pcol h4{margin:0 0 8px;display:flex;align-items:center;gap:8px;font-size:13.5px}
  1485. .fm-pcol h4 .role{border-radius:5px;padding:2px 9px;font-size:12px;font-weight:800}
  1486. .fm-pcol h4 .role.exp{background:var(--amber);color:var(--amber-ink)}
  1487. .fm-pcol h4 .role.ctl{color:var(--c-cash);border:1px dashed var(--c-cash)}
  1488. .fm-pcol h4 .avg{margin-left:auto;font-weight:500;color:var(--muted);font-size:12px}
  1489. .fm-pcol h4 .avg b{font-family:var(--f-num);color:var(--text);font-size:14px}
  1490. .fm-pg{display:grid;grid-template-columns:1fr 1fr;gap:8px}
  1491. .fm-pg .hd{font-size:12px;font-weight:700;color:var(--muted);display:flex;justify-content:space-between}
  1492. .fm-pg .hd b{font-family:var(--f-num);color:var(--text)}
  1493. .fm-pg button{position:relative;border:1px solid var(--line);border-radius:8px;overflow:hidden;padding:0;background:none;cursor:pointer}
  1494. .fm-pg button:hover{border-color:var(--amber)}
  1495. .fm-pg img{display:block;width:100%;aspect-ratio:4/3;object-fit:cover}
  1496. .fm-pg .cap{position:absolute;left:0;right:0;bottom:0;display:flex;justify-content:space-between;padding:3px 7px;background:linear-gradient(transparent,rgba(0,0,0,.78));font-size:11px;color:#ddd}
  1497. .fm-pg .cap b{font-family:var(--f-num);color:#fff}
  1498. .fm-wait{color:var(--faint);font-size:13px;text-align:center;padding:40px 10px;line-height:1.9}
  1499. .fm-wait b{color:var(--amber)}
  1500. /* 录入弹窗 */
  1501. .fm-form{width:min(820px,100%)}
  1502. .fm-form .nz-f textarea{background:var(--panel-2);border:1px solid var(--line-hi);border-radius:8px;padding:8px 10px;font-size:14px;color:var(--text);min-height:58px;resize:vertical;font:inherit}
  1503. .viewer .fm-form .nz-f select{width:100%;height:36px;line-height:34px;font-size:14px}
  1504. .fm-form .nz-f input:disabled{opacity:.5}
  1505. .fm-g{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px 14px}
  1506. .fm-sec{border:1px solid var(--line);border-radius:10px;padding:12px 14px;display:grid;gap:12px;background:rgba(255,255,255,.015)}
  1507. .fm-sec>h4{margin:0;font-size:13px;color:var(--amber);display:flex;align-items:center;gap:8px}
  1508. .fm-req{color:var(--w-red);margin-left:2px}
  1509. .fm-scope{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
  1510. .viewer .fm-scope select{height:34px;line-height:32px;font-size:13px;max-width:320px}
  1511. .fm-hint{font-size:12px;line-height:1.6;border-radius:7px;padding:7px 10px;border:1px solid var(--line-hi);color:var(--muted)}
  1512. .fm-hint.tr{border-color:rgba(255,212,137,.5);background:rgba(255,212,137,.07);color:var(--text)}
  1513. .fm-typechips .chip-btn{display:inline-flex;align-items:center;gap:6px;font-size:13px;padding:6px 14px}
  1514. /* 详情页 v3:摘要行 / 结论三栏 / 曲线选窗口 / 照片网格(同表型采集) */
  1515. .fm-sumline{display:flex;align-items:center;gap:12px;flex-wrap:wrap;border:1px solid var(--line);border-radius:10px;background:rgba(16,19,12,.92);padding:9px 14px;font-size:13px}
  1516. .fm-sumline .segs{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0;color:var(--text)}
  1517. .fm-sumline .segs>i{font-style:normal;color:var(--faint)}
  1518. .fm-sumline .segs b{color:var(--amber)}
  1519. .fm-sumline .segs em{font-style:normal;color:var(--muted)}
  1520. .fm-detbtn{margin-left:auto;border:1px solid var(--line-hi);background:none;border-radius:7px;padding:4px 12px;font-size:12.5px;color:var(--amber);font-weight:700;white-space:nowrap}
  1521. .fm-detbtn:hover{border-color:var(--amber)}
  1522. .fm-det{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:22px;align-items:start;border:1px solid var(--line);border-top:0;border-radius:0 0 10px 10px;margin-top:-14px;padding:14px;background:rgba(16,19,12,.92)}
  1523. .fm-det .fm-kv2{border-left:1px solid var(--line);padding-left:22px}
  1524. .fm-det .fm-site{margin-top:0;align-self:start}
  1525. .fm-wait.sm{padding:12px 16px;text-align:left;border:1px dashed var(--line-hi);border-radius:10px;font-size:13px;line-height:1.8}
  1526. .fm-r3{display:grid;grid-template-columns:minmax(220px,.75fr) minmax(0,1.6fr) minmax(0,1.05fr);gap:18px;align-items:stretch}
  1527. .fm-r3>div{min-width:0}
  1528. .fm-r3c{border-left:1px solid var(--line);padding-left:18px}
  1529. .fm-colh{font-size:12.5px;font-weight:800;color:var(--muted);margin-bottom:6px;display:flex;align-items:baseline;gap:8px}
  1530. .fm-colh span{font-weight:500;font-size:11.5px;color:var(--faint)}
  1531. .fm-r3 .fm-warn{margin-top:0}
  1532. .fm-r3 .fm-it td{padding:8px 8px;font-size:13.5px}
  1533. .fm-r3 .fm-it th{padding:6px 8px}
  1534. .fm-vc{height:100%;box-sizing:border-box;border:1px solid var(--line-hi);border-radius:12px;padding:14px 16px;background:linear-gradient(140deg,rgba(35,40,25,.95),rgba(16,19,12,.95));position:relative;overflow:hidden}
  1535. .fm-vc::before{content:"";position:absolute;left:0;top:0;bottom:0;width:4px;background:var(--rc,var(--muted))}
  1536. .fm-vc .lab{font-size:12px;color:var(--muted);font-weight:700}
  1537. .fm-vc .big{font-size:26px;font-weight:800;color:var(--rc);line-height:1.25}
  1538. .fm-vc.sync .big{color:var(--text);font-size:22px}
  1539. .fm-vc .net{font-family:var(--f-num);font-size:32px;font-weight:700;line-height:1.1}
  1540. .fm-vc .net small{font-size:14px;color:var(--muted);margin-left:3px}
  1541. .fm-vc .rel{font-size:12px;color:var(--muted);margin-top:2px}
  1542. .fm-vc .pair{display:grid;gap:2px;font-family:var(--f-num);font-size:20px;font-weight:700;margin-top:2px}
  1543. .fm-vc .pair .e{color:var(--amber)}.fm-vc .pair .c{color:var(--c-cash)}
  1544. .fm-hit{fill:transparent;cursor:pointer;outline:none}
  1545. .fm-hit:hover,.fm-hit:focus-visible{fill:rgba(255,212,137,.12)}
  1546. .fm-hit.on{fill:rgba(255,212,137,.06)}
  1547. .fm-prow{display:grid;grid-template-columns:52px minmax(0,1fr);gap:8px;align-items:center}
  1548. .fm-prow+.fm-prow{margin-top:8px}
  1549. .fm-plab{font-size:12px;font-weight:800;color:var(--muted);display:grid;gap:2px;text-align:center;border-radius:7px;padding:8px 2px;border:1px solid var(--line)}
  1550. .fm-plab b{font-family:var(--f-num);color:var(--text);font-size:13px}
  1551. .fm-plab.post{border-color:rgba(255,212,137,.6);color:var(--amber)}
  1552. .fm-dlt{font-style:normal;font-family:var(--f-num);color:var(--text);margin-left:8px;border:1px solid var(--line-hi);border-radius:5px;padding:0 6px;font-size:12px}
  1553. #farmPage .chip-btn:disabled{opacity:.35}
  1554. .fm-win{display:inline-flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12.5px;color:var(--muted)}
  1555. .fm-win b{color:var(--text);font-family:var(--f-num)}
  1556. .fm-win i{font-style:normal;color:var(--faint)}
  1557. .fm-win label{color:var(--text);font-weight:700}
  1558. .fm-win em{font-style:normal;color:var(--faint);font-size:11.5px}
  1559. .fm-hit:hover{fill:rgba(255,212,137,.16)!important;stroke:rgba(255,212,137,.6);stroke-dasharray:3 3}
  1560. @media(max-width:1300px){.fm-r3{grid-template-columns:minmax(220px,.8fr) minmax(0,1.6fr)}.fm-r3c{grid-column:1/-1;border-left:0;padding-left:0;border-top:1px solid var(--line);padding-top:12px}.fm-det{grid-template-columns:1fr 1fr}.fm-det .fm-site{grid-column:1/-1;max-width:420px}}
  1561. @media(max-width:1100px){.fm-r3{grid-template-columns:1fr}.fm-det{grid-template-columns:1fr}.fm-det .fm-kv2{border-left:0;padding-left:0}}
  1562. @media(max-width:1300px){.fm-info{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.fm-info .fm-site{grid-column:1/-1;max-width:420px}}
  1563. @media(max-width:1100px){.fm-g2{grid-template-columns:1fr}.fm-ph-grid{grid-template-columns:1fr}.fm-ph4{grid-template-columns:1fr}.fm-res2{grid-template-columns:1fr}.fm-res2>.fm-step+.fm-step{border-left:0;padding-left:0}.fm-info{grid-template-columns:1fr}.fm-info .fm-kv2{border-left:0;padding-left:0}}
  1564. @media(max-width:720px){.fm-g{grid-template-columns:1fr}.fm-tlb{grid-template-columns:70px minmax(0,1fr)}}
  1565. #app{height:100%;margin:0}
  1566. html,body,#app{height:100%}