project-detail.component.scss 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306
  1. // 项目详情核心组件样式
  2. // CSS Variables
  3. :host {
  4. --primary-color: #3880ff;
  5. --primary-rgb: 56, 128, 255;
  6. --secondary-color: #0cd1e8;
  7. --tertiary-color: #7044ff;
  8. --success-color: #2dd36f;
  9. --warning-color: #ffc409;
  10. --danger-color: #eb445a;
  11. --dark-color: #222428;
  12. --medium-color: #92949c;
  13. --light-color: #f4f5f8;
  14. --light-shade: #d7d8da;
  15. --white: #ffffff;
  16. }
  17. // Header Container
  18. .header {
  19. position: sticky;
  20. top: 0;
  21. z-index: 10;
  22. background: var(--white);
  23. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  24. }
  25. // Toolbar
  26. .toolbar {
  27. display: flex;
  28. align-items: center;
  29. justify-content: space-between;
  30. min-height: 56px;
  31. padding: 0 16px;
  32. background: var(--white);
  33. border-bottom: 1px solid var(--light-shade);
  34. .buttons-start,
  35. .buttons-end {
  36. display: flex;
  37. align-items: center;
  38. gap: 8px;
  39. flex-shrink: 0;
  40. }
  41. .title {
  42. flex: 1;
  43. font-size: 20px;
  44. font-weight: 600;
  45. color: var(--dark-color);
  46. text-align: center;
  47. padding: 0 16px;
  48. white-space: nowrap;
  49. overflow: hidden;
  50. text-overflow: ellipsis;
  51. }
  52. .back-button,
  53. .icon-button {
  54. display: flex;
  55. align-items: center;
  56. justify-content: center;
  57. width: 40px;
  58. height: 40px;
  59. border: none;
  60. background: transparent;
  61. border-radius: 50%;
  62. cursor: pointer;
  63. transition: background-color 0.2s;
  64. padding: 0;
  65. &:hover {
  66. background-color: rgba(var(--primary-color), 0.1);
  67. }
  68. &:active {
  69. background-color: rgba(var(--primary-color), 0.2);
  70. }
  71. .icon {
  72. width: 24px;
  73. height: 24px;
  74. color: var(--primary-color);
  75. }
  76. }
  77. }
  78. // 阶段导航工具栏
  79. .stage-toolbar {
  80. background: var(--white);
  81. border-bottom: 1px solid var(--light-shade);
  82. padding: 12px 0;
  83. .stage-navigation {
  84. display: flex;
  85. align-items: center;
  86. justify-content: space-between;
  87. padding: 0 16px;
  88. max-width: 100%;
  89. overflow-x: auto;
  90. -webkit-overflow-scrolling: touch;
  91. &::-webkit-scrollbar {
  92. display: none;
  93. }
  94. .stage-item {
  95. display: flex;
  96. flex-direction: column;
  97. align-items: center;
  98. gap: 4px;
  99. cursor: pointer;
  100. transition: all 0.3s;
  101. flex-shrink: 0;
  102. min-width: 60px;
  103. .stage-circle {
  104. width: 36px;
  105. height: 36px;
  106. border-radius: 50%;
  107. display: flex;
  108. align-items: center;
  109. justify-content: center;
  110. font-weight: 600;
  111. font-size: 14px;
  112. transition: all 0.3s;
  113. border: 2px solid var(--light-shade);
  114. background-color: var(--white);
  115. color: var(--medium-color);
  116. .icon {
  117. width: 20px;
  118. height: 20px;
  119. }
  120. }
  121. .stage-label {
  122. font-size: 11px;
  123. color: var(--medium-color);
  124. text-align: center;
  125. white-space: nowrap;
  126. }
  127. // 已完成状态
  128. &.completed {
  129. .stage-circle {
  130. background-color: var(--success-color);
  131. border-color: var(--success-color);
  132. color: var(--white);
  133. }
  134. .stage-label {
  135. color: var(--success-color);
  136. }
  137. }
  138. // 进行中状态
  139. &.active {
  140. .stage-circle {
  141. background-color: var(--primary-color);
  142. border-color: var(--primary-color);
  143. color: var(--white);
  144. box-shadow: 0 0 0 4px rgba(56, 128, 255, 0.2);
  145. transform: scale(1.1);
  146. }
  147. .stage-label {
  148. color: var(--primary-color);
  149. font-weight: 600;
  150. }
  151. }
  152. // 待开始状态
  153. &.pending {
  154. .stage-circle {
  155. background-color: var(--white);
  156. border-color: var(--light-shade);
  157. color: var(--medium-color);
  158. }
  159. }
  160. }
  161. .stage-connector {
  162. flex: 1;
  163. height: 2px;
  164. background-color: var(--light-shade);
  165. margin: 0 8px;
  166. margin-bottom: 20px;
  167. transition: background-color 0.3s;
  168. min-width: 20px;
  169. &.completed {
  170. background-color: var(--success-color);
  171. }
  172. }
  173. }
  174. }
  175. // Content Container
  176. .content {
  177. position: relative;
  178. width: 100%;
  179. height: calc(100vh - 80px); // 减去阶段导航工具栏的高度,为底部卡片留空间
  180. overflow-y: auto;
  181. overflow-x: hidden;
  182. -webkit-overflow-scrolling: touch;
  183. background-color: var(--light-color);
  184. }
  185. // 加载和错误容器
  186. .loading-container,
  187. .error-container {
  188. display: flex;
  189. flex-direction: column;
  190. align-items: center;
  191. justify-content: center;
  192. min-height: 60vh;
  193. padding: 20px;
  194. text-align: center;
  195. p {
  196. color: var(--medium-color);
  197. margin: 0;
  198. font-size: 14px;
  199. }
  200. }
  201. // Spinner
  202. .spinner {
  203. width: 48px;
  204. height: 48px;
  205. margin-bottom: 16px;
  206. position: relative;
  207. .spinner-circle {
  208. width: 100%;
  209. height: 100%;
  210. border: 4px solid var(--light-shade);
  211. border-top-color: var(--primary-color);
  212. border-radius: 50%;
  213. animation: spin 0.8s linear infinite;
  214. }
  215. }
  216. @keyframes spin {
  217. 0% {
  218. transform: rotate(0deg);
  219. }
  220. 100% {
  221. transform: rotate(360deg);
  222. }
  223. }
  224. // Error Container
  225. .error-container {
  226. .error-icon {
  227. width: 64px;
  228. height: 64px;
  229. color: var(--danger-color);
  230. margin-bottom: 16px;
  231. }
  232. .button {
  233. margin-top: 16px;
  234. padding: 10px 24px;
  235. border: none;
  236. border-radius: 8px;
  237. font-size: 14px;
  238. font-weight: 600;
  239. cursor: pointer;
  240. transition: all 0.2s;
  241. background-color: var(--primary-color);
  242. color: var(--white);
  243. &.outline {
  244. background-color: transparent;
  245. border: 2px solid var(--primary-color);
  246. color: var(--primary-color);
  247. &:hover {
  248. background-color: var(--primary-color);
  249. color: var(--white);
  250. }
  251. }
  252. &:active {
  253. transform: scale(0.95);
  254. }
  255. }
  256. }
  257. // 客户快速查看
  258. .contact-quick-view {
  259. padding: 12px 12px 0;
  260. .card {
  261. margin: 0;
  262. background: var(--white);
  263. border-radius: 12px;
  264. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  265. overflow: hidden;
  266. .card-content {
  267. padding: 12px;
  268. .contact-info {
  269. display: flex;
  270. align-items: center;
  271. gap: 12px;
  272. .avatar {
  273. width: 48px;
  274. height: 48px;
  275. flex-shrink: 0;
  276. border-radius: 50%;
  277. overflow: hidden;
  278. background-color: var(--light-color);
  279. display: flex;
  280. align-items: center;
  281. justify-content: center;
  282. img {
  283. width: 100%;
  284. height: 100%;
  285. object-fit: cover;
  286. }
  287. .avatar-icon {
  288. width: 48px;
  289. height: 48px;
  290. color: var(--medium-color);
  291. }
  292. }
  293. .info-text {
  294. flex: 1;
  295. min-width: 0;
  296. h3 {
  297. margin: 0 0 4px;
  298. font-size: 16px;
  299. font-weight: 600;
  300. color: var(--dark-color);
  301. white-space: nowrap;
  302. overflow: hidden;
  303. text-overflow: ellipsis;
  304. }
  305. p {
  306. margin: 0 0 6px;
  307. font-size: 13px;
  308. color: var(--medium-color);
  309. }
  310. .tags {
  311. display: flex;
  312. flex-wrap: wrap;
  313. gap: 6px;
  314. .badge {
  315. display: inline-block;
  316. font-size: 11px;
  317. padding: 4px 8px;
  318. border-radius: 6px;
  319. font-weight: 600;
  320. white-space: nowrap;
  321. &.badge-primary {
  322. background-color: rgba(56, 128, 255, 0.15);
  323. color: var(--primary-color);
  324. }
  325. &.badge-success {
  326. background-color: rgba(45, 211, 111, 0.15);
  327. color: var(--success-color);
  328. }
  329. &.badge-warning {
  330. background-color: rgba(255, 196, 9, 0.15);
  331. color: var(--warning-color);
  332. }
  333. }
  334. }
  335. }
  336. }
  337. }
  338. }
  339. }
  340. // 阶段内容区域
  341. .stage-content {
  342. padding: 12px;
  343. padding-bottom: 120px; // 为新的固定底部卡片留空间
  344. }
  345. // 通用卡片样式
  346. .card {
  347. background: white;
  348. border-radius: 12px;
  349. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  350. margin-bottom: 16px;
  351. overflow: hidden;
  352. .card-header {
  353. padding: 16px;
  354. border-bottom: 1px solid var(--light-shade);
  355. .card-title {
  356. display: flex;
  357. align-items: center;
  358. gap: 8px;
  359. margin: 0;
  360. font-size: 16px;
  361. font-weight: 600;
  362. color: var(--dark-color);
  363. .icon {
  364. width: 20px;
  365. height: 20px;
  366. color: var(--primary-color);
  367. }
  368. }
  369. .card-subtitle {
  370. margin: 4px 0 0;
  371. font-size: 12px;
  372. color: var(--medium-color);
  373. }
  374. }
  375. .card-content {
  376. padding: 16px;
  377. }
  378. }
  379. // Badge 组件增强
  380. .badge {
  381. display: inline-block;
  382. padding: 4px 10px;
  383. border-radius: 12px;
  384. font-size: 11px;
  385. font-weight: 600;
  386. &.badge-secondary {
  387. background: var(--secondary-color);
  388. color: white;
  389. }
  390. &.badge-tertiary {
  391. background: var(--tertiary-color);
  392. color: white;
  393. }
  394. &.badge-danger {
  395. background: var(--danger-color);
  396. color: white;
  397. }
  398. &.badge-medium {
  399. background: var(--medium-color);
  400. color: white;
  401. }
  402. &.badge-light {
  403. background: var(--light-color);
  404. color: var(--dark-color);
  405. }
  406. }
  407. // 图标样式
  408. .icon {
  409. width: 20px;
  410. height: 20px;
  411. flex-shrink: 0;
  412. &.icon-sm {
  413. width: 14px;
  414. height: 14px;
  415. }
  416. &.icon-md {
  417. width: 24px;
  418. height: 24px;
  419. }
  420. &.icon-lg {
  421. width: 32px;
  422. height: 32px;
  423. }
  424. }
  425. // 按钮样式
  426. .btn {
  427. padding: 12px 24px;
  428. border-radius: 8px;
  429. font-size: 14px;
  430. font-weight: 600;
  431. cursor: pointer;
  432. transition: all 0.3s;
  433. border: none;
  434. outline: none;
  435. display: inline-flex;
  436. align-items: center;
  437. gap: 8px;
  438. &.btn-primary {
  439. background: var(--primary-color);
  440. color: white;
  441. &:hover {
  442. background: #2f6ce5;
  443. transform: translateY(-2px);
  444. box-shadow: 0 4px 12px rgba(56, 128, 255, 0.3);
  445. }
  446. &:active {
  447. transform: translateY(0);
  448. }
  449. }
  450. &.btn-secondary {
  451. background: var(--secondary-color);
  452. color: white;
  453. &:hover {
  454. background: #0bb8d4;
  455. transform: translateY(-2px);
  456. box-shadow: 0 4px 12px rgba(12, 209, 232, 0.3);
  457. }
  458. &:active {
  459. transform: translateY(0);
  460. }
  461. }
  462. &.btn-success {
  463. background: var(--success-color);
  464. color: white;
  465. &:hover {
  466. background: #28ba62;
  467. transform: translateY(-2px);
  468. box-shadow: 0 4px 12px rgba(45, 211, 111, 0.3);
  469. }
  470. &:active {
  471. transform: translateY(0);
  472. }
  473. }
  474. &.btn-outline {
  475. background: white;
  476. color: var(--primary-color);
  477. border: 2px solid var(--primary-color);
  478. &:hover {
  479. background: var(--primary-color);
  480. color: white;
  481. }
  482. &:active {
  483. transform: scale(0.98);
  484. }
  485. }
  486. &.btn-light {
  487. background: var(--light-color);
  488. color: var(--dark-color);
  489. &:hover {
  490. background: var(--light-shade);
  491. }
  492. &:active {
  493. transform: scale(0.98);
  494. }
  495. }
  496. &:disabled {
  497. opacity: 0.5;
  498. cursor: not-allowed;
  499. pointer-events: none;
  500. }
  501. .icon {
  502. width: 20px;
  503. height: 20px;
  504. }
  505. }
  506. // 底部操作栏
  507. .footer-toolbar {
  508. background: white;
  509. border-top: 1px solid var(--light-shade);
  510. padding: 12px 16px;
  511. position: fixed;
  512. bottom: 0;
  513. left: 0;
  514. right: 0;
  515. z-index: 90;
  516. box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.1);
  517. .action-buttons {
  518. display: flex;
  519. gap: 12px;
  520. max-width: 800px;
  521. margin: 0 auto;
  522. .btn {
  523. flex: 1;
  524. }
  525. }
  526. }
  527. // 表单样式
  528. .form-group {
  529. margin-bottom: 20px;
  530. .form-label {
  531. display: block;
  532. margin-bottom: 8px;
  533. font-size: 14px;
  534. font-weight: 600;
  535. color: var(--dark-color);
  536. .required {
  537. color: var(--danger-color);
  538. margin-left: 4px;
  539. }
  540. }
  541. .form-input,
  542. .form-textarea,
  543. .form-select {
  544. width: 100%;
  545. padding: 12px 16px;
  546. border: 1px solid var(--light-shade);
  547. border-radius: 8px;
  548. font-size: 14px;
  549. color: var(--dark-color);
  550. background: white;
  551. transition: all 0.3s;
  552. &:focus {
  553. outline: none;
  554. border-color: var(--primary-color);
  555. box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.1);
  556. }
  557. &::placeholder {
  558. color: var(--medium-color);
  559. }
  560. &:disabled {
  561. background: var(--light-color);
  562. cursor: not-allowed;
  563. }
  564. }
  565. .form-textarea {
  566. min-height: 100px;
  567. resize: vertical;
  568. font-family: inherit;
  569. }
  570. .form-help {
  571. margin-top: 6px;
  572. font-size: 12px;
  573. color: var(--medium-color);
  574. }
  575. .form-error {
  576. margin-top: 6px;
  577. font-size: 12px;
  578. color: var(--danger-color);
  579. }
  580. }
  581. // 列表样式
  582. .list {
  583. background: white;
  584. border-radius: 12px;
  585. overflow: hidden;
  586. .list-item {
  587. display: flex;
  588. align-items: center;
  589. gap: 12px;
  590. padding: 16px;
  591. border-bottom: 1px solid var(--light-shade);
  592. cursor: pointer;
  593. transition: background-color 0.3s;
  594. &:last-child {
  595. border-bottom: none;
  596. }
  597. &:hover {
  598. background-color: var(--light-color);
  599. }
  600. &:active {
  601. background-color: var(--light-shade);
  602. }
  603. .item-icon {
  604. width: 40px;
  605. height: 40px;
  606. display: flex;
  607. align-items: center;
  608. justify-content: center;
  609. border-radius: 50%;
  610. background-color: var(--light-color);
  611. flex-shrink: 0;
  612. .icon {
  613. width: 24px;
  614. height: 24px;
  615. color: var(--primary-color);
  616. }
  617. }
  618. .item-content {
  619. flex: 1;
  620. min-width: 0;
  621. .item-title {
  622. margin: 0 0 4px;
  623. font-size: 15px;
  624. font-weight: 600;
  625. color: var(--dark-color);
  626. }
  627. .item-subtitle {
  628. margin: 0;
  629. font-size: 13px;
  630. color: var(--medium-color);
  631. }
  632. }
  633. .item-arrow {
  634. width: 20px;
  635. height: 20px;
  636. color: var(--medium-color);
  637. flex-shrink: 0;
  638. }
  639. }
  640. }
  641. // 空状态
  642. .empty-state {
  643. display: flex;
  644. flex-direction: column;
  645. align-items: center;
  646. justify-content: center;
  647. padding: 40px 20px;
  648. text-align: center;
  649. .icon-large {
  650. width: 80px;
  651. height: 80px;
  652. color: var(--medium-color);
  653. margin-bottom: 16px;
  654. opacity: 0.5;
  655. }
  656. .empty-title {
  657. margin: 0 0 8px;
  658. font-size: 16px;
  659. font-weight: 600;
  660. color: var(--dark-color);
  661. }
  662. .empty-message {
  663. margin: 0 0 20px;
  664. font-size: 14px;
  665. color: var(--medium-color);
  666. }
  667. }
  668. // Chip 组件
  669. .chip {
  670. display: inline-flex;
  671. align-items: center;
  672. padding: 6px 12px;
  673. border-radius: 16px;
  674. font-size: 12px;
  675. font-weight: 500;
  676. background: rgba(255, 255, 255, 0.2);
  677. color: white;
  678. &.chip-primary {
  679. background: rgba(56, 128, 255, 0.15);
  680. color: var(--primary-color);
  681. }
  682. &.chip-success {
  683. background: rgba(45, 211, 111, 0.15);
  684. color: var(--success-color);
  685. }
  686. &.chip-warning {
  687. background: rgba(255, 196, 9, 0.15);
  688. color: var(--warning-color);
  689. }
  690. }
  691. // 项目状态样式
  692. .status-pending {
  693. background: var(--warning-color) !important;
  694. color: var(--dark-color) !important;
  695. }
  696. .status-active {
  697. background: var(--primary-color) !important;
  698. color: white !important;
  699. }
  700. .status-completed {
  701. background: var(--success-color) !important;
  702. color: white !important;
  703. }
  704. .status-paused {
  705. background: var(--medium-color) !important;
  706. color: white !important;
  707. }
  708. .status-cancelled {
  709. background: var(--danger-color) !important;
  710. color: white !important;
  711. }
  712. .status-default {
  713. background: var(--light-color) !important;
  714. color: var(--dark-color) !important;
  715. }
  716. // 响应式适配
  717. @media (min-width: 768px) {
  718. .stage-navigation {
  719. max-width: 600px;
  720. margin: 0 auto;
  721. }
  722. .contact-quick-view,
  723. .stage-content {
  724. max-width: 800px;
  725. margin: 0 auto;
  726. }
  727. .footer-toolbar {
  728. .action-buttons {
  729. max-width: 800px;
  730. }
  731. }
  732. }
  733. // 平板和桌面端
  734. @media (min-width: 1024px) {
  735. .stage-navigation {
  736. max-width: 800px;
  737. }
  738. .contact-quick-view,
  739. .stage-content {
  740. max-width: 1000px;
  741. }
  742. .footer-toolbar {
  743. .action-buttons {
  744. max-width: 1000px;
  745. }
  746. }
  747. }
  748. // 移动端优化
  749. @media (max-width: 480px) {
  750. // 移动端内容高度调整
  751. .content {
  752. height: calc(100vh - 60px); // 移动端调整高度
  753. }
  754. .stage-toolbar {
  755. padding: 8px 0;
  756. .stage-navigation {
  757. .stage-item {
  758. min-width: 50px;
  759. .stage-circle {
  760. width: 32px;
  761. height: 32px;
  762. font-size: 12px;
  763. .icon {
  764. width: 16px;
  765. height: 16px;
  766. }
  767. }
  768. .stage-label {
  769. font-size: 10px;
  770. }
  771. }
  772. .stage-connector {
  773. min-width: 15px;
  774. margin: 0 4px;
  775. margin-bottom: 16px;
  776. }
  777. }
  778. }
  779. .contact-quick-view {
  780. padding: 8px 8px 0;
  781. .card {
  782. .card-content {
  783. padding: 10px;
  784. .contact-info {
  785. gap: 10px;
  786. .avatar {
  787. width: 40px;
  788. height: 40px;
  789. .avatar-icon {
  790. width: 40px;
  791. height: 40px;
  792. }
  793. }
  794. .info-text {
  795. h3 {
  796. font-size: 14px;
  797. }
  798. p {
  799. font-size: 12px;
  800. }
  801. .tags {
  802. gap: 4px;
  803. .badge {
  804. font-size: 10px;
  805. padding: 3px 6px;
  806. }
  807. }
  808. }
  809. }
  810. }
  811. }
  812. }
  813. .stage-content {
  814. padding: 8px;
  815. padding-bottom: 100px; // 移动端为底部卡片留空间
  816. }
  817. .footer-toolbar {
  818. padding: 8px 12px;
  819. .action-buttons {
  820. gap: 8px;
  821. .btn {
  822. padding: 10px 16px;
  823. font-size: 13px;
  824. }
  825. }
  826. }
  827. .card {
  828. .card-header {
  829. padding: 12px;
  830. .card-title {
  831. font-size: 15px;
  832. }
  833. }
  834. .card-content {
  835. padding: 12px;
  836. }
  837. }
  838. .form-group {
  839. .form-input,
  840. .form-textarea,
  841. .form-select {
  842. padding: 10px 12px;
  843. font-size: 13px;
  844. }
  845. }
  846. .btn {
  847. padding: 10px 20px;
  848. font-size: 13px;
  849. }
  850. }
  851. // 问卷卡片样式
  852. .survey-card {
  853. background: white;
  854. border-radius: 12px;
  855. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
  856. margin: 16px;
  857. overflow: hidden;
  858. transition: all 0.3s ease;
  859. &:hover {
  860. box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);
  861. }
  862. // 头部
  863. .survey-header {
  864. display: flex;
  865. align-items: center;
  866. justify-content: space-between;
  867. padding: 16px;
  868. border-bottom: 1px solid var(--light-shade);
  869. background: linear-gradient(135deg, #f5f7fa 0%, #ffffff 100%);
  870. .survey-title {
  871. display: flex;
  872. align-items: center;
  873. gap: 10px;
  874. .icon {
  875. width: 24px;
  876. height: 24px;
  877. color: var(--primary-color);
  878. }
  879. span {
  880. font-size: 16px;
  881. font-weight: 600;
  882. color: var(--dark-color);
  883. }
  884. }
  885. .survey-badge {
  886. padding: 4px 12px;
  887. border-radius: 12px;
  888. font-size: 12px;
  889. font-weight: 600;
  890. background: rgba(255, 196, 9, 0.15);
  891. color: var(--warning-color);
  892. transition: all 0.3s ease;
  893. &.filled {
  894. background: rgba(45, 211, 111, 0.15);
  895. color: var(--success-color);
  896. }
  897. }
  898. }
  899. // 内容区
  900. .survey-content {
  901. padding: 20px 16px;
  902. .survey-info {
  903. display: flex;
  904. align-items: flex-start;
  905. gap: 12px;
  906. margin-bottom: 16px;
  907. .icon {
  908. width: 40px;
  909. height: 40px;
  910. flex-shrink: 0;
  911. margin-top: 2px;
  912. &.success-icon {
  913. color: var(--success-color);
  914. }
  915. &.pending-icon {
  916. color: var(--warning-color);
  917. }
  918. }
  919. .survey-text {
  920. flex: 1;
  921. .survey-desc {
  922. margin: 0 0 6px;
  923. font-size: 15px;
  924. font-weight: 500;
  925. color: var(--dark-color);
  926. line-height: 1.5;
  927. }
  928. .survey-meta {
  929. margin: 0;
  930. font-size: 13px;
  931. color: var(--medium-color);
  932. line-height: 1.4;
  933. }
  934. }
  935. }
  936. .button {
  937. width: 100%;
  938. display: flex;
  939. align-items: center;
  940. justify-content: center;
  941. gap: 8px;
  942. padding: 12px 20px;
  943. border-radius: 8px;
  944. font-size: 14px;
  945. font-weight: 600;
  946. border: none;
  947. cursor: pointer;
  948. transition: all 0.3s ease;
  949. .icon {
  950. width: 18px;
  951. height: 18px;
  952. }
  953. &.primary {
  954. background: var(--primary-color);
  955. color: white;
  956. box-shadow: 0 2px 8px rgba(56, 128, 255, 0.2);
  957. &:hover {
  958. background: #2f6ce5;
  959. transform: translateY(-2px);
  960. box-shadow: 0 4px 12px rgba(56, 128, 255, 0.3);
  961. }
  962. &:active {
  963. transform: translateY(0);
  964. }
  965. }
  966. &.secondary {
  967. background: white;
  968. color: var(--primary-color);
  969. border: 2px solid var(--primary-color);
  970. &:hover {
  971. background: rgba(56, 128, 255, 0.05);
  972. }
  973. &:active {
  974. transform: scale(0.98);
  975. }
  976. }
  977. }
  978. .survey-tips {
  979. display: flex;
  980. align-items: center;
  981. justify-content: center;
  982. gap: 8px;
  983. padding: 12px 16px;
  984. background: rgba(255, 196, 9, 0.1);
  985. border-radius: 8px;
  986. color: var(--warning-color);
  987. font-size: 13px;
  988. font-weight: 500;
  989. .icon {
  990. width: 20px;
  991. height: 20px;
  992. flex-shrink: 0;
  993. }
  994. }
  995. }
  996. // 底部说明
  997. .survey-footer {
  998. padding: 12px 16px;
  999. background: #f9fafb;
  1000. border-top: 1px solid var(--light-shade);
  1001. .survey-highlights {
  1002. display: flex;
  1003. justify-content: space-around;
  1004. gap: 8px;
  1005. .highlight-item {
  1006. display: flex;
  1007. flex-direction: column;
  1008. align-items: center;
  1009. gap: 6px;
  1010. flex: 1;
  1011. min-width: 0;
  1012. .icon {
  1013. width: 24px;
  1014. height: 24px;
  1015. color: var(--primary-color);
  1016. opacity: 0.7;
  1017. }
  1018. span {
  1019. font-size: 12px;
  1020. font-weight: 500;
  1021. color: var(--medium-color);
  1022. text-align: center;
  1023. white-space: nowrap;
  1024. }
  1025. }
  1026. }
  1027. }
  1028. }
  1029. // 移动端适配
  1030. @media (max-width: 480px) {
  1031. .survey-card {
  1032. margin: 12px 8px;
  1033. border-radius: 10px;
  1034. .survey-header {
  1035. padding: 12px;
  1036. .survey-title {
  1037. gap: 8px;
  1038. .icon {
  1039. width: 20px;
  1040. height: 20px;
  1041. }
  1042. span {
  1043. font-size: 15px;
  1044. }
  1045. }
  1046. .survey-badge {
  1047. font-size: 11px;
  1048. padding: 3px 10px;
  1049. }
  1050. }
  1051. .survey-content {
  1052. padding: 16px 12px;
  1053. .survey-info {
  1054. gap: 10px;
  1055. .icon {
  1056. width: 36px;
  1057. height: 36px;
  1058. }
  1059. .survey-text {
  1060. .survey-desc {
  1061. font-size: 14px;
  1062. }
  1063. .survey-meta {
  1064. font-size: 12px;
  1065. }
  1066. }
  1067. }
  1068. .button {
  1069. padding: 10px 16px;
  1070. font-size: 13px;
  1071. .icon {
  1072. width: 16px;
  1073. height: 16px;
  1074. }
  1075. }
  1076. .survey-tips {
  1077. padding: 10px 12px;
  1078. font-size: 12px;
  1079. .icon {
  1080. width: 18px;
  1081. height: 18px;
  1082. }
  1083. }
  1084. }
  1085. .survey-footer {
  1086. padding: 10px 12px;
  1087. .survey-highlights {
  1088. gap: 6px;
  1089. .highlight-item {
  1090. gap: 4px;
  1091. .icon {
  1092. width: 20px;
  1093. height: 20px;
  1094. }
  1095. span {
  1096. font-size: 11px;
  1097. }
  1098. }
  1099. }
  1100. }
  1101. }
  1102. }