styles.css 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. :root {
  2. --bg: #f7eef2;
  3. --panel: #fff8fb;
  4. --panel-soft: #f4e8ee;
  5. --line: #dec6d1;
  6. --text: #4d3642;
  7. --text-dim: #7d6270;
  8. --shadow: 0 12px 34px rgba(122, 81, 100, 0.14);
  9. --pending: #b8aab2;
  10. --in-progress: #d68ba8;
  11. --completed: #8eb9a3;
  12. --bug: #c98087;
  13. --link: #ceb5c0;
  14. --highlight: #f5dfe8;
  15. }
  16. * {
  17. box-sizing: border-box;
  18. }
  19. html,
  20. body {
  21. margin: 0;
  22. padding: 0;
  23. min-height: 100%;
  24. color: var(--text);
  25. background:
  26. radial-gradient(circle at 12% -12%, #fff8fb 0, transparent 35%),
  27. radial-gradient(circle at 84% 0, #f6e8ef 0, transparent 34%),
  28. var(--bg);
  29. font-family: "LXGW WenKai", "Noto Sans SC", "Avenir Next", sans-serif;
  30. }
  31. .app-shell {
  32. min-height: 100vh;
  33. display: flex;
  34. flex-direction: column;
  35. gap: 16px;
  36. padding: 16px;
  37. }
  38. .top-bar {
  39. display: grid;
  40. grid-template-columns: 1.4fr 1fr auto;
  41. gap: 16px;
  42. align-items: end;
  43. padding: 16px 18px;
  44. border-radius: 18px;
  45. border: 1px solid #ecd7e2;
  46. background: linear-gradient(140deg, #fff8fb 0%, #f7e9f0 100%);
  47. box-shadow: var(--shadow);
  48. }
  49. .brand-block h1 {
  50. margin: 0 0 4px;
  51. letter-spacing: 0.02em;
  52. font-size: clamp(1.2rem, 2vw, 1.82rem);
  53. }
  54. .brand-block p {
  55. margin: 0;
  56. color: var(--text-dim);
  57. font-size: 0.93rem;
  58. }
  59. .conversation-filter {
  60. display: flex;
  61. flex-direction: column;
  62. gap: 8px;
  63. }
  64. .conversation-filter label {
  65. color: var(--text-dim);
  66. font-size: 0.88rem;
  67. }
  68. .filter-actions {
  69. display: grid;
  70. grid-template-columns: 1fr auto;
  71. gap: 8px;
  72. }
  73. select,
  74. button {
  75. font: inherit;
  76. }
  77. select {
  78. border: 1px solid #d8bcc9;
  79. border-radius: 12px;
  80. background: #fff;
  81. padding: 10px 12px;
  82. color: var(--text);
  83. }
  84. select:focus {
  85. outline: 2px solid #f2cadb;
  86. outline-offset: 1px;
  87. }
  88. .btn {
  89. border: 1px solid #d3b0c0;
  90. border-radius: 12px;
  91. background: #fff5fa;
  92. color: var(--text);
  93. padding: 9px 12px;
  94. cursor: pointer;
  95. transition: transform 120ms ease, background 120ms ease, border-color 120ms ease;
  96. }
  97. .btn:hover {
  98. transform: translateY(-1px);
  99. background: #ffeef6;
  100. border-color: #c895ab;
  101. }
  102. .toolbar-actions {
  103. display: grid;
  104. grid-template-columns: repeat(3, minmax(98px, 1fr));
  105. gap: 8px;
  106. }
  107. .board-layout {
  108. flex: 1;
  109. min-height: 0;
  110. display: grid;
  111. grid-template-columns: 320px minmax(0, 1fr);
  112. gap: 16px;
  113. }
  114. .side-panel {
  115. display: flex;
  116. flex-direction: column;
  117. gap: 12px;
  118. min-height: 0;
  119. }
  120. .panel-card {
  121. background: var(--panel);
  122. border: 1px solid #ead2dd;
  123. border-radius: 16px;
  124. padding: 14px;
  125. box-shadow: 0 10px 20px rgba(123, 79, 103, 0.09);
  126. }
  127. .panel-card h2 {
  128. margin: 0 0 10px;
  129. font-size: 1rem;
  130. }
  131. .legend-list {
  132. margin: 0;
  133. padding: 0;
  134. list-style: none;
  135. display: grid;
  136. gap: 8px;
  137. }
  138. .legend-list li {
  139. display: flex;
  140. align-items: center;
  141. gap: 8px;
  142. font-size: 0.91rem;
  143. }
  144. .legend-dot {
  145. width: 12px;
  146. height: 12px;
  147. border-radius: 50%;
  148. }
  149. .legend-dot.pending {
  150. background: var(--pending);
  151. }
  152. .legend-dot.in-progress {
  153. background: var(--in-progress);
  154. }
  155. .legend-dot.completed {
  156. background: var(--completed);
  157. }
  158. .legend-dot.bug {
  159. background: var(--bug);
  160. }
  161. .stats-list {
  162. margin: 0;
  163. padding: 0;
  164. display: grid;
  165. gap: 7px;
  166. }
  167. .stats-list div {
  168. display: flex;
  169. justify-content: space-between;
  170. align-items: center;
  171. border-radius: 11px;
  172. background: var(--panel-soft);
  173. padding: 8px 10px;
  174. }
  175. .stats-list dt {
  176. margin: 0;
  177. color: var(--text-dim);
  178. font-size: 0.86rem;
  179. }
  180. .stats-list dd {
  181. margin: 0;
  182. font-size: 1rem;
  183. font-weight: 600;
  184. }
  185. .debug-card {
  186. flex: 1;
  187. min-height: 0;
  188. }
  189. .debug-panel {
  190. max-height: 38vh;
  191. overflow: auto;
  192. padding-right: 4px;
  193. }
  194. .debug-item h3 {
  195. margin: 0 0 8px;
  196. font-size: 0.95rem;
  197. }
  198. .debug-item p {
  199. margin: 0 0 7px;
  200. color: var(--text-dim);
  201. line-height: 1.38;
  202. word-break: break-word;
  203. font-size: 0.83rem;
  204. }
  205. .empty-text {
  206. margin: 0;
  207. color: var(--text-dim);
  208. font-size: 0.9rem;
  209. }
  210. .canvas-wrapper {
  211. position: relative;
  212. width: 100%;
  213. height: 100%;
  214. min-height: 620px;
  215. border: 1px solid #eacfdc;
  216. border-radius: 20px;
  217. box-shadow: var(--shadow);
  218. overflow: hidden;
  219. touch-action: none;
  220. background:
  221. linear-gradient(145deg, rgba(255, 246, 251, 0.95) 0%, rgba(248, 233, 240, 0.93) 100%);
  222. }
  223. #mindmapSvg {
  224. width: 100%;
  225. height: 100%;
  226. }
  227. .canvas-hint {
  228. position: absolute;
  229. right: 12px;
  230. bottom: 10px;
  231. font-size: 0.8rem;
  232. color: #826674;
  233. background: rgba(255, 249, 252, 0.84);
  234. border: 1px solid #e6cdda;
  235. border-radius: 999px;
  236. padding: 5px 10px;
  237. }
  238. .link-path {
  239. fill: none;
  240. stroke: var(--link);
  241. stroke-width: 2;
  242. opacity: 0.9;
  243. }
  244. .link-path.status-in-progress {
  245. stroke: #c98ea5;
  246. }
  247. .link-path.status-completed {
  248. stroke: #96baa6;
  249. }
  250. .link-path.status-bug {
  251. stroke: #ca8f98;
  252. }
  253. .link-path.type-merge {
  254. stroke-dasharray: 7 6;
  255. }
  256. .node-group {
  257. cursor: pointer;
  258. }
  259. .node-card {
  260. fill: #fff8fb;
  261. stroke: #dec4cf;
  262. stroke-width: 1.4;
  263. filter: drop-shadow(0 10px 16px rgba(116, 75, 96, 0.12));
  264. }
  265. .node-group:hover .node-card {
  266. fill: #fff;
  267. stroke: #c995ac;
  268. }
  269. .node-group.selected .node-card {
  270. fill: var(--highlight);
  271. stroke: #b66d8a;
  272. stroke-width: 2;
  273. }
  274. .node-status-dot {
  275. stroke: rgba(255, 255, 255, 0.92);
  276. stroke-width: 1;
  277. }
  278. .node-group.status-pending .node-status-dot {
  279. fill: var(--pending);
  280. }
  281. .node-group.status-in-progress .node-status-dot {
  282. fill: var(--in-progress);
  283. }
  284. .node-group.status-completed .node-status-dot {
  285. fill: var(--completed);
  286. }
  287. .node-group.status-bug .node-status-dot {
  288. fill: var(--bug);
  289. }
  290. .node-title {
  291. fill: var(--text);
  292. font-size: 15px;
  293. font-weight: 600;
  294. }
  295. .node-subtitle {
  296. fill: var(--text-dim);
  297. font-size: 12px;
  298. }
  299. .node-subtitle.muted {
  300. fill: #8a6d7b;
  301. }
  302. .progress-ring {
  303. fill: none;
  304. stroke: #cc8fa7;
  305. stroke-width: 2;
  306. stroke-dasharray: 7 5;
  307. animation: progressDash 1.25s linear infinite;
  308. filter: url(#pulseGlow);
  309. }
  310. .node-group.status-bug .node-card {
  311. stroke: #c9868f;
  312. filter: drop-shadow(0 0 8px rgba(201, 120, 128, 0.42));
  313. }
  314. @keyframes progressDash {
  315. from {
  316. stroke-dashoffset: 0;
  317. }
  318. to {
  319. stroke-dashoffset: -48;
  320. }
  321. }
  322. .empty-state {
  323. fill: #7f6875;
  324. font-size: 22px;
  325. }
  326. @media (max-width: 1180px) {
  327. .top-bar {
  328. grid-template-columns: 1fr;
  329. align-items: stretch;
  330. }
  331. .board-layout {
  332. grid-template-columns: 1fr;
  333. }
  334. .side-panel {
  335. order: 2;
  336. }
  337. .canvas-panel {
  338. order: 1;
  339. }
  340. }
  341. @media (max-width: 700px) {
  342. .app-shell {
  343. padding: 10px;
  344. gap: 10px;
  345. }
  346. .toolbar-actions {
  347. grid-template-columns: 1fr 1fr;
  348. }
  349. .filter-actions {
  350. grid-template-columns: 1fr;
  351. }
  352. .canvas-wrapper {
  353. min-height: 72vh;
  354. }
  355. }