365 lines
8.4 KiB
CSS
365 lines
8.4 KiB
CSS
/* ══════════════════════════════════════════════════════════════
|
|
MONITOR PANEL — Market Monitor board
|
|
All colours reference design tokens so dark/light theme works.
|
|
══════════════════════════════════════════════════════════════ */
|
|
|
|
.root :global(.monitor-panel) {
|
|
background: var(--color-bg-base);
|
|
height: 100%;
|
|
overflow: auto;
|
|
padding: 20px 24px;
|
|
color: var(--color-text-primary);
|
|
}
|
|
|
|
/* ── Header ── */
|
|
.root :global(.monitor-header) {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: baseline;
|
|
margin-bottom: 24px;
|
|
padding-bottom: 12px;
|
|
border-bottom: 1px solid var(--color-border-subtle);
|
|
flex-wrap: wrap;
|
|
gap: 8px;
|
|
}
|
|
|
|
.root :global(.monitor-title) {
|
|
font-size: 20px;
|
|
font-weight: 600;
|
|
color: var(--color-text-primary);
|
|
}
|
|
|
|
.root :global(.monitor-controls) {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 12px;
|
|
}
|
|
|
|
.root :global(.monitor-loading-indicator) {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 6px;
|
|
font-size: 12px;
|
|
color: var(--color-text-muted);
|
|
}
|
|
|
|
.root :global(.monitor-loading-dot) {
|
|
display: inline-block;
|
|
width: 8px;
|
|
height: 8px;
|
|
border-radius: 50%;
|
|
background: var(--color-accent-primary);
|
|
animation: monitorPulse 1.2s ease-in-out infinite;
|
|
}
|
|
|
|
.root :global(.monitor-notify-btn) {
|
|
background: none;
|
|
border: 1px solid var(--color-border-default);
|
|
border-radius: 6px;
|
|
padding: 2px 8px;
|
|
font-size: 16px;
|
|
cursor: pointer;
|
|
transition: var(--transition-fast);
|
|
color: inherit;
|
|
}
|
|
|
|
.root :global(.monitor-notify-btn:hover) {
|
|
border-color: var(--color-border-hover);
|
|
background: var(--color-bg-raised);
|
|
}
|
|
|
|
.root :global(.monitor-notify-btn.muted) {
|
|
opacity: 0.4;
|
|
}
|
|
|
|
.root :global(.monitor-time) {
|
|
font-size: 13px;
|
|
color: var(--color-text-muted);
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
/* ── Grid ── */
|
|
.root :global(.monitor-grid) {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
|
|
gap: 14px;
|
|
}
|
|
|
|
/* ── Skeleton card ── */
|
|
.root :global(.monitor-skeleton-card) {
|
|
background: var(--color-bg-raised);
|
|
border: 1px solid var(--color-border-subtle);
|
|
border-radius: 12px;
|
|
padding: 20px 24px;
|
|
min-height: 148px;
|
|
animation: monitorShimmer 1.6s ease-in-out infinite;
|
|
}
|
|
|
|
.root :global(.monitor-skeleton-line) {
|
|
background: var(--color-border-default);
|
|
border-radius: 4px;
|
|
margin-bottom: 8px;
|
|
}
|
|
|
|
/* ── City card ── */
|
|
.root :global(.monitor-card) {
|
|
background: var(--color-bg-raised);
|
|
border: 1px solid var(--color-border-default);
|
|
border-radius: 12px;
|
|
padding: 20px 24px;
|
|
transition: border-color var(--transition-base);
|
|
}
|
|
|
|
.root :global(.monitor-card.new-high) {
|
|
border-color: rgba(124, 58, 237, 0.3);
|
|
}
|
|
|
|
/* ── Card header ── */
|
|
.root :global(.monitor-card-head) {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 8px;
|
|
margin-bottom: 14px;
|
|
font-size: 15px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
.root :global(.monitor-city-name) {
|
|
color: var(--color-text-primary);
|
|
font-weight: 700;
|
|
}
|
|
|
|
.root :global(.monitor-airport-name) {
|
|
color: var(--color-text-secondary);
|
|
}
|
|
|
|
.root :global(.monitor-obs-time) {
|
|
margin-left: auto;
|
|
color: var(--color-text-muted);
|
|
font-size: 14px;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.root :global(.monitor-new-high-badge) {
|
|
font-size: 12px;
|
|
padding: 1px 6px;
|
|
border-radius: 4px;
|
|
background: rgba(124, 58, 237, 0.18);
|
|
color: #a78bfa;
|
|
font-weight: 600;
|
|
}
|
|
|
|
/* ── Temperature display ── */
|
|
.root :global(.monitor-temp-display) {
|
|
margin: 8px 0 10px;
|
|
line-height: 1.15;
|
|
}
|
|
|
|
.root :global(.monitor-temp-value) {
|
|
font-size: 48px;
|
|
font-weight: 700;
|
|
letter-spacing: -0.03em;
|
|
color: var(--color-text-primary);
|
|
}
|
|
|
|
.root :global(.monitor-temp-value.new-high) {
|
|
color: #c084fc;
|
|
}
|
|
|
|
.root :global(.monitor-temp-value.warm) {
|
|
color: var(--color-signal-warning);
|
|
}
|
|
|
|
.root :global(.monitor-temp-unit) {
|
|
font-size: 20px;
|
|
color: var(--color-text-muted);
|
|
margin-left: 3px;
|
|
}
|
|
|
|
.root :global(.monitor-temp-missing) {
|
|
font-size: 30px;
|
|
color: var(--color-border-default);
|
|
}
|
|
|
|
/* ── Stats row ── */
|
|
.root :global(.monitor-stats) {
|
|
font-size: 14px;
|
|
}
|
|
|
|
.root :global(.monitor-high-row) {
|
|
display: flex;
|
|
align-items: baseline;
|
|
gap: 8px;
|
|
}
|
|
|
|
.root :global(.monitor-stat-label) {
|
|
color: var(--color-text-muted);
|
|
}
|
|
|
|
.root :global(.monitor-high-value) {
|
|
color: var(--color-text-secondary);
|
|
}
|
|
|
|
.root :global(.monitor-high-time) {
|
|
font-size: 12px;
|
|
color: var(--color-text-muted);
|
|
margin-left: 2px;
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
.root :global(.monitor-stat-missing) {
|
|
color: var(--color-border-default);
|
|
}
|
|
|
|
.root :global(.monitor-trend) {
|
|
margin-left: auto;
|
|
font-size: 18px;
|
|
font-weight: 700;
|
|
}
|
|
|
|
.root :global(.monitor-trend.rising) {
|
|
color: var(--color-signal-success);
|
|
}
|
|
|
|
.root :global(.monitor-trend.falling) {
|
|
color: var(--color-accent-primary);
|
|
}
|
|
|
|
.root :global(.monitor-trend.flat) {
|
|
color: var(--color-text-muted);
|
|
}
|
|
|
|
.root :global(.monitor-obs-row) {
|
|
display: flex;
|
|
gap: 8px;
|
|
margin-top: 4px;
|
|
}
|
|
|
|
.root :global(.monitor-obs-age) {
|
|
color: var(--color-text-muted);
|
|
font-size: 13px;
|
|
}
|
|
|
|
/* ── Runway sub-section ── */
|
|
.root :global(.monitor-divider) {
|
|
height: 1px;
|
|
background: var(--color-border-subtle);
|
|
margin: 10px 0 8px;
|
|
}
|
|
|
|
.root :global(.monitor-rw-row) {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: 13px;
|
|
margin-bottom: 2px;
|
|
}
|
|
|
|
.root :global(.monitor-rw-label) {
|
|
color: var(--color-text-muted);
|
|
}
|
|
|
|
.root :global(.monitor-rw-temp) {
|
|
color: var(--color-text-secondary);
|
|
font-variant-numeric: tabular-nums;
|
|
}
|
|
|
|
/* ══════════════════════════════════════════════════════════════
|
|
LIGHT THEME OVERRIDES
|
|
Scoped to .scan-terminal.light so the panel responds to the
|
|
terminal's built-in theme toggle (not html.light).
|
|
══════════════════════════════════════════════════════════════ */
|
|
|
|
.root :global(.scan-terminal.light .monitor-panel) {
|
|
background: #F7F9FC;
|
|
color: #0F172A;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-header) {
|
|
border-bottom-color: #E2E8F0;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-title) {
|
|
color: #0F172A;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-time),
|
|
.root :global(.scan-terminal.light .monitor-stat-label),
|
|
.root :global(.scan-terminal.light .monitor-obs-time),
|
|
.root :global(.scan-terminal.light .monitor-obs-age),
|
|
.root :global(.scan-terminal.light .monitor-rw-label),
|
|
.root :global(.scan-terminal.light .monitor-high-time),
|
|
.root :global(.scan-terminal.light .monitor-loading-indicator) {
|
|
color: #475569;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-card) {
|
|
background: #FFFFFF;
|
|
border-color: #E2E8F0;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-card.new-high) {
|
|
border-color: rgba(124, 58, 237, 0.24);
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-skeleton-card) {
|
|
background: #FFFFFF;
|
|
border-color: #E2E8F0;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-skeleton-line) {
|
|
background: #E2E8F0;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-city-name) {
|
|
color: #0F172A;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-airport-name),
|
|
.root :global(.scan-terminal.light .monitor-high-value),
|
|
.root :global(.scan-terminal.light .monitor-rw-temp) {
|
|
color: #334155;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-temp-value) {
|
|
color: #0F172A;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-temp-unit),
|
|
.root :global(.scan-terminal.light .monitor-temp-missing),
|
|
.root :global(.scan-terminal.light .monitor-stat-missing) {
|
|
color: #94A3B8;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-divider) {
|
|
background: #E2E8F0;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-notify-btn) {
|
|
border-color: rgba(148, 163, 184, 0.3);
|
|
color: #334155;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-notify-btn:hover) {
|
|
border-color: rgba(37, 99, 235, 0.38);
|
|
background: #EEF2F7;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-trend.rising) {
|
|
color: #16a34a;
|
|
}
|
|
|
|
.root :global(.scan-terminal.light .monitor-trend.falling) {
|
|
color: #2563EB;
|
|
}
|
|
|
|
/* ── Animations ── */
|
|
@keyframes monitorPulse {
|
|
0%, 100% { opacity: 1; }
|
|
50% { opacity: 0.3; }
|
|
}
|
|
|
|
@keyframes monitorShimmer {
|
|
0%, 100% { opacity: 0.55; }
|
|
50% { opacity: 1; }
|
|
}
|