workbench.css 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
  1. * {
  2. box-sizing: border-box;
  3. }
  4. html,
  5. body {
  6. height: 100%;
  7. margin: 0;
  8. font-family: "Segoe UI", "PingFang SC", sans-serif;
  9. background:
  10. radial-gradient(circle at top left, rgba(68, 161, 124, 0.16), transparent 34%),
  11. linear-gradient(160deg, #edf5ef 0%, #dbe8df 100%);
  12. color: #163126;
  13. overflow: hidden;
  14. }
  15. .wb-shell {
  16. height: 100vh;
  17. display: grid;
  18. grid-template-rows: auto 1fr;
  19. }
  20. .wb-topbar {
  21. display: flex;
  22. align-items: center;
  23. justify-content: space-between;
  24. gap: 20px;
  25. padding: 18px 24px;
  26. background: rgba(248, 251, 247, 0.92);
  27. border-bottom: 1px solid rgba(22, 49, 38, 0.08);
  28. backdrop-filter: blur(14px);
  29. }
  30. .wb-topbar__eyebrow {
  31. font-size: 11px;
  32. font-weight: 800;
  33. letter-spacing: 0.24em;
  34. color: #6a8778;
  35. }
  36. .wb-topbar h1 {
  37. margin: 6px 0 8px;
  38. font-size: 30px;
  39. line-height: 1.1;
  40. }
  41. .wb-topbar__links {
  42. display: flex;
  43. flex-wrap: wrap;
  44. gap: 14px;
  45. }
  46. .wb-topbar__links a {
  47. color: #24523e;
  48. text-decoration: none;
  49. font-size: 13px;
  50. font-weight: 700;
  51. }
  52. .wb-topbar__status {
  53. display: flex;
  54. align-items: center;
  55. gap: 16px;
  56. }
  57. .wb-connection-bar {
  58. display: flex;
  59. flex-wrap: wrap;
  60. justify-content: flex-end;
  61. gap: 10px;
  62. }
  63. .wb-connection-pill {
  64. min-width: 112px;
  65. padding: 10px 14px;
  66. border-radius: 16px;
  67. background: rgba(235, 242, 236, 0.95);
  68. box-shadow: inset 0 0 0 1px rgba(22, 49, 38, 0.06);
  69. }
  70. .wb-connection-pill__label {
  71. display: block;
  72. margin-bottom: 4px;
  73. font-size: 11px;
  74. font-weight: 700;
  75. letter-spacing: 0.08em;
  76. color: #6f8a7d;
  77. }
  78. .wb-connection-pill__value {
  79. display: block;
  80. font-size: 13px;
  81. color: #2b4338;
  82. }
  83. .wb-connection-pill__value.is-ok {
  84. color: #0a7a3d;
  85. }
  86. .wb-connection-pill__value.is-warn {
  87. color: #9a5b10;
  88. }
  89. .wb-layout {
  90. min-height: 0;
  91. display: grid;
  92. grid-template-columns: 380px 1fr;
  93. gap: 18px;
  94. padding: 18px;
  95. }
  96. .wb-sidebar {
  97. min-height: 0;
  98. overflow-y: auto;
  99. padding-right: 4px;
  100. }
  101. .wb-stage {
  102. position: relative;
  103. min-height: 0;
  104. overflow: hidden;
  105. border-radius: 28px;
  106. box-shadow: 0 28px 60px rgba(20, 41, 31, 0.18);
  107. }
  108. .wb-bottom-strip {
  109. padding: 0 18px 18px;
  110. }
  111. .wb-card--bottom .log {
  112. max-height: 180px;
  113. }
  114. #map {
  115. width: 100%;
  116. height: 100%;
  117. }
  118. .wb-section,
  119. .wb-card {
  120. margin-bottom: 14px;
  121. border-radius: 22px;
  122. background: rgba(255, 255, 255, 0.92);
  123. border: 1px solid rgba(255, 255, 255, 0.7);
  124. box-shadow: 0 16px 40px rgba(25, 44, 34, 0.08);
  125. overflow: hidden;
  126. }
  127. .wb-section summary,
  128. .wb-card__title {
  129. list-style: none;
  130. cursor: pointer;
  131. padding: 18px 18px 16px;
  132. font-size: 14px;
  133. font-weight: 800;
  134. letter-spacing: 0.08em;
  135. color: #537062;
  136. }
  137. .wb-section summary::-webkit-details-marker {
  138. display: none;
  139. }
  140. .wb-section[open] summary {
  141. border-bottom: 1px solid rgba(22, 49, 38, 0.06);
  142. }
  143. .wb-section__body,
  144. .wb-card {
  145. padding: 0 18px 18px;
  146. }
  147. .wb-card__title {
  148. padding: 18px 18px 12px;
  149. margin: 0 -18px 6px;
  150. }
  151. .badge {
  152. display: inline-flex;
  153. align-items: center;
  154. min-height: 34px;
  155. padding: 0 14px;
  156. border-radius: 999px;
  157. font-size: 13px;
  158. font-weight: 700;
  159. }
  160. .badge--muted {
  161. background: #e5ece5;
  162. color: #4f6458;
  163. }
  164. .badge--ok {
  165. background: #d8f7e3;
  166. color: #0a7a3d;
  167. }
  168. .group__status,
  169. .hint {
  170. min-height: 18px;
  171. margin: 0 0 12px;
  172. font-size: 12px;
  173. line-height: 1.5;
  174. color: #5e786d;
  175. }
  176. .row {
  177. display: flex;
  178. gap: 10px;
  179. margin-bottom: 10px;
  180. }
  181. .btn {
  182. flex: 1;
  183. min-height: 42px;
  184. border: 0;
  185. border-radius: 14px;
  186. background: #ebf0ea;
  187. color: #193226;
  188. font-weight: 700;
  189. cursor: pointer;
  190. transition: transform 120ms ease, background 120ms ease, color 120ms ease, opacity 120ms ease;
  191. }
  192. .btn:hover {
  193. transform: translateY(-1px);
  194. }
  195. .btn--primary {
  196. background: #103f2f;
  197. color: #fff;
  198. }
  199. .btn--accent {
  200. background: #0ea5a4;
  201. color: #fff;
  202. }
  203. .btn.is-active {
  204. outline: 2px solid #ffb300;
  205. }
  206. .btn:disabled {
  207. opacity: 0.56;
  208. cursor: not-allowed;
  209. transform: none;
  210. }
  211. .field {
  212. display: flex;
  213. flex-direction: column;
  214. gap: 6px;
  215. margin-bottom: 10px;
  216. font-size: 13px;
  217. color: #557266;
  218. }
  219. .field input,
  220. .field select {
  221. min-height: 40px;
  222. border: 1px solid rgba(22, 49, 38, 0.12);
  223. border-radius: 12px;
  224. padding: 0 12px;
  225. font: inherit;
  226. background: rgba(249, 252, 249, 0.96);
  227. }
  228. .field--check {
  229. flex-direction: row;
  230. align-items: center;
  231. }
  232. .file-input-hidden {
  233. position: absolute;
  234. width: 1px;
  235. height: 1px;
  236. opacity: 0;
  237. pointer-events: none;
  238. }
  239. .stat {
  240. display: flex;
  241. justify-content: space-between;
  242. padding: 10px 0;
  243. border-bottom: 1px solid rgba(22, 49, 38, 0.06);
  244. }
  245. .stat:last-child {
  246. border-bottom: 0;
  247. }
  248. .stat span {
  249. color: #668073;
  250. font-size: 13px;
  251. }
  252. .stat strong {
  253. font-size: 14px;
  254. }
  255. .log {
  256. min-height: 180px;
  257. max-height: 300px;
  258. overflow-y: auto;
  259. padding: 12px 14px;
  260. border-radius: 16px;
  261. background: #f3f7f1;
  262. font-size: 12px;
  263. line-height: 1.6;
  264. color: #486257;
  265. white-space: pre-wrap;
  266. }
  267. .log--debug {
  268. max-height: 320px;
  269. background: #111917;
  270. color: #d6f3df;
  271. font-family: Consolas, "SFMono-Regular", monospace;
  272. }
  273. .log--floating {
  274. min-height: 340px;
  275. max-height: min(54vh, 560px);
  276. font-size: 13px;
  277. }
  278. .jump-list {
  279. display: flex;
  280. flex-wrap: wrap;
  281. gap: 8px;
  282. margin-top: 12px;
  283. }
  284. .jump-chip {
  285. min-height: 32px;
  286. padding: 0 12px;
  287. border: 0;
  288. border-radius: 999px;
  289. background: #eef6ea;
  290. color: #244132;
  291. font-size: 12px;
  292. font-weight: 700;
  293. cursor: pointer;
  294. }
  295. .jump-chip--start {
  296. background: #fff0c9;
  297. }
  298. .jump-chip--finish {
  299. background: #ffe2b8;
  300. }
  301. .floating-debug-log {
  302. position: absolute;
  303. right: 18px;
  304. bottom: 18px;
  305. z-index: 600;
  306. width: min(620px, calc(100vw - 500px));
  307. min-width: 440px;
  308. max-width: 720px;
  309. padding: 14px;
  310. border-radius: 22px;
  311. background: rgba(255, 255, 255, 0.94);
  312. border: 1px solid rgba(255, 255, 255, 0.52);
  313. box-shadow: 0 22px 60px rgba(17, 33, 26, 0.22);
  314. backdrop-filter: blur(16px);
  315. transition: width 160ms ease, min-width 160ms ease, max-width 160ms ease, transform 160ms ease, box-shadow 160ms ease;
  316. }
  317. .floating-debug-log.is-minimized {
  318. width: 236px;
  319. min-width: 236px;
  320. max-width: 236px;
  321. padding: 12px 14px;
  322. border-radius: 18px;
  323. box-shadow: 0 16px 36px rgba(17, 33, 26, 0.18);
  324. transform: translateY(4px);
  325. }
  326. .floating-debug-log.is-minimized .log--floating,
  327. .floating-debug-log.is-minimized .floating-debug-log__filter,
  328. .floating-debug-log.is-minimized .floating-debug-log__clear {
  329. display: none;
  330. }
  331. .floating-debug-log.is-minimized .floating-debug-log__header {
  332. margin-bottom: 0;
  333. }
  334. .floating-debug-log.is-minimized .floating-debug-log__actions {
  335. gap: 0;
  336. }
  337. .floating-debug-log__header {
  338. display: flex;
  339. align-items: center;
  340. justify-content: space-between;
  341. gap: 12px;
  342. margin-bottom: 10px;
  343. }
  344. .floating-debug-log__title-wrap {
  345. display: flex;
  346. flex-direction: column;
  347. gap: 4px;
  348. }
  349. .floating-debug-log__title {
  350. font-size: 14px;
  351. font-weight: 800;
  352. letter-spacing: 0.08em;
  353. color: #4a6a5e;
  354. }
  355. .floating-debug-log__meta {
  356. font-size: 12px;
  357. color: #6a8278;
  358. }
  359. .floating-debug-log__clear {
  360. min-height: 30px;
  361. padding: 0 12px;
  362. border: 0;
  363. border-radius: 999px;
  364. background: rgba(17, 33, 26, 0.1);
  365. color: #244132;
  366. font-size: 12px;
  367. font-weight: 700;
  368. cursor: pointer;
  369. }
  370. .floating-debug-log__toggle {
  371. min-height: 30px;
  372. padding: 0 12px;
  373. border: 0;
  374. border-radius: 999px;
  375. background: rgba(17, 33, 26, 0.1);
  376. color: #244132;
  377. font-size: 12px;
  378. font-weight: 700;
  379. cursor: pointer;
  380. }
  381. .floating-debug-log__actions {
  382. display: flex;
  383. align-items: center;
  384. gap: 10px;
  385. }
  386. .floating-debug-log__filter {
  387. display: flex;
  388. align-items: center;
  389. gap: 8px;
  390. font-size: 12px;
  391. color: #557266;
  392. }
  393. .floating-debug-log__filter select {
  394. min-height: 30px;
  395. border: 1px solid rgba(22, 49, 38, 0.12);
  396. border-radius: 10px;
  397. padding: 0 10px;
  398. background: rgba(249, 252, 249, 0.96);
  399. font: inherit;
  400. }
  401. .leaflet-container {
  402. background: #dfeadb;
  403. }
  404. .course-marker {
  405. display: flex;
  406. align-items: center;
  407. justify-content: center;
  408. }
  409. .course-marker__control {
  410. width: 34px;
  411. height: 34px;
  412. border-radius: 999px;
  413. border: 3px solid #cc0077;
  414. color: #cc0077;
  415. background: rgba(255, 255, 255, 0.9);
  416. font-size: 16px;
  417. font-weight: 800;
  418. line-height: 1;
  419. }
  420. .course-marker__start {
  421. width: 0;
  422. height: 0;
  423. border-left: 16px solid transparent;
  424. border-right: 16px solid transparent;
  425. border-bottom: 28px solid #cc0077;
  426. filter: drop-shadow(0 3px 10px rgba(22, 49, 38, 0.22));
  427. }
  428. .course-marker__finish {
  429. position: relative;
  430. width: 36px;
  431. height: 36px;
  432. border-radius: 999px;
  433. border: 4px solid #cc0077;
  434. background: rgba(255, 255, 255, 0.76);
  435. }
  436. .course-marker__finish::after {
  437. content: "";
  438. position: absolute;
  439. inset: 6px;
  440. border-radius: 999px;
  441. border: 3px solid #cc0077;
  442. }
  443. @media (max-width: 1380px) {
  444. .wb-layout {
  445. grid-template-columns: 340px 1fr;
  446. }
  447. .floating-debug-log {
  448. width: min(520px, calc(100vw - 440px));
  449. }
  450. }
  451. @media (max-width: 1120px) {
  452. .wb-layout {
  453. grid-template-columns: 1fr;
  454. grid-template-rows: auto minmax(420px, 1fr);
  455. }
  456. .wb-sidebar {
  457. max-height: 32vh;
  458. }
  459. .floating-debug-log {
  460. width: min(420px, calc(100vw - 48px));
  461. min-width: 0;
  462. }
  463. .wb-topbar {
  464. flex-direction: column;
  465. align-items: flex-start;
  466. }
  467. .wb-topbar__status {
  468. width: 100%;
  469. flex-direction: column;
  470. align-items: flex-start;
  471. }
  472. .wb-bottom-strip {
  473. padding-top: 18px;
  474. }
  475. }