:root { --font-sans: "Bahnschrift", "Segoe UI Variable", "Segoe UI", Tahoma, sans-serif; --font-mono: "JetBrains Mono", "Cascadia Code", Consolas, monospace; --color-bg: #eef2f7; --color-panel-bg: #ffffff; --color-panel-muted: #f2f6fb; --color-border: #d5dfeb; --color-border-strong: #c3cfdf; --color-text-primary: #0f172a; --color-text-secondary: #4b5a70; --color-text-muted: #6b7a90; --color-accent: #2563eb; --color-accent-strong: #1e40af; --color-accent-soft: #e7efff; --color-accent-glow: rgba(37, 99, 235, 0.18); --color-success: #16a34a; --color-danger: #dc2626; --color-warning: #f59e0b; --color-info: #0ea5e9; --color-envi: #0ea5a4; --shadow-panel: 0 8px 18px rgba(15, 23, 42, 0.08); --shadow-soft: 0 2px 8px rgba(15, 23, 42, 0.07); } *, *::before, *::after { box-sizing: border-box; } html, body { margin: 0; padding: 0; height: 100vh; width: 100vw; overflow: hidden; font-family: var(--font-sans); font-size: 14px; background-color: var(--color-bg); background-image: linear-gradient(180deg, #eef2f7 0%, #f7f9fc 100%); color: var(--color-text-primary); } #app-container { display: flex; flex-direction: column; height: 100vh; width: 100vw; overflow: hidden; } .main-layout { display: flex; flex: 1 1 auto; min-height: 0; overflow: hidden; } .main-layout--standalone { padding: 12px 14px 16px; align-items: stretch; background: #f8fafc; } .center-container { display: flex; flex-direction: column; flex-grow: 1; height: 100%; overflow: hidden; position: relative; } .panel { width: 300px; flex-shrink: 0; background-color: var(--color-panel-bg); border-right: 1px solid var(--color-border-strong); box-shadow: var(--shadow-panel); display: flex; flex-direction: column; overflow: hidden; } .panel header { padding: 10px 15px; border-bottom: 1px solid var(--color-border); background: linear-gradient(135deg, #f9fbff 0%, #eef4ff 100%); display: flex; justify-content: space-between; align-items: center; flex-shrink: 0; } .panel h3 { margin: 0; font-size: 1.1em; font-weight: 600; color: var(--color-text-primary); letter-spacing: 0.2px; } .header-buttons { display: flex; gap: 8px; } .panel-content { overflow-y: auto; flex-grow: 1; } .panel-footer { padding: 10px 15px; border-top: 1px solid var(--color-border); background-color: var(--color-panel-muted); display: flex; gap: 10px; flex-shrink: 0; } .footer-button { flex: 1; padding: 8px; font-weight: 600; border-color: var(--color-accent); color: var(--color-accent-strong); background-color: #fff; box-shadow: 0 6px 16px rgba(37, 99, 235, 0.12); } .footer-button:hover:not(:disabled) { background-color: var(--color-accent-strong); color: white; box-shadow: 0 10px 20px rgba(37, 99, 235, 0.2); } #map-container { flex-grow: 1; width: 100%; position: relative; } #map { height: 100%; width: 100%; background-color: #dde6f4; } .map-region-locator { position: absolute; top: 12px; left: 12px; z-index: 820; display: flex; flex-direction: column; gap: 8px; } .map-region-toggle-btn { border: 1px solid var(--color-border); background: rgba(255, 255, 255, 0.95); color: var(--color-text-primary); border-radius: 999px; padding: 6px 12px; font-size: 12px; font-weight: 600; box-shadow: var(--shadow-soft); backdrop-filter: blur(6px); } .map-region-toggle-btn.active { border-color: var(--color-accent); background: var(--color-accent-soft); color: var(--color-accent-strong); } .map-region-locator-panel { width: min(320px, calc(100vw - 32px)); background: rgba(255, 255, 255, 0.97); border: 1px solid var(--color-border); border-radius: 10px; padding: 10px; box-shadow: var(--shadow-soft); backdrop-filter: blur(6px); display: flex; flex-direction: column; gap: 8px; } .map-region-locator-title { font-size: 12px; font-weight: 700; color: var(--color-text-secondary); } .map-region-grid { grid-template-columns: 1fr; } .map-region-grid select { font-size: 12px; } .map-region-locator-hint { font-size: 12px; color: var(--color-text-muted); } .map-region-locator-current { font-size: 12px; color: var(--color-accent-strong); background: var(--color-accent-soft); border: 1px solid var(--color-border); border-radius: 6px; padding: 5px 8px; } .map-region-locator-error { font-size: 12px; color: var(--color-danger); word-break: break-word; } .map-region-locate-btn { flex: 1; padding: 7px 10px; font-size: 12px; } .map-region-locator-actions { display: flex; gap: 8px; } .map-region-clear-btn { flex: 1; padding: 7px 10px; font-size: 12px; } .map-layer-switch { position: absolute; top: 12px; right: 72px; z-index: 800; background: rgba(255, 255, 255, 0.95); border: 1px solid var(--color-border); border-radius: 10px; padding: 8px 10px; box-shadow: var(--shadow-soft); display: flex; flex-direction: column; gap: 6px; backdrop-filter: blur(6px); } .map-layer-title { font-size: 11px; font-weight: 600; color: var(--color-text-muted); letter-spacing: 0.08em; text-transform: uppercase; } .map-layer-buttons { display: flex; gap: 6px; } .map-layer-switch button { font-size: 11px; padding: 4px 8px; border-radius: 999px; border: 1px solid var(--color-border); background-color: #fff; color: var(--color-text-secondary); box-shadow: none; } .map-layer-switch button:hover:not(:disabled) { background-color: var(--color-panel-muted); } .map-layer-switch button.active { background-color: var(--color-accent-soft); border-color: var(--color-accent); color: var(--color-accent-strong); } .bottom-panel { /* height 由内联样式控制 */ background-color: var(--color-panel-bg); border-top: 1px solid var(--color-border); display: flex; flex-direction: column; flex-shrink: 0; z-index: 1000; /* 确保在地图之上 */ box-shadow: 0 -12px 30px rgba(15, 23, 42, 0.08); } .bottom-panel-header { padding: 5px 15px; background-color: var(--color-panel-muted); border-bottom: 1px solid var(--color-border); display: flex; justify-content: space-between; align-items: center; cursor: row-resize; user-select: none; /* 防止拖拽时选中文本 */ } .bottom-panel-content { flex-grow: 1; overflow: auto; padding: 0; } button { font-size: 0.9em; padding: 5px 10px; border: 1px solid var(--color-border); background-color: #fff; border-radius: 4px; cursor: pointer; color: var(--color-text-primary); box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08); transition: background-color 0.2s, color 0.2s, border-color 0.2s, box-shadow 0.2s; } button:hover:not(:disabled) { background-color: var(--color-panel-muted); border-color: var(--color-border-strong); box-shadow: 0 4px 10px rgba(15, 23, 42, 0.12); } button:disabled { cursor: not-allowed; opacity: 0.6; } button:focus-visible { outline: none; box-shadow: 0 0 0 3px var(--color-accent-glow); border-color: var(--color-accent); } .data-list { list-style: none; margin: 0; padding: 0; } .panel-scroll-shell { display: flex; flex: 1 1 auto; min-height: 0; overflow: hidden; flex-direction: column; } .virtual-list-viewport { flex: 1 1 auto; min-height: 0; overflow-y: auto; overscroll-behavior: contain; } .virtual-list-spacer { position: relative; width: 100%; } .virtual-list-content { position: absolute; top: 0; left: 0; right: 0; will-change: transform; } .data-item, .pair-item { display: flex; align-items: center; padding: 8px 15px; min-height: 48px; border-bottom: 1px solid var(--color-border); cursor: pointer; box-shadow: inset 3px 0 0 transparent; transition: background-color 0.15s, box-shadow 0.2s; } .batch-item { display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-bottom: 1px solid var(--color-border); } .batch-item-main { flex: 1; min-width: 0; } .batch-item-main strong { display: block; font-size: 12px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .batch-item-meta { font-size: 11px; color: var(--color-text-muted); } .batch-engine-results, .dinsar-engine-result-row { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; } .batch-engine-chip, .dinsar-engine-result-chip { display: inline-flex; align-items: center; justify-content: center; min-height: 22px; padding: 3px 8px; border-radius: 999px; border: 1px solid rgba(100, 116, 139, 0.24); background: rgba(148, 163, 184, 0.1); color: #475569; font-size: 11px; font-weight: 700; line-height: 1.2; } .batch-engine-chip.tone-ready, .dinsar-engine-result-chip.tone-ready { border-color: rgba(22, 163, 74, 0.26); background: rgba(22, 163, 74, 0.1); color: #166534; } .batch-engine-chip.tone-error, .dinsar-engine-result-chip.tone-error { border-color: rgba(220, 38, 38, 0.26); background: rgba(220, 38, 38, 0.1); color: #991b1b; } .batch-engine-chip.tone-warn, .dinsar-engine-result-chip.tone-warn { border-color: rgba(217, 119, 6, 0.28); background: rgba(245, 158, 11, 0.12); color: #92400e; } .batch-engine-chip.tone-info, .dinsar-engine-result-chip.tone-info { border-color: rgba(37, 99, 235, 0.26); background: rgba(37, 99, 235, 0.1); color: #1d4ed8; } .dinsar-catalog-cleanup-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; } .dinsar-catalog-cleanup-plan { display: grid; gap: 10px; margin-top: 10px; } .batch-item select, .batch-item input { font-size: 12px; padding: 4px 6px; border: 1px solid var(--color-border); border-radius: 4px; } .data-item:hover, .pair-item:hover { background-color: var(--color-panel-muted); box-shadow: inset 3px 0 0 var(--color-accent); } .data-item-name { font-family: var(--font-mono); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; flex-grow: 1; margin-right: 10px; color: var(--color-text-primary); } .radar-data-item { align-items: flex-start; gap: 10px; } .radar-data-item .data-item-name { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: anywhere; word-break: break-word; line-height: 1.35; } .radar-data-item .data-item-controls { padding-top: 1px; } .data-item-controls { display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; white-space: nowrap; } .preview-status-chip { border: 1px solid var(--color-border); border-radius: 999px; font-size: 10px; line-height: 1; padding: 3px 7px; color: var(--color-text-muted); background: #fff; } .preview-status-chip.ready { border-color: #a7f3d0; color: #047857; background: #ecfdf5; } .preview-status-chip.fallback { border-color: #fde68a; color: #92400e; background: #fffbeb; } .preview-status-chip.failed { border-color: #fecaca; color: #b91c1c; background: #fef2f2; } .preview-status-chip.none { border-color: var(--color-border); color: var(--color-text-muted); background: #fff; } .data-info-btn { border: 1px solid var(--color-border); background: white; color: var(--color-text-secondary); font-size: 10px; padding: 2px 6px; border-radius: 4px; } .data-info-btn:hover { border-color: var(--color-accent); color: var(--color-accent-strong); } .data-preview-btn { border: 1px solid var(--color-border); background: #fff; color: var(--color-text-secondary); font-size: 10px; padding: 2px 6px; border-radius: 4px; } .data-preview-btn.active { border-color: var(--color-accent); color: var(--color-accent-strong); background: var(--color-accent-soft); } .data-preview-btn:hover { border-color: var(--color-accent); color: var(--color-accent-strong); } .data-rebuild-btn { border: 1px solid var(--color-border); background: #fff; color: var(--color-text-secondary); font-size: 10px; padding: 2px 6px; border-radius: 4px; } .data-rebuild-btn:hover:not(:disabled) { border-color: var(--color-accent); color: var(--color-accent-strong); } .dinsar-item { flex-direction: column; align-items: flex-start; gap: 5px; min-height: 102px; } .dinsar-info { display: flex; justify-content: space-between; width: 100%; align-items: center; } .dinsar-item .data-item-controls { width: 100%; justify-content: space-between; } .dinsar-trace-info { width: 100%; display: flex; flex-direction: column; gap: 3px; font-size: 11px; color: var(--color-text-secondary); } .dinsar-trace-line { display: flex; gap: 6px; align-items: center; width: 100%; flex-wrap: wrap; word-break: break-all; } .dinsar-trace-pill { display: inline-flex; align-items: center; padding: 1px 6px; border-radius: 999px; background: var(--color-accent-soft); color: var(--color-accent-strong); border: 1px solid #c7ddff; font-size: 10px; font-weight: 600; } .ai-score { font-size: 10px; padding: 2px 5px; border-radius: 4px; font-weight: bold; color: white; } .ai-score.good { background-color: var(--color-success); } .ai-score.bad { background-color: var(--color-danger); } .ai-score.medium { background-color: var(--color-warning); color: #111827; } .ai-analyze-btn { padding: 4px 8px; font-size: 11px; background-color: var(--color-accent-soft); color: var(--color-accent-strong); border: 1px solid #c7ddff; border-radius: 4px; cursor: pointer; transition: all 0.2s; } .ai-analyze-btn:hover:not(:disabled) { background-color: #d8e7ff; color: var(--color-accent-strong); } .ai-analyze-btn:disabled { opacity: 0.5; cursor: not-allowed; } .ai-analyze-btn.has-report { background-color: #ecfdf3; color: #15803d; border-color: #bbf7d0; } .ai-analyze-btn.has-report:hover { background-color: #d1fae5; } .result-analysis-box { margin-top: 12px; background-color: #fff; border: 1px solid var(--color-border); border-radius: 8px; overflow: hidden; width: 100%; box-shadow: var(--shadow-soft); } .analysis-header { background-color: var(--color-panel-muted); padding: 8px 12px; border-bottom: 1px solid var(--color-border); display: flex; justify-content: space-between; align-items: center; font-size: 12px; font-weight: 600; color: var(--color-text-primary); } .analysis-header button { padding: 2px 8px; font-size: 10px; background-color: #fff; border: 1px solid var(--color-border); color: var(--color-text-secondary); border-radius: 4px; } .analysis-header button:hover { background-color: #fff5f5; color: var(--color-danger); border-color: #fca5a5; } .analysis-body { padding: 16px; max-height: 450px; overflow-y: auto; } .label-buttons { display: flex; gap: 5px; } .label-btn { padding: 4px 8px; font-size: 12px; border: 1px solid var(--color-border); background: var(--color-panel-muted); opacity: 0.8; cursor: pointer; color: var(--color-text-secondary); } .label-btn:hover { opacity: 1; } .label-btn.active { opacity: 1; border-color: var(--color-accent); color: var(--color-accent-strong); } .label-btn.good.active { background-color: #dcfce7; border-color: var(--color-success); color: #166534; } .label-btn.bad.active { background-color: #fee2e2; border-color: var(--color-danger); color: #b91c1c; } .ai-panel { padding: 15px; } .ai-panel h4 { margin: 0; color: var(--color-text-primary); } .ollama-status-tag { font-size: 12px; padding: 2px 8px; border-radius: 12px; font-weight: bold; } .ollama-status-tag.online { background-color: #ecfdf3; color: #15803d; border: 1px solid #bbf7d0; } .ollama-status-tag.offline { background-color: #fee2e2; color: #b91c1c; border: 1px solid #fecaca; } .ai-desc { font-size: 12px; color: var(--color-text-secondary); margin-bottom: 15px; } .ai-stats { display: flex; justify-content: space-between; margin-bottom: 20px; background: var(--color-panel-muted); padding: 10px; border-radius: 6px; } .stat-item { display: flex; flex-direction: column; align-items: center; } .stat-label { font-size: 11px; color: var(--color-text-secondary); } .stat-value { font-size: 16px; font-weight: bold; } .stat-value.good { color: var(--color-success); } .stat-value.bad { color: var(--color-danger); } .ai-actions { display: flex; flex-direction: column; gap: 10px; } .dinsar-analysis-panel { padding: 0; } .dinsar-analysis-toolbar { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 14px 16px; border-bottom: 1px solid var(--color-border); background: var(--color-panel); position: sticky; top: 0; z-index: 1; } .dinsar-analysis-toolbar h3 { margin: 0; color: var(--color-text-primary); font-size: 16px; font-weight: 700; } .dinsar-analysis-toolbar p { margin: 4px 0 0; color: var(--color-text-secondary); font-size: 12px; line-height: 1.5; } .dinsar-analysis-tabs { display: inline-flex; flex-shrink: 0; gap: 4px; padding: 3px; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-panel-muted); } .dinsar-analysis-tabs button { border: 0; background: transparent; color: var(--color-text-secondary); border-radius: 4px; padding: 6px 10px; font-size: 12px; cursor: pointer; white-space: nowrap; } .dinsar-analysis-tabs button.active-tab { background: var(--color-panel); color: var(--color-accent-strong); box-shadow: 0 1px 3px rgba(15, 23, 42, 0.12); } .dinsar-analysis-body { padding: 0; } .dinsar-analysis-body > .panel-content, .dinsar-analysis-body > div { min-height: 0; } @media (max-width: 720px) { .dinsar-analysis-toolbar { flex-direction: column; } .dinsar-analysis-tabs { width: 100%; } .dinsar-analysis-tabs button { flex: 1; } } .primary-btn { background-color: var(--color-accent); color: white; border: none; padding: 10px; } .primary-btn:hover:not(:disabled) { background-color: var(--color-accent-strong); } .warmup-btn { background-color: #fff7ed; border: 1px solid #fdba74; color: #c2410c; padding: 10px; font-weight: 600; transition: all 0.2s; } .warmup-btn:hover:not(:disabled) { background-color: #ffedd5; border-color: #fb923c; } .secondary-btn { background-color: white; border: 1px solid var(--color-accent); color: var(--color-accent); padding: 10px; } .secondary-btn:hover:not(:disabled) { background-color: var(--color-accent-soft); color: var(--color-accent-strong); border-color: var(--color-accent-strong); } .hint { font-size: 11px; color: var(--color-text-secondary); margin: 0; text-align: center; } .orbit-status { font-size: 1.2em; color: var(--color-danger); } .orbit-status.has-orbit { color: var(--color-success); } input[type="checkbox"] { margin: 0; } .tabs-header { display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center; gap: 8px; padding: 8px 10px; position: relative; background-color: var(--color-panel-muted); border-bottom: 1px solid var(--color-border); overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; } .panel-tabs { display: flex; flex-direction: column; gap: 8px; padding: 10px 12px 12px; background: #f8fafc; border-bottom: 1px solid var(--color-border); } .panel-tabs .tabs-header { padding: 0; background-color: transparent; border-bottom: none; scrollbar-gutter: stable both-edges; } .panel-tabs .group-tabs { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; overflow: visible; } .panel-tabs .group-tabs button { width: 100%; font-size: 12px; padding: 8px 8px; font-weight: 700; background: #fff; border: 1px solid var(--color-border); border-radius: 6px; box-shadow: none; } .panel-tabs .group-tabs button.active-tab { background-color: #172033; border-color: #172033; color: #fff; box-shadow: none; } .panel-tabs .section-tabs button { font-size: 12px; padding: 6px 10px; font-weight: 700; background-color: #fff; border: 1px solid var(--color-border); border-radius: 6px; box-shadow: none; } .panel-tabs .section-tabs button.active-tab { background-color: #eaf1ff; color: var(--color-accent-strong); border-color: rgba(37, 99, 235, 0.28); box-shadow: none; } .panel-tabs .sub-tabs button { font-size: 12px; padding: 7px 10px; background: #fff; border: 1px solid transparent; border-radius: 6px; box-shadow: none; } .tabs-header button { flex: 0 0 auto; padding: 8px 12px; border: none; background-color: transparent; font-size: 0.85em; font-weight: 600; cursor: pointer; transition: background-color 0.2s, color 0.2s, border-color 0.2s; border-radius: 6px; color: var(--color-text-secondary); min-height: 34px; line-height: 1.1; white-space: nowrap; } .tabs-header button:hover { background-color: #eef3fb; color: var(--color-text-primary); } .tabs-header button.active-tab { color: var(--color-accent-strong); background-color: #eaf1ff; border-color: rgba(37, 99, 235, 0.28); box-shadow: none; } .left-tabs button { font-size: 0.82em; } .tabs-header::-webkit-scrollbar { height: 6px; } .tabs-header::-webkit-scrollbar-track { background: transparent; } .tabs-header::-webkit-scrollbar-thumb { background: rgba(15, 23, 42, 0.18); border-radius: 999px; } .ps-stack { padding: 10px 15px; border-bottom: 1px solid var(--color-border); display: flex; flex-direction: column; gap: 10px; } .ps-stack-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px; } .ps-stack-header h4 { margin: 0; font-size: 1em; } .preview-button { font-size: 0.8em; padding: 3px 8px; } .ps-stack-preview-actions { display: flex; gap: 6px; flex: 0 0 auto; } .preview-button-secondary { background: var(--color-panel-muted); color: var(--color-text-primary); border: 1px solid var(--color-border); } .ps-stack-list { display: flex; flex-direction: column; gap: 0; min-height: 0; } .ps-stack-list-viewport { border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-panel-muted); } .ps-stack-list-content { list-style: none; padding-left: 0; margin: 0; } .ps-stack-item { font-family: var(--font-mono); font-size: 11px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; padding: 4px 10px; min-height: 24px; border-bottom: 1px solid rgba(15, 23, 42, 0.05); } .ps-stack-item:last-child { border-bottom: none; } .ps-stack-actions { display: flex; justify-content: flex-end; } .pair-item { padding: 10px 14px; min-height: 176px; border-bottom: 1px solid var(--color-border); gap: 10px; align-items: flex-start; } .pair-item:hover .pair-info { cursor: pointer; } .pair-info { font-size: 13px; flex-grow: 1; min-width: 0; } .visibility-toggle { background: none; border: 1px solid transparent; cursor: pointer; font-size: 11px; padding: 2px 6px; color: var(--color-text-secondary); transition: all 0.2s; border-radius: 3px; } .visibility-toggle:hover { background-color: var(--color-panel-muted); color: var(--color-text-primary); } .visibility-toggle.visible { color: var(--color-accent-strong); background-color: var(--color-accent-soft); border-color: #c7ddff; font-weight: 500; } .pair-info strong { font-family: var(--font-mono); font-size: 12px; display: block; margin-bottom: 5px; color: var(--color-text-primary); overflow-wrap: anywhere; } .pair-scenes { display: grid; gap: 3px; margin-bottom: 7px; font-family: var(--font-mono); font-size: 11px; color: var(--color-text-secondary); line-height: 1.35; } .pair-scenes span { overflow-wrap: anywhere; display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; overflow: hidden; } .pair-details { display: flex; flex-wrap: wrap; gap: 6px 10px; font-size: 12px; color: var(--color-text-secondary); } .pair-status-line { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 7px; font-size: 11px; } .pair-production-badge { display: inline-flex; align-items: center; min-height: 20px; padding: 2px 7px; border-radius: 4px; border: 1px solid var(--color-border); background: var(--color-panel-muted); color: var(--color-text-secondary); font-weight: 600; } .pair-production-badge.ready { color: #166534; background: #dcfce7; border-color: #bbf7d0; } .pair-production-badge.running { color: #92400e; background: #fef3c7; border-color: #fde68a; } .pair-production-badge.failed { color: #991b1b; background: #fee2e2; border-color: #fecaca; } .pair-production-badge.missing { color: #475569; background: #f1f5f9; } .pair-production-badge.unknown { color: #64748b; background: transparent; } .pair-engine-text { color: var(--color-text-secondary); font-family: var(--font-mono); } .pair-planning-layout { display: grid; grid-template-columns: 1fr; gap: 12px; min-height: 0; } .pair-planning-layout.with-map { grid-template-columns: minmax(360px, 1fr) minmax(320px, 0.9fr); align-items: start; } .pair-planning-list-pane { min-height: 0; display: flex; flex-direction: column; } .pair-planning-list-viewport { height: min(420px, calc(100vh - 310px)); max-height: 420px; min-height: 260px; flex: 0 0 auto; } .pair-planning-map-pane { position: sticky; top: 0; align-self: start; max-height: 420px; overflow: hidden; } .pair-planning-map-pane section { max-height: 420px; } .pair-planning-map-pane .leaflet-container { max-height: 372px; } .list-toolbar { display: flex; align-items: center; gap: 8px; padding: 8px 15px; border-bottom: 1px solid var(--color-border); background-color: var(--color-panel-muted); font-size: 12px; color: var(--color-text-secondary); } .list-toolbar.column-layout { flex-direction: column; align-items: stretch; gap: 10px; } .filter-banner { background-color: var(--color-accent-soft); border: 1px solid #c7ddff; color: var(--color-accent-strong); padding: 8px 12px; border-radius: 4px; display: flex; justify-content: space-between; align-items: center; font-size: 12px; } .clear-filter-btn { background-color: #fff; border: 1px solid #c7ddff; color: var(--color-accent-strong); padding: 2px 8px; font-size: 11px; cursor: pointer; } .clear-filter-btn:hover { background-color: #d8e7ff; } .toolbar-row { display: flex; gap: 8px; align-items: center; } .toolbar-row button.active-tool { background: var(--color-accent-soft); border-color: var(--color-accent); color: var(--color-accent-strong); } .filter-row { justify-content: space-between; } .filter-row input[type="range"] { flex-grow: 1; max-width: 120px; } .list-toolbar label { cursor: pointer; } .model-status-banner { background-color: #ecfdf3; color: #15803d; padding: 8px 12px; border-radius: 4px; margin-bottom: 15px; font-size: 12px; text-align: center; border: 1px solid #bbf7d0; } .log-entries { padding: 10px 15px; font-family: var(--font-mono); font-size: 12px; } .log-entry { display: flex; gap: 10px; margin-bottom: 5px; } .log-time { color: var(--color-text-secondary); flex-shrink: 0; } .log-message[data-log-type="success"] { color: var(--color-success); } .log-message[data-log-type="error"] { color: var(--color-danger); } .log-message[data-log-type="warn"] { color: var(--color-warning); } .empty-state { color: var(--color-text-secondary); text-align: center; padding: 2rem 1rem; font-size: 0.9em; } .leaflet-popup-content-wrapper { border-radius: 4px; border: 1px solid var(--color-border); box-shadow: var(--shadow-soft); } .leaflet-popup-content { font-size: 13px; line-height: 1.6; } .leaflet-popup-content strong { color: var(--color-text-primary); } .dinsar-popup { min-width: 240px; display: flex; flex-direction: column; gap: 2px; } .dinsar-popup-title { font-weight: 700; margin-bottom: 4px; color: var(--color-text-primary); } .dinsar-popup .mono { font-family: var(--font-mono); word-break: break-all; } .modal-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(15, 23, 42, 0.45); backdrop-filter: blur(6px); display: flex; justify-content: center; align-items: center; z-index: 1000; visibility: hidden; opacity: 0; transition: visibility 0s 0.2s, opacity 0.2s linear; } .modal-overlay.visible { visibility: visible; opacity: 1; transition-delay: 0s; } .modal-content { background-color: white; padding: 25px; border-radius: 8px; box-shadow: var(--shadow-panel); border: 1px solid var(--color-border); width: min(560px, calc(100vw - 24px)); max-height: calc(100vh - 24px); overflow-y: auto; color: var(--color-text-primary); } /* AI Report Modal Specific Styles */ .ai-report-modal .modal-content { width: 850px; max-width: 95vw; max-height: 90vh; display: flex; flex-direction: column; padding: 0; overflow: hidden; border: none; } .report-header { padding: 15px 25px; border-bottom: 1px solid var(--color-border); display: flex; justify-content: space-between; align-items: center; background-color: var(--color-panel-muted); flex-shrink: 0; } .report-header h3 { margin: 0; color: var(--color-accent-strong); font-size: 1.25rem; } .report-body { padding: 30px; overflow-y: auto; flex-grow: 1; background-color: white; } .report-footer { padding: 15px 25px; border-top: 1px solid var(--color-border); display: flex; justify-content: flex-end; background-color: var(--color-panel-muted); flex-shrink: 0; } .report-footer button { background-color: var(--color-accent); color: white; padding: 8px 20px; font-weight: 600; border: none; border-radius: 4px; cursor: pointer; } .report-footer button:hover { background-color: var(--color-accent-strong); } .close-btn { background-color: transparent; border: 1px solid var(--color-border); color: var(--color-text-secondary); padding: 4px 12px; border-radius: 4px; cursor: pointer; } .close-btn:hover { background-color: #fff5f5; color: var(--color-danger); border-color: #fca5a5; } .modal-content h3 { margin-top: 0; margin-bottom: 20px; text-align: center; } .form-group { margin-bottom: 15px; display: flex; flex-direction: column; } .form-group label { margin-bottom: 5px; font-weight: 500; } .form-group input, .form-group select { padding: 8px; border: 1px solid var(--color-border); border-radius: 4px; background-color: white; color: var(--color-text-primary); transition: border-color 0.2s, box-shadow 0.2s; } .form-group input:focus, .form-group select:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 3px var(--color-accent-glow); } .unified-date-picker { width: 100%; display: flex; align-items: center; gap: 8px; } .unified-date-picker .unified-date-picker-source-input { display: none !important; } .unified-date-picker .unified-date-picker-visible-input { width: 100%; min-width: 0; padding: 8px; border: 1px solid var(--color-border); border-radius: 4px; background-color: #fff; color: var(--color-text-primary); transition: border-color 0.2s, box-shadow 0.2s; } .unified-date-picker .unified-date-picker-visible-input:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 3px var(--color-accent-glow); } .unified-date-picker-clear { flex: 0 0 auto; padding: 6px 10px; border: 1px solid var(--color-border); border-radius: 4px; background: #fff; color: var(--color-text-secondary); cursor: pointer; transition: background-color 0.2s, color 0.2s, border-color 0.2s; } .unified-date-picker-clear:hover:not(:disabled) { background-color: var(--color-accent-soft); border-color: var(--color-accent); color: var(--color-accent-strong); } .unified-date-picker-clear:disabled { opacity: 0.6; cursor: not-allowed; } .flatpickr-calendar { font-family: var(--font-sans); } .flatpickr-year-jump { align-items: center; background: transparent; border: 0; color: inherit; cursor: pointer; display: inline-flex; flex: 0 0 auto; font-size: 12px; font-weight: 700; height: 34px; justify-content: center; line-height: 1; padding: 0 7px; } .flatpickr-year-jump:hover { color: var(--color-accent); } .flatpickr-day.selected, .flatpickr-day.startRange, .flatpickr-day.endRange, .flatpickr-day.selected.inRange, .flatpickr-day.startRange.inRange, .flatpickr-day.endRange.inRange, .flatpickr-day.selected:focus, .flatpickr-day.startRange:focus, .flatpickr-day.endRange:focus, .flatpickr-day.selected:hover, .flatpickr-day.startRange:hover, .flatpickr-day.endRange:hover { background: var(--color-accent); border-color: var(--color-accent); } .aoi-region-select-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 8px; width: 100%; min-width: 0; } .aoi-region-select-grid select { width: 100%; min-width: 0; max-width: 100%; } @media (max-width: 640px) { .aoi-region-select-grid { grid-template-columns: 1fr; } } .modal-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 20px; } .checkbox-group { flex-direction: row; align-items: center; gap: 10px; margin-bottom: 20px; } .checkbox-group label { margin-bottom: 0; font-weight: normal; cursor: pointer; } .checkbox-group input[type="checkbox"] { width: 16px; height: 16px; cursor: pointer; } .file-upload-button { display: inline-block; padding: 8px 12px; cursor: pointer; border: 1px solid var(--color-border); border-radius: 4px; background-color: #fff; text-align: center; transition: background-color 0.2s; font-size: 0.9em; } .file-upload-button:hover { background-color: var(--color-panel-muted); } .file-list { font-size: 12px; color: var(--color-text-secondary); margin-top: 8px; word-break: break-all; } .statistics-workspace { min-height: 100%; background: #eef2f7; padding: 16px; } .statistics-content { width: min(100%, 1480px); margin: 0 auto; display: flex; flex-direction: column; gap: 12px; } .statistics-hero { display: flex; justify-content: space-between; align-items: flex-start; gap: 18px; background: #ffffff; border: 1px solid #d5dfeb; border-radius: 8px; padding: 16px 18px; } .statistics-hero h1 { margin: 0; color: #0f172a; font-size: 23px; line-height: 1.25; letter-spacing: 0; } .statistics-hero p { margin: 6px 0 0; color: #475569; font-size: 13px; line-height: 1.6; max-width: 78ch; } .statistics-hero-actions { display: flex; align-items: center; justify-content: flex-end; gap: 10px; flex-wrap: wrap; flex: 0 0 auto; } .statistics-hero-actions span { color: #475569; font-size: 12px; font-weight: 700; } .statistics-hero-actions button { border: 1px solid #1d4ed8; border-radius: 6px; background: #1d4ed8; color: #ffffff; cursor: pointer; font-size: 12px; font-weight: 800; padding: 7px 12px; } .statistics-hero-actions button:disabled { border-color: #94a3b8; background: #94a3b8; cursor: wait; } .statistics-state { background: #ffffff; border: 1px solid #d5dfeb; border-radius: 8px; color: #475569; padding: 14px; text-align: center; } .statistics-state--error { color: #991b1b; background: #fef2f2; border-color: #fecaca; } .statistics-skeleton-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; } .statistics-skeleton { min-height: 130px; border: 1px solid #d5dfeb; border-radius: 8px; background: #ffffff; position: relative; overflow: hidden; } .statistics-skeleton::after { content: ""; position: absolute; inset: 0; background: linear-gradient(90deg, transparent, rgba(37, 99, 235, 0.08), transparent); transform: translateX(-100%); animation: statistics-skeleton 1.3s ease-out infinite; } @keyframes statistics-skeleton { to { transform: translateX(100%); } } .statistics-kpi-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: 10px; } .statistics-kpi-card { background: #ffffff; border: 1px solid #d5dfeb; border-radius: 8px; padding: 12px; min-width: 0; } .statistics-kpi-card--success { background: #f0fdf4; border-color: #bbf7d0; } .statistics-kpi-card--warning { background: #fffbeb; border-color: #fde68a; } .statistics-kpi-card--danger { background: #fef2f2; border-color: #fecaca; } .statistics-kpi-label { color: #475569; font-size: 12px; font-weight: 800; margin-bottom: 6px; } .statistics-kpi-main { display: flex; align-items: baseline; gap: 5px; min-width: 0; } .statistics-kpi-main strong { color: #0f172a; font-size: 25px; line-height: 1.05; font-weight: 850; } .statistics-kpi-main span { color: #475569; font-size: 12px; font-weight: 800; } .statistics-kpi-note { margin-top: 7px; color: #475569; font-size: 12px; line-height: 1.45; } .statistics-command-grid { display: grid; grid-template-columns: minmax(0, 2.05fr) minmax(360px, 0.95fr); gap: 12px; align-items: stretch; } .statistics-map-panel { min-height: 520px; background: #ffffff; border: 1px solid #d5dfeb; border-radius: 8px; padding: 14px; display: flex; flex-direction: column; gap: 12px; overflow: hidden; } .statistics-map-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; } .statistics-map-tools { display: flex; flex-direction: column; align-items: flex-end; gap: 8px; } .statistics-segmented-control { display: inline-flex; padding: 2px; border: 1px solid #cbd5e1; border-radius: 6px; background: #f8fafc; } .statistics-segmented-control button { border: 0; border-radius: 4px; background: transparent; color: #475569; cursor: pointer; font-size: 12px; font-weight: 800; line-height: 1; padding: 7px 10px; } .statistics-segmented-control button:hover { color: #0f172a; } .statistics-segmented-control button.is-active { background: #1d4ed8; color: #ffffff; } .statistics-map-header h2 { margin: 0; color: #0f172a; font-size: 17px; line-height: 1.35; } .statistics-map-header span { display: inline-block; margin-top: 4px; color: #475569; font-size: 12px; font-weight: 700; } .statistics-map-chart { flex: 1 1 auto; min-height: 440px; border: 1px solid #e2e8f0; border-radius: 6px; background: linear-gradient(#edf2f7 1px, transparent 1px), linear-gradient(90deg, #edf2f7 1px, transparent 1px), #f8fafc; background-size: 34px 34px; overflow: hidden; } .statistics-family-list { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; align-items: flex-start; } .statistics-family-item { display: grid; grid-template-columns: 10px minmax(72px, 1fr) minmax(42px, auto); column-gap: 6px; row-gap: 3px; align-items: center; color: #334155; border: 1px solid #d5dfeb; border-radius: 6px; background: #f8fafc; min-width: 144px; padding: 6px 8px; font-size: 11px; font-weight: 800; } .statistics-family-item strong { color: #0f172a; justify-self: end; font-variant-numeric: tabular-nums; white-space: nowrap; } .statistics-family-item em { grid-column: 2 / 4; justify-self: end; color: #64748b; font-style: normal; font-weight: 700; white-space: nowrap; } .statistics-family-swatch { width: 8px; height: 8px; border-radius: 999px; justify-self: center; } .statistics-side-stack, .statistics-dashboard-grid, .statistics-bottom-grid { display: grid; gap: 12px; } .statistics-side-stack { grid-template-rows: repeat(2, minmax(0, 1fr)); } .statistics-dashboard-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); } .statistics-bottom-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .statistics-section { background: #ffffff; border: 1px solid #d5dfeb; border-radius: 8px; padding: 12px; min-width: 0; min-height: 0; display: flex; flex-direction: column; gap: 10px; } .statistics-section-header { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; border-bottom: 1px solid #e2e8f0; padding-bottom: 8px; } .statistics-section-header h2 { margin: 0; color: #0f172a; font-size: 15px; line-height: 1.35; } .statistics-section-header span { color: #64748b; font-size: 12px; font-weight: 700; text-align: right; } .statistics-echart { position: relative; width: 100%; min-height: 260px; } .statistics-echart-canvas { width: 100%; height: 100%; min-height: inherit; } .statistics-chart-sm { min-height: 205px; } .statistics-chart-md { min-height: 245px; } .statistics-chart-empty { position: absolute; inset: 0; display: grid; place-items: center; color: #64748b; font-size: 13px; } .statistics-chart-empty--error { color: #b91c1c; background: rgba(255, 255, 255, 0.78); text-align: center; } .statistics-orbit-summary { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; } .statistics-orbit-summary div { border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 8px; } .statistics-orbit-summary span { display: block; color: #64748b; font-size: 12px; } .statistics-orbit-summary strong { display: block; margin-top: 3px; color: #0f172a; font-size: 17px; } .statistics-mini-bars { display: grid; gap: 8px; } .statistics-mini-bars div { position: relative; display: grid; grid-template-columns: 82px 56px 1fr; gap: 8px; align-items: center; color: #334155; font-size: 12px; font-weight: 800; } .statistics-mini-bars i { display: block; height: 9px; border-radius: 999px; background: #16a34a; } .statistics-run-list, .statistics-inventory-list { display: grid; gap: 8px; max-height: 310px; overflow: auto; padding-right: 2px; } .statistics-run-row, .statistics-inventory-row { display: grid; grid-template-columns: minmax(0, 1fr) auto auto; gap: 10px; align-items: center; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 8px; min-width: 0; } .statistics-run-row strong, .statistics-inventory-row strong { display: block; color: #0f172a; font-size: 12px; line-height: 1.35; overflow-wrap: anywhere; } .statistics-run-row span, .statistics-inventory-row span { display: block; color: #64748b; font-size: 11px; margin-top: 2px; } .statistics-run-row b, .statistics-inventory-row b { font-size: 11px; } .statistics-run-row em, .statistics-inventory-row em { color: #475569; font-style: normal; font-size: 12px; font-weight: 800; } .statistics-empty-line { color: #64748b; font-size: 13px; padding: 16px 4px; text-align: center; } .statistics-footer-note { display: flex; justify-content: space-between; gap: 12px; flex-wrap: wrap; color: #64748b; font-size: 12px; font-weight: 700; padding: 2px 2px 6px; } @media (prefers-reduced-motion: reduce) { .statistics-skeleton::after { animation: none; } } .chart-container-full { grid-column: 1 / -1; /* Span full width */ background: var(--color-panel-muted); border: 1px solid var(--color-border); border-radius: 6px; padding: 15px; display: flex; justify-content: center; align-items: center; min-height: 400px; } .date-info { display: flex; align-items: center; gap: 5px; margin-top: 4px; font-family: var(--font-mono); font-size: 11px; color: var(--color-text-secondary); width: 100%; } .date-tag { background-color: var(--color-panel-muted); padding: 1px 4px; border-radius: 3px; border: 1px solid var(--color-border); } .date-arrow { color: var(--color-text-muted); font-size: 10px; } /* 地图上的日期标注样式 */ .leaflet-tooltip.date-tooltip { background-color: rgba(255, 255, 255, 0.9); border: 1px solid var(--color-border-strong); color: var(--color-text-primary); font-family: var(--font-mono); font-size: 11px; padding: 2px 6px; border-radius: 4px; box-shadow: 0 2px 4px rgba(0,0,0,0.1); white-space: nowrap; } .leaflet-tooltip.date-tooltip::before { border-top-color: var(--color-border-strong); } /* AI Analysis Panel Styles */ .ai-analysis-panel { padding: 15px; display: flex; flex-direction: column; gap: 20px; } .panel-section h4 { margin: 0 0 10px 0; color: var(--color-text-primary); } .full-width { width: 100%; } .analysis-result-container { background-color: var(--color-panel-muted); border: 1px solid var(--color-border); border-radius: 6px; padding: 15px; display: flex; flex-direction: column; gap: 10px; } .analysis-result-container h5 { margin: 0; color: var(--color-accent-strong); border-bottom: 1px solid var(--color-border); padding-bottom: 8px; } .markdown-body { font-size: 13px; line-height: 1.6; color: var(--color-text-primary); max-height: 500px; overflow-y: auto; } .markdown-body h1, .markdown-body h2, .markdown-body h3 { margin-top: 16px; margin-bottom: 8px; font-weight: 600; line-height: 1.25; color: var(--color-text-primary); } .markdown-body h3 { font-size: 1.15em; border-bottom: 2px solid var(--color-border); padding-bottom: 4px; color: var(--color-accent-strong); margin-top: 20px; } .markdown-body p { margin: 0 0 12px 0; text-align: justify; } .markdown-body ul, .markdown-body ol { padding-left: 20px; margin-bottom: 12px; } .markdown-body li { margin-bottom: 4px; } .markdown-body strong { color: var(--color-text-primary); font-weight: 600; } .markdown-body blockquote { padding: 0.8em 1em; color: var(--color-text-secondary); border-left: 0.4em solid var(--color-border-strong); background-color: var(--color-panel-muted); margin: 0 0 16px 0; font-style: italic; } /* 针对免责声明的特殊样式 */ .markdown-body strong.disclaimer { color: var(--color-danger); display: block; margin-top: 10px; } .markdown-body code { padding: 0.2em 0.4em; margin: 0; font-size: 85%; background-color: var(--color-panel-muted); border-radius: 3px; font-family: var(--font-mono); } .small { padding: 4px 8px; font-size: 12px; } .button-group { display: flex; gap: 5px; } .danger-text { color: var(--color-danger) !important; border-color: var(--color-danger) !important; } .danger-text:hover { background-color: #fff5f5 !important; } .analysis-capture-list { display: flex; flex-direction: column; gap: 15px; margin-top: 15px; } .capture-item { background: var(--color-panel-muted); border: 1px solid var(--color-border); border-radius: 6px; padding: 10px; display: flex; flex-direction: column; gap: 10px; } .capture-controls { display: flex; justify-content: space-between; align-items: center; } .config-item { display: flex; align-items: center; gap: 8px; font-size: 12px; cursor: pointer; } .config-item input[type="checkbox"] { cursor: pointer; } .capture-preview { position: relative; width: 100%; height: 120px; border-radius: 4px; overflow: hidden; border: 1px solid var(--color-border); background: #fff; } .capture-preview img { width: 100%; height: 100%; object-fit: cover; } .status-tag { position: absolute; top: 5px; right: 5px; background: var(--color-success); color: white; font-size: 10px; padding: 2px 6px; border-radius: 10px; box-shadow: 0 2px 4px rgba(0,0,0,0.2); } .capture-preview.placeholder { display: flex; flex-direction: column; justify-content: center; align-items: center; background: var(--color-panel-muted); color: var(--color-text-secondary); font-size: 12px; gap: 10px; } .spinner { width: 20px; height: 20px; border: 2px solid var(--color-border); border-top: 2px solid var(--color-accent); border-radius: 50%; animation: spin 1s linear infinite; } @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* Global task center */ .global-task-overlay { position: fixed; right: 18px; bottom: 18px; z-index: 1200; color: #0f172a; pointer-events: none; } @media (max-width: 980px) { .statistics-kpi-grid, .statistics-grid, .statistics-plan-grid { grid-template-columns: 1fr; } .statistics-header { flex-direction: column; } .statistics-header-meta { justify-content: flex-start; } } .task-center-button { pointer-events: auto; display: inline-flex; align-items: center; gap: 8px; min-height: 38px; padding: 8px 12px; border: 1px solid #cbd5e1; border-radius: 8px; background: #ffffff; color: #0f172a; box-shadow: 0 8px 24px rgba(15, 23, 42, 0.18); font-size: 12px; cursor: pointer; } .task-center-button strong { color: #2563eb; font-family: var(--font-mono); } .task-center-dot { width: 8px; height: 8px; border-radius: 999px; background: #2563eb; box-shadow: 0 0 0 4px rgba(37, 99, 235, 0.12); animation: pulse 1.6s ease-in-out infinite; } @keyframes pulse { 0%, 100% { opacity: 0.55; } 50% { opacity: 1; } } .overlay-content { pointer-events: auto; background: #ffffff; padding: 14px; border-radius: 8px; width: min(440px, calc(100vw - 36px)); max-height: min(70vh, 620px); overflow: auto; text-align: left; box-shadow: 0 18px 44px rgba(15, 23, 42, 0.24); border: 1px solid #cbd5e1; } .loading-spinner-large { width: 60px; height: 60px; border: 4px solid rgba(255, 255, 255, 0.1); border-top-color: rgba(37, 99, 235, 0.9); border-radius: 50%; animation: spin 1s linear infinite; margin: 0 auto 20px; } .task-center-header { display: flex; justify-content: space-between; gap: 12px; align-items: flex-start; margin-bottom: 12px; } .task-center-header h3 { margin: 0; font-size: 15px; color: #0f172a; } .task-center-header p { margin: 4px 0 0; font-size: 12px; line-height: 1.5; color: #64748b; } .task-center-close { width: 28px; height: 28px; border: 1px solid #cbd5e1; border-radius: 6px; background: #f8fafc; color: #334155; cursor: pointer; font-size: 18px; line-height: 1; } .active-tasks-container { display: flex; flex-direction: column; gap: 10px; margin-bottom: 12px; text-align: left; } .task-runtime-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; margin-bottom: 12px; } .task-runtime-summary > div { border: 1px solid #e2e8f0; border-radius: 8px; background: #f8fafc; padding: 8px; min-width: 0; } .task-runtime-summary span { display: block; color: #64748b; font-size: 11px; margin-bottom: 3px; } .task-runtime-summary strong { color: #0f172a; font-size: 15px; font-family: var(--font-mono); } .active-jobs-container { display: flex; flex-direction: column; gap: 6px; margin-bottom: 12px; } .job-runtime-row { display: grid; grid-template-columns: auto minmax(0, 1fr) minmax(92px, 0.8fr); align-items: center; gap: 8px; padding: 7px 8px; border: 1px solid #e2e8f0; border-radius: 7px; background: #ffffff; font-size: 12px; } .job-status-chip { display: inline-flex; align-items: center; justify-content: center; min-width: 58px; padding: 2px 6px; border-radius: 999px; border: 1px solid #cbd5e1; color: #475569; background: #f8fafc; font-family: var(--font-mono); font-size: 11px; } .job-status-chip.running { border-color: rgba(37, 99, 235, 0.22); color: #1d4ed8; background: rgba(37, 99, 235, 0.08); } .job-status-chip.retry { border-color: rgba(217, 119, 6, 0.24); color: #b45309; background: rgba(245, 158, 11, 0.1); } .job-runtime-title, .job-runtime-worker { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .job-runtime-title { color: #334155; font-weight: 600; } .job-runtime-worker { color: #64748b; text-align: right; } .task-progress-item { background: #f8fafc; padding: 10px; border-radius: 8px; border: 1px solid #e2e8f0; } .task-progress-item--muted { background: #ffffff; } .task-info-row { display: flex; justify-content: space-between; margin-bottom: 10px; font-size: 14px; } .task-label { font-weight: 600; color: #334155; } .task-percent { color: var(--color-accent); font-family: var(--font-mono); font-weight: bold; } .task-progress-bar { height: 7px; background-color: #e2e8f0; border-radius: 4px; overflow: hidden; margin-bottom: 8px; } .task-progress-fill { height: 100%; background-color: var(--color-accent); box-shadow: 0 0 14px rgba(37, 99, 235, 0.6); } .task-status-msg { margin: 0; font-size: 12px; color: #64748b; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .overlay-footer-hint { font-size: 12px; color: #64748b; margin: 0; line-height: 1.5; } .panel-error-banner { background-color: #fee2e2; border: 1px solid #fecaca; color: #b91c1c; padding: 8px 12px; border-radius: 4px; font-size: 12px; display: flex; justify-content: space-between; align-items: center; animation: slideDown 0.3s ease-out; margin-bottom: 10px; } .pairing-alert { margin: 12px 15px 0; padding: 10px 12px; border-radius: 8px; border: 1px solid transparent; box-shadow: var(--shadow-soft); font-size: 12px; line-height: 1.5; display: flex; flex-direction: column; gap: 6px; } .pairing-alert.warning { background-color: #fffbeb; border-color: #f59e0b; color: #92400e; } .pairing-alert.danger { background-color: #fee2e2; border-color: #dc2626; color: #991b1b; } .pairing-alert-header { display: flex; align-items: center; justify-content: space-between; gap: 8px; } .pairing-alert-title { font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; font-size: 11px; } .pairing-alert-badge { background: rgba(220, 38, 38, 0.12); color: #b91c1c; border: 1px solid rgba(220, 38, 38, 0.4); padding: 2px 8px; border-radius: 999px; font-size: 10px; font-weight: 700; } .pairing-alert ul { margin: 0; padding-left: 18px; } .pairing-alert li { margin-bottom: 4px; } .panel-error-banner button { background: none; border: none; color: #b91c1c; font-size: 16px; cursor: pointer; padding: 0 5px; } @keyframes slideDown { from { transform: translateY(-10px); opacity: 0; } to { transform: translateY(0); opacity: 1; } } /* Health Check Panel */ .health-panel { padding: 16px; background: #f8fafc; border-top: 1px solid var(--color-border); height: 100%; display: flex; flex-direction: column; gap: 14px; overflow: auto; } .health-header { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 2px 0 4px; } .health-title { font-size: 1.15em; font-weight: 700; color: var(--color-text-primary); line-height: 1.3; } .health-subtitle { font-size: 0.85em; color: var(--color-text-secondary); margin-top: 2px; } .health-refresh { padding: 7px 12px; background: var(--color-accent); color: #fff; border: none; border-radius: 6px; cursor: pointer; font-size: 0.85em; } .health-refresh:disabled { opacity: 0.7; cursor: not-allowed; } .health-summary { display: grid; grid-template-columns: repeat(3, minmax(150px, 1fr)); gap: 10px; padding: 12px; border-radius: 8px; background: #ffffff; border: 1px solid var(--color-border); } .health-summary-item { display: flex; justify-content: space-between; align-items: center; gap: 10px; font-size: 0.9em; color: var(--color-text-secondary); min-width: 0; } .health-summary-item > span:last-child { text-align: right; } .health-signal-row { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 8px; padding-top: 10px; border-top: 1px solid var(--color-border); } .health-signal { display: grid; gap: 2px; padding: 8px 10px; border-radius: 6px; border: 1px solid var(--color-border); background: #f8fafc; } .health-signal strong { font-size: 0.9em; color: var(--color-text-primary); } .health-signal-label, .health-signal-detail { color: var(--color-text-muted); font-size: 0.76em; } .health-signal.ok { border-color: rgba(22, 163, 74, 0.26); background: rgba(22, 163, 74, 0.06); } .health-signal.fail { border-color: rgba(220, 38, 38, 0.26); background: rgba(220, 38, 38, 0.06); } .health-sections { display: grid; gap: 14px; } .health-section { display: grid; gap: 10px; } .health-section-header { display: flex; justify-content: space-between; gap: 12px; align-items: flex-end; padding: 0 2px; } .health-section-header h3 { margin: 0; font-size: 0.98em; color: var(--color-text-primary); } .health-section-header p { margin: 3px 0 0; color: var(--color-text-secondary); font-size: 0.82em; line-height: 1.5; } .health-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 10px; } .health-grid--ops { grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); } .health-card { padding: 12px; border-radius: 8px; border: 1px solid var(--color-border); background: #fff; display: flex; flex-direction: column; gap: 6px; } .health-card-title { font-weight: 700; color: var(--color-text-primary); margin-bottom: 2px; font-size: 0.95em; } .health-card-row { display: flex; justify-content: space-between; gap: 12px; font-size: 0.85em; color: var(--color-text-secondary); } .health-card-row > span:last-child { text-align: right; word-break: break-word; } .health-card-note { font-size: 0.8em; color: var(--color-text-muted); word-break: break-all; } .health-card-note.error { color: var(--color-danger); } .health-card-note.warn { color: #92400e; } .health-card-note.ok { color: var(--color-success); } .health-legacy-diagnostic { background: #f8fafc; } .health-legacy-diagnostic summary { display: flex; align-items: center; justify-content: space-between; gap: 10px; cursor: pointer; font-weight: 700; color: var(--color-text-primary); list-style: none; } .health-legacy-diagnostic summary::-webkit-details-marker { display: none; } .health-legacy-diagnostic[open] summary { padding-bottom: 8px; border-bottom: 1px solid var(--color-border); } .health-inline-button { padding: 4px 9px; border-radius: 6px; border: 1px solid var(--color-border); background: #ffffff; color: var(--color-text-secondary); font-size: 0.78em; cursor: pointer; } .health-inline-button:disabled { opacity: 0.6; cursor: not-allowed; } .health-maintenance-stack { display: grid; gap: 10px; } .health-action-card { display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 12px; border: 1px solid var(--color-border); border-radius: 8px; background: #fff; } .health-action-card h4 { margin: 0; font-size: 0.92em; color: var(--color-text-primary); } .health-action-card p { margin: 4px 0 0; color: var(--color-text-secondary); font-size: 0.82em; line-height: 1.5; } .health-action-button { flex: 0 0 auto; padding: 7px 12px; border: 1px solid #1d4ed8; border-radius: 6px; background: #1d4ed8; color: #fff; font-size: 0.82em; font-weight: 700; cursor: pointer; } .health-action-button:disabled { opacity: 0.62; cursor: not-allowed; } .log-management-panel { display: grid; gap: 10px; padding: 12px; border: 1px solid var(--color-border); border-radius: 8px; background: #fff; } .log-management-header { display: flex; align-items: flex-end; justify-content: space-between; gap: 16px; } .log-management-header h3, .log-modal-header h3 { margin: 0; color: var(--color-text-primary); font-size: 0.95em; } .log-management-header p, .log-modal-header p { margin: 4px 0 0; color: var(--color-text-secondary); font-size: 0.82em; line-height: 1.5; } .log-management-controls { display: flex; align-items: flex-end; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } .ops-field { display: grid; gap: 4px; color: var(--color-text-secondary); font-size: 0.78em; } .ops-field select, .log-modal-tools input { min-height: 32px; border: 1px solid var(--color-border); border-radius: 6px; background: #fff; color: var(--color-text-primary); font-size: 0.86em; } .ops-field select { min-width: 120px; padding: 5px 28px 5px 9px; } .log-modal-tools input { min-width: 220px; flex: 1 1 260px; padding: 6px 10px; } .ops-button { min-height: 32px; padding: 6px 11px; border-radius: 6px; border: 1px solid var(--color-border); background: #fff; color: var(--color-text-primary); font-size: 0.82em; font-weight: 700; cursor: pointer; white-space: nowrap; } .ops-button--primary { border-color: #1d4ed8; background: #1d4ed8; color: #fff; } .ops-button--secondary { border-color: var(--color-border); background: #f8fafc; } .ops-button--danger { border-color: rgba(220, 38, 38, 0.28); background: rgba(220, 38, 38, 0.08); color: var(--color-danger); } .ops-button--sm { min-height: 28px; padding: 4px 9px; font-size: 0.78em; } .ops-button:disabled { opacity: 0.58; cursor: not-allowed; } .ops-message { padding: 8px 10px; border-radius: 6px; font-size: 0.82em; } .ops-message--success { border: 1px solid rgba(22, 163, 74, 0.25); background: rgba(22, 163, 74, 0.08); color: var(--color-success); } .ops-message--error { border: 1px solid rgba(220, 38, 38, 0.25); background: rgba(220, 38, 38, 0.08); color: var(--color-danger); } .log-empty-state { display: flex; min-height: 96px; align-items: center; justify-content: center; border: 1px dashed var(--color-border); border-radius: 8px; color: var(--color-text-secondary); font-size: 0.86em; background: #f8fafc; } .log-table-wrap { overflow-x: auto; border: 1px solid var(--color-border); border-radius: 8px; } .log-table { width: 100%; border-collapse: collapse; min-width: 760px; background: #fff; } .log-table th { padding: 9px 10px; background: #f8fafc; border-bottom: 1px solid var(--color-border); color: var(--color-text-secondary); font-size: 0.78em; font-weight: 700; text-align: left; } .log-table td { padding: 9px 10px; border-bottom: 1px solid #eef2f7; color: var(--color-text-primary); font-size: 0.82em; vertical-align: middle; } .log-table tbody tr:last-child td { border-bottom: 0; } .log-file-name, .log-number-cell { font-family: Consolas, Monaco, "Courier New", monospace; } .log-file-name { max-width: 420px; word-break: break-all; color: #0f172a; } .log-number-cell { text-align: right; white-space: nowrap; } .log-type-badge { display: inline-flex; align-items: center; min-height: 22px; padding: 2px 8px; border-radius: 999px; font-size: 0.75em; font-weight: 700; border: 1px solid transparent; white-space: nowrap; } .log-type-badge--app { color: #1d4ed8; background: rgba(37, 99, 235, 0.1); border-color: rgba(37, 99, 235, 0.22); } .log-type-badge--task { color: #047857; background: rgba(5, 150, 105, 0.1); border-color: rgba(5, 150, 105, 0.22); } .log-type-badge--error { color: var(--color-danger); background: rgba(220, 38, 38, 0.1); border-color: rgba(220, 38, 38, 0.22); } .log-type-badge--other { color: #475569; background: #f1f5f9; border-color: var(--color-border); } .log-row-actions { display: flex; justify-content: center; gap: 6px; } .log-modal-backdrop { position: fixed; inset: 0; z-index: 1100; display: flex; align-items: center; justify-content: center; padding: 24px; background: rgba(15, 23, 42, 0.48); } .log-modal { width: min(1180px, 100%); max-height: 90vh; display: flex; flex-direction: column; overflow: hidden; border-radius: 8px; background: #fff; border: 1px solid var(--color-border); } .log-modal-header { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding: 14px 16px; border-bottom: 1px solid var(--color-border); } .log-modal-header h3 { font-family: Consolas, Monaco, "Courier New", monospace; word-break: break-all; } .log-modal-tools { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 16px; border-bottom: 1px solid var(--color-border); background: #f8fafc; } .log-page-info { color: var(--color-text-secondary); font-size: 0.8em; white-space: nowrap; } .log-content-view { flex: 1; overflow: auto; background: #111827; padding: 14px 16px; } .log-content-view pre { margin: 0; color: #d1d5db; font-family: Consolas, Monaco, "Courier New", monospace; font-size: 0.76em; line-height: 1.55; white-space: pre-wrap; word-break: break-word; } .health-badge { display: inline-flex; align-items: center; justify-content: center; padding: 2px 8px; border-radius: 999px; font-size: 0.75em; font-weight: 600; border: 1px solid transparent; } .health-badge.ok { background: rgba(22, 163, 74, 0.12); color: var(--color-success); border-color: rgba(22, 163, 74, 0.4); } .health-badge.fail { background: rgba(220, 38, 38, 0.12); color: var(--color-danger); border-color: rgba(220, 38, 38, 0.4); } .health-error { padding: 8px 10px; border-radius: 8px; background: rgba(220, 38, 38, 0.08); color: var(--color-danger); font-size: 0.85em; border: 1px solid rgba(220, 38, 38, 0.2); } .health-empty { font-size: 0.9em; color: var(--color-text-muted); } @media (max-width: 760px) { .health-summary { grid-template-columns: 1fr; } .health-header, .health-section-header { align-items: flex-start; flex-direction: column; } .health-grid { grid-template-columns: 1fr; } } /* Top Status Bar */ .top-status-bar { display: grid; grid-template-columns: minmax(320px, 1.4fr) minmax(260px, 0.9fr) minmax(320px, 1.2fr); align-items: center; gap: 16px; padding: 9px 16px; background: rgba(255, 255, 255, 0.95); border-bottom: 1px solid var(--color-border); box-shadow: var(--shadow-soft); } .status-brand { display: flex; align-items: center; gap: 10px; min-width: 0; } .status-brand-logo { width: 38px; height: 38px; object-fit: contain; flex: 0 0 auto; } .status-brand-copy { min-width: 0; } .brand-org { font-size: 0.82em; color: var(--color-text-secondary); line-height: 1.3; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .brand-title { font-weight: 700; color: var(--color-text-primary); font-size: 1.05em; line-height: 1.35; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .status-system-meta { display: flex; flex-wrap: wrap; align-items: center; justify-content: center; gap: 8px; color: var(--color-text-secondary); font-size: 0.8em; min-width: 0; } .status-license-chip { display: inline-flex; align-items: center; padding: 3px 7px; border-radius: 999px; border: 1px solid var(--color-border); background: var(--color-panel-muted); color: var(--color-text-secondary); line-height: 1.2; } .status-license-chip.ok { border-color: rgba(22, 163, 74, 0.24); background: rgba(22, 163, 74, 0.08); color: #166534; } .status-license-chip.fail { border-color: rgba(220, 38, 38, 0.24); background: rgba(220, 38, 38, 0.08); color: #991b1b; } .status-actions { display: flex; justify-content: flex-end; align-items: center; gap: 12px; min-width: 0; } .status-lang-switch { display: inline-flex; align-items: center; border: 1px solid var(--color-border); border-radius: 8px; overflow: hidden; background: var(--color-panel-bg); flex-shrink: 0; } .status-lang-btn { border: none; background: transparent; color: var(--color-text-secondary); font-size: 0.8em; padding: 6px 10px; cursor: pointer; min-width: 44px; display: inline-flex; align-items: center; justify-content: center; white-space: nowrap; line-height: 1; } .status-lang-btn + .status-lang-btn { border-left: 1px solid var(--color-border); } .status-lang-btn.active { background: rgba(37, 99, 235, 0.1); color: var(--color-accent); font-weight: 600; } .status-task { display: flex; flex-direction: column; gap: 4px; font-size: 0.8em; color: var(--color-text-secondary); padding: 4px 8px; border-radius: 6px; min-width: 132px; } .status-task.has-active-tasks { background: rgba(24, 144, 255, 0.1); color: #1890ff; } .status-task small { color: var(--color-text-muted); font-size: 0.86em; line-height: 1.25; white-space: nowrap; } .status-license { font-size: 0.75em; color: var(--color-text-muted); white-space: nowrap; } .status-task-bar { width: 120px; height: 6px; border-radius: 999px; background: var(--color-panel-muted); overflow: hidden; } .status-task-fill { height: 100%; background: var(--color-accent); } .status-refresh { padding: 6px 10px; border-radius: 6px; border: 1px solid var(--color-border); background: var(--color-panel-bg); font-size: 0.8em; cursor: pointer; color: var(--color-text-secondary); } .status-refresh:disabled { opacity: 0.6; cursor: not-allowed; } @media (max-width: 1080px) { .top-status-bar { grid-template-columns: 1fr; align-items: stretch; } .status-system-meta { justify-content: flex-start; } .status-actions { justify-content: flex-start; flex-wrap: wrap; } } /* Workflow Sidebar */ .workflow-header { padding: 12px 12px 8px; border-bottom: 1px solid var(--color-border); background: var(--color-panel-bg); display: block; } .workflow-title { font-size: 0.85em; text-transform: uppercase; letter-spacing: 0.06em; color: var(--color-text-muted); margin-bottom: 8px; } .workflow-title.tool-title { margin-top: 12px; } .workflow-steps, .workflow-tools { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px 10px; } .workflow-steps button, .workflow-tools button { display: flex; align-items: center; gap: 8px; padding: 8px 10px; min-height: 36px; border-radius: 8px; border: 1px solid var(--color-border); background: var(--color-panel-muted); color: var(--color-text-secondary); font-size: 0.85em; cursor: pointer; transition: all 0.2s ease; width: 100%; } .workflow-steps button:hover, .workflow-tools button:hover { border-color: var(--color-border-strong); background: #fff; } .workflow-steps button.active-step, .workflow-tools button.active-tool { background: var(--color-accent-soft); border-color: var(--color-accent); color: var(--color-accent-strong); } .step-index { width: 20px; height: 20px; border-radius: 50%; background: rgba(37, 99, 235, 0.15); color: var(--color-accent); display: inline-flex; align-items: center; justify-content: center; font-size: 0.75em; font-weight: 700; } /* Panel cards */ .panel-card { padding: 12px; border-radius: 10px; border: 1px solid var(--color-border); background: var(--color-panel-bg); box-shadow: var(--shadow-soft); } .panel-card-title { font-weight: 600; color: var(--color-text-primary); margin-bottom: 6px; } .panel-card-desc { font-size: 0.85em; color: var(--color-text-muted); margin: 0; } .panel-card-row { display: flex; justify-content: space-between; font-size: 0.85em; color: var(--color-text-secondary); margin-top: 6px; } .asset-inventory-panel { width: 100%; max-width: 1280px; margin: 0 auto; padding: 6px 0 24px; display: flex; flex-direction: column; gap: 14px; min-width: 0; } .asset-toolbar { display: flex; justify-content: space-between; gap: 18px; align-items: flex-start; padding: 16px 18px; border-radius: 12px; border: 1px solid var(--color-border); background: #fff; } .asset-toolbar h3 { margin: 0; font-size: 18px; line-height: 1.35; color: var(--color-text-primary); } .asset-toolbar p { max-width: 76ch; margin: 8px 0 0; color: var(--color-text-secondary); font-size: 13px; line-height: 1.7; } .asset-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; } .asset-actions select, .asset-actions button { height: 30px; font-size: 12px; } .asset-message { border: 1px solid var(--color-border); background: var(--color-accent-soft); color: var(--color-accent-strong); border-radius: 6px; padding: 8px 10px; font-size: 12px; word-break: break-word; } .asset-message--error { background: #fee2e2; color: #991b1b; border-color: #fecaca; } .asset-metrics { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 10px; } .asset-metric { border: 1px solid var(--color-border); border-radius: 8px; padding: 8px; background: #f8fafc; } .asset-metric span, .asset-metric small { display: block; color: var(--color-text-muted); font-size: 11px; } .asset-metric strong { display: block; margin: 2px 0; font-size: 20px; color: var(--color-text-primary); } .asset-root-strip { display: flex; flex-direction: column; gap: 6px; } .asset-root-item { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; align-items: center; border: 1px solid var(--color-border); border-radius: 6px; padding: 7px 8px; background: #fff; } .asset-root-item strong, .asset-root-item span { display: block; min-width: 0; } .asset-root-item span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--color-text-muted); font-size: 11px; } .asset-tabbar { display: flex; gap: 6px; } .asset-tabbar button { flex: 1; font-size: 12px; padding: 7px 6px; } .asset-tabbar button.active-tab { background: var(--color-accent); color: #fff; border-color: var(--color-accent-strong); } .asset-table-wrap { overflow-x: auto; border: 1px solid var(--color-border); border-radius: 8px; background: #fff; } .asset-table { width: 100%; min-width: 760px; border-collapse: collapse; font-size: 12px; } .asset-table th, .asset-table td { border-bottom: 1px solid var(--color-border); padding: 7px 8px; text-align: left; vertical-align: top; } .asset-table th { background: #f8fafc; color: var(--color-text-secondary); font-weight: 700; } .asset-table td small { display: block; margin-top: 2px; color: var(--color-text-muted); max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .asset-inline-action { min-width: 46px; height: 26px; padding: 0 8px; font-size: 12px; line-height: 1; } .asset-action-placeholder { color: var(--color-text-muted); font-size: 12px; } .asset-badge { display: inline-flex; align-items: center; max-width: 100%; border-radius: 999px; padding: 2px 7px; font-size: 11px; font-weight: 700; border: 1px solid var(--color-border); white-space: nowrap; } .asset-badge--ok { background: #dcfce7; color: #166534; border-color: #bbf7d0; } .asset-badge--warn { background: #fef3c7; color: #92400e; border-color: #fde68a; } .asset-badge--bad { background: #fee2e2; color: #991b1b; border-color: #fecaca; } .asset-badge--neutral { background: #f1f5f9; color: #475569; } .asset-pager { display: flex; align-items: center; justify-content: flex-end; gap: 8px; padding: 8px; color: var(--color-text-muted); font-size: 12px; } .asset-pager button { padding: 5px 9px; font-size: 12px; } .data-ingest-panel { width: 100%; max-width: 1280px; margin: 0 auto; padding: 6px 0 24px; background: #f8fafc; display: flex; flex-direction: column; height: 100%; overflow: hidden; } .data-ingest-header { display: flex; justify-content: space-between; gap: 18px; align-items: flex-start; margin-bottom: 14px; padding: 16px 18px; border-radius: 12px; border: 1px solid var(--color-border); background: #fff; } .data-ingest-header h3 { margin: 0; color: var(--color-text-primary); font-size: 18px; line-height: 1.35; } .data-ingest-header p { max-width: 76ch; margin: 8px 0 0; color: var(--color-text-secondary); font-size: 13px; line-height: 1.7; } .data-ingest-signals { display: grid; grid-template-columns: repeat(2, minmax(116px, 1fr)); gap: 8px; min-width: 280px; } .data-ingest-notice { margin: 0 0 12px; padding: 10px 12px; border-radius: 8px; border: 1px solid var(--color-border); background: #fff; color: var(--color-text-secondary); font-size: 13px; line-height: 1.6; } .data-ingest-notice.ok { border-color: rgba(22, 163, 74, 0.22); background: rgba(240, 253, 244, 0.82); color: #166534; } .data-ingest-notice.warn { border-color: rgba(245, 158, 11, 0.28); background: #fffbeb; color: #92400e; } .data-ingest-directory summary { cursor: pointer; font-weight: 700; color: var(--color-text-primary); } .data-ingest-directory p { margin: 8px 0 10px; color: var(--color-text-muted); font-size: 12px; line-height: 1.6; } @media (max-width: 1200px) { .asset-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); } .top-status-bar { grid-template-columns: 1fr; text-align: left; } .status-actions { justify-content: flex-start; } } @media (max-width: 760px) { .data-ingest-header { flex-direction: column; } .data-ingest-signals { grid-template-columns: 1fr; min-width: 0; width: 100%; } .asset-toolbar { flex-direction: column; } .asset-actions { justify-content: flex-start; } .asset-metrics { grid-template-columns: 1fr; } } .login-page-wrapper { min-height: 100vh; background: #020617; display: grid; padding: 0; } .login-shell { grid-area: 1 / 1; width: 100%; min-height: 100vh; display: grid; grid-template-columns: clamp(360px, 32vw, 480px) minmax(0, 1fr); background: #ffffff; overflow: hidden; } .login-card { width: 100%; min-height: 100vh; background: linear-gradient(180deg, #ffffff 0%, #f8fafc 100%); border-right: 1px solid #dbe4f3; padding: clamp(32px, 5vh, 56px) clamp(28px, 4vw, 52px); display: flex; flex-direction: column; justify-content: center; gap: 16px; } .login-card--checking { place-self: center; width: min(420px, 94vw); min-height: auto; border: 1px solid #dbe4f3; border-radius: 14px; box-shadow: var(--shadow-panel); padding: 28px; } .login-card h2 { margin: 0; font-size: 1.55em; line-height: 1.25; color: var(--color-text-primary); } .login-card-header { display: flex; flex-direction: column; gap: 8px; } .login-brand-tag { width: fit-content; border-radius: 999px; border: 1px solid rgba(37, 99, 235, 0.25); background: rgba(37, 99, 235, 0.08); color: var(--color-accent-strong); font-weight: 700; font-size: 0.75em; letter-spacing: 0; padding: 4px 10px; } .login-subtitle { margin: 0; color: var(--color-text-secondary); font-size: 0.92em; line-height: 1.5; } .login-form-grid { display: grid; row-gap: 12px; } .login-field { display: grid; gap: 6px; } .login-field span { font-size: 0.85em; color: var(--color-text-secondary); font-weight: 600; } .login-card input, .login-card select { width: 100%; padding: 11px 12px; border: 1px solid #cbd5e1; border-radius: 8px; font-size: 0.95em; background: #fff; } .login-card input:focus, .login-card select:focus { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.14); outline: none; } .login-alert { border-radius: 10px; padding: 10px 12px; font-size: 0.88em; line-height: 1.45; } .login-alert.warn { color: #9a3412; background: #fff7ed; border: 1px solid #fed7aa; } .login-alert.error { color: #b91c1c; background: #fef2f2; border: 1px solid #fecaca; } .login-tips { display: grid; gap: 4px; padding: 10px 12px; border-radius: 10px; border: 1px dashed #bfdbfe; background: #eff6ff; font-size: 0.84em; color: #1e3a8a; } .login-submit-btn { min-height: 42px; border-radius: 8px; font-weight: 700; } .login-visual-panel { position: relative; min-width: 0; min-height: 100vh; display: flex; align-items: flex-end; overflow: hidden; padding: clamp(32px, 5vw, 72px); background: #020617; color: #f8fafc; } .login-visual-panel::after { content: ''; position: absolute; inset: 0; background: linear-gradient(90deg, rgba(2, 6, 23, 0.68) 0%, rgba(2, 6, 23, 0.34) 38%, rgba(2, 6, 23, 0.08) 100%), linear-gradient(0deg, rgba(2, 6, 23, 0.72) 0%, rgba(2, 6, 23, 0.18) 52%, rgba(2, 6, 23, 0.18) 100%); pointer-events: none; } .login-slide-copy { position: relative; z-index: 2; max-width: min(720px, 74%); padding-bottom: 36px; } .login-slide-copy span { color: #7dd3fc; font-size: 0.82em; font-weight: 700; } .login-slide-copy h3 { margin: 8px 0 8px; color: #f8fafc; font-size: 3.4rem; line-height: 1.08; text-shadow: 0 18px 40px rgba(0, 0, 0, 0.28); } .login-slide-copy p { margin: 0; max-width: 680px; color: #dbeafe; font-size: 1.02em; line-height: 1.68; text-shadow: 0 10px 26px rgba(0, 0, 0, 0.38); } .login-slide-frame { position: absolute; inset: 0; overflow: hidden; background: #0f172a; } .login-slide-image { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; opacity: 0; transform: scale(1.018); transition: opacity 0.45s ease, transform 0.7s ease; } .login-slide-image.active { opacity: 1; transform: scale(1); } .login-slide-dots { position: absolute; z-index: 2; right: clamp(28px, 4vw, 60px); bottom: clamp(28px, 4vw, 56px); display: flex; gap: 8px; } .login-slide-dots button { width: 30px; height: 8px; border: 1px solid #93a4bd; border-radius: 999px; background: #e2e8f0; padding: 0; cursor: pointer; } .login-slide-dots button.active { width: 42px; border-color: var(--color-accent); background: var(--color-accent); } @media (max-width: 1240px) { .login-slide-copy h3 { font-size: 2.8rem; } } @media (max-width: 920px) { .login-page-wrapper { align-items: flex-start; overflow-y: auto; } .login-shell { min-height: 100vh; grid-template-columns: 1fr; } .login-card { min-height: auto; border-right: none; border-bottom: 1px solid #dbe4f3; padding: 24px; } .login-visual-panel { min-height: min(58vh, 560px); padding: 24px; } .login-slide-copy { max-width: 100%; padding-bottom: 34px; } .login-slide-copy h3 { font-size: 2.2rem; } .login-slide-dots { right: auto; left: 24px; bottom: 20px; } } @media (max-width: 560px) { .login-card, .login-visual-panel { padding: 18px; } .login-card h2, .login-slide-copy h3 { font-size: 1.28rem; } .login-visual-panel { min-height: 360px; } } @media (prefers-reduced-motion: reduce) { .login-slide-image { transition: opacity 0.15s ease; transform: none; } .login-slide-image.active { transform: none; } } .user-role-chip { display: inline-flex; align-items: center; gap: 6px; padding: 6px 10px; border-radius: 999px; font-size: 0.8em; border: 1px solid transparent; white-space: nowrap; } .user-role-chip.admin { background: rgba(22, 163, 74, 0.12); color: #166534; border-color: rgba(22, 163, 74, 0.3); } .user-role-chip.viewer { background: rgba(245, 158, 11, 0.12); color: #92400e; border-color: rgba(245, 158, 11, 0.35); } .user-role-name { font-weight: 700; } .user-role-divider { opacity: 0.7; } .read-only-banner { background: #fffbeb; color: #92400e; border-bottom: 1px solid #fde68a; padding: 8px 12px; font-size: 0.9em; } .panel-inline-message { padding: 10px 12px; border-radius: 10px; font-size: 0.9em; border: 1px solid transparent; } .panel-inline-message.success { background: rgba(34, 197, 94, 0.1); border-color: rgba(34, 197, 94, 0.3); color: #166534; } .panel-inline-message.error { background: rgba(239, 68, 68, 0.1); border-color: rgba(239, 68, 68, 0.25); color: #b91c1c; } .user-admin-layout { display: flex; flex-direction: column; height: 100%; padding: 14px; gap: 12px; overflow-y: auto; } .user-admin-hero { display: grid; gap: 12px; } .user-admin-head { display: flex; justify-content: space-between; align-items: flex-start; gap: 10px; } .user-admin-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .user-admin-stat { border: 1px solid var(--color-border); border-radius: 10px; background: var(--color-panel-muted); padding: 9px 10px; display: grid; gap: 4px; } .user-admin-stat span { font-size: 0.8em; color: var(--color-text-muted); } .user-admin-stat strong { font-size: 1.02em; color: var(--color-text-primary); } .user-admin-create-form { margin-top: 10px; display: grid; gap: 10px; } .user-admin-field { display: grid; gap: 6px; min-width: 0; } .user-admin-field span { font-size: 0.82em; color: var(--color-text-secondary); font-weight: 600; } .user-admin-field input, .user-admin-field select, .audit-filter-field input, .audit-filter-field select { width: 100%; border: 1px solid var(--color-border); border-radius: 8px; padding: 9px 10px; background: #fff; } .user-admin-field input:focus, .user-admin-field select:focus, .audit-filter-field input:focus, .audit-filter-field select:focus { border-color: var(--color-accent); box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12); outline: none; } .user-admin-field.compact { min-width: 140px; } .user-admin-form-row { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; } .user-admin-checkbox { display: inline-flex; align-items: center; gap: 6px; color: var(--color-text-secondary); font-size: 0.9em; } .user-admin-list-card { flex: 1; min-height: 0; display: flex; flex-direction: column; gap: 10px; } .user-admin-list-toolbar { display: flex; gap: 8px; } .user-admin-list-toolbar input { flex: 1; min-width: 0; } .user-admin-list { flex: 1; min-height: 0; overflow: auto; display: grid; gap: 10px; } .user-entry-card { border: 1px solid var(--color-border); border-radius: 10px; padding: 10px; display: grid; gap: 9px; background: #fff; } .user-entry-header { display: grid; gap: 6px; } .user-entry-name-wrap { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; } .role-pill, .state-pill { padding: 2px 8px; border-radius: 999px; font-size: 0.78em; border: 1px solid transparent; } .role-pill.admin { background: rgba(16, 185, 129, 0.15); border-color: rgba(16, 185, 129, 0.35); color: #065f46; } .role-pill.viewer { background: rgba(251, 191, 36, 0.2); border-color: rgba(251, 191, 36, 0.42); color: #92400e; } .state-pill { background: #f3f4f6; border-color: #d1d5db; color: #4b5563; } .state-pill.self { background: #eff6ff; border-color: #bfdbfe; color: #1d4ed8; } .user-entry-meta { display: flex; flex-wrap: wrap; gap: 10px; font-size: 0.82em; color: var(--color-text-muted); } .user-entry-controls { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; } .password-field { flex: 1; min-width: 220px; } .user-entry-note { font-size: 0.82em; color: #92400e; background: #fffbeb; border: 1px solid #fde68a; border-radius: 8px; padding: 6px 8px; } .audit-panel { display: flex; flex-direction: column; height: 100%; padding: 14px; gap: 12px; overflow-y: auto; } .audit-panel-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .audit-header-title { min-width: 0; } .audit-header-actions { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; } .audit-switch { display: inline-flex; align-items: center; gap: 6px; font-size: 0.86em; color: var(--color-text-secondary); } .audit-summary-card, .audit-filter-card { display: grid; gap: 10px; } .audit-summary-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; } .audit-summary-item { border: 1px solid var(--color-border); border-radius: 10px; background: var(--color-panel-muted); padding: 9px 10px; display: grid; gap: 4px; } .audit-summary-item span { font-size: 0.8em; color: var(--color-text-muted); } .audit-summary-item strong { font-size: 1.02em; } .audit-summary-item.ok strong { color: #166534; } .audit-summary-item.blocked strong { color: #b91c1c; } .audit-filter-grid { display: grid; grid-template-columns: 2fr 1fr 1fr 1fr; gap: 8px; } .audit-filter-field { display: grid; gap: 6px; } .audit-filter-field span { font-size: 0.82em; color: var(--color-text-secondary); font-weight: 600; } .audit-list-card { flex: 1; min-height: 0; } .audit-list { height: 100%; overflow: auto; display: grid; gap: 10px; } .audit-log-item { border: 1px solid var(--color-border); border-radius: 10px; padding: 10px; display: grid; gap: 7px; background: #fff; } .audit-log-top { display: flex; justify-content: space-between; gap: 12px; align-items: center; } .audit-log-main { display: flex; align-items: center; gap: 8px; min-width: 0; } .audit-operator { color: var(--color-text-muted); font-size: 0.84em; } .audit-time { font-size: 0.82em; color: var(--color-text-muted); white-space: nowrap; } .audit-outcome { display: inline-flex; align-items: center; justify-content: center; padding: 2px 8px; border-radius: 999px; font-size: 0.75em; font-weight: 600; border: 1px solid transparent; } .audit-outcome.ok { color: #166534; background: rgba(22, 163, 74, 0.12); border-color: rgba(22, 163, 74, 0.3); } .audit-outcome.blocked { color: #b91c1c; background: rgba(239, 68, 68, 0.12); border-color: rgba(239, 68, 68, 0.35); } .audit-log-meta { display: flex; flex-wrap: wrap; gap: 10px; font-size: 0.82em; color: var(--color-text-muted); } .audit-log-detail { font-size: 0.84em; color: var(--color-text-secondary); word-break: break-word; } @media (max-width: 1120px) { .user-admin-summary, .audit-summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .audit-filter-grid { grid-template-columns: 1fr 1fr; } .user-entry-controls { align-items: stretch; } .password-field { min-width: 0; } } @media (max-width: 780px) { .audit-panel-header { flex-direction: column; align-items: flex-start; } .audit-filter-grid { grid-template-columns: 1fr; } .user-admin-list-toolbar { flex-direction: column; } } /* ========== Map Export ========== */ .map-export-btn { position: absolute; bottom: 12px; right: 12px; z-index: 800; background: rgba(255, 255, 255, 0.95); border: 1px solid var(--color-border); border-radius: 20px; padding: 6px 16px; font-size: 13px; font-family: var(--font-sans); color: var(--color-text-primary); cursor: pointer; box-shadow: var(--shadow-soft); backdrop-filter: blur(6px); transition: background 0.15s, box-shadow 0.15s; } .map-export-btn:hover { background: var(--color-accent-soft); color: var(--color-accent); box-shadow: 0 2px 8px var(--color-accent-glow); } .map-export-modal .export-content { width: min(1100px, calc(100vw - 32px)); max-height: calc(100vh - 48px); padding: 0; display: flex; flex-direction: column; overflow: hidden; } .export-header { display: flex; align-items: center; justify-content: space-between; padding: 16px 20px; border-bottom: 1px solid var(--color-border); } .export-header h3 { margin: 0; font-size: 16px; color: var(--color-text-primary); } .export-close-btn { background: none; border: none; font-size: 22px; color: var(--color-text-muted); cursor: pointer; padding: 0 4px; line-height: 1; } .export-close-btn:hover { color: var(--color-danger); } .export-body { display: flex; flex: 1; min-height: 0; overflow: hidden; } .export-config { width: 320px; min-width: 320px; padding: 16px 20px; overflow-y: auto; border-right: 1px solid var(--color-border); display: flex; flex-direction: column; gap: 16px; } .export-section { display: flex; flex-direction: column; gap: 6px; } .export-label { font-size: 12px; font-weight: 600; color: var(--color-text-secondary); text-transform: uppercase; letter-spacing: 0.5px; } .export-input { padding: 7px 10px; border: 1px solid var(--color-border); border-radius: 6px; font-size: 13px; font-family: var(--font-sans); background: var(--color-panel-bg); color: var(--color-text-primary); outline: none; transition: border-color 0.15s; } .export-input:focus { border-color: var(--color-accent); } .export-format-btns { display: flex; gap: 6px; } .export-format-btns button { flex: 1; padding: 6px 0; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-panel-bg); font-size: 13px; font-family: var(--font-sans); color: var(--color-text-secondary); cursor: pointer; transition: all 0.15s; } .export-format-btns button.active { background: var(--color-accent); color: #fff; border-color: var(--color-accent); } .export-toggles { display: flex; flex-direction: column; gap: 6px; } .export-toggle { display: flex; align-items: center; gap: 8px; font-size: 13px; color: var(--color-text-primary); cursor: pointer; } .export-toggle input[type="checkbox"] { accent-color: var(--color-accent); width: 15px; height: 15px; } .export-legend-list { display: flex; flex-direction: column; gap: 4px; max-height: 200px; overflow-y: auto; } .export-legend-item { display: flex; align-items: center; gap: 6px; } .export-legend-color { width: 28px; height: 28px; border: 1px solid var(--color-border); border-radius: 4px; padding: 1px; cursor: pointer; } .export-legend-label-input { flex: 1; padding: 4px 8px; border: 1px solid var(--color-border); border-radius: 4px; font-size: 12px; font-family: var(--font-sans); background: var(--color-panel-bg); color: var(--color-text-primary); outline: none; } .export-legend-label-input:focus { border-color: var(--color-accent); } .export-legend-remove { background: none; border: none; color: var(--color-text-muted); font-size: 16px; cursor: pointer; padding: 0 4px; line-height: 1; } .export-legend-remove:hover { color: var(--color-danger); } .export-legend-empty { font-size: 12px; color: var(--color-text-muted); padding: 8px 0; } .export-legend-add { background: none; border: 1px dashed var(--color-border); border-radius: 6px; padding: 5px 0; font-size: 12px; color: var(--color-accent); cursor: pointer; transition: background 0.15s; } .export-legend-add:hover { background: var(--color-accent-soft); } .export-preview { flex: 1; display: flex; align-items: center; justify-content: center; background: #f0f2f5; min-height: 400px; padding: 20px; overflow: auto; } .export-preview-img { max-width: 100%; max-height: 100%; object-fit: contain; border-radius: 4px; box-shadow: 0 2px 12px rgba(0, 0, 0, 0.12); } .export-preview-loading { font-size: 14px; color: var(--color-text-muted); } .export-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 12px 20px; border-top: 1px solid var(--color-border); } .export-btn-cancel { padding: 7px 18px; border: 1px solid var(--color-border); border-radius: 6px; background: var(--color-panel-bg); font-size: 13px; font-family: var(--font-sans); color: var(--color-text-secondary); cursor: pointer; } .export-btn-cancel:hover { background: var(--color-panel-muted); } .export-btn-submit { padding: 7px 24px; border: none; border-radius: 6px; background: var(--color-accent); color: #fff; font-size: 13px; font-family: var(--font-sans); font-weight: 600; cursor: pointer; transition: background 0.15s; } .export-btn-submit:hover { background: var(--color-accent-strong); } .export-btn-submit:disabled { opacity: 0.6; cursor: not-allowed; } .export-legend-colorbar-preview { width: 28px; height: 28px; border: 1px solid var(--color-border); border-radius: 4px; background: linear-gradient(to right, rgb(255,20,0), rgb(240,137,0), rgb(232,240,70), rgb(24,255,0), rgb(101,185,241), rgb(0,104,200)); flex-shrink: 0; } .export-logo-row { display: flex; align-items: center; gap: 8px; } .export-logo-thumb { height: 36px; max-width: 120px; object-fit: contain; border: 1px solid var(--color-border); border-radius: 4px; padding: 2px; background: #fff; } /* ============ AI Diagnosis Modal ============ */ .ai-diagnosis-modal { position: relative; width: min(900px, calc(100vw - 32px)); max-height: calc(100vh - 64px); background: var(--color-panel-bg); border-radius: 8px; box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2); display: flex; flex-direction: column; overflow: hidden; } .ai-diagnosis-modal-header { display: flex; justify-content: space-between; align-items: center; padding: 16px 20px; border-bottom: 1px solid var(--color-border); background: var(--color-panel-bg); } .ai-diagnosis-modal-title { display: flex; align-items: center; gap: 8px; font-size: 18px; font-weight: 600; color: var(--color-text-primary); } .ai-diagnosis-icon { font-size: 24px; } .ai-diagnosis-meta { padding: 16px 20px; background: #f7fafc; border-bottom: 1px solid var(--color-border); display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 12px; font-size: 13px; } .ai-diagnosis-meta-row { display: flex; gap: 8px; } .ai-diagnosis-meta-label { font-weight: 600; color: var(--color-text-secondary); white-space: nowrap; } .ai-diagnosis-meta-value { color: var(--color-text-primary); word-break: break-word; } .ai-diagnosis-risk-badge { display: inline-block; padding: 2px 10px; border-radius: 12px; font-size: 12px; font-weight: 600; color: #fff; } .ai-diagnosis-content { flex: 1; overflow: auto; padding: 20px; background: var(--color-panel-bg); } .ai-diagnosis-markdown { font-size: 14px; line-height: 1.7; color: var(--color-text-primary); max-width: 100%; word-wrap: break-word; overflow-wrap: break-word; } .ai-diagnosis-markdown * { max-width: 100%; } .ai-diagnosis-markdown details { margin-bottom: 12px; border: 1px solid var(--color-border); border-radius: 6px; padding: 12px; background: #f7fafc; } .ai-diagnosis-markdown summary { cursor: pointer; font-weight: 600; margin-bottom: 8px; user-select: none; list-style-position: outside; padding-left: 4px; } .ai-diagnosis-markdown summary::-webkit-details-marker { margin-right: 8px; } .ai-diagnosis-markdown h1, .ai-diagnosis-markdown h2, .ai-diagnosis-markdown h3, .ai-diagnosis-markdown h4 { margin-top: 24px; margin-bottom: 12px; font-weight: 600; color: var(--color-text-primary); } .ai-diagnosis-markdown h1 { font-size: 24px; border-bottom: 2px solid var(--color-border); padding-bottom: 8px; } .ai-diagnosis-markdown h2 { font-size: 20px; border-bottom: 1px solid var(--color-border); padding-bottom: 6px; } .ai-diagnosis-markdown h3 { font-size: 17px; } .ai-diagnosis-markdown h4 { font-size: 15px; } .ai-diagnosis-markdown p { margin-bottom: 12px; } .ai-diagnosis-markdown ul, .ai-diagnosis-markdown ol { margin-bottom: 12px; padding-left: 24px; } .ai-diagnosis-markdown li { margin-bottom: 6px; } .ai-diagnosis-markdown code { background: #f1f5f9; padding: 2px 6px; border-radius: 3px; font-family: 'Consolas', 'Monaco', monospace; font-size: 13px; } .ai-diagnosis-markdown pre { background: #1e293b; color: #e2e8f0; padding: 12px; border-radius: 6px; overflow-x: auto; margin-bottom: 12px; } .ai-diagnosis-markdown pre code { background: none; padding: 0; color: inherit; } .ai-diagnosis-markdown blockquote { border: 1px solid var(--color-border); border-radius: 8px; padding: 10px 12px; margin: 12px 0; background: rgba(248, 250, 252, 0.9); color: var(--color-text-secondary); font-style: italic; } .ai-diagnosis-markdown strong { font-weight: 600; color: var(--color-text-primary); } .ai-diagnosis-error { padding: 16px; background: #fed7d7; color: #c53030; border-radius: 6px; font-size: 14px; } .ai-diagnosis-empty { text-align: center; padding: 48px; color: var(--color-text-muted); font-size: 14px; } .ai-diagnosis-modal-footer { display: flex; justify-content: flex-end; gap: 10px; padding: 12px 20px; border-top: 1px solid var(--color-border); background: var(--color-panel-bg); } /* ======================================== Pairing Modal - Wide Layout with Strategy Info ======================================== */ .modal-content.pairing-modal-wide { width: min(1100px, calc(100vw - 48px)); max-width: 1100px; padding: 0; overflow: hidden; } .pairing-modal-layout { display: flex; gap: 0; height: 100%; max-height: calc(100vh - 48px); } .pairing-modal-form { flex: 1; padding: 25px; overflow-y: auto; border-right: 1px solid var(--color-border); } .pairing-modal-info { width: 360px; flex-shrink: 0; background: var(--color-panel-muted); padding: 25px; overflow-y: auto; } .strategy-info-panel { position: sticky; top: 0; } .strategy-info-panel h4 { margin: 0 0 12px 0; color: var(--color-accent-strong); font-size: 1.1rem; font-weight: 600; } .strategy-description { margin: 0 0 16px 0; color: var(--color-text-secondary); font-size: 14px; line-height: 1.6; } .strategy-details { margin: 16px 0; padding: 16px; background: white; border-radius: 6px; border: 1px solid var(--color-border); } .strategy-details p { margin: 8px 0; color: var(--color-text-primary); font-size: 13px; line-height: 1.7; } .strategy-params { margin-top: 16px; padding: 12px; background: var(--color-accent-soft); border-radius: 6px; border: 1px solid rgba(37, 99, 235, 0.22); } .strategy-params strong { display: block; margin-bottom: 6px; color: var(--color-accent-strong); font-size: 13px; } .strategy-params p { margin: 0; color: var(--color-text-secondary); font-size: 13px; line-height: 1.6; } /* 日期选择器在配对 Modal 中的样式调整 */ .pairing-modal-form .unified-date-picker { flex: 1; } .pairing-modal-form .form-group { margin-bottom: 18px; } .pairing-modal-form .form-group label { display: block; margin-bottom: 8px; font-weight: 500; color: var(--color-text-primary); } /* 响应式:小屏幕时垂直布局 */ @media (max-width: 900px) { .pairing-modal-layout { flex-direction: column; } .pairing-modal-form { border-right: none; border-bottom: 1px solid var(--color-border); } .pairing-modal-info { width: 100%; } .strategy-info-panel { position: static; } } /* ============ D-InSAR Results Workspace ============ */ .dinsar-results-toolbar { gap: 12px; padding: 12px 15px 14px; background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(242, 246, 251, 0.98)), var(--color-panel-muted); } .dinsar-toolbar-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; } .dinsar-toolbar-panel { display: grid; gap: 8px; padding: 12px 14px; border: 1px solid var(--color-border); border-radius: 12px; background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(247, 250, 252, 0.98)); box-shadow: var(--shadow-soft); } .dinsar-toolbar-kicker { font-size: 11px; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-text-muted); } .dinsar-toolbar-value { font-size: 1.25rem; color: var(--color-text-primary); } .dinsar-toolbar-note { margin: 0; font-size: 12px; line-height: 1.55; color: var(--color-text-secondary); } .dinsar-toolbar-chip-row { display: flex; flex-wrap: wrap; gap: 8px; } .dinsar-toolbar-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 10px; border-radius: 999px; border: 1px solid var(--color-border); background: rgba(255, 255, 255, 0.92); color: var(--color-text-secondary); font-size: 11px; font-weight: 600; } .dinsar-toolbar-actions { display: flex; flex-wrap: wrap; gap: 8px; } .dinsar-filter-layout { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr) minmax(0, 1fr) minmax(0, 1.6fr); gap: 10px; } .dinsar-filter-field { display: grid; gap: 6px; min-width: 0; } .dinsar-filter-field span, .dinsar-pagination-field span { font-size: 11px; font-weight: 700; color: var(--color-text-muted); } .dinsar-filter-field input, .dinsar-filter-field select, .dinsar-pagination-field input, .dinsar-pagination-field select, .dinsar-catalog-filter-field input, .dinsar-catalog-filter-field select, .dinsar-catalog-manage-form textarea, .dinsar-catalog-manage-form input, .dinsar-products-field input { width: 100%; min-width: 0; border: 1px solid var(--color-border); border-radius: 8px; padding: 8px 10px; font-size: 13px; font-family: var(--font-sans); color: var(--color-text-primary); background: #fff; } .dinsar-filter-field input:focus, .dinsar-filter-field select:focus, .dinsar-pagination-field input:focus, .dinsar-pagination-field select:focus, .dinsar-catalog-filter-field input:focus, .dinsar-catalog-filter-field select:focus, .dinsar-catalog-manage-form textarea:focus, .dinsar-catalog-manage-form input:focus, .dinsar-products-field input:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 3px var(--color-accent-glow); } .dinsar-score-filter { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: center; } .dinsar-score-filter strong { min-width: 42px; text-align: center; padding: 7px 8px; border-radius: 8px; background: var(--color-accent-soft); color: var(--color-accent-strong); } .dinsar-engine-filter-row { display: flex; flex-wrap: wrap; gap: 8px; } .dinsar-engine-filter-row button { display: inline-flex; align-items: center; gap: 8px; padding: 6px 12px; border-radius: 999px; background: rgba(255, 255, 255, 0.9); } .dinsar-engine-filter-row button strong { min-width: 24px; text-align: center; color: var(--color-text-primary); } .dinsar-engine-filter-row button.active { border-color: var(--color-accent); background: var(--color-accent-soft); color: var(--color-accent-strong); } .dinsar-toolbar-footer { display: grid; gap: 8px; } .dinsar-toolbar-footer-main { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 10px; } .dinsar-pagination-field { display: grid; gap: 6px; min-width: 120px; } .dinsar-pagination-field-jump { min-width: 240px; } .dinsar-page-jump-input { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; } .dinsar-page-jump-input input.has-error { border-color: var(--color-danger); box-shadow: 0 0 0 2px rgba(220, 38, 38, 0.12); } .dinsar-toolbar-hint { font-size: 12px; color: var(--color-text-muted); } .dinsar-toolbar-hint.error { color: var(--color-danger); } .dinsar-row-header { display: flex; width: 100%; justify-content: space-between; gap: 8px; align-items: flex-start; } .dinsar-item { gap: 8px; min-height: 118px; padding-top: 10px; padding-bottom: 10px; } .dinsar-item .data-item-controls { width: 100%; justify-content: space-between; flex-wrap: wrap; } .dinsar-row-badges { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; flex-shrink: 0; } .dinsar-engine-badge { display: inline-flex; align-items: center; justify-content: center; padding: 3px 9px; border-radius: 999px; border: 1px solid var(--color-border); background: rgba(255, 255, 255, 0.9); font-size: 11px; font-weight: 700; line-height: 1; } .dinsar-engine-badge.tone-envi { border-color: rgba(14, 165, 164, 0.34); background: rgba(14, 165, 164, 0.12); color: #0f766e; } .dinsar-engine-badge.tone-isce2 { border-color: rgba(37, 99, 235, 0.32); background: rgba(37, 99, 235, 0.12); color: #1d4ed8; } .dinsar-engine-badge.tone-pyint { border-color: rgba(190, 24, 93, 0.28); background: rgba(244, 63, 94, 0.12); color: #be123c; } .dinsar-engine-badge.tone-landsar { border-color: rgba(217, 119, 6, 0.32); background: rgba(245, 158, 11, 0.14); color: #b45309; } .dinsar-engine-badge.tone-unknown { border-color: rgba(100, 116, 139, 0.28); background: rgba(148, 163, 184, 0.12); color: #475569; } .dinsar-trace-stat { display: inline-flex; align-items: center; gap: 6px; padding: 3px 8px; border-radius: 999px; background: rgba(148, 163, 184, 0.12); color: var(--color-text-secondary); } .dinsar-trace-stat strong { font-size: 10px; text-transform: uppercase; letter-spacing: 0.05em; color: var(--color-text-muted); } .dinsar-control-cluster { display: flex; align-items: center; gap: 8px; } .dinsar-toggle-label { display: inline-flex; align-items: center; gap: 6px; padding: 5px 8px; border-radius: 8px; border: 1px solid var(--color-border); background: #fff; color: var(--color-text-secondary); font-size: 12px; cursor: pointer; } .dinsar-toggle-label input[type="checkbox"] { accent-color: var(--color-accent); } /* ============ D-InSAR Production ============ */ .dinsar-production-shell { width: 100%; max-width: 1280px; margin: 0 auto; padding: 16px; display: grid; gap: 14px; box-sizing: border-box; } .production-workspace-shell .dinsar-production-shell, .production-workspace-shell .dinsar-products-page { max-width: none; margin-left: 0; margin-right: 0; } .production-workspace-shell .dinsar-production-shell { padding: 0; } .dinsar-production-header { display: grid; grid-template-columns: minmax(280px, 1fr) minmax(420px, 0.95fr); gap: 14px; align-items: stretch; padding: 14px; border: 1px solid var(--color-border); border-radius: 8px; background: #fff; } .dinsar-production-header h3, .dinsar-production-section-header h4 { margin: 0; color: var(--color-text-primary); line-height: 1.35; } .dinsar-production-header h3 { font-size: 1.08em; } .dinsar-production-header p, .dinsar-production-section-header p { margin: 4px 0 0; color: var(--color-text-secondary); font-size: 0.84em; line-height: 1.55; } .dinsar-production-summary { display: grid; grid-template-columns: repeat(4, minmax(92px, 1fr)); gap: 8px; } .dinsar-production-signal { display: grid; gap: 3px; min-height: 54px; padding: 8px 10px; border-radius: 6px; border: 1px solid var(--color-border); background: #f8fafc; align-content: center; } .dinsar-production-signal span { color: var(--color-text-muted); font-size: 0.76em; } .dinsar-production-signal strong { color: var(--color-text-primary); font-size: 0.9em; word-break: break-word; } .dinsar-production-signal.ok { border-color: rgba(22, 163, 74, 0.26); background: rgba(22, 163, 74, 0.06); } .dinsar-production-signal.warn { border-color: rgba(245, 158, 11, 0.28); background: rgba(245, 158, 11, 0.08); } .dinsar-production-section { display: grid; gap: 8px; } .dinsar-production-section-header { padding: 0 2px; } .dinsar-production-section-header h4 { font-size: 0.96em; } @media (max-width: 1180px) { .dinsar-production-header { grid-template-columns: 1fr; } } @media (max-width: 760px) { .dinsar-production-shell { padding: 12px; } .dinsar-production-summary { grid-template-columns: repeat(2, minmax(0, 1fr)); } } /* ============ D-InSAR Catalog ============ */ .dinsar-status-pill { display: inline-flex; align-items: center; justify-content: center; padding: 3px 10px; border-radius: 999px; border: 1px solid transparent; font-size: 11px; font-weight: 700; line-height: 1.2; } .dinsar-status-pill.tone-ready { background: rgba(22, 163, 74, 0.12); color: #166534; border-color: rgba(22, 163, 74, 0.25); } .dinsar-status-pill.tone-info { background: rgba(14, 165, 233, 0.12); color: #0369a1; border-color: rgba(14, 165, 233, 0.24); } .dinsar-status-pill.tone-warn { background: rgba(245, 158, 11, 0.14); color: #b45309; border-color: rgba(245, 158, 11, 0.25); } .dinsar-status-pill.tone-partial { background: rgba(217, 119, 6, 0.13); color: #92400e; border-color: rgba(217, 119, 6, 0.28); } .dinsar-status-pill.tone-error { background: rgba(220, 38, 38, 0.12); color: #b91c1c; border-color: rgba(220, 38, 38, 0.24); } .dinsar-status-pill.tone-neutral { background: rgba(148, 163, 184, 0.12); color: #475569; border-color: rgba(148, 163, 184, 0.24); } .dinsar-catalog-shell, .dinsar-products-card, .dinsar-products-hero { background: linear-gradient(180deg, rgba(255, 255, 255, 0.98), rgba(249, 251, 255, 0.98)); border: 1px solid var(--color-border); border-radius: 14px; box-shadow: var(--shadow-soft); } .dinsar-catalog-shell { padding: 16px; display: grid; gap: 14px; } .dinsar-catalog-header, .dinsar-products-hero { display: flex; justify-content: space-between; gap: 16px; align-items: flex-start; } .dinsar-catalog-header-copy strong, .dinsar-products-hero strong { display: block; font-size: 16px; color: var(--color-text-primary); } .dinsar-catalog-header-copy p, .dinsar-products-hero p { margin: 6px 0 0; max-width: 760px; font-size: 13px; line-height: 1.7; color: var(--color-text-secondary); } .dinsar-catalog-header-actions, .dinsar-products-hero-badges { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; } .dinsar-catalog-summary { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; } .dinsar-catalog-stat-card { display: grid; gap: 6px; padding: 12px; border-radius: 12px; border: 1px solid var(--color-border); background: rgba(248, 250, 252, 0.95); } .dinsar-catalog-stat-card span { font-size: 11px; font-weight: 700; color: var(--color-text-muted); } .dinsar-catalog-stat-card strong { font-size: 18px; color: var(--color-text-primary); } .dinsar-catalog-stat-card small { font-size: 12px; color: var(--color-text-secondary); } .dinsar-catalog-meta-strip { display: grid; gap: 6px; padding: 12px; border-radius: 12px; background: rgba(239, 246, 255, 0.75); color: var(--color-text-secondary); font-size: 12px; word-break: break-all; } .dinsar-catalog-message, .dinsar-products-message { padding: 10px 12px; border-radius: 12px; font-size: 13px; font-weight: 600; } .dinsar-catalog-message.tone-success, .dinsar-products-message.tone-success { background: rgba(22, 163, 74, 0.12); color: #166534; border: 1px solid rgba(22, 163, 74, 0.24); } .dinsar-catalog-message.tone-error, .dinsar-products-message.tone-error { background: rgba(220, 38, 38, 0.12); color: #b91c1c; border: 1px solid rgba(220, 38, 38, 0.24); } .dinsar-catalog-manage { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1.85fr); gap: 14px; padding: 14px; border: 1px solid var(--color-border); border-radius: 14px; background: rgba(248, 250, 252, 0.92); } .dinsar-catalog-manage-copy strong { display: block; margin-bottom: 6px; font-size: 14px; color: var(--color-text-primary); } .dinsar-catalog-manage-copy p { margin: 0; font-size: 13px; line-height: 1.7; color: var(--color-text-secondary); } .dinsar-catalog-manage-form { display: grid; gap: 10px; } .dinsar-catalog-manage-form textarea { min-height: 94px; resize: vertical; } .dinsar-catalog-manage-actions, .dinsar-products-actions, .dinsar-catalog-filter-actions { display: flex; flex-wrap: wrap; gap: 8px; } .dinsar-catalog-manage-actions .primary, .dinsar-products-actions .primary { background: var(--color-accent); color: #fff; border-color: var(--color-accent); } .dinsar-catalog-manage-actions .primary:hover:not(:disabled), .dinsar-products-actions .primary:hover:not(:disabled) { background: var(--color-accent-strong); } .dinsar-catalog-workspace { display: grid; grid-template-columns: minmax(300px, 340px) minmax(0, 1fr); gap: 14px; min-height: 0; align-items: stretch; height: min(760px, calc(100vh - 180px)); } .panel--standalone .dinsar-catalog-workspace { grid-template-columns: minmax(300px, 340px) minmax(0, 1fr); height: min(820px, calc(100vh - 148px)); } .dinsar-catalog-list-card, .dinsar-catalog-detail-card { min-height: 0; border: 1px solid var(--color-border); border-radius: 14px; background: rgba(255, 255, 255, 0.95); display: flex; flex-direction: column; overflow: hidden; } .dinsar-catalog-list-card { min-height: 0; } .panel--standalone { width: 100%; border-right: none; border-left: none; box-shadow: none; background: #f8fafc; } .panel--standalone .panel-tabs { padding-left: 0; padding-right: 0; background: transparent; border-bottom: none; } .panel--standalone .panel-content { overflow-y: auto; background: #f8fafc; } .panel-standalone-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 14px; padding: 4px 0 14px; } .panel-standalone-header-main { display: grid; gap: 5px; min-width: 0; } .panel-standalone-eyebrow { font-size: 11px; font-weight: 800; letter-spacing: 0; color: var(--color-text-muted); } .panel-standalone-header-main strong { font-size: 20px; line-height: 1.2; color: var(--color-text-primary); } .panel-standalone-header-main p { margin: 0; max-width: 860px; font-size: 13px; line-height: 1.7; color: var(--color-text-secondary); } .panel-standalone-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; } .panel-standalone-actions button { padding: 8px 14px; border-radius: 6px; background: rgba(255, 255, 255, 0.92); border: 1px solid var(--color-border); color: var(--color-text-secondary); } .panel-standalone-actions button.panel-standalone-return { background: rgba(15, 23, 42, 0.86); border-color: rgba(15, 23, 42, 0.92); color: #fff; } .panel-standalone-actions button.active-tab { background: var(--color-accent); border-color: var(--color-accent); color: #fff; } .dinsar-catalog-card-head { display: flex; justify-content: space-between; gap: 12px; align-items: center; padding: 12px 14px; border-bottom: 1px solid var(--color-border); background: rgba(248, 250, 252, 0.94); } .dinsar-catalog-card-head strong { display: block; font-size: 14px; } .dinsar-catalog-card-head span { display: block; margin-top: 4px; font-size: 12px; color: var(--color-text-muted); } .dinsar-catalog-filter-bar { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr) auto; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--color-border); } .dinsar-catalog-filter-field { display: grid; gap: 6px; } .dinsar-catalog-filter-field span { font-size: 11px; font-weight: 700; color: var(--color-text-muted); } .dinsar-catalog-empty { padding: 20px 14px; color: var(--color-text-muted); font-size: 13px; } .dinsar-catalog-empty.inline { padding: 8px 0 0; } .dinsar-catalog-empty.error { color: var(--color-danger); } .dinsar-catalog-empty.ok { color: #166534; } .dinsar-catalog-list { display: grid; gap: 10px; padding: 12px; min-height: 0; flex: 1 1 auto; overflow-y: auto; overscroll-behavior: contain; scrollbar-gutter: stable; } .dinsar-catalog-list-item { display: grid; gap: 8px; padding: 12px; text-align: left; border-radius: 12px; border: 1px solid var(--color-border); background: #fff; box-shadow: none; } .dinsar-catalog-list-item.active { border-color: rgba(37, 99, 235, 0.3); background: rgba(239, 246, 255, 0.92); box-shadow: 0 0 0 2px rgba(37, 99, 235, 0.08); } .dinsar-catalog-list-item-top, .dinsar-catalog-asset-top, .dinsar-catalog-issue-top, .dinsar-monitor-top, .dinsar-monitor-log-head { display: flex; justify-content: space-between; gap: 10px; align-items: center; } .dinsar-catalog-list-item-top strong { min-width: 0; font-size: 13px; line-height: 1.5; word-break: break-word; } .dinsar-catalog-list-item-badges, .dinsar-catalog-hero-badges { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; font-size: 11px; color: var(--color-text-muted); } .dinsar-catalog-list-item-meta, .dinsar-catalog-list-item-trace, .dinsar-monitor-message, .dinsar-monitor-log-message, .dinsar-catalog-asset-item, .dinsar-catalog-issue-item { font-size: 12px; line-height: 1.6; color: var(--color-text-secondary); word-break: break-all; } .dinsar-catalog-list-item-trace { color: var(--color-text-muted); } .dinsar-catalog-detail-body { padding: 14px; display: grid; gap: 14px; min-height: 0; flex: 1 1 auto; overflow-y: auto; } .dinsar-catalog-hero { display: grid; grid-template-columns: minmax(220px, 320px) minmax(0, 1fr); gap: 14px; } .dinsar-catalog-preview-frame { overflow: hidden; min-height: 180px; border-radius: 14px; border: 1px solid var(--color-border); background: linear-gradient(135deg, rgba(226, 232, 240, 0.86), rgba(241, 245, 249, 0.96)); } .dinsar-catalog-preview-frame img { display: block; width: 100%; height: 100%; object-fit: cover; } .dinsar-catalog-hero-meta { display: grid; gap: 12px; min-width: 0; } .dinsar-catalog-hero-title-row { display: flex; justify-content: space-between; gap: 14px; align-items: flex-start; } .dinsar-catalog-hero-title-row h4 { margin: 0; font-size: 18px; } .dinsar-catalog-hero-title-row p { margin: 6px 0 0; font-size: 12px; color: var(--color-text-muted); } .dinsar-catalog-kv-grid, .dinsar-catalog-detail-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 12px; } .dinsar-catalog-meta-field { display: grid; gap: 4px; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--color-border); background: rgba(248, 250, 252, 0.88); } .dinsar-catalog-meta-field span { font-size: 11px; font-weight: 700; color: var(--color-text-muted); } .dinsar-catalog-meta-field strong { font-size: 12px; line-height: 1.55; color: var(--color-text-primary); } .break-all { word-break: break-all; } .dinsar-catalog-section-card { display: grid; gap: 10px; padding: 12px; border-radius: 14px; border: 1px solid var(--color-border); background: rgba(255, 255, 255, 0.95); } .dinsar-catalog-section-card.nested { background: rgba(248, 250, 252, 0.92); } .dinsar-catalog-section-title { font-size: 13px; font-weight: 700; color: var(--color-text-primary); } .dinsar-catalog-asset-list, .dinsar-catalog-issue-list, .dinsar-monitor-log-list { display: grid; gap: 10px; } .dinsar-catalog-asset-item, .dinsar-catalog-issue-item { padding: 10px 12px; border-radius: 12px; border: 1px solid var(--color-border); background: rgba(248, 250, 252, 0.92); } .dinsar-catalog-asset-item.ok { border-color: rgba(22, 163, 74, 0.22); } .dinsar-catalog-asset-item.missing, .dinsar-catalog-issue-item.error { border-color: rgba(220, 38, 38, 0.2); background: rgba(254, 242, 242, 0.92); } .dinsar-catalog-issue-item.warn { border-color: rgba(245, 158, 11, 0.22); background: rgba(255, 247, 237, 0.92); } .dinsar-catalog-asset-top span, .dinsar-catalog-issue-top span, .dinsar-catalog-issue-action, .dinsar-monitor-log-time { font-size: 11px; color: var(--color-text-muted); } .dinsar-products-page { width: 100%; max-width: 1480px; margin: 0 auto; padding: 6px 0 24px; display: grid; gap: 14px; } .panel--standalone .dinsar-products-page { max-width: 1480px; } .dinsar-products-hero { display: flex; justify-content: space-between; gap: 18px; align-items: flex-start; padding: 16px 18px; border-radius: 12px; border: 1px solid var(--color-border); background: #fff; } .dinsar-products-hero strong { display: block; font-size: 18px; line-height: 1.35; color: var(--color-text-primary); } .dinsar-products-hero p { max-width: 72ch; margin: 8px 0 0; color: var(--color-text-secondary); font-size: 13px; line-height: 1.7; } .dinsar-products-signals { display: grid; grid-template-columns: repeat(2, minmax(116px, 1fr)); gap: 8px; min-width: 280px; } .dinsar-products-section-head { display: flex; justify-content: space-between; gap: 14px; align-items: flex-end; padding: 2px 2px 0; } .dinsar-products-section-head strong { display: block; font-size: 14px; line-height: 1.45; color: var(--color-text-primary); } .dinsar-products-section-head span { display: block; margin-top: 3px; font-size: 12px; line-height: 1.55; color: var(--color-text-muted); } .dinsar-products-top-grid { display: grid; grid-template-columns: minmax(420px, 0.95fr) minmax(460px, 1.05fr); gap: 16px; align-items: start; } .dinsar-products-card { padding: 14px; display: grid; gap: 12px; border-radius: 12px; border: 1px solid var(--color-border); background: #fff; } .dinsar-products-card.monitor.tone-warn { border-color: rgba(245, 158, 11, 0.28); } .dinsar-products-card-head { display: flex; justify-content: space-between; gap: 12px; align-items: center; } .dinsar-products-card-head strong { display: block; font-size: 14px; } .dinsar-products-card-head span { display: block; margin-top: 4px; font-size: 12px; color: var(--color-text-muted); } .dinsar-products-form-grid { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr); gap: 10px; } .dinsar-products-controlled-source { display: grid; gap: 6px; padding: 12px; border-radius: 8px; border: 1px solid var(--color-border); background: rgba(248, 250, 252, 0.96); } .dinsar-products-controlled-source span { font-size: 11px; font-weight: 700; color: var(--color-text-muted); } .dinsar-products-controlled-source strong { font-size: 14px; color: var(--color-text-primary); } .dinsar-products-controlled-source p, .dinsar-products-action-hint { margin: 0; font-size: 12px; line-height: 1.6; color: var(--color-text-secondary); } .dinsar-products-field { display: grid; gap: 6px; } .dinsar-products-field span { font-size: 11px; font-weight: 700; color: var(--color-text-muted); } .dinsar-products-result-card { padding: 12px; border-radius: 12px; font-size: 13px; line-height: 1.65; } .dinsar-products-result-card.success { background: rgba(22, 163, 74, 0.1); color: #166534; } .dinsar-products-result-card.error { background: rgba(220, 38, 38, 0.1); color: #b91c1c; } .dinsar-products-empty { color: var(--color-text-muted); font-size: 13px; } .dinsar-products-catalog-section { display: grid; gap: 10px; width: 100%; min-width: 0; } .dinsar-products-catalog-section .dinsar-catalog-shell { width: 100%; min-width: 0; box-sizing: border-box; } .dinsar-products-catalog-section .dinsar-catalog-workspace { grid-template-columns: minmax(360px, 420px) minmax(0, 1fr); } .sbas-products-page { width: 100%; max-width: 1280px; margin: 0 auto; padding: 6px 0 24px; display: grid; gap: 14px; } .sbas-products-header { display: grid; gap: 12px; padding: 16px 18px; border-radius: 12px; border: 1px solid var(--color-border); background: #fff; } .sbas-products-header-main { display: flex; justify-content: space-between; gap: 18px; align-items: flex-start; } .sbas-products-header h3 { margin: 0; color: var(--color-text-primary); font-size: 18px; line-height: 1.35; } .sbas-products-header p { max-width: 76ch; margin: 8px 0 0; color: var(--color-text-secondary); font-size: 13px; line-height: 1.7; } .sbas-products-actions { display: flex; gap: 8px; flex-wrap: wrap; justify-content: flex-end; } .sbas-products-signals, .sbas-products-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 10px; } .sbas-products-section-head { display: flex; justify-content: space-between; gap: 14px; align-items: flex-end; padding: 2px 2px 0; } .sbas-products-section-head strong { display: block; font-size: 14px; line-height: 1.45; color: var(--color-text-primary); } .sbas-products-section-head span { display: block; margin-top: 3px; font-size: 12px; line-height: 1.55; color: var(--color-text-muted); } .sbas-products-workspace { display: grid; grid-template-columns: minmax(280px, 360px) minmax(0, 1fr); gap: 12px; align-items: start; } .dinsar-monitor-card { display: grid; gap: 12px; padding: 12px; border-radius: 14px; border: 1px solid var(--color-border); background: rgba(248, 250, 252, 0.92); } .dinsar-monitor-top strong { display: block; font-size: 14px; } .dinsar-monitor-top span, .dinsar-monitor-task-id { font-size: 12px; color: var(--color-text-muted); } .dinsar-monitor-task-id { font-family: var(--font-mono); } .dinsar-monitor-progress { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: center; } .dinsar-monitor-progress-track { height: 8px; border-radius: 999px; overflow: hidden; background: rgba(148, 163, 184, 0.2); } .dinsar-monitor-progress-bar { height: 100%; background: linear-gradient(90deg, #38bdf8, #2563eb); } .dinsar-monitor-log-item { display: flex; justify-content: space-between; gap: 10px; align-items: flex-start; padding: 10px 12px; border-radius: 12px; border: 1px solid var(--color-border); background: rgba(255, 255, 255, 0.96); } .dinsar-monitor-log-item.tone-error { border-color: rgba(220, 38, 38, 0.22); background: rgba(254, 242, 242, 0.92); } .dinsar-monitor-log-item.tone-warn { border-color: rgba(245, 158, 11, 0.22); background: rgba(255, 247, 237, 0.92); } .dinsar-monitor-log-item .danger { color: #b91c1c; border-color: rgba(220, 38, 38, 0.2); background: rgba(254, 242, 242, 0.92); } .dinsar-monitor-log-main { min-width: 0; } .export-result-item label { display: flex; align-items: center; gap: 8px; } .export-result-item .dinsar-engine-badge { margin-left: auto; } /* ============ Unified Result Extraction Workspace ============ */ .result-extraction-page { min-height: 100%; padding: 16px; display: grid; gap: 14px; background: #f8fafc; } .result-extraction-hero { display: flex; justify-content: space-between; align-items: flex-start; gap: 16px; padding: 18px 20px; border: 1px solid var(--color-border); border-radius: 8px; background: #ffffff; } .result-extraction-hero div:first-child { display: grid; gap: 6px; min-width: 0; } .result-extraction-hero span { font-size: 12px; font-weight: 800; color: var(--color-text-muted); } .result-extraction-hero strong { font-size: 22px; line-height: 1.2; color: var(--color-text-primary); } .result-extraction-hero p { max-width: 900px; margin: 0; color: var(--color-text-secondary); font-size: 13px; line-height: 1.7; } .result-extraction-hero-meta { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 8px; min-width: 240px; } .result-extraction-hero-meta span { padding: 7px 10px; border: 1px solid var(--color-border); border-radius: 6px; background: #f8fafc; color: var(--color-text-secondary); } .result-extraction-metrics { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px; } .result-extraction-metric { padding: 14px; border: 1px solid var(--color-border); border-radius: 8px; background: #ffffff; border-left-width: 4px; } .result-extraction-metric.tone-primary { border-left-color: #2563eb; } .result-extraction-metric.tone-neutral { border-left-color: #64748b; } .result-extraction-metric.tone-warning { border-left-color: #d97706; } .result-extraction-metric span { display: block; font-size: 12px; font-weight: 800; color: var(--color-text-muted); } .result-extraction-metric strong { display: block; margin-top: 8px; font-size: 24px; line-height: 1; color: var(--color-text-primary); } .result-extraction-metric p { margin: 8px 0 0; font-size: 12px; color: var(--color-text-secondary); } .result-extraction-layout { display: grid; grid-template-columns: minmax(260px, 310px) minmax(0, 1fr); gap: 14px; min-height: min(720px, calc(100vh - 270px)); } .result-extraction-channel-list { display: grid; align-content: start; gap: 10px; } .result-extraction-channel-list button { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 4px 10px; padding: 13px; text-align: left; border: 1px solid var(--color-border); border-radius: 8px; background: #ffffff; color: var(--color-text-primary); } .result-extraction-channel-list button.active { border-color: rgba(37, 99, 235, 0.45); background: #eff6ff; box-shadow: inset 3px 0 0 #2563eb; } .result-extraction-channel-list span { grid-column: 1 / -1; font-size: 11px; font-weight: 800; color: var(--color-text-muted); } .result-extraction-channel-list strong { min-width: 0; font-size: 14px; line-height: 1.25; } .result-extraction-channel-list em, .result-extraction-state { justify-self: end; align-self: center; padding: 4px 8px; border-radius: 999px; font-size: 11px; font-style: normal; font-weight: 800; } .result-extraction-channel-list em.ready, .result-extraction-state.ready { color: #166534; background: #dcfce7; } .result-extraction-channel-list em.planned, .result-extraction-state.planned { color: #0f766e; background: #ccfbf1; } .result-extraction-channel-list em.pending, .result-extraction-state.pending { color: #92400e; background: #fef3c7; } .result-extraction-main-card { min-width: 0; min-height: 0; display: flex; flex-direction: column; border: 1px solid var(--color-border); border-radius: 8px; background: #ffffff; overflow: hidden; } .result-extraction-card-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; border-bottom: 1px solid var(--color-border); background: #f8fafc; } .result-extraction-card-head div { display: grid; gap: 4px; min-width: 0; } .result-extraction-card-head span, .result-extraction-list-head span { font-size: 11px; font-weight: 800; color: var(--color-text-muted); } .result-extraction-card-head strong { font-size: 15px; color: var(--color-text-primary); } .result-extraction-card-head button, .result-extraction-action-stack button { padding: 8px 12px; border: 1px solid var(--color-border); border-radius: 6px; background: #ffffff; color: var(--color-text-secondary); } .result-extraction-action-stack button.primary { border-color: #2563eb; background: #2563eb; color: #ffffff; font-weight: 800; } .result-extraction-card-head button:disabled, .result-extraction-action-stack button:disabled { cursor: not-allowed; opacity: 0.55; } .result-extraction-controls { display: grid; grid-template-columns: minmax(180px, 0.9fr) minmax(150px, 0.45fr) minmax(160px, auto) auto; gap: 12px; padding: 14px 16px 10px; } .result-extraction-field { display: grid; gap: 6px; min-width: 0; } .result-extraction-field span { font-size: 11px; font-weight: 800; color: var(--color-text-muted); } .result-extraction-field input, .result-extraction-field select { width: 100%; min-width: 0; box-sizing: border-box; padding: 9px 10px; border: 1px solid var(--color-border); border-radius: 6px; background: #ffffff; color: var(--color-text-primary); } .result-extraction-checkbox { display: inline-flex; align-items: end; gap: 8px; min-height: 55px; color: var(--color-text-secondary); font-size: 12px; font-weight: 800; } .result-extraction-checkbox input { width: 16px; height: 16px; } .result-extraction-action-stack { display: flex; align-items: end; gap: 8px; } .result-extraction-hint { margin: 0 16px 12px; padding: 9px 10px; border: 1px solid rgba(37, 99, 235, 0.16); border-radius: 6px; background: #eff6ff; color: #1e3a8a; font-size: 12px; line-height: 1.5; } .result-extraction-message { display: grid; gap: 5px; margin: 0 16px 12px; padding: 10px 12px; border-radius: 6px; font-size: 12px; line-height: 1.5; } .result-extraction-message.error { border: 1px solid #fecaca; background: #fef2f2; color: #b91c1c; } .result-extraction-message.success { border: 1px solid #bbf7d0; background: #f0fdf4; color: #166534; } .result-extraction-message code { color: var(--color-text-primary); word-break: break-all; } .result-extraction-list-head { display: flex; justify-content: space-between; gap: 12px; padding: 0 16px 10px; border-bottom: 1px solid var(--color-border); } .result-extraction-list-head strong { font-size: 12px; color: var(--color-text-secondary); } .result-extraction-result-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; display: grid; align-content: start; } .result-extraction-workspace-split { flex: 1 1 auto; min-height: 0; display: grid; grid-template-columns: minmax(0, 1.25fr) minmax(330px, 0.75fr); border-top: 1px solid var(--color-border); } .result-extraction-result-column { min-width: 0; min-height: 0; display: flex; flex-direction: column; } .result-delivery-panel { min-width: 0; min-height: 0; display: flex; flex-direction: column; border-left: 1px solid var(--color-border); background: #fbfdff; } .result-delivery-list { flex: 1 1 auto; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; } .result-delivery-row { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 10px; align-items: start; padding: 11px 16px; border-bottom: 1px solid var(--color-border); } .result-delivery-row-main { min-width: 0; display: grid; gap: 5px; } .result-delivery-row-main strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; color: var(--color-text-primary); } .result-delivery-row-main span, .result-delivery-row-main em { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--color-text-muted); } .result-delivery-row-main em { color: #b91c1c; font-style: normal; } .result-delivery-downloads { display: flex; flex-wrap: wrap; gap: 6px; } .result-delivery-downloads a { max-width: 150px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; padding: 4px 7px; border: 1px solid rgba(37, 99, 235, 0.2); border-radius: 6px; background: #eff6ff; color: #1d4ed8; font-size: 11px; font-weight: 800; text-decoration: none; } .result-extraction-result-row { display: grid; grid-template-columns: auto minmax(0, 1fr) auto auto; gap: 10px; align-items: center; padding: 11px 16px; border-bottom: 1px solid var(--color-border); } .result-extraction-result-main { min-width: 0; display: grid; gap: 4px; } .result-extraction-result-main strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; color: var(--color-text-primary); } .result-extraction-result-main span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12px; color: var(--color-text-muted); } .result-extraction-status-chip { padding: 4px 7px; border-radius: 999px; background: #f1f5f9; color: var(--color-text-secondary); font-size: 11px; font-weight: 800; white-space: nowrap; } .result-extraction-empty { padding: 22px 16px; color: var(--color-text-muted); font-size: 13px; } .result-extraction-placeholder { display: grid; gap: 14px; align-content: start; padding: 22px; } .result-extraction-placeholder > strong { font-size: 20px; color: var(--color-text-primary); } .result-extraction-placeholder > p { max-width: 720px; margin: 0; color: var(--color-text-secondary); line-height: 1.7; font-size: 13px; } .result-extraction-state { justify-self: start; } .result-extraction-contract { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 10px; } .result-extraction-contract div, .result-extraction-sbas-sample { padding: 12px; border: 1px solid var(--color-border); border-radius: 8px; background: #f8fafc; } .result-extraction-contract span, .result-extraction-sbas-sample > span { display: block; margin-bottom: 7px; font-size: 11px; font-weight: 800; color: var(--color-text-muted); } .result-extraction-contract strong { font-size: 13px; color: var(--color-text-primary); } .result-extraction-sbas-sample { display: grid; gap: 8px; } .result-extraction-sbas-sample p { margin: 0; color: var(--color-text-muted); font-size: 13px; } .result-extraction-sbas-row { display: flex; justify-content: space-between; gap: 12px; padding: 8px 0; border-top: 1px solid var(--color-border); } .result-extraction-sbas-row strong { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; } .result-extraction-sbas-row span { font-size: 12px; color: var(--color-text-muted); } @media (max-width: 1200px) { .dinsar-toolbar-grid, .dinsar-catalog-summary, .dinsar-products-top-grid, .dinsar-catalog-manage, .dinsar-catalog-hero, .dinsar-catalog-detail-grid, .dinsar-catalog-kv-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .result-extraction-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); } .result-extraction-layout { grid-template-columns: minmax(220px, 280px) minmax(0, 1fr); } .result-extraction-workspace-split { grid-template-columns: 1fr; } .result-delivery-panel { border-left: 0; border-top: 1px solid var(--color-border); min-height: 260px; } .dinsar-filter-layout { grid-template-columns: repeat(2, minmax(0, 1fr)); } .dinsar-catalog-workspace { grid-template-columns: minmax(0, 320px) minmax(0, 1fr); } } @media (max-width: 1500px) { .panel--standalone .dinsar-products-top-grid { grid-template-columns: 1fr; } } @media (max-width: 900px) { .pair-planning-layout.with-map { grid-template-columns: 1fr; } .pair-planning-map-pane { position: static; } .dinsar-toolbar-grid, .dinsar-filter-layout, .dinsar-catalog-summary, .dinsar-catalog-workspace, .dinsar-products-catalog-section .dinsar-catalog-workspace, .dinsar-catalog-manage, .dinsar-catalog-filter-bar, .dinsar-catalog-hero, .dinsar-catalog-detail-grid, .dinsar-catalog-kv-grid, .dinsar-products-top-grid, .dinsar-products-form-grid { grid-template-columns: 1fr; } .dinsar-catalog-header, .dinsar-products-hero, .dinsar-catalog-card-head, .dinsar-products-card-head, .dinsar-catalog-hero-title-row, .dinsar-monitor-top, .dinsar-monitor-log-head, .dinsar-row-header, .dinsar-item .data-item-controls { flex-direction: column; align-items: flex-start; } .dinsar-row-badges { justify-content: flex-start; } .dinsar-toolbar-footer-main { align-items: stretch; } .panel-standalone-header { flex-direction: column; } .panel-standalone-actions { justify-content: flex-start; } .dinsar-catalog-list-card { position: static; max-height: none; } .dinsar-catalog-list { max-height: 48vh; } .result-extraction-layout, .result-extraction-controls, .result-extraction-contract { grid-template-columns: 1fr; } .result-extraction-channel-list { grid-template-columns: repeat(2, minmax(0, 1fr)); } .result-extraction-action-stack { align-items: stretch; } .result-extraction-checkbox { align-items: center; min-height: auto; } } @media (max-width: 640px) { .dinsar-products-page { padding: 12px; } .dinsar-results-toolbar, .dinsar-catalog-shell, .dinsar-products-card, .dinsar-products-hero { padding-left: 12px; padding-right: 12px; } .dinsar-engine-filter-row, .dinsar-toolbar-actions, .dinsar-catalog-manage-actions, .dinsar-products-actions { flex-direction: column; } .dinsar-engine-filter-row button, .dinsar-toolbar-actions button, .dinsar-catalog-manage-actions button, .dinsar-products-actions button { width: 100%; } .result-extraction-page { padding: 12px; } .result-extraction-hero, .result-extraction-card-head { flex-direction: column; align-items: flex-start; } .result-extraction-hero-meta, .result-extraction-channel-list, .result-extraction-metrics { grid-template-columns: 1fr; } .result-extraction-result-row { grid-template-columns: auto minmax(0, 1fr); } .result-extraction-result-row .dinsar-engine-badge, .result-extraction-status-chip { grid-column: 2; justify-self: start; } }