:root { --bg: #f7eef2; --panel: #fff8fb; --panel-soft: #f4e8ee; --line: #dec6d1; --text: #4d3642; --text-dim: #7d6270; --shadow: 0 12px 34px rgba(122, 81, 100, 0.14); --pending: #b8aab2; --in-progress: #d68ba8; --completed: #8eb9a3; --bug: #c98087; --link: #ceb5c0; --highlight: #f5dfe8; } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; min-height: 100%; color: var(--text); background: radial-gradient(circle at 12% -12%, #fff8fb 0, transparent 35%), radial-gradient(circle at 84% 0, #f6e8ef 0, transparent 34%), var(--bg); font-family: "LXGW WenKai", "Noto Sans SC", "Avenir Next", sans-serif; } .app-shell { min-height: 100vh; display: flex; flex-direction: column; gap: 16px; padding: 16px; } .top-bar { display: grid; grid-template-columns: 1.4fr 1fr auto; gap: 16px; align-items: end; padding: 16px 18px; border-radius: 18px; border: 1px solid #ecd7e2; background: linear-gradient(140deg, #fff8fb 0%, #f7e9f0 100%); box-shadow: var(--shadow); } .brand-block h1 { margin: 0 0 4px; letter-spacing: 0.02em; font-size: clamp(1.2rem, 2vw, 1.82rem); } .brand-block p { margin: 0; color: var(--text-dim); font-size: 0.93rem; } .conversation-filter { display: flex; flex-direction: column; gap: 8px; } .conversation-filter label { color: var(--text-dim); font-size: 0.88rem; } .filter-actions { display: grid; grid-template-columns: 1fr auto; gap: 8px; } select, button { font: inherit; } select { border: 1px solid #d8bcc9; border-radius: 12px; background: #fff; padding: 10px 12px; color: var(--text); } select:focus { outline: 2px solid #f2cadb; outline-offset: 1px; } .btn { border: 1px solid #d3b0c0; border-radius: 12px; background: #fff5fa; color: var(--text); padding: 9px 12px; cursor: pointer; transition: transform 120ms ease, background 120ms ease, border-color 120ms ease; } .btn:hover { transform: translateY(-1px); background: #ffeef6; border-color: #c895ab; } .toolbar-actions { display: grid; grid-template-columns: repeat(3, minmax(98px, 1fr)); gap: 8px; } .board-layout { flex: 1; min-height: 0; display: grid; grid-template-columns: 320px minmax(0, 1fr); gap: 16px; } .side-panel { display: flex; flex-direction: column; gap: 12px; min-height: 0; } .panel-card { background: var(--panel); border: 1px solid #ead2dd; border-radius: 16px; padding: 14px; box-shadow: 0 10px 20px rgba(123, 79, 103, 0.09); } .panel-card h2 { margin: 0 0 10px; font-size: 1rem; } .legend-list { margin: 0; padding: 0; list-style: none; display: grid; gap: 8px; } .legend-list li { display: flex; align-items: center; gap: 8px; font-size: 0.91rem; } .legend-dot { width: 12px; height: 12px; border-radius: 50%; } .legend-dot.pending { background: var(--pending); } .legend-dot.in-progress { background: var(--in-progress); } .legend-dot.completed { background: var(--completed); } .legend-dot.bug { background: var(--bug); } .stats-list { margin: 0; padding: 0; display: grid; gap: 7px; } .stats-list div { display: flex; justify-content: space-between; align-items: center; border-radius: 11px; background: var(--panel-soft); padding: 8px 10px; } .stats-list dt { margin: 0; color: var(--text-dim); font-size: 0.86rem; } .stats-list dd { margin: 0; font-size: 1rem; font-weight: 600; } .debug-card { flex: 1; min-height: 0; } .debug-panel { max-height: 38vh; overflow: auto; padding-right: 4px; } .debug-item h3 { margin: 0 0 8px; font-size: 0.95rem; } .debug-item p { margin: 0 0 7px; color: var(--text-dim); line-height: 1.38; word-break: break-word; font-size: 0.83rem; } .empty-text { margin: 0; color: var(--text-dim); font-size: 0.9rem; } .canvas-wrapper { position: relative; width: 100%; height: 100%; min-height: 620px; border: 1px solid #eacfdc; border-radius: 20px; box-shadow: var(--shadow); overflow: hidden; touch-action: none; background: linear-gradient(145deg, rgba(255, 246, 251, 0.95) 0%, rgba(248, 233, 240, 0.93) 100%); } #mindmapSvg { width: 100%; height: 100%; } .canvas-hint { position: absolute; right: 12px; bottom: 10px; font-size: 0.8rem; color: #826674; background: rgba(255, 249, 252, 0.84); border: 1px solid #e6cdda; border-radius: 999px; padding: 5px 10px; } .link-path { fill: none; stroke: var(--link); stroke-width: 2; opacity: 0.9; } .link-path.status-in-progress { stroke: #c98ea5; } .link-path.status-completed { stroke: #96baa6; } .link-path.status-bug { stroke: #ca8f98; } .link-path.type-merge { stroke-dasharray: 7 6; } .node-group { cursor: pointer; } .node-card { fill: #fff8fb; stroke: #dec4cf; stroke-width: 1.4; filter: drop-shadow(0 10px 16px rgba(116, 75, 96, 0.12)); } .node-group:hover .node-card { fill: #fff; stroke: #c995ac; } .node-group.selected .node-card { fill: var(--highlight); stroke: #b66d8a; stroke-width: 2; } .node-status-dot { stroke: rgba(255, 255, 255, 0.92); stroke-width: 1; } .node-group.status-pending .node-status-dot { fill: var(--pending); } .node-group.status-in-progress .node-status-dot { fill: var(--in-progress); } .node-group.status-completed .node-status-dot { fill: var(--completed); } .node-group.status-bug .node-status-dot { fill: var(--bug); } .node-title { fill: var(--text); font-size: 15px; font-weight: 600; } .node-subtitle { fill: var(--text-dim); font-size: 12px; } .node-subtitle.muted { fill: #8a6d7b; } .progress-ring { fill: none; stroke: #cc8fa7; stroke-width: 2; stroke-dasharray: 7 5; animation: progressDash 1.25s linear infinite; filter: url(#pulseGlow); } .node-group.status-bug .node-card { stroke: #c9868f; filter: drop-shadow(0 0 8px rgba(201, 120, 128, 0.42)); } @keyframes progressDash { from { stroke-dashoffset: 0; } to { stroke-dashoffset: -48; } } .empty-state { fill: #7f6875; font-size: 22px; } @media (max-width: 1180px) { .top-bar { grid-template-columns: 1fr; align-items: stretch; } .board-layout { grid-template-columns: 1fr; } .side-panel { order: 2; } .canvas-panel { order: 1; } } @media (max-width: 700px) { .app-shell { padding: 10px; gap: 10px; } .toolbar-actions { grid-template-columns: 1fr 1fr; } .filter-actions { grid-template-columns: 1fr; } .canvas-wrapper { min-height: 72vh; } }