Files
insar-management-system-v2/frontend/src/App.css
T

7736 lines
144 KiB
CSS

: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;
}
}