/* ==========================================================================
   LACECAL - ITR  ·  Estilos sobre Bootstrap 5.3
   Requiere: bootstrap.min.css, bootstrap-icons y la fuente IBM Plex.
   Fondo blanco (variante de lacecal-itr-dispositivos.html, --bg:#fff).
   ========================================================================== */

/* ===== Tokens ===== */
:root{
  --navy:#0b2f57; --blue:#0d4e8b; --accent:#e8780c;
  --bg:#fff; --line:#dde3ea; --ink:#1b2733; --muted:#5b6978;
  --soft:#eef2f7;
  /* un color por tipo de dispositivo */
  --c-logger:#4a6fa5; --c-meter:#0e8a8c; --c-pv:#c98500; --c-ess:#2e9d5a;
  --mono:'IBM Plex Mono',ui-monospace,monospace;
  --page-max:1100px;

  --bs-body-font-family:'IBM Plex Sans',system-ui,sans-serif;
  --bs-body-bg:var(--bg);
  --bs-body-color:var(--ink);
}
body{background:var(--bg)}

/* ===== Botones y formularios ===== */
.btn-primary{
  --bs-btn-bg:var(--blue);--bs-btn-border-color:var(--blue);
  --bs-btn-hover-bg:var(--navy);--bs-btn-hover-border-color:var(--navy);
  --bs-btn-active-bg:var(--navy);--bs-btn-active-border-color:var(--navy);
}
.form-control:focus,.form-select:focus{
  border-color:var(--blue);box-shadow:0 0 0 .2rem rgba(13,78,139,.18);
}

/* ===== Layout ===== */
.app{min-height:100vh}
.main{flex:1;min-width:0}
.page{max-width:var(--page-max);margin:0 auto;padding:1.5rem 1.25rem 5.5rem} /* abajo: espacio para que el contenido pase por encima del botón «Volver arriba» */

