diff --git a/simulator/static/style.css b/simulator/static/style.css
index ab265d9..ca14106 100644
--- a/simulator/static/style.css
+++ b/simulator/static/style.css
@@ -1,69 +1,157 @@
body {
margin: 0;
font-family: Arial, sans-serif;
- background: #111;
+ background: #101010;
color: #eee;
}
main {
max-width: 900px;
margin: 0 auto;
- padding: 24px;
+ padding: 18px 18px 96px;
+}
+
+header {
+ text-align: center;
+ margin-bottom: 16px;
}
h1 {
+ margin: 0 0 8px;
+ font-size: 1.8rem;
+}
+
+h2 {
+ margin-top: 0;
+}
+
+#statusLine {
+ color: #aaa;
+ font-size: 0.95rem;
+}
+
+.screen {
+ display: none;
+}
+
+.screen.active {
+ display: block;
+}
+
+.big-card {
+ background: #222;
+ border: 1px solid #333;
+ border-radius: 16px;
+ padding: 24px;
text-align: center;
+ margin-bottom: 16px;
+}
+
+.big-card p {
+ font-size: 4rem;
+ margin: 0;
}
.grid {
display: grid;
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
- gap: 16px;
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
+ gap: 14px;
}
.card {
background: #222;
border: 1px solid #333;
- border-radius: 12px;
- padding: 18px;
+ border-radius: 14px;
+ padding: 16px;
text-align: center;
}
.card h2 {
font-size: 1rem;
- margin: 0 0 12px;
color: #aaa;
}
.card p {
- font-size: 2rem;
+ font-size: 2.1rem;
margin: 0;
}
-.controls {
- margin-top: 24px;
+.relay-row {
display: flex;
gap: 12px;
- flex-wrap: wrap;
- justify-content: center;
+ margin-top: 16px;
+}
+
+.relay-pill {
+ flex: 1;
+ background: #252525;
+ border: 1px solid #444;
+ border-radius: 999px;
+ padding: 14px;
+ text-align: center;
+ font-size: 1.2rem;
+}
+
+.detail-list {
+ background: #222;
+ border: 1px solid #333;
+ border-radius: 14px;
+ overflow: hidden;
+ margin-bottom: 18px;
+}
+
+.detail-list div {
+ display: flex;
+ justify-content: space-between;
+ padding: 16px;
+ border-bottom: 1px solid #333;
+ font-size: 1.2rem;
+}
+
+.detail-list div:last-child {
+ border-bottom: none;
}
button {
- font-size: 1rem;
- padding: 14px 20px;
+ font-size: 1.1rem;
+ padding: 16px 20px;
border: none;
- border-radius: 10px;
+ border-radius: 12px;
background: #444;
color: white;
cursor: pointer;
+ min-width: 130px;
}
button:hover {
background: #666;
}
-.status {
- margin-top: 24px;
- text-align: center;
- color: #aaa;
+#power button,
+#system button {
+ display: block;
+ width: 100%;
+ margin-bottom: 14px;
+ font-size: 1.4rem;
+ padding: 22px;
+}
+
+nav {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: #181818;
+ border-top: 1px solid #333;
+ display: grid;
+ grid-template-columns: repeat(5, 1fr);
+ gap: 4px;
+ padding: 8px;
+}
+
+nav button {
+ min-width: 0;
+ padding: 14px 4px;
+ font-size: 0.9rem;
+ border-radius: 10px;
}
diff --git a/simulator/templates/index.html b/simulator/templates/index.html
index b1f4d22..abdc92a 100644
--- a/simulator/templates/index.html
+++ b/simulator/templates/index.html
@@ -5,110 +5,153 @@
-
+
+
Xterra Dashboard
+ RS-485: -- | WiFi: --
+
-
-
-
Battery
-
--%
-
--V / --A
-
+
+
+
Battery
+
--%
+
-- hr runtime
+
-
-
Runtime
-
-- hr
-
-- Ah remaining
-
+
-
+
+
Starlink: --
+
Fridge: --
+
+
-
+
+ Battery Detail
+
+
SOC --%
+
Voltage -- V
+
Current -- A
+
Remaining -- Ah
+
Runtime -- hr
+
Battery Temp --°F
+
+
-
+
-
-
+
+ Power Control
+
+
+
-
-
-
-
-
+
+ System
+
+
RS-485 --
+
WiFi --
+
WiFi Override --
+
+
+
+
-
- RS-485: --
- WiFi: --
-
-
+
-
+async function enableWifi() {
+ await fetch('/network/wifi', {
+ method: 'POST',
+ headers: {'Content-Type': 'application/json'},
+ body: JSON.stringify({minutes: 10})
+ });
+
+ loadStatus();
+}
+
+loadStatus();
+setInterval(loadStatus, 2000);
+