:root { --bg: #f5f7fb; --surface: #ffffff; --surface-soft: #f8fafc; --surface-muted: #eef3f8; --line: #dbe3ee; --text: #162033; --muted: #6a7688; --primary: #1f6feb; --primary-soft: #eaf2ff; --success: #159a5a; --success-soft: #e9f8f0; --danger: #d94d3f; --danger-soft: #fff1ef; --warning: #ca8a04; --warning-soft: #fef7dd; --shadow: 0 14px 28px rgba(15, 23, 42, 0.06); --radius-lg: 20px; --radius-md: 14px; --radius-sm: 10px; --font-sans: "Segoe UI Variable Display", "PingFang SC", "Noto Sans SC", "Microsoft YaHei UI", sans-serif; --font-mono: "JetBrains Mono", "Cascadia Code", monospace; } * { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; min-height: 100vh; background: linear-gradient(180deg, #f8fbff 0%, #f5f7fb 100%); color: var(--text); font-family: var(--font-sans); } button, input, select { font: inherit; } .auth-shell { min-height: 100vh; display: grid; place-items: center; padding: 24px; } .app-shell { max-width: 1360px; margin: 0 auto; padding: 24px; } .auth-card { width: min(560px, 100%); } .auth-brand { display: flex; align-items: center; gap: 14px; margin-bottom: 18px; } .auth-brand-title { font-size: 20px; font-weight: 800; letter-spacing: -0.03em; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 20px 24px; background: var(--surface); border: 1px solid var(--line); border-radius: 24px; box-shadow: var(--shadow); } .brand-block { display: flex; align-items: center; gap: 16px; min-width: 0; } .brand-mark { width: 48px; height: 48px; display: grid; place-items: center; border-radius: 16px; background: radial-gradient(circle at 30% 30%, rgba(255, 255, 255, 0.24), transparent 34%), linear-gradient(145deg, #163b78 0%, #1f6feb 52%, #63a4ff 100%); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.18); } .brand-glyph { position: relative; width: 28px; height: 28px; display: block; } .brand-core { position: absolute; left: 50%; top: 50%; width: 8px; height: 8px; border-radius: 999px; background: #ffffff; transform: translate(-50%, -50%); box-shadow: 0 0 0 4px rgba(255, 255, 255, 0.14); } .brand-orbit { position: absolute; inset: 0; border: 2px solid rgba(255, 255, 255, 0.92); border-radius: 999px; } .brand-orbit-a { transform: rotate(24deg) scaleY(0.56); } .brand-orbit-b { transform: rotate(-28deg) scaleX(0.56); } .brand-title { font-size: 24px; font-weight: 800; letter-spacing: -0.04em; } .header-actions { display: flex; gap: 10px; flex-wrap: wrap; justify-content: flex-end; align-items: center; } .header-chip { display: inline-flex; align-items: center; padding: 10px 14px; border-radius: 999px; background: var(--surface-soft); border: 1px solid var(--line); color: var(--muted); font-size: 13px; font-weight: 700; } .nav-bar { margin-top: 16px; background: var(--surface); border: 1px solid var(--line); border-radius: 18px; box-shadow: var(--shadow); } .nav-scroll { display: flex; gap: 8px; overflow-x: auto; padding: 10px; } .nav-tab { flex: 0 0 auto; padding: 11px 16px; border-radius: 12px; color: var(--muted); text-decoration: none; font-weight: 700; } .nav-tab.active { background: var(--text); color: #fff; } .page-shell { margin-top: 20px; } .app-footer { margin-top: 18px; padding: 12px 4px 4px; text-align: center; color: var(--muted); font-size: 14px; line-height: 1.6; } .grid { display: grid; } .gap-lg { gap: 20px; } .metric-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; } .content-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 20px; } .split-page { display: grid; grid-template-columns: 340px minmax(0, 1fr); gap: 20px; } .surface { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius-lg); box-shadow: var(--shadow); padding: 22px; } .side-panel { align-self: start; } .section-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; margin-bottom: 18px; } .section-head h3 { margin: 0; font-size: 20px; letter-spacing: -0.03em; } .section-head p { margin: 6px 0 0; color: var(--muted); font-size: 14px; line-height: 1.6; } .stack { display: grid; gap: 12px; } .station-stack { margin-top: 14px; } .summary-grid, .detail-grid, .form-grid, .chip-grid { display: grid; gap: 14px; } .summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .detail-grid, .form-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .chip-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .auth-grid { grid-template-columns: 1fr; } .editor-grid { align-items: start; } .manual-coords-panel { margin-top: 18px; padding-top: 18px; border-top: 1px dashed var(--line); } .compact-headline { margin-bottom: 12px; } .metric-card { padding: 18px; border-radius: 18px; background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow); } .metric-label, .summary-label, .detail-label, .field span { color: var(--muted); font-size: 12px; font-weight: 800; letter-spacing: 0.08em; text-transform: uppercase; } .metric-value { margin-top: 10px; font-size: 32px; font-weight: 800; letter-spacing: -0.05em; } .metric-note, .row-sub, .timeline-text { color: var(--muted); font-size: 13px; line-height: 1.7; } .summary-card, .detail-card, .summary-value, .detail-value { margin-top: 8px; font-size: 15px; font-weight: 700; line-height: 1.6; min-width: 0; overflow-wrap: anywhere; word-break: break-word; } .toolbar-row, .action-row, .list-row, .timeline-meta { display: flex; align-items: center; } .toolbar-row, .action-row { gap: 10px; flex-wrap: wrap; } .toolbar-row { margin-bottom: 12px; } .auth-action-row { justify-content: center; margin-top: 16px; } .admin-action-row { margin-top: 16px; } .rover-action-row { margin-top: 16px; } .list-row { justify-content: space-between; gap: 14px; width: 100%; padding: 14px; border-radius: 14px; border: 1px solid var(--line); background: var(--surface-soft); text-align: left; } button.list-row { cursor: pointer; } .list-row.active { border-color: var(--primary); background: var(--primary-soft); } .list-row.compact { padding: 12px 14px; } .row-main { min-width: 0; } .row-title { font-size: 14px; font-weight: 800; letter-spacing: -0.02em; } .row-side { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; justify-content: flex-end; } .row-mini { font-size: 12px; color: var(--muted); } .button, .input { border: 1px solid var(--line); border-radius: 12px; } .button { padding: 11px 14px; background: var(--surface); color: var(--text); cursor: pointer; font-weight: 700; } .button.small { padding: 9px 12px; font-size: 13px; } .button.primary { background: var(--primary); border-color: var(--primary); color: #fff; } .button.danger { color: var(--danger); border-color: #f1c8c1; background: #fff7f6; } .button[data-active="true"] { background: var(--text); border-color: var(--text); color: #fff; } .input { width: 100%; padding: 11px 12px; background: var(--surface); color: var(--text); } .field { display: grid; gap: 8px; } .field-wide { grid-column: 1 / -1; } .field-grow { flex: 1 1 320px; } .rover-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin-top: 18px; } .rover-card { padding: 18px; } .compact-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 14px; } .compact-head h4 { margin: 0; font-size: 18px; letter-spacing: -0.03em; } .mono { font-family: var(--font-mono); } .status-pill, .log-badge { display: inline-flex; align-items: center; justify-content: center; padding: 6px 10px; border-radius: 999px; font-size: 11px; font-weight: 800; letter-spacing: 0.06em; text-transform: uppercase; } .status-pill.online { background: var(--success-soft); color: var(--success); } .status-pill.offline { background: var(--danger-soft); color: var(--danger); } .log-badge.INFO { background: var(--primary-soft); color: var(--primary); } .log-badge.WARN { background: var(--warning-soft); color: var(--warning); } .log-badge.ERROR, .log-badge.FATAL { background: var(--danger-soft); color: var(--danger); } .timeline { display: grid; gap: 12px; } .log-row { padding: 14px; border-radius: 14px; background: var(--surface-soft); border: 1px solid var(--line); } .log-row.WARN { border-color: #f0d88c; } .log-row.ERROR, .log-row.FATAL { border-color: #efb2a9; background: #fff8f7; } .timeline-meta { justify-content: space-between; gap: 10px; margin-bottom: 8px; color: var(--muted); font-size: 12px; } .map-wrap { overflow: hidden; border-radius: 18px; border: 1px solid var(--line); background: var(--surface-soft); } .station-map { width: 100%; height: 380px; display: block; } .map-empty-note { margin-top: 12px; color: var(--muted); font-size: 13px; } .empty-state { padding: 32px 20px; border: 1px dashed var(--line); border-radius: 16px; text-align: center; color: var(--muted); background: var(--surface-soft); } .empty-state.small { padding: 20px 16px; } .copy-toast { position: fixed; right: 24px; bottom: 24px; z-index: 40; padding: 12px 16px; border-radius: 12px; background: rgba(17, 24, 39, 0.94); color: #fff; font-size: 13px; font-weight: 700; opacity: 0; transform: translateY(10px); pointer-events: none; transition: opacity 150ms ease, transform 150ms ease; } .copy-toast.show { opacity: 1; transform: translateY(0); } @media (max-width: 1180px) { .metric-grid, .content-grid, .split-page, .summary-grid, .detail-grid, .form-grid, .chip-grid, .rover-grid { grid-template-columns: 1fr; } } @media (max-width: 760px) { .auth-shell, .app-shell { padding: 14px; } .topbar, .surface { padding: 18px; } .topbar { flex-direction: column; align-items: flex-start; } .header-actions, .toolbar-row, .action-row, .section-head { width: 100%; } .section-head { flex-direction: column; } .row-side, .header-actions { justify-content: flex-start; } .copy-toast { left: 14px; right: 14px; bottom: 14px; } }