:root{
  --bg:#070A0D;
  --bg-1:#0B0E12;
  --bg-2:#10151B;
  --bg-3:#161C24;
  --line:rgba(255,255,255,0.06);
  --line-2:rgba(255,255,255,0.10);
  --txt:#E6E8EB;
  --txt-2:#9CA3AF;
  --txt-3:#6B7079;
  --txt-4:#4A5058;
  --ok:#10B981;
  --ok-2:#34D399;
  --warn:#F59E0B;
  --warn-2:#FCD34D;
  --bad:#EF4444;
  --bad-2:#FCA5A5;
  --blue:#0EA5E9;
  --blue-2:#38BDF8;
  --indigo:#6366F1;
  --indigo-2:#A5B4FC;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{
  background:var(--bg);
  color:var(--txt);
  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;
  font-size:14px;
  -webkit-font-smoothing:antialiased;
  overflow:hidden;
  height:100vh;
  width:100vw;
}
body{
  background:
    radial-gradient(ellipse at 20% 0%, rgba(99,102,241,0.04) 0%, transparent 50%),
    radial-gradient(ellipse at 80% 100%, rgba(16,185,129,0.03) 0%, transparent 50%),
    var(--bg);
}

.app{
  width:100%;
  max-width:3840px;
  height:100vh;
  margin:0 auto;
  padding:18px 22px;
  display:flex;
  flex-direction:column;
  gap:14px;
}

