_demo-styles.css 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. /* 完整管理端 Demo 布局(各页 :root 覆盖主题色) */
  2. * {
  3. box-sizing: border-box;
  4. }
  5. body {
  6. margin: 0;
  7. min-height: 100vh;
  8. font-family: Inter, -apple-system, sans-serif;
  9. font-size: 14px;
  10. line-height: 1.5;
  11. color: var(--text);
  12. background: var(--bg-page);
  13. }
  14. /* ── 顶部选型条 ── */
  15. .demo-banner {
  16. position: sticky;
  17. top: 0;
  18. z-index: 100;
  19. padding: 10px 20px;
  20. background: #fff;
  21. border-bottom: 1px solid #e2e8f0;
  22. display: flex;
  23. align-items: center;
  24. justify-content: space-between;
  25. gap: 12px;
  26. flex-wrap: wrap;
  27. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
  28. }
  29. .demo-banner h1 {
  30. margin: 0;
  31. font-size: 14px;
  32. font-weight: 600;
  33. }
  34. .demo-banner p {
  35. margin: 2px 0 0;
  36. font-size: 12px;
  37. color: #64748b;
  38. }
  39. .demo-banner__actions {
  40. display: flex;
  41. align-items: center;
  42. gap: 10px;
  43. flex-wrap: wrap;
  44. }
  45. .theme-jump {
  46. display: flex;
  47. gap: 4px;
  48. flex-wrap: wrap;
  49. }
  50. .theme-jump a {
  51. padding: 4px 8px;
  52. border-radius: 6px;
  53. font-size: 11px;
  54. font-weight: 600;
  55. text-decoration: none;
  56. color: #64748b;
  57. border: 1px solid #e2e8f0;
  58. background: #fff;
  59. }
  60. .theme-jump a:hover {
  61. border-color: var(--primary);
  62. color: var(--primary-dark);
  63. }
  64. .theme-jump a.is-current {
  65. background: var(--primary-bg);
  66. border-color: var(--primary);
  67. color: var(--primary-dark);
  68. }
  69. .swatch-row {
  70. display: flex;
  71. gap: 6px;
  72. flex-wrap: wrap;
  73. }
  74. .swatch {
  75. font-size: 10px;
  76. color: #64748b;
  77. display: flex;
  78. align-items: center;
  79. gap: 4px;
  80. }
  81. .swatch i {
  82. width: 12px;
  83. height: 12px;
  84. border-radius: 3px;
  85. border: 1px solid rgba(0, 0, 0, 0.06);
  86. }
  87. .link-back {
  88. font-size: 12px;
  89. color: var(--primary-dark);
  90. text-decoration: none;
  91. font-weight: 500;
  92. }
  93. /* ── 应用骨架 ── */
  94. .app-layout {
  95. display: flex;
  96. min-height: calc(100vh - 48px);
  97. }
  98. .sidebar {
  99. width: 220px;
  100. flex-shrink: 0;
  101. background: var(--surface);
  102. border-right: 1px solid var(--border);
  103. padding: 18px 12px;
  104. display: flex;
  105. flex-direction: column;
  106. }
  107. .brand {
  108. display: flex;
  109. align-items: center;
  110. gap: 10px;
  111. padding: 4px 10px 16px;
  112. margin-bottom: 6px;
  113. border-bottom: 1px solid var(--border);
  114. }
  115. .brand-icon {
  116. width: 32px;
  117. height: 32px;
  118. border-radius: 8px;
  119. background: linear-gradient(135deg, var(--primary), var(--primary-dark));
  120. display: flex;
  121. align-items: center;
  122. justify-content: center;
  123. color: #fff;
  124. font-size: 14px;
  125. font-weight: 700;
  126. }
  127. .brand-text {
  128. font-size: 14px;
  129. font-weight: 700;
  130. line-height: 1.3;
  131. }
  132. .brand-text small {
  133. display: block;
  134. font-size: 11px;
  135. font-weight: 500;
  136. color: var(--text-muted);
  137. }
  138. .nav-group {
  139. margin-bottom: 8px;
  140. }
  141. .nav-group-title {
  142. padding: 6px 12px;
  143. font-size: 11px;
  144. font-weight: 700;
  145. color: var(--text-muted);
  146. letter-spacing: 0.03em;
  147. }
  148. .nav a {
  149. display: flex;
  150. align-items: center;
  151. gap: 8px;
  152. padding: 8px 12px;
  153. margin: 1px 0;
  154. border-radius: 8px;
  155. color: var(--text-muted);
  156. text-decoration: none;
  157. font-size: 13px;
  158. font-weight: 500;
  159. }
  160. .nav a::before {
  161. content: '';
  162. width: 16px;
  163. height: 16px;
  164. border-radius: 4px;
  165. background: var(--row-alt);
  166. flex-shrink: 0;
  167. }
  168. .nav a:hover {
  169. background: var(--row-alt);
  170. color: var(--text);
  171. }
  172. .nav a.active {
  173. background: var(--primary-bg);
  174. color: var(--primary-dark);
  175. font-weight: 600;
  176. }
  177. .nav a.active::before {
  178. background: var(--primary);
  179. }
  180. .main-col {
  181. flex: 1;
  182. min-width: 0;
  183. display: flex;
  184. flex-direction: column;
  185. }
  186. .topbar {
  187. height: 56px;
  188. padding: 0 24px;
  189. display: flex;
  190. align-items: center;
  191. justify-content: space-between;
  192. background: var(--surface);
  193. border-bottom: 1px solid var(--border);
  194. }
  195. .crumb {
  196. font-size: 13px;
  197. color: var(--text-muted);
  198. }
  199. .crumb b {
  200. color: var(--text);
  201. font-weight: 600;
  202. }
  203. .topbar-right {
  204. display: flex;
  205. align-items: center;
  206. gap: 12px;
  207. font-size: 13px;
  208. color: var(--text-muted);
  209. }
  210. .avatar {
  211. width: 32px;
  212. height: 32px;
  213. border-radius: 50%;
  214. background: var(--primary-bg);
  215. border: 1px solid var(--border);
  216. color: var(--primary-dark);
  217. display: flex;
  218. align-items: center;
  219. justify-content: center;
  220. font-size: 12px;
  221. font-weight: 600;
  222. }
  223. .work-tabs {
  224. display: flex;
  225. align-items: flex-end;
  226. gap: 4px;
  227. padding: 10px 24px 0;
  228. background: var(--bg-page);
  229. border-bottom: 1px solid var(--border);
  230. }
  231. .work-tab {
  232. padding: 8px 14px;
  233. border: 1px solid var(--border);
  234. border-bottom: none;
  235. border-radius: 8px 8px 0 0;
  236. background: var(--surface);
  237. font-size: 13px;
  238. font-weight: 600;
  239. color: var(--text-muted);
  240. margin-bottom: -1px;
  241. }
  242. .work-tab.is-active {
  243. color: var(--primary-dark);
  244. box-shadow: inset 0 2px 0 var(--primary);
  245. z-index: 1;
  246. }
  247. .content {
  248. flex: 1;
  249. padding: 24px;
  250. overflow: auto;
  251. }
  252. .panel {
  253. background: var(--surface);
  254. border: 1px solid var(--border);
  255. border-radius: var(--radius);
  256. box-shadow: var(--shadow);
  257. }
  258. /* 实体切换卡(采集协议单页) */
  259. .entity-switch {
  260. display: flex;
  261. justify-content: center;
  262. flex-wrap: wrap;
  263. gap: 10px;
  264. padding: 16px 16px 12px;
  265. }
  266. .entity-card {
  267. flex: 0 1 168px;
  268. min-width: 152px;
  269. max-width: 180px;
  270. padding: 10px 12px;
  271. border: 1px solid var(--border);
  272. border-radius: 10px;
  273. background: var(--surface);
  274. display: flex;
  275. gap: 8px;
  276. align-items: center;
  277. cursor: default;
  278. }
  279. .entity-card.is-active {
  280. border-color: var(--primary);
  281. background: var(--primary-bg);
  282. box-shadow: 0 0 0 1px color-mix(in srgb, var(--primary) 12%, transparent);
  283. }
  284. .entity-card__icon {
  285. width: 32px;
  286. height: 32px;
  287. border-radius: 8px;
  288. background: #f1f5f9;
  289. color: #64748b;
  290. display: flex;
  291. align-items: center;
  292. justify-content: center;
  293. font-size: 15px;
  294. flex-shrink: 0;
  295. }
  296. .entity-card.is-active .entity-card__icon {
  297. background: #fff;
  298. color: var(--primary-dark);
  299. }
  300. .entity-card__title {
  301. font-size: 13px;
  302. font-weight: 600;
  303. color: var(--text);
  304. }
  305. .entity-card.is-active .entity-card__title {
  306. color: var(--primary-dark);
  307. }
  308. .entity-card__desc {
  309. font-size: 11px;
  310. color: var(--text-muted);
  311. line-height: 1.35;
  312. }
  313. /* 筛选区 */
  314. .filter-block {
  315. padding: 16px 20px 4px;
  316. border-bottom: 1px solid var(--border);
  317. }
  318. .filter-grid {
  319. display: grid;
  320. grid-template-columns: repeat(4, 1fr);
  321. gap: 12px 16px;
  322. }
  323. @media (max-width: 1100px) {
  324. .filter-grid {
  325. grid-template-columns: repeat(2, 1fr);
  326. }
  327. }
  328. .field label {
  329. display: block;
  330. font-size: 11px;
  331. font-weight: 500;
  332. color: var(--text-muted);
  333. margin-bottom: 6px;
  334. }
  335. .input,
  336. .select {
  337. height: 36px;
  338. width: 100%;
  339. padding: 0 12px;
  340. border-radius: 8px;
  341. border: 1px solid var(--border);
  342. background: var(--surface);
  343. font-size: 14px;
  344. color: var(--text);
  345. font-family: inherit;
  346. }
  347. .input:focus,
  348. .select:focus {
  349. outline: none;
  350. border-color: var(--primary);
  351. box-shadow: 0 0 0 2px color-mix(in srgb, var(--primary) 20%, transparent);
  352. }
  353. .filter-actions {
  354. display: flex;
  355. gap: 8px;
  356. padding: 12px 0 16px;
  357. }
  358. /* 工具栏 */
  359. .list-toolbar {
  360. padding: 12px 20px;
  361. display: flex;
  362. align-items: center;
  363. gap: 10px;
  364. border-bottom: 1px solid var(--border);
  365. background: var(--table-head);
  366. }
  367. .sel-num {
  368. font-size: 13px;
  369. color: var(--text-muted);
  370. margin-right: 4px;
  371. }
  372. .sel-num b {
  373. color: var(--primary-dark);
  374. }
  375. /* 按钮 */
  376. .btn {
  377. height: 36px;
  378. padding: 0 14px;
  379. border-radius: 8px;
  380. font-size: 14px;
  381. font-weight: 600;
  382. cursor: default;
  383. border: 1px solid var(--border);
  384. background: var(--surface);
  385. color: var(--text);
  386. font-family: inherit;
  387. display: inline-flex;
  388. align-items: center;
  389. gap: 6px;
  390. }
  391. .btn-primary {
  392. background: var(--primary);
  393. border-color: var(--primary);
  394. color: #fff;
  395. }
  396. .btn-primary:hover {
  397. background: var(--primary-dark);
  398. border-color: var(--primary-dark);
  399. }
  400. .btn-op {
  401. height: 28px;
  402. padding: 0 10px;
  403. border-radius: 6px;
  404. font-size: 12px;
  405. font-weight: 600;
  406. border: 1px solid var(--border);
  407. background: var(--surface);
  408. color: var(--text);
  409. margin-right: 4px;
  410. }
  411. .btn-op.primary {
  412. color: var(--primary-dark);
  413. border-color: color-mix(in srgb, var(--primary) 35%, var(--border));
  414. background: var(--primary-bg);
  415. }
  416. /* 表格 */
  417. .list-body {
  418. overflow-x: auto;
  419. }
  420. table {
  421. width: 100%;
  422. border-collapse: collapse;
  423. min-width: 900px;
  424. }
  425. th {
  426. text-align: left;
  427. padding: 10px 14px;
  428. font-size: 12px;
  429. font-weight: 600;
  430. color: var(--text-muted);
  431. background: var(--table-head);
  432. border-bottom: 1px solid var(--border);
  433. white-space: nowrap;
  434. }
  435. td {
  436. padding: 11px 14px;
  437. border-bottom: 1px solid var(--border);
  438. font-size: 13px;
  439. }
  440. tr:hover td {
  441. background: var(--row-hover);
  442. }
  443. tr:nth-child(even) td {
  444. background: var(--row-alt);
  445. }
  446. tr:nth-child(even):hover td {
  447. background: var(--row-hover);
  448. }
  449. .tag {
  450. display: inline-block;
  451. padding: 2px 8px;
  452. border-radius: 6px;
  453. font-size: 12px;
  454. font-weight: 600;
  455. }
  456. .tag-info {
  457. background: #f8fafc;
  458. color: #64748b;
  459. }
  460. .tag-success {
  461. background: #d1fae5;
  462. color: #047857;
  463. }
  464. .tag-warning {
  465. background: #fffbeb;
  466. color: #d97706;
  467. }
  468. .tag-danger {
  469. background: #fef2f2;
  470. color: #dc2626;
  471. }
  472. .tag-primary {
  473. background: var(--primary-bg);
  474. color: var(--primary-dark);
  475. }
  476. /* 分页 */
  477. .pager {
  478. padding: 12px 20px;
  479. display: flex;
  480. align-items: center;
  481. justify-content: flex-end;
  482. gap: 8px;
  483. border-top: 1px solid var(--border);
  484. font-size: 13px;
  485. color: var(--text-muted);
  486. }
  487. .pager-btn {
  488. min-width: 32px;
  489. height: 32px;
  490. padding: 0 8px;
  491. border-radius: 8px;
  492. border: 1px solid var(--border);
  493. background: var(--surface);
  494. color: var(--text);
  495. font-size: 13px;
  496. font-weight: 500;
  497. }
  498. .pager-btn.is-active {
  499. background: var(--primary);
  500. border-color: var(--primary);
  501. color: #fff;
  502. }
  503. /* 底部:弹窗预览 */
  504. .demo-bottom {
  505. display: grid;
  506. grid-template-columns: 1fr 380px;
  507. gap: 20px;
  508. margin-top: 20px;
  509. }
  510. @media (max-width: 1200px) {
  511. .demo-bottom {
  512. grid-template-columns: 1fr;
  513. }
  514. }
  515. .stats-row {
  516. display: grid;
  517. grid-template-columns: repeat(3, 1fr);
  518. gap: 12px;
  519. }
  520. .stat-card {
  521. padding: 14px 16px;
  522. border: 1px solid var(--border);
  523. border-radius: 10px;
  524. background: var(--surface);
  525. }
  526. .stat-card .label {
  527. font-size: 12px;
  528. color: var(--text-muted);
  529. }
  530. .stat-card .value {
  531. margin-top: 4px;
  532. font-size: 22px;
  533. font-weight: 700;
  534. color: var(--primary-dark);
  535. }
  536. .stat-card.warn .value {
  537. color: #d97706;
  538. }
  539. .dialog-preview {
  540. border: 1px solid var(--border);
  541. border-radius: 10px;
  542. background: var(--surface);
  543. box-shadow: 0 8px 24px rgba(15, 23, 42, 0.12);
  544. overflow: hidden;
  545. }
  546. .dialog-head {
  547. padding: 14px 18px;
  548. border-bottom: 1px solid var(--border);
  549. font-size: 15px;
  550. font-weight: 600;
  551. }
  552. .dialog-body {
  553. padding: 16px 18px;
  554. max-height: 280px;
  555. overflow: auto;
  556. }
  557. .form-grid-2 {
  558. display: grid;
  559. grid-template-columns: 1fr 1fr;
  560. gap: 12px;
  561. }
  562. .dialog-foot {
  563. padding: 12px 18px;
  564. border-top: 1px solid var(--border);
  565. display: flex;
  566. justify-content: flex-end;
  567. gap: 8px;
  568. background: var(--table-head);
  569. }
  570. .theme-note {
  571. margin-top: 16px;
  572. padding: 12px 16px;
  573. border-radius: 8px;
  574. background: var(--primary-bg);
  575. border: 1px solid var(--border);
  576. font-size: 13px;
  577. color: var(--text-muted);
  578. }