style: upgrade dashboard to white theme responsive card design
This commit is contained in:
Executable
+50
@@ -0,0 +1,50 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Exit on error
|
||||
set -e
|
||||
|
||||
SERVICE_NAME="contec-forwarder"
|
||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
||||
WORKING_DIR="/home/prathiyuman/Prathiyuman/ContecMonitor/fiveparaminte-main"
|
||||
PYTHON_EXEC="${WORKING_DIR}/venv/bin/python"
|
||||
SCRIPT_PATH="${WORKING_DIR}/main.py"
|
||||
|
||||
echo "=== Creating systemd service file ==="
|
||||
sudo bash -c "cat > ${SERVICE_FILE}" <<EOF
|
||||
[Unit]
|
||||
Description=Contec Patient Monitor Vital Signs Forwarder
|
||||
After=network.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=root
|
||||
WorkingDirectory=${WORKING_DIR}
|
||||
Environment=PORT=8006
|
||||
ExecStart=${PYTHON_EXEC} ${SCRIPT_PATH}
|
||||
Restart=always
|
||||
RestartSec=5
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
echo "=== Reloading systemd daemon ==="
|
||||
sudo systemctl daemon-reload
|
||||
|
||||
echo "=== Enabling ${SERVICE_NAME} to start on boot ==="
|
||||
sudo systemctl enable ${SERVICE_NAME}
|
||||
|
||||
echo "=== Starting ${SERVICE_NAME} service ==="
|
||||
sudo systemctl restart ${SERVICE_NAME}
|
||||
|
||||
echo "=== Service Status ==="
|
||||
sudo systemctl status ${SERVICE_NAME} --no-pager
|
||||
|
||||
echo ""
|
||||
echo "=========================================================="
|
||||
echo "SUCCESS: Contec Forwarder is now running in the background!"
|
||||
echo "To check live service logs, run:"
|
||||
echo " sudo journalctl -u contec-forwarder -f"
|
||||
echo "=========================================================="
|
||||
@@ -7,7 +7,7 @@
|
||||
<meta name="description" content="Real-time patient vital signs monitoring dashboard for Contec CMS7000PLUS / CMS8500 patient monitors">
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800;900&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
||||
<style>
|
||||
/* === CSS Reset & Base === */
|
||||
*, *::before, *::after {
|
||||
@@ -17,54 +17,56 @@
|
||||
}
|
||||
|
||||
:root {
|
||||
/* Core palette */
|
||||
--bg-primary: #0a0e1a;
|
||||
--bg-secondary: #111827;
|
||||
--bg-card: rgba(17, 24, 39, 0.7);
|
||||
--bg-card-hover: rgba(25, 34, 56, 0.8);
|
||||
--border-color: rgba(255, 255, 255, 0.06);
|
||||
--text-primary: #f1f5f9;
|
||||
--text-secondary: #94a3b8;
|
||||
--text-dim: #64748b;
|
||||
/* Core palette (Light White Theme) */
|
||||
--bg-primary: #f8fafc;
|
||||
--bg-secondary: #ffffff;
|
||||
--bg-card: #ffffff;
|
||||
--bg-card-hover: #f1f5f9;
|
||||
--border-color: rgba(15, 23, 42, 0.08);
|
||||
--text-primary: #0f172a;
|
||||
--text-secondary: #475569;
|
||||
--text-dim: #94a3b8;
|
||||
|
||||
/* Vital sign accent colors */
|
||||
--hr-color: #ef4444;
|
||||
--hr-glow: rgba(239, 68, 68, 0.4);
|
||||
--spo2-color: #06b6d4;
|
||||
--spo2-glow: rgba(6, 182, 212, 0.4);
|
||||
--bp-color: #a855f7;
|
||||
--bp-glow: rgba(168, 85, 247, 0.4);
|
||||
--rr-color: #22c55e;
|
||||
--rr-glow: rgba(34, 197, 94, 0.4);
|
||||
--temp-color: #f97316;
|
||||
--temp-glow: rgba(249, 115, 22, 0.4);
|
||||
--map-color: #ec4899;
|
||||
--map-glow: rgba(236, 72, 153, 0.4);
|
||||
/* Vital sign accent colors (optimized for white background contrast) */
|
||||
--hr-color: #dc2626; /* dark red */
|
||||
--hr-glow: rgba(220, 38, 38, 0.1);
|
||||
--spo2-color: #0891b2; /* dark cyan */
|
||||
--spo2-glow: rgba(8, 145, 178, 0.1);
|
||||
--bp-color: #7c3aed; /* dark purple */
|
||||
--bp-glow: rgba(124, 58, 237, 0.1);
|
||||
--rr-color: #16a34a; /* dark green */
|
||||
--rr-glow: rgba(22, 163, 74, 0.1);
|
||||
--temp-color: #ea580c; /* dark orange */
|
||||
--temp-glow: rgba(234, 88, 12, 0.1);
|
||||
--map-color: #db2777; /* dark pink */
|
||||
--map-glow: rgba(219, 39, 119, 0.1);
|
||||
|
||||
/* Status */
|
||||
--status-ok: #22c55e;
|
||||
--status-warn: #eab308;
|
||||
--status-critical: #ef4444;
|
||||
/* Status colors */
|
||||
--status-ok: #16a34a;
|
||||
--status-warn: #ca8a04;
|
||||
--status-critical: #dc2626;
|
||||
--status-offline: #64748b;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
||||
font-family: 'Outfit', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
background: var(--bg-primary);
|
||||
color: var(--text-primary);
|
||||
min-height: 100vh;
|
||||
overflow-x: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* === Animated Background === */
|
||||
/* === Animated Grid Background === */
|
||||
.bg-grid {
|
||||
position: fixed;
|
||||
inset: 0;
|
||||
z-index: 0;
|
||||
background-image:
|
||||
linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
|
||||
background-size: 40px 40px;
|
||||
linear-gradient(rgba(15, 23, 42, 0.03) 1px, transparent 1px),
|
||||
linear-gradient(90deg, rgba(15, 23, 42, 0.03) 1px, transparent 1px);
|
||||
background-size: 30px 30px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
@@ -75,7 +77,7 @@
|
||||
transform: translateX(-50%);
|
||||
width: 800px;
|
||||
height: 600px;
|
||||
background: radial-gradient(ellipse, rgba(6, 182, 212, 0.08), transparent 70%);
|
||||
background: radial-gradient(ellipse, rgba(8, 145, 178, 0.05), transparent 70%);
|
||||
z-index: 0;
|
||||
pointer-events: none;
|
||||
animation: glowPulse 8s ease-in-out infinite;
|
||||
@@ -96,6 +98,7 @@
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
/* === Header === */
|
||||
@@ -103,11 +106,14 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 20px 28px;
|
||||
padding: 16px 24px;
|
||||
background: var(--bg-card);
|
||||
backdrop-filter: blur(20px);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 16px;
|
||||
border-radius: 20px;
|
||||
box-shadow:
|
||||
0 4px 6px -1px rgba(0, 0, 0, 0.02),
|
||||
0 2px 4px -1px rgba(0, 0, 0, 0.01),
|
||||
0 10px 15px -3px rgba(0, 0, 0, 0.03);
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
@@ -120,25 +126,27 @@
|
||||
.header-icon {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
border-radius: 12px;
|
||||
border-radius: 14px;
|
||||
background: linear-gradient(135deg, var(--spo2-color), var(--hr-color));
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 24px;
|
||||
box-shadow: 0 4px 16px rgba(6, 182, 212, 0.3);
|
||||
box-shadow: 0 4px 14px rgba(8, 145, 178, 0.2);
|
||||
}
|
||||
|
||||
.header-title {
|
||||
font-size: 22px;
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
letter-spacing: -0.5px;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.header-subtitle {
|
||||
font-size: 13px;
|
||||
color: var(--text-secondary);
|
||||
margin-top: 2px;
|
||||
margin-top: 1px;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.header-right {
|
||||
@@ -152,25 +160,26 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
padding: 8px 14px;
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
background: rgba(100, 116, 139, 0.1);
|
||||
border: 1px solid rgba(100, 116, 139, 0.2);
|
||||
font-weight: 600;
|
||||
background: rgba(71, 85, 105, 0.06);
|
||||
border: 1px solid rgba(71, 85, 105, 0.1);
|
||||
color: var(--text-secondary);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.audio-toggle:hover {
|
||||
background: rgba(100, 116, 139, 0.2);
|
||||
background: rgba(71, 85, 105, 0.12);
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
.audio-toggle.active {
|
||||
background: rgba(239, 68, 68, 0.1);
|
||||
border-color: rgba(239, 68, 68, 0.3);
|
||||
background: rgba(239, 68, 68, 0.08);
|
||||
border-color: rgba(239, 68, 68, 0.2);
|
||||
color: var(--status-critical);
|
||||
}
|
||||
|
||||
@@ -181,22 +190,22 @@
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
background: rgba(34, 197, 94, 0.1);
|
||||
border: 1px solid rgba(34, 197, 94, 0.2);
|
||||
font-weight: 600;
|
||||
background: rgba(22, 163, 74, 0.08);
|
||||
border: 1px solid rgba(22, 163, 74, 0.15);
|
||||
color: var(--status-ok);
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.connection-badge.offline {
|
||||
background: rgba(100, 116, 139, 0.1);
|
||||
border-color: rgba(100, 116, 139, 0.2);
|
||||
background: rgba(100, 116, 139, 0.08);
|
||||
border-color: rgba(100, 116, 139, 0.15);
|
||||
color: var(--status-offline);
|
||||
}
|
||||
|
||||
.connection-badge.warning {
|
||||
background: rgba(234, 179, 8, 0.1);
|
||||
border-color: rgba(234, 179, 8, 0.2);
|
||||
background: rgba(202, 138, 4, 0.08);
|
||||
border-color: rgba(202, 138, 4, 0.15);
|
||||
color: var(--status-warn);
|
||||
}
|
||||
|
||||
@@ -221,6 +230,7 @@
|
||||
.time-display {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
@@ -233,36 +243,37 @@
|
||||
}
|
||||
|
||||
.device-select-dropdown {
|
||||
background: rgba(17, 24, 39, 0.8);
|
||||
background: #ffffff;
|
||||
border: 1px solid var(--border-color);
|
||||
color: var(--text-primary);
|
||||
padding: 8px 16px;
|
||||
border-radius: 20px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
font-weight: 600;
|
||||
outline: none;
|
||||
cursor: pointer;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.02);
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.device-select-dropdown:hover {
|
||||
border-color: var(--spo2-color);
|
||||
background: rgba(25, 34, 56, 0.9);
|
||||
background: #f8fafc;
|
||||
}
|
||||
|
||||
.device-select-dropdown option {
|
||||
background-color: var(--bg-secondary);
|
||||
background-color: #ffffff;
|
||||
color: var(--text-primary);
|
||||
}
|
||||
|
||||
/* === Setup Guide Panel === */
|
||||
.setup-guide {
|
||||
background: linear-gradient(135deg, rgba(6, 182, 212, 0.08), rgba(168, 85, 247, 0.06));
|
||||
backdrop-filter: blur(20px);
|
||||
border: 1px solid rgba(6, 182, 212, 0.15);
|
||||
border-radius: 16px;
|
||||
background: linear-gradient(135deg, rgba(8, 145, 178, 0.04), rgba(124, 58, 237, 0.02));
|
||||
border: 1px solid rgba(8, 145, 178, 0.12);
|
||||
border-radius: 20px;
|
||||
margin-bottom: 24px;
|
||||
overflow: hidden;
|
||||
box-shadow: 0 4px 15px -3px rgba(0, 0, 0, 0.02);
|
||||
transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
}
|
||||
|
||||
@@ -277,31 +288,32 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 18px 24px;
|
||||
padding: 16px 24px;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.setup-guide-header:hover {
|
||||
background: rgba(255, 255, 255, 0.02);
|
||||
background: rgba(0, 0, 0, 0.01);
|
||||
}
|
||||
|
||||
.setup-guide-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
font-size: 15px;
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
font-weight: 700;
|
||||
color: var(--spo2-color);
|
||||
}
|
||||
|
||||
.setup-guide-toggle {
|
||||
font-size: 12px;
|
||||
color: var(--text-dim);
|
||||
color: var(--text-secondary);
|
||||
padding: 4px 12px;
|
||||
border-radius: 8px;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
background: rgba(0, 0, 0, 0.03);
|
||||
transition: all 0.2s;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.setup-guide-body {
|
||||
@@ -321,7 +333,7 @@
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border-radius: 10px;
|
||||
background: rgba(6, 182, 212, 0.15);
|
||||
background: rgba(8, 145, 178, 0.08);
|
||||
color: var(--spo2-color);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
@@ -333,7 +345,7 @@
|
||||
|
||||
.step-content h4 {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
@@ -345,7 +357,7 @@
|
||||
}
|
||||
|
||||
.step-content code {
|
||||
background: rgba(255, 255, 255, 0.08);
|
||||
background: rgba(0, 0, 0, 0.04);
|
||||
padding: 2px 6px;
|
||||
border-radius: 4px;
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
@@ -355,7 +367,7 @@
|
||||
|
||||
.setup-ip-display {
|
||||
grid-column: 1 / -1;
|
||||
background: rgba(0, 0, 0, 0.2);
|
||||
background: rgba(0, 0, 0, 0.02);
|
||||
border-radius: 12px;
|
||||
padding: 16px 20px;
|
||||
display: flex;
|
||||
@@ -363,19 +375,24 @@
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
border: 1px solid rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.setup-ip-display div {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.setup-ip-label {
|
||||
font-size: 13px;
|
||||
color: var(--text-secondary);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.setup-ip-value {
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-size: 18px;
|
||||
font-weight: 700;
|
||||
font-weight: 800;
|
||||
color: var(--spo2-color);
|
||||
text-shadow: 0 0 20px var(--spo2-glow);
|
||||
}
|
||||
|
||||
/* === Vitals Grid === */
|
||||
@@ -383,18 +400,21 @@
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
grid-template-rows: auto auto;
|
||||
gap: 20px;
|
||||
gap: 24px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.vital-card {
|
||||
background: var(--bg-card);
|
||||
backdrop-filter: blur(20px);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 20px;
|
||||
padding: 28px;
|
||||
border-radius: 24px;
|
||||
padding: 24px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
box-shadow:
|
||||
0 4px 6px -1px rgba(0, 0, 0, 0.02),
|
||||
0 2px 4px -1px rgba(0, 0, 0, 0.01),
|
||||
0 15px 30px -10px rgba(0, 0, 0, 0.04);
|
||||
transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -402,8 +422,10 @@
|
||||
|
||||
.vital-card:hover {
|
||||
background: var(--bg-card-hover);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.3);
|
||||
transform: translateY(-4px);
|
||||
box-shadow:
|
||||
0 20px 40px -15px rgba(0, 0, 0, 0.08),
|
||||
0 0 0 1px rgba(0, 0, 0, 0.02);
|
||||
}
|
||||
|
||||
.vital-card::before {
|
||||
@@ -412,8 +434,8 @@
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 3px;
|
||||
border-radius: 20px 20px 0 0;
|
||||
height: 4px;
|
||||
border-radius: 24px 24px 0 0;
|
||||
}
|
||||
|
||||
.vital-card.hr::before { background: linear-gradient(90deg, var(--hr-color), transparent); }
|
||||
@@ -447,18 +469,18 @@
|
||||
.vital-card.map-card::after { background: radial-gradient(circle, var(--map-glow), transparent 70%); }
|
||||
|
||||
.vital-card.has-value::after {
|
||||
opacity: 0.15;
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
.vital-card.has-value:hover::after {
|
||||
opacity: 0.3;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
.card-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-bottom: 16px;
|
||||
margin-bottom: 12px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
@@ -470,28 +492,28 @@
|
||||
}
|
||||
|
||||
.card-icon {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 10px;
|
||||
width: 38px;
|
||||
height: 38px;
|
||||
border-radius: 12px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-size: 18px;
|
||||
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.02);
|
||||
}
|
||||
|
||||
.vital-card.hr .card-icon { background: rgba(239, 68, 68, 0.15); }
|
||||
.vital-card.spo2 .card-icon { background: rgba(6, 182, 212, 0.15); }
|
||||
.vital-card.bp .card-icon { background: rgba(168, 85, 247, 0.15); }
|
||||
.vital-card.rr .card-icon { background: rgba(34, 197, 94, 0.15); }
|
||||
.vital-card.temp .card-icon { background: rgba(249, 115, 22, 0.15); }
|
||||
.vital-card.map-card .card-icon { background: rgba(236, 72, 153, 0.15); }
|
||||
.vital-card.hr .card-icon { background: rgba(220, 38, 38, 0.08); }
|
||||
.vital-card.spo2 .card-icon { background: rgba(8, 145, 178, 0.08); }
|
||||
.vital-card.bp .card-icon { background: rgba(124, 58, 237, 0.08); }
|
||||
.vital-card.rr .card-icon { background: rgba(22, 163, 74, 0.08); }
|
||||
.vital-card.temp .card-icon { background: rgba(234, 88, 12, 0.08); }
|
||||
.vital-card.map-card .card-icon { background: rgba(219, 39, 119, 0.08); }
|
||||
|
||||
.card-name {
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
color: var(--text-secondary);
|
||||
letter-spacing: 0.8px;
|
||||
}
|
||||
|
||||
.vital-card.hr .card-name { color: var(--hr-color); }
|
||||
@@ -505,31 +527,35 @@
|
||||
padding: 4px 10px;
|
||||
border-radius: 8px;
|
||||
font-size: 11px;
|
||||
font-weight: 600;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.status-badge.normal {
|
||||
background: rgba(34, 197, 94, 0.15);
|
||||
background: rgba(22, 163, 74, 0.08);
|
||||
color: var(--status-ok);
|
||||
border: 1px solid rgba(22, 163, 74, 0.15);
|
||||
}
|
||||
|
||||
.status-badge.warning {
|
||||
background: rgba(234, 179, 8, 0.15);
|
||||
background: rgba(202, 138, 4, 0.08);
|
||||
color: var(--status-warn);
|
||||
border: 1px solid rgba(202, 138, 4, 0.15);
|
||||
animation: warningFlash 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.status-badge.critical {
|
||||
background: rgba(239, 68, 68, 0.15);
|
||||
background: rgba(220, 38, 38, 0.08);
|
||||
color: var(--status-critical);
|
||||
border: 1px solid rgba(220, 38, 38, 0.15);
|
||||
animation: criticalFlash 1s ease-in-out infinite;
|
||||
}
|
||||
|
||||
.status-badge.offline {
|
||||
background: rgba(100, 116, 139, 0.1);
|
||||
background: rgba(100, 116, 139, 0.06);
|
||||
color: var(--status-offline);
|
||||
border: 1px solid rgba(100, 116, 139, 0.1);
|
||||
}
|
||||
|
||||
@keyframes warningFlash {
|
||||
@@ -550,7 +576,7 @@
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
min-height: 100px;
|
||||
min-height: 110px;
|
||||
}
|
||||
|
||||
.vital-value {
|
||||
@@ -562,31 +588,31 @@
|
||||
transition: all 0.5s cubic-bezier(0.16, 1, 0.3, 1);
|
||||
}
|
||||
|
||||
.vital-card.hr .vital-value { color: var(--hr-color); text-shadow: 0 0 30px var(--hr-glow); }
|
||||
.vital-card.spo2 .vital-value { color: var(--spo2-color); text-shadow: 0 0 30px var(--spo2-glow); }
|
||||
.vital-card.bp .vital-value { color: var(--bp-color); text-shadow: 0 0 30px var(--bp-glow); }
|
||||
.vital-card.rr .vital-value { color: var(--rr-color); text-shadow: 0 0 30px var(--rr-glow); }
|
||||
.vital-card.temp .vital-value { color: var(--temp-color); text-shadow: 0 0 30px var(--temp-glow); }
|
||||
.vital-card.map-card .vital-value { color: var(--map-color); text-shadow: 0 0 30px var(--map-glow); }
|
||||
.vital-card.hr .vital-value { color: var(--hr-color); }
|
||||
.vital-card.spo2 .vital-value { color: var(--spo2-color); }
|
||||
.vital-card.bp .vital-value { color: var(--bp-color); }
|
||||
.vital-card.rr .vital-value { color: var(--rr-color); }
|
||||
.vital-card.temp .vital-value { color: var(--temp-color); }
|
||||
.vital-card.map-card .vital-value { color: var(--map-color); }
|
||||
|
||||
.vital-value.no-data {
|
||||
font-size: 48px;
|
||||
color: var(--text-dim) !important;
|
||||
text-shadow: none !important;
|
||||
}
|
||||
|
||||
.vital-value .unit {
|
||||
font-size: 20px;
|
||||
font-weight: 400;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0;
|
||||
margin-left: 4px;
|
||||
opacity: 0.6;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.vital-value .slash {
|
||||
font-size: 48px;
|
||||
opacity: 0.4;
|
||||
opacity: 0.3;
|
||||
margin: 0 2px;
|
||||
color: var(--text-secondary);
|
||||
}
|
||||
|
||||
.vital-value-update {
|
||||
@@ -594,18 +620,20 @@
|
||||
}
|
||||
|
||||
@keyframes valueFlash {
|
||||
0% { transform: scale(1.08); filter: brightness(1.4); }
|
||||
0% { transform: scale(1.06); filter: brightness(1.2); }
|
||||
100% { transform: scale(1); filter: brightness(1); }
|
||||
}
|
||||
|
||||
/* === Waveform Canvas === */
|
||||
.waveform-container {
|
||||
height: 50px;
|
||||
height: 55px;
|
||||
margin-top: 12px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
overflow: hidden;
|
||||
border-radius: 8px;
|
||||
border-radius: 12px;
|
||||
background: rgba(0, 0, 0, 0.01);
|
||||
border: 1px solid rgba(0, 0, 0, 0.02);
|
||||
}
|
||||
|
||||
.waveform-container canvas {
|
||||
@@ -619,7 +647,7 @@
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
margin-top: 12px;
|
||||
margin-top: 14px;
|
||||
padding-top: 12px;
|
||||
border-top: 1px solid var(--border-color);
|
||||
position: relative;
|
||||
@@ -627,14 +655,16 @@
|
||||
}
|
||||
|
||||
.normal-range {
|
||||
font-size: 12px;
|
||||
color: var(--text-dim);
|
||||
font-size: 11px;
|
||||
color: var(--text-secondary);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.last-update {
|
||||
font-size: 11px;
|
||||
color: var(--text-dim);
|
||||
font-family: 'JetBrains Mono', monospace;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
/* === Info Bar === */
|
||||
@@ -644,10 +674,13 @@
|
||||
justify-content: space-between;
|
||||
padding: 16px 24px;
|
||||
background: var(--bg-card);
|
||||
backdrop-filter: blur(20px);
|
||||
border: 1px solid var(--border-color);
|
||||
border-radius: 14px;
|
||||
margin-top: 20px;
|
||||
border-radius: 20px;
|
||||
box-shadow:
|
||||
0 4px 6px -1px rgba(0, 0, 0, 0.02),
|
||||
0 2px 4px -1px rgba(0, 0, 0, 0.01),
|
||||
0 10px 15px -3px rgba(0, 0, 0, 0.03);
|
||||
margin-top: 24px;
|
||||
flex-wrap: wrap;
|
||||
gap: 12px;
|
||||
}
|
||||
@@ -658,35 +691,37 @@
|
||||
gap: 8px;
|
||||
font-size: 13px;
|
||||
color: var(--text-secondary);
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.info-item strong {
|
||||
color: var(--text-primary);
|
||||
font-weight: 600;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
.info-dot {
|
||||
width: 6px;
|
||||
height: 6px;
|
||||
border-radius: 50%;
|
||||
background: var(--text-dim);
|
||||
background: var(--border-color);
|
||||
}
|
||||
|
||||
.model-badge {
|
||||
padding: 4px 12px;
|
||||
border-radius: 8px;
|
||||
font-size: 11px;
|
||||
font-weight: 700;
|
||||
font-weight: 800;
|
||||
letter-spacing: 0.5px;
|
||||
background: linear-gradient(135deg, rgba(6, 182, 212, 0.15), rgba(168, 85, 247, 0.15));
|
||||
background: linear-gradient(135deg, rgba(8, 145, 178, 0.08), rgba(124, 58, 237, 0.08));
|
||||
color: var(--spo2-color);
|
||||
border: 1px solid rgba(6, 182, 212, 0.2);
|
||||
border: 1px solid rgba(8, 145, 178, 0.15);
|
||||
}
|
||||
|
||||
/* === Responsive === */
|
||||
@media (max-width: 1024px) {
|
||||
.vitals-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 20px;
|
||||
}
|
||||
.setup-guide-body {
|
||||
grid-template-columns: 1fr;
|
||||
@@ -697,17 +732,35 @@
|
||||
.app-container { padding: 12px; }
|
||||
.vitals-grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 16px;
|
||||
}
|
||||
.header {
|
||||
flex-direction: column;
|
||||
gap: 12px;
|
||||
gap: 16px;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
padding: 20px;
|
||||
}
|
||||
.header-left {
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
.header-right {
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
width: 100%;
|
||||
gap: 12px;
|
||||
}
|
||||
.vital-value { font-size: 48px; }
|
||||
.device-selector-container {
|
||||
width: 100%;
|
||||
justify-content: center;
|
||||
margin-right: 0;
|
||||
}
|
||||
.device-select-dropdown {
|
||||
width: 100%;
|
||||
max-width: 250px;
|
||||
}
|
||||
.vital-value { font-size: 56px; }
|
||||
.setup-guide-body {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
@@ -716,7 +769,7 @@
|
||||
/* === Scrollbar === */
|
||||
::-webkit-scrollbar { width: 6px; }
|
||||
::-webkit-scrollbar-track { background: transparent; }
|
||||
::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.1); border-radius: 3px; }
|
||||
::-webkit-scrollbar-thumb { background: rgba(0,0,0,0.1); border-radius: 3px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
Reference in New Issue
Block a user