earnings.scss 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191
  1. :host {
  2. display: block;
  3. width: 100%;
  4. min-height: 100vh;
  5. background: #f4f6f8;
  6. font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', sans-serif;
  7. color: #1a1a1a;
  8. -webkit-font-smoothing: antialiased;
  9. }
  10. // 动画定义
  11. @keyframes slideDown {
  12. from {
  13. opacity: 0;
  14. transform: translateY(-10px) scale(0.95);
  15. }
  16. to {
  17. opacity: 1;
  18. transform: translateY(0) scale(1);
  19. }
  20. }
  21. @keyframes slideUp {
  22. from {
  23. opacity: 1;
  24. transform: translateY(0) scale(1);
  25. }
  26. to {
  27. opacity: 0;
  28. transform: translateY(-10px) scale(0.95);
  29. }
  30. }
  31. @keyframes fadeIn {
  32. from {
  33. opacity: 0;
  34. }
  35. to {
  36. opacity: 1;
  37. }
  38. }
  39. @keyframes pulse {
  40. 0% {
  41. transform: scale(1);
  42. }
  43. 50% {
  44. transform: scale(1.05);
  45. }
  46. 100% {
  47. transform: scale(1);
  48. }
  49. }
  50. @keyframes shimmer {
  51. 0% {
  52. background-position: -1000px 0;
  53. }
  54. 100% {
  55. background-position: 1000px 0;
  56. }
  57. }
  58. // 顶部标题栏
  59. .header {
  60. position: fixed;
  61. top: 0;
  62. left: 0;
  63. right: 0;
  64. height: 56px;
  65. background: linear-gradient(145deg, #1b5e20 0%, #2e7d32 40%, #43a047 100%);
  66. color: white;
  67. display: flex;
  68. align-items: center;
  69. padding: 0 16px;
  70. z-index: 1000;
  71. box-shadow: 0 2px 12px rgba(27, 94, 32, 0.3);
  72. .back-btn {
  73. width: 40px;
  74. height: 40px;
  75. display: flex;
  76. align-items: center;
  77. justify-content: center;
  78. font-size: 20px;
  79. cursor: pointer;
  80. border-radius: 50%;
  81. transition: all 0.3s ease;
  82. background: rgba(255, 255, 255, 0.1);
  83. backdrop-filter: blur(10px);
  84. &:hover {
  85. background: rgba(255, 255, 255, 0.2);
  86. transform: scale(1.1);
  87. }
  88. &:active {
  89. transform: scale(0.95);
  90. }
  91. }
  92. .header-title {
  93. flex: 1;
  94. text-align: center;
  95. font-size: 20px;
  96. font-weight: 700;
  97. margin-right: 40px;
  98. text-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  99. }
  100. }
  101. @keyframes gradientShift {
  102. 0%, 100% {
  103. background-position: 0% 50%;
  104. }
  105. 50% {
  106. background-position: 100% 50%;
  107. }
  108. }
  109. // 主容器
  110. .container {
  111. padding: 75px 15px 100px;
  112. background: linear-gradient(to bottom, #f8f9fa 0%, #e8f5e9 100%);
  113. min-height: 100vh;
  114. }
  115. // 通用区块样式
  116. .section {
  117. background: white;
  118. border-radius: 20px;
  119. padding: 20px;
  120. margin-bottom: 20px;
  121. box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  122. border: 1px solid rgba(76, 175, 80, 0.1);
  123. animation: fadeIn 0.5s ease-out;
  124. .section-header {
  125. margin-bottom: 20px;
  126. .section-title {
  127. font-size: 18px;
  128. font-weight: 700;
  129. color: #2e7d32;
  130. display: flex;
  131. align-items: center;
  132. gap: 10px;
  133. margin-bottom: 5px;
  134. i {
  135. font-size: 20px;
  136. }
  137. }
  138. .section-subtitle {
  139. font-size: 13px;
  140. color: #6c757d;
  141. margin-left: 30px;
  142. }
  143. }
  144. .section-title {
  145. font-size: 18px;
  146. font-weight: 700;
  147. color: #2e7d32;
  148. margin-bottom: 20px;
  149. display: flex;
  150. align-items: center;
  151. gap: 10px;
  152. i {
  153. font-size: 20px;
  154. }
  155. }
  156. }
  157. // 收益总览卡片
  158. .earnings-overview {
  159. background: linear-gradient(135deg, #ffffff 0%, #f1f8e9 100%);
  160. border-radius: 25px;
  161. padding: 25px;
  162. margin-bottom: 25px;
  163. box-shadow: 0 8px 30px rgba(76, 175, 80, 0.2);
  164. animation: fadeIn 0.6s ease-out;
  165. border: 2px solid rgba(76, 175, 80, 0.2);
  166. position: relative;
  167. overflow: hidden;
  168. &::before {
  169. content: '';
  170. position: absolute;
  171. top: -50%;
  172. right: -50%;
  173. width: 200%;
  174. height: 200%;
  175. background: radial-gradient(circle, rgba(76, 175, 80, 0.1) 0%, transparent 70%);
  176. animation: pulse 4s ease-in-out infinite;
  177. }
  178. .earnings-stats {
  179. display: grid;
  180. grid-template-columns: repeat(2, 1fr);
  181. gap: 15px;
  182. margin-bottom: 25px;
  183. position: relative;
  184. z-index: 1;
  185. .stat-item {
  186. display: flex;
  187. align-items: center;
  188. gap: 15px;
  189. padding: 20px;
  190. border-radius: 18px;
  191. transition: all 0.3s ease;
  192. position: relative;
  193. overflow: hidden;
  194. &::before {
  195. content: '';
  196. position: absolute;
  197. top: 0;
  198. left: -100%;
  199. width: 100%;
  200. height: 100%;
  201. background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
  202. transition: left 0.6s;
  203. }
  204. &:hover::before {
  205. left: 100%;
  206. }
  207. &.cash {
  208. background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(46, 125, 50, 0.05));
  209. border: 2px solid rgba(76, 175, 80, 0.2);
  210. .stat-icon {
  211. background: linear-gradient(135deg, #4caf50, #66bb6a);
  212. }
  213. .stat-value {
  214. color: #2e7d32;
  215. }
  216. }
  217. &.points {
  218. background: linear-gradient(135deg, rgba(255, 152, 0, 0.1), rgba(255, 193, 7, 0.05));
  219. border: 2px solid rgba(255, 152, 0, 0.2);
  220. .stat-icon {
  221. background: linear-gradient(135deg, #ff9800, #ffc107);
  222. }
  223. .stat-value {
  224. color: #f57c00;
  225. }
  226. }
  227. &:hover {
  228. transform: translateY(-3px);
  229. box-shadow: 0 8px 25px rgba(76, 175, 80, 0.2);
  230. }
  231. .stat-icon {
  232. width: 55px;
  233. height: 55px;
  234. border-radius: 15px;
  235. display: flex;
  236. align-items: center;
  237. justify-content: center;
  238. color: white;
  239. font-size: 24px;
  240. box-shadow: 0 4px 15px rgba(0, 0, 0, 0.1);
  241. flex-shrink: 0;
  242. i {
  243. animation: pulse 3s ease-in-out infinite;
  244. }
  245. }
  246. .stat-info {
  247. flex: 1;
  248. .stat-value {
  249. font-size: 24px;
  250. font-weight: 700;
  251. margin-bottom: 5px;
  252. }
  253. .stat-label {
  254. font-size: 13px;
  255. color: #6c757d;
  256. font-weight: 500;
  257. }
  258. }
  259. }
  260. }
  261. .carbon-section {
  262. background: rgba(255, 255, 255, 0.8);
  263. backdrop-filter: blur(10px);
  264. border-radius: 20px;
  265. padding: 20px;
  266. border: 2px solid rgba(26, 188, 156, 0.2);
  267. position: relative;
  268. z-index: 1;
  269. .carbon-header {
  270. display: flex;
  271. justify-content: space-between;
  272. align-items: center;
  273. margin-bottom: 15px;
  274. .carbon-title {
  275. font-size: 16px;
  276. color: #1abc9c;
  277. font-weight: 700;
  278. display: flex;
  279. align-items: center;
  280. gap: 8px;
  281. i {
  282. font-size: 18px;
  283. }
  284. }
  285. .carbon-value {
  286. font-size: 22px;
  287. font-weight: 700;
  288. color: #16a085;
  289. background: linear-gradient(135deg, #1abc9c, #16a085);
  290. -webkit-background-clip: text;
  291. -webkit-text-fill-color: transparent;
  292. background-clip: text;
  293. }
  294. }
  295. .time-range-selector {
  296. display: flex;
  297. gap: 8px;
  298. margin-bottom: 15px;
  299. background: #f8f9fa;
  300. padding: 5px;
  301. border-radius: 12px;
  302. .time-range-btn {
  303. flex: 1;
  304. padding: 8px 12px;
  305. border-radius: 8px;
  306. text-align: center;
  307. font-size: 13px;
  308. font-weight: 600;
  309. color: #6c757d;
  310. cursor: pointer;
  311. transition: all 0.3s ease;
  312. background: transparent;
  313. &:hover {
  314. background: rgba(26, 188, 156, 0.1);
  315. color: #1abc9c;
  316. }
  317. &.active {
  318. background: linear-gradient(135deg, #1abc9c, #16a085);
  319. color: white;
  320. box-shadow: 0 4px 15px rgba(26, 188, 156, 0.3);
  321. }
  322. }
  323. }
  324. .chart-container {
  325. height: 220px;
  326. background: white;
  327. border-radius: 15px;
  328. padding: 10px;
  329. box-shadow: 0 4px 15px rgba(0, 0, 0, 0.05);
  330. position: relative;
  331. }
  332. }
  333. }
  334. // 筛选栏
  335. .filter-bar {
  336. display: flex;
  337. gap: 10px;
  338. margin-bottom: 15px;
  339. overflow-x: auto;
  340. padding-bottom: 5px;
  341. &::-webkit-scrollbar {
  342. height: 3px;
  343. }
  344. &::-webkit-scrollbar-thumb {
  345. background: #4caf50;
  346. border-radius: 3px;
  347. }
  348. .filter-btn {
  349. padding: 10px 18px;
  350. border: 2px solid #e9ecef;
  351. border-radius: 25px;
  352. background: white;
  353. color: #6c757d;
  354. cursor: pointer;
  355. transition: all 0.3s ease;
  356. font-size: 14px;
  357. font-weight: 500;
  358. white-space: nowrap;
  359. display: flex;
  360. align-items: center;
  361. gap: 6px;
  362. i {
  363. font-size: 13px;
  364. }
  365. &:hover {
  366. border-color: #4caf50;
  367. color: #2e7d32;
  368. background: rgba(76, 175, 80, 0.05);
  369. transform: translateY(-2px);
  370. }
  371. &.active {
  372. background: linear-gradient(135deg, #2e7d32, #4caf50);
  373. color: white;
  374. border-color: #2e7d32;
  375. box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3);
  376. }
  377. }
  378. }
  379. // 日期筛选
  380. .date-filter {
  381. display: flex;
  382. align-items: center;
  383. gap: 10px;
  384. margin-bottom: 20px;
  385. padding: 15px;
  386. background: linear-gradient(135deg, #f8f9fa, #e8f5e9);
  387. border-radius: 15px;
  388. border: 2px solid rgba(76, 175, 80, 0.1);
  389. .date-input-group {
  390. flex: 1;
  391. display: flex;
  392. align-items: center;
  393. gap: 10px;
  394. > i {
  395. font-size: 16px;
  396. color: #4caf50;
  397. }
  398. .date-input {
  399. flex: 1;
  400. padding: 10px 12px;
  401. border: 2px solid #e0e0e0;
  402. border-radius: 10px;
  403. font-size: 13px;
  404. background: white;
  405. transition: all 0.3s ease;
  406. color: #333;
  407. &:focus {
  408. outline: none;
  409. border-color: #4caf50;
  410. box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
  411. }
  412. }
  413. .date-separator {
  414. font-size: 13px;
  415. color: #6c757d;
  416. font-weight: 500;
  417. }
  418. }
  419. .clear-date-btn {
  420. width: 36px;
  421. height: 36px;
  422. display: flex;
  423. align-items: center;
  424. justify-content: center;
  425. background: #dc3545;
  426. color: white;
  427. border: none;
  428. border-radius: 10px;
  429. font-size: 14px;
  430. cursor: pointer;
  431. transition: all 0.3s ease;
  432. flex-shrink: 0;
  433. &:hover {
  434. background: #c82333;
  435. transform: scale(1.1);
  436. }
  437. &:active {
  438. transform: scale(0.95);
  439. }
  440. }
  441. }
  442. // 收益列表
  443. .earnings-list {
  444. display: flex;
  445. flex-direction: column;
  446. gap: 12px;
  447. .earning-item {
  448. background: linear-gradient(135deg, #ffffff, #f8f9fa);
  449. border-radius: 15px;
  450. padding: 15px;
  451. display: flex;
  452. justify-content: space-between;
  453. align-items: center;
  454. cursor: pointer;
  455. transition: all 0.3s ease;
  456. border: 2px solid rgba(76, 175, 80, 0.1);
  457. position: relative;
  458. overflow: hidden;
  459. &::before {
  460. content: '';
  461. position: absolute;
  462. top: 0;
  463. left: -100%;
  464. width: 100%;
  465. height: 100%;
  466. background: linear-gradient(90deg, transparent, rgba(76, 175, 80, 0.05), transparent);
  467. transition: left 0.5s;
  468. }
  469. &:hover {
  470. transform: translateY(-3px);
  471. box-shadow: 0 8px 25px rgba(76, 175, 80, 0.15);
  472. border-color: rgba(76, 175, 80, 0.3);
  473. &::before {
  474. left: 100%;
  475. }
  476. .earning-icon {
  477. transform: scale(1.1);
  478. box-shadow: 0 6px 20px rgba(76, 175, 80, 0.3);
  479. }
  480. }
  481. .earning-info {
  482. display: flex;
  483. align-items: center;
  484. gap: 15px;
  485. flex: 1;
  486. .earning-icon {
  487. width: 50px;
  488. height: 50px;
  489. border-radius: 15px;
  490. background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.05));
  491. display: flex;
  492. align-items: center;
  493. justify-content: center;
  494. transition: all 0.3s ease;
  495. flex-shrink: 0;
  496. i {
  497. font-size: 22px;
  498. color: #4caf50;
  499. }
  500. }
  501. .earning-details {
  502. flex: 1;
  503. .earning-category {
  504. font-size: 16px;
  505. font-weight: 600;
  506. color: #333;
  507. margin-bottom: 5px;
  508. }
  509. .earning-time {
  510. font-size: 12px;
  511. color: #6c757d;
  512. display: flex;
  513. align-items: center;
  514. gap: 5px;
  515. margin-bottom: 3px;
  516. i {
  517. font-size: 11px;
  518. }
  519. }
  520. .earning-carbon {
  521. font-size: 12px;
  522. color: #1abc9c;
  523. display: flex;
  524. align-items: center;
  525. gap: 5px;
  526. font-weight: 500;
  527. i {
  528. font-size: 11px;
  529. }
  530. }
  531. }
  532. }
  533. .earning-amount {
  534. text-align: right;
  535. flex-shrink: 0;
  536. .cash-amount {
  537. font-size: 18px;
  538. font-weight: 700;
  539. color: #2e7d32;
  540. margin-bottom: 4px;
  541. display: flex;
  542. align-items: center;
  543. justify-content: flex-end;
  544. gap: 5px;
  545. i {
  546. font-size: 14px;
  547. }
  548. }
  549. .points-amount {
  550. font-size: 13px;
  551. color: #ff9800;
  552. font-weight: 500;
  553. display: flex;
  554. align-items: center;
  555. justify-content: flex-end;
  556. gap: 5px;
  557. i {
  558. font-size: 11px;
  559. }
  560. }
  561. }
  562. }
  563. }
  564. // 空状态
  565. .empty-state {
  566. text-align: center;
  567. padding: 60px 20px;
  568. .empty-icon {
  569. font-size: 60px;
  570. margin-bottom: 20px;
  571. opacity: 0.3;
  572. i {
  573. color: #6c757d;
  574. }
  575. }
  576. .empty-text {
  577. font-size: 16px;
  578. color: #6c757d;
  579. margin-bottom: 20px;
  580. }
  581. .empty-btn {
  582. padding: 12px 30px;
  583. background: linear-gradient(135deg, #4caf50, #66bb6a);
  584. color: white;
  585. border: none;
  586. border-radius: 25px;
  587. font-size: 14px;
  588. font-weight: 600;
  589. cursor: pointer;
  590. transition: all 0.3s ease;
  591. display: inline-flex;
  592. align-items: center;
  593. gap: 8px;
  594. &:hover {
  595. transform: translateY(-2px);
  596. box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4);
  597. }
  598. &:active {
  599. transform: translateY(0);
  600. }
  601. }
  602. }
  603. // 功能按钮区
  604. .action-buttons {
  605. display: grid;
  606. grid-template-columns: repeat(2, 1fr);
  607. gap: 15px;
  608. .action-btn {
  609. background: linear-gradient(135deg, #ffffff, #f8f9fa);
  610. border-radius: 18px;
  611. padding: 25px 20px;
  612. text-align: center;
  613. cursor: pointer;
  614. transition: all 0.3s ease;
  615. position: relative;
  616. overflow: hidden;
  617. border: 2px solid rgba(76, 175, 80, 0.1);
  618. &::before {
  619. content: '';
  620. position: absolute;
  621. top: 0;
  622. left: -100%;
  623. width: 100%;
  624. height: 100%;
  625. background: linear-gradient(90deg, transparent, rgba(76, 175, 80, 0.1), transparent);
  626. transition: left 0.5s;
  627. }
  628. &:hover::before {
  629. left: 100%;
  630. }
  631. &:hover {
  632. transform: translateY(-5px);
  633. box-shadow: 0 10px 30px rgba(76, 175, 80, 0.2);
  634. border-color: rgba(76, 175, 80, 0.3);
  635. .action-icon {
  636. transform: scale(1.15);
  637. i {
  638. animation: pulse 0.6s ease-in-out;
  639. }
  640. }
  641. }
  642. .action-icon {
  643. width: 60px;
  644. height: 60px;
  645. margin: 0 auto 12px;
  646. border-radius: 18px;
  647. display: flex;
  648. align-items: center;
  649. justify-content: center;
  650. font-size: 28px;
  651. transition: all 0.3s ease;
  652. }
  653. &.withdraw .action-icon {
  654. background: linear-gradient(135deg, #4caf50, #66bb6a);
  655. color: white;
  656. box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3);
  657. }
  658. &.exchange .action-icon {
  659. background: linear-gradient(135deg, #ff9800, #ffc107);
  660. color: white;
  661. box-shadow: 0 4px 15px rgba(255, 152, 0, 0.3);
  662. }
  663. &.donation .action-icon {
  664. background: linear-gradient(135deg, #e91e63, #f06292);
  665. color: white;
  666. box-shadow: 0 4px 15px rgba(233, 30, 99, 0.3);
  667. }
  668. &.export .action-icon {
  669. background: linear-gradient(135deg, #2196f3, #42a5f5);
  670. color: white;
  671. box-shadow: 0 4px 15px rgba(33, 150, 243, 0.3);
  672. }
  673. .action-text {
  674. font-size: 15px;
  675. color: #333;
  676. font-weight: 600;
  677. }
  678. }
  679. }
  680. // 模态框
  681. .modal {
  682. position: fixed;
  683. top: 0;
  684. left: 0;
  685. width: 100%;
  686. height: 100%;
  687. background: rgba(0, 0, 0, 0.6);
  688. display: flex;
  689. justify-content: center;
  690. align-items: center;
  691. z-index: 10000;
  692. backdrop-filter: blur(5px);
  693. animation: fadeIn 0.2s ease-out;
  694. .modal-content {
  695. background: white;
  696. border-radius: 25px;
  697. padding: 30px;
  698. width: 90%;
  699. max-width: 450px;
  700. max-height: 85vh;
  701. overflow-y: auto;
  702. box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
  703. animation: slideDown 0.3s ease-out;
  704. border: 2px solid rgba(76, 175, 80, 0.2);
  705. .modal-title {
  706. font-size: 22px;
  707. font-weight: 700;
  708. color: #2e7d32;
  709. margin-bottom: 15px;
  710. text-align: center;
  711. display: flex;
  712. align-items: center;
  713. justify-content: center;
  714. gap: 10px;
  715. i {
  716. font-size: 24px;
  717. }
  718. }
  719. .modal-desc {
  720. text-align: center;
  721. color: #6c757d;
  722. margin-bottom: 25px;
  723. font-size: 14px;
  724. }
  725. }
  726. }
  727. // 提现选项
  728. .withdraw-options {
  729. display: flex;
  730. gap: 12px;
  731. margin: 20px 0;
  732. .withdraw-option {
  733. flex: 1;
  734. padding: 18px 15px;
  735. border: 2px solid #e9ecef;
  736. border-radius: 15px;
  737. text-align: center;
  738. cursor: pointer;
  739. transition: all 0.3s ease;
  740. background: #f8f9fa;
  741. &:hover {
  742. border-color: rgba(76, 175, 80, 0.3);
  743. background: rgba(76, 175, 80, 0.05);
  744. transform: translateY(-2px);
  745. }
  746. &.active {
  747. border-color: #2e7d32;
  748. background: linear-gradient(135deg, rgba(76, 175, 80, 0.1), rgba(76, 175, 80, 0.05));
  749. box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2);
  750. .withdraw-icon i {
  751. color: #2e7d32;
  752. transform: scale(1.1);
  753. }
  754. .withdraw-name {
  755. color: #2e7d32;
  756. font-weight: 700;
  757. }
  758. }
  759. .withdraw-icon {
  760. margin-bottom: 10px;
  761. i {
  762. font-size: 28px;
  763. color: #6c757d;
  764. transition: all 0.3s ease;
  765. }
  766. }
  767. .withdraw-name {
  768. font-size: 14px;
  769. font-weight: 600;
  770. color: #333;
  771. }
  772. }
  773. }
  774. // 捐赠项目
  775. .donation-projects {
  776. margin: 20px 0;
  777. .project-card {
  778. padding: 18px;
  779. background: #f8f9fa;
  780. border-radius: 15px;
  781. margin-bottom: 12px;
  782. cursor: pointer;
  783. transition: all 0.3s ease;
  784. border: 2px solid transparent;
  785. &:hover {
  786. background: rgba(76, 175, 80, 0.05);
  787. border-color: rgba(76, 175, 80, 0.2);
  788. transform: translateX(5px);
  789. }
  790. &.selected {
  791. background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.05));
  792. border-color: #2e7d32;
  793. box-shadow: 0 4px 15px rgba(76, 175, 80, 0.2);
  794. .project-header {
  795. color: #2e7d32;
  796. i {
  797. color: #4caf50;
  798. }
  799. }
  800. }
  801. .project-header {
  802. display: flex;
  803. align-items: center;
  804. gap: 10px;
  805. margin-bottom: 8px;
  806. i {
  807. font-size: 20px;
  808. color: #4caf50;
  809. }
  810. .project-name {
  811. font-size: 16px;
  812. font-weight: 700;
  813. color: #333;
  814. }
  815. }
  816. .project-desc {
  817. font-size: 13px;
  818. color: #6c757d;
  819. line-height: 1.5;
  820. padding-left: 30px;
  821. }
  822. }
  823. }
  824. // 输入组
  825. .input-group {
  826. margin: 20px 0;
  827. .input-label {
  828. display: block;
  829. font-size: 14px;
  830. font-weight: 600;
  831. color: #333;
  832. margin-bottom: 10px;
  833. }
  834. .input-wrapper {
  835. position: relative;
  836. display: flex;
  837. align-items: center;
  838. background: white;
  839. border: 2px solid #e0e0e0;
  840. border-radius: 12px;
  841. overflow: hidden;
  842. transition: all 0.3s ease;
  843. &:focus-within {
  844. border-color: #4caf50;
  845. box-shadow: 0 0 0 3px rgba(76, 175, 80, 0.1);
  846. }
  847. .input-prefix {
  848. padding: 15px 0 15px 15px;
  849. font-size: 18px;
  850. font-weight: 700;
  851. color: #4caf50;
  852. }
  853. .amount-input {
  854. flex: 1;
  855. border: none;
  856. padding: 15px;
  857. font-size: 18px;
  858. font-weight: 600;
  859. outline: none;
  860. color: #333;
  861. &::placeholder {
  862. color: #bbb;
  863. font-weight: 400;
  864. }
  865. }
  866. }
  867. .input-hint {
  868. margin-top: 8px;
  869. font-size: 12px;
  870. color: #6c757d;
  871. strong {
  872. color: #2e7d32;
  873. font-weight: 700;
  874. }
  875. }
  876. }
  877. // 订单详情
  878. .order-details {
  879. .detail-section {
  880. margin-bottom: 20px;
  881. .detail-row {
  882. display: flex;
  883. justify-content: space-between;
  884. align-items: center;
  885. padding: 12px 0;
  886. border-bottom: 1px solid #f0f0f0;
  887. &:last-child {
  888. border-bottom: none;
  889. }
  890. .detail-label {
  891. font-size: 14px;
  892. color: #6c757d;
  893. font-weight: 500;
  894. }
  895. .detail-value {
  896. font-size: 14px;
  897. color: #333;
  898. font-weight: 600;
  899. text-align: right;
  900. }
  901. }
  902. }
  903. .earnings-summary {
  904. background: linear-gradient(135deg, #f8f9fa, #e8f5e9);
  905. border-radius: 15px;
  906. padding: 18px;
  907. margin-bottom: 20px;
  908. .summary-item {
  909. display: flex;
  910. align-items: center;
  911. gap: 15px;
  912. padding: 12px 0;
  913. &:not(:last-child) {
  914. border-bottom: 1px solid rgba(0, 0, 0, 0.05);
  915. }
  916. > i {
  917. width: 40px;
  918. height: 40px;
  919. border-radius: 12px;
  920. display: flex;
  921. align-items: center;
  922. justify-content: center;
  923. font-size: 18px;
  924. color: white;
  925. flex-shrink: 0;
  926. }
  927. &.cash > i {
  928. background: linear-gradient(135deg, #4caf50, #66bb6a);
  929. }
  930. &.points > i {
  931. background: linear-gradient(135deg, #ff9800, #ffc107);
  932. }
  933. &.carbon > i {
  934. background: linear-gradient(135deg, #1abc9c, #16a085);
  935. }
  936. .summary-info {
  937. flex: 1;
  938. display: flex;
  939. justify-content: space-between;
  940. align-items: center;
  941. .summary-label {
  942. font-size: 14px;
  943. color: #6c757d;
  944. font-weight: 500;
  945. }
  946. .summary-value {
  947. font-size: 16px;
  948. font-weight: 700;
  949. color: #333;
  950. }
  951. }
  952. }
  953. }
  954. }
  955. // 模态框按钮
  956. .modal-buttons {
  957. display: flex;
  958. gap: 12px;
  959. margin-top: 25px;
  960. .modal-btn {
  961. flex: 1;
  962. padding: 14px 20px;
  963. border: none;
  964. border-radius: 12px;
  965. font-size: 16px;
  966. font-weight: 700;
  967. cursor: pointer;
  968. transition: all 0.3s ease;
  969. &.cancel {
  970. background: #f8f9fa;
  971. color: #6c757d;
  972. border: 2px solid #e9ecef;
  973. &:hover {
  974. background: #e9ecef;
  975. color: #495057;
  976. }
  977. }
  978. &.confirm {
  979. background: linear-gradient(135deg, #2e7d32, #4caf50);
  980. color: white;
  981. box-shadow: 0 4px 15px rgba(76, 175, 80, 0.3);
  982. &:hover {
  983. transform: translateY(-2px);
  984. box-shadow: 0 6px 20px rgba(76, 175, 80, 0.4);
  985. }
  986. &:active {
  987. transform: translateY(0);
  988. }
  989. &.single {
  990. background: linear-gradient(135deg, #2196f3, #42a5f5);
  991. box-shadow: 0 4px 15px rgba(33, 150, 243, 0.3);
  992. &:hover {
  993. box-shadow: 0 6px 20px rgba(33, 150, 243, 0.4);
  994. }
  995. }
  996. }
  997. }
  998. }
  999. // 响应式设计
  1000. @media (max-width: 768px) {
  1001. .container {
  1002. padding: 70px 12px 100px;
  1003. }
  1004. .earnings-overview .earnings-stats {
  1005. grid-template-columns: 1fr;
  1006. }
  1007. .action-buttons {
  1008. grid-template-columns: 1fr;
  1009. }
  1010. .date-filter {
  1011. flex-direction: column;
  1012. align-items: stretch;
  1013. .date-input-group {
  1014. flex-direction: column;
  1015. align-items: stretch;
  1016. .date-input {
  1017. width: 100%;
  1018. }
  1019. }
  1020. .clear-date-btn {
  1021. width: 100%;
  1022. height: 40px;
  1023. }
  1024. }
  1025. }