:root { color-scheme: light; font-family: "Segoe UI", "Microsoft YaHei", Arial, sans-serif; background: #f4f6f8; color: #172033; --surface: #ffffff; --surface-alt: #f8fafc; --line: #d9e2ec; --line-soft: #e8eef5; --text: #172033; --muted: #607086; --accent: #2563eb; --accent-dark: #1d4ed8; --green: #12805c; --green-bg: #e9f7f1; --amber: #a15c00; --amber-bg: #fff4df; --red: #b42318; --red-bg: #fff1f0; --violet: #6d4aff; --shadow: 0 1px 2px rgba(15, 23, 42, 0.06); } * { box-sizing: border-box; } body { margin: 0; min-width: 320px; background: var(--surface-alt); } button, input, select, textarea { font: inherit; } button { cursor: pointer; } .icon-sprite { display: none; } svg { width: 18px; height: 18px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; } .app-shell { min-height: 100vh; display: grid; grid-template-columns: 232px minmax(0, 1fr); } .sidebar { background: #111827; color: #f9fafb; padding: 18px 14px; position: sticky; top: 0; height: 100vh; } .brand { display: flex; align-items: center; gap: 10px; height: 48px; margin-bottom: 16px; } .brand-mark { width: 36px; height: 36px; display: grid; place-items: center; border: 1px solid #4b5563; border-radius: 8px; background: #1f2937; font-size: 13px; font-weight: 700; } .brand strong, .brand span { display: block; } .brand span { color: #aab4c3; font-size: 12px; margin-top: 2px; } .nav { display: grid; gap: 4px; } .nav-item { height: 38px; width: 100%; display: flex; align-items: center; gap: 10px; border: 0; border-radius: 6px; color: #cbd5e1; background: transparent; padding: 0 10px; text-align: left; } .nav-item:hover { background: #1f2937; color: #ffffff; } .nav-item.is-active { background: #e5edff; color: #17356f; } .main-shell { min-width: 0; } .topbar { min-height: 72px; display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 16px 24px; background: var(--surface); border-bottom: 1px solid var(--line); position: sticky; top: 0; z-index: 3; } h1, h2, h3, p { margin: 0; } h1 { font-size: 22px; line-height: 1.2; font-weight: 650; } h2 { font-size: 17px; line-height: 1.3; } h3 { font-size: 14px; line-height: 1.3; } #serviceMeta { margin-top: 5px; color: var(--muted); font-size: 13px; } .top-actions { display: flex; align-items: center; gap: 8px; } .workspace { padding: 18px 20px 28px; } .view { display: none; } .view.is-active { display: block; } .view-grid { display: grid; gap: 14px; } .view-grid > *, .kpi, .surface { min-width: 0; } .two-col { grid-template-columns: minmax(360px, 0.95fr) minmax(420px, 1.3fr); } .three-col { grid-template-columns: repeat(3, minmax(0, 1fr)); } .surface { background: var(--surface); border: 1px solid var(--line); border-radius: 8px; box-shadow: var(--shadow); } .surface-header { min-height: 52px; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; border-bottom: 1px solid var(--line-soft); } .surface-body { padding: 14px 16px 16px; } .toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .button, .icon-button { height: 34px; border: 1px solid #b8c5d6; border-radius: 6px; background: #ffffff; color: #25344a; display: inline-flex; align-items: center; justify-content: center; gap: 7px; padding: 0 12px; } .button.primary { background: var(--accent); border-color: var(--accent); color: #ffffff; } .button.primary:hover { background: var(--accent-dark); } .button.danger { border-color: #f1b6b0; color: var(--red); background: #fffafa; } .button:disabled, .icon-button:disabled { cursor: not-allowed; opacity: 0.55; } .icon-button { width: 34px; padding: 0; } .status-pill, .badge { display: inline-flex; align-items: center; justify-content: center; min-height: 26px; padding: 3px 9px; border: 1px solid #c8d2df; border-radius: 999px; color: #42526a; background: #f8fafc; font-size: 12px; font-weight: 650; white-space: nowrap; } .status-pill.ok, .badge.ok { border-color: #9bd7bd; background: var(--green-bg); color: var(--green); } .status-pill.fail, .badge.fail { border-color: #f1b6b0; background: var(--red-bg); color: var(--red); } .badge.warn { border-color: #f2cf92; background: var(--amber-bg); color: var(--amber); } .badge.info { border-color: #bfd2ff; background: #eef4ff; color: #174a9c; } .kpi-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; } .kpi { min-height: 94px; padding: 14px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; } .kpi label { display: block; color: var(--muted); font-size: 12px; } .kpi strong { display: block; margin-top: 8px; color: var(--text); font-size: 26px; line-height: 1; } .kpi span { display: block; margin-top: 8px; color: var(--muted); font-size: 12px; } .field-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .field-grid.full, .field.full { grid-column: 1 / -1; } .field label { display: block; margin-bottom: 6px; color: #40516a; font-size: 12px; font-weight: 650; } .checkbox-field { display: flex; align-items: end; min-height: 60px; } .checkbox-field label { display: inline-flex; align-items: center; gap: 8px; margin: 0; color: #25344a; font-size: 13px; } .checkbox-field input { width: 16px; height: 16px; } input, select, textarea { width: 100%; border: 1px solid #bfccdc; border-radius: 6px; background: #ffffff; color: var(--text); } input[type="checkbox"] { width: 16px; height: 16px; margin: 0 4px 0 0; } input, select { height: 34px; padding: 0 10px; } textarea { min-height: 170px; padding: 10px; resize: vertical; line-height: 1.45; font-family: Consolas, "Cascadia Mono", monospace; font-size: 13px; } .table-wrap { overflow-x: auto; } table { width: 100%; min-width: 820px; border-collapse: collapse; } .compact-table table { min-width: 560px; } th, td { padding: 10px; text-align: left; border-bottom: 1px solid var(--line-soft); font-size: 13px; vertical-align: middle; } th { color: #5b6a7f; background: #f8fafc; font-size: 11px; text-transform: uppercase; letter-spacing: 0; } td.actions { min-width: 210px; } .mono { font-family: Consolas, "Cascadia Mono", monospace; } .muted { color: var(--muted); } .empty { color: var(--muted); text-align: center; padding: 26px 10px; } .empty-cell { color: var(--muted); text-align: center; padding: 22px 10px; } .form-hint { margin-top: 8px; color: var(--muted); font-size: 12px; line-height: 1.5; } .device-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 12px; } .device-card { border: 1px solid var(--line); border-radius: 8px; background: #ffffff; padding: 12px; } .device-card header { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; margin-bottom: 10px; } .device-card strong { display: block; font-size: 14px; } .kv { display: grid; grid-template-columns: 112px minmax(0, 1fr); gap: 6px 10px; font-size: 13px; } .kv dt { color: var(--muted); } .kv dd { margin: 0; overflow-wrap: anywhere; } .progress-bar { height: 8px; border-radius: 999px; background: #e6edf5; overflow: hidden; } .progress-bar span { display: block; height: 100%; width: 0; background: var(--accent); } .metric-list { display: grid; gap: 12px; } .metric-row { display: grid; grid-template-columns: 180px minmax(0, 1fr) 72px; gap: 12px; align-items: center; font-size: 13px; } .toast { position: fixed; right: 18px; bottom: 18px; max-width: min(420px, calc(100vw - 36px)); background: #111827; color: #ffffff; border-radius: 8px; padding: 12px 14px; box-shadow: 0 10px 24px rgba(15, 23, 42, 0.22); z-index: 20; } .split-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } .mini-select { max-width: 150px; } .button.small { height: 30px; padding: 0 10px; font-size: 12px; } .site-scan-panel { padding: 12px 0 4px; border-top: 1px solid var(--line-soft); } .site-scan-fields { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr) auto; gap: 12px; align-items: end; } .site-scan-panel .field { min-width: 0; } .site-scan-action { display: flex; align-items: end; } .site-scan-empty { min-height: 36px; margin-top: 10px; padding: 9px 10px; border: 1px dashed #c9d7ea; border-radius: 6px; color: var(--muted); background: #ffffff; font-size: 13px; } .site-scan-empty.fail { border-color: #f2bbb5; color: var(--red); background: var(--red-bg); } .site-scan-summary { margin-top: 10px; color: #40516a; font-size: 13px; } .site-result-list { display: grid; gap: 8px; margin-top: 8px; } .site-result-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: center; padding: 10px; border: 1px solid var(--line-soft); border-radius: 6px; background: #ffffff; } .site-result-main { display: grid; min-width: 0; gap: 4px; } .site-result-main strong, .site-url, .site-meta { overflow-wrap: anywhere; } .site-url { color: #174a9c; font-size: 12px; } .site-meta { color: var(--muted); font-size: 12px; } .discovery-fields { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(220px, 0.7fr); gap: 12px; } .discovery-empty { min-height: 42px; margin-top: 12px; padding: 10px 12px; border: 1px dashed #c9d7ea; border-radius: 6px; color: var(--muted); background: #ffffff; font-size: 13px; } .discovery-empty.fail { border-color: #f2bbb5; color: var(--red); background: var(--red-bg); } .discovery-summary { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; margin-top: 12px; color: #40516a; font-size: 13px; } .discovery-tree { display: grid; gap: 8px; margin-top: 10px; } .discovery-row { display: grid; grid-template-columns: 20px minmax(0, 1fr); gap: 10px; align-items: start; padding: 10px; padding-left: calc(10px + (var(--depth, 0) * 22px)); border: 1px solid var(--line-soft); border-radius: 6px; background: #ffffff; } .discovery-row input { margin-top: 3px; } .discovery-main { display: grid; min-width: 0; gap: 4px; } .discovery-main strong, .discovery-main span { overflow-wrap: anywhere; } .discovery-main > span:not(.site-url) { color: #40516a; font-size: 13px; } .discovery-meta { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; color: var(--muted); font-size: 12px; } .discovery-note { color: var(--amber); } .system-test-status { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; min-height: 34px; padding: 8px 10px; border: 1px solid var(--line-soft); border-radius: 6px; background: #ffffff; color: #40516a; font-size: 13px; } .task-meta { display: block; margin-top: 4px; color: var(--muted); font-size: 12px; } .task-detail-panel { grid-column: 1 / -1; } .task-detail { display: grid; gap: 14px; } .task-detail-title { display: grid; gap: 4px; } .task-detail h3 { margin: 0 0 8px; color: #1f2d42; font-size: 14px; } .task-detail-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; } .detail-list { display: grid; gap: 6px; margin: 0; padding: 0; list-style: none; color: #40516a; font-size: 13px; } .detail-list li { display: grid; gap: 3px; min-width: 0; padding: 7px 8px; border: 1px solid var(--line-soft); border-radius: 6px; background: #ffffff; overflow-wrap: anywhere; } .detail-list.logs li { font-family: Consolas, "Cascadia Mono", monospace; font-size: 12px; } .test-result { display: grid; grid-template-columns: 38px minmax(0, 1fr); gap: 12px; padding: 14px; border: 1px solid var(--line); border-radius: 8px; background: #f8fafc; } .test-result.ok { border-color: #a9dec7; background: var(--green-bg); } .test-result.fail { border-color: #f2bbb5; background: var(--red-bg); } .test-result.neutral { border-color: #c9d7ea; background: #f5f8fd; } .test-result-icon { width: 34px; height: 34px; display: grid; place-items: center; border-radius: 50%; background: #ffffff; border: 1px solid currentColor; color: var(--accent); } .test-result.ok .test-result-icon { color: var(--green); } .test-result.fail .test-result-icon { color: var(--red); } .test-result p { margin-top: 4px; color: #40516a; line-height: 1.5; } .compact-kv { margin: 12px 0; grid-template-columns: 72px minmax(0, 1fr); } .subheading { margin-top: 10px; } .model-chip-list { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; } .model-chip { display: inline-flex; align-items: center; max-width: 100%; min-height: 26px; padding: 3px 8px; border-radius: 999px; border: 1px solid #bdd0ea; background: #ffffff; color: #243650; font-size: 12px; overflow-wrap: anywhere; } .hint-list { margin: 10px 0 0; padding-left: 18px; color: #40516a; font-size: 13px; line-height: 1.55; } .json-preview { max-height: 280px; overflow: auto; padding: 12px; border: 1px solid var(--line); border-radius: 6px; background: #0f172a; color: #d7e2f2; font-family: Consolas, "Cascadia Mono", monospace; font-size: 12px; line-height: 1.45; } @media (max-width: 1060px) { .app-shell { grid-template-columns: 1fr; } .sidebar { position: static; height: auto; padding-bottom: 10px; } .nav { grid-template-columns: repeat(4, minmax(0, 1fr)); } .nav-item { justify-content: center; } .two-col, .three-col, .kpi-grid, .field-grid, .discovery-fields, .site-scan-fields, .site-result-row, .task-detail-grid { grid-template-columns: 1fr; } .site-scan-action .button, .site-result-row .button { width: 100%; } } @media (max-width: 700px) { .topbar { align-items: flex-start; flex-direction: column; padding: 14px; } .workspace { padding: 12px; } .nav { grid-template-columns: repeat(2, minmax(0, 1fr)); } .surface-header, .toolbar { align-items: flex-start; flex-direction: column; } .metric-row { grid-template-columns: 1fr; gap: 6px; } }