/* ===== TOP BAR ===== */
.topbar{
  display:flex;align-items:center;justify-content:space-between;
  padding:10px 20px;
  background:linear-gradient(180deg,var(--bg-2),var(--bg-1));
  border:0.5px solid var(--line);
  border-radius:14px;
  flex-shrink:0;
}
.brand{display:flex;align-items:center;gap:16px}
.brand-logo{
  width:50px;height:50px;border-radius:13px;
  background:linear-gradient(135deg,var(--ok),var(--ok-2));
  display:flex;align-items:center;justify-content:center;
  color:#000000;font-weight:700;font-size:20px;
  box-shadow:0 0 2px rgba(0, 208, 132, 1);
  text-shadow: 1px 1px 1px rgba(0,0,0,0.6);
}
.brand-title{font-size:18px;font-weight:500;letter-spacing:0.2px}
.brand-sub{font-size:11.5px;color:var(--txt-3);letter-spacing:0.8px;text-transform:uppercase;margin-top:2px}
.top-status{display:flex;align-items:center;gap:10px}
.chip{
  display:inline-flex;align-items:center;gap:7px;
  padding:7px 12px;border-radius:999px;
  font-size:11.5px;letter-spacing:0.5px;
  background:rgba(255,255,255,0.03);
  border:0.5px solid var(--line-2);
}
.chip.ok{background:rgba(16,185,129,0.10);border-color:rgba(16,185,129,0.35);color:#9CE9CB}
.chip.warn{background:rgba(245,158,11,0.10);border-color:rgba(245,158,11,0.35);color:var(--warn-2)}
.chip.bad{background:rgba(239,68,68,0.10);border-color:rgba(239,68,68,0.40);color:var(--bad-2)}
.chip.info{background:rgba(59,130,246,0.10);border-color:rgba(59,130,246,0.35);color:#BFD7FB}
.dot{width:7px;height:7px;border-radius:50%}
.dot.ok{background:var(--ok);box-shadow:0 0 8px var(--ok)}
.dot.warn{background:var(--warn);box-shadow:0 0 8px var(--warn)}
.dot.bad{background:var(--bad);box-shadow:0 0 10px var(--bad);animation:pulseDot 0.9s ease-in-out infinite}
.dot.info{background:var(--blue);box-shadow:0 0 8px var(--blue)}
@keyframes pulseDot{0%,100%{opacity:1}50%{opacity:0.4}}
.clock{
  font-family:'JetBrains Mono',monospace;font-size:14px;color:#C9CCD1;
  padding:7px 14px;border-radius:10px;
  background:rgba(255,255,255,0.04);
  border:0.5px solid var(--line);
  font-variant-numeric:tabular-nums;
}
.clock .date{color:var(--txt-3);margin-left:8px;font-weight:400}

/* ===== MAIN GRID ===== */
.main{display:grid;grid-template-columns:280px 1fr 280px;gap:14px;flex:1;min-height:0}

/* ===== SENSORS ===== */
.panel{display:flex;flex-direction:column;gap:10px;min-height:0;overflow:hidden}
.panel-title{font-size:11px;color:var(--txt-3);letter-spacing:1.2px;text-transform:uppercase;padding:0 4px 2px;flex-shrink:0}
.sensor{
  background:linear-gradient(180deg,var(--bg-3),var(--bg-2));
  border:0.5px solid var(--line);border-radius:12px;padding:10px 14px;
  position:relative;overflow:hidden;
  transition:border-color 0.3s;
  flex:1;min-height:0;
}
.sensor:hover{border-color:var(--line-2)}
.sensor.warn{border-color:rgba(245,158,11,0.35)}
.sensor.bad{border-color:rgba(239,68,68,0.45);animation:badPulse 1.8s ease-in-out infinite}
@keyframes badPulse{0%,100%{box-shadow:0 0 0 0 rgba(239,68,68,0)}50%{box-shadow:0 0 0 6px rgba(239,68,68,0.08)}}
.sensor-head{display:flex;align-items:center;justify-content:space-between}
.sensor-label{display:flex;align-items:center;gap:8px;color:var(--txt-3);font-size:11.5px;letter-spacing:0.6px}
.sensor-icon{width:22px;height:22px;border-radius:7px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,0.04);font-size:13px}
.sensor-state{font-size:10px;padding:2px 7px;border-radius:999px;letter-spacing:0.5px;font-weight:500}
.sensor-state.ok{background:rgba(16,185,129,0.14);color:#6EE7B7}
.sensor-state.warn{background:rgba(245,158,11,0.16);color:var(--warn-2)}
.sensor-state.bad{background:rgba(239,68,68,0.18);color:var(--bad-2)}
.sensor-value{font-size:30px;font-weight:500;margin-top:4px;font-variant-numeric:tabular-nums;color:#FFFFFF;line-height:1;letter-spacing:-0.5px}
.sensor-value .unit{font-size:14px;color:var(--txt-3);font-weight:400;margin-left:3px}
.sensor-target{font-size:11px;color:var(--txt-4);margin-top:4px;display:flex;justify-content:space-between}
.sensor-bar{height:3px;border-radius:3px;background:rgba(255,255,255,0.05);margin-top:7px;position:relative;overflow:hidden}
.sensor-bar-fill{position:absolute;left:0;top:0;height:100%;border-radius:3px;transition:width 0.8s cubic-bezier(0.4,0,0.2,1)}
.sensor-trend{position:absolute;top:14px;right:42px;font-size:10px;color:var(--txt-3);font-family:'JetBrains Mono',monospace}
.sensor-trend.up{color:#6EE7B7}
.sensor-trend.down{color:var(--bad-2)}

/* ===== ROOM CANVAS (DIGITAL TWIN) ===== */
.canvas-wrap{
  background:
    radial-gradient(120% 80% at 50% 0%, #181F26 0%, #0A0E12 70%);
  border:0.5px solid var(--line);
  border-radius:16px;
  padding:10px 14px 12px;
  position:relative;overflow:hidden;
  display:flex;flex-direction:column;
  min-height:0;
}
.canvas-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;flex-shrink:0}
.canvas-title{font-size:12px;letter-spacing:1.5px;color:var(--txt-3);text-transform:uppercase}
.canvas-legend{display:flex;gap:6px;flex-wrap:wrap}

.twin-stage{
  flex:1;
  position:relative;
  display:flex;align-items:center;justify-content:center;
  min-height:0;
  min-width:0;
}
.twin-frame{
  position:relative;
  /* Image-first sizing: take available height, derive width from aspect ratio */
  height:100%;
  aspect-ratio:1627/1287;
  /* Cap at 100% width so it never overflows horizontally */
  max-width:100%;
  /* If width is the limiter, fall back to width-driven sizing */
  width:auto;
  filter:drop-shadow(0 8px 30px rgba(0,0,0,0.55));
}
.twin-img{
  position:absolute;inset:0;
  width:100%;height:100%;
  object-fit:contain;
  filter:contrast(1.04) saturate(0.95) brightness(1.02);
  user-select:none;
  pointer-events:none;
}

.twin-overlay{
  position:absolute;inset:0;
  width:100%;height:100%;
  pointer-events:none;
}

/* Marker (% positioned within frame) */
.marker{
  position:absolute;
  width:28px;height:28px;
  margin-left:-14px;margin-top:-14px;
  pointer-events:auto;
  cursor:pointer;
}
.marker .ring{
  position:absolute;inset:0;
  border-radius:50%;
  border:1.5px solid currentColor;
  opacity:0;
  animation:ringPulse 2.4s ease-out infinite;
}
.marker.warn .ring{animation-duration:1.6s}
.marker.bad .ring{animation-duration:1s}
@keyframes ringPulse{
  0%{transform:scale(0.5);opacity:0.95}
  100%{transform:scale(2.4);opacity:0}
}
.marker .core{
  position:absolute;inset:8px;
  border-radius:50%;
  background:currentColor;
  border:1.5px solid rgba(0,0,0,0.55);
  box-shadow:0 0 14px currentColor, 0 0 4px rgba(0,0,0,0.5);
  transition:transform 0.15s;
  display:flex;align-items:center;justify-content:center;
}
.marker .core::after{
  content:'';width:6px;height:6px;border-radius:50%;
  background:rgba(255,255,255,0.85);
}
.marker.bad .core::after{
  content:'!';width:auto;height:auto;background:transparent;
  color:#FFFFFF;font-weight:800;font-size:9px;
}
.marker:hover .core{transform:scale(1.18)}
.marker.bad{animation:shake 0.18s linear infinite}
@keyframes shake{
  0%,100%{transform:translate(0,0)}
  25%{transform:translate(1px,0)}
  75%{transform:translate(-1px,0)}
}
.marker.led{color:#FBBF24}
.marker.ebb{color:#38BDF8}
.marker.co2{color:#F59E0B}
.marker.controller{color:#A5B4FC}
.marker.temp{color:#FB923C}
.marker.hum{color:#38BDF8}
.marker.vpd{color:#C084FC}

/* Marker tag */
.marker-tag{
  position:absolute;
  top:20px;left:20px;
  white-space:nowrap;
  font-size:10px;
  padding:3px 8px;
  border-radius:999px;
  background:rgba(8,11,15,0.88);
  border:0.5px solid rgba(255,255,255,0.12);
  color:#FFFFFF;
  font-variant-numeric:tabular-nums;
  letter-spacing:0.3px;
  backdrop-filter:blur(6px);
  pointer-events:none;
  font-family:'JetBrains Mono',monospace;
}
.marker.warn .marker-tag{border-color:rgba(245,158,11,0.45);color:var(--warn-2)}
.marker.bad .marker-tag{border-color:rgba(239,68,68,0.55);color:var(--bad-2)}

/* Tag-left modifier — flip tag to the left side of marker (avoids overlap) */
.marker .marker-tag.tag-left{left:auto;right:20px}
.marker .marker-tag.tag-top{top:auto;bottom:20px}

/* Ambient effects */
.fx-bubble{position:absolute;border-radius:50%;background:#A3E635;pointer-events:none}
.fx-bubble.a1{animation:bubbleUp 2.6s ease-out infinite}
.fx-bubble.a2{animation:bubbleUp 2.6s ease-out 0.5s infinite}
.fx-bubble.a3{animation:bubbleUp 2.6s ease-out 1s infinite}
.fx-bubble.a4{animation:bubbleUp 2.6s ease-out 1.5s infinite}
@keyframes bubbleUp{
  0%{transform:translateY(0) scale(0.6);opacity:0}
  20%{opacity:0.9}
  100%{transform:translateY(-50px) scale(1);opacity:0}
}
.fx-mist{position:absolute;border-radius:50%;background:#E0F2FE;pointer-events:none;filter:blur(1px)}
.fx-mist.m1{animation:mistRise 3.2s ease-out infinite}
.fx-mist.m2{animation:mistRise 3.2s ease-out 1s infinite}
.fx-mist.m3{animation:mistRise 3.2s ease-out 2s infinite}
@keyframes mistRise{
  0%{transform:translate(0,0) scale(0.4);opacity:0}
  25%{opacity:0.55}
  100%{transform:translate(12px,-40px) scale(1.6);opacity:0}
}
.fx-airflow{position:absolute;pointer-events:none}
.fx-wave{position:absolute;border:1px solid #7DD3FC;border-radius:50%;width:34px;height:7px;left:-17px;top:0;animation:acWave 2s linear infinite;opacity:0}
.fx-wave.w2{animation-delay:0.66s}
.fx-wave.w3{animation-delay:1.33s}
@keyframes acWave{
  0%{transform:translateY(0) scaleX(0.6);opacity:0}
  30%{opacity:0.6}
  100%{transform:translateY(44px) scaleX(1.5);opacity:0}
}
.fx-light{position:absolute;pointer-events:none;mix-blend-mode:screen}
.fx-light-cone{
  position:absolute;
  background:radial-gradient(ellipse 60% 80% at 50% 0%, rgba(252,211,77,0.45), rgba(252,211,77,0) 70%);
  animation:lightFlicker 3.5s ease-in-out infinite;
}
@keyframes lightFlicker{0%,100%{opacity:0.5}50%{opacity:0.85}}
.fx-ebb-shimmer{
  position:absolute;
  background:linear-gradient(90deg, rgba(56,189,248,0) 0%, rgba(56,189,248,0.45) 50%, rgba(56,189,248,0) 100%);
  mix-blend-mode:screen;
  pointer-events:none;
  animation:shimmer 3s linear infinite;
}
@keyframes shimmer{
  0%{transform:translateX(-100%);opacity:0}
  20%{opacity:0.8}
  80%{opacity:0.8}
  100%{transform:translateX(100%);opacity:0}
}

/* Tooltip */
.tooltip{
  position:absolute;
  background:rgba(8,11,15,0.96);
  border:0.5px solid var(--line-2);
  border-radius:10px;
  padding:11px 14px;
  min-width:220px;
  pointer-events:none;
  opacity:0;
  transform:translateY(4px);
  transition:opacity 0.15s, transform 0.15s;
  z-index:50;
  backdrop-filter:blur(8px);
  box-shadow:0 12px 30px rgba(0,0,0,0.6);
}
.tooltip.visible{opacity:1;transform:translateY(0)}
.tt-title{font-size:11px;color:var(--txt-3);letter-spacing:0.6px;text-transform:uppercase;margin-bottom:4px}
.tt-name{font-size:14px;font-weight:500;color:#FFFFFF;margin-bottom:8px}
.tt-row{display:flex;justify-content:space-between;font-size:12px;padding:4px 0;border-top:0.5px solid var(--line)}
.tt-row .k{color:var(--txt-3)}
.tt-row .v{color:#FFFFFF;font-family:'JetBrains Mono',monospace;font-variant-numeric:tabular-nums}
.tt-state{display:inline-block;padding:2px 8px;border-radius:999px;font-size:10px;letter-spacing:0.5px;margin-top:8px}
.tt-state.ok{background:rgba(16,185,129,0.14);color:#6EE7B7}
.tt-state.warn{background:rgba(245,158,11,0.16);color:var(--warn-2)}
.tt-state.bad{background:rgba(239,68,68,0.18);color:var(--bad-2)}

.canvas-foot{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-top:8px;flex-shrink:0}
.mini{background:rgba(255,255,255,0.025);border:0.5px solid var(--line);border-radius:9px;padding:6px 10px}
.mini-label{font-size:10px;color:var(--txt-4);letter-spacing:0.6px}
.mini-value{font-size:13px;color:#FFFFFF;font-variant-numeric:tabular-nums;margin-top:1px}
.mini-value.info{color:var(--blue-2)}.mini-value.warn{color:var(--warn-2)}.mini-value.ok{color:var(--ok-2)}

.sensor-board{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;flex-shrink:0}
.sensor-board .sensor{flex:none;min-height:0}

.sensor-board-title{font-size:11px;color:var(--txt-3);letter-spacing:1.2px;text-transform:uppercase;padding:0 4px 2px;flex-shrink:0}

/* ===== BOTTOM ROW ===== */
.bottom{display:flex;flex-direction:column;gap:10px;flex-shrink:0}
.sensor-board.three{grid-template-columns:repeat(3,minmax(0,1fr))}
.bcard{background:linear-gradient(180deg,var(--bg-3),var(--bg-2));border:0.5px solid var(--line);border-radius:12px;padding:10px 14px}
.health{display:flex;align-items:center;gap:14px}
.gauge-wrap{position:relative;width:56px;height:56px;flex-shrink:0}
.gauge-text{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:17px;font-weight:500;color:#FFFFFF;font-variant-numeric:tabular-nums}
.health-info .h-label{font-size:11px;color:var(--txt-3);letter-spacing:0.6px;text-transform:uppercase}
.health-info .h-status{font-size:14px;color:#6EE7B7;margin-top:3px}
.health-info .h-delta{font-size:11px;color:var(--txt-4);margin-top:2px}
.crop-head{display:flex;justify-content:space-between;align-items:center}
.crop-label{font-size:11px;color:var(--txt-3);letter-spacing:0.6px;text-transform:uppercase}
.crop-name{font-size:14px;color:#FFFFFF;margin-top:4px;font-weight:500}
.crop-bar{height:6px;border-radius:4px;background:rgba(255,255,255,0.05);margin-top:10px;position:relative;overflow:hidden}
.crop-bar-fill{position:absolute;left:0;top:0;height:100%;background:linear-gradient(90deg,var(--ok),var(--ok-2));border-radius:4px;transition:width 0.8s}
.crop-stages{display:flex;justify-content:space-between;margin-top:6px;font-size:10px;color:var(--txt-4)}
.crop-stages .now{color:var(--ok-2);font-weight:500}
.alert-card{display:flex;align-items:center;gap:12px;border-color:rgba(245,158,11,0.30)!important}
.alert-icon{width:40px;height:40px;border-radius:11px;background:rgba(245,158,11,0.14);display:flex;align-items:center;justify-content:center;font-size:20px;color:var(--warn-2);flex-shrink:0}
.alert-count{font-size:26px;font-weight:500;color:#FFFFFF;line-height:1}
.alert-label{font-size:10px;color:var(--warn-2);letter-spacing:0.6px;margin-top:4px}
.alert-break{font-size:10px;color:var(--txt-4);margin-top:1px}
.ai-card{background:linear-gradient(135deg, rgba(99,102,241,0.10), rgba(16,185,129,0.05));border:0.5px solid rgba(165,180,252,0.30)}
.ai-head{display:flex;align-items:center;gap:7px}
.ai-icon{font-size:14px}
.ai-label{font-size:11px;color:var(--indigo-2);letter-spacing:0.8px;text-transform:uppercase}
.ai-time{margin-left:auto;font-size:10px;color:var(--txt-4)}
.ai-body{font-size:13px;color:var(--txt);margin-top:8px;line-height:1.55}
.ai-body strong{color:#FFFFFF;font-weight:500}
.ai-body em{color:var(--ok-2);font-style:normal}
.ai-actions{display:flex;gap:7px;margin-top:10px}
.btn{font-size:11px;padding:6px 12px;border-radius:9px;border:none;cursor:pointer;letter-spacing:0.4px;font-family:inherit;transition:transform 0.1s, background 0.2s}
.btn:active{transform:scale(0.97)}
.btn-primary{background:var(--indigo);color:#FFFFFF}
.btn-primary:hover{background:#7C7FFA}
.btn-ghost{background:transparent;color:var(--indigo-2);border:0.5px solid rgba(165,180,252,0.30)}
.btn-ghost:hover{background:rgba(165,180,252,0.06)}

/* Toast */
.toast-stack{position:fixed;top:24px;right:24px;display:flex;flex-direction:column;gap:10px;z-index:100;max-width:380px}
.toast{
  background:rgba(8,11,15,0.95);
  border:0.5px solid rgba(239,68,68,0.40);
  border-left:3px solid var(--bad);
  border-radius:11px;padding:12px 14px;
  display:flex;gap:11px;align-items:flex-start;
  backdrop-filter:blur(10px);
  box-shadow:0 10px 30px rgba(0,0,0,0.6), 0 0 18px rgba(239,68,68,0.08);
  animation:toastIn 0.35s cubic-bezier(0.34,1.56,0.64,1);
}
.toast.warn{border-color:rgba(245,158,11,0.40);border-left-color:var(--warn)}
.toast.exit{animation:toastOut 0.3s ease-in forwards}
@keyframes toastIn{from{transform:translateX(120%);opacity:0}to{transform:translateX(0);opacity:1}}
@keyframes toastOut{to{transform:translateX(120%);opacity:0}}
.toast-ico{width:32px;height:32px;border-radius:10px;background:rgba(239,68,68,0.18);display:flex;align-items:center;justify-content:center;font-size:16px;color:var(--bad-2);flex-shrink:0}
.toast.warn .toast-ico{background:rgba(245,158,11,0.18);color:var(--warn-2)}
.toast-title{font-size:11px;color:var(--bad-2);letter-spacing:0.5px;text-transform:uppercase}
.toast.warn .toast-title{color:var(--warn-2)}
.toast-msg{font-size:13px;color:#FFFFFF;margin-top:3px;font-weight:500}
.toast-meta{font-size:11px;color:var(--txt-3);margin-top:2px}

/* Calibration hint */
.calib-hint{
  position:absolute;bottom:8px;left:14px;
  font-size:10px;color:var(--txt-4);
  font-family:'JetBrains Mono',monospace;
  opacity:0.4;
}

/* Responsive 4K scaling — fonts grow but layout stays fit-to-screen */
@media (min-width: 2400px){
  html,body{font-size:17px}
  .app{padding:26px 32px;gap:18px}
  .main{grid-template-columns:340px 1fr 340px;gap:18px}
  .sensor-value{font-size:40px}
  .marker{width:34px;height:34px;margin-left:-17px;margin-top:-17px}
  .marker-tag{font-size:12px;padding:4px 10px;top:24px;left:24px}
  .marker .marker-tag.tag-left{left:auto;right:24px}
  .marker .marker-tag.tag-top{top:auto;bottom:24px}
  .gauge-wrap{width:72px;height:72px}
  .gauge-text{font-size:22px}
  .bcard{padding:14px 18px}
}
@media (min-width: 3200px){
  html,body{font-size:20px}
  .app{padding:32px 40px;gap:22px}
  .main{grid-template-columns:400px 1fr 400px;gap:22px}
  .sensor-value{font-size:48px}
  .marker{width:42px;height:42px;margin-left:-21px;margin-top:-21px}
  .marker-tag{font-size:14px;padding:5px 12px;top:30px;left:30px}
  .marker .marker-tag.tag-left{left:auto;right:30px}
  .marker .marker-tag.tag-top{top:auto;bottom:30px}
  .gauge-wrap{width:90px;height:90px}
  .gauge-text{font-size:28px}
}
