fix: replace 100+ hardcoded colors with CSS variables for light theme

Add theme-aware severity/neon CSS variables and replace hardcoded hex
colors (#fff, #000, #00ff88, #ffcc00, etc.) with var() references
across 26 files so text remains readable in both dark and light themes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Smittix
2026-03-03 11:35:17 +00:00
parent f3d475d53a
commit 38644bced6
26 changed files with 4415 additions and 4326 deletions

View File

@@ -136,7 +136,7 @@
.activity-timeline-btn.active {
background: var(--timeline-accent);
color: #000;
color: var(--text-inverse);
border-color: var(--timeline-accent);
}

View File

@@ -185,7 +185,7 @@
.function-strip .strip-btn.primary {
background: linear-gradient(135deg, var(--accent-green) 0%, #10b981 100%);
border: none;
color: #000;
color: var(--text-inverse);
}
.function-strip .strip-btn.primary:hover:not(:disabled) {
@@ -195,7 +195,7 @@
.function-strip .strip-btn.stop {
background: linear-gradient(135deg, var(--accent-red) 0%, #dc2626 100%);
border: none;
color: #fff;
color: var(--text-inverse);
}
.function-strip .strip-btn.stop:hover:not(:disabled) {
@@ -304,7 +304,7 @@
border-color: rgba(0, 122, 255, 0.3);
}
.function-strip.bt-strip .strip-value {
color: #0a84ff;
color: var(--accent-blue, #0a84ff);
}
.function-strip.wifi-strip .strip-stat {
@@ -332,24 +332,24 @@
border-color: rgba(255, 59, 48, 0.6);
}
.function-strip.tscm-strip .strip-value {
color: #ef4444; /* Explicit red color */
color: var(--accent-red);
}
.function-strip.tscm-strip .strip-label {
color: #9ca3af; /* Explicit light gray */
color: var(--text-secondary);
}
.function-strip.tscm-strip .strip-select {
color: #e8eaed; /* Explicit white for selects */
color: var(--text-primary);
background: rgba(0, 0, 0, 0.4);
}
.function-strip.tscm-strip .strip-btn {
color: #e8eaed; /* Explicit white for buttons */
color: var(--text-primary);
}
.function-strip.tscm-strip .strip-tool {
color: #e8eaed; /* Explicit white for tool indicators */
color: var(--text-primary);
}
.function-strip.tscm-strip .strip-time,
.function-strip.tscm-strip .strip-status span {
color: #9ca3af; /* Explicit gray for status/time */
color: var(--text-secondary);
}
.function-strip.rtlamr-strip .strip-stat {
@@ -361,7 +361,7 @@
border-color: rgba(175, 82, 222, 0.3);
}
.function-strip.rtlamr-strip .strip-value {
color: #af52de;
color: var(--accent-purple, #af52de);
}
.function-strip.listening-strip .strip-stat {

View File

@@ -1,293 +1,293 @@
/**
* Proximity Visualization Components
* Styles for radar and timeline heatmap
*/
/* ============================================
PROXIMITY RADAR
============================================ */
.proximity-radar-svg {
display: block;
margin: 0 auto;
}
.radar-device {
cursor: pointer;
}
.radar-device:hover .radar-dot {
filter: brightness(1.5);
}
/* Invisible larger hit area to prevent hover flicker */
.radar-device-hitarea {
fill: transparent;
pointer-events: all;
}
.radar-dot-pulse circle:first-child {
animation: radar-pulse 1.5s ease-out infinite;
}
@keyframes radar-pulse {
0% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(2);
opacity: 0;
}
}
.radar-sweep {
transform-origin: 50% 50%;
}
/* Radar filter buttons */
.bt-radar-filter-btn {
transition: all 0.2s ease;
}
.bt-radar-filter-btn:hover {
background: var(--bg-hover, #333) !important;
color: #fff !important;
}
.bt-radar-filter-btn.active {
background: #00d4ff !important;
color: #000 !important;
border-color: #00d4ff !important;
}
#btRadarPauseBtn.active {
background: #f97316 !important;
color: #000 !important;
border-color: #f97316 !important;
}
/* ============================================
TIMELINE HEATMAP
============================================ */
.timeline-heatmap-controls {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
padding: 8px 0;
margin-bottom: 8px;
border-bottom: 1px solid var(--border-color, #333);
}
.heatmap-control-group {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: var(--text-dim, #888);
}
.heatmap-select {
background: var(--bg-tertiary, #1a1a1a);
border: 1px solid var(--border-color, #333);
border-radius: 4px;
color: var(--text-primary, #e0e0e0);
font-size: 10px;
padding: 4px 8px;
cursor: pointer;
}
.heatmap-select:hover {
border-color: var(--accent-color, #00d4ff);
}
.heatmap-btn {
background: var(--bg-tertiary, #1a1a1a);
border: 1px solid var(--border-color, #333);
border-radius: 4px;
color: var(--text-dim, #888);
font-size: 10px;
padding: 4px 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.heatmap-btn:hover {
background: var(--bg-hover, #252525);
color: var(--text-primary, #e0e0e0);
}
.heatmap-btn.active {
background: #f97316;
color: #000;
border-color: #f97316;
}
.timeline-heatmap-content {
max-height: 300px;
overflow-y: auto;
overflow-x: auto;
}
.heatmap-loading,
.heatmap-empty,
.heatmap-error {
color: var(--text-dim, #666);
text-align: center;
padding: 30px;
font-size: 12px;
}
.heatmap-error {
color: #ef4444;
}
.heatmap-grid {
display: flex;
flex-direction: column;
gap: 2px;
min-width: max-content;
}
.heatmap-row {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 0;
cursor: pointer;
border-radius: 4px;
transition: background 0.2s ease;
}
.heatmap-row:hover:not(.heatmap-header) {
background: rgba(255, 255, 255, 0.05);
}
.heatmap-row.selected {
background: rgba(0, 212, 255, 0.1);
outline: 1px solid rgba(0, 212, 255, 0.3);
}
.heatmap-header {
cursor: default;
border-bottom: 1px solid var(--border-color, #333);
margin-bottom: 4px;
}
.heatmap-label {
width: 120px;
min-width: 120px;
display: flex;
flex-direction: column;
gap: 2px;
padding-right: 8px;
overflow: hidden;
}
.heatmap-label .device-name {
font-size: 10px;
color: var(--text-primary, #e0e0e0);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.heatmap-label .device-rssi {
font-size: 9px;
color: var(--text-dim, #666);
font-family: monospace;
}
.heatmap-cells {
display: flex;
gap: 1px;
}
.heatmap-cell {
border-radius: 2px;
transition: transform 0.1s ease;
}
.heatmap-cell:hover {
transform: scale(1.5);
z-index: 10;
position: relative;
}
.heatmap-time-label {
font-size: 8px;
color: var(--text-dim, #666);
text-align: center;
transform: rotate(-45deg);
white-space: nowrap;
}
.heatmap-legend {
display: flex;
align-items: center;
gap: 12px;
padding-top: 8px;
margin-top: 8px;
border-top: 1px solid var(--border-color, #333);
font-size: 10px;
color: var(--text-dim, #666);
}
.legend-label {
font-weight: 500;
}
.legend-item {
display: flex;
align-items: center;
gap: 4px;
}
.legend-color {
width: 12px;
height: 12px;
border-radius: 2px;
}
/* ============================================
ZONE SUMMARY
============================================ */
#btZoneSummary {
padding: 8px 0;
}
#btZoneSummary > div {
min-width: 60px;
}
/* ============================================
RESPONSIVE ADJUSTMENTS
============================================ */
@media (max-width: 768px) {
.timeline-heatmap-controls {
flex-direction: column;
align-items: stretch;
}
.heatmap-control-group {
justify-content: space-between;
}
.proximity-radar-svg {
max-width: 100%;
height: auto;
}
#btRadarControls {
flex-direction: column;
gap: 4px;
}
#btZoneSummary {
flex-wrap: wrap;
}
}
/**
* Proximity Visualization Components
* Styles for radar and timeline heatmap
*/
/* ============================================
PROXIMITY RADAR
============================================ */
.proximity-radar-svg {
display: block;
margin: 0 auto;
}
.radar-device {
cursor: pointer;
}
.radar-device:hover .radar-dot {
filter: brightness(1.5);
}
/* Invisible larger hit area to prevent hover flicker */
.radar-device-hitarea {
fill: transparent;
pointer-events: all;
}
.radar-dot-pulse circle:first-child {
animation: radar-pulse 1.5s ease-out infinite;
}
@keyframes radar-pulse {
0% {
transform: scale(1);
opacity: 1;
}
100% {
transform: scale(2);
opacity: 0;
}
}
.radar-sweep {
transform-origin: 50% 50%;
}
/* Radar filter buttons */
.bt-radar-filter-btn {
transition: all 0.2s ease;
}
.bt-radar-filter-btn:hover {
background: var(--bg-hover, #333) !important;
color: var(--text-primary) !important;
}
.bt-radar-filter-btn.active {
background: var(--accent-cyan) !important;
color: var(--text-inverse) !important;
border-color: var(--accent-cyan) !important;
}
#btRadarPauseBtn.active {
background: var(--accent-orange) !important;
color: var(--text-inverse) !important;
border-color: var(--accent-orange) !important;
}
/* ============================================
TIMELINE HEATMAP
============================================ */
.timeline-heatmap-controls {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: center;
padding: 8px 0;
margin-bottom: 8px;
border-bottom: 1px solid var(--border-color, #333);
}
.heatmap-control-group {
display: flex;
align-items: center;
gap: 6px;
font-size: 11px;
color: var(--text-dim, #888);
}
.heatmap-select {
background: var(--bg-tertiary, #1a1a1a);
border: 1px solid var(--border-color, #333);
border-radius: 4px;
color: var(--text-primary, #e0e0e0);
font-size: 10px;
padding: 4px 8px;
cursor: pointer;
}
.heatmap-select:hover {
border-color: var(--accent-color, #00d4ff);
}
.heatmap-btn {
background: var(--bg-tertiary, #1a1a1a);
border: 1px solid var(--border-color, #333);
border-radius: 4px;
color: var(--text-dim, #888);
font-size: 10px;
padding: 4px 12px;
cursor: pointer;
transition: all 0.2s ease;
}
.heatmap-btn:hover {
background: var(--bg-hover, #252525);
color: var(--text-primary, #e0e0e0);
}
.heatmap-btn.active {
background: var(--accent-orange);
color: var(--text-inverse);
border-color: var(--accent-orange);
}
.timeline-heatmap-content {
max-height: 300px;
overflow-y: auto;
overflow-x: auto;
}
.heatmap-loading,
.heatmap-empty,
.heatmap-error {
color: var(--text-dim, #666);
text-align: center;
padding: 30px;
font-size: 12px;
}
.heatmap-error {
color: var(--accent-red);
}
.heatmap-grid {
display: flex;
flex-direction: column;
gap: 2px;
min-width: max-content;
}
.heatmap-row {
display: flex;
align-items: center;
gap: 4px;
padding: 2px 0;
cursor: pointer;
border-radius: 4px;
transition: background 0.2s ease;
}
.heatmap-row:hover:not(.heatmap-header) {
background: rgba(255, 255, 255, 0.05);
}
.heatmap-row.selected {
background: rgba(0, 212, 255, 0.1);
outline: 1px solid rgba(0, 212, 255, 0.3);
}
.heatmap-header {
cursor: default;
border-bottom: 1px solid var(--border-color, #333);
margin-bottom: 4px;
}
.heatmap-label {
width: 120px;
min-width: 120px;
display: flex;
flex-direction: column;
gap: 2px;
padding-right: 8px;
overflow: hidden;
}
.heatmap-label .device-name {
font-size: 10px;
color: var(--text-primary, #e0e0e0);
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.heatmap-label .device-rssi {
font-size: 9px;
color: var(--text-dim, #666);
font-family: monospace;
}
.heatmap-cells {
display: flex;
gap: 1px;
}
.heatmap-cell {
border-radius: 2px;
transition: transform 0.1s ease;
}
.heatmap-cell:hover {
transform: scale(1.5);
z-index: 10;
position: relative;
}
.heatmap-time-label {
font-size: 8px;
color: var(--text-dim, #666);
text-align: center;
transform: rotate(-45deg);
white-space: nowrap;
}
.heatmap-legend {
display: flex;
align-items: center;
gap: 12px;
padding-top: 8px;
margin-top: 8px;
border-top: 1px solid var(--border-color, #333);
font-size: 10px;
color: var(--text-dim, #666);
}
.legend-label {
font-weight: 500;
}
.legend-item {
display: flex;
align-items: center;
gap: 4px;
}
.legend-color {
width: 12px;
height: 12px;
border-radius: 2px;
}
/* ============================================
ZONE SUMMARY
============================================ */
#btZoneSummary {
padding: 8px 0;
}
#btZoneSummary > div {
min-width: 60px;
}
/* ============================================
RESPONSIVE ADJUSTMENTS
============================================ */
@media (max-width: 768px) {
.timeline-heatmap-controls {
flex-direction: column;
align-items: stretch;
}
.heatmap-control-group {
justify-content: space-between;
}
.proximity-radar-svg {
max-width: 100%;
height: auto;
}
#btRadarControls {
flex-direction: column;
gap: 4px;
}
#btZoneSummary {
flex-wrap: wrap;
}
}

View File

@@ -279,19 +279,19 @@
.signal-proto-badge.aprs {
background: rgba(6, 182, 212, 0.15);
color: #06b6d4;
color: var(--proto-aprs, #06b6d4);
border-color: rgba(6, 182, 212, 0.25);
}
.signal-proto-badge.ais {
background: rgba(139, 92, 246, 0.15);
color: #8b5cf6;
color: var(--proto-ais, #8b5cf6);
border-color: rgba(139, 92, 246, 0.25);
}
.signal-proto-badge.acars {
background: rgba(236, 72, 153, 0.15);
color: #ec4899;
color: var(--proto-acars, #ec4899);
border-color: rgba(236, 72, 153, 0.25);
}
@@ -976,25 +976,25 @@
/* Meter protocol badges */
.signal-proto-badge.meter {
background: rgba(234, 179, 8, 0.15);
color: #eab308;
color: var(--accent-yellow, #eab308);
border-color: rgba(234, 179, 8, 0.25);
}
.signal-proto-badge.meter.electric {
background: rgba(234, 179, 8, 0.15);
color: #eab308;
color: var(--accent-yellow, #eab308);
border-color: rgba(234, 179, 8, 0.25);
}
.signal-proto-badge.meter.gas {
background: rgba(249, 115, 22, 0.15);
color: #f97316;
color: var(--accent-orange, #f97316);
border-color: rgba(249, 115, 22, 0.25);
}
.signal-proto-badge.meter.water {
background: rgba(59, 130, 246, 0.15);
color: #3b82f6;
color: var(--signal-new, #3b82f6);
border-color: rgba(59, 130, 246, 0.25);
}
@@ -1060,12 +1060,12 @@
.meter-delta.positive {
background: rgba(34, 197, 94, 0.15);
color: #22c55e;
color: var(--accent-green);
}
.meter-delta.negative {
background: rgba(239, 68, 68, 0.15);
color: #ef4444;
color: var(--accent-red);
}
/* Sparkline container */
@@ -1431,7 +1431,7 @@
.signal-station-clickable:hover {
background: var(--accent-purple);
color: #000;
color: var(--text-inverse);
transform: scale(1.05);
box-shadow: 0 0 8px rgba(138, 43, 226, 0.4);
}
@@ -1587,14 +1587,14 @@
background: var(--accent-purple, #8a2be2);
border: none;
border-radius: 4px;
color: #fff;
color: var(--text-inverse);
cursor: pointer;
transition: all 0.15s ease;
}
.station-raw-copy-btn:hover {
background: var(--accent-cyan, #00d4ff);
color: #000;
color: var(--text-inverse);
}
/* ============================================
@@ -1794,14 +1794,14 @@
background: var(--accent-purple, #8a2be2);
border: none;
border-radius: 4px;
color: #fff;
color: var(--text-inverse);
cursor: pointer;
transition: all 0.15s ease;
}
.signal-details-copy-btn:hover {
background: var(--accent-cyan, #00d4ff);
color: #000;
color: var(--text-inverse);
}
/* Signal Details Content Sections */

View File

@@ -103,7 +103,7 @@
.signal-timeline-btn.active {
background: var(--accent-cyan, #4a9eff);
color: #000;
color: var(--text-inverse);
border-color: var(--accent-cyan, #4a9eff);
}

View File

@@ -122,7 +122,7 @@
.update-toast-btn-primary {
background: var(--accent-green, #22c55e);
color: #000;
color: var(--text-inverse);
}
.update-toast-btn-primary:hover {
@@ -561,7 +561,7 @@
.update-modal-btn-primary {
background: var(--accent-green, #22c55e);
color: #000;
color: var(--text-inverse);
}
.update-modal-btn-primary:hover:not(:disabled) {

View File

@@ -323,7 +323,7 @@
}
.setup-btn.primary {
color: #fff;
color: var(--text-inverse);
background: var(--accent-cyan, #4aa3ff);
border-color: var(--accent-cyan, #4aa3ff);
}