/* =============================================================
   ceco-rail.css — rail de navegación Command Center para páginas
   HÍBRIDAS: conservan ceco-ui.css (topbar, botones, modales) y
   solo suman el rail lateral + fila de KPIs de señal.
   PLAN_REDISENO_COMMAND_CENTER.md (F2).

   Sin colisiones con ceco-ui.css: solo se definen .cc-app, .cc-work,
   .rail*, .rail-scrim y .os-kpi* (verificado: no existen allá).
   Las páginas totalmente migradas usan ceco-command.css, que trae
   su propia copia del rail (misma marca visual).

   El rail es DESKTOP-ONLY aquí (≤1024px se oculta): las páginas
   híbridas ya tienen su navegación móvil propia (bottom nav/drawer).
   ============================================================= */

:root{
  --cc-rail-w:236px;
  --cc-rail-mini-w:64px;
  /* Ancho reservado para la columna del rail. El valor real lo fija
     <html data-cc-rail="full|mini"> en tiempo de parse (js/core/layout.js,
     síncrono en el <head>). */
  --cc-rail-cur:var(--cc-rail-w);
  --cc-navy-700:#0F3A5F; --cc-navy-800:#0B2A47; --cc-navy-900:#061829; --cc-navy-950:#03101C;
  --cc-cyan-400:#43AAEF; --cc-blue-500:#0091D7;
}
html[data-cc-rail="mini"]{--cc-rail-cur:var(--cc-rail-mini-w)}

/* ---- Grid del shell ----
   La columna del rail se reserva desde el PRIMER paint: renderRail solo
   monta el rail cuando resuelve la auth (onAuthStateChanged + lectura de
   usuarios/{uid}), y si el ancho dependiera de eso la página se pintaría
   a todo el ancho y saltaría al llegar el rail.
   El modo mini (solo iconos) se persiste por navegador en localStorage
   (cc_rail_mini) y se lee en el parse, así tampoco salta 236px→64px.
   .has-rail / .rail-mini las sigue poniendo layout.js sobre .cc-app; ya no
   determinan el ancho (lo hace --cc-rail-cur) y se conservan por si algún
   estilo de página se apoya en ellas. */
.cc-app{display:grid;grid-template-columns:var(--cc-rail-cur) 1fr;min-height:100vh}
.cc-work{min-width:0}

/* Marcador de posición: pinta la columna reservada con el fondo del rail
   mientras renderRail no ha reemplazado el nodo (si no, se vería un hueco
   blanco del ancho del rail durante la auth). */
#rail-mount{
  background:var(--cc-navy-900) radial-gradient(circle at 1px 1px,rgba(120,200,255,.10) 1px,transparent 0) 0 64px/22px 22px;
  border-right:1px solid var(--cc-navy-950);
}

/* Con rail visible (solo desktop), la marca del topbar viejo es redundante.
   Scoped a .cc-work: el monograma del rail (BRAND_MARK) comparte la clase
   .topbar-brand y NO debe ocultarse. */
@media (min-width:1025px){
  .cc-work .topbar-brand{display:none}
}

