main.css 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626
  1. :root {
  2. --el-color-primary: #6366f1;
  3. /* 主色调 */
  4. --primary: #6366f1;
  5. --primary-light: #818cf8;
  6. --primary-dark: #4f46e5;
  7. /* 渐变色 */
  8. --gradient-1: linear-gradient(135deg, #6366f1, #8b5cf6);
  9. --gradient-2: linear-gradient(135deg, #3b82f6, #06b6d4);
  10. /* 功能色 */
  11. --success: #10b981;
  12. --warning: #f59e0b;
  13. --danger: #ef4444;
  14. --info: #06b6d4;
  15. /* 中性色 */
  16. --bg-dark: #0f172a;
  17. --bg-card: #1e293b;
  18. --bg-hover: #334155;
  19. --border: #475569;
  20. /* 文字色 */
  21. --text-primary: #f1f5f9;
  22. --text-secondary: #94a3b8;
  23. --text-muted: #64748b;
  24. /* 辅助色 */
  25. --accent: #8b5cf6;
  26. --secondary: #3b82f6;
  27. }
  28. * {
  29. margin: 0;
  30. padding: 0;
  31. box-sizing: border-box;
  32. }
  33. body {
  34. font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
  35. background: var(--bg-dark);
  36. color: var(--text-primary);
  37. font-size: 14px;
  38. line-height: 1.5;
  39. }
  40. /* 滚动条样式 */
  41. ::-webkit-scrollbar {
  42. width: 6px;
  43. height: 6px;
  44. }
  45. ::-webkit-scrollbar-track {
  46. background: var(--bg-dark);
  47. }
  48. ::-webkit-scrollbar-thumb {
  49. background: var(--border);
  50. border-radius: 3px;
  51. }
  52. ::-webkit-scrollbar-thumb:hover {
  53. background: var(--text-secondary);
  54. }
  55. /* App布局 */
  56. .app-container {
  57. display: flex;
  58. height: 100vh;
  59. overflow: hidden;
  60. }
  61. .main-content {
  62. flex: 1;
  63. display: flex;
  64. flex-direction: column;
  65. overflow: hidden;
  66. margin-left: 260px;
  67. }
  68. .content-area {
  69. flex: 1;
  70. display: flex;
  71. overflow: hidden;
  72. }
  73. /* 侧边栏 */
  74. .sidebar {
  75. width: 260px;
  76. background: var(--bg-card);
  77. border-right: 1px solid var(--border);
  78. display: flex;
  79. flex-direction: column;
  80. position: fixed;
  81. top: 0;
  82. left: 0;
  83. bottom: 0;
  84. z-index: 100;
  85. }
  86. .sidebar-header {
  87. padding: 20px;
  88. border-bottom: 1px solid var(--border);
  89. }
  90. .logo {
  91. display: flex;
  92. align-items: center;
  93. gap: 12px;
  94. }
  95. .logo-icon {
  96. width: 40px;
  97. height: 40px;
  98. background: var(--gradient-1);
  99. border-radius: 10px;
  100. display: flex;
  101. align-items: center;
  102. justify-content: center;
  103. font-size: 20px;
  104. }
  105. .logo-text {
  106. font-size: 18px;
  107. font-weight: 700;
  108. color: var(--text-primary);
  109. }
  110. .logo-subtitle {
  111. font-size: 11px;
  112. color: var(--text-secondary);
  113. }
  114. /* 导航菜单 */
  115. .nav-menu {
  116. flex: 1;
  117. overflow-y: auto;
  118. padding: 16px 12px;
  119. }
  120. .nav-section {
  121. margin-bottom: 20px;
  122. }
  123. .nav-section-title {
  124. font-size: 11px;
  125. font-weight: 600;
  126. color: var(--text-muted);
  127. text-transform: uppercase;
  128. letter-spacing: 0.5px;
  129. padding: 0 12px;
  130. margin-bottom: 8px;
  131. }
  132. .nav-item {
  133. display: flex;
  134. align-items: center;
  135. gap: 12px;
  136. padding: 10px 12px;
  137. border-radius: 8px;
  138. cursor: pointer;
  139. transition: all 0.2s;
  140. margin-bottom: 4px;
  141. color: var(--text-secondary);
  142. }
  143. .nav-item:hover {
  144. background: var(--bg-hover);
  145. color: var(--text-primary);
  146. }
  147. .nav-item.active {
  148. background: rgba(99, 102, 241, 0.2);
  149. color: var(--primary);
  150. }
  151. .nav-icon {
  152. width: 20px;
  153. font-size: 16px;
  154. }
  155. .nav-text {
  156. flex: 1;
  157. font-size: 13px;
  158. }
  159. .nav-badge {
  160. background: var(--danger);
  161. color: white;
  162. font-size: 10px;
  163. padding: 2px 6px;
  164. border-radius: 10px;
  165. font-weight: 600;
  166. }
  167. /* 用户卡片 */
  168. .sidebar-footer {
  169. padding: 16px;
  170. border-top: 1px solid var(--border);
  171. }
  172. .user-card {
  173. display: flex;
  174. align-items: center;
  175. gap: 12px;
  176. padding: 12px;
  177. background: var(--bg-hover);
  178. border-radius: 10px;
  179. cursor: pointer;
  180. }
  181. .user-avatar {
  182. width: 36px;
  183. height: 36px;
  184. background: var(--gradient-1);
  185. border-radius: 50%;
  186. display: flex;
  187. align-items: center;
  188. justify-content: center;
  189. font-size: 14px;
  190. font-weight: 600;
  191. }
  192. .user-name {
  193. font-size: 13px;
  194. font-weight: 600;
  195. }
  196. .user-role {
  197. font-size: 11px;
  198. color: var(--text-secondary);
  199. }
  200. /* 顶部栏 */
  201. .top-bar {
  202. display: flex;
  203. align-items: center;
  204. justify-content: space-between;
  205. padding: 12px 24px;
  206. background: var(--bg-card);
  207. border-bottom: 1px solid var(--border);
  208. position: relative;
  209. }
  210. .breadcrumb {
  211. display: flex;
  212. align-items: center;
  213. gap: 8px;
  214. font-size: 13px;
  215. }
  216. .breadcrumb-item {
  217. color: var(--text-secondary);
  218. }
  219. .breadcrumb-item.active {
  220. color: var(--text-primary);
  221. }
  222. .breadcrumb-separator {
  223. color: var(--text-muted);
  224. }
  225. .top-actions {
  226. display: flex;
  227. align-items: center;
  228. gap: 12px;
  229. }
  230. .search-box {
  231. position: relative;
  232. width: 300px;
  233. }
  234. .search-icon {
  235. position: absolute;
  236. left: 12px;
  237. top: 50%;
  238. transform: translateY(-50%);
  239. color: var(--text-muted);
  240. font-size: 14px;
  241. }
  242. .search-input {
  243. width: 100%;
  244. padding: 8px 12px 8px 36px;
  245. background: var(--bg-hover);
  246. border: 1px solid var(--border);
  247. border-radius: 8px;
  248. color: var(--text-primary);
  249. font-size: 13px;
  250. }
  251. .search-input::placeholder {
  252. color: var(--text-muted);
  253. }
  254. .search-input:focus {
  255. outline: none;
  256. border-color: var(--primary);
  257. }
  258. .action-btn {
  259. width: 36px;
  260. height: 36px;
  261. background: var(--bg-hover);
  262. border: 1px solid var(--border);
  263. border-radius: 8px;
  264. display: flex;
  265. align-items: center;
  266. justify-content: center;
  267. cursor: pointer;
  268. color: var(--text-secondary);
  269. transition: all 0.2s;
  270. position: relative;
  271. }
  272. .action-btn:hover {
  273. background: var(--border);
  274. color: var(--text-primary);
  275. }
  276. .action-btn .dot {
  277. position: absolute;
  278. top: 6px;
  279. right: 6px;
  280. width: 8px;
  281. height: 8px;
  282. background: var(--danger);
  283. border-radius: 50%;
  284. }
  285. /* 按钮样式 */
  286. .btn {
  287. display: inline-flex;
  288. align-items: center;
  289. justify-content: center;
  290. gap: 8px;
  291. padding: 10px 20px;
  292. border-radius: 8px;
  293. font-size: 13px;
  294. font-weight: 500;
  295. cursor: pointer;
  296. border: none;
  297. transition: all 0.2s;
  298. }
  299. .btn-primary {
  300. background: var(--gradient-1);
  301. color: white;
  302. }
  303. .btn-primary:hover {
  304. opacity: 0.9;
  305. }
  306. .btn-secondary {
  307. background: var(--bg-hover);
  308. color: var(--text-secondary);
  309. border: 1px solid var(--border);
  310. }
  311. .btn-secondary:hover {
  312. background: var(--border);
  313. color: var(--text-primary);
  314. }
  315. .btn-sm {
  316. padding: 6px 12px;
  317. font-size: 12px;
  318. }
  319. /* 对话区域 */
  320. .chat-section {
  321. flex: 1;
  322. display: flex;
  323. flex-direction: column;
  324. background: var(--bg-dark);
  325. min-width: 0;
  326. }
  327. .chat-header {
  328. display: flex;
  329. align-items: center;
  330. justify-content: space-between;
  331. padding: 20px 24px;
  332. border-bottom: 1px solid var(--border);
  333. background: var(--bg-card);
  334. }
  335. .brain-status {
  336. display: flex;
  337. align-items: center;
  338. gap: 16px;
  339. }
  340. .brain-avatar {
  341. width: 48px;
  342. height: 48px;
  343. background: var(--gradient-1);
  344. border-radius: 12px;
  345. display: flex;
  346. align-items: center;
  347. justify-content: center;
  348. font-size: 24px;
  349. }
  350. .brain-info h2 {
  351. font-size: 18px;
  352. font-weight: 600;
  353. margin-bottom: 4px;
  354. }
  355. .brain-info p {
  356. font-size: 12px;
  357. color: var(--text-secondary);
  358. }
  359. .chat-messages {
  360. flex: 1;
  361. overflow-y: auto;
  362. padding: 24px;
  363. display: flex;
  364. flex-direction: column;
  365. gap: 16px;
  366. }
  367. .message {
  368. display: flex;
  369. gap: 12px;
  370. animation: fadeIn 0.3s ease;
  371. }
  372. @keyframes fadeIn {
  373. from { opacity: 0; transform: translateY(10px); }
  374. to { opacity: 1; transform: translateY(0); }
  375. }
  376. .message-avatar {
  377. width: 36px;
  378. height: 36px;
  379. border-radius: 50%;
  380. display: flex;
  381. align-items: center;
  382. justify-content: center;
  383. font-size: 18px;
  384. flex-shrink: 0;
  385. }
  386. .message-avatar.ai {
  387. background: var(--gradient-1);
  388. }
  389. .message-avatar.user {
  390. background: var(--gradient-2);
  391. }
  392. .message-content {
  393. flex: 1;
  394. min-width: 0;
  395. }
  396. .message-header {
  397. display: flex;
  398. align-items: center;
  399. gap: 8px;
  400. margin-bottom: 6px;
  401. }
  402. .message-author {
  403. font-size: 13px;
  404. font-weight: 600;
  405. }
  406. .message-time {
  407. font-size: 11px;
  408. color: var(--text-muted);
  409. }
  410. .message-bubble {
  411. background: var(--bg-card);
  412. border: 1px solid var(--border);
  413. border-radius: 12px;
  414. padding: 16px;
  415. font-size: 14px;
  416. line-height: 1.7;
  417. }
  418. .message.user .message-bubble {
  419. background: rgba(99, 102, 241, 0.1);
  420. border-color: rgba(99, 102, 241, 0.2);
  421. }
  422. .message-bubble p {
  423. margin-bottom: 8px;
  424. }
  425. .message-bubble ul {
  426. margin: 8px 0;
  427. padding-left: 20px;
  428. }
  429. .message-bubble li {
  430. margin-bottom: 6px;
  431. }
  432. /* 快捷操作 */
  433. .quick-actions {
  434. display: flex;
  435. flex-wrap: wrap;
  436. gap: 8px;
  437. margin-top: 12px;
  438. }
  439. .quick-action {
  440. padding: 6px 12px;
  441. background: var(--bg-hover);
  442. border: 1px solid var(--border);
  443. border-radius: 20px;
  444. font-size: 12px;
  445. cursor: pointer;
  446. transition: all 0.2s;
  447. }
  448. .quick-action:hover {
  449. background: var(--primary);
  450. border-color: var(--primary);
  451. color: white;
  452. }
  453. /* 输入区域 */
  454. .chat-input-area {
  455. padding: 16px 24px;
  456. background: var(--bg-card);
  457. border-top: 1px solid var(--border);
  458. }
  459. .input-container {
  460. display: flex;
  461. gap: 12px;
  462. align-items: center;
  463. }
  464. .input-wrapper {
  465. flex: 1;
  466. display: flex;
  467. align-items: center;
  468. background: var(--bg-hover);
  469. border: 1px solid var(--border);
  470. border-radius: 12px;
  471. padding: 4px;
  472. }
  473. .input-action {
  474. width: 36px;
  475. height: 36px;
  476. background: transparent;
  477. border: none;
  478. color: var(--text-muted);
  479. cursor: pointer;
  480. display: flex;
  481. align-items: center;
  482. justify-content: center;
  483. border-radius: 8px;
  484. }
  485. .input-action:hover {
  486. background: var(--border);
  487. color: var(--text-primary);
  488. }
  489. .chat-input {
  490. flex: 1;
  491. background: transparent;
  492. border: none;
  493. color: var(--text-primary);
  494. font-size: 14px;
  495. padding: 8px;
  496. }
  497. .chat-input::placeholder {
  498. color: var(--text-muted);
  499. }
  500. .chat-input:focus {
  501. outline: none;
  502. }
  503. .send-btn {
  504. width: 40px;
  505. height: 40px;
  506. background: var(--gradient-1);
  507. border: none;
  508. border-radius: 10px;
  509. color: white;
  510. cursor: pointer;
  511. display: flex;
  512. align-items: center;
  513. justify-content: center;
  514. }
  515. .send-btn:hover {
  516. opacity: 0.9;
  517. }
  518. /* 数据面板 */
  519. .data-panel {
  520. width: 320px;
  521. background: var(--bg-card);
  522. border-left: 1px solid var(--border);
  523. overflow-y: auto;
  524. padding: 20px;
  525. }
  526. .panel-section {
  527. margin-bottom: 24px;
  528. }
  529. .panel-header {
  530. display: flex;
  531. justify-content: space-between;
  532. align-items: center;
  533. margin-bottom: 16px;
  534. }
  535. .panel-title {
  536. font-size: 14px;
  537. font-weight: 600;
  538. }
  539. .panel-action {
  540. font-size: 12px;
  541. color: var(--primary);
  542. cursor: pointer;
  543. }
  544. .stats-grid {
  545. display: grid;
  546. grid-template-columns: 1fr 1fr;
  547. gap: 12px;
  548. }
  549. .stat-card {
  550. background: var(--bg-hover);
  551. border-radius: 10px;
  552. padding: 12px;
  553. }
  554. .stat-label {
  555. font-size: 11px;
  556. color: var(--text-secondary);
  557. margin-bottom: 4px;
  558. }
  559. .stat-value {
  560. font-size: 20px;
  561. font-weight: 700;
  562. }
  563. .stat-change {
  564. font-size: 10px;
  565. display: flex;
  566. align-items: center;
  567. gap: 4px;
  568. margin-top: 4px;
  569. }
  570. .stat-change.up {
  571. color: var(--success);
  572. }
  573. /* 进度列表 */
  574. .progress-list {
  575. display: flex;
  576. flex-direction: column;
  577. gap: 12px;
  578. }
  579. .progress-item {
  580. display: flex;
  581. flex-direction: column;
  582. gap: 6px;
  583. }
  584. .progress-header {
  585. display: flex;
  586. justify-content: space-between;
  587. font-size: 12px;
  588. }
  589. .progress-bar {
  590. height: 6px;
  591. background: var(--bg-dark);
  592. border-radius: 3px;
  593. overflow: hidden;
  594. }
  595. .progress-fill {
  596. height: 100%;
  597. border-radius: 3px;
  598. transition: width 0.5s;
  599. }
  600. .progress-fill.blue {
  601. background: var(--primary);
  602. }
  603. .progress-fill.purple {
  604. background: var(--accent);
  605. }
  606. .progress-fill.cyan {
  607. background: var(--info);
  608. }
  609. /* 活动列表 */
  610. .activity-list {
  611. display: flex;
  612. flex-direction: column;
  613. gap: 12px;
  614. }
  615. .activity-item {
  616. display: flex;
  617. gap: 10px;
  618. }
  619. .activity-icon {
  620. width: 32px;
  621. height: 32px;
  622. border-radius: 8px;
  623. display: flex;
  624. align-items: center;
  625. justify-content: center;
  626. font-size: 12px;
  627. flex-shrink: 0;
  628. }
  629. .activity-icon.email {
  630. background: rgba(99, 102, 241, 0.2);
  631. color: var(--primary);
  632. }
  633. .activity-icon.whatsapp {
  634. background: rgba(37, 211, 102, 0.2);
  635. color: #25D366;
  636. }
  637. .activity-icon.linkedin {
  638. background: rgba(10, 102, 194, 0.2);
  639. color: #0A66C2;
  640. }
  641. .activity-text {
  642. font-size: 12px;
  643. }
  644. .activity-time {
  645. font-size: 10px;
  646. color: var(--text-muted);
  647. margin-top: 2px;
  648. }
  649. /* 洞察卡片 */
  650. .insight-card {
  651. background: rgba(99, 102, 241, 0.1);
  652. border: 1px solid rgba(99, 102, 241, 0.2);
  653. border-radius: 12px;
  654. padding: 14px;
  655. }
  656. .insight-header {
  657. display: flex;
  658. align-items: center;
  659. gap: 8px;
  660. font-size: 12px;
  661. font-weight: 600;
  662. color: var(--primary);
  663. margin-bottom: 8px;
  664. }
  665. .insight-text {
  666. font-size: 12px;
  667. color: var(--text-secondary);
  668. line-height: 1.6;
  669. }
  670. /* 弹窗 */
  671. .modal-overlay {
  672. position: fixed;
  673. top: 0;
  674. left: 0;
  675. right: 0;
  676. bottom: 0;
  677. background: rgba(0, 0, 0, 0.7);
  678. display: flex;
  679. align-items: center;
  680. justify-content: center;
  681. z-index: 1000;
  682. padding: 20px;
  683. }
  684. .modal {
  685. background: var(--bg-card);
  686. border-radius: 16px;
  687. width: 100%;
  688. max-width: 700px;
  689. max-height: 90vh;
  690. overflow: hidden;
  691. display: flex;
  692. flex-direction: column;
  693. }
  694. .modal-header {
  695. display: flex;
  696. justify-content: space-between;
  697. align-items: center;
  698. padding: 20px;
  699. border-bottom: 1px solid var(--border);
  700. }
  701. .modal-title {
  702. font-size: 18px;
  703. font-weight: 600;
  704. display: flex;
  705. align-items: center;
  706. gap: 10px;
  707. }
  708. .modal-close {
  709. width: 32px;
  710. height: 32px;
  711. background: var(--bg-hover);
  712. border: none;
  713. border-radius: 8px;
  714. color: var(--text-secondary);
  715. cursor: pointer;
  716. display: flex;
  717. align-items: center;
  718. justify-content: center;
  719. }
  720. .modal-close:hover {
  721. background: var(--border);
  722. color: var(--text-primary);
  723. }
  724. .modal-body {
  725. flex: 1;
  726. overflow-y: auto;
  727. padding: 20px;
  728. }
  729. .modal-footer {
  730. display: flex;
  731. justify-content: flex-end;
  732. gap: 12px;
  733. padding: 20px;
  734. border-top: 1px solid var(--border);
  735. }
  736. /* 表单样式 */
  737. .form-section {
  738. margin-bottom: 24px;
  739. }
  740. .form-section-title {
  741. font-size: 14px;
  742. font-weight: 600;
  743. margin-bottom: 16px;
  744. display: flex;
  745. align-items: center;
  746. gap: 8px;
  747. }
  748. .form-row {
  749. display: grid;
  750. grid-template-columns: 1fr 1fr;
  751. gap: 16px;
  752. }
  753. .form-group {
  754. margin-bottom: 16px;
  755. }
  756. .form-label {
  757. display: block;
  758. font-size: 12px;
  759. color: var(--text-secondary);
  760. margin-bottom: 6px;
  761. }
  762. .form-input,
  763. .form-select {
  764. width: 100%;
  765. padding: 10px 14px;
  766. background: var(--bg-dark);
  767. border: 1px solid var(--border);
  768. border-radius: 8px;
  769. color: var(--text-primary);
  770. font-size: 13px;
  771. }
  772. .form-input:focus,
  773. .form-select:focus {
  774. outline: none;
  775. border-color: var(--primary);
  776. }
  777. .form-input::placeholder {
  778. color: var(--text-muted);
  779. }
  780. .required {
  781. color: var(--danger);
  782. }
  783. /* 标签 */
  784. .keyword-tags {
  785. display: flex;
  786. flex-wrap: wrap;
  787. gap: 8px;
  788. }
  789. .keyword-tag {
  790. padding: 6px 12px;
  791. background: rgba(99, 102, 241, 0.2);
  792. border-radius: 20px;
  793. font-size: 12px;
  794. display: flex;
  795. align-items: center;
  796. gap: 6px;
  797. }
  798. .keyword-tag i {
  799. cursor: pointer;
  800. opacity: 0.6;
  801. }
  802. .keyword-tag i:hover {
  803. opacity: 1;
  804. }
  805. /* 数据源选择 */
  806. .source-grid {
  807. display: grid;
  808. grid-template-columns: repeat(4, 1fr);
  809. gap: 12px;
  810. }
  811. .source-card {
  812. padding: 16px;
  813. background: var(--bg-dark);
  814. border: 1px solid var(--border);
  815. border-radius: 12px;
  816. text-align: center;
  817. cursor: pointer;
  818. transition: all 0.2s;
  819. }
  820. .source-card:hover {
  821. border-color: var(--primary);
  822. }
  823. .source-card.selected {
  824. border-color: var(--primary);
  825. background: rgba(99, 102, 241, 0.1);
  826. }
  827. .source-icon {
  828. font-size: 24px;
  829. margin-bottom: 8px;
  830. }
  831. .source-name {
  832. font-size: 12px;
  833. font-weight: 600;
  834. margin-bottom: 4px;
  835. }
  836. .source-desc {
  837. font-size: 10px;
  838. color: var(--text-muted);
  839. }
  840. /* 规则切换 */
  841. .rule-item {
  842. display: flex;
  843. gap: 12px;
  844. padding: 12px;
  845. background: var(--bg-dark);
  846. border-radius: 10px;
  847. margin-bottom: 8px;
  848. }
  849. .rule-toggle {
  850. width: 44px;
  851. height: 24px;
  852. background: var(--border);
  853. border-radius: 12px;
  854. position: relative;
  855. cursor: pointer;
  856. flex-shrink: 0;
  857. }
  858. .rule-toggle::after {
  859. content: '';
  860. position: absolute;
  861. top: 3px;
  862. left: 3px;
  863. width: 18px;
  864. height: 18px;
  865. background: white;
  866. border-radius: 50%;
  867. transition: all 0.2s;
  868. }
  869. .rule-toggle.active {
  870. background: var(--success);
  871. }
  872. .rule-toggle.active::after {
  873. left: 23px;
  874. }
  875. .rule-title {
  876. font-size: 13px;
  877. font-weight: 500;
  878. margin-bottom: 2px;
  879. }
  880. .rule-desc {
  881. font-size: 11px;
  882. color: var(--text-secondary);
  883. }
  884. /* 打字指示器 */
  885. .typing-indicator {
  886. display: flex;
  887. gap: 4px;
  888. }
  889. .typing-indicator span {
  890. width: 8px;
  891. height: 8px;
  892. background: var(--primary);
  893. border-radius: 50%;
  894. animation: typing 1.4s infinite ease-in-out both;
  895. }
  896. .typing-indicator span:nth-child(1) { animation-delay: -0.32s; }
  897. .typing-indicator span:nth-child(2) { animation-delay: -0.16s; }
  898. @keyframes typing {
  899. 0%, 80%, 100% { transform: scale(0); }
  900. 40% { transform: scale(1); }
  901. }
  902. /* 智能卡片 */
  903. .smart-card {
  904. background: var(--bg-card);
  905. border: 1px solid var(--border);
  906. border-radius: 12px;
  907. padding: 16px;
  908. margin-top: 12px;
  909. }
  910. .smart-card-header {
  911. font-size: 13px;
  912. font-weight: 600;
  913. color: var(--primary);
  914. display: flex;
  915. align-items: center;
  916. gap: 8px;
  917. margin-bottom: 12px;
  918. }
  919. /* 客户列表 */
  920. .customer-list {
  921. display: flex;
  922. flex-direction: column;
  923. gap: 8px;
  924. }
  925. .customer-item {
  926. display: flex;
  927. align-items: center;
  928. gap: 12px;
  929. padding: 10px;
  930. background: var(--bg-hover);
  931. border-radius: 8px;
  932. cursor: pointer;
  933. }
  934. .customer-flag {
  935. font-size: 20px;
  936. }
  937. .customer-info {
  938. flex: 1;
  939. }
  940. .customer-name {
  941. font-size: 13px;
  942. font-weight: 500;
  943. }
  944. .customer-detail {
  945. font-size: 11px;
  946. color: var(--text-secondary);
  947. }
  948. .customer-score {
  949. padding: 4px 10px;
  950. border-radius: 12px;
  951. font-size: 11px;
  952. font-weight: 600;
  953. }
  954. .customer-score.score-high {
  955. background: rgba(16, 185, 129, 0.2);
  956. color: var(--success);
  957. }
  958. .customer-score.score-medium {
  959. background: rgba(245, 158, 11, 0.2);
  960. color: var(--warning);
  961. }
  962. /* 风险预警 */
  963. .risk-alert-list {
  964. display: flex;
  965. flex-direction: column;
  966. gap: 10px;
  967. }
  968. .risk-alert-item {
  969. display: flex;
  970. gap: 10px;
  971. padding: 10px;
  972. border-radius: 8px;
  973. cursor: pointer;
  974. }
  975. .risk-alert-item.high {
  976. background: rgba(239, 68, 68, 0.1);
  977. border-left: 3px solid var(--danger);
  978. }
  979. .risk-alert-item.medium {
  980. background: rgba(245, 158, 11, 0.1);
  981. border-left: 3px solid var(--warning);
  982. }
  983. .risk-alert-icon {
  984. width: 28px;
  985. height: 28px;
  986. display: flex;
  987. align-items: center;
  988. justify-content: center;
  989. font-size: 14px;
  990. }
  991. .risk-alert-item.high .risk-alert-icon {
  992. color: var(--danger);
  993. }
  994. .risk-alert-item.medium .risk-alert-icon {
  995. color: var(--warning);
  996. }
  997. .risk-alert-title {
  998. font-size: 12px;
  999. font-weight: 600;
  1000. }
  1001. .risk-alert-desc {
  1002. font-size: 10px;
  1003. color: var(--text-secondary);
  1004. }
  1005. /* 进化卡片 */
  1006. .evolution-card {
  1007. background: var(--bg-hover);
  1008. border-radius: 12px;
  1009. padding: 14px;
  1010. }
  1011. .evolution-badge {
  1012. display: inline-block;
  1013. padding: 3px 8px;
  1014. background: rgba(99, 102, 241, 0.2);
  1015. color: var(--primary);
  1016. border-radius: 10px;
  1017. font-size: 10px;
  1018. font-weight: 600;
  1019. margin-bottom: 8px;
  1020. }
  1021. .evolution-title {
  1022. font-size: 14px;
  1023. font-weight: 600;
  1024. margin-bottom: 10px;
  1025. }
  1026. .evolution-stats {
  1027. margin-bottom: 10px;
  1028. }
  1029. .evolution-stat-value {
  1030. font-size: 20px;
  1031. font-weight: 700;
  1032. color: var(--success);
  1033. }
  1034. .evolution-stat-label {
  1035. font-size: 10px;
  1036. color: var(--text-secondary);
  1037. }
  1038. .evolution-content {
  1039. font-size: 12px;
  1040. color: var(--text-secondary);
  1041. margin-bottom: 12px;
  1042. }
  1043. /* 页面样式 */
  1044. .page {
  1045. display: none;
  1046. }
  1047. .page.active {
  1048. display: flex;
  1049. flex: 1;
  1050. }
  1051. /* 数据页面 */
  1052. .data-page {
  1053. flex: 1;
  1054. display: flex;
  1055. flex-direction: column;
  1056. padding: 24px;
  1057. overflow-y: auto;
  1058. }
  1059. .data-header {
  1060. display: flex;
  1061. justify-content: space-between;
  1062. align-items: center;
  1063. margin-bottom: 24px;
  1064. }
  1065. .data-title {
  1066. font-size: 20px;
  1067. font-weight: 600;
  1068. }
  1069. /* 统计行 */
  1070. .stat-row {
  1071. display: grid;
  1072. grid-template-columns: repeat(5, 1fr);
  1073. gap: 16px;
  1074. margin-bottom: 24px;
  1075. }
  1076. .stat-card-lg {
  1077. display: flex;
  1078. align-items: center;
  1079. gap: 14px;
  1080. padding: 18px;
  1081. background: var(--bg-card);
  1082. border-radius: 14px;
  1083. border: 1px solid var(--border);
  1084. cursor: pointer;
  1085. transition: all 0.2s;
  1086. }
  1087. .stat-card-lg:hover {
  1088. border-color: var(--primary);
  1089. }
  1090. .stat-icon-lg {
  1091. width: 48px;
  1092. height: 48px;
  1093. border-radius: 12px;
  1094. display: flex;
  1095. align-items: center;
  1096. justify-content: center;
  1097. font-size: 20px;
  1098. }
  1099. .stat-icon-lg.blue {
  1100. background: rgba(99, 102, 241, 0.2);
  1101. color: var(--primary);
  1102. }
  1103. .stat-icon-lg.green {
  1104. background: rgba(16, 185, 129, 0.2);
  1105. color: var(--success);
  1106. }
  1107. .stat-icon-lg.purple {
  1108. background: rgba(139, 92, 246, 0.2);
  1109. color: var(--secondary);
  1110. }
  1111. .stat-icon-lg.orange {
  1112. background: rgba(245, 158, 11, 0.2);
  1113. color: var(--warning);
  1114. }
  1115. .stat-content-lg h3 {
  1116. font-size: 24px;
  1117. font-weight: 700;
  1118. }
  1119. .stat-content-lg p {
  1120. font-size: 12px;
  1121. color: var(--text-secondary);
  1122. }
  1123. /* 市场网格 */
  1124. .market-grid {
  1125. display: grid;
  1126. grid-template-columns: repeat(2, 1fr);
  1127. gap: 20px;
  1128. }
  1129. .market-card {
  1130. background: var(--bg-card);
  1131. border-radius: 14px;
  1132. border: 1px solid var(--border);
  1133. padding: 20px;
  1134. }
  1135. .market-card-header {
  1136. margin-bottom: 16px;
  1137. }
  1138. .market-card-title {
  1139. font-size: 14px;
  1140. font-weight: 600;
  1141. }
  1142. .market-chart {
  1143. display: flex;
  1144. align-items: flex-end;
  1145. justify-content: space-around;
  1146. height: 150px;
  1147. padding-top: 20px;
  1148. }
  1149. .chart-bar {
  1150. width: 40px;
  1151. background: var(--gradient-1);
  1152. border-radius: 6px 6px 0 0;
  1153. position: relative;
  1154. transition: height 0.5s;
  1155. }
  1156. .chart-bar .bar-value {
  1157. position: absolute;
  1158. top: -20px;
  1159. left: 50%;
  1160. transform: translateX(-50%);
  1161. font-size: 10px;
  1162. font-weight: 600;
  1163. white-space: nowrap;
  1164. }
  1165. .chart-bar::after {
  1166. content: attr(data-label);
  1167. position: absolute;
  1168. bottom: -20px;
  1169. left: 50%;
  1170. transform: translateX(-50%);
  1171. font-size: 10px;
  1172. color: var(--text-secondary);
  1173. }
  1174. /* 帮助网格 */
  1175. .help-grid {
  1176. display: grid;
  1177. grid-template-columns: repeat(3, 1fr);
  1178. gap: 20px;
  1179. }
  1180. .help-card {
  1181. background: var(--bg-card);
  1182. border: 1px solid var(--border);
  1183. border-radius: 14px;
  1184. padding: 24px;
  1185. text-align: center;
  1186. cursor: pointer;
  1187. transition: all 0.2s;
  1188. }
  1189. .help-card:hover {
  1190. border-color: var(--primary);
  1191. }
  1192. .help-icon {
  1193. font-size: 32px;
  1194. margin-bottom: 12px;
  1195. }
  1196. .help-title {
  1197. font-size: 14px;
  1198. font-weight: 600;
  1199. margin-bottom: 6px;
  1200. }
  1201. .help-desc {
  1202. font-size: 12px;
  1203. color: var(--text-secondary);
  1204. }
  1205. /* 设置区域 */
  1206. .settings-section {
  1207. background: var(--bg-card);
  1208. border-radius: 14px;
  1209. border: 1px solid var(--border);
  1210. margin-bottom: 20px;
  1211. overflow: hidden;
  1212. }
  1213. .settings-title {
  1214. padding: 16px 20px;
  1215. font-size: 14px;
  1216. font-weight: 600;
  1217. background: var(--bg-hover);
  1218. display: flex;
  1219. align-items: center;
  1220. gap: 10px;
  1221. }
  1222. .settings-item {
  1223. display: flex;
  1224. justify-content: space-between;
  1225. align-items: center;
  1226. padding: 16px 20px;
  1227. border-bottom: 1px solid var(--border);
  1228. cursor: pointer;
  1229. }
  1230. .settings-item:last-child {
  1231. border-bottom: none;
  1232. }
  1233. .settings-item-info h4 {
  1234. font-size: 13px;
  1235. font-weight: 500;
  1236. margin-bottom: 2px;
  1237. }
  1238. .settings-item-info p {
  1239. font-size: 11px;
  1240. color: var(--text-secondary);
  1241. }
  1242. .settings-item-right {
  1243. display: flex;
  1244. align-items: center;
  1245. gap: 10px;
  1246. }
  1247. .settings-value {
  1248. font-size: 12px;
  1249. color: var(--text-secondary);
  1250. }
  1251. .settings-value.success {
  1252. color: var(--success);
  1253. }
  1254. .settings-value.warning {
  1255. color: var(--warning);
  1256. }
  1257. .settings-toggle {
  1258. width: 44px;
  1259. height: 24px;
  1260. background: var(--border);
  1261. border-radius: 12px;
  1262. position: relative;
  1263. cursor: pointer;
  1264. }
  1265. .settings-toggle::after {
  1266. content: '';
  1267. position: absolute;
  1268. top: 3px;
  1269. left: 3px;
  1270. width: 18px;
  1271. height: 18px;
  1272. background: white;
  1273. border-radius: 50%;
  1274. transition: all 0.2s;
  1275. }
  1276. .settings-toggle.active {
  1277. background: var(--success);
  1278. }
  1279. .settings-toggle.active::after {
  1280. left: 23px;
  1281. }
  1282. /* 任务菜单 */
  1283. .task-menu {
  1284. position: absolute;
  1285. top: 100%;
  1286. right: 0;
  1287. width: 320px;
  1288. background: var(--bg-card);
  1289. border: 1px solid var(--border);
  1290. border-radius: 12px;
  1291. padding: 8px;
  1292. display: none;
  1293. z-index: 100;
  1294. }
  1295. .task-menu.show {
  1296. display: block;
  1297. }
  1298. .task-menu-item {
  1299. display: flex;
  1300. gap: 12px;
  1301. padding: 12px;
  1302. border-radius: 8px;
  1303. cursor: pointer;
  1304. }
  1305. .task-menu-item:hover {
  1306. background: var(--bg-hover);
  1307. }
  1308. .task-menu-icon {
  1309. width: 40px;
  1310. height: 40px;
  1311. border-radius: 10px;
  1312. display: flex;
  1313. align-items: center;
  1314. justify-content: center;
  1315. font-size: 18px;
  1316. }
  1317. .task-menu-icon.prospect {
  1318. background: rgba(99, 102, 241, 0.2);
  1319. }
  1320. .task-menu-icon.marketing {
  1321. background: rgba(16, 185, 129, 0.2);
  1322. }
  1323. .task-menu-icon.analysis {
  1324. background: rgba(245, 158, 11, 0.2);
  1325. }
  1326. .task-menu-text h4 {
  1327. font-size: 13px;
  1328. font-weight: 600;
  1329. margin-bottom: 2px;
  1330. }
  1331. .task-menu-text p {
  1332. font-size: 11px;
  1333. color: var(--text-secondary);
  1334. }
  1335. /* 过渡动画 */
  1336. .fade-enter-active,
  1337. .fade-leave-active {
  1338. transition: opacity 0.3s ease;
  1339. }
  1340. .fade-enter-from,
  1341. .fade-leave-to {
  1342. opacity: 0;
  1343. }
  1344. /* 响应式 */
  1345. @media (max-width: 1400px) {
  1346. .data-panel {
  1347. width: 280px;
  1348. }
  1349. .stat-row {
  1350. grid-template-columns: repeat(3, 1fr);
  1351. }
  1352. }
  1353. @media (max-width: 1200px) {
  1354. .sidebar {
  1355. width: 220px;
  1356. }
  1357. .main-content {
  1358. margin-left: 220px;
  1359. }
  1360. .data-panel {
  1361. display: none;
  1362. }
  1363. }
  1364. @media (max-width: 992px) {
  1365. .sidebar {
  1366. transform: translateX(-100%);
  1367. }
  1368. .main-content {
  1369. margin-left: 0;
  1370. }
  1371. .stat-row {
  1372. grid-template-columns: repeat(2, 1fr);
  1373. }
  1374. .help-grid {
  1375. grid-template-columns: repeat(2, 1fr);
  1376. }
  1377. }