anycoder-94bb464a / index.html
Karmastudios's picture
Upload folder using huggingface_hub
97bec04 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ECU Tuner Pro | Dyno Dashboard</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root {
--bg-primary: #0a0e14;
--bg-secondary: #121820;
--bg-tertiary: #1a222e;
--bg-card: #151c26;
--accent-cyan: #00d4ff;
--accent-orange: #ff6b35;
--accent-green: #00ff88;
--accent-red: #ff3366;
--accent-yellow: #ffcc00;
--accent-purple: #a855f7;
--text-primary: #e8edf4;
--text-secondary: #8b97a8;
--text-muted: #5a6474;
--border-color: #2a3544;
--glow-cyan: 0 0 20px rgba(0, 212, 255, 0.3);
--glow-orange: 0 0 20px rgba(255, 107, 53, 0.3);
--glow-green: 0 0 20px rgba(0, 255, 136, 0.3);
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', 'Roboto', mon: var(--bgospace;
background-primary);
color: var(--text-primary);
min-height: 100vh;
overflow-x: hidden;
}
/* Header */
.header {
background: linear-gradient(180deg, var(--bg-secondary) 0%, var(--bg-primary) 100%);
border-bottom: 1px solid var(--border-color);
padding: 0.75rem 1.5rem;
display: flex;
justify-content: space-between;
align-items: center;
position: sticky;
top: 0;
z-index: 100;
}
.logo-section {
display: flex;
align-items: center;
gap: 1rem;
}
.logo {
width: 42px;
height: 42px;
background: linear-gradient(135deg, var(--accent-cyan), var(--accent-purple));
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.2rem;
font-weight: bold;
box-shadow: var(--glow-cyan);
}
.brand {
display: flex;
flex-direction: column;
}
.brand h1 {
font-size: 1.1rem;
font-weight: 700;
letter-spacing: 0.5px;
background: linear-gradient(90deg, var(--accent-cyan), var(--text-primary));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.brand span {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 2px;
}
.header-controls {
display: flex;
align-items: center;
gap: 1rem;
}
.connection-status {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.4rem 0.8rem;
background: var(--bg-tertiary);
border-radius: 20px;
font-size: 0.75rem;
border: 1px solid var(--border-color);
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--accent-green);
box-shadow: var(--glow-green);
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.header-btn {
padding: 0.5rem 1rem;
background: var(--bg-tertiary);
border: 1px solid var(--border-color);
color: var(--text-primary);
border-radius: 8px;
cursor: pointer;
font-size: 0.85rem;
display: flex;
align-items: center;
gap: 0.5rem;
transition: all 0.2s;
}
.header-btn:hover {
background: var(--accent-cyan);
color: var(--bg-primary);
border-color: var(--accent-cyan);
}
.header-btn.primary {
background: linear-gradient(135deg, var(--accent-cyan), #0099cc);
border: none;
}
/* Main Layout */
.main-container {
display: grid;
grid-template-columns: 280px 1fr 320px;
gap: 1rem;
padding: 1rem;
min-height: calc(100vh - 70px);
}
@media (max-width: 1400px) {
.main-container {
grid-template-columns: 1fr;
}
}
/* Panels */
.panel {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: 12px;
overflow: hidden;
}
.panel-header {
padding: 0.75rem 1rem;
background: var(--bg-secondary);
border-bottom: 1px solid var(--border-color);
display: flex;
justify-content: space-between;
align-items: center;
}
.panel-title {
font-size: 0.8rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--text-secondary);
display: flex;
align-items: center;
gap: 0.5rem;
}
.panel-title i {
color: var(--accent-cyan);
}
.panel-content {
padding: 1rem;
}
/* Left Sidebar */
.sidebar {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Sensor List */
.sensor-list {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.sensor-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 0.6rem 0.8rem;
background: var(--bg-tertiary);
border-radius: 8px;
border: 1px solid transparent;
transition: all 0.2s;
}
.sensor-item:hover {
border-color: var(--accent-cyan);
}
.sensor-item .label {
font-size: 0.75rem;
color: var(--text-secondary);
}
.sensor-item .value {
font-size: 0.9rem;
font-weight: 600;
font-family: 'Courier New', monospace;
}
.sensor-item .unit {
font-size: 0.7rem;
color: var(--text-muted);
margin-left: 2px;
}
/* Gauges */
.gauge-container {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
.gauge {
position: relative;
width: 100%;
aspect-ratio: 1;
background: var(--bg-tertiary);
border-radius: 50%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border: 2px solid var(--border-color);
box-shadow: inset 0 0 30px rgba(0,0,0,0.3);
}
.gauge::before {
content: '';
position: absolute;
width: 85%;
height: 85%;
border-radius: 50%;
background: conic-gradient(
from 135deg,
var(--accent-cyan) 0deg,
var(--accent-cyan) var(--value, 180deg),
var(--bg-primary) var(--value, 180deg),
var(--bg-primary) 270deg,
transparent 270deg
);
opacity: 0.3;
}
.gauge::after {
content: '';
position: absolute;
width: 70%;
height: 70%;
border-radius: 50%;
background: var(--bg-card);
z-index: 1;
}
.gauge-value {
position: relative;
z-index: 2;
text-align: center;
}
.gauge-value .number {
font-size: 1.8rem;
font-weight: 700;
font-family: 'Courier New', monospace;
line-height: 1;
}
.gauge-value .number.boost {
color: var(--accent-green);
text-shadow: var(--glow-green);
}
.gauge-value .number.rpm {
color: var(--accent-orange);
text-shadow: var(--glow-orange);
}
.gauge-value .unit {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 1px;
}
.gauge-label {
position: relative;
z-index: 2;
font-size: 0.65rem;
color: var(--text-secondary);
margin-top: 0.3rem;
text-transform: uppercase;
letter-spacing: 1px;
}
/* Center Section */
.center-section {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Main Gauges Row */
.main-gauges {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 1rem;
}
@media (max-width: 900px) {
.main-gauges {
grid-template-columns: repeat(2, 1fr);
}
}
.main-gauge-card {
background: var(--bg-card);
border: 1px solid var(--border-color);
border-radius: 12px;
padding: 1.2rem;
text-align: center;
position: relative;
overflow: hidden;
}
.main-gauge-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 3px;
background: var(--accent-cyan);
}
.main-gauge-card.boost::before {
background: var(--accent-green);
}
.main-gauge-card.rpm::before {
background: var(--accent-orange);
}
.main-gauge-card.temp::before {
background: var(--accent-red);
}
.main-gauge-card.fuel::before {
background: var(--accent-yellow);
}
.main-gauge-icon {
width: 36px;
height: 36px;
margin: 0 auto 0.5rem;
background: var(--bg-tertiary);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.9rem;
color: var(--accent-cyan);
}
.main-gauge-card.boost .main-gauge-icon {
color: var(--accent-green);
}
.main-gauge-card.rpm .main-gauge-icon {
color: var(--accent-orange);
}
.main-gauge-card.temp .main-gauge-icon {
color: var(--accent-red);
}
.main-gauge-card.fuel .main-gauge-icon {
color: var(--accent-yellow);
}
.main-gauge-value {
font-size: 2rem;
font-weight: 700;
font-family: 'Courier New', monospace;
line-height: 1;
margin-bottom: 0.2rem;
}
.main-gauge-card.boost .main-gauge-value {
color: var(--accent-green);
}
.main-gauge-card.rpm .main-gauge-value {
color: var(--accent-orange);
}
.main-gauge-card.temp .main-gauge-value {
color: var(--accent-red);
}
.main-gauge-card.fuel .main-gauge-value {
color: var(--accent-yellow);
}
.main-gauge-unit {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
}
.main-gauge-label {
font-size: 0.7rem;
color: var(--text-secondary);
margin-top: 0.5rem;
}
.main-gauge-minmax {
display: flex;
justify-content: space-between;
font-size: 0.6rem;
color: var(--text-muted);
margin-top: 0.3rem;
font-family: 'Courier New', monospace;
}
/* Map Grid */
.maps-section {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 1rem;
}
@media (max-width: 1100px) {
.maps-section {
grid-template-columns: 1fr;
}
}
.map-grid {
display: grid;
grid-template-columns: 50px repeat(8, 1fr);
gap: 2px;
font-size: 0.65rem;
}
.map-grid-header {
background: var(--bg-tertiary);
padding: 0.3rem;
text-align: center;
color: var(--text-secondary);
font-weight: 600;
}
.map-grid-row-header {
background: var(--bg-tertiary);
padding: 0.3rem;
text-align: center;
color: var(--text-secondary);
font-weight: 600;
display: flex;
align-items: center;
justify-content: center;
}
.map-cell {
background: var(--bg-secondary);
padding: 0.3rem;
text-align: center;
font-family: 'Courier New', monospace;
cursor: pointer;
transition: all 0.15s;
border: 1px solid transparent;
}
.map-cell:hover {
background: var(--accent-cyan);
color: var(--bg-primary);
transform: scale(1.05);
z-index: 1;
border-color: var(--accent-cyan);
}
.map-cell.high {
color: var(--accent-red);
}
.map-cell.medium {
color: var(--accent-yellow);
}
.map-cell.low {
color: var(--accent-green);
}
/* Timing Grid */
.timing-grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: 3px;
}
.timing-cell {
aspect-ratio: 1;
background: var(--bg-secondary);
border-radius: 4px;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.7rem;
font-family: 'Courier New', monospace;
cursor: pointer;
transition: all 0.15s;
border: 1px solid var(--border-color);
}
.timing-cell:hover {
transform: scale(1.1);
border-color: var(--accent-cyan);
z-index: 2;
}
.timing-cell.advanced {
background: linear-gradient(135deg, var(--accent-green), #00cc66);
color: var(--bg-primary);
font-weight: 600;
}
.timing-cell.retarded {
background: linear-gradient(135deg, var(--accent-red), #cc2255);
color: var(--text-primary);
font-weight: 600;
}
.timing-cell.stock {
background: var(--bg-tertiary);
color: var(--text-secondary);
}
/* Right Sidebar */
.right-sidebar {
display: flex;
flex-direction: column;
gap: 1rem;
}
/* Bar Gauges */
.bar-gauge {
margin-bottom: 1rem;
}
.bar-gauge-header {
display: flex;
justify-content: space-between;
margin-bottom: 0.4rem;
}
.bar-gauge-label {
font-size: 0.75rem;
color: var(--text-secondary);
}
.bar-gauge-value {
font-size: 0.75rem;
font-family: 'Courier New', monospace;
font-weight: 600;
}
.bar-gauge-track {
height: 8px;
background: var(--bg-tertiary);
border-radius: 4px;
overflow: hidden;
position: relative;
}
.bar-gauge-fill {
height: 100%;
border-radius: 4px;
transition: width 0.3s ease;
position: relative;
}
.bar-gauge-fill::after {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
animation: shimmer 2s infinite;
}
@keyframes shimmer {
0% { transform: translateX(-100%); }
100% { transform: translateX(100%); }
}
.bar-gauge-fill.maf {
background: linear-gradient(90deg, var(--accent-cyan), var(--accent-green));
}
.bar-gauge-fill.timing {
background: linear-gradient(90deg, var(--accent-green), var(--accent-yellow), var(--accent-red));
}
.bar-gauge-fill.fuel {
background: linear-gradient(90deg, var(--accent-yellow), var(--accent-orange));
}
.bar-gauge-fill.voltage {
background: linear-gradient(90deg, var(--accent-purple), var(--accent-cyan));
}
.bar-gauge-markers {
display: flex;
justify-content: space-between;
margin-top: 0.2rem;
font-size: 0.6rem;
color: var(--text-muted);
}
/* 3D Surface Map */
.surface-map {
height: 200px;
background: var(--bg-tertiary);
border-radius: 8px;
position: relative;
overflow: hidden;
display: flex;
align-items: flex-end;
justify-content: space-around;
padding: 1rem;
}
.surface-bar {
width: 30px;
background: linear-gradient(180deg, var(--accent-cyan), var(--accent-purple));
border-radius: 4px 4px 0 0;
transition: height 0.3s ease;
position: relative;
}
.surface-bar::after {
content: attr(data-value);
position: absolute;
top: -20px;
left: 50%;
transform: translateX(-50%);
font-size: 0.65rem;
font-family: 'Courier New', monospace;
color: var(--text-secondary);
}
/* Data Tables */
.data-table {
width: 100%;
border-collapse: collapse;
font-size: 0.7rem;
}
.data-table th {
background: var(--bg-tertiary);
padding: 0.5rem;
text-align: left;
color: var(--text-secondary);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.data-table td {
padding: 0.4rem 0.5rem;
border-bottom: 1px solid var(--border-color);
font-family: 'Courier New', monospace;
}
.data-table tr:hover td {
background: var(--bg-tertiary);
}
.data-table .highlight {
color: var(--accent-cyan);
font-weight: 600;
}
.data-table .warning {
color: var(--accent-yellow);
}
.data-table .danger {
color: var(--accent-red);
}
/* Status Indicators */
.status-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 0.5rem;
}
.status-item {
text-align: center;
padding: 0.5rem;
background: var(--bg-tertiary);
border-radius: 8px;
border: 1px solid var(--border-color);
}
.status-item.active {
border-color: var(--accent-green);
background: rgba(0, 255, 136, 0.1);
}
.status-item.warning {
border-color: var(--accent-yellow);
background: rgba(255, 204, 0, 0.1);
}
.status-icon {
font-size: 0.8rem;
margin-bottom: 0.2rem;
}
.status-item.active .status-icon {
color: var(--accent-green);
}
.status-item.warning .status-icon {
color: var(--accent-yellow);
}
.status-label {
font-size: 0.6rem;
color: var(--text-muted);
text-transform: uppercase;
}
/* Buttons */
.btn-group {
display: flex;
gap: 0.5rem;
flex-wrap: wrap;
}
.btn {
padding: 0.4rem 0.8rem;
border: 1px solid var(--border-color);
background: var(--bg-tertiary);
color: var(--text-secondary);
border-radius: 6px;
font-size: 0.7rem;
cursor: pointer;
transition: all 0.2s;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.btn:hover {
background: var(--accent-cyan);
color: var(--bg-primary);
border-color: var(--accent-cyan);
}
.btn.active {
background: var(--accent-cyan);
color: var(--bg-primary);
border-color: var(--accent-cyan);
}
.btn.danger {
border-color: var(--accent-red);
color: var(--accent-red);
}
.btn.danger:hover {
background: var(--accent-red);
color: var(--text-primary);
}
/* Tabs */
.tabs {
display: flex;
gap: 0.25rem;
background: var(--bg-tertiary);
padding: 0.25rem;
border-radius: 8px;
}
.tab {
flex: 1;
padding: 0.5rem;
text-align: center;
font-size: 0.7rem;
color: var(--text-secondary);
background: transparent;
border: none;
border-radius: 6px;
cursor: pointer;
transition: all 0.2s;
}
.tab.active {
background: var(--accent-cyan);
color: var(--bg-primary);
font-weight: 600;
}
/* RPM Gauge */
.rpm-gauge {
position: relative;
width: 100%;
max-width: 280px;
margin: 0 auto;
}
.rpm-arc {
fill: none;
stroke: var(--bg-tertiary);
stroke-width: 20;
}
.rpm-progress {
fill: none;
stroke: url(#rpmGradient);
stroke-width: 20;
stroke-linecap: round;
transform: rotate(-135deg);
transform-origin: center;
transition: stroke-dashoffset 0.3s ease;
}
.rpm-display {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
}
.rpm-value {
font-size: 2.5rem;
font-weight: 700;
font-family: 'Courier New', monospace;
color: var(--accent-orange);
text-shadow: var(--glow-orange);
}
.rpm-label {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 2px;
}
/* Dyno Graph */
.dyno-graph {
height: 180px;
background: var(--bg-tertiary);
border-radius: 8px;
position: relative;
overflow: hidden;
}
.dyno-canvas {
width: 100%;
height: 100%;
}
/* Flex utilities */
.flex-row {
display: flex;
gap: 1rem;
}
.flex-col {
display: flex;
flex-direction: column;
gap: 1rem;
}
.mb-1 {
margin-bottom: 0.5rem;
}
/* Scrollbar */
::-webkit-scrollbar {
width: 6px;
height: 6px;
}
::-webkit-scrollbar-track {
background: var(--bg-secondary);
}
::-webkit-scrollbar-thumb {
background: var(--border-color);
border-radius: 3px;
}
::-webkit-scrollbar-thumb:hover {
background: var(--accent-cyan);
}
/* Footer link */
.built-with {
text-align: center;
padding: 1rem;
font-size: 0.75rem;
color: var(--text-muted);
}
.built-with a {
color: var(--accent-cyan);
text-decoration: none;
transition: color 0.2s;
}
.built-with a:hover {
color: var(--accent-purple);
}
/* Animations */
@keyframes glow {
0%, 100% { box-shadow: 0 0 10px var(--accent-cyan); }
50% { box-shadow: 0 0 25px var(--accent-cyan); }
}
.live-indicator {
display: flex;
align-items: center;
gap: 0.5rem;
}
.live-dot {
width: 8px;
height: 8px;
background: var(--accent-red);
border-radius: 50%;
animation: blink 1s infinite;
}
@keyframes blink {
0%, 100% { opacity: 1; }
50% { opacity: 0.3; }
}
/* Responsive */
@media (max-width: 768px) {
.main-container {
padding: 0.5rem;
gap: 0.5rem;
}
.header {
padding: 0.5rem 1rem;
flex-wrap: wrap;
}
.brand h1 {
font-size: 1rem;
}
.main-gauges {
grid-template-columns: repeat(2, 1fr);
}
.maps-section {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<!-- SVG Definitions -->
<svg width="0" height="0">
<defs>
<linearGradient id="rpmGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#00ff88" />
<stop offset="50%" style="stop-color:#ffcc00" />
<stop offset="100%" style="stop-color:#ff3366" />
</linearGradient>
</defs>
</svg>
<!-- Header -->
<header class="header">
<div class="logo-section">
<div class="logo">
<i class="fas fa-microchip"></i>
</div>
<div class="brand">
<h1>ECU TUNER PRO</h1>
<span>Dyno Dashboard</span>
</div>
</div>
<div class="header-controls">
<div class="live-indicator">
<span class="live-dot"></span>
<span style="font-size: 0.75rem; color: var(--text-secondary);">LIVE</span>
</div>
<div class="connection-status">
<div class="status-dot"></div>
<span>ECU Connected</span>
</div>
<button class="header-btn">
<i class="fas fa-save"></i> Save
</button>
<button class="header-btn primary">
<i class="fas fa-bolt"></i> Tune
</button>
</div>
</header>
<!-- Main Container -->
<main class="main-container">
<!-- Left Sidebar -->
<aside class="sidebar">
<!-- RPM Gauge -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">
<i class="fas fa-tachometer-alt"></i>
RPM
</div>
</div>
<div class="panel-content" style="padding: 1.5rem;">
<div class="rpm-gauge">
<svg viewBox="0 0 200 200">
<circle class="rpm-arc" cx="100" cy="100" r="80"
stroke-dasharray="377" stroke-dashoffset="0" />
<circle class="rpm-progress" cx="100" cy="100" r="80"
stroke-dasharray="377" stroke-dashoffset="94" />
</svg>
<div class="rpm-display">
<div class="rpm-value">6,850</div>
<div class="rpm-label">RPM</div>
</div>
</div>
</div>
</div>
<!-- Sensors -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">
<i class="fas fa-thermometer-half"></i>
Sensors
</div>
</div>
<div class="panel-content">
<div class="sensor-list">
<div class="sensor-item">
<span class="label">Intake Temp</span>
<span class="value" style="color: var(--accent-cyan);">32.5<span class="unit">°C</span></span>
</div>
<div class="sensor-item">
<span class="label">Coolant Temp</span>
<span class="value" style="color: var(--accent-red);">87.2<span class="unit">°C</span></span>
</div>
<div class="sensor-item">
<span class="label">Exhaust Temp</span>
<span class="value" style="color: var(--accent-orange);">645<span class="unit">°C</span></span>
</div>
<div class="sensor-item">
<span class="label">Oil Temp</span>
<span class="value" style="color: var(--accent-yellow);">94.8<span class="unit">°C</span></span>
</div>
<div class="sensor-item">
<span class="label">Oil Pressure</span>
<span class="value" style="color: var(--accent-green);">4.2<span class="unit">bar</span></span>
</div>
<div class="sensor-item">
<span class="label">Fuel Pressure</span>
<span class="value" style="color: var(--accent-purple);">5.8<span class="unit">bar</span></span>
</div>
<div class="sensor-item">
<span class="label">Battery</span>
<span class="value" style="color: var(--accent-cyan);">14.2<span class="unit">V</span></span>
</div>
<div class="sensor-item">
<span class="label">Lambda</span>
<span class="value" style="color: var(--accent-green);">0.98<span class="unit">λ</span></span>
</div>
</div>
</div>
</div>
<!-- Status -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">
<i class="fas fa-check-circle"></i>
System Status
</div>
</div>
<div class="panel-content">
<div class="status-grid">
<div class="status-item active">
<div class="status-icon"><i class="fas fa-engine"></i></div>
<div class="status-label">Engine</div>
</div>
<div class="status-item active">
<div class="status-icon"><i class="fas fa-burn"></i></div>
<div class="status-label">Fuel</div>
</div>
<div class="status-item active">
<div class="status-icon"><i class="fas fa-fire"></i></div>
<div class="status-label">Ignition</div>
</div>
<div class="status-item warning">
<div class="status-icon"><i class="fas fa-exclamation-triangle"></i></div>
<div class="status-label">EGT</div>
</div>
</div>
</div>
</div>
</aside>
<!-- Center Section -->
<section class="center-section">
<!-- Main Gauges -->
<div class="main-gauges">
<div class="main-gauge-card boost">
<div class="main-gauge-icon">
<i class="fas fa-wind"></i>
</div>
<div class="main-gauge-value">1.42</div>
<div class="main-gauge-unit">bar</div>
<div class="main-gauge-label">Boost Pressure</div>
<div class="main-gauge-minmax">
<span>0.0</span>
<span>2.5</span>
</div>
</div>
<div class="main-gauge-card rpm">
<div class="main-gauge-icon">
<i class="fas fa-tachometer-alt"></i>
</div>
<div class="main-gauge-value">6,850</div>
<div class="main-gauge-unit">RPM</div>
<div class="main-gauge-label">Engine Speed</div>
<div class="main-gauge-minmax">
<span>0</span>
<span>8000</span>
</div>
</div>
<div class="main-gauge-card temp">
<div class="main-gauge-icon">
<i class="fas fa-temperature-high"></i>
</div>
<div class="main-gauge-value">87.2</div>
<div class="main-gauge-unit">°C</div>
<div class="main-gauge-label">Coolant Temp</div>
<div class="main-gauge-minmax">
<span>40</span>
<span>120</span>
</div>
</div>
<div class="main-gauge-card fuel">
<div class="main-gauge-icon">
<i class="fas fa-gas-pump"></i>
</div>
<div class="main-gauge-value">32.5</div>
<div class="main-gauge-unit">%</div>
<div class="main-gauge-label">Fuel Trims</div>
<div class="main-gauge-minmax">
<span>-20</span>
<span>+20</span>
</div>
</div>
</div>
<!-- Maps Grid -->
<div class="maps-section">
<!-- Fuel Map -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">
<i class="fas fa-gas-pump"></i>
Fuel Map
</div>
<div class="tabs" style="width: auto;">
<button class="tab active">VE</button>
<button class="tab">Lambda</button>
<button class="tab">AFR</button>
</div>
</div>
<div class="panel-content">
<div class="map-grid">
<div class="map-grid-header"></div>
<div class="map-grid-header">1000</div>
<div class="map-grid-header">2000</div>
<div class="map-grid-header">3000</div>
<div class="map-grid-header">4000</div>
<div class="map-grid-header">5000</div>
<div class="map-grid-header">6000</div>
<div class="map-grid-header">7000</div>
<div class="map-grid-header">8000</div>
<div class="map-grid-row-header">0.5</div>
<div class="map-cell">45.2</div>
<div class="map-cell">48.5</div>
<div class="map-cell">52.1</div>
<div class="map-cell low">55.8</div>
<div class="map-cell low">58.2</div>
<div class="map-cell">54.5</div>
<div class="map-cell">50.2</div>
<div class="map-cell medium">46.8</div>
<div class="map-grid-row-header">1.0</div>
<div class="map-cell">42.5</div>
<div class="map-cell">45.8</div>
<div class="map-cell">49.2</div>
<div class="map-cell">52.5</div>
<div class="map-cell low">56.8</div>
<div class="map-cell low">58.5</div>
<div class="map-cell">55.2</div>
<div class="map-cell">51.8</div>
<div class="map-grid-row-header">1.5</div>
<div class="map-cell">40.2</div>
<div class="map-cell">43.5</div>
<div class="map-cell">46.8</div>
<div class="map-cell">50.2</div>
<div class="map-cell">54.5</div>
<div class="map-cell low">57.2</div>
<div class="map-cell low">58.8</div>
<div class="map-cell">56.5</div>
<div class="map-grid-row-header">2.0</div>
<div class="map-cell">38.5</div>
<div class="map-cell">41.2</div>
<div class="map-cell">44.8</div>
<div class="map-cell">48.5</div>
<div class="map-cell">52.2</div>
<div class="map-cell">55.8</div>
<div class="map-cell low">58.2</div>
<div class="map-cell low">59.5</div>
</div>
</div>
</div>
<!-- Ignition Map -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">
<i class="fas fa-bolt"></i>
Ignition Timing
</div>
<div class="btn-group">
<button class="btn active">Knock</button>
<button class="btn">Base</button>
<button class="btn">Total</button>
</div>
</div>
<div class="panel-content">
<div class="map-grid">
<div class="map-grid-header"></div>
<div class="map-grid-header">1000</div>
<div class="map-grid-header">2000</div>
<div class="map-grid-header">3000</div>
<div class="map-grid-header">4000</div>
<div class="map-grid-header">5000</div>
<div class="map-grid-header">6000</div>
<div class="map-grid-header">7000</div>
<div class="map-grid-header">8000</div>
<div class="map-grid-row-header">0.5</div>
<div class="map-cell">-2.5</div>
<div class="map-cell">-1.8</div>
<div class="map-cell">-1.2</div>
<div class="map-cell">-0.5</div>
<div class="map-cell">0.0</div>
<div class="map-cell">-0.8</div>
<div class="map-cell">-2.2</div>
<div class="map-cell">-4.5</div>
<div class="map-grid-row-header">1.0</div>
<div class="map-cell">5.2</div>
<div class="map-cell">8.5</div>
<div class="map-cell">12.2</div>
<div class="map-cell">15.8</div>
<div class="map-cell">18.2</div>
<div class="map-cell">16.5</div>
<div class="map-cell">12.8</div>
<div class="map-cell">8.5</div>
<div class="map-grid-row-header">1.5</div>
<div class="map-cell">8.5</div>
<div class="map-cell">12.2</div>
<div class="map-cell">16.8</div>
<div class="map-cell">20.5</div>
<div class="map-cell">22.2</div>
<div class="map-cell">20.8</div>
<div class="map-cell">16.5</div>
<div class="map-cell">12.2</div>
<div class="map-grid-row-header">2.0</div>
<div class="map-cell">6.2</div>
<div class="map-cell">9.5</div>
<div class="map-cell">13.2</div>
<div class="map-cell">16.8</div>
<div class="map-cell">18.5</div>
<div class="map-cell">17.2</div>
<div class="map-cell">14.5</div>
<div class="map-cell">10.2</div>
</div>
</div>
</div>
<!-- Advanced Timing Grid -->
<div class="panel">
<div class="panel-header">
<div class="panel-title">
<i class="fas fa-layer-group"></i>
Timing Advance
</div>
<div class="btn-group">
<button class="btn active">Cyl 1</button>
<button class="btn">Cyl 2</button>
<button class="btn">Cyl 3</button>
<button class="btn">Cyl 4</button>
</div>
</div>
<div class="panel-content">
<div class="timing-grid">
<div class="timing-cell advanced">18.5</div>
<div class="timing-cell advanced">20.2</div>
<div class="timing-cell advanced">