project-detail.scss 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445
  1. /* 项目详情页面样式文件 - 简化版本,直接针对HTML元素 */
  2. @use '../ios-theme.scss' as *;
  3. /* 重置所有可能冲突的样式 */
  4. * {
  5. box-sizing: border-box;
  6. }
  7. /* 全局侧边栏彻底隐藏 - 高优先级规则 */
  8. .sidebar {
  9. display: none !important;
  10. width: 0 !important;
  11. visibility: hidden !important;
  12. }
  13. /* 主容器样式 - 确保内容区域占满整个屏幕 */
  14. .content-wrapper {
  15. width: 100% !important;
  16. margin-left: 0 !important;
  17. padding: 0 !important;
  18. }
  19. /* 主内容区域样式 - 重置为默认值 */
  20. .main-content {
  21. padding: 0 !important;
  22. margin: 0 !important;
  23. }
  24. /* 项目详情容器 */
  25. .project-detail-container {
  26. padding: 20px;
  27. background-color: #f5f7fa;
  28. color: #333;
  29. min-height: 100vh;
  30. }
  31. /* 项目标题栏 */
  32. .project-header {
  33. display: flex;
  34. justify-content: space-between;
  35. align-items: center;
  36. margin-bottom: 20px;
  37. background-color: white;
  38. padding: 20px;
  39. border-radius: 8px;
  40. width: 100% !important;
  41. }
  42. /* 强制覆盖主内容布局样式 - 使用最高优先级 */
  43. .progress-tab-content > .main-content-layout {
  44. display: flex !important;
  45. gap: 20px !important;
  46. margin-top: 20px !important;
  47. width: 100% !important;
  48. background-color: rgba(200, 200, 255, 0.5) !important; /* 明显的背景色 */
  49. }
  50. /* 强制覆盖左侧列样式 - 使用最高优先级 */
  51. .progress-tab-content > .main-content-layout > .left-column {
  52. width: 33.333% !important;
  53. display: flex !important;
  54. flex-direction: column !important;
  55. gap: 20px !important;
  56. background-color: rgba(255, 200, 200, 0.3) !important; /* 左侧列背景色 */
  57. }
  58. /* 强制覆盖右侧列样式 - 使用最高优先级 */
  59. .progress-tab-content > .main-content-layout > .right-column {
  60. width: 66.667% !important;
  61. display: flex !important;
  62. flex-direction: column !important;
  63. gap: 20px !important;
  64. background-color: rgba(200, 255, 200, 0.3) !important; /* 右侧列背景色 */
  65. }
  66. /* 确保响应式布局正常工作 */
  67. @media (max-width: 1024px) {
  68. .progress-tab-content > .main-content-layout {
  69. flex-direction: column !important;
  70. }
  71. .progress-tab-content > .main-content-layout > .left-column,
  72. .progress-tab-content > .main-content-layout > .right-column {
  73. width: 100% !important;
  74. }
  75. }
  76. .header-content{display:flex;flex-direction:column;gap:$ios-spacing-sm}
  77. .project-header h1{font-size:$ios-font-size-xl;font-weight:$ios-font-weight-bold;color:$ios-text-primary;margin:0}
  78. .project-meta{display:flex;align-items:center;gap:$ios-spacing-lg;font-size:$ios-font-size-sm;color:$ios-text-secondary}
  79. .project-id{font-weight:$ios-font-weight-medium}
  80. .project-status{padding:$ios-spacing-xs $ios-spacing-md;border-radius:$ios-radius-full;background-color:#e8f0fe;color:$ios-primary}
  81. /* 按钮样式 */
  82. .header-actions{display:flex;gap:$ios-spacing-md;align-items:center}
  83. .back-btn{background-color:$ios-primary;color:white;border:none;padding:$ios-spacing-sm $ios-spacing-lg;border-radius:$ios-radius-md;font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;cursor:pointer;white-space:nowrap}
  84. .back-btn:hover{background-color:#0056b3;transform:translateY(-1px)}
  85. .project-switcher{position:relative}
  86. .switch-btn{background-color:$ios-background-tertiary;color:$ios-text-primary;border:none;padding:$ios-spacing-sm $ios-spacing-lg;border-radius:$ios-radius-md;font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;cursor:pointer;white-space:nowrap}
  87. .switch-btn:hover{background-color:#f0f0f0;transform:translateY(-1px)}
  88. .switch-dropdown{position:absolute;top:100%;right:0;margin-top:$ios-spacing-xs;background-color:$ios-background-secondary;border-radius:$ios-radius-md;overflow:hidden;min-width:200px;max-height:300px;overflow-y:auto;z-index:1000}
  89. .project-item{display:flex;justify-content:space-between;align-items:center;padding:$ios-spacing-md;cursor:pointer;border-bottom:1px solid $ios-border}
  90. .project-item:last-child{border-bottom:none}
  91. .project-item:hover{background-color:$ios-background}
  92. .project-item.active{background-color:#e8f0fe}
  93. .project-name{font-size:$ios-font-size-sm;color:$ios-text-primary;font-weight:$ios-font-weight-medium}
  94. .project-status-badge{font-size:$ios-font-size-xs;padding:$ios-spacing-xs $ios-spacing-sm;border-radius:$ios-radius-full;background-color:$ios-background-tertiary;color:$ios-text-secondary}
  95. .project-status-badge.ongoing{background-color:#e8f0fe;color:$ios-primary}
  96. .project-status-badge.completed{background-color:#e6f7e6;color:$ios-success}
  97. .project-status-badge.pending{background-color:#fff3cd;color:$ios-warning}
  98. .stagnation-btn{background-color:$ios-warning;color:white;border:none;padding:$ios-spacing-sm $ios-spacing-md;border-radius:$ios-radius-md;font-size:$ios-font-size-sm;cursor:pointer;font-weight:$ios-font-weight-medium}
  99. .stagnation-btn:hover{background-color:#d4a72c;transform:translateY(-1px)}
  100. /* 顶部导航标签页样式 */
  101. .project-tabs{
  102. display:flex;
  103. margin-bottom:$ios-spacing-xl;
  104. border-bottom:1px solid $ios-border;
  105. background-color:$ios-background-secondary;
  106. border-radius:$ios-radius-lg $ios-radius-lg 0 0;
  107. padding:$ios-spacing-xs 0;
  108. }
  109. .tab-item{
  110. padding:$ios-spacing-md $ios-spacing-xl;
  111. font-size:$ios-font-size-base;
  112. font-weight:$ios-font-weight-medium;
  113. color:$ios-text-secondary;
  114. cursor:pointer;
  115. transition:all 0.2s ease;
  116. border-bottom:2px solid transparent;
  117. background-color:transparent;
  118. border:none;
  119. }
  120. .tab-item:hover{
  121. color:$ios-text-primary;
  122. background-color:$ios-background;
  123. }
  124. .tab-item.active{
  125. color:$ios-primary;
  126. border-bottom-color:$ios-primary;
  127. background-color:$ios-background;
  128. }
  129. /* 标签页内容容器样式 */
  130. .tab-content{
  131. background-color:$ios-background;
  132. border-radius:0 0 $ios-radius-lg $ios-radius-lg;
  133. padding:$ios-spacing-xl;
  134. min-height:calc(100vh - 320px);
  135. }
  136. .tab-content.hidden{
  137. display:none;
  138. }
  139. /* 项目成员列表样式 */
  140. .member-list{
  141. display:grid;
  142. grid-template-columns:repeat(auto-fit, minmax(280px, 1fr));
  143. gap:$ios-spacing-lg;
  144. margin-bottom:$ios-spacing-xl;
  145. }
  146. .member-card{
  147. background-color:$ios-background-secondary;
  148. border-radius:$ios-radius-lg;
  149. padding:$ios-spacing-lg;
  150. display:flex;
  151. align-items:center;
  152. gap:$ios-spacing-lg;
  153. transition:transform 0.2s ease, box-shadow 0.2s ease;
  154. }
  155. .member-card:hover{
  156. transform:translateY(-2px);
  157. box-shadow:0 4px 12px rgba(0,0,0,0.05);
  158. }
  159. .member-avatar{
  160. width:64px;
  161. height:64px;
  162. border-radius:50%;
  163. background-color:$ios-primary;
  164. color:white;
  165. display:flex;
  166. align-items:center;
  167. justify-content:center;
  168. font-size:$ios-font-size-lg;
  169. font-weight:$ios-font-weight-semibold;
  170. flex-shrink:0;
  171. }
  172. .member-info{
  173. flex:1;
  174. min-width:0;
  175. }
  176. .member-name{
  177. font-size:$ios-font-size-base;
  178. font-weight:$ios-font-weight-semibold;
  179. color:$ios-text-primary;
  180. margin-bottom:$ios-spacing-xs;
  181. }
  182. .member-role{
  183. font-size:$ios-font-size-sm;
  184. color:$ios-text-secondary;
  185. margin-bottom:$ios-spacing-md;
  186. }
  187. .member-metrics{
  188. display:flex;
  189. gap:$ios-spacing-md;
  190. flex-wrap:wrap;
  191. }
  192. .metric-item{
  193. display:flex;
  194. flex-direction:column;
  195. gap:$ios-spacing-xs;
  196. }
  197. .metric-label{
  198. font-size:$ios-font-size-xs;
  199. color:$ios-text-secondary;
  200. }
  201. .metric-value{
  202. font-size:$ios-font-size-sm;
  203. color:$ios-text-primary;
  204. font-weight:$ios-font-weight-medium;
  205. }
  206. /* 团队协作时间轴样式 */
  207. .team-timeline{
  208. position:relative;
  209. padding-left:$ios-spacing-xxl;
  210. margin-bottom:$ios-spacing-xl;
  211. }
  212. .timeline-item{
  213. position:relative;
  214. padding-bottom:$ios-spacing-xl;
  215. }
  216. .timeline-item:last-child{
  217. padding-bottom:0;
  218. }
  219. .timeline-item::before{
  220. content:'';
  221. position:absolute;
  222. left: -$ios-spacing-lg;
  223. top:$ios-spacing-sm;
  224. width:12px;
  225. height:12px;
  226. border-radius:50%;
  227. background-color:$ios-primary;
  228. border:3px solid #e8f0fe;
  229. }
  230. .timeline-item:not(:last-child)::after{
  231. content:'';
  232. position:absolute;
  233. left:-$ios-spacing-lg + 4px;
  234. top:24px;
  235. bottom:0;
  236. width:2px;
  237. background-color:$ios-border;
  238. }
  239. .timeline-time{
  240. font-size:$ios-font-size-sm;
  241. color:$ios-text-secondary;
  242. margin-bottom:$ios-spacing-xs;
  243. }
  244. .timeline-content{
  245. background-color:$ios-background-secondary;
  246. border-radius:$ios-radius-md;
  247. padding:$ios-spacing-md;
  248. }
  249. .timeline-header{
  250. display:flex;
  251. justify-content:space-between;
  252. align-items:center;
  253. margin-bottom:$ios-spacing-sm;
  254. }
  255. .timeline-title{
  256. font-size:$ios-font-size-base;
  257. font-weight:$ios-font-weight-medium;
  258. color:$ios-text-primary;
  259. }
  260. .timeline-action{
  261. font-size:$ios-font-size-xs;
  262. background-color:$ios-primary;
  263. color:white;
  264. padding:$ios-spacing-xs $ios-spacing-sm;
  265. border-radius:$ios-radius-full;
  266. }
  267. .timeline-description{
  268. font-size:$ios-font-size-sm;
  269. color:$ios-text-secondary;
  270. line-height:1.5;
  271. }
  272. /* 项目文件列表样式 */
  273. .file-list{
  274. background-color:$ios-background-secondary;
  275. border-radius:$ios-radius-lg;
  276. overflow:hidden;
  277. margin-bottom:$ios-spacing-xl;
  278. }
  279. .file-header{
  280. display:flex;
  281. justify-content:space-between;
  282. align-items:center;
  283. padding:$ios-spacing-lg;
  284. border-bottom:1px solid $ios-border;
  285. background-color:$ios-background-tertiary;
  286. }
  287. .file-header h3{
  288. margin:0;
  289. font-size:$ios-font-size-base;
  290. }
  291. .file-upload-btn{
  292. background-color:$ios-primary;
  293. color:white;
  294. border:none;
  295. padding:$ios-spacing-sm $ios-spacing-lg;
  296. border-radius:$ios-radius-md;
  297. font-size:$ios-font-size-sm;
  298. font-weight:$ios-font-weight-medium;
  299. cursor:pointer;
  300. display:flex;
  301. align-items:center;
  302. gap:$ios-spacing-xs;
  303. }
  304. .file-upload-btn:hover{
  305. background-color:#0056b3;
  306. transform:translateY(-1px);
  307. }
  308. .file-grid{
  309. display:grid;
  310. grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));
  311. gap:$ios-spacing-md;
  312. padding:$ios-spacing-lg;
  313. }
  314. .file-item{
  315. background-color:$ios-background;
  316. border-radius:$ios-radius-md;
  317. padding:$ios-spacing-md;
  318. text-align:center;
  319. transition:transform 0.2s ease, box-shadow 0.2s ease;
  320. cursor:pointer;
  321. }
  322. .file-item:hover{
  323. transform:translateY(-2px);
  324. box-shadow:0 4px 12px rgba(0,0,0,0.05);
  325. }
  326. .file-icon{
  327. font-size:$ios-font-size-xl;
  328. color:$ios-primary;
  329. margin-bottom:$ios-spacing-sm;
  330. }
  331. .file-name{
  332. font-size:$ios-font-size-sm;
  333. color:$ios-text-primary;
  334. margin-bottom:$ios-spacing-xs;
  335. white-space:nowrap;
  336. overflow:hidden;
  337. text-overflow:ellipsis;
  338. }
  339. .file-meta{
  340. font-size:$ios-font-size-xs;
  341. color:$ios-text-secondary;
  342. }
  343. /* 任务卡片样式优化 */
  344. .stage-specific-card{
  345. background-color:$ios-background-secondary;
  346. border-radius:$ios-radius-lg;
  347. padding:$ios-spacing-lg;
  348. margin-bottom:$ios-spacing-xl;
  349. border-left:4px solid $ios-primary;
  350. }
  351. .stage-specific-card.warning{
  352. border-left-color:$ios-warning;
  353. }
  354. .stage-specific-card.danger{
  355. border-left-color:$ios-danger;
  356. }
  357. .stage-specific-card.success{
  358. border-left-color:$ios-success;
  359. }
  360. /* 整理按钮样式 */
  361. .organize-btn{
  362. background-color:$ios-background-tertiary;
  363. color:$ios-text-primary;
  364. border:none;
  365. padding:$ios-spacing-sm $ios-spacing-lg;
  366. border-radius:$ios-radius-md;
  367. font-size:$ios-font-size-sm;
  368. font-weight:$ios-font-weight-medium;
  369. cursor:pointer;
  370. margin-right:$ios-spacing-md;
  371. display:flex;
  372. align-items:center;
  373. gap:$ios-spacing-xs;
  374. }
  375. .organize-btn:hover{
  376. background-color:#f0f0f0;
  377. transform:translateY(-1px);
  378. }
  379. /* 技能匹配度样式 */
  380. .skills-match-bar{
  381. width:100%;
  382. height:8px;
  383. background-color:$ios-background-tertiary;
  384. border-radius:$ios-radius-full;
  385. overflow:hidden;
  386. margin-bottom:$ios-spacing-sm;
  387. }
  388. .skills-match-fill{
  389. height:100%;
  390. background-color:$ios-primary;
  391. border-radius:$ios-radius-full;
  392. }
  393. .skills-match-text{
  394. font-size:$ios-font-size-sm;
  395. color:$ios-text-secondary;
  396. text-align:right;
  397. }
  398. /* 主内容布局样式 - 强制使用主容器内的布局定义 */
  399. .progress-tab-content > .main-content-layout {
  400. display: flex !important;
  401. gap: $ios-spacing-xl !important;
  402. margin-top: $ios-spacing-xl;
  403. width: 100% !important;
  404. background-color: rgba(200, 200, 255, 0.2) !important; /* 临时背景色用于调试 */
  405. }
  406. .progress-tab-content > .main-content-layout > .left-column {
  407. width: 33.333% !important;
  408. display: flex !important;
  409. flex-direction: column !important;
  410. gap: $ios-spacing-xl !important;
  411. }
  412. .progress-tab-content > .main-content-layout > .right-column {
  413. width: 66.667% !important;
  414. display: flex !important;
  415. flex-direction: column !important;
  416. gap: $ios-spacing-xl !important;
  417. }
  418. /* 标题样式 */
  419. h2{font-size:$ios-font-size-lg;font-weight:$ios-font-weight-semibold;color:$ios-text-primary;margin-top:0;margin-bottom:$ios-spacing-lg;padding-bottom:$ios-spacing-sm;border-bottom:1px solid $ios-border}
  420. h3{font-size:$ios-font-size-base;font-weight:$ios-font-weight-medium;color:$ios-text-primary;margin-top:$ios-spacing-lg;margin-bottom:$ios-spacing-md}
  421. h4{font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;color:$ios-text-primary;margin-top:$ios-spacing-md;margin-bottom:$ios-spacing-sm}
  422. /* 项目基本信息卡片 */
  423. .project-info-card .info-grid{display:grid;grid-template-columns:1fr 1fr;gap:$ios-spacing-md}
  424. .info-item{display:flex;flex-direction:column;gap:$ios-spacing-xs}
  425. .info-item label{font-size:$ios-font-size-sm;color:$ios-text-secondary;font-weight:$ios-font-weight-medium}
  426. .info-item span{font-size:$ios-font-size-base;color:$ios-text-primary;font-weight:$ios-font-weight-regular}
  427. .stage-tag{display:inline-block;padding:$ios-spacing-xs $ios-spacing-md;border-radius:$ios-radius-full;background-color:#e6f7e6;color:$ios-success;font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium}
  428. /* 客户画像卡片 */
  429. .warning-banner{background-color:#ffebee;color:$ios-danger;padding:$ios-spacing-md $ios-spacing-lg;border-radius:$ios-radius-md;margin-bottom:$ios-spacing-xl;border-left:4px solid $ios-danger;font-size:$ios-font-size-base;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:$ios-spacing-md}
  430. .warning-content{display:flex;align-items:center;gap:$ios-spacing-sm;flex:1}
  431. .warning-icon{font-size:$ios-font-size-lg}
  432. .contact-leader-btn{background-color:$ios-danger;color:white;border:none;padding:$ios-spacing-xs $ios-spacing-md;border-radius:$ios-radius-md;font-size:$ios-font-size-sm;cursor:pointer;font-weight:$ios-font-weight-medium}
  433. .contact-leader-btn:hover{background-color:#c62828;transform:translateY(-1px)}
  434. /* 标签样式 */
  435. .tags-container{display:flex;flex-direction:column;gap:$ios-spacing-lg}
  436. .tag-section{margin-bottom:$ios-spacing-md}
  437. .tag-section h3{margin-top:0;font-size:$ios-font-size-base}
  438. .tags-grid{display:grid;grid-template-columns:repeat(auto-fit, minmax(120px, 1fr));gap:$ios-spacing-md}
  439. .tag-item{display:flex;flex-direction:column;gap:$ios-spacing-xs}
  440. .tag-label{font-size:$ios-font-size-xs;color:$ios-text-secondary;font-weight:$ios-font-weight-medium}
  441. .tag{display:inline-block;padding:$ios-spacing-xs $ios-spacing-md;border-radius:$ios-radius-full;background-color:$ios-background-tertiary;color:$ios-text-primary;font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;align-self:flex-start}
  442. .tags-flex{display:flex;flex-direction:column;gap:$ios-spacing-md}
  443. .tag-group{display:flex;flex-direction:column;gap:$ios-spacing-sm}
  444. .group-label{font-size:$ios-font-size-sm;color:$ios-text-secondary;font-weight:$ios-font-weight-medium}
  445. .tags{display:flex;flex-wrap:wrap;gap:$ios-spacing-sm}
  446. .priority-tag,.skill-tag{display:inline-block;padding:$ios-spacing-xs $ios-spacing-sm;border-radius:$ios-radius-full;background-color:$ios-background-tertiary;color:$ios-text-primary;font-size:$ios-font-size-xs;font-weight:$ios-font-weight-medium}
  447. .priority-tag{background-color:#fff3cd;color:$ios-warning}
  448. .skill-tag{background-color:#e8f0fe;color:$ios-primary}
  449. /* 项目进度看板 - 支持10个阶段的横向进度展示 */
  450. .stage-progress-container{
  451. margin-bottom:$ios-spacing-xl;
  452. background-color:$ios-background-secondary;
  453. border-radius:$ios-radius-lg;
  454. padding:$ios-spacing-lg;
  455. box-shadow:0 2px 8px rgba(0,0,0,0.03);
  456. }
  457. /* 进度条容器 - 支持滚动查看所有10个阶段 */
  458. .stage-progress-wrapper{
  459. position:relative;
  460. overflow-x:auto;
  461. padding-bottom:$ios-spacing-md;
  462. /* 隐藏滚动条但保持功能 */
  463. scrollbar-width:none; /* Firefox */
  464. -ms-overflow-style:none; /* IE and Edge */
  465. }
  466. .stage-progress-wrapper::-webkit-scrollbar{
  467. display:none; /* Chrome, Safari, Opera */
  468. }
  469. /* 进度条容器内部样式 */
  470. .stage-progress{
  471. display:flex;
  472. align-items:center;
  473. position:relative;
  474. padding:$ios-spacing-sm 0;
  475. min-width:100%;
  476. }
  477. /* 进度线 */
  478. .stage-progress::before{
  479. content:'';
  480. position:absolute;
  481. top:50%;
  482. left:22px; /* 图标宽度的一半 */
  483. right:22px;
  484. height:3px;
  485. background-color:$ios-border;
  486. transform:translateY(-50%);
  487. z-index:1;
  488. }
  489. .progress-line{
  490. position:absolute;
  491. top:50%;
  492. left:22px; /* 图标宽度的一半 */
  493. height:3px;
  494. background:linear-gradient(90deg, $ios-success, $ios-primary);
  495. transform:translateY(-50%);
  496. z-index:2;
  497. transition:width 0.3s ease;
  498. }
  499. /* 阶段样式 - 10个阶段均匀分布 */
  500. .stage{
  501. display:flex;
  502. flex-direction:column;
  503. align-items:center;
  504. z-index:3;
  505. position:relative;
  506. flex-shrink:0;
  507. width:100px;
  508. cursor:pointer;
  509. transition:transform 0.2s ease;
  510. padding:0 $ios-spacing-sm;
  511. }
  512. .stage:hover{
  513. transform:translateY(-2px);
  514. }
  515. /* 阶段图标 - 现代化设计 */
  516. .stage-icon{
  517. width:44px;
  518. height:44px;
  519. border-radius:50%;
  520. background-color:$ios-border;
  521. color:$ios-text-secondary;
  522. display:flex;
  523. justify-content:center;
  524. align-items:center;
  525. font-weight:$ios-font-weight-semibold;
  526. margin-bottom:$ios-spacing-sm;
  527. transition:all 0.3s ease;
  528. box-shadow:0 2px 4px rgba(0,0,0,0.05);
  529. }
  530. /* 已完成阶段样式 */
  531. .stage.completed .stage-icon{
  532. background:linear-gradient(135deg, $ios-success, #2e7d32);
  533. color:white;
  534. box-shadow:0 0 0 4px #e6f7e6, 0 4px 12px rgba(46, 125, 50, 0.2);
  535. }
  536. /* 当前阶段样式 - 强调设计 */
  537. .stage.active .stage-icon{
  538. background:linear-gradient(135deg, $ios-primary, #0056b3);
  539. color:white;
  540. box-shadow:0 0 0 4px #e8f0fe, 0 4px 16px rgba(0, 123, 255, 0.3);
  541. animation:pulse 2s infinite;
  542. }
  543. @keyframes pulse {
  544. 0% {
  545. box-shadow:0 0 0 4px #e8f0fe, 0 4px 16px rgba(0, 123, 255, 0.3);
  546. }
  547. 50% {
  548. box-shadow:0 0 0 6px #e8f0fe, 0 4px 20px rgba(0, 123, 255, 0.4);
  549. }
  550. 100% {
  551. box-shadow:0 0 0 4px #e8f0fe, 0 4px 16px rgba(0, 123, 255, 0.3);
  552. }
  553. }
  554. /* 未开始阶段样式 */
  555. .stage.pending .stage-icon{
  556. background-color:$ios-background-tertiary;
  557. color:$ios-text-secondary;
  558. }
  559. /* 阶段名称样式 - 响应式设计 */
  560. .stage-name{
  561. font-size:$ios-font-size-xs;
  562. color:$ios-text-secondary;
  563. text-align:center;
  564. white-space:nowrap;
  565. font-weight:$ios-font-weight-medium;
  566. max-width:100%;
  567. overflow:hidden;
  568. text-overflow:ellipsis;
  569. transition:color 0.3s ease;
  570. }
  571. .stage.completed .stage-name,
  572. .stage.active .stage-name{
  573. color:$ios-text-primary;
  574. font-weight:$ios-font-weight-semibold;
  575. }
  576. /* 当前阶段操作区域 */
  577. .current-stage-actions{
  578. background-color:$ios-background;
  579. padding:$ios-spacing-lg;
  580. border-radius:$ios-radius-md;
  581. text-align:center;
  582. margin-top:$ios-spacing-lg;
  583. border-left:4px solid $ios-primary;
  584. box-shadow:0 2px 8px rgba(0,0,0,0.05);
  585. }
  586. .current-stage-info h3{margin-top:0;margin-bottom:$ios-spacing-md;font-size:$ios-font-size-base}
  587. .stage-highlight{color:$ios-primary;font-weight:$ios-font-weight-semibold}
  588. /* 按钮样式 */
  589. .primary-btn,.secondary-btn{border:none;padding:$ios-spacing-sm $ios-spacing-lg;border-radius:$ios-radius-md;font-size:$ios-font-size-sm;cursor:pointer;font-weight:$ios-font-weight-medium;white-space:nowrap}
  590. .primary-btn{background-color:$ios-primary;color:white}
  591. .primary-btn:hover{background-color:#0056b3;transform:translateY(-1px)}
  592. .primary-btn:disabled{background-color:$ios-border;color:$ios-text-secondary;cursor:not-allowed;transform:none}
  593. .secondary-btn{background-color:$ios-background-tertiary;color:$ios-text-primary}
  594. .secondary-btn:hover{background-color:#f0f0f0;transform:translateY(-1px)}
  595. /* 渲染进度卡片 */
  596. .loading-state,.error-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:$ios-spacing-xl;text-align:center;gap:$ios-spacing-md}
  597. .loading-spinner{width:40px;height:40px;border:3px solid $ios-border;border-top:3px solid $ios-primary;border-radius:50%;animation:spin 1s linear infinite}
  598. @keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}
  599. .timeout-warning{background-color:#fff3cd;color:$ios-warning;padding:$ios-spacing-md;border-radius:$ios-radius-md;margin-bottom:$ios-spacing-lg;display:flex;align-items:center;gap:$ios-spacing-sm;border-left:4px solid $ios-warning}
  600. .warning-title{font-weight:$ios-font-weight-medium;display:block}
  601. .warning-time{font-size:$ios-font-size-sm;display:block}
  602. /* 渲染异常反馈模块样式 */
  603. .render-exception-section {
  604. background-color: #f8f9fa;
  605. border-radius: 8px;
  606. padding: 20px;
  607. margin-bottom: 24px;
  608. }
  609. /* 客户反馈和设计师变更记录卡片并排布局 */
  610. .additional-info-section {
  611. display: flex;
  612. gap: $ios-spacing-xl;
  613. margin-bottom: $ios-spacing-xl;
  614. margin-top: $ios-spacing-xxl; /* 增加与上方内容的间距 */
  615. width: 100%;
  616. align-items: flex-start;
  617. padding: $ios-spacing-xl; /* 添加内边距 */
  618. background-color: $ios-background-secondary; /* 添加矩形背景 */
  619. border-radius: $ios-radius-lg; /* 添加圆角 */
  620. border: 1px solid $ios-border; /* 添加边框 */
  621. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.03); /* 添加轻微阴影增加层次感 */
  622. }
  623. .feedback-card,
  624. .designer-change-card {
  625. width: 50%;
  626. margin: 0 !important;
  627. min-height: 400px; /* 设置最小高度确保两个卡片高度一致 */
  628. display: flex;
  629. flex-direction: column;
  630. }
  631. /* 优化客户反馈卡片内部布局 */
  632. .feedback-card .card-content {
  633. flex: 1;
  634. display: flex;
  635. flex-direction: column;
  636. }
  637. .feedback-item {
  638. background-color: $ios-background;
  639. border-radius: $ios-radius-md;
  640. padding: $ios-spacing-md;
  641. margin-bottom: $ios-spacing-md;
  642. border: 1px solid $ios-border;
  643. }
  644. .feedback-header {
  645. display: flex;
  646. justify-content: space-between;
  647. align-items: flex-start;
  648. margin-bottom: $ios-spacing-sm;
  649. }
  650. .feedback-meta {
  651. display: flex;
  652. gap: $ios-spacing-sm;
  653. flex-wrap: wrap;
  654. }
  655. /* 优化设计师变更记录卡片内部布局 */
  656. .designer-change-card .card-content {
  657. flex: 1;
  658. display: flex;
  659. flex-direction: column;
  660. }
  661. .designer-change-card .change-actions {
  662. display: flex;
  663. gap: $ios-spacing-md;
  664. margin-bottom: $ios-spacing-md;
  665. flex-wrap: wrap;
  666. }
  667. .change-item {
  668. background-color: $ios-background;
  669. border-radius: $ios-radius-md;
  670. padding: $ios-spacing-md;
  671. margin-bottom: $ios-spacing-md;
  672. border: 1px solid $ios-border;
  673. }
  674. .change-header {
  675. display: flex;
  676. justify-content: space-between;
  677. align-items: center;
  678. margin-bottom: $ios-spacing-sm;
  679. }
  680. /* 空状态样式优化 */
  681. .empty-state {
  682. display: flex;
  683. flex-direction: column;
  684. align-items: center;
  685. justify-content: center;
  686. padding: $ios-spacing-xl;
  687. height: 200px;
  688. background-color: $ios-background-tertiary;
  689. border-radius: $ios-radius-md;
  690. margin-top: $ios-spacing-md;
  691. }
  692. .empty-icon {
  693. font-size: 48px;
  694. margin-bottom: $ios-spacing-md;
  695. opacity: 0.6;
  696. }
  697. /* 响应式调整 */
  698. @media (max-width: 768px) {
  699. .additional-info-section {
  700. flex-direction: column;
  701. }
  702. .feedback-card,
  703. .designer-change-card {
  704. width: 100%;
  705. margin-bottom: $ios-spacing-xl !important;
  706. }
  707. }
  708. /* 模型误差检查清单在制作流程进度卡片中的样式 */
  709. .model-check-section {
  710. margin-top: $ios-spacing-lg;
  711. padding: $ios-spacing-lg;
  712. background-color: $ios-background;
  713. border-radius: $ios-radius-md;
  714. border-left: 4px solid $ios-primary;
  715. }
  716. .model-check-section h3 {
  717. margin-top: 0;
  718. margin-bottom: $ios-spacing-md;
  719. color: $ios-text-primary;
  720. font-size: $ios-font-size-base;
  721. font-weight: $ios-font-weight-medium;
  722. }
  723. .model-check-section .checklist {
  724. gap: $ios-spacing-sm;
  725. }
  726. .model-check-section .checklist-item {
  727. padding: $ios-spacing-sm $ios-spacing-md;
  728. background-color: $ios-background-tertiary;
  729. transition: all 0.2s ease;
  730. }
  731. .model-check-section .checklist-item:hover {
  732. background-color: #f0f0f0;
  733. transform: translateX(4px);
  734. }
  735. .model-check-section .custom-checkbox {
  736. width: 18px;
  737. height: 18px;
  738. }
  739. .model-check-section .checklist-text {
  740. font-size: $ios-font-size-sm;
  741. }
  742. .model-check-section .check-status {
  743. font-size: $ios-font-size-xs;
  744. }
  745. .render-exception-section h3 {
  746. margin-top: 0;
  747. margin-bottom: 16px;
  748. color: #333;
  749. font-size: 18px;
  750. font-weight: 600;
  751. }
  752. .exception-feedback-form {
  753. background-color: white;
  754. padding: 16px;
  755. border-radius: 8px;
  756. margin-bottom: 20px;
  757. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  758. }
  759. .form-group {
  760. margin-bottom: 16px;
  761. }
  762. .form-group label {
  763. display: block;
  764. margin-bottom: 6px;
  765. color: #555;
  766. font-weight: 500;
  767. font-size: 14px;
  768. }
  769. .exception-select {
  770. width: 100%;
  771. padding: 8px 12px;
  772. border: 1px solid #ddd;
  773. border-radius: 4px;
  774. font-size: 14px;
  775. background-color: white;
  776. cursor: pointer;
  777. }
  778. .exception-textarea {
  779. width: 100%;
  780. min-height: 120px;
  781. padding: 10px 12px;
  782. border: 1px solid #ddd;
  783. border-radius: 4px;
  784. font-size: 14px;
  785. resize: vertical;
  786. font-family: inherit;
  787. }
  788. .screenshot-upload {
  789. display: none;
  790. }
  791. .upload-btn {
  792. display: inline-block;
  793. padding: 8px 16px;
  794. background-color: #007bff;
  795. color: white;
  796. border-radius: 4px;
  797. cursor: pointer;
  798. font-size: 14px;
  799. font-weight: 500;
  800. transition: background-color 0.2s;
  801. }
  802. .upload-btn:hover {
  803. background-color: #0056b3;
  804. }
  805. .screenshot-preview {
  806. margin-top: 12px;
  807. position: relative;
  808. max-width: 200px;
  809. border: 1px solid #ddd;
  810. border-radius: 4px;
  811. overflow: hidden;
  812. }
  813. .screenshot-preview img {
  814. width: 100%;
  815. display: block;
  816. }
  817. .clear-screenshot-btn {
  818. position: absolute;
  819. top: 5px;
  820. right: 5px;
  821. background-color: rgba(0, 0, 0, 0.5);
  822. color: white;
  823. border: none;
  824. border-radius: 50%;
  825. width: 24px;
  826. height: 24px;
  827. font-size: 16px;
  828. line-height: 1;
  829. cursor: pointer;
  830. display: flex;
  831. align-items: center;
  832. justify-content: center;
  833. }
  834. .clear-screenshot-btn:hover {
  835. background-color: rgba(0, 0, 0, 0.7);
  836. }
  837. .submit-feedback-btn {
  838. padding: 10px 20px;
  839. background-color: #28a745;
  840. color: white;
  841. border: none;
  842. border-radius: 4px;
  843. font-size: 14px;
  844. font-weight: 600;
  845. cursor: pointer;
  846. transition: background-color 0.2s;
  847. }
  848. .submit-feedback-btn:hover:not(:disabled) {
  849. background-color: #218838;
  850. }
  851. .submit-feedback-btn:disabled {
  852. background-color: #6c757d;
  853. cursor: not-allowed;
  854. }
  855. /* 历史反馈记录样式 */
  856. .exception-history {
  857. background-color: white;
  858. padding: 16px;
  859. border-radius: 8px;
  860. box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
  861. }
  862. .exception-history h4 {
  863. margin-top: 0;
  864. margin-bottom: 12px;
  865. color: #555;
  866. font-size: 16px;
  867. font-weight: 600;
  868. }
  869. .history-list {
  870. max-height: 300px;
  871. overflow-y: auto;
  872. }
  873. .history-item {
  874. padding: 12px;
  875. border: 1px solid #eee;
  876. border-radius: 4px;
  877. margin-bottom: 12px;
  878. transition: border-color 0.2s;
  879. }
  880. .history-item:hover {
  881. border-color: #ddd;
  882. }
  883. .history-header {
  884. display: flex;
  885. justify-content: space-between;
  886. align-items: center;
  887. margin-bottom: 8px;
  888. }
  889. .history-type {
  890. font-weight: 600;
  891. color: #333;
  892. font-size: 14px;
  893. }
  894. .history-time {
  895. font-size: 12px;
  896. color: #999;
  897. }
  898. .history-description {
  899. font-size: 14px;
  900. color: #555;
  901. margin-bottom: 8px;
  902. line-height: 1.4;
  903. }
  904. .history-status {
  905. font-size: 12px;
  906. padding: 4px 8px;
  907. border-radius: 3px;
  908. display: inline-block;
  909. }
  910. .history-status.status-pending {
  911. background-color: #fff3cd;
  912. color: #856404;
  913. }
  914. .history-status.status-processing {
  915. background-color: #d1ecf1;
  916. color: #0c5460;
  917. }
  918. .history-status.status-resolved {
  919. background-color: #d4edda;
  920. color: #155724;
  921. }
  922. /* 响应式设计 */
  923. @media (max-width: 768px) {
  924. .render-exception-section {
  925. padding: 16px;
  926. }
  927. .form-group {
  928. margin-bottom: 12px;
  929. }
  930. .screenshot-preview {
  931. max-width: 150px;
  932. }
  933. }
  934. .progress-bar-container{position:relative;margin-bottom:$ios-spacing-lg}
  935. .progress-bar{width:100%;height:12px;background-color:$ios-background-tertiary;border-radius:$ios-radius-full;overflow:hidden}
  936. .progress-fill{height:100%;background-color:$ios-primary;border-radius:$ios-radius-full}
  937. .progress-percentage{position:absolute;right:0;top:-$ios-spacing-md;font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;color:$ios-text-secondary}
  938. .progress-details{display:grid;grid-template-columns:1fr 1fr;gap:$ios-spacing-md}
  939. .progress-info{display:flex;flex-direction:column;gap:$ios-spacing-xs}
  940. .info-label{font-size:$ios-font-size-xs;color:$ios-text-secondary}
  941. .info-value{font-size:$ios-font-size-base;color:$ios-text-primary;font-weight:$ios-font-weight-medium}
  942. .checklist{display:flex;flex-direction:column;gap:$ios-spacing-md}
  943. .checklist-item{display:flex;align-items:center;padding:$ios-spacing-md;border-radius:$ios-radius-md;background-color:$ios-background-tertiary}
  944. .custom-checkbox{margin-right:$ios-spacing-md;width:20px;height:20px;accent-color:$ios-primary;border-radius:$ios-radius-sm}
  945. .checklist-text{color:$ios-text-primary;font-size:$ios-font-size-base;flex:1}
  946. .check-status{font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;padding:$ios-spacing-xs $ios-spacing-sm;border-radius:$ios-radius-full}
  947. .check-status.passed{background-color:#e6f7e6;color:$ios-success}
  948. .check-status.failed{background-color:#ffebee;color:$ios-danger}
  949. .empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:$ios-spacing-xl;text-align:center;gap:$ios-spacing-md;color:$ios-text-secondary}
  950. .empty-icon{font-size:$ios-font-size-xl}
  951. .feedback-item{background-color:$ios-background-tertiary;border-radius:$ios-radius-md;padding:$ios-spacing-lg;margin-bottom:$ios-spacing-md}
  952. .feedback-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:$ios-spacing-md}
  953. .feedback-meta{display:flex;align-items:center;gap:$ios-spacing-sm}
  954. .feedback-type{font-size:$ios-font-size-sm;font-weight:$ios-font-weight-medium;color:$ios-text-primary}
  955. .feedback-tag{font-size:$ios-font-size-xs;background-color:#e8f0fe;color:$ios-primary;padding:$ios-spacing-xs $ios-spacing-sm;border-radius:$ios-radius-full;font-weight:$ios-font-weight-medium}
  956. .feedback-date{font-size:$ios-font-size-xs;color:$ios-text-secondary}
  957. .feedback-content{margin-bottom:$ios-spacing-md}
  958. .feedback-status{display:flex;align-items:center;gap:$ios-spacing-xs;margin-bottom:$ios-spacing-sm;font-size:$ios-font-size-sm}
  959. .status-label{color:$ios-text-secondary}
  960. .status-value{color:$ios-text-primary;font-weight:$ios-font-weight-medium}
  961. .feedback-countdown{display:flex;align-items:center;gap:$ios-spacing-xs;padding:$ios-spacing-xs $ios-spacing-sm;background-color:#fff3cd;color:$ios-warning;border-radius:$ios-radius-full;font-size:$ios-font-size-xs;margin-bottom:$ios-spacing-md}
  962. .countdown-icon{font-size:$ios-font-size-sm}
  963. .feedback-details{display:flex;flex-direction:column;gap:$ios-spacing-xs}
  964. .detail-item{display:flex;gap:$ios-spacing-sm;font-size:$ios-font-size-sm}
  965. .detail-label{color:$ios-text-secondary;width:80px;flex-shrink:0}
  966. .detail-value{color:$ios-text-primary;flex:1}
  967. .feedback-actions{display:flex;gap:$ios-spacing-md;justify-content:flex-end}
  968. .change-actions{display:flex;gap:$ios-spacing-md;margin-bottom:$ios-spacing-lg;flex-wrap:wrap}
  969. .change-item{background-color:$ios-background-tertiary;border-radius:$ios-radius-md;padding:$ios-spacing-lg;margin-bottom:$ios-spacing-md}
  970. .change-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:$ios-spacing-md}
  971. .change-time{font-size:$ios-font-size-sm;color:$ios-text-secondary;font-weight:$ios-font-weight-semibold}
  972. .accept-change-btn{background-color:$ios-success;color:white;border:none;padding:$ios-spacing-xs $ios-spacing-md;border-radius:$ios-radius-md;font-size:$ios-font-size-sm;cursor:pointer;font-weight:$ios-font-weight-medium}
  973. .accept-change-btn:hover{background-color:#2e7d32;transform:translateY(-1px)}
  974. .designer-change-info{display:grid;grid-template-columns:1fr;gap:$ios-spacing-sm;margin-bottom:$ios-spacing-md}
  975. .designer-change{display:flex;gap:$ios-spacing-sm;align-items:center}
  976. .designer-label{color:$ios-text-secondary;font-size:$ios-font-size-sm;width:80px;flex-shrink:0}
  977. .designer-name{color:$ios-text-primary;font-size:$ios-font-size-base;font-weight:$ios-font-weight-medium}
  978. .workload-info{font-size:$ios-font-size-sm;color:$ios-text-secondary;margin-bottom:$ios-spacing-md}
  979. .achievements{margin-bottom:$ios-spacing-md}
  980. .achievements ul{margin:0;padding-left:$ios-spacing-lg}
  981. .achievements li{color:$ios-text-primary;font-size:$ios-font-size-sm;margin-bottom:$ios-spacing-xs;position:relative}
  982. .change-status{font-size:$ios-font-size-sm;color:$ios-text-secondary;background-color:$ios-background;padding:$ios-spacing-sm;border-radius:$ios-radius-md}
  983. /* 分阶段结算记录卡片 */
  984. .settlement-table{overflow-x:auto;border-radius:$ios-radius-md;background-color:$ios-background;border:1px solid $ios-border}
  985. .settlement-table table{width:100%;border-collapse:collapse}
  986. .settlement-table th,.settlement-table td{padding:$ios-spacing-md;text-align:left;border-bottom:1px solid $ios-border;font-size:$ios-font-size-sm}
  987. .settlement-table th{background-color:$ios-background-secondary;font-weight:$ios-font-weight-semibold;color:$ios-text-primary;position:sticky;top:0;z-index:10}
  988. .settlement-table td{color:$ios-text-primary;font-weight:$ios-font-weight-regular}
  989. .settlement-table tr:last-child td{border-bottom:none}
  990. .settlement-table tr:hover td{background-color:#f5f5f5}
  991. .status-badge{padding:$ios-spacing-xs $ios-spacing-sm;border-radius:$ios-radius-full;font-size:$ios-font-size-xs;font-weight:$ios-font-weight-medium}
  992. .status-pending{background-color:#fff3cd;color:$ios-warning}
  993. .status-settled{background-color:#e6f7e6;color:$ios-success}
  994. /* 响应式设计 */
  995. @media (max-width: 768px){
  996. .project-detail-container{padding:$ios-spacing-md}
  997. .main-content-layout {
  998. flex-direction: column;
  999. }
  1000. .left-column,
  1001. .right-column {
  1002. width: 100%;
  1003. }
  1004. .project-header{flex-direction:column;align-items:flex-start;gap:$ios-spacing-md}
  1005. .header-actions{width:100%;justify-content:flex-end}
  1006. .project-info-card .info-grid{grid-template-columns:1fr;gap:$ios-spacing-md}
  1007. .stage-progress{flex-direction:column;gap:$ios-spacing-lg}
  1008. .stage-progress::before{display:none}
  1009. .stage{flex-direction:row;gap:$ios-spacing-md;width:100%;justify-content:flex-start}
  1010. .stage-icon{margin-bottom:0;width:36px;height:36px;font-size:$ios-font-size-sm}
  1011. .progress-details{grid-template-columns:1fr;gap:$ios-spacing-md}
  1012. .feedback-actions,.change-actions{flex-direction:column}
  1013. .feedback-actions button,.change-actions button{width:100%}
  1014. .tags-grid{grid-template-columns:1fr}
  1015. .settlement-table th,.settlement-table td{padding:$ios-spacing-sm;font-size:$ios-font-size-xs}
  1016. .stage-tag{font-size:$ios-font-size-xs}
  1017. }
  1018. /* 滚动条样式 */
  1019. ::-webkit-scrollbar{width:8px;height:8px}
  1020. ::-webkit-scrollbar-track{background:$ios-scrollbar-track;border-radius:$ios-radius-full}
  1021. ::-webkit-scrollbar-thumb{background:$ios-scrollbar-thumb;border-radius:$ios-radius-full}
  1022. ::-webkit-scrollbar-thumb:hover{background:$ios-scrollbar-thumb-hover}
  1023. /* 上传与缩略图样式(新增) */
  1024. .upload-section { margin-top: 16px; padding: 12px; background: #fafbfc; border: 1px dashed #e0e3e8; border-radius: 8px; }
  1025. .upload-header { display:flex; align-items:center; gap:12px; margin-bottom: 8px; }
  1026. .upload-header h4 { margin:0; font-size:$ios-font-size-base; }
  1027. .upload-header .hint { color:$ios-text-secondary; font-size:$ios-font-size-xs; }
  1028. .upload-actions { margin-bottom: 12px; }
  1029. .thumb-list { display:flex; gap:12px; flex-wrap:wrap; }
  1030. .thumb-item { width:120px; background:#fff; border:1px solid #eee; border-radius:8px; overflow:hidden; display:flex; flex-direction:column; }
  1031. .thumb-item img { width:100%; height:88px; object-fit:cover; background:#f2f2f2; }
  1032. .thumb-meta { display:flex; flex-direction:column; gap:4px; padding:6px 8px; }
  1033. .thumb-meta .name { font-size:$ios-font-size-xs; color:$ios-text-primary; line-height:1.2; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
  1034. .thumb-meta .size { font-size:$ios-font-size-xs; color:$ios-text-secondary; }
  1035. button.link { background:none; border:none; color:$ios-primary; cursor:pointer; padding:6px 8px; text-align:left; }
  1036. button.link.danger { color:$ios-danger; }
  1037. /* 弹窗样式(新增) */
  1038. .modal-backdrop { position:fixed; inset:0; background: rgba(0,0,0,0.35); display:flex; align-items:center; justify-content:center; z-index: 999; }
  1039. .modal { width: 720px; max-width: calc(100% - 48px); background:#fff; border-radius:12px; box-shadow: 0 12px 24px rgba(0,0,0,0.15); overflow:hidden; }
  1040. .modal-header { display:flex; align-items:center; justify-content:space-between; padding:12px 16px; border-bottom:1px solid $ios-border; }
  1041. .modal-body { padding:16px; }
  1042. .modal-footer { padding:12px 16px; border-top:1px solid $ios-border; display:flex; gap:12px; justify-content:flex-end; }
  1043. /* 兼容暗色系(若未来启用) */
  1044. @media (prefers-color-scheme: dark) {
  1045. .upload-section { background: rgba(255,255,255,0.04); border-color: rgba(255,255,255,0.15); }
  1046. .thumb-item { background: rgba(255,255,255,0.06); border-color: rgba(255,255,255,0.12); }
  1047. .modal { background: #111315; }
  1048. }
  1049. /* 阶段详情:与上方阶段横向对齐的横向卡片列表 */
  1050. .stage-details-grid{
  1051. display:flex;
  1052. gap:$ios-spacing-md;
  1053. align-items:stretch;
  1054. padding-top:$ios-spacing-md;
  1055. overflow-x:auto;
  1056. scrollbar-width:none; /* Firefox */
  1057. -ms-overflow-style:none; /* IE and Edge */
  1058. }
  1059. .stage-details-grid::-webkit-scrollbar{ display:none; }
  1060. .stage-details-cell{ flex:0 0 280px; }
  1061. @media (max-width: 768px){
  1062. .stage-details-grid{flex-direction:column;overflow-x:visible}
  1063. .stage-details-cell{flex:1 1 auto}
  1064. }
  1065. .stage-details-cell{ flex:1 1 auto; }
  1066. .stage-details-cell{ flex:1 1 auto; }
  1067. .stage-details-cell{ flex:1 1 auto; }
  1068. .stage-details-cell{ flex:1 1 auto; }
  1069. .stage-details-cell{ flex:1 1 auto; }
  1070. .stage-details-cell{ flex:1 1 auto; }
  1071. .stage-details-cell{ flex:1 1 auto; }
  1072. .stage-details-cell{ flex:1 1 auto; }
  1073. .stage-details-cell{ flex:1 1 auto; }
  1074. .stage-details-cell{ flex:1 1 auto; }
  1075. .stage-details-cell{ flex:1 1 auto; }
  1076. .stage-details-cell{ flex:1 1 auto; }
  1077. .stage-details-cell{ flex:1 1 auto; }
  1078. .stage-details-cell{ flex:1 1 auto; }
  1079. .stage-details-cell{ flex:1 1 auto; }
  1080. .stage-details-cell{ flex:1 1 auto; }
  1081. .stage-details-cell{ flex:1 1 auto; }
  1082. .stage-details-cell{ flex:1 1 auto; }
  1083. .stage-details-cell{ flex:1 1 auto; }
  1084. .stage-details-cell{ flex:1 1 auto; }
  1085. .stage-details-cell{ flex:1 1 auto; }
  1086. .stage-details-cell{ flex:1 1 auto; }
  1087. .stage-details-cell{ flex:1 1 auto; }
  1088. .stage-details-cell{ flex:1 1 auto; }
  1089. .stage-details-cell{ flex:1 1 auto; }
  1090. .stage-details-cell{ flex:1 1 auto; }
  1091. .stage-details-cell{ flex:1 1 auto; }
  1092. .stage-details-cell{ flex:1 1 auto; }
  1093. .stage-details-cell{ flex:1 1 auto; }
  1094. .stage-details-cell{ flex:1 1 auto; }
  1095. .stage-details-cell{ flex:1 1 auto; }
  1096. .stage-details-cell{ flex:1 1 auto; }
  1097. .stage-details-cell{ flex:1 1 auto; }
  1098. .stage-details-cell{ flex:1 1 auto; }
  1099. .stage-details-cell{ flex:1 1 auto; }
  1100. .stage-details-cell{ flex:1 1 auto; }
  1101. .stage-details-cell{ flex:1 1 auto; }
  1102. .stage-details-cell{ flex:1 1 auto; }
  1103. .stage-details-cell{ flex:1 1 auto; }
  1104. .stage-details-cell{ flex:1 1 auto; }
  1105. .stage-details-cell{ flex:1 1 auto; }
  1106. .stage-details-cell{ flex:1 1 auto; }
  1107. .stage-details-cell{ flex:1 1 auto; }
  1108. .stage-details-cell{ flex:1 1 auto; }
  1109. .stage-details-cell{ flex:1 1 auto; }
  1110. .stage-details-cell{ flex:1 1 auto; }
  1111. .stage-details-cell{ flex:1 1 auto; }
  1112. .stage-details-cell{ flex:1 1 auto; }
  1113. .stage-details-cell{ flex:1 1 auto; }
  1114. .stage-details-cell{ flex:1 1 auto; }
  1115. .stage-details-cell{ flex:1 1 auto; }
  1116. .stage-details-cell{ flex:1 1 auto; }
  1117. .stage-details-cell{ flex:1 1 auto; }
  1118. .stage-details-cell{ flex:1 1 auto; }
  1119. .stage-details-cell{ flex:1 1 auto; }
  1120. .stage-details-cell{ flex:1 1 auto; }
  1121. .stage-details-cell{ flex:1 1 auto; }
  1122. .stage-details-cell{ flex:1 1 auto; }
  1123. .stage-details-cell{ flex:1 1 auto; }
  1124. .stage-details-cell{ flex:1 1 auto; }
  1125. .stage-details-cell{ flex:1 1 auto; }
  1126. .stage-details-cell{ flex:1 1 auto; }
  1127. .stage-details-cell{ flex:1 1 auto; }
  1128. .stage-details-cell{ flex:1 1 auto; }
  1129. .stage-details-cell{ flex:1 1 auto; }
  1130. .stage-details-cell{ flex:1 1 auto; }
  1131. .stage-details-cell{ flex:1 1 auto; }
  1132. .stage-details-cell{ flex:1 1 auto; }
  1133. .stage-details-cell{ flex:1 1 auto; }
  1134. .stage-details-cell{ flex:1 1 auto; }
  1135. .stage-details-cell{ flex:1 1 auto; }
  1136. .stage-details-cell{ flex:1 1 auto; }
  1137. .stage-details-cell{ flex:1 1 auto; }
  1138. .stage-details-cell{ flex:1 1 auto; }
  1139. .stage-details-cell{ flex:1 1 auto; }
  1140. .stage-details-cell{ flex:1 1 auto; }
  1141. .stage-details-cell{ flex:1 1 auto; }
  1142. .stage-details-cell{ flex:1 1 auto; }
  1143. .stage-details-cell{ flex:1 1 auto; }
  1144. .stage-details-cell{ flex:1 1 auto; }
  1145. .stage-details-cell{ flex:1 1 auto; }
  1146. .stage-details-cell{ flex:1 1 auto; }
  1147. .stage-details-cell{ flex:1 1 auto; }
  1148. .stage-details-cell{ flex:1 1 auto; }
  1149. .stage-details-cell{ flex:1 1 auto; }
  1150. .stage-details-cell{ flex:1 1 auto; }
  1151. .stage-details-cell{ flex:1 1 auto; }
  1152. .stage-details-cell{ flex:1 1 auto; }
  1153. .stage-details-cell{ flex:1 1 auto; }
  1154. .stage-details-cell{ flex:1 1 auto; }
  1155. .stage-details-cell{ flex:1 1 auto; }
  1156. .stage-details-cell{ flex:1 1 auto; }
  1157. .stage-details-cell{ flex:1 1 auto; }
  1158. .stage-details-cell{ flex:1 1 auto; }
  1159. .stage-details-cell{ flex:1 1 auto; }
  1160. .stage-details-cell{ flex:1 1 auto; }
  1161. .stage-details-cell{ flex:1 1 auto; }
  1162. .stage-details-cell{ flex:1 1 auto; }
  1163. .stage-details-cell{ flex:1 1 auto; }
  1164. .stage-details-cell{ flex:1 1 auto; }
  1165. .stage-details-cell{ flex:1 1 auto; }
  1166. .stage-details-cell{ flex:1 1 auto; }
  1167. .stage-details-cell{ flex:1 1 auto; }
  1168. .stage-details-cell{ flex:1 1 auto; }
  1169. .stage-details-cell{ flex:1 1 auto; }
  1170. .stage-details-cell{ flex:1 1 auto; }
  1171. .stage-details-cell{ flex:1 1 auto; }
  1172. .stage-details-cell{ flex:1 1 auto; }
  1173. .stage-details-cell{ flex:1 1 auto; }
  1174. .stage-details-cell{ flex:1 1 auto; }
  1175. .stage-details-cell{ flex:1 1 auto; }
  1176. .stage-details-cell{ flex:1 1 auto; }
  1177. .stage-details-cell{ flex:1 1 auto; }
  1178. .stage-details-cell{ flex:1 1 auto; }
  1179. .stage-details-cell{ flex:1 1 auto; }
  1180. .stage-details-cell{ flex:1 1 auto; }
  1181. .stage-details-cell{ flex:1 1 auto; }
  1182. .stage-details-cell{ flex:1 1 auto; }
  1183. .stage-details-cell{ flex:1 1 auto; }
  1184. .stage-details-cell{ flex:1 1 auto; }
  1185. .stage-details-cell{ flex:1 1 auto; }
  1186. .stage-details-cell{ flex:1 1 auto; }
  1187. .stage-details-cell{ flex:1 1 auto; }
  1188. .stage-details-cell{ flex:1 1 auto; }
  1189. .stage-details-cell{ flex:1 1 auto; }
  1190. .stage-details-cell{ flex:1 1 auto; }
  1191. .stage-details-cell{ flex:1 1 auto; }
  1192. .stage-details-cell{ flex:1 1 auto; }
  1193. .stage-details-cell{ flex:1 1 auto; }
  1194. .stage-details-cell{ flex:1 1 auto; }
  1195. .stage-details-cell{ flex:1 1 auto; }
  1196. .stage-details-cell{ flex:1 1 auto; }
  1197. .stage-details-cell{ flex:1 1 auto; }
  1198. .stage-details-cell{ flex:1 1 auto; }
  1199. .stage-details-cell{ flex:1 1 auto; }
  1200. .stage-details-cell{ flex:1 1 auto; }
  1201. .stage-details-cell{ flex:1 1 auto; }
  1202. .stage-details-cell{ flex:1 1 auto; }
  1203. .stage-details-cell{ flex:1 1 auto; }
  1204. .stage-details-cell{ flex:1 1 auto; }
  1205. .stage-details-cell{ flex:1 1 auto; }
  1206. .stage-details-cell{ flex:1 1 auto; }
  1207. .stage-details-cell{ flex:1 1 auto; }
  1208. .stage-details-cell{ flex:1 1 auto; }
  1209. .stage-details-cell{ flex:1 1 auto; }
  1210. .stage-details-cell{ flex:1 1 auto; }
  1211. .stage-details-cell{ flex:1 1 auto; }
  1212. .stage-details-cell{ flex:1 1 auto; }
  1213. .stage-details-cell{ flex:1 1 auto; }
  1214. .stage-details-cell{ flex:1 1 auto; }
  1215. .stage-details-cell{ flex:1 1 auto; }
  1216. .stage-details-cell{ flex:1 1 auto; }
  1217. .stage-details-cell{ flex:1 1 auto; }
  1218. .stage-details-cell{ flex:1 1 auto; }
  1219. .stage-details-cell{ flex:1 1 auto; }
  1220. .stage-details-cell{ flex:1 1 auto; }
  1221. .stage-details-cell{ flex:1 1 auto; }
  1222. .stage-details-cell{ flex:1 1 auto; }
  1223. .stage-details-cell{ flex:1 1 auto; }
  1224. .stage-details-cell{ flex:1 1 auto; }
  1225. .stage-details-cell{ flex:1 1 auto; }
  1226. .stage-details-cell{ flex:1 1 auto; }
  1227. .stage-details-cell{ flex:1 1 auto; }
  1228. .stage-details-cell{ flex:1 1 auto; }
  1229. .stage-details-cell{ flex:1 1 auto; }
  1230. .stage-details-cell{ flex:1 1 auto; }
  1231. .stage-details-cell{ flex:1 1 auto; }
  1232. .stage-details-cell{ flex:1 1 auto; }
  1233. .stage-details-cell{ flex:1 1 auto; }
  1234. .stage-details-cell{ flex:1 1 auto; }
  1235. .stage-details-cell{ flex:1 1 auto; }
  1236. .stage-details-cell{ flex:1 1 auto; }
  1237. .stage-details-cell{ flex:1 1 auto; }
  1238. .stage-details-cell{ flex:1 1 auto; }
  1239. .stage-details-cell{ flex:1 1 auto; }
  1240. .stage-details-cell{ flex:1 1 auto; }
  1241. .stage-details-cell{ flex:1 1 auto; }
  1242. .stage-details-cell{ flex:1 1 auto; }
  1243. .stage-details-cell{ flex:1 1 auto; }
  1244. .stage-details-cell{ flex:1 1 auto; }
  1245. .stage-details-cell{ flex:1 1 auto; }
  1246. .stage-details-cell{ flex:1 1 auto; }
  1247. .stage-details-cell{ flex:1 1 auto; }
  1248. .stage-details-cell{ flex:1 1 auto; }
  1249. .stage-details-cell{ flex:1 1 auto; }
  1250. .stage-details-cell{ flex:1 1 auto; }
  1251. .stage-details-cell{ flex:1 1 auto; }
  1252. .stage-details-cell{ flex:1 1 auto; }
  1253. .stage-details-cell{ flex:1 1 auto; }
  1254. .stage-details-cell{ flex:1 1 auto; }
  1255. .stage-details-cell{ flex:1 1 auto; }
  1256. .stage-details-cell{ flex:1 1 auto; }
  1257. .stage-details-cell{ flex:1 1 auto; }
  1258. .stage-details-cell{ flex:1 1 auto; }
  1259. .stage-details-cell{ flex:1 1 auto; }
  1260. .stage-details-cell{ flex:1 1 auto; }
  1261. .stage-details-cell{ flex:1 1 auto; }
  1262. .stage-details-cell{ flex:1 1 auto; }
  1263. .stage-details-cell{ flex:1 1 auto; }
  1264. .stage-details-cell{ flex:1 1 auto; }
  1265. .stage-details-cell{ flex:1 1 auto; }
  1266. .stage-details-cell{ flex:1 1 auto; }
  1267. .stage-details-cell{ flex:1 1 auto; }
  1268. .stage-details-cell{ flex:1 1 auto; }
  1269. .stage-details-cell{ flex:1 1 auto; }
  1270. .stage-details-cell{ flex:1 1 auto; }
  1271. .stage-details-cell{ flex:1 1 auto; }
  1272. .stage-details-cell{ flex:1 1 auto; }
  1273. .stage-details-cell{ flex:1 1 auto; }
  1274. .stage-details-cell{ flex:1 1 auto; }
  1275. .stage-details-cell{ flex:1 1 auto; }
  1276. .stage-details-cell{ flex:1 1 auto; }
  1277. .stage-details-cell{ flex:1 1 auto; }
  1278. .stage-details-cell{ flex:1 1 auto; }
  1279. .stage-details-cell{ flex:1 1 auto; }
  1280. .stage-details-cell{ flex:1 1 auto; }
  1281. .stage-details-cell{ flex:1 1 auto; }
  1282. .stage-details-cell{ flex:1 1 auto; }
  1283. .stage-details-cell{ flex:1 1 auto; }
  1284. .stage-details-cell{ flex:1 1 auto; }
  1285. .stage-details-cell{ flex:1 1 auto; }
  1286. .stage-details-cell{ flex:1 1 auto; }
  1287. .stage-details-cell{ flex:1 1 auto; }
  1288. .stage-details-cell{ flex:1 1 auto; }
  1289. .stage-details-cell{ flex:1 1 auto; }
  1290. .stage-details-cell{ flex:1 1 auto; }
  1291. .stage-details-cell{ flex:1 1 auto; }
  1292. .stage-details-cell{ flex:1 1 auto; }
  1293. .stage-details-cell{ flex:1 1 auto; }
  1294. .stage-details-cell{ flex:1 1 auto; }
  1295. .stage-details-cell{ flex:1 1 auto; }
  1296. .stage-details-cell{ flex:1 1 auto; }
  1297. .stage-details-cell{ flex:1 1 auto; }