style.css 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  1. :root {
  2. --bg-base: #0f172a;
  3. --bg-glass: rgba(30, 41, 59, 0.7);
  4. --border-glass: rgba(255, 255, 255, 0.1);
  5. --text-main: #f8fafc;
  6. --text-muted: #94a3b8;
  7. --accent-primary: #3b82f6;
  8. --accent-hover: #2563eb;
  9. --success: #10b981;
  10. --warning: #f59e0b;
  11. --danger: #ef4444;
  12. --card-hover: rgba(59, 130, 246, 0.15);
  13. --shadow-glass: 0 4px 30px rgba(0, 0, 0, 0.3);
  14. --radius-lg: 16px;
  15. --radius-md: 8px;
  16. --radius-sm: 4px;
  17. }
  18. * {
  19. box-sizing: border-box;
  20. margin: 0;
  21. padding: 0;
  22. }
  23. body {
  24. font-family: 'Inter', sans-serif;
  25. background: var(--bg-base);
  26. background-image:
  27. radial-gradient(at 0% 0%, rgba(59, 130, 246, 0.15) 0px, transparent 50%),
  28. radial-gradient(at 100% 100%, rgba(139, 92, 246, 0.15) 0px, transparent 50%);
  29. background-attachment: fixed;
  30. color: var(--text-main);
  31. height: 100vh;
  32. overflow: hidden;
  33. }
  34. /* Glassmorphism Utilities */
  35. .glass-panel {
  36. background: var(--bg-glass);
  37. backdrop-filter: blur(16px);
  38. -webkit-backdrop-filter: blur(16px);
  39. border: 1px solid var(--border-glass);
  40. box-shadow: var(--shadow-glass);
  41. }
  42. /* Layout */
  43. .app-container {
  44. display: flex;
  45. height: 100vh;
  46. padding: 1rem;
  47. gap: 1rem;
  48. }
  49. /* Sidebar */
  50. .sidebar {
  51. width: 350px;
  52. border-radius: var(--radius-lg);
  53. display: flex;
  54. flex-direction: column;
  55. overflow: hidden;
  56. }
  57. .sidebar-header {
  58. padding: 1.5rem;
  59. border-bottom: 1px solid var(--border-glass);
  60. }
  61. .sidebar-header h2 {
  62. font-size: 1.25rem;
  63. font-weight: 600;
  64. margin-bottom: 0.5rem;
  65. background: linear-gradient(to right, #60a5fa, #a78bfa);
  66. -webkit-background-clip: text;
  67. -webkit-text-fill-color: transparent;
  68. }
  69. .stats {
  70. font-size: 0.85rem;
  71. color: var(--text-muted);
  72. display: flex;
  73. gap: 1rem;
  74. }
  75. .search-box {
  76. padding: 1rem;
  77. border-bottom: 1px solid var(--border-glass);
  78. }
  79. .search-box input {
  80. width: 100%;
  81. padding: 0.75rem 1rem;
  82. border-radius: var(--radius-md);
  83. background: rgba(0,0,0,0.2);
  84. border: 1px solid var(--border-glass);
  85. color: var(--text-main);
  86. font-family: inherit;
  87. transition: all 0.2s ease;
  88. }
  89. .search-box input:focus {
  90. outline: none;
  91. border-color: var(--accent-primary);
  92. box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
  93. }
  94. .task-list {
  95. flex: 1;
  96. overflow-y: auto;
  97. padding: 0.5rem;
  98. }
  99. /* Scrollbar */
  100. ::-webkit-scrollbar {
  101. width: 6px;
  102. height: 6px;
  103. }
  104. ::-webkit-scrollbar-track {
  105. background: transparent;
  106. }
  107. ::-webkit-scrollbar-thumb {
  108. background: var(--border-glass);
  109. border-radius: 10px;
  110. }
  111. ::-webkit-scrollbar-thumb:hover {
  112. background: var(--text-muted);
  113. }
  114. /* Task Item */
  115. .task-item {
  116. padding: 1rem;
  117. border-radius: var(--radius-md);
  118. margin-bottom: 0.5rem;
  119. cursor: pointer;
  120. transition: all 0.2s ease;
  121. border: 1px solid transparent;
  122. }
  123. .task-item:hover {
  124. background: var(--card-hover);
  125. border-color: var(--border-glass);
  126. transform: translateY(-1px);
  127. }
  128. .task-item.active {
  129. background: var(--card-hover);
  130. border-color: var(--accent-primary);
  131. }
  132. .task-id {
  133. font-size: 0.75rem;
  134. color: var(--accent-primary);
  135. font-weight: 600;
  136. margin-bottom: 0.25rem;
  137. }
  138. .task-req {
  139. font-size: 0.9rem;
  140. line-height: 1.4;
  141. display: -webkit-box;
  142. -webkit-line-clamp: 2;
  143. -webkit-box-orient: vertical;
  144. overflow: hidden;
  145. margin-bottom: 0.5rem;
  146. }
  147. .task-tags {
  148. display: flex;
  149. gap: 0.25rem;
  150. flex-wrap: wrap;
  151. }
  152. .tag {
  153. font-size: 0.7rem;
  154. padding: 0.2rem 0.4rem;
  155. border-radius: 4px;
  156. background: rgba(255,255,255,0.1);
  157. }
  158. .tag.success { background: rgba(16, 185, 129, 0.2); color: #34d399; }
  159. .tag.warning { background: rgba(245, 158, 11, 0.2); color: #fbbf24; }
  160. .tag.danger { background: rgba(239, 68, 68, 0.2); color: #f87171; }
  161. .tag.running {
  162. background: rgba(59, 130, 246, 0.2);
  163. color: #60a5fa;
  164. animation: pulse 2s infinite;
  165. }
  166. @keyframes pulse {
  167. 0% { opacity: 0.6; }
  168. 50% { opacity: 1; }
  169. 100% { opacity: 0.6; }
  170. }
  171. /* Main Content */
  172. .main-content {
  173. flex: 1;
  174. border-radius: var(--radius-lg);
  175. display: flex;
  176. flex-direction: column;
  177. overflow: hidden;
  178. position: relative;
  179. }
  180. .empty-state {
  181. position: absolute;
  182. top: 0; left: 0; right: 0; bottom: 0;
  183. display: flex;
  184. flex-direction: column;
  185. align-items: center;
  186. justify-content: center;
  187. text-align: center;
  188. color: var(--text-muted);
  189. }
  190. .empty-state .icon {
  191. font-size: 4rem;
  192. margin-bottom: 1rem;
  193. opacity: 0.5;
  194. }
  195. .hidden {
  196. display: none !important;
  197. }
  198. .detail-view {
  199. display: flex;
  200. flex-direction: column;
  201. height: 100%;
  202. }
  203. .detail-header {
  204. padding: 1.5rem;
  205. border-bottom: 1px solid var(--border-glass);
  206. display: flex;
  207. justify-content: space-between;
  208. align-items: flex-start;
  209. gap: 1rem;
  210. }
  211. .title-section h1 {
  212. font-size: 1.25rem;
  213. font-weight: 500;
  214. line-height: 1.4;
  215. margin-top: 0.5rem;
  216. }
  217. .badge {
  218. background: var(--accent-primary);
  219. color: white;
  220. padding: 0.25rem 0.5rem;
  221. border-radius: var(--radius-sm);
  222. font-size: 0.75rem;
  223. font-weight: 600;
  224. }
  225. .btn {
  226. padding: 0.6rem 1.2rem;
  227. border-radius: var(--radius-md);
  228. border: none;
  229. font-weight: 500;
  230. cursor: pointer;
  231. font-family: inherit;
  232. transition: all 0.2s ease;
  233. display: inline-flex;
  234. align-items: center;
  235. justify-content: center;
  236. }
  237. .btn-primary {
  238. background: linear-gradient(135deg, var(--accent-primary), #8b5cf6);
  239. color: white;
  240. box-shadow: 0 4px 15px rgba(59, 130, 246, 0.3);
  241. }
  242. .btn-primary:hover {
  243. transform: translateY(-2px);
  244. box-shadow: 0 6px 20px rgba(59, 130, 246, 0.4);
  245. }
  246. .btn-secondary {
  247. background: rgba(255,255,255,0.1);
  248. color: var(--text-main);
  249. }
  250. .btn-secondary:hover {
  251. background: rgba(255,255,255,0.2);
  252. }
  253. .btn-small {
  254. padding: 0.4rem 0.8rem;
  255. font-size: 0.8rem;
  256. }
  257. /* Status Banner */
  258. .status-banner {
  259. padding: 0.75rem 1.5rem;
  260. background: rgba(59, 130, 246, 0.1);
  261. border-bottom: 1px solid var(--border-glass);
  262. display: flex;
  263. align-items: center;
  264. gap: 1rem;
  265. }
  266. .status-indicator {
  267. width: 10px; height: 10px;
  268. border-radius: 50%;
  269. background: var(--accent-primary);
  270. box-shadow: 0 0 10px var(--accent-primary);
  271. animation: pulse 1.5s infinite;
  272. }
  273. /* Tabs */
  274. .data-tabs {
  275. display: flex;
  276. padding: 0 1.5rem;
  277. border-bottom: 1px solid var(--border-glass);
  278. background: rgba(0,0,0,0.1);
  279. }
  280. .tab-btn {
  281. padding: 1rem 1.5rem;
  282. background: transparent;
  283. border: none;
  284. color: var(--text-muted);
  285. cursor: pointer;
  286. font-family: inherit;
  287. font-weight: 500;
  288. border-bottom: 2px solid transparent;
  289. transition: all 0.2s ease;
  290. }
  291. .tab-btn:hover {
  292. color: var(--text-main);
  293. }
  294. .tab-btn.active {
  295. color: var(--accent-primary);
  296. border-bottom-color: var(--accent-primary);
  297. }
  298. .tab-content-container {
  299. flex: 1;
  300. overflow: auto;
  301. padding: 1.5rem;
  302. background: rgba(0,0,0,0.2);
  303. }
  304. .tab-content {
  305. display: none;
  306. }
  307. .tab-content.active {
  308. display: block;
  309. }
  310. .json-viewer {
  311. font-family: 'Consolas', 'Monaco', monospace;
  312. font-size: 0.85rem;
  313. line-height: 1.5;
  314. color: #e2e8f0;
  315. white-space: pre-wrap;
  316. word-break: break-all;
  317. }
  318. /* Modals */
  319. .modal-overlay {
  320. position: fixed;
  321. top: 0; left: 0; right: 0; bottom: 0;
  322. background: rgba(0,0,0,0.6);
  323. backdrop-filter: blur(4px);
  324. display: flex;
  325. align-items: center;
  326. justify-content: center;
  327. z-index: 100;
  328. opacity: 1;
  329. transition: opacity 0.2s ease;
  330. }
  331. .modal-overlay.hidden {
  332. opacity: 0;
  333. pointer-events: none;
  334. }
  335. .modal {
  336. width: 100%;
  337. max-width: 500px;
  338. border-radius: var(--radius-lg);
  339. overflow: hidden;
  340. transform: translateY(0);
  341. transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  342. }
  343. .modal.large {
  344. max-width: 800px;
  345. height: 80vh;
  346. display: flex;
  347. flex-direction: column;
  348. }
  349. .modal-overlay.hidden .modal {
  350. transform: translateY(20px);
  351. }
  352. .modal-header {
  353. padding: 1.5rem;
  354. border-bottom: 1px solid var(--border-glass);
  355. display: flex;
  356. justify-content: space-between;
  357. align-items: center;
  358. }
  359. .close-btn {
  360. background: transparent;
  361. border: none;
  362. color: var(--text-muted);
  363. font-size: 1.5rem;
  364. cursor: pointer;
  365. line-height: 1;
  366. }
  367. .close-btn:hover { color: white; }
  368. .modal-body {
  369. padding: 1.5rem;
  370. }
  371. .modal.large .modal-body {
  372. flex: 1;
  373. overflow: auto;
  374. padding: 0;
  375. }
  376. .form-group {
  377. margin-bottom: 1.2rem;
  378. }
  379. .form-group label {
  380. display: block;
  381. margin-bottom: 0.5rem;
  382. font-size: 0.9rem;
  383. color: var(--text-muted);
  384. }
  385. .form-group.checkbox {
  386. display: flex;
  387. align-items: center;
  388. gap: 0.5rem;
  389. }
  390. .form-group.checkbox label {
  391. margin: 0;
  392. cursor: pointer;
  393. }
  394. .glass-input {
  395. width: 100%;
  396. padding: 0.8rem;
  397. background: rgba(0,0,0,0.2);
  398. border: 1px solid var(--border-glass);
  399. border-radius: var(--radius-md);
  400. color: white;
  401. font-family: inherit;
  402. }
  403. .modal-footer {
  404. padding: 1.2rem 1.5rem;
  405. border-top: 1px solid var(--border-glass);
  406. display: flex;
  407. justify-content: flex-end;
  408. gap: 1rem;
  409. background: rgba(0,0,0,0.2);
  410. }
  411. /* Terminal */
  412. .terminal {
  413. background: #000;
  414. color: #0f0;
  415. font-family: 'Consolas', monospace;
  416. padding: 1rem;
  417. height: 100%;
  418. overflow-y: auto;
  419. font-size: 0.85rem;
  420. line-height: 1.4;
  421. margin: 0;
  422. }
  423. /* JSON Viewer */
  424. .json-object, .json-array { margin-left: 1rem; border-left: 1px solid rgba(255,255,255,0.1); padding-left: 0.5rem; }
  425. .json-key { color: #a78bfa; font-weight: 500; }
  426. .json-string { color: #34d399; }
  427. .json-number { color: #fbbf24; }
  428. .json-boolean { color: #f472b6; }
  429. .json-null { color: #94a3b8; font-style: italic; }
  430. .json-prop { margin-bottom: 0.25rem; }
  431. /* Sub Tabs for Raw Cases */
  432. .sub-tabs { display: flex; gap: 0.5rem; margin-bottom: 1rem; border-bottom: 1px solid var(--border-glass); padding-bottom: 0.5rem; }
  433. .sub-tab-btn { background: rgba(255,255,255,0.1); border: none; color: var(--text-main); padding: 0.4rem 1rem; border-radius: var(--radius-sm); cursor: pointer; transition: all 0.2s; font-weight: 600; font-size: 0.8rem; }
  434. .sub-tab-btn:hover { background: rgba(255,255,255,0.2); }
  435. .sub-tab-btn.active { background: var(--accent-primary); box-shadow: 0 0 10px rgba(59,130,246,0.3); }
  436. /* Data Cards and Rendered UI */
  437. .data-card {
  438. background: rgba(255, 255, 255, 0.03);
  439. border: 1px solid var(--border-glass);
  440. border-radius: var(--radius-md);
  441. padding: 1.2rem;
  442. margin-bottom: 1rem;
  443. transition: transform 0.2s;
  444. }
  445. .data-card:hover {
  446. background: rgba(255, 255, 255, 0.05);
  447. border-color: rgba(255, 255, 255, 0.2);
  448. }
  449. .card-header {
  450. display: flex;
  451. justify-content: space-between;
  452. align-items: flex-start;
  453. margin-bottom: 0.8rem;
  454. gap: 1rem;
  455. }
  456. .card-title {
  457. font-size: 1.1rem;
  458. font-weight: 600;
  459. color: var(--text-main);
  460. line-height: 1.4;
  461. }
  462. .badge-emoji {
  463. display: inline-flex;
  464. align-items: center;
  465. gap: 0.3rem;
  466. padding: 0.3rem 0.6rem;
  467. border-radius: 20px;
  468. background: rgba(255, 255, 255, 0.1);
  469. font-size: 0.8rem;
  470. color: var(--text-muted);
  471. border: 1px solid var(--border-glass);
  472. white-space: nowrap;
  473. }
  474. .badge-emoji.success { background: rgba(16, 185, 129, 0.15); color: #34d399; border-color: rgba(16, 185, 129, 0.3); }
  475. .badge-emoji.warning { background: rgba(245, 158, 11, 0.15); color: #fbbf24; border-color: rgba(245, 158, 11, 0.3); }
  476. .badge-emoji.primary { background: rgba(59, 130, 246, 0.15); color: #60a5fa; border-color: rgba(59, 130, 246, 0.3); }
  477. .card-body {
  478. font-size: 0.9rem;
  479. color: var(--text-muted);
  480. line-height: 1.6;
  481. }
  482. .card-section {
  483. margin-top: 1rem;
  484. padding-top: 0.8rem;
  485. border-top: 1px dashed var(--border-glass);
  486. }
  487. .section-title {
  488. font-size: 0.85rem;
  489. text-transform: uppercase;
  490. letter-spacing: 0.5px;
  491. color: #a78bfa;
  492. margin-bottom: 0.5rem;
  493. font-weight: 600;
  494. }
  495. /* Image Gallery */
  496. .image-gallery {
  497. display: flex;
  498. flex-wrap: wrap;
  499. gap: 0.8rem;
  500. margin-top: 0.8rem;
  501. }
  502. .image-item {
  503. position: relative;
  504. border-radius: var(--radius-sm);
  505. overflow: hidden;
  506. border: 1px solid var(--border-glass);
  507. background: #000;
  508. }
  509. .image-item img {
  510. max-height: 180px;
  511. max-width: 100%;
  512. object-fit: cover;
  513. display: block;
  514. transition: transform 0.3s;
  515. }
  516. .image-item img:hover {
  517. transform: scale(1.05);
  518. }
  519. .image-caption {
  520. position: absolute;
  521. bottom: 0;
  522. left: 0;
  523. right: 0;
  524. background: rgba(0, 0, 0, 0.7);
  525. color: white;
  526. font-size: 0.7rem;
  527. padding: 0.3rem 0.5rem;
  528. white-space: nowrap;
  529. overflow: hidden;
  530. text-overflow: ellipsis;
  531. }
  532. /* Phase List */
  533. .phase-list {
  534. display: flex;
  535. flex-direction: column;
  536. gap: 1rem;
  537. margin-top: 0.5rem;
  538. }
  539. .phase-item {
  540. position: relative;
  541. padding-left: 1.5rem;
  542. border-left: 2px solid var(--accent-primary);
  543. }
  544. .phase-item::before {
  545. content: '';
  546. position: absolute;
  547. left: -6px;
  548. top: 5px;
  549. width: 10px;
  550. height: 10px;
  551. border-radius: 50%;
  552. background: var(--text-main);
  553. border: 2px solid var(--accent-primary);
  554. }
  555. .phase-title {
  556. font-weight: 600;
  557. color: var(--text-main);
  558. margin-bottom: 0.3rem;
  559. }
  560. /* Score Bar */
  561. .score-container {
  562. display: flex;
  563. align-items: center;
  564. gap: 1rem;
  565. margin: 1rem 0;
  566. padding: 0.8rem;
  567. background: rgba(0, 0, 0, 0.2);
  568. border-radius: var(--radius-sm);
  569. }
  570. .score-circle {
  571. width: 50px;
  572. height: 50px;
  573. border-radius: 50%;
  574. display: flex;
  575. align-items: center;
  576. justify-content: center;
  577. font-size: 1.2rem;
  578. font-weight: 700;
  579. color: white;
  580. background: conic-gradient(var(--success) var(--score-deg, 0deg), rgba(255,255,255,0.1) 0deg);
  581. }
  582. .score-circle.medium { background: conic-gradient(var(--warning) var(--score-deg, 0deg), rgba(255,255,255,0.1) 0deg); }
  583. .score-circle.low { background: conic-gradient(var(--danger) var(--score-deg, 0deg), rgba(255,255,255,0.1) 0deg); }
  584. .score-text {
  585. flex: 1;
  586. font-size: 0.9rem;
  587. color: var(--text-muted);
  588. }
  589. .tags-container {
  590. display: flex;
  591. flex-wrap: wrap;
  592. gap: 0.4rem;
  593. margin-top: 0.5rem;
  594. }
  595. @keyframes highlight-pulse {
  596. 0% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0.7); border-color: var(--accent-primary); }
  597. 70% { box-shadow: 0 0 0 15px rgba(59, 130, 246, 0); border-color: var(--accent-primary); }
  598. 100% { box-shadow: 0 0 0 0 rgba(59, 130, 246, 0); }
  599. }
  600. .highlight-pulse {
  601. animation: highlight-pulse 2s cubic-bezier(0.165, 0.84, 0.44, 1);
  602. }
  603. .memo-container {
  604. background: rgba(0, 0, 0, 0.2);
  605. border-radius: var(--radius-sm);
  606. padding: 1rem;
  607. margin-bottom: 1.5rem;
  608. border: 1px solid rgba(255, 255, 255, 0.05);
  609. }
  610. .memo-header {
  611. display: flex;
  612. justify-content: space-between;
  613. align-items: center;
  614. margin-bottom: 0.8rem;
  615. }
  616. .memo-title {
  617. font-size: 0.95rem;
  618. font-weight: 600;
  619. color: var(--text-main);
  620. display: flex;
  621. align-items: center;
  622. gap: 0.5rem;
  623. }
  624. .memo-textarea {
  625. width: 100%;
  626. min-height: 80px;
  627. background: rgba(15, 23, 42, 0.6);
  628. border: 1px solid rgba(255, 255, 255, 0.1);
  629. border-radius: 6px;
  630. padding: 0.8rem;
  631. color: var(--text-main);
  632. font-family: inherit;
  633. font-size: 0.9rem;
  634. resize: vertical;
  635. transition: border-color 0.2s ease;
  636. }
  637. .memo-textarea:focus {
  638. outline: none;
  639. border-color: var(--accent-primary);
  640. }
  641. .save-status {
  642. font-size: 0.8rem;
  643. color: var(--text-muted);
  644. transition: opacity 0.3s;
  645. }
  646. .prompt-tab {
  647. padding: 0.6rem 1rem;
  648. border-radius: 6px;
  649. background: rgba(255,255,255,0.05);
  650. color: var(--text-muted);
  651. cursor: pointer;
  652. transition: all 0.2s;
  653. font-size: 0.9rem;
  654. text-align: left;
  655. border: 1px solid transparent;
  656. }
  657. .prompt-tab:hover {
  658. background: rgba(255,255,255,0.1);
  659. color: var(--text-main);
  660. }
  661. .prompt-tab.active {
  662. background: rgba(59, 130, 246, 0.2);
  663. color: var(--accent-primary);
  664. border-color: rgba(59, 130, 246, 0.4);
  665. font-weight: 600;
  666. }
  667. .task-memo {
  668. font-size: 0.75rem;
  669. color: var(--text-muted);
  670. background: rgba(0,0,0,0.2);
  671. padding: 4px 6px;
  672. border-radius: 4px;
  673. margin-bottom: 0.5rem;
  674. white-space: nowrap;
  675. overflow: hidden;
  676. text-overflow: ellipsis;
  677. font-style: italic;
  678. border-left: 2px solid var(--accent-primary);
  679. }