style.css 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. /* 门店检测工作台 —— 视觉系统
  2. 香槟金画布 + 白卡片 + 金描边;金色渐变主操作 + 暖棕文字;数据色保留语义可读性 */
  3. :root{
  4. --bg:#f8f4ea;
  5. --surface:#ffffff;
  6. --line:#ecdfc2;
  7. --line-soft:#f6efe0;
  8. --ink:#211a10;
  9. --ink-2:#5c5241;
  10. --ink-3:#93876f;
  11. --ink-4:#bcb09a;
  12. --gold:#c8952c;
  13. --gold-deep:#a4761c;
  14. --gold-soft:#f1e2bc;
  15. --gold-bg:#fbf4e2;
  16. --grad-gold:linear-gradient(135deg,#eab94e 0%,#d29a29 48%,#b57e15 100%);
  17. --brass:#a4761c;
  18. --brass-bg:#fbf1da;
  19. --accent:#c08f22;
  20. --ok:#5f8d72;
  21. --r-sm:8px; --r-md:12px; --r-lg:16px;
  22. --shadow-1:0 1px 2px rgba(120,90,20,.05);
  23. --shadow-2:0 10px 30px rgba(120,90,20,.10);
  24. }
  25. *{box-sizing:border-box;margin:0;padding:0}
  26. body{color:var(--ink);
  27. background:
  28. radial-gradient(1100px 400px at 12% -140px,rgba(234,185,78,.20),transparent 68%),
  29. radial-gradient(900px 360px at 88% -80px,rgba(234,185,78,.13),transparent 66%),
  30. radial-gradient(700px 500px at 50% 108%,rgba(234,185,78,.07),transparent 70%),
  31. var(--bg);
  32. background-attachment:fixed;
  33. font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  34. font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}
  35. .wrap{max-width:1400px;margin:0 auto;padding:40px 36px 88px 72px}
  36. /* ---------- 顶部 ---------- */
  37. header{position:relative;display:flex;align-items:flex-start;justify-content:space-between;gap:20px;flex-wrap:nowrap;
  38. padding-bottom:20px;border-bottom:1px solid var(--line)}
  39. header::after{content:"";position:absolute;left:0;right:0;bottom:-1px;height:1.5px;
  40. background:linear-gradient(90deg,var(--gold) 0%,rgba(200,149,44,.35) 26%,rgba(200,149,44,0) 62%)}
  41. .hleft{min-width:0;flex:1 1 auto}
  42. .htop{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
  43. .hsub{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:7px;color:var(--ink-3);font-size:13px;letter-spacing:.1px}
  44. .hsub span+span::before{content:"·";margin-right:10px;color:#d8c9a2}
  45. h1{font-size:21px;font-weight:600;letter-spacing:-.2px;line-height:1.3}
  46. .brand{background:var(--grad-gold);color:#fff;font-weight:600;font-size:12.5px;padding:4px 12px;
  47. border-radius:6px;letter-spacing:.8px;white-space:nowrap;
  48. box-shadow:0 2px 8px rgba(180,126,21,.28),inset 0 1px 0 rgba(255,255,255,.35)}
  49. .sub{color:var(--ink-3);font-size:13px;letter-spacing:.1px}
  50. .period{appearance:none;border:1px solid var(--line);background:var(--surface);border-radius:var(--r-sm);
  51. padding:7px 30px 7px 12px;font-size:14px;font-family:inherit;color:var(--ink);outline:none;cursor:pointer;
  52. font-weight:500;
  53. background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M1 1l4 4 4-4' fill='none' stroke='%23a4761c' stroke-width='1.5'/></svg>");
  54. background-repeat:no-repeat;background-position:right 11px center;transition:border-color .15s,box-shadow .15s}
  55. .period:hover{border-color:var(--gold)}
  56. .period:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(200,149,44,.14)}
  57. /* ---------- KPI ---------- */
  58. .kpis{display:grid;grid-template-columns:repeat(5,1fr);gap:14px;margin:26px 0 14px}
  59. .kpi{position:relative;overflow:hidden;background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);
  60. padding:16px 17px 14px;cursor:pointer;transition:border-color .15s,box-shadow .15s,transform .15s;
  61. box-shadow:var(--shadow-1)}
  62. .kpi::before{content:"";position:absolute;top:0;left:0;right:0;height:2.5px;background:var(--grad-gold);
  63. opacity:.5;transition:opacity .18s}
  64. .kpi:hover{border-color:#e2cfa3;box-shadow:var(--shadow-2);transform:translateY(-1px)}
  65. .kpi:hover::before{opacity:1}
  66. .kpi .v{font-size:26px;font-weight:600;letter-spacing:-.6px;font-variant-numeric:tabular-nums;white-space:nowrap;line-height:1.25}
  67. .kpi .v .u{font-size:13.5px;font-weight:500;color:var(--ink-3);letter-spacing:0;margin-left:4px}
  68. .kpi .l{color:var(--ink-3);font-size:13px;margin-top:3px;letter-spacing:.1px}
  69. .kpi.hot .v{color:#ab4a26}
  70. .kpi.on{border-color:var(--gold-deep);background:var(--gold-bg);box-shadow:inset 0 0 0 1px var(--gold-deep)}
  71. .kpi.on::before{opacity:1}
  72. .kpi.on .v{color:#8a5f0c}
  73. .kpi.hot.on{border-color:#ab4a26;box-shadow:inset 0 0 0 1px #ab4a26}
  74. .kpi.hot.on .v{color:#ab4a26}
  75. /* ---------- 图表 ---------- */
  76. .charts{display:grid;grid-template-columns:1fr 1fr 1fr;gap:12px;margin-bottom:12px}
  77. .panel{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-md);padding:22px 24px;box-shadow:var(--shadow-1)}
  78. .panel h3{font-size:13.5px;font-weight:500;color:var(--ink-2);letter-spacing:.3px;margin-bottom:8px;
  79. display:flex;align-items:center;gap:7px}
  80. .panel h3::before{content:"";width:3px;height:11px;border-radius:2px;background:var(--grad-gold)}
  81. .chart{height:290px}
  82. /* ---------- 筛选栏 ---------- */
  83. .bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:20px 0 12px}
  84. .bar input,.bar select{background:var(--surface);border:1px solid var(--line);color:var(--ink);border-radius:var(--r-sm);
  85. padding:8px 12px;font-size:14px;outline:none;font-family:inherit;transition:border-color .15s,box-shadow .15s}
  86. .bar input::placeholder{color:var(--ink-4)}
  87. .bar input:hover,.bar select:hover{border-color:#e0caa0}
  88. .bar input:focus,.bar select:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(200,149,44,.13)}
  89. .bar input{width:230px}
  90. .bar select{max-width:190px;appearance:none;padding-right:28px;
  91. background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='6'><path d='M1 1l4 4 4-4' fill='none' stroke='%23a4761c' stroke-width='1.5'/></svg>");
  92. background-repeat:no-repeat;background-position:right 11px center;background-color:var(--surface)}
  93. .bar .sub{margin-left:auto;font-variant-numeric:tabular-nums}
  94. /* ---------- 表格 ---------- */
  95. table{width:100%;border-collapse:collapse;font-size:14.5px}
  96. th{color:#8a7548;font-weight:600;font-size:13px;letter-spacing:.4px;padding:12px 8px;
  97. background:#fdf9ee;border-bottom:1px solid #e8d8b2;text-align:left;white-space:nowrap;user-select:none}
  98. th:first-child{border-top-left-radius:8px}
  99. th:last-child{border-top-right-radius:8px}
  100. th.num,td.num{text-align:right;font-variant-numeric:tabular-nums}
  101. td{padding:13px 8px;border-bottom:1px solid var(--line-soft);vertical-align:middle}
  102. .tablewrap{overflow-x:auto}
  103. td.num,th.num{white-space:nowrap}
  104. .cl-name{min-width:150px}
  105. .cl-city{white-space:nowrap;color:var(--ink-3);font-size:12.5px;padding-left:6px;padding-right:6px}
  106. .cl-tags{max-width:320px;min-width:200px}
  107. .muted{color:var(--ink-4);font-size:12px;font-weight:400}
  108. .cl-rank{white-space:nowrap}
  109. .good-text{color:#3f6d55;font-weight:600}
  110. .warn-text{color:#8a6a2f}
  111. .rankbox{margin:12px 0;padding:10px 12px;background:#fdfaf2;border:1px solid var(--line-soft);
  112. border-left:3px solid var(--gold);border-radius:0 8px 8px 0;font-size:12.5px;line-height:1.7;color:var(--ink-2)}
  113. .rankbox .rk{display:inline-block;font-size:11px;color:var(--gold-deep);background:var(--gold-bg);
  114. border-radius:4px;padding:0 6px;margin-right:8px}
  115. tr.row{transition:background .12s}
  116. tr.row:hover td{background:#fdf9f0;cursor:pointer}
  117. tr.row:last-child td{border-bottom:0}
  118. .nm{font-weight:500;color:var(--ink);letter-spacing:-.1px}
  119. .sid{color:var(--ink-4);font-size:12px;font-variant-numeric:tabular-nums;letter-spacing:.2px}
  120. .tag{display:inline-block;padding:1px 6px;border-radius:5px;font-size:11.5px;margin:1.5px 3px 1.5px 0;
  121. white-space:nowrap;letter-spacing:.1px;font-weight:500}
  122. .t-R3{background:#f7e0d7;color:#93401f}
  123. .t-R2{background:#fae3c4;color:#7d4d0c}
  124. .t-R1{background:#f7ecbe;color:#6f5610}
  125. .t-B{background:#f0e6d0;color:#5f4b28}
  126. .t-T{background:#efeade;color:#6b6150}
  127. .dot{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:7px;vertical-align:1px}
  128. .pager{display:flex;gap:8px;align-items:center;justify-content:flex-end;color:var(--ink-3);font-size:13px;padding:14px 4px 4px}
  129. .pager button{background:var(--surface);border:1px solid var(--line);color:var(--ink-2);border-radius:var(--r-sm);
  130. padding:5px 14px;cursor:pointer;font-family:inherit;font-size:13.5px;transition:border-color .15s,color .15s,background .15s}
  131. .pager button:hover{border-color:var(--gold);color:var(--gold-deep);background:var(--gold-bg)}
  132. .pager button:disabled{opacity:.35;cursor:default;border-color:var(--line);background:var(--surface)}
  133. /* ---------- 空态 ---------- */
  134. .empty{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:72px 24px;text-align:center;box-shadow:var(--shadow-1)}
  135. .empty-ic{font-size:32px;opacity:.55}
  136. .empty-t{font-size:16px;font-weight:600;margin-top:12px;letter-spacing:-.2px}
  137. .empty-d{color:var(--ink-3);font-size:14px;margin:8px auto 20px;max-width:520px;line-height:1.9}
  138. .empty code{background:var(--gold-bg);padding:1.5px 6px;border-radius:5px;font-size:13px;color:var(--gold-deep)}
  139. .primary{background:var(--grad-gold);border:1px solid #b57e15;color:#fff;font-weight:600;border-radius:var(--r-sm);
  140. padding:9px 18px;font-size:14px;cursor:pointer;font-family:inherit;letter-spacing:.2px;
  141. box-shadow:0 2px 9px rgba(181,126,21,.26),inset 0 1px 0 rgba(255,255,255,.3);transition:filter .15s,box-shadow .15s}
  142. .primary:hover{filter:brightness(1.05);box-shadow:0 4px 14px rgba(181,126,21,.34),inset 0 1px 0 rgba(255,255,255,.3)}
  143. .primary:disabled{opacity:.45;cursor:default;box-shadow:none}
  144. /* ---------- 左侧菜单 ---------- */
  145. .rail{position:fixed;left:14px;top:50%;transform:translateY(-50%);z-index:8;display:flex;flex-direction:column;gap:2px;
  146. background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:8px 5px;
  147. box-shadow:0 10px 30px rgba(150,110,20,.13)}
  148. .railitem{position:relative;background:none;border:0;cursor:pointer;font-family:inherit;font-size:13.5px;color:var(--ink-3);
  149. writing-mode:vertical-rl;letter-spacing:2.5px;padding:15px 6px;border-radius:9px;transition:background .15s,color .15s}
  150. .railitem:hover{background:var(--gold-bg);color:var(--gold-deep)}
  151. .railitem.on{background:var(--grad-gold);color:#fff;font-weight:600;box-shadow:0 2px 8px rgba(181,126,21,.28)}
  152. .railitem .rdot{position:absolute;top:7px;left:50%;margin-left:-2.5px;width:5px;height:5px;border-radius:50%;background:#ab4a26;display:none}
  153. .railitem.mod .rdot{display:block}
  154. .hright{display:flex;align-items:center;gap:12px;flex:0 0 auto;flex-wrap:nowrap}
  155. .huser{display:flex;align-items:center;gap:8px;padding:5px 6px 5px 5px;background:var(--surface);
  156. border:1px solid var(--line);border-radius:12px;box-shadow:var(--shadow-1)}
  157. .uavatar{width:26px;height:26px;border-radius:8px;background:var(--grad-gold);color:#fff;
  158. display:flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:600;flex:0 0 auto}
  159. .uinfo2{display:flex;flex-direction:column;line-height:1.25;margin-right:2px}
  160. .uinfo2 b{font-size:12.5px;font-weight:600;color:var(--ink-2)}
  161. .uinfo2 i{font-size:11px;font-style:normal;color:var(--ink-4)}
  162. .ubtn2{font-family:inherit;font-size:12.5px;padding:6px 11px;border-radius:8px;cursor:pointer;
  163. border:1px solid var(--line);background:#fff;color:var(--ink-2);transition:.15s;white-space:nowrap}
  164. .ubtn2:hover{border-color:var(--gold);background:var(--gold-bg);color:var(--gold-deep)}
  165. .ubtn2.danger{color:#a4462a}
  166. .ubtn2.danger:hover{border-color:#d98b74;background:#fdf0ea;color:#a4462a}
  167. /* ---------- 账号管理 ---------- */
  168. .urow{padding:12px 0;border-bottom:1px solid var(--line-soft)}
  169. .urow.off{opacity:.55}
  170. .uinfo{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
  171. .uinfo b{font-weight:600;color:var(--ink);font-size:13.5px}
  172. .uname{color:var(--ink-4);font-size:12px}
  173. .uoff{font-size:11px;color:#a4462a;background:#fdf0ea;border-radius:4px;padding:0 6px}
  174. .ume{font-size:11px;color:var(--gold-deep);background:var(--gold-bg);border-radius:4px;padding:0 6px}
  175. .uctl{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
  176. .urole{font-family:inherit;font-size:12.5px;padding:5px 8px;border:1px solid var(--line);
  177. border-radius:7px;background:#fff;color:var(--ink-2);cursor:pointer}
  178. .ubtn{font-family:inherit;font-size:12.5px;padding:5px 10px;border:1px solid var(--line);
  179. border-radius:7px;background:#fff;color:var(--ink-2);cursor:pointer;transition:.15s}
  180. .ubtn:hover{border-color:var(--gold);background:var(--gold-bg);color:var(--gold-deep)}
  181. .ubtn.danger:hover{border-color:#d98b74;background:#fdf0ea;color:#a4462a}
  182. .ubadge{font-size:11.5px;color:var(--ink-4);background:#f6f2e8;border:1px solid var(--line-soft);
  183. border-radius:7px;padding:4px 9px;line-height:1.4}
  184. .umeta{font-size:11.5px;color:var(--ink-4);margin-top:6px}
  185. .pwinput{width:100%;padding:8px 10px;font-family:inherit;font-size:13.5px;border:1px solid var(--line);
  186. border-radius:8px;outline:none;color:var(--ink)}
  187. .fmfield{margin-bottom:14px}
  188. .fmlabel{display:block;font-size:12.5px;color:var(--ink-3);margin-bottom:6px}
  189. .fmreq{color:#c0603c;margin-left:3px}
  190. .fmhint{font-size:11.5px;color:var(--ink-4);margin-top:5px;line-height:1.6}
  191. select.pwinput{appearance:none;-webkit-appearance:none;background:#fff
  192. url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='6'%3E%3Cpath d='M0 0l5 6 5-6z' fill='%2393876f'/%3E%3C/svg%3E")
  193. no-repeat right 11px center;padding-right:30px;cursor:pointer}
  194. .pwinput:focus{border-color:var(--gold);box-shadow:0 0 0 3px rgba(234,185,78,.16)}
  195. /* ---------- 侧面板 ---------- */
  196. .sidepanel{position:fixed;top:0;right:0;width:430px;max-width:94vw;height:100%;background:var(--surface);
  197. border-left:1px solid var(--line);z-index:12;transform:translateX(102%);transition:transform .26s cubic-bezier(.32,.72,.28,1);
  198. display:flex;flex-direction:column;box-shadow:-16px 0 48px rgba(150,110,20,.13)}
  199. .sidepanel.on{transform:translateX(0)}
  200. .sphead{padding:26px 26px 16px;border-bottom:1px solid var(--line);
  201. background:linear-gradient(180deg,#fdf7e8 0%,#ffffff 100%)}
  202. .sphead h4{font-size:16px;font-weight:600;display:flex;align-items:center;gap:9px;letter-spacing:-.1px}
  203. .sphead .pill{background:var(--grad-gold);color:#fff;font-size:12px;font-weight:600;padding:2.5px 9px;border-radius:999px;
  204. box-shadow:0 1px 5px rgba(181,126,21,.25)}
  205. .spclose{margin-left:auto;cursor:pointer;color:var(--ink-4);font-size:21px;line-height:1;transition:color .15s}
  206. .spclose:hover{color:var(--gold-deep)}
  207. .sphead p{color:var(--ink-3);font-size:13px;margin-top:8px;line-height:1.75}
  208. .spbody{flex:1;overflow-y:auto;padding:4px 26px 20px}
  209. .spbody::-webkit-scrollbar,.drawer::-webkit-scrollbar,.txprev::-webkit-scrollbar{width:8px}
  210. .spbody::-webkit-scrollbar-thumb,.drawer::-webkit-scrollbar-thumb,.txprev::-webkit-scrollbar-thumb{background:#e8d9b8;border-radius:4px}
  211. .spfoot{padding:16px 26px 20px;border-top:1px solid var(--line);display:flex;gap:10px;align-items:center;
  212. background:linear-gradient(0deg,#fdf7e8 0%,#ffffff 100%)}
  213. .spfoot button{font-family:inherit;font-size:14px;border-radius:var(--r-sm);padding:9px 15px;cursor:pointer;
  214. border:1px solid var(--line);background:var(--surface);color:var(--ink-2);transition:border-color .15s,color .15s,background .15s}
  215. .spfoot button:hover{border-color:var(--gold);color:var(--gold-deep);background:var(--gold-bg)}
  216. .spfoot .primary{flex:1;background:var(--grad-gold);border-color:#b57e15;color:#fff;font-weight:600;
  217. box-shadow:0 2px 9px rgba(181,126,21,.26),inset 0 1px 0 rgba(255,255,255,.3)}
  218. .spfoot .primary:hover{filter:brightness(1.05);border-color:#b57e15;color:#fff}
  219. /* 指标/文案字段 */
  220. .thgroup{padding:16px 0;border-bottom:1px solid var(--line-soft)}
  221. .thgroup:last-child{border-bottom:0}
  222. .thgroup .gt{font-size:14px;font-weight:600;letter-spacing:-.1px;display:flex;align-items:center;gap:7px}
  223. .thgroup .gt::before{content:"";width:3px;height:11px;border-radius:2px;background:var(--grad-gold)}
  224. .thgroup .gh{color:var(--ink-3);font-size:12.5px;margin-top:4px;line-height:1.7;padding-left:10px}
  225. .throw{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-top:10px}
  226. .throw.one{grid-template-columns:1fr 1fr}
  227. .throw.single{grid-template-columns:1fr}
  228. .frow{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:16px 0}
  229. .thfield{display:flex;flex-direction:column;gap:4px}
  230. .thfield label{font-size:12.5px;color:var(--ink-3);letter-spacing:.1px}
  231. .thfield .inp{display:flex;align-items:center;background:#fdfaf2;border:1px solid var(--line);border-radius:var(--r-sm);padding:0 10px;
  232. transition:border-color .15s,background .15s,box-shadow .15s}
  233. .thfield .inp:focus-within{border-color:var(--gold);background:var(--surface);box-shadow:0 0 0 3px rgba(200,149,44,.13)}
  234. .thfield input{width:100%;border:0;background:none;outline:none;font-family:inherit;font-size:14.5px;font-weight:500;
  235. color:var(--ink);padding:8px 0;font-variant-numeric:tabular-nums}
  236. .thfield .u{font-size:12.5px;color:var(--ink-4);padding-left:4px}
  237. .thfield.chg .inp{border-color:var(--gold);background:var(--gold-bg);box-shadow:inset 2px 0 0 var(--gold)}
  238. .thfield textarea{width:100%;border:1px solid var(--line);border-radius:var(--r-sm);background:#fdfaf2;outline:none;
  239. font-family:inherit;font-size:13.5px;line-height:1.8;color:var(--ink);padding:10px 12px;resize:vertical;
  240. transition:border-color .15s,background .15s,box-shadow .15s}
  241. .thfield textarea:focus{border-color:var(--gold);background:var(--surface);box-shadow:0 0 0 3px rgba(200,149,44,.13)}
  242. .txprev{margin-top:10px;background:#fdf8ec;border:1px solid #efe1c2;border-left:3px solid var(--gold);
  243. border-radius:var(--r-sm);padding:14px 16px;font-size:13.5px;line-height:1.95;color:var(--ink-2);
  244. white-space:pre-wrap;word-break:break-word;max-height:280px;overflow-y:auto}
  245. .badvar{background:#fbe0d6;color:#a8402a;border-radius:3px;padding:0 3px;font-weight:600}
  246. .txbad{display:none;margin-top:10px;background:#fdf0ea;border:1px solid #f0cfc2;color:#a8402a;
  247. border-radius:var(--r-sm);padding:9px 12px;font-size:13px;line-height:1.7}
  248. .thfield label{display:flex;align-items:center;gap:6px}
  249. .varbtn{margin-left:auto;border:1px solid var(--line);background:#fff;color:var(--gold-deep);
  250. font-family:inherit;font-size:12px;line-height:1;padding:3px 7px;border-radius:5px;cursor:pointer;transition:all .15s}
  251. .varbtn:hover{background:var(--gold-bg);border-color:var(--gold)}
  252. .varchips{display:none;flex-wrap:wrap;gap:5px;margin-top:7px}
  253. .varchips.on{display:flex}
  254. .varchips b{font-weight:400;font-size:12px;line-height:1;padding:4px 7px;border-radius:999px;cursor:pointer;
  255. background:#fbf6ea;border:1px solid #ecd9ae;color:#8a6a2f;transition:all .15s}
  256. .varchips b:hover{background:var(--grad-gold);border-color:#b57e15;color:#fff}
  257. .varwarn{display:none;color:#a8402a;font-size:12px;line-height:1.6;margin-top:4px}
  258. .thfield.bad .varwarn{display:block}
  259. .thfield.bad .inp{border-color:#d98b74;background:#fdf3ee}
  260. .thfield.bad textarea{border-color:#d98b74;background:#fdf3ee}
  261. /* ---------- 导入 ---------- */
  262. .drop{display:block;border:1px dashed #e0cda3;border-radius:var(--r-md);padding:30px 16px;text-align:center;
  263. color:var(--ink-3);font-size:14px;cursor:pointer;background:#fdfaf2;transition:all .15s}
  264. .drop:hover,.drop.over{border-color:var(--gold);background:var(--gold-bg);color:var(--gold-deep)}
  265. .imresult{margin-top:14px;font-size:13.5px}
  266. .imresult .ok{background:#f2f8f4;border:1px solid #d6e8dc;color:#3f6d55;border-radius:var(--r-sm);padding:11px 13px;line-height:1.9}
  267. .imresult .bad{background:#fcf0ec;border:1px solid #f1d6cd;color:#9c4530;border-radius:var(--r-sm);padding:11px 13px}
  268. .history{font-size:13px;color:var(--ink-3)}
  269. .history .hrow{padding:8px 0;border-bottom:1px solid var(--line-soft);display:flex;gap:10px;align-items:center}
  270. .history .hmain{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  271. .history .hmeta{white-space:nowrap;color:var(--ink-4);font-size:12px}
  272. .history .hrow b{color:var(--ink-2);font-weight:500}
  273. .hbtn{flex:0 0 auto;font-family:inherit;font-size:12px;padding:4px 11px;border-radius:6px;cursor:pointer;
  274. border:1px solid var(--line);background:#fff;color:var(--gold-deep);transition:.15s;white-space:nowrap}
  275. .hbtn:hover{border-color:var(--gold);background:var(--gold-bg)}
  276. .hbtn:disabled{opacity:.4;cursor:default;border-color:var(--line);background:#fff;color:var(--ink-4)}
  277. /* ---------- 门店详情 ---------- */
  278. .overlay{position:fixed;inset:0;background:rgba(52,38,10,.30);opacity:0;pointer-events:none;transition:opacity .2s;z-index:9;backdrop-filter:blur(1.5px)}
  279. .overlay.on{opacity:1;pointer-events:auto}
  280. .overlay.hi{z-index:11}
  281. .drawer{position:fixed;top:0;right:-520px;width:500px;max-width:94vw;height:100%;background:var(--surface);
  282. border-left:1px solid var(--line);z-index:10;transition:right .26s cubic-bezier(.32,.72,.28,1);overflow-y:auto;
  283. box-shadow:-16px 0 48px rgba(150,110,20,.15)}
  284. .drawer.on{right:0}
  285. .dwhead{position:sticky;top:0;z-index:2;padding:26px 28px 15px;border-bottom:1px solid var(--line-soft);
  286. background:linear-gradient(180deg,#fdf7e8 0%,#ffffff 92%)}
  287. .dwhead::before{content:"";position:absolute;top:0;left:0;right:0;height:3px;background:var(--grad-gold)}
  288. .dwbody{padding:16px 28px 44px}
  289. .dwclose{position:absolute;top:24px;right:24px;width:28px;height:28px;display:flex;align-items:center;justify-content:center;
  290. border-radius:8px;color:var(--ink-4);font-size:22px;line-height:1;cursor:pointer;transition:background .15s,color .15s}
  291. .dwclose:hover{background:var(--gold-bg);color:var(--gold-deep)}
  292. .drawer h2{font-size:18.5px;font-weight:600;display:flex;gap:10px;align-items:center;flex-wrap:wrap;letter-spacing:-.3px;padding-right:34px}
  293. .drawer .sid{margin:5px 0 0}
  294. .drawer .sid,.drawer .tag + .tag{margin-left:0}
  295. .mrow{margin:15px 0}
  296. .mrow .lab{display:flex;justify-content:space-between;font-size:13px;color:var(--ink-3);letter-spacing:.1px}
  297. .mrow .lab span:last-child{color:var(--ink-2);font-variant-numeric:tabular-nums;font-weight:500}
  298. .mrow .track{position:relative;height:6px;background:#f5ecda;border-radius:4px;margin-top:7px}
  299. .mrow .fill{height:100%;border-radius:4px;transition:width .3s}
  300. .mrow .mk{position:absolute;top:-3px;width:1.5px;height:12px;background:#c6b48c;opacity:.9}
  301. /* ---------- 诊断结论(v2)---------- */
  302. .dxhead{margin:2px 0 16px;padding:13px 15px;border-radius:10px;background:var(--gold-bg);border:1px solid #f0e2c2}
  303. .dxhead.t-R{background:#fdf4f0;border-color:#f0d5ca}
  304. .dxhead.t-B{background:#fdf8ee;border-color:#efe0bd}
  305. .dxhead.t-T{background:#f7f7f4;border-color:#e8e4d8}
  306. .dxhead.t-OK{background:#f2f7f3;border-color:#d9e8dd}
  307. .dxhd{font-size:14px;line-height:1.7;color:var(--ink);font-weight:500}
  308. .dxmeta{margin-top:6px;font-size:12px;color:var(--ink-3)}
  309. .dxsec{margin-bottom:4px}
  310. .dxt{font-size:12px;color:var(--ink-3);letter-spacing:.4px;margin:0 0 7px}
  311. .dxrow{margin:0 0 9px}
  312. .dxrow .dxact{margin-top:4px;font-size:12.5px;line-height:1.7;color:var(--ok);padding-left:2px}
  313. .dxrow.small{margin-bottom:6px}
  314. .dxnone{font-size:13.5px;color:var(--ok);padding:2px 0 10px}
  315. .dxmore{margin:14px 0 4px;border-top:1px solid var(--line-soft);padding-top:10px}
  316. .dxmore summary{cursor:pointer;font-size:12px;color:var(--ink-3);outline:none;user-select:none}
  317. .dxmore summary:hover{color:var(--gold-deep)}
  318. .dxmore .dxrow{margin-top:9px}
  319. .flag{margin:9px 0;font-size:14px;display:flex;gap:8px;align-items:flex-start}
  320. .flag .act{color:var(--ok);font-size:13px;line-height:1.7}
  321. .copybtn{margin-top:22px;width:100%;background:var(--grad-gold);border:1px solid #b57e15;color:#fff;font-weight:600;
  322. border-radius:var(--r-sm);padding:11px;font-size:14px;cursor:pointer;font-family:inherit;letter-spacing:.4px;
  323. box-shadow:0 3px 12px rgba(181,126,21,.28),inset 0 1px 0 rgba(255,255,255,.3);transition:filter .15s,box-shadow .15s}
  324. .copybtn:hover{filter:brightness(1.05);box-shadow:0 6px 18px rgba(181,126,21,.34),inset 0 1px 0 rgba(255,255,255,.3)}
  325. .dwbrow{display:flex;gap:10px;margin-top:22px}
  326. .dwbrow .copybtn{margin-top:0;flex:1 1 auto}
  327. .rpentry{flex:0 0 auto;background:var(--surface);border:1px solid var(--line);color:var(--ink-2);font-weight:600;
  328. border-radius:var(--r-sm);padding:11px 18px;font-size:14px;cursor:pointer;font-family:inherit;letter-spacing:.4px;
  329. transition:border-color .15s,color .15s,box-shadow .15s}
  330. .rpentry:hover{border-color:var(--gold);color:var(--gold-deep);box-shadow:var(--shadow-1)}
  331. .hint{color:var(--ink-4);font-size:12.5px;margin-top:9px;line-height:1.75}
  332. /* ---------- 预览弹窗 ---------- */
  333. .pvwrap{position:fixed;inset:0;background:rgba(52,38,10,.40);z-index:15;display:none;align-items:center;
  334. justify-content:center;padding:32px;backdrop-filter:blur(2px)}
  335. .pvwrap.on{display:flex}
  336. .pvcard{background:var(--surface);border-radius:var(--r-lg);width:min(980px,84vw);height:min(760px,84vh);
  337. max-height:88vh;display:flex;flex-direction:column;box-shadow:0 28px 70px rgba(80,55,5,.32);overflow:hidden;
  338. border:1px solid var(--line)}
  339. .pvhead{display:flex;align-items:center;gap:8px;padding:20px 28px;font-size:16px;font-weight:600;letter-spacing:-.1px;
  340. border-bottom:1px solid var(--line);background:linear-gradient(180deg,#fdf7e8,#fff)}
  341. .pvhead::before{content:"";width:3px;height:14px;border-radius:2px;background:var(--grad-gold)}
  342. .pvclose{margin-left:auto;cursor:pointer;color:var(--ink-4);font-size:22px;line-height:1;font-weight:400}
  343. .pvclose:hover{color:var(--gold-deep)}
  344. .pvcard textarea{flex:1;border:0;outline:none;resize:none;padding:22px 28px;font-family:inherit;
  345. font-size:14.5px;line-height:2.05;color:var(--ink-2);background:var(--surface);min-height:240px}
  346. .pvfoot{display:flex;gap:10px;padding:16px 28px 20px;border-top:1px solid var(--line);background:linear-gradient(0deg,#fdf7e8,#fff)}
  347. .pvfoot button{font-family:inherit;font-size:14px;border-radius:var(--r-sm);padding:10px 18px;cursor:pointer;
  348. border:1px solid var(--line);background:var(--surface);color:var(--ink-2);transition:border-color .15s,color .15s,background .15s}
  349. .pvfoot button:hover{border-color:var(--gold);color:var(--gold-deep);background:var(--gold-bg)}
  350. .pvfoot .primary{flex:1;background:var(--grad-gold);border-color:#b57e15;color:#fff;font-weight:600;
  351. box-shadow:0 2px 9px rgba(181,126,21,.26),inset 0 1px 0 rgba(255,255,255,.3)}
  352. .pvfoot .primary:hover{filter:brightness(1.05);color:#fff;border-color:#b57e15}
  353. .cfwrap{position:fixed;inset:0;background:rgba(52,38,10,.40);z-index:30;display:flex;align-items:center;
  354. justify-content:center;padding:24px;backdrop-filter:blur(2px);opacity:0;transition:opacity .18s}
  355. .cfwrap.on{opacity:1}
  356. .cfcard{background:var(--surface);border-radius:var(--r-lg);width:min(480px,92vw);
  357. box-shadow:0 28px 70px rgba(80,55,5,.32);border:1px solid var(--line);overflow:hidden;
  358. transform:translateY(8px);transition:transform .2s}
  359. .cfwrap.on .cfcard{transform:none}
  360. .cfhead{display:flex;align-items:center;padding:18px 22px;font-size:15.5px;border-bottom:1px solid var(--line);
  361. background:linear-gradient(180deg,#fdf7e8,#fff)}
  362. .cfhead::before{content:"";width:3px;height:14px;border-radius:2px;background:var(--grad-gold);margin-right:9px}
  363. .cfhead b{flex:1;font-weight:600}
  364. .cfbody{padding:18px 22px 8px}
  365. .cfrow{display:flex;gap:12px;padding:6px 0;font-size:13.5px}
  366. .cfrow .k{flex:0 0 68px;color:var(--ink-3)}
  367. .cfrow .v{flex:1;color:var(--ink-2)}
  368. .cfnote{margin-top:12px;padding:10px 12px;background:#fdfaf2;border:1px solid var(--line-soft);
  369. border-radius:var(--r-sm);font-size:12.5px;line-height:1.75;color:var(--ink-3)}
  370. .cfnote b{color:var(--ink-2);font-weight:600}
  371. .cffoot{display:flex;gap:10px;padding:16px 22px 20px;justify-content:flex-end}
  372. .cffoot button{font-family:inherit;font-size:14px;border-radius:var(--r-sm);padding:9px 20px;cursor:pointer;
  373. border:1px solid var(--line);background:var(--surface);color:var(--ink-2);transition:.15s}
  374. .cffoot button:hover{border-color:var(--gold);color:var(--gold-deep);background:var(--gold-bg)}
  375. .cffoot .primary{background:var(--grad-gold);border-color:#b57e15;color:#fff;font-weight:600;
  376. box-shadow:0 2px 9px rgba(181,126,21,.26),inset 0 1px 0 rgba(255,255,255,.3)}
  377. .cffoot .primary:hover{filter:brightness(1.05);color:#fff}
  378. /* ---------- toast ---------- */
  379. .toast{position:fixed;left:50%;bottom:34px;transform:translate(-50%,12px);background:#3a2c10;color:#fdf7e8;font-size:14px;
  380. padding:10px 20px;border-radius:999px;opacity:0;pointer-events:none;transition:all .24s;z-index:20;
  381. box-shadow:0 12px 32px rgba(70,48,5,.30);letter-spacing:.2px;border:1px solid rgba(234,185,78,.28)}
  382. .toast.on{opacity:1;transform:translate(-50%,0)}
  383. @media(max-width:1100px){.wrap{padding:24px 18px 56px 62px}.kpis{grid-template-columns:repeat(2,1fr)}
  384. header{flex-wrap:wrap}.hright{width:100%;justify-content:flex-start}}
  385. @media(max-width:960px){.charts{grid-template-columns:1fr}}