_demo-styles.css 11 KB

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