styles.css 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. * {
  2. box-sizing: border-box;
  3. }
  4. body {
  5. margin: 0;
  6. font-family: "Microsoft Yahei", "PingFang SC", sans-serif;
  7. background: #f3f6fb;
  8. color: #1f2937;
  9. }
  10. .app {
  11. min-height: 100vh;
  12. display: flex;
  13. flex-direction: column;
  14. }
  15. .header {
  16. padding: 20px 28px;
  17. background: linear-gradient(135deg, #0f172a 0%, #1e3a8a 50%, #2563eb 100%);
  18. color: #fff;
  19. display: flex;
  20. align-items: center;
  21. justify-content: space-between;
  22. gap: 16px;
  23. }
  24. .header-brand {
  25. display: flex;
  26. flex-direction: column;
  27. gap: 6px;
  28. }
  29. .header-title {
  30. font-size: 22px;
  31. font-weight: 600;
  32. }
  33. .header-subtitle {
  34. font-size: 13px;
  35. opacity: 0.8;
  36. }
  37. .header-meta {
  38. display: flex;
  39. gap: 12px;
  40. }
  41. .meta-card {
  42. background: rgba(255, 255, 255, 0.16);
  43. border: 1px solid rgba(255, 255, 255, 0.22);
  44. padding: 10px 14px;
  45. border-radius: 10px;
  46. min-width: 120px;
  47. }
  48. .meta-label {
  49. font-size: 12px;
  50. opacity: 0.7;
  51. }
  52. .meta-value {
  53. font-size: 14px;
  54. font-weight: 600;
  55. margin-top: 4px;
  56. }
  57. .nav {
  58. display: flex;
  59. gap: 12px;
  60. padding: 14px 28px;
  61. background: #ffffff;
  62. border-bottom: 1px solid #e5e7eb;
  63. }
  64. .nav-item {
  65. border: none;
  66. background: #f1f5f9;
  67. padding: 8px 18px;
  68. border-radius: 999px;
  69. cursor: pointer;
  70. font-weight: 500;
  71. transition: all 0.2s ease;
  72. }
  73. .nav-item.active {
  74. background: #2563eb;
  75. color: #fff;
  76. box-shadow: 0 10px 20px rgba(37, 99, 235, 0.2);
  77. }
  78. .main {
  79. padding: 28px;
  80. }
  81. .tab {
  82. display: none;
  83. }
  84. .tab.active {
  85. display: block;
  86. }
  87. .section {
  88. display: flex;
  89. flex-direction: column;
  90. gap: 16px;
  91. }
  92. .section-title {
  93. font-size: 18px;
  94. font-weight: 600;
  95. }
  96. .grid {
  97. display: grid;
  98. grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
  99. gap: 16px;
  100. }
  101. .card {
  102. background: #ffffff;
  103. border-radius: 16px;
  104. padding: 18px;
  105. box-shadow: 0 12px 24px rgba(15, 23, 42, 0.08);
  106. display: flex;
  107. flex-direction: column;
  108. gap: 12px;
  109. border: 1px solid #eef2f7;
  110. }
  111. .card-title {
  112. font-weight: 600;
  113. }
  114. .form {
  115. display: flex;
  116. flex-direction: column;
  117. gap: 12px;
  118. }
  119. .input,
  120. .textarea,
  121. select {
  122. width: 100%;
  123. padding: 10px 12px;
  124. border: 1px solid #e5e7eb;
  125. border-radius: 10px;
  126. font-size: 14px;
  127. background: #fff;
  128. transition: border-color 0.2s ease, box-shadow 0.2s ease;
  129. }
  130. .input:focus,
  131. .textarea:focus,
  132. select:focus {
  133. outline: none;
  134. border-color: #93c5fd;
  135. box-shadow: 0 0 0 3px rgba(147, 197, 253, 0.4);
  136. }
  137. .textarea {
  138. min-height: 120px;
  139. resize: vertical;
  140. }
  141. .form-actions {
  142. display: flex;
  143. gap: 12px;
  144. }
  145. .button {
  146. border: none;
  147. background: #2563eb;
  148. color: #fff;
  149. padding: 10px 18px;
  150. border-radius: 999px;
  151. cursor: pointer;
  152. font-weight: 500;
  153. transition: transform 0.2s ease, box-shadow 0.2s ease;
  154. }
  155. .button:hover {
  156. transform: translateY(-1px);
  157. box-shadow: 0 8px 16px rgba(37, 99, 235, 0.2);
  158. }
  159. .button.loading {
  160. opacity: 0.7;
  161. pointer-events: none;
  162. }
  163. .button.loading::after {
  164. content: "";
  165. display: inline-block;
  166. width: 12px;
  167. height: 12px;
  168. margin-left: 8px;
  169. border-radius: 50%;
  170. border: 2px solid rgba(255, 255, 255, 0.6);
  171. border-top-color: #ffffff;
  172. animation: spin 0.8s linear infinite;
  173. }
  174. .button.secondary {
  175. background: #e5e7eb;
  176. color: #1f2937;
  177. }
  178. .button.ghost {
  179. background: transparent;
  180. color: #2563eb;
  181. border: 1px dashed #93c5fd;
  182. }
  183. .table-wrap {
  184. overflow-x: auto;
  185. }
  186. .table {
  187. width: 100%;
  188. border-collapse: collapse;
  189. font-size: 13px;
  190. }
  191. .table th,
  192. .table td {
  193. padding: 10px;
  194. border-bottom: 1px solid #e5e7eb;
  195. text-align: left;
  196. }
  197. .timeline {
  198. display: grid;
  199. gap: 8px;
  200. }
  201. .timeline-item {
  202. padding: 10px 12px;
  203. background: #f8fafc;
  204. border-radius: 10px;
  205. border: 1px solid #e2e8f0;
  206. }
  207. .upload-group {
  208. display: flex;
  209. flex-direction: column;
  210. gap: 6px;
  211. }
  212. .upload-label {
  213. font-size: 13px;
  214. color: #6b7280;
  215. }
  216. .result-block {
  217. display: flex;
  218. flex-direction: column;
  219. gap: 6px;
  220. }
  221. .result-title {
  222. font-weight: 500;
  223. }
  224. .status {
  225. font-size: 13px;
  226. color: #2563eb;
  227. background: #eff6ff;
  228. padding: 8px 12px;
  229. border-radius: 8px;
  230. border: 1px solid #bfdbfe;
  231. }
  232. .file-compare {
  233. display: flex;
  234. flex-direction: column;
  235. gap: 12px;
  236. }
  237. .file-list {
  238. display: flex;
  239. flex-direction: column;
  240. gap: 8px;
  241. max-height: 160px;
  242. overflow-y: auto;
  243. padding: 8px;
  244. border-radius: 12px;
  245. border: 1px dashed #e2e8f0;
  246. background: #f8fafc;
  247. }
  248. .file-group {
  249. display: flex;
  250. flex-direction: column;
  251. gap: 6px;
  252. padding: 6px;
  253. border-radius: 10px;
  254. background: #f8fafc;
  255. border: 1px dashed #e2e8f0;
  256. }
  257. .file-group-title {
  258. font-size: 12px;
  259. font-weight: 600;
  260. color: #1e3a8a;
  261. }
  262. .file-group-list {
  263. display: flex;
  264. flex-direction: column;
  265. gap: 6px;
  266. }
  267. .file-item {
  268. display: flex;
  269. align-items: center;
  270. justify-content: space-between;
  271. gap: 8px;
  272. padding: 8px 10px;
  273. border-radius: 10px;
  274. border: 1px solid #e2e8f0;
  275. background: #ffffff;
  276. font-size: 12px;
  277. }
  278. .file-item button,
  279. .file-item a {
  280. border: none;
  281. background: transparent;
  282. color: #2563eb;
  283. cursor: pointer;
  284. font-size: 12px;
  285. text-decoration: none;
  286. }
  287. .modal {
  288. position: fixed;
  289. inset: 0;
  290. display: none;
  291. z-index: 1000;
  292. }
  293. .modal.open {
  294. display: flex;
  295. align-items: center;
  296. justify-content: center;
  297. }
  298. .modal-backdrop {
  299. position: absolute;
  300. inset: 0;
  301. background: rgba(15, 23, 42, 0.55);
  302. }
  303. .modal-content {
  304. position: relative;
  305. width: min(1200px, 92vw);
  306. max-height: 90vh;
  307. background: #ffffff;
  308. border-radius: 16px;
  309. padding: 20px;
  310. display: flex;
  311. flex-direction: column;
  312. gap: 16px;
  313. box-shadow: 0 24px 60px rgba(15, 23, 42, 0.2);
  314. z-index: 1;
  315. }
  316. .modal-header {
  317. display: flex;
  318. align-items: center;
  319. justify-content: space-between;
  320. gap: 12px;
  321. }
  322. .modal-title {
  323. font-size: 18px;
  324. font-weight: 600;
  325. }
  326. .modal-body {
  327. display: grid;
  328. grid-template-columns: 1fr 1fr;
  329. gap: 16px;
  330. align-items: stretch;
  331. }
  332. .modal-preview {
  333. width: 100%;
  334. min-height: 60vh;
  335. border: 1px solid #e2e8f0;
  336. border-radius: 12px;
  337. background: #f8fafc;
  338. }
  339. .modal-result {
  340. display: flex;
  341. flex-direction: column;
  342. gap: 8px;
  343. height: 100%;
  344. }
  345. .modal-subtitle {
  346. font-size: 13px;
  347. font-weight: 600;
  348. color: #475569;
  349. }
  350. .modal-result .textarea {
  351. height: 100%;
  352. }
  353. .toast {
  354. position: fixed;
  355. bottom: 24px;
  356. right: 24px;
  357. background: #1f2937;
  358. color: #ffffff;
  359. padding: 10px 16px;
  360. border-radius: 12px;
  361. box-shadow: 0 12px 24px rgba(15, 23, 42, 0.2);
  362. opacity: 0;
  363. pointer-events: none;
  364. transition: opacity 0.2s ease;
  365. z-index: 1100;
  366. }
  367. .toast.show {
  368. opacity: 1;
  369. }
  370. @keyframes spin {
  371. to {
  372. transform: rotate(360deg);
  373. }
  374. }
  375. @media (max-width: 900px) {
  376. .modal-content {
  377. width: 96vw;
  378. padding: 16px;
  379. }
  380. .modal-body {
  381. grid-template-columns: 1fr;
  382. }
  383. .modal-preview {
  384. min-height: 45vh;
  385. }
  386. }
  387. .stepper {
  388. display: flex;
  389. gap: 8px;
  390. padding: 6px 0 12px;
  391. }
  392. .step {
  393. flex: 1;
  394. text-align: center;
  395. padding: 6px 8px;
  396. border-radius: 999px;
  397. background: #f1f5f9;
  398. font-size: 12px;
  399. color: #64748b;
  400. }
  401. .step.active {
  402. background: #dbeafe;
  403. color: #1d4ed8;
  404. font-weight: 600;
  405. }
  406. .step.done {
  407. background: #dcfce7;
  408. color: #166534;
  409. font-weight: 600;
  410. }