/* ===== Barra lateral ===== */
.sidebar{--bs-offcanvas-bg:#fff;--bs-offcanvas-width:300px}
.sidebar .offcanvas-header{display:flex!important;padding:1.25rem 1.25rem .5rem}
.sidebar .offcanvas-body{
  flex-direction:column;flex-grow:1!important;
  padding:.5rem .75rem 1rem!important;overflow-y:auto!important;
}

/* Selector de idioma (banderas) */
.lang{display:flex;align-items:center;gap:.5rem;padding:0 .5rem 1rem}
.lang a{
  display:inline-flex;padding:.2rem;border-radius:.35rem;
  border:1px solid transparent;line-height:0;text-decoration:none;
}
.lang a img{display:block;border-radius:2px}
.lang a[aria-current="true"]{border-color:var(--navy);background:var(--soft)}
/* Tarjeta de datos del usuario (junto a las banderas): sus botones no heredan el estilo de las banderas */
/* Icono de usuario: azul de la marca (--blue); más oscuro (--navy) al pasar el ratón, con el menú abierto o en la página de datos del usuario */
.lang .usercard-btn{color:var(--blue)}
.lang .usercard-btn:hover,.lang .usercard-btn:focus-visible,.lang .usercard-btn.show,.lang .usercard-btn.active{color:var(--navy);background:var(--soft)}
.lang .dropdown-menu a.btn{display:block;padding:var(--bs-btn-padding-y) var(--bs-btn-padding-x);border:var(--bs-btn-border-width) solid var(--bs-btn-border-color);border-radius:var(--bs-btn-border-radius);line-height:1.5}

/* Enlaces / botones del menú lateral */
.snav{
  display:flex;align-items:center;gap:.75rem;width:100%;
  padding:.6rem .9rem;border:0;border-radius:.6rem;background:none;
  color:var(--ink);font-weight:500;text-align:left;text-decoration:none;
}
.snav:hover{background:var(--soft);color:var(--ink)}
.snav .lead-ico{font-size:1.1rem;color:var(--muted)}
.snav.active{background:#fff2e2;color:#8a4200;box-shadow:inset 3px 0 0 var(--accent)}
.snav .chev{margin-left:auto;transition:transform .2s}
.snav[aria-expanded="true"] .chev{transform:rotate(180deg)}

.subnav{margin:.1rem 0 .4rem 1.7rem;padding-left:.6rem;border-left:1px solid var(--line)}
.subnav .snav{padding:.4rem .75rem;font-size:.92rem;font-weight:400}
.subnav .snav.active{font-weight:500}
.logout{margin-top:auto}

/*
  Compatibilidad con enlaces que aún genere opcion_menu() (definida en
  formatos.php, no incluida en este cambio) si esa función todavía no
  aplica la clase .snav a los <a>/<button> que devuelve. Da un aspecto
  equivalente a cualquier enlace de primer nivel dentro de <nav> o de
  .subnav que no tenga ya la clase .snav.
*/
.offcanvas-body nav > a:not(.snav),
.offcanvas-body nav > button:not(.snav),
.offcanvas-body .subnav > a:not(.snav){
  display:flex;align-items:center;gap:.75rem;width:100%;
  padding:.6rem .9rem;border:0;border-radius:.6rem;background:none;
  color:var(--ink);font-weight:500;text-align:left;text-decoration:none;
}
.offcanvas-body nav > a:not(.snav):hover,
.offcanvas-body nav > button:not(.snav):hover{background:var(--soft)}

@media (min-width:992px){
  .sidebar-wrap{
    flex:0 0 272px;position:sticky;top:0;height:100vh;
    background:#fff;border-right:1px solid var(--line);
    display:flex;flex-direction:column;
  }
  .sidebar-wrap .offcanvas-lg{flex:1;display:flex;flex-direction:column;min-height:0}
}

/* ===== Barra superior (móvil / tablet) ===== */
.topbar{
  position:sticky;top:0;z-index:1020;
  display:flex;align-items:center;justify-content:space-between;
  padding:.75rem 1rem;color:#fff;
  background:linear-gradient(135deg,var(--navy),var(--blue));
}
.topbar .btn{color:#fff;font-size:1.5rem;padding:0 .25rem}

/* ===== Título de página ===== */
.page-title{
  display:flex;align-items:center;gap:.6rem;
  margin:0 0 1.25rem;padding:.1rem 0 .75rem;
  border-bottom:2px solid var(--accent);
  color:var(--navy);font-size:1.4rem;font-weight:600;line-height:1.3;
}
.page-title i{color:var(--accent);font-size:1.2rem}

/* ===== Barra de colapsado (usada en páginas con grupos, p.ej. dispositivos) ===== */
.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem 1.5rem;margin-bottom:1rem}
.toolbar h2{margin:0 auto 0 0;font-size:1.25rem;font-weight:600}
.tb-set{display:flex;align-items:center;gap:.6rem}
.tb-set > span{font-size:.9rem;color:var(--muted)}
.toolbar .btn{
  --bs-btn-color:var(--ink);--bs-btn-border-color:var(--line);--bs-btn-bg:#fff;
  --bs-btn-hover-bg:var(--soft);--bs-btn-hover-color:var(--ink);--bs-btn-hover-border-color:var(--line);
  --bs-btn-active-bg:#e3e9f1;--bs-btn-active-color:var(--ink);
}

/* ===== Grupos (tarjetas desplegables) ===== */
.group{
  background:#fff;border:1px solid var(--line);border-left:4px solid var(--cat,var(--blue));
  border-radius:.9rem;margin-bottom:1rem;overflow:hidden;
}
.group-head{
  display:flex;align-items:center;gap:.75rem;width:100%;
  padding:.9rem 1rem;border:0;background:none;color:var(--ink);
  font-size:1.05rem;font-weight:600;text-align:left;
}
.group-ico{
  display:grid;place-items:center;flex:none;width:2.25rem;height:2.25rem;
  border-radius:.6rem;
  background:color-mix(in srgb,var(--cat,var(--blue)) 14%,#fff);color:var(--cat,var(--blue));
}
.count{font-size:.8rem;font-weight:500;color:var(--muted);background:var(--soft);border-radius:2rem;padding:.1rem .6rem}
.group-head .chev{margin-left:auto;color:var(--muted);transition:transform .2s}
.group-head[aria-expanded="false"] .chev{transform:rotate(-90deg)}
/* display:flex en vez de grid: con grid, expandir varios detalles de
   golpe (botón "Expandir todos" de la barra de herramientas) podía
   dejar sin repintar el nombre/icono del primer dispositivo de algunos
   grupos hasta interactuar con la página, un problema conocido de
   Chromium al recalcular pistas de grid mientras varias animaciones de
   collapse cambian de altura a la vez. */
.group-body{display:flex;flex-direction:column;gap:.75rem;padding:0 1rem 1rem}

/* ===== Dispositivos ===== */
.device{border:1px solid var(--line);border-radius:.6rem;padding:.85rem;background:#fafbfd}
.device-main{display:flex;align-items:center;gap:.75rem}
.device-main .form-floating{flex:1}
.model{font-family:var(--mono);font-size:.8rem;color:var(--muted);white-space:nowrap}
.btn-cog{
  flex:none;width:2.9rem;height:2.9rem;border:1px solid var(--line);border-radius:.6rem;
  background:#fff;color:var(--muted);font-size:1.15rem;
}
.btn-cog i{display:inline-block;transition:transform .3s}
.btn-cog[aria-expanded="true"]{
  background:color-mix(in srgb,var(--cat,var(--blue)) 14%,#fff);
  border-color:var(--cat,var(--blue));color:var(--cat,var(--blue));
}
.btn-cog[aria-expanded="true"] i{transform:rotate(60deg)}
.dev-body{margin-top:.85rem;padding-top:.85rem;border-top:1px dashed var(--line)}
.specs{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:.75rem 1.5rem;margin:1rem 0 0}
.specs dt{font-size:.78rem;font-weight:500;color:var(--muted)}
.specs dd{margin:0;font-family:var(--mono);font-size:.9rem;word-break:break-all}

/* ===== Botón guardar fijo ===== */
.page:has(.savebar){padding-bottom:5.5rem}
.savebar{
  position:fixed;left:0;right:0;bottom:0;z-index:1020;
  display:flex;align-items:center;gap:1rem;justify-content:center;
  padding:.85rem 1.25rem;background:var(--bg);
  border-top:1px solid var(--line);box-shadow:0 -4px 12px rgba(0,0,0,.06);
}
.savebar .form-check{margin:0}
@media (min-width:992px){
  .savebar{left:272px}
}

/* ===== Banner de estado (colapsable) ===== */
.status-banner{border:1px solid var(--line);border-radius:.75rem;overflow:hidden}
.status-banner .accordion-item{border:0}
.status-banner .accordion-button{
  font-weight:600;font-size:.95rem;padding:.85rem 1.1rem;background:#fff;color:var(--ink);
}
.status-banner .accordion-button:focus{box-shadow:none}
.status-banner .accordion-button:not(.collapsed){box-shadow:none}
.status-banner .accordion-body{padding:.25rem 1.1rem 1.1rem;font-size:.92rem}
.status-banner-info{border-left:4px solid #0dcaf0}
.status-banner-info .accordion-button{color:#055160}
.status-banner-info .accordion-button i{color:#0dcaf0}
.status-banner-danger{border-left:4px solid var(--bs-danger,#dc3545)}
.status-banner-danger .accordion-button{color:#842029}
.status-banner-danger .accordion-button i{color:var(--bs-danger,#dc3545)}
.status-banner-warning{border-left:4px solid #ffc107}
.status-banner-warning .accordion-button{color:#664d03}
.status-banner-warning .accordion-button i{color:#ffc107}

/* ===== Modal: seleccionar planta ===== */
#resultado_lst{max-height:300px;overflow:auto}
#id01 th{position:sticky;top:0;background:#fff}
#id01 tr.clickable{cursor:pointer}

/* ===== Widget "Estado actual" (Monitorización, tiempo real) ===== */
.ef-showbtn{ display:inline-flex; align-items:center; gap:8px; margin:14px 0;
	background:#ffffff; color:var(--blue); font-size:13px; font-weight:600; font-family:inherit;
	border:1px solid #d7e3f0; border-radius:99px; padding:9px 18px; cursor:pointer;
	box-shadow:0 1px 3px rgba(20,40,70,.06);
	transition:background .2s ease, box-shadow .2s ease, border-color .2s ease; }
.ef-showbtn:hover{ background:#f3f7fc; border-color:#b9d0e8; box-shadow:0 2px 8px rgba(20,40,70,.10); }
.ef-showbtn:active{ background:#e9f1fa; }

.ems_actual{ margin:auto; width:100%; position:relative; z-index:0; }
.ef-card{ background:#ffffff; padding:14px 4px 18px; font-family:inherit; position:relative; z-index:0; }
.ef-top{ display:flex; align-items:center; justify-content:space-between; gap:10px; margin-bottom:4px; }
.ef-progress{ cursor:pointer; width:110px; }
.ef-progress .ef-bar{ padding:1px; border:solid 1px #ccc; border-radius:4px; width:100%; }
.ef-progress .ef-fill{ background:var(--blue); height:6px; width:0%; border-radius:3px; transition:width .3s linear; }
.ef-progress .ef-lbl{ font-size:11px; color:#8a94a0; margin-top:2px; }
.ef-status{ font-size:12px; color:#8a94a0; }
.ef-status.ef-off{ color:#e74d10; font-weight:600; }
.ef-close{ cursor:pointer; width:22px; height:22px; border-radius:50%; border:1px solid #dde2e8; color:#8a94a0; background:#fff; font-size:14px; line-height:1; display:flex; align-items:center; justify-content:center; }
.ef-close:hover{ border-color:#b7c0cb; color:#546e7a; }

.ef-stage{ position:relative; width:100%; height:260px; margin:6px auto 4px; z-index:0; }
.ef-stage svg{ display:block; width:100%; height:100%; overflow:visible; }
.ef-fline{ fill:none; stroke-linecap:round; transition:stroke .35s ease, stroke-width .35s ease, opacity .35s ease; }
.ef-fglow{ fill:none; stroke-linecap:round; filter:blur(3px); transition:stroke .35s ease, stroke-width .35s ease, opacity .35s ease; }
.ef-particle{ transition:fill .35s ease, opacity .3s ease; }
.ef-icon{ fill:none; stroke-linecap:round; stroke-linejoin:round; transition:stroke .35s ease; }
.ef-badge{ fill:#ffffff; stroke:#e6eaee; stroke-width:1.5; transition:stroke .35s ease; }
.ef-halo{ transition:opacity .35s ease; }
.ef-name{ font-size:11px; fill:#8a94a0; font-weight:500; }
.ef-value{ font-size:15px; font-weight:700; fill:#37424d; transition:fill .35s ease; }
.ef-state{ font-size:9.5px; fill:#98a2ac; }
.ef-hub-circle{ fill:#fbfcfd; stroke:#e6eaee; stroke-width:1; }
.ef-hub-track{ fill:none; stroke:#eef1f4; stroke-width:5; }
.ef-hub-arc{ fill:none; stroke:var(--blue); stroke-width:5; stroke-linecap:round; transition:stroke-dashoffset .5s ease; }
.ef-hub-val{ font-size:18px; font-weight:700; fill:#37424d; }
.ef-hub-lbl{ font-size:10px; fill:#98a2ac; }
.ef-mode-line{ font-size:9.5px; font-weight:600; fill:var(--blue); letter-spacing:.2px; }
.ef-soc-bg{ fill:#ffffff; stroke:#e6eaee; stroke-width:1; }
.ef-soc-txt{ font-size:15px; font-weight:700; fill:#546e7a; }

/* ===== Selector de fecha (histórico: monitorización y dispositivos) ===== */
.ef-datelabel{ display:flex; align-items:center; min-height:22px; line-height:22px; padding-bottom:8px; }
.ef-datenav{ display:inline-flex; align-items:center; justify-content:center;
	width:22px; height:22px; border-radius:50%; margin:0 4px;
	background:#ffffff; color:var(--blue); cursor:pointer;
	border:1px solid #d7e3f0; transition:background .2s ease, border-color .2s ease; }
.ef-datenav:hover{ background:#f3f7fc; border-color:#b9d0e8; }
.ef-datenav:active{ background:#e9f1fa; }
.ef-datenav svg{ width:13px; height:13px; display:block; }

/* ===== Balance de energía (tabla resumen, Monitorización) =====
   Cada celda "caja" (con su propio border/background inline) queda separada
   de las demás mediante border-spacing, en vez de compartir un borde común
   como en una tabla normal; las celdas sin caja (SOC, porcentajes, huecos)
   se quedan sin borde. */
.ems_resumen{ border-collapse:separate; border-spacing:10px 6px; text-align:center; }
.ems_resumen th, .ems_resumen td{ border:none; vertical-align:middle; }
.ems_resumen p{ margin:.15rem 0 0; font-weight:600; }
.ems_resumen .pct{ font-size:.8rem; color:var(--muted); font-weight:400; }

/* ===== Series / variables del histórico de Dispositivos ===== */
.ems_sh{ cursor:pointer; }

/* ===== Botón "Volver arriba" =====
   Color distinto (--accent, naranja) al de los botones de acción
   (btn-primary, azul) para no confundirlo con "Guardar configuración"
   cuando coincide con una .savebar fija; además, cuando la página
   tiene una .savebar, JS añade la clase back-to-top--raised para
   subirlo por encima y que nunca queden superpuestos. */
.back-to-top{
  position:fixed;right:1.25rem;bottom:1.25rem;z-index:1015;
  width:2.75rem;height:2.75rem;padding:0;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:var(--accent);color:#fff;border:0;font-size:1.2rem;
  box-shadow:0 4px 14px rgba(0,0,0,.18);
  opacity:0;visibility:hidden;transform:translateY(10px);
  transition:opacity .2s ease,transform .2s ease,visibility .2s,bottom .2s ease;
}
.back-to-top:hover{background:#c4670a}
.back-to-top.show{opacity:1;visibility:visible;transform:translateY(0)}
.back-to-top.back-to-top--raised{bottom:5.5rem}
@media (min-width:992px){
  .back-to-top{right:1.5rem}
}

@media (prefers-reduced-motion:reduce){*{transition:none!important}}

/* ===== Menú de acciones de las listas de administración en pantallas pequeñas =====
   Un botón «⋮» despliega las acciones a su izquierda, encima de la tabla, sin cambiar su tamaño (ver itr-compat.js). */
.acciones-pop{
  position:absolute;right:100%;top:50%;transform:translateY(-50%);margin-right:.25rem;z-index:20;
  padding:.4rem .75rem;background:#fff;border:1px solid var(--line);border-radius:.5rem;box-shadow:0 .25rem 1rem rgba(0,0,0,.18);
}

/* Títulos de sección (h3): 1,5 rem en todas las pantallas (Bootstrap los escala hasta 1,75 rem) */
h3,.h3{ font-size:1.5rem; }

/* «Alarmas» (app independiente) junto a «Cerrar sesión», encima de él, al final del menú lateral */
.snav.alarmas-link{ margin-top:auto; }
.snav.alarmas-link ~ .logout{ margin-top:0; }
.snav-linea{ margin:auto .75rem .35rem; border-top:1px solid var(--line); }      /* línea sin texto encima de «Alarmas»; es ella la que empuja el bloque inferior */
.snav-linea ~ .snav.alarmas-link{ margin-top:0; }   /* con la línea delante, «Alarmas» va pegada a lo anterior (Licencias) y la línea es la que empuja el bloque inferior */

/* División discreta del menú con el nº de serie del equipo seleccionado */
.snav-sep{display:flex;align-items:baseline;gap:.4rem;margin:.55rem .75rem .15rem;padding-top:.5rem;border-top:1px solid var(--line);font-size:.72rem;color:var(--muted)}
.snav-sep b{font-weight:500;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
