project-timeline.scss 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. .project-timeline-container {
  2. width: 100%;
  3. height: 100%;
  4. display: flex;
  5. flex-direction: column;
  6. background: #ffffff;
  7. border-radius: 8px;
  8. overflow: hidden;
  9. }
  10. // 顶部筛选栏
  11. .timeline-header {
  12. padding: 16px;
  13. background: #f9fafb;
  14. border-bottom: 1px solid #e5e7eb;
  15. }
  16. .filter-section {
  17. display: flex;
  18. align-items: center;
  19. gap: 16px;
  20. flex-wrap: wrap;
  21. }
  22. .filter-group {
  23. display: flex;
  24. align-items: center;
  25. gap: 8px;
  26. label {
  27. font-size: 14px;
  28. font-weight: 500;
  29. color: #374151;
  30. white-space: nowrap;
  31. }
  32. }
  33. .filter-select {
  34. padding: 6px 12px;
  35. border: 1px solid #d1d5db;
  36. border-radius: 6px;
  37. font-size: 14px;
  38. background: #ffffff;
  39. cursor: pointer;
  40. transition: all 0.2s;
  41. &:hover {
  42. border-color: #9ca3af;
  43. }
  44. &:focus {
  45. outline: none;
  46. border-color: #3b82f6;
  47. box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
  48. }
  49. }
  50. .quick-filters {
  51. margin-left: auto;
  52. }
  53. .filter-btn {
  54. padding: 6px 12px;
  55. border: 1px solid #d1d5db;
  56. border-radius: 6px;
  57. background: #ffffff;
  58. font-size: 13px;
  59. cursor: pointer;
  60. transition: all 0.2s;
  61. &:hover {
  62. background: #f3f4f6;
  63. }
  64. &.active {
  65. background: #3b82f6;
  66. color: #ffffff;
  67. border-color: #3b82f6;
  68. }
  69. }
  70. .view-controls,
  71. .sort-controls,
  72. .time-scale-controls {
  73. border-left: 1px solid #e5e7eb;
  74. padding-left: 16px;
  75. }
  76. .view-btn,
  77. .sort-btn,
  78. .scale-btn,
  79. .refresh-btn {
  80. padding: 6px 12px;
  81. border: 1px solid #d1d5db;
  82. border-radius: 6px;
  83. background: #ffffff;
  84. font-size: 13px;
  85. cursor: pointer;
  86. transition: all 0.2s;
  87. &:hover {
  88. background: #f3f4f6;
  89. }
  90. &.active {
  91. background: #3b82f6;
  92. color: #ffffff;
  93. border-color: #3b82f6;
  94. }
  95. }
  96. // 时间尺度切换按钮特殊样式
  97. .time-scale-controls {
  98. .scale-btn.active {
  99. background: #10b981;
  100. border-color: #10b981;
  101. font-weight: 600;
  102. }
  103. }
  104. // 🆕 刷新按钮特殊样式
  105. .refresh-btn {
  106. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  107. color: #ffffff;
  108. border: none;
  109. font-weight: 600;
  110. &:hover {
  111. background: linear-gradient(135deg, #5568d3 0%, #63408b 100%);
  112. transform: scale(1.05);
  113. }
  114. &:active {
  115. animation: refresh-spin 0.6s ease-in-out;
  116. }
  117. }
  118. @keyframes refresh-spin {
  119. from {
  120. transform: rotate(0deg);
  121. }
  122. to {
  123. transform: rotate(360deg);
  124. }
  125. }
  126. // 设计师统计面板
  127. .designer-stats-panel {
  128. margin-top: 12px;
  129. padding: 12px 16px;
  130. background: #ffffff;
  131. border: 1px solid #e5e7eb;
  132. border-radius: 6px;
  133. }
  134. .stats-header {
  135. display: flex;
  136. align-items: center;
  137. justify-content: space-between;
  138. margin-bottom: 12px;
  139. h3 {
  140. margin: 0;
  141. font-size: 16px;
  142. font-weight: 600;
  143. color: #111827;
  144. }
  145. }
  146. .workload-badge {
  147. padding: 4px 12px;
  148. border-radius: 12px;
  149. font-size: 13px;
  150. font-weight: 500;
  151. &.level-low {
  152. background: #d1fae5;
  153. color: #065f46;
  154. }
  155. &.level-medium {
  156. background: #fef3c7;
  157. color: #92400e;
  158. }
  159. &.level-high {
  160. background: #fee2e2;
  161. color: #991b1b;
  162. }
  163. }
  164. .stats-body {
  165. display: grid;
  166. grid-template-columns: repeat(3, 1fr);
  167. gap: 12px;
  168. }
  169. .stat-item {
  170. display: flex;
  171. flex-direction: column;
  172. padding: 8px;
  173. background: #f9fafb;
  174. border-radius: 4px;
  175. }
  176. .stat-label {
  177. font-size: 12px;
  178. color: #6b7280;
  179. margin-bottom: 4px;
  180. }
  181. .stat-value {
  182. font-size: 18px;
  183. font-weight: 600;
  184. color: #111827;
  185. &.urgent {
  186. color: #ea580c;
  187. }
  188. &.overdue {
  189. color: #dc2626;
  190. }
  191. }
  192. // 时间轴主体
  193. .timeline-body {
  194. flex: 1;
  195. overflow-y: auto;
  196. padding: 16px;
  197. }
  198. // 列表视图
  199. .projects-list {
  200. display: flex;
  201. flex-direction: column;
  202. gap: 12px;
  203. }
  204. .project-item {
  205. position: relative;
  206. display: flex;
  207. padding: 16px;
  208. background: #ffffff;
  209. border: 1px solid #e5e7eb;
  210. border-radius: 8px;
  211. cursor: pointer;
  212. transition: all 0.2s;
  213. &:hover {
  214. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
  215. transform: translateY(-2px);
  216. }
  217. &.status-overdue {
  218. border-left-width: 4px;
  219. border-left-color: #dc2626;
  220. }
  221. &.status-urgent {
  222. border-left-width: 4px;
  223. border-left-color: #ea580c;
  224. }
  225. &.status-warning {
  226. border-left-width: 4px;
  227. border-left-color: #f59e0b;
  228. }
  229. }
  230. .priority-bar {
  231. position: absolute;
  232. left: 0;
  233. top: 0;
  234. bottom: 0;
  235. width: 4px;
  236. border-radius: 8px 0 0 8px;
  237. &.priority-critical {
  238. background: linear-gradient(180deg, #dc2626 0%, #991b1b 100%);
  239. }
  240. &.priority-high {
  241. background: linear-gradient(180deg, #ea580c 0%, #c2410c 100%);
  242. }
  243. &.priority-medium {
  244. background: linear-gradient(180deg, #f59e0b 0%, #d97706 100%);
  245. }
  246. &.priority-low {
  247. background: linear-gradient(180deg, #10b981 0%, #059669 100%);
  248. }
  249. }
  250. .project-content {
  251. flex: 1;
  252. padding-left: 8px;
  253. }
  254. .project-header {
  255. display: flex;
  256. align-items: center;
  257. justify-content: space-between;
  258. margin-bottom: 12px;
  259. }
  260. .project-name {
  261. margin: 0;
  262. font-size: 16px;
  263. font-weight: 600;
  264. color: #111827;
  265. }
  266. .project-badges {
  267. display: flex;
  268. gap: 8px;
  269. }
  270. .badge {
  271. padding: 4px 8px;
  272. border-radius: 4px;
  273. font-size: 12px;
  274. font-weight: 500;
  275. white-space: nowrap;
  276. &.badge-stalled {
  277. background: #f3f4f6;
  278. color: #6b7280;
  279. }
  280. &.badge-urgent {
  281. background: #fee2e2;
  282. color: #991b1b;
  283. }
  284. &.badge-overdue {
  285. background: #fecaca;
  286. color: #7f1d1d;
  287. }
  288. &.badge-warning {
  289. background: #fed7aa;
  290. color: #9a3412;
  291. }
  292. }
  293. .project-meta {
  294. display: flex;
  295. gap: 16px;
  296. flex-wrap: wrap;
  297. }
  298. .meta-item {
  299. display: flex;
  300. gap: 4px;
  301. font-size: 13px;
  302. }
  303. .meta-label {
  304. color: #6b7280;
  305. }
  306. .meta-value {
  307. color: #374151;
  308. font-weight: 500;
  309. &.text-danger {
  310. color: #dc2626;
  311. }
  312. }
  313. // 空状态
  314. .empty-state {
  315. display: flex;
  316. align-items: center;
  317. justify-content: center;
  318. padding: 60px 20px;
  319. text-align: center;
  320. p {
  321. margin: 0;
  322. font-size: 15px;
  323. color: #9ca3af;
  324. }
  325. }
  326. // 时间轴视图容器
  327. .timeline-view-container {
  328. position: relative;
  329. width: 100%;
  330. min-height: 400px;
  331. }
  332. // 图例说明
  333. .timeline-legend {
  334. display: flex;
  335. justify-content: center;
  336. align-items: center;
  337. gap: 24px;
  338. padding: 12px 20px;
  339. background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
  340. border-radius: 8px 8px 0 0;
  341. box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  342. }
  343. .legend-item {
  344. display: flex;
  345. align-items: center;
  346. gap: 8px;
  347. }
  348. .legend-icon {
  349. display: flex;
  350. align-items: center;
  351. justify-content: center;
  352. width: 24px;
  353. height: 24px;
  354. border-radius: 50%;
  355. font-size: 16px;
  356. color: #ffffff;
  357. box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
  358. &.start-icon {
  359. background: #10b981;
  360. }
  361. &.review-icon {
  362. background: #3b82f6;
  363. }
  364. &.delivery-icon {
  365. background: #f59e0b;
  366. border-radius: 4px;
  367. transform: rotate(45deg);
  368. }
  369. }
  370. .legend-bar-demo {
  371. width: 40px;
  372. height: 12px;
  373. border-radius: 4px;
  374. box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  375. }
  376. // 🆕 四种紧急度颜色图例
  377. .legend-bar-green {
  378. background: linear-gradient(135deg, #86EFAC 0%, #4ADE80 100%);
  379. }
  380. .legend-bar-yellow {
  381. background: linear-gradient(135deg, #FEF08A 0%, #EAB308 100%);
  382. }
  383. .legend-bar-orange {
  384. background: linear-gradient(135deg, #FCD34D 0%, #F59E0B 100%);
  385. }
  386. .legend-bar-red {
  387. background: linear-gradient(135deg, #FCA5A5 0%, #EF4444 100%);
  388. }
  389. .legend-label {
  390. font-size: 13px;
  391. font-weight: 500;
  392. color: #ffffff;
  393. text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
  394. }
  395. // 🆕 图例注释样式
  396. .legend-note {
  397. margin-left: auto;
  398. padding-left: 16px;
  399. border-left: 1px solid rgba(255, 255, 255, 0.3);
  400. .legend-label {
  401. font-size: 12px;
  402. font-weight: 600;
  403. color: #fef3c7;
  404. opacity: 0.95;
  405. }
  406. }
  407. // 时间刻度尺
  408. .timeline-ruler {
  409. display: flex;
  410. position: sticky;
  411. top: 0;
  412. z-index: 10;
  413. background: #ffffff;
  414. border-bottom: 2px solid #e5e7eb;
  415. padding: 8px 0;
  416. }
  417. .ruler-header {
  418. width: 180px;
  419. min-width: 180px;
  420. padding: 12px 12px;
  421. font-weight: 600;
  422. font-size: 14px;
  423. color: #111827;
  424. border-right: 2px solid #e5e7eb;
  425. background: #f9fafb;
  426. }
  427. .ruler-ticks {
  428. flex: 1;
  429. display: flex;
  430. position: relative;
  431. }
  432. .ruler-tick {
  433. flex: 1;
  434. text-align: center;
  435. border-right: 1px solid #e5e7eb;
  436. padding: 8px 4px;
  437. display: flex;
  438. flex-direction: column;
  439. gap: 2px;
  440. &:last-child {
  441. border-right: none;
  442. }
  443. &.first {
  444. border-left: 2px solid #3b82f6;
  445. }
  446. }
  447. .tick-date {
  448. font-size: 14px;
  449. color: #111827;
  450. font-weight: 600;
  451. line-height: 1.2;
  452. }
  453. .tick-weekday {
  454. font-size: 11px;
  455. color: #6b7280;
  456. font-weight: 500;
  457. line-height: 1.2;
  458. }
  459. // 🆕 今日标记线(实时移动,精确到分钟)- 重构版
  460. .today-line {
  461. position: absolute;
  462. top: 0;
  463. bottom: 0;
  464. z-index: 10;
  465. pointer-events: none;
  466. left: 0; // 通过 [style.left] 动态设置
  467. }
  468. // 🆕 今日时间标签(顶部显示完整时间)
  469. .today-label {
  470. position: absolute;
  471. top: -40px;
  472. left: 50%;
  473. transform: translateX(-50%);
  474. padding: 8px 16px;
  475. background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
  476. color: #ffffff;
  477. font-size: 13px;
  478. font-weight: 700;
  479. border-radius: 8px;
  480. white-space: nowrap;
  481. box-shadow: 0 4px 16px rgba(239, 68, 68, 0.5);
  482. letter-spacing: 0.5px;
  483. animation: today-label-pulse 2s ease-in-out infinite;
  484. // 小三角箭头
  485. &::after {
  486. content: '';
  487. position: absolute;
  488. top: 100%;
  489. left: 50%;
  490. transform: translateX(-50%);
  491. width: 0;
  492. height: 0;
  493. border-left: 6px solid transparent;
  494. border-right: 6px solid transparent;
  495. border-top: 6px solid #dc2626;
  496. }
  497. }
  498. // 🆕 顶部圆点指示器(更大更明显)
  499. .today-dot {
  500. position: absolute;
  501. top: -4px;
  502. left: 50%;
  503. transform: translateX(-50%);
  504. width: 16px;
  505. height: 16px;
  506. background: #ef4444;
  507. border-radius: 50%;
  508. border: 3px solid #ffffff;
  509. box-shadow: 0 0 0 2px #ef4444, 0 4px 12px rgba(239, 68, 68, 0.6);
  510. animation: today-dot-pulse 1.5s ease-in-out infinite;
  511. }
  512. // 🆕 主竖线条(更宽更明显)
  513. .today-bar {
  514. position: absolute;
  515. top: 0;
  516. bottom: 0;
  517. left: 50%;
  518. transform: translateX(-50%);
  519. width: 4px;
  520. background: linear-gradient(180deg,
  521. rgba(239, 68, 68, 0.95) 0%,
  522. rgba(239, 68, 68, 0.85) 50%,
  523. rgba(239, 68, 68, 0.95) 100%
  524. );
  525. box-shadow:
  526. 0 0 8px rgba(239, 68, 68, 0.6),
  527. 0 0 16px rgba(239, 68, 68, 0.4);
  528. animation: today-bar-pulse 2s ease-in-out infinite;
  529. }
  530. // 🆕 时间标签脉动动画
  531. @keyframes today-label-pulse {
  532. 0%, 100% {
  533. transform: translateX(-50%) scale(1);
  534. box-shadow: 0 4px 16px rgba(239, 68, 68, 0.5);
  535. }
  536. 50% {
  537. transform: translateX(-50%) scale(1.05);
  538. box-shadow: 0 6px 24px rgba(239, 68, 68, 0.7);
  539. }
  540. }
  541. // 🆕 圆点脉动动画(更明显)
  542. @keyframes today-dot-pulse {
  543. 0%, 100% {
  544. transform: translateX(-50%) scale(1);
  545. box-shadow: 0 0 0 2px #ef4444, 0 4px 12px rgba(239, 68, 68, 0.6);
  546. }
  547. 50% {
  548. transform: translateX(-50%) scale(1.4);
  549. box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.5), 0 6px 20px rgba(239, 68, 68, 0.8);
  550. }
  551. }
  552. // 🆕 竖线脉动动画
  553. @keyframes today-bar-pulse {
  554. 0%, 100% {
  555. opacity: 1;
  556. box-shadow:
  557. 0 0 8px rgba(239, 68, 68, 0.6),
  558. 0 0 16px rgba(239, 68, 68, 0.4);
  559. }
  560. 50% {
  561. opacity: 0.9;
  562. box-shadow:
  563. 0 0 12px rgba(239, 68, 68, 0.8),
  564. 0 0 24px rgba(239, 68, 68, 0.6);
  565. }
  566. }
  567. // 项目时间轴
  568. .timeline-projects {
  569. position: relative;
  570. min-height: 300px;
  571. }
  572. .timeline-row {
  573. display: flex;
  574. border-bottom: 1px solid #f3f4f6;
  575. cursor: pointer;
  576. transition: background 0.2s;
  577. &:hover {
  578. background: #f9fafb;
  579. .project-bar {
  580. transform: scaleY(1.1);
  581. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
  582. }
  583. .event-marker {
  584. transform: scale(1.3);
  585. }
  586. }
  587. }
  588. // 项目标签区
  589. .project-label {
  590. width: 180px;
  591. min-width: 180px;
  592. padding: 12px 12px;
  593. display: flex;
  594. flex-direction: column;
  595. gap: 4px;
  596. border-right: 2px solid #e5e7eb;
  597. background: #fafafa;
  598. }
  599. .project-name-label {
  600. font-size: 14px;
  601. font-weight: 500;
  602. color: #111827;
  603. white-space: nowrap;
  604. overflow: hidden;
  605. text-overflow: ellipsis;
  606. }
  607. .designer-label {
  608. font-size: 12px;
  609. color: #6b7280;
  610. }
  611. .priority-badge {
  612. font-size: 16px;
  613. line-height: 1;
  614. }
  615. // 时间轴轨道
  616. .timeline-track {
  617. flex: 1;
  618. position: relative;
  619. height: 70px;
  620. padding: 19px 0;
  621. background: repeating-linear-gradient(
  622. 90deg,
  623. transparent,
  624. transparent calc(100% / 7 - 1px),
  625. #f3f4f6 calc(100% / 7 - 1px),
  626. #f3f4f6 calc(100% / 7)
  627. );
  628. }
  629. // 项目条形图
  630. .project-bar {
  631. position: absolute;
  632. top: 50%;
  633. transform: translateY(-50%);
  634. height: 32px;
  635. border-radius: 6px;
  636. transition: all 0.3s;
  637. overflow: hidden;
  638. box-shadow: 0 3px 8px rgba(0, 0, 0, 0.12);
  639. border: 2px solid rgba(255, 255, 255, 0.5);
  640. opacity: 0.95;
  641. &.status-overdue {
  642. border: 3px solid #dc2626;
  643. animation: pulse 2s infinite;
  644. box-shadow: 0 0 15px rgba(220, 38, 38, 0.4);
  645. }
  646. &:hover {
  647. opacity: 1;
  648. }
  649. }
  650. // 进度填充
  651. .progress-fill {
  652. position: absolute;
  653. top: 0;
  654. left: 0;
  655. bottom: 0;
  656. background: linear-gradient(90deg,
  657. rgba(0, 0, 0, 0.25) 0%,
  658. rgba(0, 0, 0, 0.15) 100%
  659. );
  660. transition: width 0.3s;
  661. border-right: 2px solid rgba(255, 255, 255, 0.6);
  662. }
  663. // 事件标记
  664. .event-marker {
  665. position: absolute;
  666. top: 50%;
  667. transform: translateY(-50%);
  668. width: 28px;
  669. height: 28px;
  670. display: flex;
  671. align-items: center;
  672. justify-content: center;
  673. font-size: 20px;
  674. color: #ffffff;
  675. border-radius: 50%;
  676. cursor: pointer;
  677. transition: all 0.2s;
  678. z-index: 10;
  679. box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
  680. border: 2px solid rgba(255, 255, 255, 0.9);
  681. &.start {
  682. font-size: 16px;
  683. width: 24px;
  684. height: 24px;
  685. }
  686. &.review {
  687. font-size: 18px;
  688. width: 26px;
  689. height: 26px;
  690. border-radius: 50%;
  691. }
  692. &.delivery {
  693. font-size: 22px;
  694. width: 30px;
  695. height: 30px;
  696. border-radius: 4px;
  697. transform: translateY(-50%) rotate(45deg);
  698. &:hover {
  699. transform: translateY(-50%) rotate(45deg) scale(1.3);
  700. }
  701. }
  702. &.blink {
  703. animation: blink 1s infinite;
  704. }
  705. &:hover {
  706. transform: translateY(-50%) scale(1.4);
  707. z-index: 20;
  708. box-shadow: 0 4px 15px rgba(0, 0, 0, 0.4);
  709. }
  710. }
  711. // 动画
  712. @keyframes pulse {
  713. 0%, 100% {
  714. opacity: 1;
  715. }
  716. 50% {
  717. opacity: 0.7;
  718. }
  719. }
  720. @keyframes blink {
  721. 0%, 100% {
  722. opacity: 1;
  723. }
  724. 50% {
  725. opacity: 0.3;
  726. }
  727. }
  728. // 响应式设计
  729. @media (max-width: 768px) {
  730. .filter-section {
  731. flex-direction: column;
  732. align-items: stretch;
  733. }
  734. .filter-group {
  735. width: 100%;
  736. &.quick-filters {
  737. margin-left: 0;
  738. }
  739. &.view-controls,
  740. &.sort-controls {
  741. border-left: none;
  742. border-top: 1px solid #e5e7eb;
  743. padding-left: 0;
  744. padding-top: 12px;
  745. }
  746. }
  747. .stats-body {
  748. grid-template-columns: 1fr;
  749. }
  750. .project-header {
  751. flex-direction: column;
  752. align-items: flex-start;
  753. gap: 8px;
  754. }
  755. .project-meta {
  756. flex-direction: column;
  757. gap: 8px;
  758. }
  759. // 时间轴视图响应式
  760. .timeline-legend {
  761. flex-wrap: wrap;
  762. gap: 12px;
  763. padding: 8px 12px;
  764. }
  765. .legend-item {
  766. gap: 6px;
  767. }
  768. .legend-label {
  769. font-size: 11px;
  770. }
  771. .ruler-header,
  772. .project-label {
  773. width: 100px;
  774. min-width: 100px;
  775. padding: 8px;
  776. }
  777. .project-name-label {
  778. font-size: 11px;
  779. }
  780. .designer-label {
  781. font-size: 10px;
  782. }
  783. .tick-date {
  784. font-size: 11px;
  785. }
  786. .tick-weekday {
  787. font-size: 9px;
  788. }
  789. .timeline-track {
  790. height: 50px;
  791. padding: 14px 0;
  792. }
  793. .project-bar {
  794. height: 22px;
  795. }
  796. .event-marker {
  797. width: 20px;
  798. height: 20px;
  799. font-size: 14px;
  800. &.start {
  801. width: 18px;
  802. height: 18px;
  803. font-size: 12px;
  804. }
  805. &.review {
  806. width: 19px;
  807. height: 19px;
  808. font-size: 13px;
  809. }
  810. &.delivery {
  811. width: 22px;
  812. height: 22px;
  813. font-size: 16px;
  814. }
  815. }
  816. }