:root { --bg: #f5f7fb; --panel: #ffffff; --panel-2: #f0f3f8; --text: #1f2a37; --muted: #6b7a90; --accent: #1f6feb; --accent-2: #22c55e; --danger: #ef4444; --border: #d5dbe6; --shadow: rgba(12, 22, 34, 0.08); } * { box-sizing: border-box; } body { margin: 0; font-family: "Segoe UI", "Microsoft YaHei", sans-serif; color: var(--text); background: radial-gradient(circle at top, #ffffff 0%, #eef2f8 55%); font-size: 12px; min-height: 100vh; } .topbar { display: flex; justify-content: space-between; align-items: center; padding: 16px 24px; border-bottom: 1px solid var(--border); background: linear-gradient(90deg, #ffffff, #f2f5fa); position: sticky; top: 0; z-index: 10; } .title { font-size: 16px; font-weight: 600; letter-spacing: 0.5px; } .status { font-size: 11px; color: var(--muted); } .grid { display: grid; grid-template-columns: 2fr 3fr; grid-template-rows: auto auto; gap: 16px; padding: 16px; } .panel.top-left { grid-column: 1 / 2; grid-row: 1 / 2; } .panel.top-right { grid-column: 2 / 3; grid-row: 1 / 2; } .panel.bottom { grid-column: 1 / -1; grid-row: 2 / 3; } .panel { background: var(--panel); border: 1px solid var(--border); border-radius: 12px; padding: 16px; box-shadow: 0 10px 30px var(--shadow); display: flex; flex-direction: column; gap: 12px; height: 40vh; overflow: hidden; } h2, h3 { margin: 0; font-weight: 600; } .form label { display: flex; flex-direction: column; gap: 6px; font-size: 11px; color: var(--muted); } .form input[type="text"], .form input[type="url"], .form input[type="password"], .form input[type="number"], .form input:not([type]) { padding: 8px 10px; border-radius: 8px; border: 1px solid var(--border); background: var(--panel-2); color: var(--text); } .form .row { flex-direction: row; align-items: center; gap: 8px; } .actions { display: flex; gap: 8px; align-items: center; justify-content: space-between; } button { background: var(--accent); border: none; color: #ffffff; padding: 6px 10px; border-radius: 8px; cursor: pointer; font-weight: 600; } button.secondary { background: transparent; color: var(--muted); border: 1px solid var(--border); } button.danger { background: var(--danger); color: #ffffff; } .list { display: flex; flex-direction: column; gap: 8px; overflow-y: auto; max-height: none; flex: 1 1 auto; } .list-item { padding: 8px; border: 1px solid var(--border); border-radius: 10px; background: var(--panel-2); display: flex; flex-direction: column; gap: 6px; cursor: pointer; } .list-item.selected { border-color: var(--accent); box-shadow: 0 0 0 1px rgba(31, 111, 235, 0.2); } .list-item .row { display: flex; justify-content: space-between; align-items: center; gap: 8px; } .muted { color: var(--muted); font-size: 11px; } .badge { font-size: 11px; padding: 2px 8px; border-radius: 999px; background: rgba(31, 111, 235, 0.14); color: var(--accent); } .badge.offline { background: rgba(239, 68, 68, 0.14); color: var(--danger); } .badge.quality-good { background: rgba(34, 197, 94, 0.16); color: #16a34a; } .badge.quality-bad { background: rgba(239, 68, 68, 0.16); color: #dc2626; } .badge.quality-uncertain { background: rgba(245, 158, 11, 0.16); color: #d97706; } .badge.quality-unknown { background: rgba(148, 163, 184, 0.2); color: #64748b; } .value { font-weight: 600; font-size: 11px; } .toolbar { display: flex; gap: 8px; } .pager { display: flex; align-items: center; gap: 8px; justify-content: center; font-size: 11px; } .tree { overflow-y: auto; padding-right: 8px; } .tree details { margin-left: 10px; } .tree summary { list-style: none; cursor: pointer; display: flex; align-items: center; gap: 6px; } .tree summary.has-children::before { content: "▸"; color: var(--muted); margin-right: 4px; } .tree details[open] > summary.has-children::before { content: "▾"; } .tree summary::-webkit-details-marker { display: none; } .tree .node-label { color: var(--text); } .subpanel { background: var(--panel-2); border: 1px solid var(--border); border-radius: 10px; padding: 12px; display: flex; flex-direction: column; gap: 8px; } .log { background: #0b1117; border-radius: 8px; border: 1px solid var(--border); padding: 8px; font-family: "JetBrains Mono", "Consolas", monospace; font-size: 11px; color: #c9d7e8; max-height: none; overflow-y: auto; flex: 1 1 auto; display: flex; flex-direction: column; gap: 4px; } .log-line { white-space: pre-wrap; word-break: break-word; } .log-line .level { font-weight: 700; margin-right: 6px; } .log-line .message { margin-left: 8px; } .log-line .muted { margin-left: 6px; } .log-line.level-trace .level { color: #94a3b8; } .log-line.level-debug .level { color: #38bdf8; } .log-line.level-info .level { color: #22c55e; } .log-line.level-warn .level { color: #f59e0b; } .log-line.level-error .level { color: #ef4444; } .modal { position: fixed; inset: 0; background: rgba(5, 11, 20, 0.4); display: flex; align-items: center; justify-content: center; padding: 16px; z-index: 50; } .modal.hidden { display: none; } .modal-content { width: min(920px, 96vw); max-height: 90vh; overflow: hidden; background: var(--panel); border-radius: 16px; border: 1px solid var(--border); padding: 16px; box-shadow: 0 20px 60px var(--shadow); display: flex; flex-direction: column; gap: 12px; } .modal-content .tree { flex: 1; border: 1px solid var(--border); border-radius: 10px; padding: 8px; background: var(--panel-2); max-height: 55vh; } @media (max-width: 1200px) { .grid { grid-template-columns: 1fr; } .panel { height: auto; } .list { max-height: none; } .log { max-height: none; } }