/* ---- Rail ---- */
.rail{
  position:sticky;top:0;height:100vh;background:var(--cc-navy-900);color:#fff;
  display:flex;flex-direction:column;border-right:1px solid var(--cc-navy-950);
  background-image:radial-gradient(circle at 1px 1px,rgba(120,200,255,.10) 1px,transparent 0);
  background-size:22px 22px;background-position:0 64px;z-index:30;
  /* View transition entre páginas (@view-transition en ceco-ui/ceco-command):
     el rail viejo y el nuevo se emparejan por este nombre y el navegador lo
     mantiene visualmente QUIETO mientras el contenido hace cross-fade. Exige
     que el rail nuevo exista al primer render — de eso se encarga el pintado
     optimista de Layout.initRail (rol desde sessionStorage, sin esperar Auth). */
  view-transition-name:cc-rail;
}
.rail__brand{display:flex;align-items:center;gap:10px;padding:16px 16px;border-bottom:1px solid rgba(255,255,255,.08)}
.rail__brand svg,.rail__brand img{width:34px;height:34px;border-radius:8px;flex:none;display:block}
.rail__brand .wm{display:flex;flex-direction:column;line-height:1}
.rail__brand .wm b{font:800 16px/1 var(--font-display,"Barlow",sans-serif);letter-spacing:.02em;color:#fff}
.rail__brand .wm span{font-size:9px;letter-spacing:.16em;color:rgba(255,255,255,.55);text-transform:uppercase;margin-top:4px}
.rail__nav{padding:10px 12px;display:flex;flex-direction:column;gap:2px;overflow-y:auto;flex:1}
.rail__group{font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:rgba(255,255,255,.4);padding:14px 12px 6px}
.rail__link{
  display:flex;align-items:center;gap:11px;padding:8px 12px;border-radius:8px;color:rgba(255,255,255,.75);
  font:500 13.5px/1.3 var(--font-body,"IBM Plex Sans",sans-serif);text-decoration:none;
  transition:background .15s,color .15s;position:relative;cursor:pointer;
}
.rail__link i,.rail__link svg{width:17px;height:17px}
.rail__link:hover{background:rgba(255,255,255,.07);color:#fff}
.rail__link.is-active{background:linear-gradient(90deg,rgba(0,145,215,.25),rgba(0,145,215,.05));color:#fff}
.rail__link.is-active::before{content:"";position:absolute;left:-12px;top:6px;bottom:6px;width:3px;border-radius:0 3px 3px 0;background:var(--cc-cyan-400);box-shadow:0 0 12px rgba(67,170,239,.8)}
.rail__link .badge{margin-left:auto;background:rgba(255,255,255,.12);color:#fff;font:600 11px/1 var(--font-mono,"IBM Plex Mono",monospace);padding:3px 7px;border-radius:999px}
.rail__link.is-active .badge{background:var(--cc-blue-500)}
.rail__foot{padding:12px;border-top:1px solid rgba(255,255,255,.08);display:flex;align-items:center;gap:10px}
.rail__avatar{width:34px;height:34px;border-radius:8px;background:linear-gradient(135deg,var(--cc-blue-500),var(--cc-navy-700));display:grid;place-items:center;font:700 13px var(--font-display,"Barlow",sans-serif);color:#fff;flex:none}
.rail__who{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.rail__who b{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#fff}
.rail__who span{font-size:11px;color:rgba(255,255,255,.55)}
.rail-scrim{display:none}

/* botón contraer/expandir */
.rail__collapse{
  display:flex;align-items:center;justify-content:center;gap:8px;width:100%;
  background:transparent;border:none;border-top:1px solid rgba(255,255,255,.08);
  color:rgba(255,255,255,.55);padding:10px;cursor:pointer;
  font:600 11px/1 var(--font-body,"IBM Plex Sans",sans-serif);letter-spacing:.08em;text-transform:uppercase;
  transition:color .15s,background .15s;
}
.rail__collapse:hover{color:#fff;background:rgba(255,255,255,.06)}
.rail__collapse i,.rail__collapse svg{width:16px;height:16px;transition:transform .2s}

/* ---- Modo mini (solo iconos) ---- */
.rail--mini .rail__brand{justify-content:center;padding:14px 8px}
.rail--mini .rail__brand .wm{display:none}
.rail--mini .rail__group{padding:12px 0 4px;text-align:center;overflow:hidden;white-space:nowrap;font-size:0}
.rail--mini .rail__group::before{content:"·";font-size:12px;color:rgba(255,255,255,.3)}
.rail--mini .rail__txt{display:none}
.rail--mini .rail__link{justify-content:center;padding:10px 0}
.rail--mini .rail__link .badge{
  position:absolute;top:2px;right:6px;margin:0;padding:2px 5px;font-size:9.5px;
}
.rail--mini .rail__link.is-active::before{left:-12px}
.rail--mini .rail__foot{justify-content:center;padding:10px 6px}
.rail--mini .rail__who{display:none}
.rail--mini .rail__collapse .rail__txt{display:none}
.rail--mini .rail__collapse i,.rail--mini .rail__collapse svg{transform:rotate(180deg)}

/* ---- Fila de KPIs de señal (bandeja de órdenes) ----
   Los <button> llevan data-action="filtrar-estado-chip" (mismo handler
   delegado que los chips) y los valores son [data-count] dentro de un
   contenedor .estado-chips-bar, así actualizarResumen() los llena solo. */
.os-kpis.estado-chips-bar,
.os-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;margin:0 0 16px;padding:0;border:none}
.os-kpi{
  background:var(--surface,#fff);border:1px solid var(--line,#DDE4EB);border-radius:10px;
  padding:14px 16px;text-align:left;cursor:pointer;font-family:inherit;
  display:flex;flex-direction:column;gap:0;transition:border-color .15s,box-shadow .15s;
}
.os-kpi:hover{border-color:var(--accent,#0091D7);box-shadow:0 4px 10px rgba(6,24,41,.07)}
.os-kpi__label{font-size:12px;color:var(--fg-3,#6B7884);font-weight:500;display:flex;align-items:center;gap:7px}
.os-kpi__label i{width:15px;height:15px;color:var(--fg-4,#9AA7B4);flex:none}
.os-kpi__val{font:700 28px/1.05 var(--font-display,"Barlow",sans-serif);letter-spacing:-.02em;margin-top:8px;color:var(--fg-1,#0E1418)}
.os-kpi__sub{font:600 11.5px/1 var(--font-mono,"IBM Plex Mono",monospace);margin-top:7px;color:var(--fg-3,#6B7884)}
.os-kpi--alert{border-left:3px solid var(--status-critical,#D24545)}
.os-kpi--alert .os-kpi__val{color:var(--status-critical,#D24545)}

/* ---- Stepper del ciclo de vida (detalle de orden, F3) ----
   Marcado por window.OrdenStepper según estado_reparacion; estados
   fuera del ciclo canónico de 5 → el stepper se oculta. */
.os-flow{display:flex;align-items:flex-start;width:100%;margin:20px auto 4px;max-width:780px}
.os-flow__step{flex:1;display:flex;flex-direction:column;align-items:center;gap:8px;position:relative;text-align:center}
.os-flow__step::before{content:"";position:absolute;top:13px;left:-50%;width:100%;height:2px;background:var(--line,#DDE4EB);z-index:0}
.os-flow__step:first-child::before{display:none}
.os-flow__dot{width:28px;height:28px;border-radius:50%;background:#fff;border:2px solid var(--line,#DDE4EB);display:grid;place-items:center;z-index:1;color:var(--fg-4,#9AA7B4);transition:.2s}
.os-flow__dot i{width:14px;height:14px}
.os-flow__lbl{font-size:11.5px;font-weight:600;color:var(--fg-4,#9AA7B4);max-width:96px;line-height:1.25}
.os-flow__step.done .os-flow__dot{background:#1FA56B;border-color:#1FA56B;color:#fff}
.os-flow__step.done::before{background:#1FA56B}
.os-flow__step.done .os-flow__lbl{color:var(--fg-2,#2F3942)}
.os-flow__step.current .os-flow__dot{background:var(--accent,#0091D7);border-color:var(--accent,#0091D7);color:#fff;box-shadow:0 0 0 4px rgba(0,145,215,.15)}
.os-flow__step.current .os-flow__lbl{color:var(--accent,#0091D7)}
.os-flow__step.current::before{background:#1FA56B}
@media (max-width:640px){
  .os-flow__lbl{font-size:10.5px;max-width:70px}
}

/* ---- Responsive: rail y KPIs solo en desktop ---- */
@media (max-width:1180px){
  .os-kpis{grid-template-columns:repeat(2,1fr)}
}
/* Botón flotante que abre el drawer en móvil (lo inyecta Layout.renderRail
   cuando la página no trae #ccRailToggle propio). Oculto en desktop. */
.rail-fab{display:none}

@media (max-width:1024px){
  .cc-app,.cc-app.has-rail,.cc-app.has-rail.rail-mini{grid-template-columns:1fr}
  #rail-mount{display:none}
  /* Drawer (auditoría A1): antes el rail se OCULTABA ≤1024px y las páginas
     híbridas quedaban sin navegación móvil — cambiar de módulo era volver
     al home (+2 clicks siempre). Off-canvas + scrim, mismo patrón que
     ceco-command; el ancho fijo ignora el modo mini (drawer siempre full). */
  .rail{position:fixed;inset:0 auto 0 0;z-index:1200;width:var(--cc-rail-w);
    transform:translateX(-100%);transition:transform .2s ease;display:flex}
  .rail--mini{width:var(--cc-rail-w)}
  .rail.is-open{transform:none;box-shadow:0 12px 40px rgba(0,0,0,.4)}
  .rail-scrim{position:fixed;inset:0;background:rgba(6,24,41,.5);z-index:1150}
  .rail-scrim.is-open{display:block}
  .rail-fab{display:inline-flex;position:fixed;left:14px;bottom:14px;z-index:1100;
    width:46px;height:46px;border-radius:999px;border:none;cursor:pointer;
    background:#0B2A47;color:#fff;align-items:center;justify-content:center;
    box-shadow:0 8px 24px rgba(0,0,0,.35)}
  .rail-fab .lucide{width:22px;height:22px}
  .os-kpis.estado-chips-bar,
  .os-kpis{display:none}
}
