/* =========================================================================
   Comandas — hoja de estilo única.
   OJO: al tocar este archivo hay que subir CM_ASSET_VER en config.php, o el
   cambio no se ve en un celular que ya entró (los assets se cachean días).
   ========================================================================= */

/* ───────── Tipografía ─────────
   IBM Plex Sans, servida DESDE ESTE MISMO SERVIDOR.

   Dos decisiones, y las dos tienen su razón.

   POR QUÉ NO LA DEL SISTEMA. Antes el panel usaba solo la fuente del aparato,
   y el argumento era bueno: la tablet de la cocina puede estar con wifi malo y
   una fuente que no carga deja la pantalla ilegible justo cuando más se
   necesita. Servirla desde el propio dominio quita esa objeción entera — viaja
   por la conexión que ya está abierta para el HTML, sin DNS ni saludo TLS a un
   tercero, y la cachea el mismo max-age que el resto. Son 45 KB una sola vez.
   Y si aun así no llegara, `swap` más la misma pila de respaldo de antes dejan
   la pantalla exactamente como estaba: no se pierde nada.

   POR QUÉ PLEX Y NO INTER. Inter era la elección obvia y por eso mismo no es
   una elección: está en tantos paneles que ya no dice nada de quién lo hizo.
   Plex se dibujó para una empresa de máquinas, y eso es justo lo que es
   Comandas — un interruptor industrial, corriente corriendo por circuitos, un
   tablero que se lee a metro y medio en una cocina caliente. Los remates
   acampanados y la 'a' de doble piso le dan carácter sin costarle un gramo de
   legibilidad, porque se diseñó para interfaces. Trae cifras tabulares de
   verdad, que es lo que alinea una columna de precios en caja. Y pesa 45 KB
   contra los 48 de Inter.

   Un solo archivo variable de 400 a 700: los cuatro pesos que usa el panel
   pesan lo mismo que uno. */
@font-face{
  font-family:'Plex var';
  font-style:normal;
  font-weight:400 700;
  font-display:swap;
  src:url('fuentes/plex-var-latin.woff2') format('woff2');
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,
                U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,
                U+2212,U+2215,U+FEFF,U+FFFD;
}

:root{
  /* ── Superficies. Cuatro niveles, no más: cada nivel de más es una
       decisión que alguien tiene que tomar otra vez en la próxima pantalla. */
  --fondo:#0A0A0C;
  --sup:#141418;
  --sup2:#1C1C22;
  --sup3:#24242C;
  --borde:#2A2A33;
  --borde2:#3A3A45;

  /* ── Texto. Los tres tonos están MEDIDOS contra la superficie más clara en
       la que aparecen (--sup3): 14.1:1, 5.5:1 y 4.5:1.
       --tenue2 era #6B6B75 y daba 2.92:1 sobre --sup3 — por debajo del mínimo
       de WCAG incluso para texto grande, y es justo el color de la ayuda que
       va debajo de cada campo. Se subió a #8A8A94, el gris más discreto que
       todavía pasa 4.5:1. */
  --texto:#F5F5F7;
  --tenue:#9A9AA4;
  --tenue2:#8A8A94;

  --acento:#FF7A45;
  --acento2:#FF9B68;
  --acento-osc:#C4491A;

  /* Textos sobre tinte (verde sobre verde translúcido, etc). Van en variables
     porque el tema claro necesita las versiones OSCURAS de los mismos colores:
     un verde pastel #86EFAC que brilla sobre negro es invisible sobre blanco. */
  --tx-ok:#86EFAC;   --tx-mal:#FCA5A5;  --tx-ojo:#FCD34D;   --tx-info:#93C5FD;
  --tx-cielo:#7DD3FC;--tx-morado:#C4B5FD;--tx-esm:#6EE7B7;  --tx-oro:#FDE68A;

  --nuevo:#3B82F6;
  --prep:#F59E0B;
  --listo:#22C55E;
  --malo:#EF4444;

  /* ── Escala tipográfica.
       Antes había veinte tamaños sueltos (13, 13.5, 14, 14.5, 15, 15.5…) que
       nadie podía distinguir a simple vista pero que sí se notan juntos: la
       pantalla se ve desordenada sin que uno sepa por qué. Esta escala tiene
       ocho pasos y cada salto es visible. */
  --t-micro:11px;    /* etiquetas en versalita, candados */
  --t-mini:12.5px;   /* metadatos, contadores */
  --t-chico:13.5px;  /* ayuda, texto secundario */
  --t-ui:15px;       /* botones, navegación, cuerpo del panel */
  --t-base:16px;     /* cuerpo de lectura */
  --t-medio:17px;    /* nombre de un producto en una lista */
  --t-titulo:21px;   /* título de una tarjeta o de un modal */
  --t-dato:27px;     /* la cifra de un KPI */
  --t-gigante:34px;  /* el turno de la comanda, leído a metro y medio */

  /* ── Escala de espacio, en pasos de 4. Las mismas distancias en todas
       partes es lo que hace que dos pantallas distintas se vean del mismo
       producto. */
  --e1:4px; --e2:8px; --e3:12px; --e4:16px; --e5:20px; --e6:24px; --e8:32px;

  /* ── Radios. Uno por tipo de objeto, no uno por antojo. */
  --r-chico:10px;    /* etiquetas, campos pequeños, miniaturas */
  --r:12px;          /* botones, campos, avisos */
  --r-tarjeta:16px;  /* tarjetas y columnas */
  --r-hoja:20px;     /* la hoja que sube desde abajo (modal) */
  --r2:16px;         /* alias histórico — apunta al radio de tarjeta */

  /* ── Elevación. Se declara UNA vez por objeto: o borde, o sombra.
       Un borde de 1px debajo de una sombra ancha deja el objeto flotando y
       apoyado a la vez, y se lee como un error de dibujo. Regla de la casa:
       lo que está QUIETO lleva borde; lo que FLOTA sobre el resto (modal,
       aviso, carrito, menú desplegable) lleva sombra y nada de borde. */
  --sombra:0 4px 16px rgba(0,0,0,.4);
  --sombra-alta:0 18px 44px -12px rgba(0,0,0,.66);

  --toque:56px;              /* alto mínimo de cualquier cosa que se toque */

  --fuente:'Plex var',-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
}

*{box-sizing:border-box;margin:0;padding:0;-webkit-tap-highlight-color:transparent}
html{-webkit-text-size-adjust:100%}
body{
  font-family:var(--fuente);
  background:var(--fondo);
  color:var(--texto);
  font-size:var(--t-base);
  line-height:1.45;
  overscroll-behavior-y:none;
  /* Sobre fondo negro el texto claro se "engorda": el navegador lo dibuja con
     más pixeles encendidos de los que le tocan. Estas dos líneas lo devuelven
     al peso real, y es la diferencia entre una pantalla oscura que se lee y una
     que cansa a las dos horas. */
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}
/* NADA de overflow:hidden en body. Las páginas públicas (menú, estado del
   pedido) no usan el armazón .app y en iPhone eso impide el scroll salvo con
   pinch-zoom. Fue un bug real en el sistema de contratos. */

a{color:var(--acento);text-decoration:none}
button,input,select,textarea{font:inherit;color:inherit}
img{max-width:100%;display:block}

/* El atributo `hidden` trae `display:none` de la hoja del navegador, y CUALQUIER
   `display:flex` o `display:grid` propio le gana por especificidad — el elemento
   sigue viéndose con el atributo puesto. Ya pasó una vez en este proyecto.
   Esta línea lo blinda para todo el archivo. */
[hidden]{display:none!important}

/* ───────── Las superficies que pone el navegador ─────────
   Selección, cursor de escritura, barras de desplazamiento y anillo de foco.
   Nadie las mira a propósito, pero son las que delatan una pantalla armada de
   una hecha: en una app negra, la selección azul de fábrica y una barra de
   scroll clara aparecen sin permiso y no pertenecen a nada de lo que hay
   alrededor. Cuesta doce líneas. */
::selection{background:rgba(255,122,69,.32);color:#FFF}
:root{caret-color:var(--acento)}
*{scrollbar-color:var(--borde2) transparent;scrollbar-width:thin}
::-webkit-scrollbar{width:11px;height:11px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{
  background:var(--borde2);border-radius:999px;
  /* el borde transparente adelgaza el pulgar sin adelgazar la zona de agarre */
  border:3px solid transparent;background-clip:content-box;
}
::-webkit-scrollbar-thumb:hover{background:#4B4B58;background-clip:content-box}
::-webkit-scrollbar-corner{background:transparent}

/* ANILLO DE FOCO — antes no existía en ninguna parte.
   Los campos traían `outline:0` y los botones nunca tuvieron nada, así que
   quien navega con Tab —o con un teclado colgado de la tablet, que en una
   cocina es lo cómodo— no tenía forma de saber dónde estaba parado.

   :focus-visible y no :focus: el navegador solo lo pinta cuando el foco vino
   del teclado. Con el dedo o el mouse no aparece, que es lo correcto — un
   anillo tras cada toque en la tablet sería ruido.

   2px y separado del elemento, para que se vea sobre cualquier fondo del panel
   (WCAG 2.2 pide un perímetro de 2px y 3:1 de contraste; naranja sobre negro
   da 7.65:1). */
:focus-visible{
  outline:2px solid var(--acento);
  outline-offset:2px;
  border-radius:var(--r-chico);
}
/* Sobre un botón naranja el anillo naranja se pierde: ahí va blanco. */
.btn-pri:focus-visible,.lanza.destaca:focus-visible{outline-color:#FFF}
/* Y el interruptor lleva el suyo, redondo como él */
.interruptor:focus-visible{outline:3px solid #FFF;outline-offset:6px;border-radius:50%}

/* ───────── Cifras alineadas ─────────
   Todo lo que sea plata, turno, hora o cantidad va en cifras de ancho fijo.
   Sin esto una columna de precios queda con las comas bailando y un cronómetro
   se mueve un pixel a cada segundo — dos cosas que se ven mal sin que uno
   sepa señalar por qué. */
.kpi b,.cm-turno,.it-cant,.col-cabeza .cuenta,.cm-reloj,.plata,
table td,table th,.prod-meta,.resumen{font-variant-numeric:tabular-nums}

/* Títulos sin palabra huérfana en el último renglón */
h1,h2,h3,.inicio h1{text-wrap:balance}

/* ───────── Armazón del panel ───────── */
.app{display:flex;flex-direction:column;height:100dvh;overflow:hidden}
.contenido{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch}

/* ───────── Cabecera ─────────
   Dos filas y centrada: la marca arriba, la navegación debajo. Los controles
   (modo y salir) van ANCLADOS a la derecha sin entrar en el flujo, para que el
   nombre del negocio quede ópticamente centrado y no desplazado por el ancho de
   lo que haya al lado. Esta barra vive doce horas abierta en la misma pantalla:
   vale la pena que respire. */
/* El padding de arriba respeta la MUESCA. Con apple-mobile-web-app-status-bar-
   style: black-translucent, la app instalada en iPad/iPhone dibuja por debajo
   del reloj y el wifi; sin esto la cabecera quedaba tapada. En navegador
   env() vale 0 y no cambia nada. */
.topbar{
  display:flex;flex-direction:column;align-items:center;flex:none;
  padding:calc(16px + env(safe-area-inset-top,0px)) 18px 0;
  background:linear-gradient(180deg,var(--sup),var(--fondo));
  border-bottom:1px solid var(--borde);
  position:sticky;top:0;z-index:40;
}
.topbar::after{ /* filo de luz: separa sin pintar una línea dura */
  content:"";position:absolute;left:0;right:0;bottom:-1px;height:1px;
  background:linear-gradient(90deg,transparent,var(--acento),transparent);opacity:.28;
}

/* REJILLA de tres columnas, no posición absoluta.
   Con `1fr auto 1fr` la celda del medio queda centrada respecto al contenedor y
   las laterales RESERVAN su espacio: los controles no pueden montarse sobre el
   nombre por más que crezcan (y crecen: cuando la plataforma entra a un negocio
   aparece el chip de "viendo"). Con posición absoluta el nombre quedaba tapado.
   En pantalla angosta son dos columnas: marca a la izquierda, controles a la
   derecha, que es lo honesto cuando no hay sitio para centrar nada. */
.topbar-fila{
  display:grid;grid-template-columns:minmax(0,1fr) auto;
  align-items:center;gap:10px;width:100%;min-height:44px;
}
.marca{grid-column:1;min-width:0}
.topbar-controles{grid-column:2;display:flex;gap:9px;align-items:center;justify-self:end}
.cima{display:flex;align-items:center;gap:9px}

/* OJO con minmax(0,1fr) en la columna de los controles: le permite quedar más
   angosta que su contenido y desbordarse encima del nombre. La columna derecha
   lleva `min-content` como mínimo — así nunca puede encogerse por debajo de lo
   que mide. La izquierda sí puede llegar a cero: está vacía.
   Y se centra solo desde 1200: cuando la plataforma entra a un negocio aparece
   el chip de "viendo" y los controles crecen bastante. */
@media (min-width:1200px){
  .topbar-fila{grid-template-columns:minmax(0,1fr) auto minmax(min-content,1fr)}
  .marca{grid-column:2;justify-self:center}
  .topbar-controles{grid-column:3}
}

.marca{display:flex;align-items:center;color:var(--texto);min-width:0}
/* El logo de la plataforma en la cabecera del panel (fondo oscuro). */
.marca-logo{display:block;height:38px;max-width:210px;object-fit:contain}
body.tema-claro .marca-logo{filter:invert(1) hue-rotate(180deg)}
@media (max-width:1199px){ .marca-logo{height:30px;max-width:150px} }
@media (min-width:1200px){ .marca{align-items:center;text-align:center} }
.marca-linea{display:flex;align-items:center;gap:10px;min-width:0}
/* El nombre del negocio es lo primero que tiene que decir esta pantalla.
   Sin el subtítulo del modo debajo, puede ocupar el alto entero de la línea. */
.marca-linea b{font-size:clamp(20px,2.4vw,26px);font-weight:700;letter-spacing:-.025em;
  line-height:1.1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.marca .punto{
  width:13px;height:13px;border-radius:50%;background:var(--acento);flex:none;
  transition:background-color .4s var(--ease-salida) var(--retraso,0ms),
             box-shadow .4s var(--ease-salida) var(--retraso,0ms);
}
/* .marca-modo ya no se usa: el modo vive en el segmentado, donde se cambia. */

.nav{display:flex;gap:4px;justify-content:center;width:100%;
  padding:10px 0 0;overflow-x:auto;scrollbar-width:none;min-width:0}
.nav::-webkit-scrollbar{display:none}
/* Cada sección: icono arriba, nombre abajo, columna centrada. El icono lleva
   SU medida AQUÍ, en la base — antes solo estaba dentro del media query del
   sidebar y en tablet los SVG quedaban sin tamaño: explotaban al intrínseco
   y la barra se veía como un choque de trenes (visto en iPad). */
.navlink{
  display:flex;flex-direction:column;align-items:center;gap:5px;
  min-width:64px;padding:10px 12px 12px;
  border-radius:var(--r-chico) var(--r-chico) 0 0;color:var(--tenue);
  font-weight:600;font-size:var(--t-mini);white-space:nowrap;position:relative;
  transition:color .16s ease;
}
.nav-ico{display:grid;place-items:center;width:24px;height:24px;flex:none}
.nav-ico svg{width:22px;height:22px}
.navlink.on{color:var(--texto)}
.navlink.on .nav-ico{color:var(--acento)}
.navlink.on::after{
  content:"";position:absolute;left:50%;bottom:0;width:28px;height:2.5px;
  transform:translateX(-50%);
  border-radius:2px 2px 0 0;background:var(--acento);
}
@media (hover:hover){ .navlink:hover{color:var(--texto)} }

/* Segmentado de modo: se ve el estado actual y las alternativas a la vez.
   Un desplegable escondería justo lo que hay que poder cambiar de un toque. */
.modos{display:flex;gap:2px;padding:3px;border-radius:var(--r-chico);background:var(--sup2);
  border:1px solid var(--borde);flex:none}
.modo{
  border:0;background:transparent;color:var(--tenue);cursor:pointer;
  padding:7px 12px;border-radius:var(--r-chico);font-size:var(--t-mini);font-weight:700;
  transition:background-color .16s ease,color .16s ease;
}
.modo.on{background:var(--sup3);color:var(--texto);box-shadow:0 1px 2px rgba(0,0,0,.35)}
@media (hover:hover){ .modo:not(.on):hover{color:var(--texto)} }

.salir{display:flex;align-items:center;gap:9px;padding:6px 12px 6px 6px;border-radius:999px;
  color:var(--tenue);font-weight:600;font-size:var(--t-chico);flex:none}
.salir .inicial{
  width:30px;height:30px;border-radius:50%;display:grid;place-items:center;flex:none;
  background:var(--sup3);color:var(--texto);font-weight:800;font-size:var(--t-chico);
  box-shadow:inset 0 0 0 1px var(--borde2);
}
@media (hover:hover){ .salir:hover{background:var(--sup2);color:var(--texto)} }

@media (max-width:1000px){
  .navlink{padding:9px 8px 11px;min-width:58px}
}
@media (max-width:760px){
  .topbar{padding:12px 12px 0}
  .marca-linea b{font-size:19px}
  .modos .modo{padding:7px 9px;font-size:var(--t-micro)}
  .salir-txt{display:none}
  .navlink{padding:8px 6px 10px;min-width:52px;font-size:var(--t-micro)}
  .nav-ico svg{width:20px;height:20px}
  /* La navegación se alinea a la izquierda para poder deslizarla cuando no cabe */
  .nav{justify-content:flex-start}
}

/* ───────── Botones ───────── */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:46px;padding:0 18px;border:0;border-radius:var(--r);
  background:var(--sup3);color:var(--texto);font-weight:700;font-size:var(--t-ui);
  cursor:pointer;
  /* La transición completa del botón se declara una sola vez, más abajo, en la
     sección del interruptor: ahí necesita además los colores escalonados del
     encendido. Declararla dos veces era tener una que no se aplicaba nunca. */
}
.btn:active{transform:scale(.97)}
.btn:disabled{opacity:.45;cursor:not-allowed}
.btn-pri{background:var(--acento);color:#1A0B04}
.btn-listo{background:var(--listo);color:#04240F}
.btn-malo{background:transparent;color:var(--malo);box-shadow:inset 0 0 0 1px currentColor}
.btn-linea{background:transparent;box-shadow:inset 0 0 0 1px var(--borde2);color:var(--texto)}
.btn-grande{min-height:var(--toque);font-size:var(--t-medio);border-radius:var(--r-tarjeta);padding:0 var(--e5)}
/* Un botón de solo icono es cuadrado y conserva su área de toque aunque el
   dibujo sea chico. Los tres que hay (cancelar, quitar opción, quitar valor)
   llevan aria-label: sin texto visible, es lo único que un lector de pantalla
   tiene para saber qué hacen. */
.btn-ico{padding:0;width:46px;min-width:46px}
.btn-ico svg{width:18px;height:18px}
.btn-ico-sm{min-height:38px;width:38px;min-width:38px}
.btn-ico-sm svg{width:15px;height:15px}
.btn-ico-xs{min-height:34px;width:34px;min-width:34px}
.btn-ico-xs svg{width:13px;height:13px}
.btn-bloque{width:100%}
@media (hover:hover){ .btn:hover{filter:brightness(1.12);transform:translateY(-1px)} }

/* ───────── Tarjetas y formularios ───────── */
.tarjeta{background:var(--sup);border:1px solid var(--borde);border-radius:var(--r-tarjeta);padding:var(--e5)}
.campo{margin-bottom:14px}
.campo label{display:block;font-size:var(--t-chico);font-weight:700;color:var(--tenue);margin-bottom:6px;
  text-transform:uppercase;letter-spacing:.04em}
.campo input,.campo select,.campo textarea{
  width:100%;min-height:48px;padding:12px 14px;background:var(--sup2);
  border:1px solid var(--borde);border-radius:var(--r);
}
.campo textarea{min-height:88px;resize:vertical}
.campo input:focus,.campo select:focus,.campo textarea:focus{border-color:var(--acento)}

/* TODOS los desplegables, de una vez: la flecha nativa quedaba diminuta y
   pegada al texto. Flecha propia, aire generoso, mismo cuerpo en todo el panel. */
select{
  appearance:none;-webkit-appearance:none;
  min-height:48px;padding:10px 44px 10px 16px;
  font-size:14.5px;font-weight:600;color:var(--texto);cursor:pointer;
  background-color:var(--sup2);
  background-image:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="13" height="9" viewBox="0 0 13 9"><path d="M1.5 2 6.5 7 11.5 2" fill="none" stroke="%239A9AA4" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"/></svg>');
  background-repeat:no-repeat;background-position:right 16px center;
  border:1px solid var(--borde);border-radius:12px;
  transition:border-color .15s ease;
}
select:focus{border-color:var(--acento);outline:none}
.campo select{padding:10px 44px 10px 16px}
.ayuda{font-size:var(--t-chico);color:var(--tenue2);margin-top:5px;line-height:1.4}

.aviso{padding:13px 16px;border-radius:var(--r);font-size:var(--t-ui);margin-bottom:16px;line-height:1.45}
.aviso-ok{background:rgba(34,197,94,.12);color:var(--tx-ok);border:1px solid rgba(34,197,94,.3)}
.aviso-mal{background:rgba(239,68,68,.12);color:var(--tx-mal);border:1px solid rgba(239,68,68,.3)}
.aviso-info{background:rgba(59,130,246,.12);color:var(--tx-info);border:1px solid rgba(59,130,246,.3)}
.aviso-ojo{background:rgba(245,158,11,.12);color:var(--tx-ojo);border:1px solid rgba(245,158,11,.3)}

.candado{
  display:inline-block;font-size:var(--t-micro);font-weight:800;letter-spacing:.05em;text-transform:uppercase;
  padding:3px 8px;border-radius:999px;background:var(--sup3);color:var(--tenue);
  border:1px solid var(--borde2);vertical-align:middle;margin-left:8px;
}

/* ───────── ENCENDER COCINA — el botón más importante del panel ───────── */
.encender{
  display:flex;align-items:center;gap:16px;padding:16px 18px;border-radius:var(--r2);
  border:1px solid var(--borde);background:var(--sup);margin-bottom:16px;flex-wrap:wrap;
}
.encender .luz{
  width:52px;height:52px;border-radius:50%;flex:none;position:relative;
  background:var(--sup3);box-shadow:inset 0 0 0 2px var(--borde2);
}
.encender.on .luz{background:var(--listo)}
.encender.on .luz::after{
  content:"";position:absolute;inset:0;border-radius:50%;border:2px solid rgba(34,197,94,.55);
  animation:latido 2.4s ease-out infinite;
}
@keyframes latido{0%{transform:scale(1);opacity:.9}100%{transform:scale(1.55);opacity:0}}
.encender .txt{flex:1;min-width:180px}
.encender .txt b{display:block;font-size:var(--t-medio);letter-spacing:-.01em}
.encender .txt span{color:var(--tenue);font-size:var(--t-chico)}
.encender .btn{min-height:var(--toque);font-size:var(--t-base)}

/* ── EN PAUSA ──
   La pausa dejó de ser un botón que cambia de texto y pasó a ser un ESTADO
   con su propia franja: mismo cuerpo que la de encendido, en ámbar, con el
   reloj corriendo. En una cocina, un estado que no se ve es un estado que se
   olvida — y cada minuto de pausa olvidada es un cliente que encuentra la
   carta cerrada. */
.pausa-franja{
  display:flex;align-items:center;gap:var(--e4);flex-wrap:wrap;
  padding:14px 18px;margin-bottom:16px;border-radius:var(--r2);
  border:1px solid rgba(245,158,11,.42);
  background:linear-gradient(170deg,rgba(245,158,11,.13),transparent 70%),var(--sup);
  animation:lanza-entra .3s var(--ease-salida) backwards;
}
.pausa-franja[hidden]{display:none}
.pf-ico{
  width:44px;height:44px;flex:none;border-radius:50%;display:grid;place-items:center;
  background:rgba(245,158,11,.16);color:var(--tx-ojo);
}
.pf-ico svg{width:22px;height:22px;animation:pf-late 2.2s ease-in-out infinite}
@keyframes pf-late{50%{opacity:.4}}
.pf-tx{flex:1;min-width:190px}
.pf-tx > b{display:block;font-size:var(--t-medio);letter-spacing:-.01em;color:var(--tx-ojo)}
.pf-tx span{color:var(--tenue);font-size:var(--t-chico)}
.pf-tx span b{color:var(--texto);font-variant-numeric:tabular-nums;font-weight:800}
.pf-btn{
  min-height:44px;padding:0 var(--e4);border-radius:var(--r);cursor:pointer;font:inherit;
  font-size:var(--t-chico);font-weight:700;color:var(--tx-ojo);
  background:transparent;border:1px solid rgba(245,158,11,.42);
  transition:transform .16s var(--ease-salida),background-color .16s var(--ease-salida);
}
.pf-btn:active{transform:scale(.97)}
@media (hover:hover){ .pf-btn:hover{background:rgba(245,158,11,.12)} }
.pf-ya{background:var(--listo);border-color:var(--listo);color:#04220E}
@media (hover:hover){ .pf-ya:hover{background:#2FD46A} }

/* La hoja de minutos. Seis tiempos grandes y nada que escribir: nadie teclea
   minutos con las manos llenas de aceite. */
.pau-ops{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--e2)}
.pau-op{
  min-height:76px;border-radius:var(--r);cursor:pointer;font:inherit;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;
  background:var(--sup2);border:1px solid var(--borde);color:var(--texto);
  transition:transform .16s var(--ease-salida),background-color .16s var(--ease-salida),
             border-color .16s var(--ease-salida);
}
.pau-op b{font-size:var(--t-dato);font-weight:800;font-variant-numeric:tabular-nums;line-height:1}
.pau-op span{font-size:var(--t-mini);color:var(--tenue)}
.pau-op:active{transform:scale(.97)}
@media (hover:hover){
  .pau-op:hover{background:var(--sup3);border-color:rgba(245,158,11,.5)}
  .pau-op:hover b{color:var(--tx-ojo)}
}
.pau-nota{margin:var(--e3) 0 var(--e4)}

@media (prefers-reduced-motion:reduce){
  .pausa-franja{animation:none}
  .pf-ico svg{animation:none}
}
.btn-encender{background:var(--listo);color:#04240F}
.btn-apagar{background:var(--sup3);color:var(--texto);box-shadow:inset 0 0 0 1px var(--borde2)}

/* ───────── KPIs del día ───────── */
.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:10px;margin-bottom:16px}
.kpi{background:var(--sup);border:1px solid var(--borde);border-radius:var(--r);padding:12px 14px}
.kpi b{display:block;font-size:var(--t-dato);font-weight:800;letter-spacing:-.02em;line-height:1.1}
.kpi span{font-size:var(--t-mini);color:var(--tenue);text-transform:uppercase;letter-spacing:.05em;font-weight:700}

/* ───────── El tablero ───────── */
.tablero{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:0 14px 14px;align-items:start}
.columna{background:var(--sup);border:1px solid var(--borde);border-radius:var(--r2);
  display:flex;flex-direction:column;min-height:200px;overflow:hidden}
.col-cabeza{
  display:flex;align-items:center;gap:9px;padding:12px 14px;font-weight:800;font-size:var(--t-ui);
  border-bottom:1px solid var(--borde);position:sticky;top:0;background:var(--sup);z-index:2;
  text-transform:uppercase;letter-spacing:.04em;
}
.col-cabeza .bolita{width:10px;height:10px;border-radius:50%;flex:none}
.col-cabeza .cuenta{margin-left:auto;background:var(--sup3);border-radius:999px;padding:2px 10px;
  font-size:var(--t-chico);color:var(--tenue);letter-spacing:0}
.col-nuevo .bolita{background:var(--nuevo)}
.col-preparando .bolita{background:var(--prep)}
.col-listo .bolita{background:var(--listo)}
.col-lista{padding:10px;display:flex;flex-direction:column;gap:10px;min-height:120px;
  overflow-y:auto;max-height:calc(100dvh - 250px)}

/* ───────── La comanda ───────── */
/* El filo de color de 5 px a la izquierda se mantiene A PROPÓSITO, aunque sea
   de los patrones que un revisor marca de entrada.
   Ahí no es decoración: es el ESTADO del pedido, y es el único canal que se lee
   a metro y medio, cuando la letra de la comanda ya no se distingue. Azul entró,
   ámbar se está haciendo, verde está listo. Un cocinero con las manos ocupadas
   ve la franja de color antes que cualquier otra cosa de la tarjeta.
   Lo que el patrón critica —una barrita de acento en una tarjeta cualquiera— no
   es esto: aquí el color ES el dato. */
.comanda{
  background:var(--sup2);border:1px solid var(--borde);border-left:5px solid var(--nuevo);
  border-radius:var(--r);padding:12px 13px;
  /* touch-action lo maneja Sortable; sin esto el arrastre pelea con el scroll */
  touch-action:manipulation;
}
.comanda.e-preparando{border-left-color:var(--prep)}
.comanda.e-listo{border-left-color:var(--listo)}
.cm-cabeza{display:flex;align-items:flex-start;gap:10px;margin-bottom:9px}
.cm-turno{font-size:var(--t-gigante);font-weight:800;line-height:1;letter-spacing:-.03em}
.cm-quien{flex:1;min-width:0}
.cm-quien b{display:block;font-size:var(--t-ui);font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cm-quien span{font-size:var(--t-mini);color:var(--tenue);display:block}
/* ───────── El cronómetro: un anillo que se llena ─────────
   Antes era una pastilla con el número de minutos. El número obliga a leerlo y
   a compararlo de cabeza contra el tiempo prometido; el anillo dice cuánto
   falta sin leer nada, que es lo único que se puede hacer desde el otro lado
   de la cocina. El número se queda adentro para cuando sí hace falta el dato.

   Registrar --vuelta como propiedad tipada es lo que permite ANIMAR un
   degradado cónico: sin esto el navegador no sabe interpolar un ángulo dentro
   de un background y el anillo daría saltos. Donde no haya soporte, salta —
   sigue diciendo lo mismo, solo que sin el movimiento. */
/* inherits:TRUE, y no es un detalle: el arco lo dibuja el ::before, y un
   pseudo-elemento hereda de su elemento como cualquier hijo. Con `false` el
   ::before leía el valor inicial —0deg— y el anillo salía SIEMPRE vacío, aunque
   el elemento tuviera 360deg puestos en su atributo style. Se veía como un
   círculo gris; medido en el navegador, el degradado decía
   `conic-gradient(rosa 0deg, gris 0deg)`. */
@property --vuelta{ syntax:'<angle>'; inherits:true; initial-value:0deg }

.cm-reloj{
  --vuelta:0deg;
  position:relative;flex:none;
  width:46px;height:46px;border-radius:50%;
  display:grid;place-items:center;
  font-size:var(--t-chico);font-weight:800;font-variant-numeric:tabular-nums;
  color:var(--tx-ok);                       /* el arco hereda de aquí: un color, no dos */
  transition:color .4s var(--ease-salida), --vuelta 1.2s linear;
}
/* El arco. La máscara radial le saca el centro y lo convierte en anillo; sin
   ella sería un queso relleno, que a esta escala se lee como una mancha. */
.cm-reloj::before{
  content:"";position:absolute;inset:0;border-radius:50%;pointer-events:none;
  background:conic-gradient(currentColor var(--vuelta), color-mix(in srgb, currentColor 20%, transparent) 0);
  -webkit-mask:radial-gradient(closest-side,transparent 84%,#000 85%);
          mask:radial-gradient(closest-side,transparent 84%,#000 85%);
}
/* Un velo tenue del mismo color adentro: separa el número del fondo de la
   comanda sin pintarle una caja alrededor. */
.cm-reloj::after{
  content:"";position:absolute;inset:5px;border-radius:50%;pointer-events:none;
  background:currentColor;opacity:.11;
}
.cm-reloj > span{position:relative;z-index:1;line-height:1}

.cm-reloj.medio{color:var(--tx-ojo)}
/* Pasado el tiempo prometido el anillo ya está lleno, así que la señal nueva
   tiene que venir por otro lado: el color y un latido lento. No sigue dando
   vueltas —una segunda vuelta no se distingue de la primera y confundiría. */
.cm-reloj.tarde{color:var(--tx-mal);animation:parpadeo 1.6s ease-in-out infinite}
@keyframes parpadeo{50%{opacity:.6}}

/* En pantalla angosta la cabecera de la comanda va apretada: el anillo baja a
   40px y sigue leyéndose. */
@media (max-width:400px){
  .cm-reloj{width:40px;height:40px;font-size:var(--t-mini)}
}

.cm-etqs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}
.etq{font-size:var(--t-micro);font-weight:800;padding:3px 9px;border-radius:999px;background:var(--sup3);
  color:var(--tenue);text-transform:uppercase;letter-spacing:.04em;
  /* Una etiqueta partida en dos líneas ("PRIMERA / VEZ") se lee como un error.
     Si no cabe, que baje entera. */
  white-space:nowrap;display:inline-block}
.etq-mesa{background:rgba(139,92,246,.18);color:var(--tx-morado)}
.etq-pagado{background:rgba(34,197,94,.16);color:var(--tx-ok)}
.etq-verificar{background:rgba(245,158,11,.16);color:var(--tx-ojo)}
.etq-debe{background:rgba(239,68,68,.16);color:var(--tx-mal)}

.cm-items{list-style:none;display:flex;flex-direction:column;gap:7px;margin-bottom:10px}
.cm-item{display:flex;gap:9px;align-items:flex-start;padding:7px 8px;border-radius:var(--r-chico);background:var(--sup);
  cursor:pointer}
.cm-item.hecho{opacity:.42}
.cm-item.hecho .it-nom{text-decoration:line-through}
.it-cant{font-weight:800;font-size:var(--t-titulo);min-width:30px;color:var(--acento);flex:none;text-align:center}
.it-cuerpo{flex:1;min-width:0}
.it-nom{font-size:var(--t-base);font-weight:600;line-height:1.3}
.it-ops{font-size:var(--t-chico);color:var(--tx-mal);font-weight:600;margin-top:2px}   /* modificadores: rojo, se leen de lejos */
.it-nota{font-size:var(--t-chico);color:var(--tx-ojo);margin-top:2px;font-style:italic}
.it-check{width:22px;height:22px;border-radius:6px;border:2px solid var(--borde2);flex:none;margin-top:2px;
  display:grid;place-items:center;color:transparent;
  transition:background-color .16s var(--ease-salida),border-color .16s var(--ease-salida),color .16s var(--ease-salida)}
.it-check svg{width:14px;height:14px}
.cm-item.hecho .it-check{background:var(--listo);border-color:var(--listo);color:#04240F}

.cm-nota{background:rgba(245,158,11,.1);border:1px solid rgba(245,158,11,.28);color:var(--tx-ojo);
  padding:8px 10px;border-radius:var(--r-chico);font-size:var(--t-chico);margin-bottom:9px;line-height:1.4}
.cm-alergia{background:rgba(239,68,68,.14);border:1px solid rgba(239,68,68,.4);color:var(--tx-mal);
  padding:8px 10px;border-radius:var(--r-chico);font-size:var(--t-chico);font-weight:700;margin-bottom:9px}
.cm-pie{display:flex;gap:8px}
.cm-pie .btn{flex:1;min-height:48px;font-size:var(--t-ui)}

/* Estados del arrastre */
.arrastrando{opacity:.35}
.fantasma{background:var(--sup3);border:2px dashed var(--acento);border-radius:var(--r)}
.elegido{box-shadow:0 12px 32px rgba(0,0,0,.55);transform:scale(1.02)}
.col-lista.vacia::after{
  content:"Sin pedidos";display:grid;place-items:center;height:96px;color:var(--tenue2);font-size:var(--t-chico);
  border:2px dashed var(--borde);border-radius:var(--r);
}

/* ───────── Avisos flotantes ───────── */
/* Flota por encima de todo: le toca sombra, y por eso NO lleva borde. Un
   borde de 1px debajo de una sombra ancha deja el aviso apoyado y flotando a
   la vez. La sombra alta es la que lo despega de verdad sobre fondo negro. */
.brindis{position:fixed;left:50%;bottom:24px;transform:translateX(-50%) translateY(140%);
  background:var(--sup3);color:var(--texto);padding:14px 20px;
  border-radius:var(--r-tarjeta);font-weight:700;box-shadow:var(--sombra-alta);z-index:200;
  max-width:min(92vw,460px);
  /* Sin rebote. Un aviso que dice "entró un pedido" en una cocina no es un
     juguete, y el sobrepaso de un elástico se lee como algo mal calibrado.
     La misma curva fuerte de salida que usa el resto de la app. */
  transition:transform .28s var(--ease-salida);text-align:center}
.brindis.ver{transform:translateX(-50%) translateY(0)}
.brindis.malo{background:#3B1114;color:var(--tx-mal)}
.brindis.bien{background:#0B2E1A;color:var(--tx-ok)}

/* ───────── Modal ───────── */
/* La apertura del diálogo: el fondo se funde a oscuro y la hoja sube.
   Transiciones (no keyframes): abrir-cerrar-abrir seguido siempre parte de
   donde va. El velo vive en el DOM con visibility — display:none no anima. */
.velo{position:fixed;inset:0;background:rgba(4,4,6,.78);
  backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);z-index:150;
  display:flex;align-items:flex-end;justify-content:center;
  opacity:0;visibility:hidden;pointer-events:none;
  transition:opacity .26s var(--ease-salida), visibility 0s linear .26s;
}
.velo.ver{opacity:1;visibility:visible;pointer-events:auto;transition-delay:0s}
.velo .modal{
  transform:translateY(34px) scale(.97);opacity:0;
  transition:transform .32s var(--ease-salida), opacity .26s var(--ease-salida);
}
.velo.ver .modal{transform:none;opacity:1}
.modal{background:var(--sup);border:1px solid var(--borde);border-radius:var(--r-hoja) var(--r-hoja) 0 0;width:min(560px,100%);
  max-height:92dvh;overflow-y:auto;padding:20px;
  /* Solo scroll vertical: cualquier hijo que se pase de ancho (una palabra
     larga, una imagen, un flex sin min-width) creaba una barra horizontal
     dentro de la ventana, y una ventana que se mueve para los lados se siente
     rota. Lo que no quepa, se envuelve o se recorta. */
  overflow-x:hidden;overflow-wrap:break-word;
}
/* En pantalla grande la ventana se CENTRA (en celular sube desde abajo, que
   es donde está el pulgar). El "}" de más que había arriba rompía el parser y
   se comía justo esta regla: el diálogo quedaba pegado al fondo en escritorio. */
@media (min-width:640px){
  .velo{align-items:center;padding:24px}
  .modal{border-radius:var(--r-hoja);max-height:min(88dvh,760px)}
}
.modal h3{font-size:var(--t-titulo);margin-bottom:4px;letter-spacing:-.02em}

/* ───────── Responsivo ───────── */
/* ── El tablero en celular: TRES PÁGINAS QUE SE DESLIZAN ──
   Apiladas en vertical había que hacer scroll infinito para llegar a "Listo".
   Ahora Nuevo / En preparación / Listo son páginas lado a lado: se pasa con el
   pulgar como entre pantallas de una app, y cada columna conserva su propio
   scroll vertical. El 88% de ancho deja asomar la siguiente columna — es la
   señal silenciosa de que hay más a la derecha. */
@media (max-width:860px){
  .tablero{
    display:flex;gap:10px;padding:0 10px 90px;
    overflow-x:auto;scroll-snap-type:x mandatory;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
  }
  .tablero::-webkit-scrollbar{display:none}
  .tablero .columna{
    flex:0 0 88%;scroll-snap-align:center;
    max-height:calc(100dvh - 210px);
  }
  .col-lista{max-height:calc(100dvh - 270px)}
}
@media (prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important}
}

/* =========================================================================
   EL INTERRUPTOR — encender y apagar el restaurante.
   Se acciona una o dos veces por turno, así que es el único sitio de la app
   donde un momento teatral está justificado: el resto (dar LISTO, mover una
   comanda) pasa cientos de veces al día y solo lleva respuesta instantánea.
   Lo que comunica es ESTADO: desde la puerta de la cocina, a tres metros, hay
   que saber si se están recibiendo pedidos.
   ========================================================================= */

:root{
  --ease-salida:cubic-bezier(0.23, 1, 0.32, 1);
  --ease-vaiven:cubic-bezier(0.77, 0, 0.175, 1);
  --gris-muerto:#4A4A54;
}

/* --- Encendido y apagado, ELEMENTO POR ELEMENTO ---
   Cada elemento se enciende CUANDO LE LLEGA la energía, no todos a la vez.

   El escalonado lo hace el CSS, no temporizadores de JavaScript: cada elemento
   lleva su propio --retraso inline y el body cambia UNA sola clase. Así el
   navegador reparte las transiciones fuera del hilo principal. Con setTimeout
   no funcionaba de verdad: basta que la pestaña pase a segundo plano —o que el
   hilo se ocupe un instante— para que Chrome agrupe todos los temporizadores y
   la pantalla se encienda de golpe.

   Las dos paletas viven una sola vez, en --c-* (viva) y --o-* (apagada). --luz
   vale 1 o 0 y multiplica la opacidad de los brillos, para no repetir cada regla
   de neón dos veces. */
:root{
  --c-acento:#FF7A45; --c-nuevo:#3B82F6; --c-prep:#F59E0B; --c-listo:#22C55E;
  --c-texto:#F5F5F7;  --c-tenue:#9A9AA4;
  --o-acento:#6E6E78; --o-nuevo:#5A5A64; --o-prep:#6B6459; --o-listo:#586258;
  --o-texto:#C8C8CE;  --o-tenue:#7E7E88;
  --luz:1;
}
body.apagado{
  --acento:var(--o-acento); --nuevo:var(--o-nuevo); --prep:var(--o-prep);
  --listo:var(--o-listo);   --texto:var(--o-texto); --tenue:var(--o-tenue);
  --luz:0;
}

/* Se nombran las propiedades — nada de transition:all. El retraso es el de cada
   elemento; sin --retraso definido vale 0 y el cambio es inmediato. */
.comanda,.kpi,.col-cabeza,.columna,.etq,.cm-turno,.cm-reloj,.it-cant,.navlink,.encender,
.marca,.marca .punto,.col-cabeza .bolita,.encender .luz,.btn{
  transition:background-color .4s var(--ease-salida) var(--retraso,0ms),
             border-color .4s var(--ease-salida) var(--retraso,0ms),
             color .4s var(--ease-salida) var(--retraso,0ms),
             box-shadow .4s var(--ease-salida) var(--retraso,0ms),
             text-shadow .4s var(--ease-salida) var(--retraso,0ms),
             filter .4s var(--ease-salida) var(--retraso,0ms);
}
.btn{transition:transform .14s var(--ease-salida),
                background-color .4s var(--ease-salida) var(--retraso,0ms),
                color .4s var(--ease-salida) var(--retraso,0ms),
                box-shadow .4s var(--ease-salida) var(--retraso,0ms),
                filter .4s var(--ease-salida) var(--retraso,0ms)}
/* Apagado NO es deshabilitado: si cerraron con pedidos en curso, la cocina
   tiene que poder seguir sacándolos. Se ven apagados, funcionan igual. */
.btn-listo,.btn-pri{filter:saturate(calc(.15 + .85 * var(--luz)))}
.cm-reloj{filter:saturate(calc(.2 + .8 * var(--luz)))}  /* apagado: el anillo se desatura con el resto */

/* --- El botón ---
   VERDE en reposo: es la única acción pendiente en toda la pantalla, y el verde
   dice "presióname". ROJO cuando está en marcha: es la señal de que hay algo
   corriendo y de que tocarlo lo detiene. El paso de un color al otro se anima,
   porque es el momento en el que el usuario está mirando el botón. */
.interruptor{
  position:fixed;right:20px;bottom:20px;z-index:120;
  width:132px;height:150px;border:0;background:0;padding:0;cursor:pointer;
  display:grid;place-items:center;
  -webkit-tap-highlight-color:transparent;touch-action:manipulation;
}
.itr-cuerpo{position:relative;width:124px;height:124px;display:grid;place-items:center}

/* Base metálica: el cónico da el cepillado sin una sola imagen */
.itr-base{
  position:absolute;inset:0;border-radius:50%;
  background:#8A8A92;
  background:conic-gradient(from 210deg,#6E6E78,#D8D8E0 12%,#9A9AA6 26%,#5C5C66 42%,
                            #C6C6D0 58%,#7E7E8A 74%,#E2E2EA 88%,#6E6E78);
  box-shadow:0 10px 22px rgba(0,0,0,.6), 0 2px 0 rgba(255,255,255,.14) inset,
             0 -10px 18px rgba(0,0,0,.5) inset;
  transition:box-shadow .3s var(--ease-salida);
}
.itr-base::after{ /* hueco interior donde se hunde la cúpula */
  content:"";position:absolute;inset:11px;border-radius:50%;
  background:radial-gradient(circle at 50% 30%,#2A2A31,#101014);
  box-shadow:0 6px 12px rgba(0,0,0,.75) inset;
}

/* La cúpula vive en ROJO y lleva encima una capa VERDE que se desvanece al
   encender. Se hace con dos capas y no cambiando el degradado: un degradado no
   interpola de forma fiable entre navegadores y se vería un salto justo en el
   momento que más se está mirando. */
.itr-domo{
  position:relative;width:96px;height:96px;border-radius:50%;
  background:radial-gradient(circle at 34% 26%,#FF7A6E 0%,#F0392B 34%,#B81609 68%,#6E0A04 100%);
  transform:translateY(-3px);
  transition:transform .16s var(--ease-salida), box-shadow .55s var(--ease-salida);
}
.itr-domo::before{
  content:"";position:absolute;inset:0;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle at 34% 26%,#8CF5B4 0%,#25C167 34%,#0D8C43 68%,#04461F 100%);
  opacity:0;transition:opacity .55s var(--ease-salida);
}
/* Los signos van grabados en la cúpula: blanco translúcido con una sombra
   oscura debajo, que es lo que hace que se vean hundidos en el plástico y no
   pegados encima. */
.itr-signo{
  position:absolute;left:50%;top:50%;width:46%;height:46%;
  transform:translate(-50%,-50%);z-index:1;pointer-events:none;
  fill:none;stroke:rgba(255,255,255,.9);stroke-width:2.1;
  stroke-linecap:round;stroke-linejoin:round;
  filter:drop-shadow(0 1.5px 1px rgba(0,0,0,.45));
  transition:opacity .55s var(--ease-salida);
}
.itr-signo-on{opacity:0}
.interruptor[data-on="1"] .itr-signo-off{opacity:0}
.interruptor[data-on="1"] .itr-signo-on{opacity:1}

.itr-brillo{ /* reflejo especular: es lo que lo vuelve un objeto y no un círculo */
  position:absolute;left:16%;top:9%;width:52%;height:34%;border-radius:50%;z-index:2;
  background:linear-gradient(160deg,rgba(255,255,255,.92),rgba(255,255,255,.06));
  filter:blur(1px);pointer-events:none;
}
.itr-anillo{
  position:absolute;inset:6px;border-radius:50%;pointer-events:none;
  box-shadow:0 0 0 2px rgba(255,255,255,.05) inset;
  transition:box-shadow .55s var(--ease-salida), color .55s var(--ease-salida);
}
.itr-halo{
  position:absolute;inset:-14px;border-radius:50%;pointer-events:none;
  background:radial-gradient(circle,rgba(255,70,45,.45),transparent 68%);
  opacity:0;transition:opacity .5s var(--ease-salida);
}
.itr-eti{
  margin-top:6px;font-size:var(--t-micro);font-weight:800;letter-spacing:.14em;
  text-transform:uppercase;transition:color .45s var(--ease-salida);
}

/* APAGADO — verde, respirando lento. 3,5 s se lee como "en espera"; más rápido
   se leería como alarma, y un botón que vibra sin parar parece un defecto. */
.interruptor[data-on="0"] .itr-domo::before{opacity:1}
.interruptor[data-on="0"] .itr-domo{
  box-shadow:0 8px 14px rgba(0,0,0,.55), 0 -6px 12px rgba(0,0,0,.35) inset,
             0 4px 10px rgba(150,255,190,.35) inset, 0 0 24px rgba(34,197,94,.45);
  animation:itr-espera 3.5s ease-in-out infinite;
}
@keyframes itr-espera{
  50%{box-shadow:0 8px 14px rgba(0,0,0,.55), 0 -6px 12px rgba(0,0,0,.35) inset,
                 0 4px 10px rgba(150,255,190,.35) inset, 0 0 40px rgba(34,197,94,.8)}
}
.interruptor[data-on="0"] .itr-eti{color:#7DE0A4}
.interruptor[data-on="0"] .itr-anillo{
  color:#22C55E;
  box-shadow:0 0 0 2px rgba(34,197,94,.5) inset, 0 0 12px rgba(34,197,94,.3) inset;
}

/* ENCENDIDO — rojo, con halo que respira */
.interruptor[data-on="1"] .itr-domo{
  box-shadow:0 8px 14px rgba(0,0,0,.55), 0 -6px 12px rgba(0,0,0,.3) inset,
             0 4px 10px rgba(255,160,140,.45) inset, 0 0 28px rgba(255,60,40,.55);
}
.interruptor[data-on="1"] .itr-halo{opacity:1;animation:itr-respira 2.6s ease-in-out infinite}
.interruptor[data-on="1"] .itr-eti{color:#FF8A72}
.interruptor[data-on="1"] .itr-anillo{
  color:#FF5A42;
  box-shadow:0 0 0 2px rgba(255,90,66,.75) inset, 0 0 14px rgba(255,90,66,.5) inset,
             0 0 18px rgba(255,70,45,.4);
}
@keyframes itr-respira{50%{opacity:.42;transform:scale(1.06)}}

/* El instante del cambio: el anillo suelta un pulso hacia afuera */
.interruptor.cambiando .itr-anillo::after{
  content:"";position:absolute;inset:-6px;border-radius:50%;
  border:2px solid currentColor;
  animation:itr-pulso 620ms var(--ease-salida) forwards;
}
@keyframes itr-pulso{
  from{transform:scale(.9);opacity:.85}
  to{transform:scale(1.7);opacity:0}
}

/* Pulsar: la cúpula se hunde en su hueco. 120ms — es respuesta, no espectáculo. */
.interruptor:active .itr-domo{transform:translateY(4px) scale(.985)}
.interruptor:active .itr-base{box-shadow:0 5px 12px rgba(0,0,0,.6), 0 2px 0 rgba(255,255,255,.1) inset}
.interruptor:disabled{cursor:wait}
@media (hover:hover) and (pointer:fine){
  .interruptor:hover .itr-domo{transform:translateY(-5px)}
}
.interruptor.negado{animation:itr-niega .4s var(--ease-vaiven)}
@keyframes itr-niega{
  20%{transform:translateX(-7px)} 45%{transform:translateX(6px)}
  70%{transform:translateX(-3px)} 100%{transform:translateX(0)}
}

/* --- El recorrido de la corriente ---
   La corriente viaja por el BORDE de cada elemento: ahí es donde hay conductor.
   No hay trazas cruzando el fondo negro ni puntos sueltos flotando. */
#circuitos{position:fixed;inset:0;z-index:110;pointer-events:none;opacity:0}
#circuitos.corre{opacity:1}
#circuitos path{
  fill:none;stroke-width:2.5;stroke-linecap:round;
  filter:drop-shadow(0 0 5px currentColor);
  opacity:0;
}
#circuitos path{color:inherit}
/* linear: es corriente recorriendo un borde, y no acelera al doblar la esquina.
   La duración la pone el JS según el perímetro de cada elemento, para que el
   pulso viaje siempre a la misma velocidad. */
#circuitos.corre path{animation-timing-function:linear;animation-fill-mode:backwards}
#circuitos.enciende path{animation-name:recorre}
#circuitos.apaga path{animation-name:recorre;animation-direction:reverse}
@keyframes recorre{
  from{stroke-dashoffset:var(--per);opacity:0}
  8%{opacity:1}
  88%{opacity:1}
  to{stroke-dashoffset:calc(var(--pulso) * -1);opacity:0}
}
/* El cable que sale del botón: más grueso, es la alimentación */
#circuitos .guia{stroke-width:3.5;filter:drop-shadow(0 0 9px currentColor)}
/* Los saltos entre elementos pegados: la soldadura de una tarjeta a la siguiente */
#circuitos .salto{stroke-width:3;animation:chispea 260ms linear backwards}
@keyframes chispea{
  from{opacity:0} 40%{opacity:1} to{opacity:0}
}

/* El chispazo del elemento cuando la corriente termina de recorrerlo.
   Va en un pseudo-elemento aparte para no pelearse con el brillo de neón del
   propio elemento: si los dos escribieran box-shadow, al terminar la animación
   el brillo daría un salto. Y en SU color, no en verde. */
.comanda,.kpi,.col-cabeza,.encender,.marca,.navlink{position:relative}
.energizado::after{
  content:"";position:absolute;inset:-2px;border-radius:inherit;pointer-events:none;
  box-shadow:0 0 26px 2px var(--chispa,#34D399), 0 0 58px -10px var(--chispa,#34D399);
  animation:chispazo 620ms var(--ease-salida) var(--retraso,0ms) backwards;
}
@keyframes chispazo{
  from{opacity:0} 26%{opacity:1} to{opacity:0}
}

/* --- Neón ---
   Cada elemento alumbra en SU color de estado, no todos en verde: así el brillo,
   además de bonito, sigue diciendo en qué va cada comanda. La intensidad se
   multiplica por --luz, que vale 1 o 0 según si a ESE elemento ya le llegó la
   corriente. Los radios de desenfoque se mantienen chicos porque esto vive en
   una lista que hace scroll. */
.col-nuevo .bolita{box-shadow:0 0 10px 1px rgb(59 130 246 / var(--luz)),0 0 22px rgb(59 130 246 / calc(.5 * var(--luz)))}
.col-preparando .bolita{box-shadow:0 0 10px 1px rgb(245 158 11 / var(--luz)),0 0 22px rgb(245 158 11 / calc(.5 * var(--luz)))}
.col-listo .bolita{box-shadow:0 0 10px 1px rgb(34 197 94 / var(--luz)),0 0 22px rgb(34 197 94 / calc(.5 * var(--luz)))}
.comanda{box-shadow:-3px 0 12px -2px rgb(59 130 246 / calc(.55 * var(--luz)))}
.comanda.e-preparando{box-shadow:-3px 0 12px -2px rgb(245 158 11 / calc(.55 * var(--luz)))}
.comanda.e-listo{box-shadow:-3px 0 12px -2px rgb(34 197 94 / calc(.55 * var(--luz)))}
.cm-turno{text-shadow:0 0 14px rgb(255 255 255 / calc(.45 * var(--luz)))}
.kpi b{text-shadow:0 0 16px rgb(255 122 69 / calc(.55 * var(--luz)))}
.btn-listo{box-shadow:0 0 16px rgb(34 197 94 / calc(.5 * var(--luz)))}
.cm-alergia{box-shadow:0 0 14px rgb(239 68 68 / calc(.4 * var(--luz)))}
.encender .luz{box-shadow:0 0 0 4px rgb(34 197 94 / calc(.18 * var(--luz))),0 0 24px rgb(34 197 94 / calc(.5 * var(--luz)))}
.marca .punto{box-shadow:0 0 10px rgb(255 122 69 / calc(.8 * var(--luz)))}

/* Deja el tablero respirar: sin esto la última comanda queda bajo el botón */
.tablero .columna:last-child .col-lista{padding-bottom:150px}

@media (max-width:520px){
  .interruptor{width:112px;height:128px;right:14px;bottom:14px}
  .itr-cuerpo{width:104px;height:104px}
  .itr-domo{width:80px;height:80px}
}

/* Movimiento reducido: se conserva la INFORMACIÓN —el cambio de color, el
   verde/rojo, el estado— y se quita el desplazamiento. Sin animaciones no es lo
   mismo que sin aviso: quien pidió menos movimiento igual necesita saber si la
   cocina está encendida. */
@media (prefers-reduced-motion:reduce){
  .interruptor[data-on="0"] .itr-domo{animation:none}
  .interruptor[data-on="1"] .itr-halo{animation:none}
  .interruptor.cambiando .itr-anillo::after{animation:none;opacity:0}
  .interruptor.negado{animation:none;outline:2px solid var(--malo)}
  #circuitos.corre path{animation:none;opacity:0}
  #circuitos{transition:opacity .2s ease}
  .energizado::after{animation:none;opacity:0}
}


/* ───────── Selector de plantillas (Ajustes) ─────────
   Cada opción muestra una miniatura con los colores y la forma REALES de la
   plantilla. Elegir "Trattoria" de una lista de nombres es adivinar; verla es
   decidir. */
.plantillas{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px}
.pl-opcion{
  display:block;cursor:pointer;padding:10px;border-radius:var(--r-tarjeta);
  border:2px solid var(--borde);background:var(--sup2);
  transition:border-color .15s ease,transform .08s var(--ease-salida);
}
.pl-opcion:active{transform:scale(.985)}
.pl-opcion.on{border-color:var(--acento)}
.pl-opcion input{position:absolute;opacity:0;pointer-events:none}
.pl-opcion b{display:block;font-size:var(--t-ui);margin-top:9px}
.pl-para{display:block;font-size:var(--t-micro);color:var(--tenue2);line-height:1.35;margin-top:2px}
.pl-muestra{
  display:block;position:relative;height:104px;border-radius:var(--r-chico);overflow:hidden;
  border:1px solid;padding:8px;
}
.pl-barra{display:block;height:5px;width:44%;border-radius:999px;margin-bottom:8px}
.pl-card{display:block;border:1px solid;padding:8px;height:70px}
.pl-linea{display:block;height:5px;width:70%;border-radius:999px;opacity:.85}
.pl-linea.corta{width:46%;margin-top:5px;opacity:.6}
.pl-precio{display:block;font-size:var(--t-micro);font-weight:800;margin-top:9px}

/* Sellos de cliente en la comanda: de un vistazo, si es la primera vez o si es
   de la casa. Los colores no compiten con los del estado del pedido. */
.etq-nuevo{background:rgba(56,189,248,.16);color:var(--tx-cielo)}
.etq-vuelve{background:rgba(167,139,250,.16);color:var(--tx-morado)}
.etq-fiel{background:rgba(52,211,153,.16);color:var(--tx-esm)}
.etq-oro{background:linear-gradient(135deg,rgba(250,204,21,.22),rgba(217,119,6,.22));color:var(--tx-oro);
  box-shadow:inset 0 0 0 1px rgba(250,204,21,.35)}

/* ═══════════ DISPOSICIÓN DEL PANEL ═══════════
   Las pantallas de administración estaban en una sola columna angosta: en un
   computador quedaba media pantalla vacía y todo obligaba a bajar. Estos
   contenedores reparten en columnas según el ancho REAL del dispositivo.

   Tres cortes, pensados en aparatos y no en números redondos:
     · hasta 700px  — celular: una columna, siempre.
     · 700–999px    — iPad de pie (768) y portátiles chicos: dos columnas en listas.
     · desde 1000px — iPad acostado (1024) y escritorio: dos columnas en todo.
     · desde 1500px — pantallas grandes: tres columnas donde tiene sentido.
*/
.ancho{max-width:1280px;margin:0 auto;padding:18px 16px 48px}
.ancho-medio{max-width:960px;margin:0 auto;padding:18px 16px 48px}
.ancho-angosto{max-width:720px;margin:0 auto;padding:18px 16px 48px}

.cols{display:grid;gap:14px;align-items:start}
@media (min-width:700px){ .cols-2{grid-template-columns:repeat(2,1fr)} }
/* 1000 y no 1100: un iPad acostado mide EXACTAMENTE 1024px. Con el corte en
   1100 se quedaba en una sola columna, que es justo lo que había que evitar. */
@media (min-width:1000px){
  .cols-2-tarde{grid-template-columns:repeat(2,1fr)}
  .cols-3{grid-template-columns:repeat(3,1fr)}
}
@media (min-width:1400px){ .cols-3-ancho{grid-template-columns:repeat(3,1fr)} }

/* Mampostería para bloques independientes de alto distinto (Ajustes).
   break-inside:avoid es imprescindible: sin él un formulario se parte por la
   mitad entre dos columnas y queda ilegible. */
/* ── Menú en escritorio: herramientas fijas a la izquierda, la carta a la derecha ── */
@media (min-width:1100px){
  .mn-cuerpo{display:grid;grid-template-columns:320px minmax(0,1fr);gap:26px;align-items:start}
  .mn-lado{position:sticky;top:18px;display:flex;flex-direction:column;gap:14px}
  .mn-lado .menu-barra{
    flex-direction:column;align-items:stretch;margin-bottom:0;
    padding:16px;border:1px solid var(--borde);border-radius:14px;background:var(--sup);
  }
  .mn-lado .menu-barra .btn{width:100%}
  .mn-lado .menu-cuenta{text-align:center;margin:4px 0 0}
  .mn-lado details.tarjeta{margin-bottom:0}
}

.mamposteria{columns:1;column-gap:16px}
.mamposteria > *{break-inside:avoid;-webkit-column-break-inside:avoid;
  page-break-inside:avoid;margin-bottom:16px;display:block;width:100%}
@media (min-width:1000px){ .mamposteria{columns:2} }   /* iPad acostado = 1024 */
@media (min-width:1100px) and (max-width:1499px){ .mamposteria{columns:1} } /* al lado del riel */
@media (min-width:1500px){ .mamposteria{columns:2} }

/* Las tarjetas de una rejilla entran escalonadas: 45 ms entre una y otra —
   el ojo recorre la pantalla en el orden en que se pinta. Solo las primeras
   ocho: de ahí en adelante ya nadie está mirando la entrada. */
.cols > .tarjeta{animation:lanza-entra .32s var(--ease-salida) backwards}
.cols > .tarjeta:nth-child(2){animation-delay:45ms}
.cols > .tarjeta:nth-child(3){animation-delay:90ms}
.cols > .tarjeta:nth-child(4){animation-delay:135ms}
.cols > .tarjeta:nth-child(5){animation-delay:180ms}
.cols > .tarjeta:nth-child(6){animation-delay:225ms}
.cols > .tarjeta:nth-child(7){animation-delay:270ms}
.cols > .tarjeta:nth-child(8){animation-delay:315ms}
@media (prefers-reduced-motion:reduce){ .cols > .tarjeta{animation:none} }

/* Un bloque que debe ocupar todo el ancho aunque esté en una rejilla */
.completo{grid-column:1 / -1}

/* En pantallas anchas los formularios de una tarjeta también se reparten */
@media (min-width:700px){
  .campos-2{display:grid;grid-template-columns:repeat(2,1fr);gap:0 14px}
  .campos-2 .completo{grid-column:1 / -1}
}

/* ───────── Horario semanal ─────────
   Cada franja es un bloque indivisible: al angostarse la columna, la segunda
   baja entera en vez de partirse en campos sueltos que no se sabe a qué hora
   pertenecen. */
.fila-dia{display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;
  padding:11px 0;border-top:1px solid var(--borde)}
.dia-nombre{display:flex;gap:9px;align-items:center;min-width:112px;cursor:pointer;padding-top:8px}
.dia-nombre input{width:21px;height:21px;accent-color:var(--acento);flex:none}
.dia-nombre b{font-size:var(--t-ui)}
.franjas{display:flex;gap:8px;flex-wrap:wrap;flex:1;min-width:0}
.franja{display:flex;gap:7px;align-items:center;flex:none}
.franja span{color:var(--tenue2);font-size:var(--t-chico)}
.franja input[type=time]{
  min-height:42px;padding:6px 9px;background:var(--sup2);
  border:1px solid var(--borde);border-radius:var(--r-chico);color:var(--texto);
}
.franja input[type=time]:focus{border-color:var(--acento)}
/* La segunda franja se ve más tenue mientras esté vacía: comunica que es opcional */
.franja:last-child input[type=time]:placeholder-shown,
.franja:last-child input[type=time]:not(:focus):invalid{opacity:.55}

/* ═══════════ PANTALLA DE INICIO ═══════════
   Tarjetas grandes, una por cosa que la persona puede hacer. Cada una trae un
   dato vivo: un menú de opciones sin información obliga a entrar a cada sitio
   para saber si hay algo pendiente. */
.inicio{min-height:calc(100dvh - 118px);display:grid;place-items:center;padding:32px 18px 60px}
.inicio-caja{width:100%;max-width:940px;text-align:center}
.inicio h1{font-size:clamp(25px,4.4vw,34px);font-weight:800;letter-spacing:-.03em;margin-bottom:7px}
.inicio-sub{color:var(--tenue);font-size:var(--t-base);margin-bottom:34px}

.lanzador{display:grid;gap:14px;grid-template-columns:1fr}
@media (min-width:560px){ .lanzador{grid-template-columns:repeat(2,1fr)} }
@media (min-width:1000px){ .lanzador{grid-template-columns:repeat(3,1fr)} }
@media (min-width:1400px){ .lanzador{grid-template-columns:repeat(4,1fr)} }

.lanza{
  display:flex;flex-direction:column;align-items:center;gap:5px;
  padding:26px 18px 22px;border-radius:var(--r-tarjeta);
  background:var(--sup);border:1px solid var(--borde);color:var(--texto);
  min-height:158px;justify-content:center;text-align:center;
  transition:transform .09s var(--ease-salida),border-color .18s ease,background-color .18s ease;
}
.lanza:active{transform:scale(.98)}
@media (hover:hover) and (pointer:fine){
  .lanza:hover{border-color:var(--borde2);background:var(--sup2)}
}
.lanza-ico{
  width:52px;height:52px;border-radius:var(--r-tarjeta);display:grid;place-items:center;margin-bottom:9px;
  background:var(--sup2);color:var(--tenue);
  transition:background-color .18s ease,color .18s ease;
}
.lanza-ico svg{width:26px;height:26px}
.lanza b{font-size:var(--t-base);font-weight:700;letter-spacing:-.01em}
.lanza-det{font-size:var(--t-chico);color:var(--tenue);line-height:1.4;max-width:22ch}

/* La destacada es la que tiene algo pendiente AHORA: pedidos esperando,
   comprobantes por revisar, la carta sin productos. No es una decoración fija,
   cambia según lo que esté pasando. */
.lanza.destaca{
  background:linear-gradient(160deg,var(--acento),var(--acento-osc,var(--acento)));
  border-color:transparent;color:#1A0B04;
}
.lanza.destaca .lanza-ico{background:rgba(0,0,0,.14);color:inherit}
.lanza.destaca .lanza-det{color:rgba(26,11,4,.72)}
body.apagado .lanza.destaca{filter:saturate(.25)}

/* ═══════════ LA CARTA (administración) ═══════════
   Antes eran dos formularios distintos peleando por el mismo renglón: al
   angostarse la columna los botones se montaban uno encima del otro. Ahora es
   un solo formulario y cada zona tiene su sitio reservado. */
.menu-barra{display:flex;gap:10px;align-items:center;flex-wrap:wrap;margin-bottom:20px}
.menu-cuenta{color:var(--tenue);font-size:var(--t-chico);margin-left:auto}

.cat{padding:0;overflow:hidden}
.cat-cabeza{
  display:flex;gap:12px;align-items:flex-start;flex-wrap:wrap;
  padding:15px 16px;border-bottom:1px solid var(--borde);background:var(--sup2);
}
.cat-titulo{flex:1;min-width:150px}
.cat-nombre{
  width:100%;background:transparent;border:0;padding:2px 0;
  font-size:var(--t-medio);font-weight:700;letter-spacing:-.015em;color:var(--texto);
  border-bottom:1px solid transparent;transition:border-color .15s ease;
}
@media (hover:hover){ .cat-nombre:hover{border-bottom-color:var(--borde2)} }
.cat-nombre:focus{border-bottom-color:var(--acento)}
/* Con el mouse basta el subrayado; con el teclado hace falta el anillo, porque
   un subrayado naranja sobre un campo transparente no dice "estoy aquí". */
.cat-nombre:focus:not(:focus-visible){outline:0}
.cat-meta{display:block;font-size:var(--t-mini);color:var(--tenue);margin-top:3px}
/* Ancho reservado: los dos botones caben siempre, y si no, bajan JUNTOS a la
   línea de abajo en vez de encimarse. */
.cat-acciones{display:flex;gap:7px;flex:none}
.cat-btn{min-height:38px;padding:0 13px;font-size:var(--t-chico)}
.cat-vacia{padding:16px;color:var(--tenue);font-size:var(--t-chico);margin:0}

.prod-lista{list-style:none;margin:0;padding:0}
.prod-fila{
  display:flex;gap:12px;align-items:center;flex-wrap:wrap;
  padding:11px 16px;border-top:1px solid var(--borde);
}
.prod-fila:first-child{border-top:0}
.prod-mini{
  width:46px;height:46px;border-radius:var(--r-chico);object-fit:cover;flex:none;background:var(--sup2);
}
.prod-mini.vacia{display:grid;place-items:center;color:var(--tenue2);
  box-shadow:inset 0 0 0 1px var(--borde)}
.prod-mini.vacia svg{width:22px;height:22px}
.prod-datos{flex:1;min-width:110px}
.prod-datos b{display:block;font-size:var(--t-ui);font-weight:600;line-height:1.3}
.prod-meta{display:block;font-size:var(--t-mini);color:var(--tenue);margin-top:2px}
.prod-acciones{display:flex;gap:7px;flex:none;margin-left:auto}
.prod-btn{min-height:38px;padding:0 12px;font-size:var(--t-chico);white-space:nowrap}

/* Agotado y oculto se ven desde la lista, sin tener que entrar a cada producto */
.prod-fila.agotado .prod-datos b{text-decoration:line-through}
.prod-fila.agotado .prod-mini,.prod-fila.agotado .prod-datos{opacity:.55}
.prod-fila.oculto{opacity:.6}

.cat-nueva{margin-top:6px}

/* En columna angosta las acciones bajan completas debajo del producto */
@media (max-width:460px){
  .prod-acciones{margin-left:0;width:100%;padding-left:58px}
  .cat-acciones{width:100%}
  .cat-btn{flex:1}
}

/* ───────── Editor de producto ─────────
   En una sola columna los campos quedaban de más de mil píxeles de ancho:
   incómodo de leer y de llenar. La foto va al lado de los datos, no al final. */
.prod-editor{display:grid;gap:14px;align-items:start}
@media (min-width:1000px){ .prod-editor{grid-template-columns:1.35fr 1fr} }
.prod-foto-caja{position:sticky;top:78px}
.prod-foto-vista{
  width:100%;aspect-ratio:4/3;object-fit:cover;border-radius:var(--r-tarjeta);
  background:var(--sup2);margin-bottom:12px;display:block;
}
/* El hueco de la foto pendiente. Antes era un emoji al 35% de opacidad; ahora
   es un plato dibujado y una frase que dice qué falta — un hueco que además
   explica es una instrucción, un hueco mudo es solo un hueco. */
.prod-foto-vista.vacia{
  display:grid;place-items:center;gap:var(--e2);align-content:center;
  color:var(--tenue2);border:1px dashed var(--borde2);
  font-size:var(--t-chico);text-align:center;padding:var(--e4);
}
.prod-foto-vista.vacia svg{width:56px;height:56px;opacity:.8}
.prod-foto-caja input[type=file]{
  width:100%;padding:11px;background:var(--sup2);border:1px solid var(--borde);
  border-radius:var(--r);font-size:var(--t-chico);
}
@media (max-width:999px){ .prod-foto-caja{position:static} }

/* Chip de "estás dentro del negocio X". Para la plataforma es imprescindible:
   sin él se confunde el panel de un cliente con el propio. */
.mirando button{
  display:flex;align-items:center;gap:7px;max-width:230px;
  background:rgba(255,122,69,.14);border:1px solid rgba(255,122,69,.42);
  color:var(--acento);border-radius:999px;padding:7px 13px;
  font-size:var(--t-mini);font-weight:700;cursor:pointer;white-space:nowrap;
  overflow:hidden;text-overflow:ellipsis;
}
.mirando button span{color:var(--tenue);font-weight:600}
.mirando button b{font-size:var(--t-ui);line-height:1}
@media (hover:hover){ .mirando button:hover{background:rgba(255,122,69,.22)} }
@media (max-width:760px){ .mirando button{max-width:130px}; .mirando button span{display:none} }


/* ───────── La entrada de la primera pantalla ─────────
   Las tarjetas no aparecen todas de golpe: entran de izquierda a derecha con
   45 ms entre una y la siguiente. Sirve para algo concreto — el ojo recorre el
   menú en el mismo orden en que se dibuja, en vez de tener que barrer una
   cuadrícula ya completa buscando dónde empezar.

   Se permite justamente porque esta pantalla se ve una o dos veces por turno,
   al entrar. Lo que se toca cientos de veces al día —dar LISTO, mover una
   comanda— no lleva ni un milisegundo de animación.

   Animación de CSS y no de JavaScript: corre fuera del hilo principal, así que
   no se entrecorta mientras la página termina de cargar el resto.
   El retraso lo pone el PHP en cada tarjeta con --retraso, el mismo mecanismo
   que usa el encendido de la cocina. */
@keyframes lanza-entra{
  from{opacity:0;transform:translateY(10px) scale(.985)}
  to{opacity:1;transform:none}
}
.lanza{animation:lanza-entra .34s var(--ease-salida) var(--retraso,0ms) backwards}
/* El título entra primero, sin desplazamiento: es el ancla de la pantalla y
   moverlo haría que el texto se leyera dos veces. */
@keyframes lanza-titulo{from{opacity:0}to{opacity:1}}
.inicio h1,.inicio-sub{animation:lanza-titulo .3s var(--ease-salida) backwards}
.inicio-sub{animation-delay:60ms}

/* ═══════════ CANCELACIONES Y DEVOLUCIONES ═══════════
   Una cancelación con plata adentro es una deuda del negocio con una persona.
   Se ve en rojo y arriba de todo, y no se va de la pantalla hasta que alguien
   la salda — a diferencia del resto de la caja, esto no se puede posponer. */
.caja-titulo{
  font-size:var(--t-medio);margin:var(--e6) 0 var(--e3);
  display:flex;align-items:center;gap:var(--e2);color:var(--malo);
}
.caja-cuenta{
  font-size:var(--t-mini);font-weight:800;background:rgba(239,68,68,.16);
  color:var(--tx-mal);border-radius:999px;padding:2px 9px;font-variant-numeric:tabular-nums;
}
/* El borde rojo lo dice sin gritar. Con un fondo rojo entero, la tarjeta
   competiría con el botón de devolver que lleva adentro. */
.tarjeta-alerta{
  border-color:rgba(239,68,68,.42);
  background:linear-gradient(180deg,rgba(239,68,68,.07),transparent 62%),var(--sup);
}
.dev-fila{display:flex;gap:var(--e3);align-items:flex-start;flex-wrap:wrap}
.dev-turno{font-size:var(--t-dato);font-weight:800;min-width:52px;
  font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.dev-quien{flex:1;min-width:140px}
.dev-quien b{display:block;font-size:var(--t-ui)}
.dev-quien span{display:block;font-size:var(--t-chico);color:var(--tenue)}
.dev-motivo{color:var(--tenue2)!important;margin-top:2px}
.dev-plata{font-size:var(--t-titulo);font-weight:800;color:var(--tx-mal);
  font-variant-numeric:tabular-nums;margin-left:auto}
.dev-acciones{display:flex;gap:var(--e2);margin-top:var(--e3);flex-wrap:wrap}
.dev-acciones .btn{flex:1;min-width:132px}

/* La nota de por qué se canceló, debajo del pedido ya cancelado */
.cancel-nota{
  display:flex;gap:var(--e3);align-items:center;flex-wrap:wrap;
  margin-top:var(--e3);padding-top:var(--e3);border-top:1px solid var(--borde);
  font-size:var(--t-chico);color:var(--tenue);
}
.cancel-nota span{flex:1;min-width:120px}

/* Los motivos: casillas grandes, no un desplegable.
   Un desplegable esconde las opciones justo cuando hay que escoger una, y en
   una tablet obliga a dos toques. Aquí se ven las cinco y se toca una. */
.motivos{display:grid;gap:var(--e2)}
.motivo-op{
  display:flex;align-items:center;gap:var(--e3);cursor:pointer;
  padding:var(--e3) var(--e4);border-radius:var(--r);
  background:var(--sup2);border:1px solid var(--borde);
  min-height:52px;
  transition:border-color .16s ease,background-color .16s ease;
}
.motivo-op input{width:21px;height:21px;accent-color:var(--acento);flex:none}
.motivo-op span{font-size:var(--t-ui);font-weight:600}
.motivo-op:has(input:checked){border-color:var(--acento);background:rgba(255,122,69,.1)}
@media (hover:hover){ .motivo-op:hover{border-color:var(--borde2)} }

/* ═══════════ EL INTERRUPTOR SE APARTA CUANDO YA CUMPLIÓ ═══════════
   Medido en pantalla: apagado o encendido, el botón ocupa 132×150 px fijos en
   la esquina y TAPABA el botón de WhatsApp de la primera comanda de "Listo",
   más dos comandas enteras. Avisarle al cliente que su pedido está listo es la
   razón de ser de esta aplicación; tener eso debajo de un botón es inaceptable.

   El arreglo no es encoger el botón siempre —el usuario lo pidió grande y con
   razón—, es que su tamaño siga a su importancia:

   · APAGADO  → es lo ÚNICO que importa en la pantalla. No hay pedidos que ver
     ni nada que tapar, porque no se está recibiendo nada. Tamaño completo.
   · ENCENDIDO → ya cumplió. La pantalla ahora es de las comandas, y él se
     retira a una ficha de 84 px: sigue rojo, sigue vivo, sigue en su esquina y
     sigue siendo un toque. Solo deja de estorbar.

   Al pasar el mouse o al recibir el foco vuelve a su tamaño, para que no haya
   que apuntarle a algo chiquito cuando llega la hora de cerrar.

   Se anima la CAJA y se escala el cuerpo con transform: como es `fixed`, nada
   más en la página se recalcula: el cambio le cuesta al navegador lo que un
   solo elemento, no un reacomodo de la pantalla. */
.interruptor{
  --itr-escala:1;
  /* La CAJA cambia de golpe y no se anima: animar width/height obliga al
     navegador a recalcular la página en cada cuadro. Y no hace falta — el
     <button> es transparente (no pinta fondo ni borde), todo lo que se ve vive
     dentro de .itr-cuerpo. Así que el salto de la caja es invisible y el
     movimiento lo lleva entero el transform, que corre en la tarjeta gráfica. */
}
.itr-cuerpo{
  transform:scale(var(--itr-escala));
  transition:transform .42s var(--ease-salida);
}
.interruptor[data-on="1"]{
  --itr-escala:.62;
  width:84px;height:84px;
}
/* El rótulo se va con la ficha: a ese tamaño no cabría y el aria-label del
   botón sigue diciendo el estado a quien use lector de pantalla. */
.interruptor[data-on="1"] .itr-eti{
  opacity:0;transform:translateY(-6px);pointer-events:none;
  transition:opacity .2s var(--ease-salida),transform .2s var(--ease-salida);
}
/* Vuelve entero cuando se le apunta: con el mouse, con el dedo encima o con el
   teclado. Nunca hay que buscar un blanco pequeño para cerrar la cocina. */
.interruptor[data-on="1"]:hover,
.interruptor[data-on="1"]:focus-visible,
.interruptor[data-on="1"]:active,
.interruptor[data-on="1"].cambiando{
  --itr-escala:1;width:132px;height:150px;
}
.interruptor[data-on="1"]:hover .itr-eti,
.interruptor[data-on="1"]:focus-visible .itr-eti,
.interruptor[data-on="1"].cambiando .itr-eti{opacity:1;transform:none}

/* Y la columna deja libre justo lo que ocupa la ficha, ni un pixel más.
   Antes reservaba 150 px pensando en el botón grande, y aun así no servía:
   el problema no era el final de la lista sino la esquina. */
.tablero .columna:last-child .col-lista{padding-bottom:104px}

@media (max-width:520px){
  .interruptor[data-on="1"]{width:76px;height:76px;--itr-escala:.56}
  .interruptor[data-on="1"]:hover,
  .interruptor[data-on="1"]:focus-visible,
  .interruptor[data-on="1"]:active,
  .interruptor[data-on="1"].cambiando{width:112px;height:128px;--itr-escala:1}
}

/* Con movimiento reducido no se anima el tamaño, pero SÍ se aplica: lo que
   importa —que no tape el botón de avisar— no es una animación. */
@media (prefers-reduced-motion:reduce){
  .interruptor,.itr-cuerpo,.interruptor[data-on="1"] .itr-eti{transition:none}
}

/* ───────── Domicilio en la comanda ─────────
   Sin la dirección a la vista, el domicilio no se puede entregar. Va en la
   tarjeta y con peso propio: mandar a buscarla a otra pantalla es exactamente
   como se pierden los domicilios. */
.etq-domicilio{background:rgba(56,189,248,.18);color:var(--tx-cielo)}
.cm-direccion{
  background:rgba(56,189,248,.1);border:1px solid rgba(56,189,248,.3);
  border-radius:var(--r-chico);padding:9px 11px;margin-bottom:9px;
}
.cmd-eti{
  display:block;font-size:var(--t-micro);font-weight:800;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tx-cielo);margin-bottom:2px;
}
.cm-direccion b{display:block;font-size:var(--t-ui);line-height:1.3;color:var(--texto)}
.cm-direccion span{display:block;font-size:var(--t-chico);color:var(--tenue);margin-top:2px}

/* ═══════════ TEMA CLARO ═══════════
   Para el panel de administración (comandas, caja, menú…), a elección de quien
   lo usa: hay quien trabaja en un local lleno de luz donde una pantalla negra
   espejea, y hay a quien el blanco lo cansa a las diez de la noche. La cookie
   la lee el SERVIDOR y el body ya llega con la clase — sin destello.

   Cada gris de esta paleta está MEDIDO contra la superficie más clara donde
   aparece: texto 13.7:1, tenue 6.1:1, tenue2 4.6:1. Y los textos sobre tinte
   (--tx-*) pasan a sus versiones oscuras: el verde pastel que brilla sobre
   negro es invisible sobre blanco. Todos quedan por encima de 5:1. */
body.tema-claro{
  --fondo:#F2F2F5;
  --sup:#FFFFFF;
  --sup2:#EBEBEF;
  --sup3:#E1E1E7;
  --borde:#DCDCE3;
  --borde2:#C2C2CC;
  --texto:#17171E;
  --tenue:#50505C;
  --tenue2:#63636F;

  --tx-ok:#166534;   --tx-mal:#B91C1C;  --tx-ojo:#854D0E;   --tx-info:#1D4ED8;
  --tx-cielo:#075985;--tx-morado:#6D28D9;--tx-esm:#065F46;  --tx-oro:#92400E;

  /* Sombra de día: una sombra de noche (40% de negro) sobre fondo claro se ve
     como una mancha de grasa. */
  --sombra:0 1px 2px rgba(23,23,30,.06), 0 8px 24px -12px rgba(23,23,30,.16);
  --sombra-alta:0 18px 44px -16px rgba(23,23,30,.28);

  /* La paleta apagada también se aclara, o el modo "cocina apagada" quedaría
     con grises de noche flotando en una pantalla de día. */
  --o-acento:#9A9AA6; --o-nuevo:#8E8E9A; --o-prep:#98917F; --o-listo:#849184;
  --o-texto:#3A3A44;  --o-tenue:#71717E;

  /* El neón de día no existe: la luz ambiente se lo come, y unos brillos de
     colores sobre blanco se ven sucios. Se apagan enteros y el estado lo
     siguen diciendo el filo de color y el anillo del cronómetro. */
  --luz:0;
}
body.tema-claro .modo.on{box-shadow:0 1px 2px rgba(23,23,30,.14)}
body.tema-claro .cm-turno{text-shadow:none}
body.tema-claro .kpi b{text-shadow:none}

/* ═══════════ EL SIDEBAR DE ESCRITORIO ═══════════
   En una pantalla ancha, la barra superior desperdicia lo que sobra (ancho) y
   gasta lo que falta (alto). Desde 1200px la misma cabecera se vuelve columna
   fija a la izquierda: marca arriba, secciones con icono al medio, controles
   abajo — y el interruptor de la cocina deja de flotar sobre las comandas
   porque el fondo del sidebar es SU puesto: ahí no tapa nada ni nadie lo tapa.
   En celular y tablet no cambia nada: la barra de dos filas sigue igual.

   Es el MISMO marcado. El PHP no pinta dos cabeceras; la CSS decide fila o
   columna. Así no hay dos versiones que mantener sincronizadas. */
@media (min-width:1200px){
  :root{ --sb:252px }   /* ancho del sidebar, en un solo sitio */

  .app{flex-direction:row}
  .topbar{
    flex:none;width:var(--sb);height:100dvh;
    flex-direction:column;align-items:stretch;
    padding:22px 14px calc(170px + env(safe-area-inset-bottom));
    border-bottom:0;border-right:1px solid var(--borde);
    background:linear-gradient(200deg,var(--sup),var(--fondo));
    position:sticky;top:0;
  }
  .topbar::after{ /* el filo de luz pasa de horizontal a vertical */
    left:auto;right:-1px;bottom:0;top:0;width:1px;height:auto;
    background:linear-gradient(180deg,transparent,var(--acento),transparent);
  }

  /* La fila superior se apila: marca arriba, controles debajo de la nav */
  .topbar-fila{display:contents}
  .marca{order:1;margin-bottom:26px;padding:0 8px}
  .marca-linea b{font-size:21px;white-space:normal;line-height:1.15}
  /* El logo manda en el sidebar: ocupa el ancho útil de la columna y se
     alinea con el texto de las secciones (mismo padding lateral que .navlink). */
  .marca{padding:0 14px}
  .marca-logo{height:auto;width:100%;max-width:none;max-height:76px;object-fit:contain;object-position:left center}

  .nav{
    order:2;flex-direction:column;gap:4px;overflow:visible;padding:0;flex:1;
    justify-content:flex-start;align-items:stretch;
  }
  .navlink{
    flex-direction:row;align-items:center;gap:12px;min-width:0;
    padding:12px 14px;border-radius:var(--r);
    font-size:var(--t-ui);
  }
  .nav-ico{width:22px;height:22px;opacity:.85}
  .nav-ico svg{width:20px;height:20px}
  /* La sección activa: relleno, no la rayita de la versión horizontal */
  .navlink.on{background:var(--sup3);color:var(--texto)}
  .navlink.on::after{display:none}
  .navlink.on .nav-ico{color:var(--acento);opacity:1}
  @media (hover:hover){ .navlink:not(.on):hover{background:var(--sup2)} }

  /* Los controles dejan de ser una caja: sus piezas entran directo a la
     columna del sidebar para poder repartirse entre arriba y abajo. */
  .topbar-controles{display:contents}
  /* ARRIBA, con el logo: tema y salir, solo los iconos. Abajo del sidebar
     manda el botón de encendido, y dos cosas peleando por ese rincón ya se
     vieron encimadas una vez. */
  .cima{
    order:1;justify-content:flex-end;gap:var(--e2);
    margin:-12px 0 18px;padding:0 10px;
  }
  .cima .tema-eti{display:none}
  .cima .salir-txt{display:none}
  .cima .salir{padding:5px;border-radius:50%}
  /* ABAJO, después de la navegación: el modo de la pantalla y el chip de
     "Viendo X", que son de configurar, no de usar todo el día. */
  .modos,.mirando{order:3}
  .topbar-controles > .modos:first-child,
  .topbar-controles > .mirando:first-child{
    margin-top:14px;padding-top:14px;border-top:1px solid var(--borde);
  }
  .modos{justify-content:stretch}
  .modos .modo{flex:1}
  .mirando{margin-top:10px}
  .mirando button{max-width:none;width:100%;justify-content:center}

  /* EL PUESTO DEL INTERRUPTOR. El hueco de abajo del sidebar (los 170px del
     padding) queda reservado para él: centrado, con aire, sin una sola comanda
     debajo. Como ya no flota sobre contenido, tampoco necesita encogerse. */
  .interruptor{
    right:auto;left:calc((var(--sb) - 132px) / 2);
    bottom:calc(14px + env(safe-area-inset-bottom));
  }
  .interruptor[data-on="1"]{width:132px;height:150px;--itr-escala:1}
  .interruptor[data-on="1"] .itr-eti{opacity:1;transform:none}
  .tablero .columna:last-child .col-lista{padding-bottom:14px}
}

/* ═══ El interruptor de tema: una PIEZA FÍSICA ═══
   Basado en el toggle de jh3y, adaptado a esta app: aquí el tema no lo manda
   el sistema (light-dark()) sino la clase body.tema-claro, así que cada color
   se resuelve a mano. aria-pressed="true" = tema CLARO.
   Toda la pieza escala con su font-size: cambiarlo la agranda entera. */
.tema-sw{
  --paso:.5s;
  --curva:cubic-bezier(.23,1,.32,1);
  --brillo:hsl(182 90% 92%);
  font-size:13px;                 /* la unidad de la pieza */
  height:3em;aspect-ratio:1.8/1;width:auto;
  position:relative;padding:0;border:0;border-radius:3em;
  background:#0000;cursor:pointer;flex:none;
  -webkit-tap-highlight-color:transparent;
}
.tema-sw :is(.sw-zocalo,.sw-cara){position:absolute;border-radius:3em}

/* El zócalo: el hueco donde vive el botón */
.sw-zocalo{
  inset:0;background:#000;
  box-shadow:-.05em .1em .2em -.2em #fff;
  transition:background-color var(--paso) var(--curva),box-shadow var(--paso) var(--curva);
}
body.tema-claro .sw-zocalo{background:hsl(0 0% 90%)}
.sw-zocalo-sombra{
  position:absolute;inset:0;border-radius:inherit;opacity:0;
  box-shadow:0 .075em .1em 0 #fff;
  transition:opacity var(--paso) var(--curva);
}

/* La cara: el botón que sobresale */
.sw-cara{inset:.15em;transition:scale var(--paso) var(--curva);scale:1}
.tema-sw:active .sw-cara{scale:.99}
.tema-sw:active .sw-zocalo{box-shadow:-.045em .1em .2em -.15em #fff}

.sw-sombra,.sw-sombra::after,.sw-sombra::before{position:absolute;inset:0;border-radius:inherit}
.sw-sombra::after,.sw-sombra::before{
  content:"";
  transition:opacity var(--paso) var(--curva),translate var(--paso) var(--curva),
             filter var(--paso) var(--curva),scale var(--paso) var(--curva);
}
.sw-sombra::before{background:#000}
.sw-sombra::after{background:#fff;scale:.5}

.sw-plato{
  position:absolute;inset:0;border-radius:inherit;
  box-shadow:-.05em .1em .2em -.2em #fff inset;
  background:conic-gradient(from 45deg,#0000,hsl(0 0% 100% / .05)),hsl(220 27% 6%);
  transition:background-color var(--paso) var(--curva);
}
body.tema-claro .sw-plato{
  background:conic-gradient(from 45deg,#0000,hsl(0 0% 100% / .05)),hsl(223 4% 73%);
}

/* La gota de luz que aparece al encender */
.sw-gota{position:absolute;inset:0;border-radius:inherit;scale:0;
  transition:scale var(--paso) var(--curva)}
.sw-gota::after,.sw-gota::before{
  content:"";height:50%;aspect-ratio:1;background:#fff;filter:blur(6px);
  position:absolute;z-index:-1;border-radius:50%;
}
.sw-gota::before{left:4%;width:56%;translate:0 -25%}
.sw-gota::after{bottom:0;right:12%;width:34%;translate:0 20%}

/* El filo pulido del botón */
.sw-brillo{position:absolute;inset:0;opacity:0;border-radius:3em;
  transition:opacity var(--paso) var(--curva)}
.sw-brillo-sombra{
  position:absolute;inset:0;border-radius:inherit;
  mask:conic-gradient(from 0deg,#fff 90deg,#0000 110deg 200deg,#fff 215deg 280deg,#0000 315deg);
  box-shadow:.075em 0 .025em -.025em hsl(0 0% 0% / .5) inset,
             -.075em -.05em .025em -.025em hsl(0 0% 0% / .5) inset;
}
.sw-brillo::before{
  content:"";position:absolute;inset:.05em;border-radius:3em;
  box-shadow:0 -.05em .025em -.025em hsl(0 0% 50% / .5) inset,
             -.025em .05em .025em -.025em hsl(0 0% 100% / .5) inset;
}
.sw-brillo::after{
  content:"";position:absolute;inset:0;border-radius:3em;
  background:conic-gradient(from 45deg,#0000,hsl(0 0% 100% / .25));
}
.sw-halos{
  position:absolute;inset:-.075em;opacity:0;border-radius:inherit;
  mix-blend-mode:plus-lighter;filter:blur(8px);z-index:20;
  mask:conic-gradient(from 280deg,#0000,#fff 20deg 45deg,#0000 95deg),
       conic-gradient(from 110deg,#0000,#fff 20deg,#0000 95deg);
  transition:opacity var(--paso) var(--curva);
}
.sw-halos span{position:absolute;inset:0;border-radius:inherit;filter:blur(4px);border:.1em solid #fff}

/* La luna */
.sw-cara svg{
  width:25%;position:absolute;top:50%;left:50%;translate:-52% -48%;
  overflow:visible!important;
}
.sw-cara svg path{transform-box:fill-box;transform-origin:center center}
.sw-borde{stroke:#000;transition:stroke var(--paso) var(--curva)}
.sw-relleno{fill:hsl(230 5% 80%)}
.sw-glow{z-index:3;filter:drop-shadow(0 0 .2em var(--brillo))}
.glow-path{fill:var(--brillo);stroke:var(--brillo);stroke-width:0;opacity:1}
.sw-estela-caja{z-index:2;filter:blur(10px)}
.sw-estela-caja .sw-estela{stroke-width:4}
.sw-estela{stroke:#2CC6FE;stroke-dasharray:10 80;stroke-dashoffset:10;opacity:0}

/* ── Apagado (tema oscuro): la luna ENCENDIDA ── */
.sw-glow{opacity:1;transition:opacity 1.25s linear;transition-delay:calc(var(--paso) * .5)}

/* ── Encendido (tema claro): el botón sube, se ilumina y la luna se apaga ── */
.tema-sw[aria-pressed="true"] .sw-cara{scale:1.12}
.tema-sw[aria-pressed="true"] .sw-borde{stroke:hsl(0 0% 30%)}
.tema-sw[aria-pressed="true"] .sw-zocalo{box-shadow:-.025em .08em .2em -.1em #fff}
.tema-sw[aria-pressed="true"] .sw-gota{scale:1}
.tema-sw[aria-pressed="true"] .sw-sombra::before{translate:-15% 55%;filter:blur(1em);opacity:.35}
.tema-sw[aria-pressed="true"] .sw-sombra::after{filter:blur(.5em);scale:1}
.tema-sw[aria-pressed="true"] :is(.sw-zocalo-sombra,.sw-halos,.sw-brillo){opacity:1}
.tema-sw[aria-pressed="true"] .sw-glow{
  opacity:0;transition-duration:var(--paso);transition-delay:0s;transition-timing-function:var(--curva);
}
/* La estela: el rayo que recorre el contorno al encender */
.tema-sw[aria-pressed="true"] .sw-estela{
  transition:stroke-dashoffset 0s;opacity:1;stroke-dashoffset:-70;
}
.tema-sw .sw-estela{
  transition-property:stroke-dashoffset,opacity;
  transition-duration:calc(var(--paso) * 3),calc(var(--paso) * .5);
  transition-delay:calc(var(--paso) * .5),calc(var(--paso) * 3);
  transition-timing-function:var(--curva),linear;
}

.sr-solo{
  position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip-path:inset(50%);white-space:nowrap;border-width:0;
}

/* La fila del interruptor. En la barra horizontal es solo el envoltorio del
   botón (la etiqueta sobra: no hay espacio ni hace falta). */
.tema-fila{display:flex;align-items:center}
.tema-eti{display:none}

@media (max-width:1199px){ .tema-sw{font-size:11.5px} }
@media (min-width:1200px){
  /* En el sidebar es una fila más, con el mismo ritmo que "Salir": el nombre
     alineado a la izquierda y la pieza a la derecha. */
  .tema-fila{
    justify-content:space-between;gap:10px;
    padding:6px 10px;border-radius:var(--r);
  }
  .tema-eti{
    display:block;font-size:var(--t-ui);font-weight:600;color:var(--tenue);
  }
  .tema-sw{font-size:13.5px}
}
@media (prefers-reduced-motion:reduce){
  .tema-sw *{transition-duration:.01ms!important}
}

/* ───────── Soporte ───────── */
.sop-titulo{font-size:var(--t-medio);margin-bottom:var(--e3)}
.sop-faq{display:flex;flex-direction:column;gap:var(--e2)}
.sop-item{background:var(--sup);border:1px solid var(--borde);border-radius:var(--r);overflow:hidden}
.sop-item summary{
  display:flex;align-items:center;gap:var(--e3);justify-content:space-between;
  padding:14px 16px;cursor:pointer;font-weight:650;font-size:var(--t-ui);
  list-style:none;min-height:var(--toque);
}
.sop-item summary::-webkit-details-marker{display:none}
.sop-flecha{display:grid;place-items:center;width:22px;height:22px;flex:none;color:var(--tenue);
  transition:transform .2s var(--ease-salida)}
.sop-flecha svg{width:14px;height:14px}
.sop-item[open] .sop-flecha{transform:rotate(45deg);color:var(--acento)}
.sop-item p{padding:0 16px 15px;color:var(--tenue);font-size:var(--t-chico);line-height:1.55}
.sop-msj{margin-bottom:var(--e3)}
.sop-cab{display:flex;gap:var(--e3);align-items:center;justify-content:space-between;flex-wrap:wrap;margin-bottom:var(--e2)}
.sop-txt{color:var(--tenue);font-size:var(--t-ui);line-height:1.5}
.sop-fecha{display:block;font-size:var(--t-mini);color:var(--tenue2);margin-top:var(--e2)}
.sop-resp{
  margin-top:var(--e3);padding:var(--e3) var(--e4);border-radius:var(--r-chico);
  background:rgba(255,122,69,.08);
}
.sop-resp-de{display:block;font-size:var(--t-micro);font-weight:800;letter-spacing:.08em;
  text-transform:uppercase;color:var(--acento);margin-bottom:4px}
.sop-resp p{font-size:var(--t-ui);line-height:1.5}

/* ═══════════ REPARTOS: la pantalla del mensajero ═══════════
   Un celular en una mano, el casco en la otra, sol en la pantalla y la moto
   esperando. Todo aquí está medido para eso: nada de texto por debajo de
   13px, nada que se toque por debajo de --toque, y UNA sola jerarquía por
   tarjeta que se lee en dos segundos —
        a quién · a dónde · cuánto cobro · qué llevo · qué hago.
   La dirección es lo más grande y además es el botón del mapa: el gesto que
   más se repite en la calle no debería costar dos toques. */

.rep-pantalla{padding-bottom:calc(var(--e8) + env(safe-area-inset-bottom))}

/* ── Las dos luces. Antes eran dos cajas grandes con un párrafo cada una que
     empujaban los pedidos —lo único que importa— fuera de la pantalla. Ahora
     dicen dos palabras y un color; el párrafo aparece abajo SOLO si algo
     está mal, que es cuando alguien tiene tiempo de leerlo. ── */
.rep-estado{display:flex;align-items:stretch;gap:var(--e2);margin-bottom:var(--e4);min-height:var(--toque)}
.re-luz{
  flex:1;min-width:0;display:flex;align-items:center;gap:9px;text-align:left;
  padding:9px var(--e3);border-radius:var(--r);font:inherit;
  background:var(--sup);border:1px solid var(--borde);color:var(--tenue);
}
button.re-luz{cursor:pointer;transition:transform .16s var(--ease-salida)}
button.re-luz:active{transform:scale(.98)}
button.re-luz:disabled{cursor:default}
.re-punto{width:9px;height:9px;border-radius:50%;background:var(--gris-muerto);flex:none;position:relative}
.re-tx{min-width:0;display:flex;flex-direction:column;line-height:1.25}
.re-tx b{font-size:var(--t-micro);font-weight:800;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tenue2)}
.re-tx span{font-size:var(--t-chico);font-weight:650;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.re-luz.re-ok{color:var(--tx-ok);border-color:rgba(34,197,94,.32)}
.re-luz.re-ok .re-tx b{color:var(--tx-ok);opacity:.75}
.re-luz.re-ok .re-punto{background:var(--listo);box-shadow:0 0 8px rgba(34,197,94,.7)}
.re-luz.re-ok .re-punto::after{
  content:"";position:absolute;inset:0;border-radius:50%;
  border:2px solid var(--listo);animation:pulso-abierto 2.4s ease-out infinite;
}
.re-luz.re-mal{color:var(--tx-ojo);border-color:rgba(245,158,11,.34)}
.re-luz.re-mal .re-punto{background:var(--prep)}
@keyframes pulso-abierto{to{transform:scale(2.4);opacity:0}}
.re-probar{
  flex:none;width:50px;border-radius:var(--r);font-size:19px;cursor:pointer;
  background:var(--sup);border:1px solid var(--borde);
  transition:transform .16s var(--ease-salida),background-color .16s var(--ease-salida);
}
.re-probar:active{transform:scale(.94);background:var(--sup2)}
.rep-ayuda{margin:calc(var(--e3) * -1) 0 var(--e4)}

/* ── Los dos bloques y su contador ── */
.rep-bloque + .rep-bloque{margin-top:var(--e6)}
.rep-titulo{
  display:flex;align-items:center;gap:9px;margin:0 2px 10px;
  font-size:var(--t-chico);font-weight:800;letter-spacing:.1em;
  text-transform:uppercase;color:var(--tenue2);
}
.rt-ico{font-size:15px}
.rt-n{
  margin-left:auto;min-width:26px;height:26px;padding:0 8px;border-radius:999px;
  display:grid;place-items:center;background:var(--sup2);color:var(--texto);
  font-size:var(--t-mini);font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:0;
}

/* ── La tarjeta ── */
.rep-card{
  position:relative;margin-bottom:var(--e3);padding:var(--e4);
  animation:lanza-entra .34s var(--ease-salida) var(--retraso,0ms) backwards;
}
.rep-activa{
  border-color:rgba(34,197,94,.4);
  background:linear-gradient(170deg,rgba(34,197,94,.07),transparent 55%),var(--sup);
}
.rep-cab{display:flex;align-items:center;gap:9px;margin-bottom:11px}
.rep-turno{font-size:var(--t-medio);font-weight:800;color:var(--acento);
  font-variant-numeric:tabular-nums}
.rep-quien{flex:1;min-width:0;font-size:var(--t-ui);font-weight:650;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* El semáforo: un domicilio listo hace diez minutos ya va mal. El color dice
   cuál atender primero sin que nadie tenga que leer el número. */
.rep-reloj{flex:none;padding:3px 9px;border-radius:999px;
  font-size:var(--t-mini);font-weight:800;font-variant-numeric:tabular-nums}
.r-verde{background:rgba(34,197,94,.14);color:var(--tx-ok)}
.r-ambar{background:rgba(245,158,11,.16);color:var(--tx-ojo)}
.r-rojo{background:rgba(239,68,68,.18);color:var(--tx-mal)}

/* ── La dirección: lo más grande, y el botón del mapa ── */
.rep-dir{
  display:flex;align-items:center;gap:var(--e3);min-height:var(--toque);
  padding:11px var(--e3);border-radius:var(--r);text-decoration:none;color:inherit;
  background:var(--sup2);border:1px solid var(--borde);
  transition:transform .16s var(--ease-salida),border-color .16s var(--ease-salida);
}
.rep-dir:active{transform:scale(.99);border-color:var(--borde2)}
.rd-tx{flex:1;min-width:0;font-size:var(--t-base);font-weight:650;line-height:1.3}
.rd-nota{display:block;margin-top:3px;font-size:var(--t-chico);font-weight:400;color:var(--tenue)}
.rd-ir{flex:none;display:flex;align-items:center;gap:5px;color:var(--acento);
  font-size:var(--t-micro);font-weight:800;letter-spacing:.08em;text-transform:uppercase}
.rd-flecha{font-size:14px;transition:transform .2s var(--ease-salida)}
.rep-dir:active .rd-flecha{transform:translateX(3px)}

/* ── Cuánto cobro. Un domicilio pagado por Nequi y uno de contraentrega se
     ven igual en la bolsa; cobrar de más —o no cobrar— es plata del negocio. */
.rep-cobro{display:flex;align-items:center;gap:var(--e3);
  margin-top:var(--e2);padding:10px var(--e3);border-radius:var(--r)}
.rc-et{flex:1;min-width:0;font-size:var(--t-micro);font-weight:800;
  letter-spacing:.08em;text-transform:uppercase}
.rep-cobro b{font-size:var(--t-medio);font-weight:800;font-variant-numeric:tabular-nums}
.rc-cobra{background:rgba(245,158,11,.13);color:var(--tx-ojo)}
.rc-pago{background:rgba(34,197,94,.1);color:var(--tx-ok)}

/* ── La bolsa: abierta si el pedido todavía está en el restaurante (hay que
     revisarla antes de salir), plegada si ya va en la moto. ── */
.rep-bolsa{margin-top:var(--e2)}
.rep-bolsa summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:8px;
  min-height:40px;padding:0 2px;font-size:var(--t-chico);font-weight:650;color:var(--tenue);
}
.rep-bolsa summary::-webkit-details-marker{display:none}
.rep-bolsa summary::after{content:"▾";margin-left:auto;font-size:14px;
  transition:transform .2s var(--ease-salida)}
.rep-bolsa[open] summary::after{transform:rotate(180deg)}
.rep-items{
  list-style:none;margin:0;padding:var(--e3);border-radius:var(--r-chico);
  background:var(--sup2);display:flex;flex-direction:column;gap:9px;
}
.rep-items li{display:flex;gap:9px;font-size:var(--t-ui);line-height:1.3}
.rep-items li b{flex:none;color:var(--acento);font-variant-numeric:tabular-nums}
.rep-items li em{display:block;margin-top:2px;font-style:normal;
  font-size:var(--t-chico);color:var(--tenue)}

/* ── Llamar · Chat · Mapa: apoyo, no protagonistas ── */
.rep-acciones{display:flex;gap:var(--e2);margin-top:var(--e3)}
.rep-mini{
  flex:1;min-width:0;min-height:var(--toque);position:relative;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;
  border-radius:var(--r);text-decoration:none;cursor:pointer;font:inherit;
  font-size:var(--t-mini);font-weight:700;color:var(--texto);
  background:var(--sup2);border:1px solid var(--borde);
  transition:transform .16s var(--ease-salida),background-color .16s var(--ease-salida);
}
.rep-mini:active{transform:scale(.97);background:var(--sup3)}
.rm-ico{font-size:18px;line-height:1}
.rep-chat-globo{
  position:absolute;top:-7px;right:-7px;min-width:20px;height:20px;padding:0 5px;
  border-radius:999px;background:var(--malo);color:#fff;font-size:11px;font-weight:800;
  display:grid;place-items:center;box-shadow:0 2px 8px rgba(0,0,0,.4);
}

/* ── Mantener presionado para entregar ──
     El verde se llena mientras el dedo aguanta; al llenarse, entrega. Los
     900 ms son los mismos que en repartos.js: si se cambia uno, se cambian
     los dos. Un botón que se dispara con un roce cierra pedidos que nadie
     recibió. */
.rep-entregar{
  position:relative;overflow:hidden;width:100%;margin-top:var(--e2);
  min-height:60px;border-radius:var(--r);cursor:pointer;display:grid;place-items:center;
  border:1px solid rgba(34,197,94,.45);background:rgba(34,197,94,.12);
  color:var(--tx-ok);font:inherit;font-size:var(--t-ui);font-weight:800;
  touch-action:manipulation;-webkit-user-select:none;user-select:none;
  transition:transform .16s var(--ease-salida);
}
.rep-entregar:active{transform:scale(.99)}
.rep-entregar:disabled{opacity:.55;cursor:default}
.re-relleno{
  position:absolute;inset:0;background:var(--listo);
  clip-path:inset(0 100% 0 0);transition:clip-path .2s var(--ease-salida);
}
.rep-entregar.reteniendo .re-relleno{clip-path:inset(0 0 0 0);transition:clip-path .9s linear}
.re-label{position:relative;z-index:1;transition:color .2s ease}
.rep-entregar.reteniendo .re-label{color:#04220E}

/* ── Salir con este ── */
.rep-salir{
  width:100%;margin-top:var(--e3);min-height:60px;border-radius:var(--r);cursor:pointer;
  display:flex;align-items:center;justify-content:center;gap:8px;border:0;
  background:linear-gradient(180deg,var(--acento2),var(--acento));color:#1A0A02;
  font:inherit;font-size:var(--t-ui);font-weight:800;touch-action:manipulation;
  transition:transform .16s var(--ease-salida);
}
.rep-salir:active{transform:scale(.98)}
.rs-moto{font-size:18px;transition:transform .2s var(--ease-salida)}
.rep-salir:active .rs-moto{transform:translateX(5px)}

/* ── Cuando no hay nada ── */
.rep-vacia{display:flex;flex-direction:column;align-items:center;gap:5px;
  padding:30px var(--e4);text-align:center}
.rep-vacia b{font-size:var(--t-ui)}
.rep-vacia span{font-size:var(--t-chico);color:var(--tenue)}
.rv-ico{font-size:30px;filter:grayscale(.4);opacity:.75;margin-bottom:3px}

/* El parpadeo cuando cae un domicilio nuevo: con la bocina, imposible no verlo. */
body.rep-alerta{animation:rep-flash .65s ease-in-out 4}
@keyframes rep-flash{50%{box-shadow:inset 0 0 0 6px rgba(34,197,94,.55)}}

/* En tablet o computador (el dueño mirando desde la caja) las tarjetas se
   acomodan en rejilla en vez de estirarse a lo ancho. */
@media (min-width:760px){
  .rep-bloque > div{display:grid;gap:var(--e3);
    grid-template-columns:repeat(auto-fill,minmax(330px,1fr));align-items:start}
  .rep-card{margin-bottom:0}
  .rep-vacia{grid-column:1/-1}
}

@media (prefers-reduced-motion:reduce){
  .rep-card{animation:none}
  body.rep-alerta{animation:none}
  .re-luz.re-ok .re-punto::after{animation:none}
  .rd-flecha,.rs-moto{transition:none}
  /* el relleno de "mantener presionado" SÍ se queda: no es adorno, es la
     barra que dice cuánto falta. */
}
/* El ojo de la comanda: abre el pedido tal como lo ve el CLIENTE (p.php). */
.cm-ojo{
  display:block;text-align:center;margin-top:9px;padding:7px;
  font-size:var(--t-chico);font-weight:600;color:var(--tenue2);
  border-radius:8px;transition:color .15s ease,background-color .15s ease;
}
.cm-ojo:active{transform:scale(.98)}
@media (hover:hover){ .cm-ojo:hover{color:var(--texto);background:var(--sup2)} }

/* ── Novedades ── */
/* El puntico vive DENTRO del icono: así cae en la misma esquina en la barra
   del celular, en el sidebar de escritorio y en cualquier rol que lo vea. */
.nav-ico{position:relative}
.nav-nuevo{
  position:absolute;top:-3px;right:-3px;width:9px;height:9px;border-radius:50%;
  background:#EF4444;box-shadow:0 0 0 2px var(--fondo);
}
.nov-item{margin-bottom:14px}
.nov-oculta{opacity:.55}
.nov-cab{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:10px}
.nov-cab h2{font-size:18px;font-weight:800;letter-spacing:-.02em;line-height:1.25}
.nov-medio{
  display:block;width:100%;max-height:420px;object-fit:cover;border-radius:12px;
  margin:4px 0 12px;background:var(--sup2);
}
video.nov-medio{object-fit:contain;background:#000}
.nov-txt{color:var(--tenue);font-size:14.5px;line-height:1.6}

/* ── Soporte: el hilo en burbujas (mismo lenguaje que el chat del reparto) ── */
.sop-burbujas{display:flex;flex-direction:column;gap:7px;margin:10px 0}
.sopb{
  max-width:88%;padding:9px 12px;border-radius:14px;font-size:13.5px;line-height:1.45;
  word-wrap:break-word;
}
.sopb-mio{align-self:flex-end;background:var(--acento);color:var(--acento-txt);border-bottom-right-radius:5px}
.sopb-sop{align-self:flex-start;background:var(--sup);border:1px solid var(--borde);border-bottom-left-radius:5px}
.sopb-h{display:block;font-size:10.5px;opacity:.65;margin-top:3px;text-align:right}
.sop-responder{display:flex;gap:8px;margin-top:10px}
.sop-responder input{flex:1;min-width:0;min-height:44px;border-radius:999px;padding:10px 15px;
  background:var(--sup);border:1px solid var(--borde);color:var(--texto);font-size:14px}
.sop-responder input:focus{border-color:var(--acento);outline:none}
.sop-responder .btn{min-width:52px;border-radius:999px}

/* ═══ La CAJA: el cuadre del día ═══ */
.cj-cuadre{
  border:1px solid var(--borde);border-radius:16px;background:var(--sup);
  padding:16px;display:flex;flex-direction:column;gap:14px;
}
.cj-dia{display:flex;align-items:center;justify-content:center;gap:10px}
.cj-flecha{
  width:44px;height:44px;border-radius:12px;display:grid;place-items:center;
  background:var(--sup2);border:1px solid var(--borde);color:var(--texto);
  font-size:20px;font-weight:800;line-height:1;
  transition:transform .12s var(--ease-salida),background-color .15s ease;
}
.cj-flecha:active{transform:scale(.92)}
@media (hover:hover){ .cj-flecha:hover{background:var(--sup)} }
.cj-flecha-off{opacity:.25;pointer-events:none}
.cj-dia-centro{display:flex;flex-direction:column;align-items:center;gap:2px;position:relative}
.cj-dia-centro b{font-size:15px;letter-spacing:-.01em}
.cj-dia-centro input{
  background:var(--sup2);border:1px solid var(--borde);border-radius:10px;
  padding:6px 10px;color:var(--texto);font-size:13px;
}
.cj-veredicto{
  text-align:center;padding:11px 14px;border-radius:12px;
  font-size:14px;font-weight:700;line-height:1.45;
}
.cj-ok{background:rgba(34,197,94,.1);color:var(--tx-ok);box-shadow:inset 0 0 0 1px rgba(34,197,94,.35)}
.cj-falta{background:rgba(245,158,11,.1);color:var(--tx-ojo);box-shadow:inset 0 0 0 1px rgba(245,158,11,.35)}
.cj-grande{text-align:center;padding:4px 0}
.cj-grande span{
  display:block;font-size:11px;font-weight:800;letter-spacing:.14em;
  text-transform:uppercase;color:var(--tenue);
}
.cj-grande b{
  display:block;font-size:clamp(30px,7vw,40px);font-weight:800;letter-spacing:-.03em;
  line-height:1.1;font-variant-numeric:tabular-nums;
}
.cj-grande i{display:block;font-style:normal;font-size:12.5px;color:var(--tenue);margin-top:3px}
.cj-desglose{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(128px,1fr))}
.cj-metodo{
  padding:11px 12px;border-radius:12px;background:var(--sup2);border:1px solid var(--borde);
  text-align:center;
}
.cj-metodo b{display:block;font-size:15px;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.cj-metodo span{display:block;font-size:11px;color:var(--tenue);margin-top:3px;line-height:1.3}
.cj-verde{border-color:rgba(34,197,94,.4);background:rgba(34,197,94,.07)}
.cj-verde b{color:var(--tx-ok)}
.cj-ambar{border-color:rgba(245,158,11,.4);background:rgba(245,158,11,.07)}
.cj-ambar b{color:var(--tx-ojo)}
.cj-rojo{border-color:rgba(239,68,68,.35);background:rgba(239,68,68,.06)}
.cj-rojo b{color:var(--tx-mal)}

/* ── Negocios: la barra de la lista y el orden ── */
.neg-barra{
  display:flex;align-items:center;justify-content:space-between;gap:14px;
  flex-wrap:wrap;margin:26px 0 14px;
}
.neg-barra h2{font-size:18px;font-weight:800;display:flex;align-items:center;gap:9px}
.neg-cuenta{
  min-width:26px;height:26px;padding:0 8px;border-radius:999px;
  background:var(--sup2);border:1px solid var(--borde);color:var(--tenue);
  font-size:12.5px;font-weight:800;display:grid;place-items:center;
}
.neg-orden{display:flex;gap:6px;flex-wrap:wrap}
.neg-op{
  padding:8px 14px;border-radius:999px;border:1px solid var(--borde);
  background:var(--sup);color:var(--tenue);font-size:12.5px;font-weight:700;
  transition:border-color .15s ease,color .15s ease,background-color .15s ease;
}
.neg-op:active{transform:scale(.97)}
.neg-op.on{border-color:var(--acento);background:var(--acento-suave);color:var(--texto)}
@media (hover:hover){ .neg-op:not(.on):hover{color:var(--texto);border-color:var(--borde2)} }

/* ── Lo que paga el negocio: el dato principal de su tarjeta ── */
.neg-paga{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:14px 16px;border-radius:14px;
  background:var(--sup);border:1px solid var(--borde);
}
.neg-paga.con-desc{
  background:linear-gradient(120deg, rgba(34,197,94,.1), var(--sup) 65%);
  border-color:rgba(34,197,94,.32);
}
.neg-paga.apagada{opacity:.55}
.np-cifra{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;flex:1;min-width:0}
.np-cifra span{
  width:100%;font-size:11px;font-weight:800;letter-spacing:.12em;
  text-transform:uppercase;color:var(--tenue);
}
.np-cifra b{
  font-size:24px;font-weight:800;letter-spacing:-.03em;line-height:1.1;
  font-variant-numeric:tabular-nums;
}
.neg-paga.con-desc .np-cifra b{color:var(--tx-ok)}
/* El precio de lista, tachado: se ve de dónde sale la rebaja. */
.np-cifra i{
  font-style:normal;font-size:14px;font-weight:600;color:var(--tenue2);
  text-decoration:line-through;font-variant-numeric:tabular-nums;
}
.np-desc{
  flex:none;padding:6px 12px;border-radius:999px;
  background:rgba(34,197,94,.16);color:var(--tx-ok);
  font-size:12px;font-weight:800;
}
.np-espera{
  flex:none;padding:6px 12px;border-radius:999px;
  background:var(--sup2);color:var(--tenue);font-size:12px;font-weight:700;
}

/* Los dos caminos para la foto del producto: cámara o galería. */
.foto-botones{display:flex;gap:9px;flex-wrap:wrap;margin-top:12px}
.foto-botones .btn{flex:1;min-width:150px;min-height:50px}
#p-foto-nombre{color:var(--tx-ok);font-weight:600;margin-top:8px}

/* ── El acceso del dueño, dentro de la tarjeta de su negocio ── */
.neg-acceso{border-top:1px solid var(--borde);padding-top:12px}
.neg-acceso summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:11px;
  padding:8px 4px;border-radius:10px;transition:background-color .15s ease;
}
.neg-acceso summary::-webkit-details-marker{display:none}
@media (hover:hover){ .neg-acceso summary:hover{background:var(--sup2)} }
.na-ico{
  width:34px;height:34px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:var(--sup2);font-size:15px;
}
.na-txt{flex:1;min-width:0}
.na-txt b{display:block;font-size:14px}
.na-txt span{
  display:block;font-size:12px;color:var(--tenue);margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.na-flecha{color:var(--tenue2);font-size:12px;transition:transform .2s var(--ease-salida)}
.neg-acceso[open] .na-flecha{transform:rotate(180deg)}
.na-form{padding:12px 4px 4px}

/* ── Escritorio: dos regiones — el cuadre fijo a la izquierda, el día a la derecha ── */
@media (min-width:1100px){
  .cj-cuerpo{display:grid;grid-template-columns:350px minmax(0,1fr);gap:26px;align-items:start}
  .cj-lado{position:sticky;top:18px}
  .cj-main>h2:first-child{margin-top:0}
  /* El desglose deja las fichas y se vuelve una COLUMNA de filas finas:
     etiqueta a la izquierda, monto alineado a la derecha — como un recibo. */
  .cj-desglose{display:flex;flex-direction:column;gap:0;margin-top:4px}
  .cj-metodo{
    display:flex;flex-direction:row-reverse;justify-content:space-between;align-items:baseline;
    background:none;border:0;border-top:1px solid var(--borde);border-radius:0;
    padding:11px 2px;text-align:left;
  }
  .cj-metodo b{font-size:15px}
  .cj-metodo span{margin-top:0}
  .cj-verde,.cj-ambar,.cj-rojo{background:none;border-color:var(--borde)}
}

/* filtros de la lista */
.cj-filtros{display:flex;flex-direction:column;gap:10px;margin-bottom:14px}
.cj-buscar{
  width:100%;min-height:48px;padding:10px 16px;border-radius:12px;
  background:var(--sup2);border:1px solid var(--borde);color:var(--texto);font-size:15px;
}
.cj-buscar:focus{border-color:var(--acento);outline:none}
.cj-chips{display:flex;gap:8px;flex-wrap:wrap}
.cj-chip{
  display:inline-flex;align-items:center;gap:6px;min-height:40px;padding:0 14px;
  border-radius:999px;border:1px solid var(--borde);background:var(--sup);
  color:var(--tenue);font-size:13px;font-weight:700;cursor:pointer;
  transition:border-color .15s ease,background-color .15s ease,color .15s ease,transform .12s var(--ease-salida);
}
.cj-chip:active{transform:scale(.96)}
.cj-chip i{
  font-style:normal;font-size:11px;font-weight:800;min-width:20px;height:20px;
  padding:0 5px;border-radius:999px;background:var(--sup2);display:grid;place-items:center;
}
.cj-chip.on{border-color:var(--acento);background:var(--acento-suave,rgba(255,122,69,.1));color:var(--texto)}
.cj-chip.on i{background:var(--acento);color:var(--acento-txt)}

/* ── Referidos (admin): interesados con la misma gramática de tarjeta ── */
.ref-descartado{opacity:.55}
.ref-fecha{display:block;font-size:11.5px;color:var(--tenue2);margin-top:2px}
.ref-est-nuevo{background:rgba(134,239,172,.12);border-color:rgba(134,239,172,.4);color:#86EFAC}
.ref-trajo{background:rgba(134,239,172,.08);border-color:rgba(134,239,172,.25);color:#86EFAC;font-weight:600}
.ref-nota{
  font-size:13.5px;color:var(--tenue);font-style:italic;line-height:1.5;
  padding:10px 14px;border-left:3px solid var(--borde2);background:var(--sup);border-radius:0 10px 10px 0;
}
.ref-wa{min-height:48px;padding:0 18px}
.neg-acciones .neg-campo{max-width:200px}

/* ── Dar de alta un negocio: LA acción principal del admin ── */
.alta-card{
  margin-top:16px;border-radius:16px;overflow:hidden;
  border:1.5px solid rgba(255,122,69,.45);
  background:linear-gradient(135deg, rgba(255,122,69,.1), var(--sup) 55%);
}
.alta-card summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:14px;
  padding:18px;
  transition:background-color .15s ease;
}
.alta-card summary::-webkit-details-marker{display:none}
@media (hover:hover){ .alta-card summary:hover{background:rgba(255,122,69,.07)} }
.alta-card summary:active .alta-mas{transform:scale(.92)}
.alta-mas{
  width:46px;height:46px;border-radius:14px;flex:none;display:grid;place-items:center;
  background:var(--acento);color:var(--acento-txt);font-size:26px;font-weight:800;line-height:1;
  box-shadow:0 8px 20px -6px rgba(255,122,69,.55);
  transition:transform .14s var(--ease-salida);
}
.alta-txt{flex:1;min-width:0}
.alta-txt b{display:block;font-size:17px;letter-spacing:-.015em}
.alta-txt span{display:block;font-size:12.5px;color:var(--tenue);margin-top:2px;line-height:1.4}
.alta-flecha{color:var(--tenue2);font-size:14px;transition:transform .2s var(--ease-salida)}
.alta-card[open] .alta-flecha{transform:rotate(180deg)}
.alta-card>form{padding:0 18px 18px}

/* ── La tarjeta de cada negocio (admin → Negocios) ── */
.neg-card{display:flex;flex-direction:column;gap:14px}
.neg-cab{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.neg-quien{flex:1;min-width:150px}
.neg-quien b{display:block;font-size:17.5px;letter-spacing:-.015em;line-height:1.2}
.neg-link{font-size:12.5px;color:var(--acento);font-weight:600}
.neg-chip{
  padding:5px 12px;border-radius:999px;font-size:12px;font-weight:800;flex:none;
  background:var(--sup2);border:1px solid var(--borde);color:var(--tenue);
}
.neg-est-activo{background:rgba(34,197,94,.12);border-color:rgba(34,197,94,.4);color:var(--tx-ok)}
.neg-est-pausado{background:rgba(245,158,11,.12);border-color:rgba(245,158,11,.4);color:var(--tx-ojo)}
.neg-est-cancelado{background:rgba(239,68,68,.12);border-color:rgba(239,68,68,.4);color:var(--tx-mal)}
.neg-plan{background:rgba(255,122,69,.1);border-color:rgba(255,122,69,.35);color:var(--acento)}

/* Cuatro datos CON SU NOMBRE debajo — no una parrafada separada por puntos */
.neg-datos{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(110px,1fr));gap:8px;
  padding:12px;border-radius:12px;background:var(--sup);border:1px solid var(--borde);
}
.neg-datos b{display:block;font-size:15.5px;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.neg-datos span{display:block;font-size:11px;color:var(--tenue);margin-top:2px;line-height:1.3}
.neg-nota{font-size:12.5px;color:var(--tenue2)}
.neg-nota-bien{color:var(--tx-ok)}

/* Las acciones, separadas y con nombre. Los selects van AMPLIOS: aire alrededor
   del texto y una flecha propia con su espacio (la nativa quedaba pegada). */
.neg-acciones{
  display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap;
  padding-top:12px;border-top:1px solid var(--borde);
}
.neg-campo{
  flex:1;min-width:130px;display:flex;flex-direction:column;gap:5px;
  font-size:11px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--tenue);
}
.neg-campo select{width:100%}
.neg-entrar{min-height:48px;padding:0 20px;flex:none}
@media (max-width:520px){ .neg-entrar{flex:1 1 100%} }

/* ── El editor de planes de la plataforma ── */
/* Cada plan es una SECCIÓN con marco propio: el nombre manda y los tres no se
   funden en una sola pared de campos. */
.pl-editor{
  margin-top:16px;padding:16px;border:1px solid var(--borde);border-radius:14px;
  background:var(--sup);
}
.pl-cabecera{
  display:flex;align-items:center;gap:10px;margin:-16px -16px 16px;
  padding:13px 16px;border-bottom:1px solid var(--borde);
  background:var(--sup2);border-radius:14px 14px 0 0;
}
.pl-cabecera h3{flex:1;font-size:18px;font-weight:800;letter-spacing:-.02em}
.pl-numero{
  width:26px;height:26px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:var(--acento);color:var(--acento-txt);font-size:13px;font-weight:800;
}
.pl-precio-chip{
  padding:5px 12px;border-radius:999px;font-size:13px;font-weight:800;flex:none;
  background:rgba(255,122,69,.12);color:var(--acento);
  font-variant-numeric:tabular-nums;
}
.pl-futura{opacity:.72}
.pl-pronto{
  font-style:normal;font-size:10px;font-weight:800;letter-spacing:.06em;
  text-transform:uppercase;color:var(--tx-ojo);margin-left:5px;
}
.pl-sub{
  display:block;margin:16px 0 8px;font-size:11.5px;font-weight:800;
  letter-spacing:.1em;text-transform:uppercase;color:var(--tenue);
}
.pl-funciones{display:grid;gap:6px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}
.pl-fun{
  display:flex;align-items:center;gap:9px;padding:9px 11px;cursor:pointer;
  border-radius:10px;border:1px solid var(--borde);background:var(--sup);
  font-size:13px;line-height:1.3;
  transition:border-color .15s ease,background-color .15s ease;
}
.pl-fun.on,.pl-fun:has(input:checked){border-color:var(--acento);background:rgba(255,122,69,.08)}
.pl-fun input{accent-color:var(--acento);width:16px;height:16px;flex:none;margin:0}
.pl-fun:active{transform:scale(.99)}
.pl-limites{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(96px,1fr))}


/* ── Transparencia reducida: el velo del panel se vuelve casi sólido. ── */
@media (prefers-reduced-transparency: reduce){
  .velo{background:rgba(4,4,6,.94);backdrop-filter:none;-webkit-backdrop-filter:none}
}

/* ═══════════════════════════════════════════════════════════════════════
   LA COCINA, vestida con el estilo del diseño "Drive-Thru Ops Dashboard"
   de Alejandro (Claude Design): fondo más negro, tarjetas #101013/#17181c
   con bordes sutiles, TODO en píldoras, KPIs tintados con medallón de
   color, verde degradado para LISTO y acento naranja→rosa en lo primario.
   Solo aplica en la pantalla de cocina (body.pg-cocina) y en tema oscuro.
   ═══════════════════════════════════════════════════════════════════════ */
/* ═══ LA PLATAFORMA, vestida de la marca ═══
   Cuando Alejandro administra TODA la aplicación (sin entrar a un negocio),
   el panel usa NUESTRA identidad: negro profundo y el naranja del logo
   (#E65B25, muestreado del propio archivo). Dentro de un negocio no aplica:
   ahí manda el acento de su plantilla. */
body.plataforma:not(.tema-claro){
  --acento:#E65B25;
  --acento-suave:rgba(230,91,37,.12);
  --fondo:#08080A;
  --sup:#101013;
  --sup2:#17181C;
  --sup3:#1D1E23;
  --borde:#202024;
  --borde2:#2B2C32;
}
body.plataforma:not(.tema-claro) .tarjeta{background:var(--sup);border-color:var(--borde);border-radius:18px}
body.plataforma:not(.tema-claro) .kpi{background:var(--sup);border-color:var(--borde);border-radius:16px}
body.plataforma:not(.tema-claro) .navlink.on{background:rgba(230,91,37,.14)}
body.plataforma:not(.tema-claro) .navlink.on .nav-ico{color:#E65B25}
body.plataforma:not(.tema-claro) .btn-pri{
  background:linear-gradient(140deg,#F2703A,#E65B25);color:#fff;
  box-shadow:0 10px 26px -12px rgba(230,91,37,.65);
}
body.plataforma:not(.tema-claro) .btn{border-radius:999px}
body.plataforma:not(.tema-claro) .sidebar,
body.plataforma:not(.tema-claro) .topbar{background:#0B0B0E}

/* Desplazamientos a #anclas animados en todo el panel (no en la carta:
   su JS maneja el scroll a mano y pelearían). */
html{scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){ html{scroll-behavior:auto} }

body.pg-cocina:not(.tema-claro){background:#08080A}
body.pg-cocina:not(.tema-claro) .encender{
  background:#101013;border:1px solid #202024;border-radius:20px;
}
body.pg-cocina .encender .btn{border-radius:999px}

/* ── KPIs: tarjeta tintada + medallón circular, número grande abajo ── */
body.pg-cocina .kpi,body.plataforma .kpi{display:flex;gap:14px;align-items:center;border-radius:18px;padding:15px 16px}
body.pg-cocina .kpi-ico,body.plataforma .kpi-ico{
  width:42px;height:42px;border-radius:999px;flex:none;
  display:grid;place-items:center;font-size:18px;font-style:normal;
}
body.pg-cocina .kpi-tx,body.plataforma .kpi-tx{min-width:0}
body.pg-cocina .kpi-tx span,body.plataforma .kpi-tx span{
  display:block;font-size:12.5px;color:#C7C8CD;font-weight:600;
  text-transform:none;letter-spacing:0;
}
body.pg-cocina .kpi-tx b,body.plataforma .kpi-tx b{
  display:block;margin-top:3px;font-size:26px;font-weight:800;
  letter-spacing:-.03em;line-height:1.05;text-shadow:none;
}
body.pg-cocina:not(.tema-claro) .kpi-rosa,body.plataforma:not(.tema-claro) .kpi-rosa{background:linear-gradient(120deg,#2A0F1D,#14060C 70%);border-color:#40182A}
body.pg-cocina .kpi-rosa .kpi-ico,body.plataforma .kpi-rosa .kpi-ico{background:#EF3D5C}
body.pg-cocina:not(.tema-claro) .kpi-esmeralda,body.plataforma:not(.tema-claro) .kpi-esmeralda{background:linear-gradient(120deg,#0A2B1C,#04140C 70%);border-color:#14432B}
body.pg-cocina .kpi-esmeralda .kpi-ico,body.plataforma .kpi-esmeralda .kpi-ico{background:#10B981}
body.pg-cocina:not(.tema-claro) .kpi-ambar,body.plataforma:not(.tema-claro) .kpi-ambar{background:linear-gradient(120deg,#2B2108,#141004 70%);border-color:#453612}
body.pg-cocina .kpi-ambar .kpi-ico,body.plataforma .kpi-ambar .kpi-ico{background:#EAB308}
body.plataforma:not(.tema-claro) .kpi-verde{background:linear-gradient(120deg,#122B12,#060F06 70%);border-color:#1D4520}
body.plataforma .kpi-verde .kpi-ico{background:#22C55E}
body.plataforma:not(.tema-claro) .kpi-azul{background:linear-gradient(120deg,#0C2036,#040A14 70%);border-color:#153455}
body.plataforma .kpi-azul .kpi-ico{background:#3B82F6}
body.pg-cocina:not(.tema-claro) .kpi-purpura,body.plataforma:not(.tema-claro) .kpi-purpura{background:linear-gradient(120deg,#2A0D33,#120616 70%);border-color:#3F1A4C}
body.pg-cocina .kpi-purpura .kpi-ico,body.plataforma .kpi-purpura .kpi-ico{background:#A855F7}

/* ── Columnas del tablero: secciones con marco propio ── */
body.pg-cocina:not(.tema-claro) .columna{
  background:#101013;border:1px solid #202024;border-radius:22px;
}
body.pg-cocina .col-cabeza{border-radius:999px}
body.pg-cocina:not(.tema-claro) .col-cabeza .cuenta{background:#1A1B1F;border:1px solid #26272C}

/* ── Comandas: la tarjeta interior del diseño ── */
body.pg-cocina:not(.tema-claro) .comanda{
  background:#17181C;border-color:#24252A;border-radius:16px;
}
body.pg-cocina:not(.tema-claro) .comanda .it{background:#1D1E23;border-radius:12px}

/* ── Todo botón y chip, en píldora; LISTO en verde degradado ── */
body.pg-cocina .comanda .btn,body.pg-cocina .navlink{border-radius:999px}
body.pg-cocina:not(.tema-claro) .btn-listo{
  background:linear-gradient(140deg,#34D399,#10B981);color:#04231A;
  box-shadow:0 10px 24px -10px rgba(16,185,129,.5);
}
body.pg-cocina:not(.tema-claro) .comanda .btn-pri{
  background:linear-gradient(140deg,var(--acento),#EF3D5C);color:#fff;
}
body.pg-cocina:not(.tema-claro) .comanda .btn-linea{background:#1A1B1F;border-color:#26272C}
body.pg-cocina:not(.tema-claro) .etq{border-radius:999px}

/* ── Números de operación en mono, como el diseño ── */
body.pg-cocina .cm-reloj>span,body.pg-cocina .col-cabeza .cuenta{
  font-family:'IBM Plex Mono',ui-monospace,'SF Mono',Menlo,Consolas,monospace;
}

/* ═══ COCINA: atrasados y producción por tandas ═══ */
/* La comanda atrasada no se queda callada: borde rojo, latido y su aviso. */
.comanda.atrasada{
  border-color:#EF4444!important;
  box-shadow:0 0 0 1px rgba(239,68,68,.5), 0 0 26px -6px rgba(239,68,68,.45);
  animation:cm-tarde 2.2s ease-in-out infinite;
}
@keyframes cm-tarde{50%{box-shadow:0 0 0 1px rgba(239,68,68,.85), 0 0 34px -4px rgba(239,68,68,.7)}}
.cm-alarma{
  margin:-2px -2px 10px;padding:8px 12px;border-radius:12px 12px 0 0;
  background:linear-gradient(120deg,#EF4444,#B91C1C);color:#fff;
  font-size:12.5px;font-weight:800;letter-spacing:.02em;text-align:center;
}
body.pg-cocina:not(.tema-claro) .kpi-alarma{
  background:linear-gradient(120deg,#3A0D12,#160406 70%);border-color:#5C1620;
}
body.pg-cocina .kpi-alarma .kpi-ico{background:#EF4444;animation:cm-pulso 1.6s ease-in-out infinite}
@keyframes cm-pulso{50%{transform:scale(.86);opacity:.75}}

/* A producir ahora: lo pendiente sumado por plato */
.producir{
  margin:0 14px 14px;border-radius:16px;overflow:hidden;
  background:var(--sup);border:1px solid var(--borde);
}
.producir summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:11px;padding:14px 16px;
}
.producir summary::-webkit-details-marker{display:none}
.pr-ico{
  width:34px;height:34px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:rgba(249,115,22,.16);font-size:16px;
}
.producir summary b{font-size:15px;letter-spacing:-.01em}
.pr-total{flex:1;color:var(--tenue);font-size:12.5px;font-weight:600}
.pr-flecha{color:var(--tenue2);font-size:12px;transition:transform .2s var(--ease-salida)}
.producir[open] .pr-flecha{transform:rotate(180deg)}
.pr-lista{
  display:grid;gap:8px;padding:0 16px 16px;
  grid-template-columns:repeat(auto-fill,minmax(190px,1fr));
}
.pr-item{
  display:flex;align-items:center;gap:10px;padding:11px 13px;border-radius:12px;
  background:var(--sup2);border:1px solid var(--borde);
}
.pr-item b{
  min-width:38px;font-size:18px;font-weight:800;color:var(--acento);
  font-variant-numeric:tabular-nums;letter-spacing:-.02em;
}
.pr-item span{flex:1;min-width:0;font-size:13.5px;line-height:1.3}
/* Cuatro o más del mismo plato: eso es una tanda, y se ve. */
.pr-mucho{border-color:var(--acento);background:var(--acento-suave)}

/* ═══ El interruptor NEON ═══
   Basado en el toggle de jkantner (freefrontend / codepen MWzqMrp), adaptado
   a esta app. Perilla moleteada que se desliza y un anillo de luz que traza el
   contorno al encender. Es un checkbox REAL, así que todo el estado sale de
   :checked y funciona sin una línea de JavaScript.
   El color se cambia por instancia con style="--color:#XXXXXX" — verde para
   "activo", naranja para domicilios, ámbar para dinero, azul para banco,
   púrpura para mitades.
   El @property necesita inherits:true — si no, las pseudo-clases no ven la
   variable animada y el anillo no se mueve (ya nos pasó con el anillo de la
   comanda). */
@property --neon-x{syntax:'<angle>';inherits:true;initial-value:1deg}
@property --neon-c{syntax:'<color>';inherits:true;initial-value:#0000}

.neg-toggle-caja{flex:none;margin:0 0 0 auto;display:flex;align-items:center}

.neon{
  --neon-x:1deg;
  --neon-c:#0000;
  --color:#22C55E;                 /* activo = verde */
  --marco:var(--sup);              /* el aro exterior toma el color de la tarjeta */
  font-size:20px;
  appearance:none;-webkit-appearance:none;
  position:relative;aspect-ratio:2;width:3em;
  margin:0;border:0;border-radius:100em;cursor:pointer;
  background:linear-gradient(to bottom right,#0001,#0000),#444143;
  box-shadow:
    inset 0 0 .25em -.25em #0008,
    inset .05em .05em .2em #000811,
    inset -.05em -.05em .15em .05em #ccc1,
    0 0 0 .11em var(--marco);
  transition:--neon-x .5s,--neon-c .5s,box-shadow .5s;
  filter:drop-shadow(0 0 .2em var(--neon-c));
}
/* La perilla moleteada */
.neon::before{
  content:"";position:absolute;height:80%;aspect-ratio:1;
  top:50%;left:25%;transform:translate(-50%,-50%);
  background:
    radial-gradient(#0000 15%,#343133 16%,#545153 20%),
    repeating-linear-gradient(#0000 0 10%,#0002 0 20%) 50% 50% / 25% 25% no-repeat,
    repeating-linear-gradient(90deg,#0000 0 10%,#0002 0 20%) 50% 50% / 25% 25% no-repeat,
    radial-gradient(var(--neon-c) 17%,#0000 0),
    #545153;
  box-shadow:
    inset -.05em -.05em .1em #0008,
    inset .05em .05em .1em #ffffff22,
    inset .05em 0 .1em -.065em var(--neon-c),
    .1em .1em .15em #000c;
  border-radius:50%;
  transition:left .5s,box-shadow .1s;
}
/* El anillo de luz que traza el contorno */
.neon::after{
  content:"";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:calc(100% + .25em);height:calc(100% + .25em);
  border:.1em solid var(--color);border-radius:100em;
  -webkit-mask:conic-gradient(from calc(270deg - var(--neon-x)),#000 calc(2 * var(--neon-x)),#0001 0);
          mask:conic-gradient(from calc(270deg - var(--neon-x)),#000 calc(2 * var(--neon-x)),#0001 0);
  box-shadow:0 0 0 2em #0000;      /* truco para Safari */
}
@media (hover:hover){
  .neon:hover{
    --neon-x:3deg;
    --neon-c:rgba(34,197,94,.25);
    box-shadow:
      inset 0 0 .25em -.25em #0008,
      inset .05em .05em .2em #000811,
      inset -.05em -.05em .15em .05em #ccc1,
      0 0 .05em .075em var(--marco);
  }
}
.neon:focus-visible{outline:2px solid var(--acento);outline-offset:4px}
/* Mientras corre la animación y viaja el cambio, la pieza sigue viva pero no
   acepta otro toque (lo bloquea el JS con pointer-events). */
.neon[style*="pointer-events"]{cursor:progress}
.neon:checked{
  --neon-x:180deg;
  --neon-c:var(--color);
  box-shadow:
    inset 0 0 .25em -.25em #0008,
    inset .05em .05em .2em #000811,
    inset -.05em -.05em .15em .05em #ccc1,
    0 0 .1em .05em var(--marco);
}
.neon:checked::before{
  left:75%;
  box-shadow:
    inset -.05em -.05em .1em #0008,
    inset .05em .05em .1em #ffffff22,
    inset -.05em 0 .1em -.035em var(--neon-c),
    .1em .1em .15em #000c;
}
/* La variante chica: la que va dentro de los formularios, junto a su texto. */
.neon-chico{font-size:15px;flex:none;margin-top:2px}
/* Las etiquetas que llevan interruptor alinean arriba: el texto puede ser
   largo y el interruptor debe quedar a la altura de la primera línea. */
label:has(> .neon-chico){align-items:flex-start!important}

@media (prefers-reduced-motion:reduce){
  .neon,.neon::before,.neon::after{transition:none!important;animation:none!important}
}
@media (prefers-reduced-motion:reduce){
  .comanda.atrasada,.kpi-alarma .kpi-ico{animation:none}
}

/* La fila de abajo de la comanda: ver como el cliente + imprimir */
.cm-abajo{display:flex;gap:8px;margin-top:9px}
.cm-abajo .cm-ojo{flex:1;margin-top:0}

/* ═══ La BURBUJA DE AVISOS ═══
   Abajo a la derecha, como el chat de cualquier sitio: no interrumpe el
   trabajo y está donde el ojo la busca. En celular sube por encima del botón
   rojo de encendido (que vive en esa misma esquina); en escritorio ese botón
   se muda al sidebar y la burbuja se queda sola. */
.avisos{
  position:fixed;right:16px;z-index:130;
  bottom:calc(184px + env(safe-area-inset-bottom));   /* por encima del interruptor */
}
body.sin-itr .avisos{bottom:calc(16px + env(safe-area-inset-bottom))}
@media (min-width:1200px){
  .avisos{bottom:calc(20px + env(safe-area-inset-bottom))}   /* el rojo se fue al sidebar */
}

.av-burbuja{
  width:54px;height:54px;border-radius:50%;border:0;cursor:pointer;
  display:grid;place-items:center;color:#fff;position:relative;
  background:#17181C;box-shadow:0 12px 30px -8px rgba(0,0,0,.7),
             inset 0 0 0 1px rgba(255,255,255,.08);
  transition:transform .16s var(--ease-salida),background-color .2s ease;
}
.av-burbuja svg{width:24px;height:24px}
.av-burbuja:active{transform:scale(.92)}
.av-burbuja.abierto{background:var(--acento);color:var(--acento-txt)}
@media (hover:hover){ .av-burbuja:hover{transform:translateY(-2px)} }
body.tema-claro .av-burbuja{background:#fff;color:#17181C}
/* El globito con el número: lo que hace que se mire */
.av-globo{
  position:absolute;top:-3px;right:-3px;min-width:22px;height:22px;padding:0 6px;
  border-radius:999px;background:#EF4444;color:#fff;
  font-size:12px;font-weight:800;display:grid;place-items:center;
  box-shadow:0 2px 8px rgba(0,0,0,.45);
  animation:av-late 2.4s ease-in-out infinite;
}
@keyframes av-late{50%{transform:scale(.88)}}

/* El panel que sube desde la burbuja */
.av-panel{
  position:absolute;bottom:calc(100% + 12px);right:0;width:min(330px,calc(100vw - 32px));
  background:var(--sup);border:1px solid var(--borde);border-radius:16px;overflow:hidden;
  box-shadow:0 24px 60px -18px rgba(0,0,0,.75);
  transform-origin:bottom right;
  animation:av-abre .22s var(--ease-salida);
}
@keyframes av-abre{from{opacity:0;transform:scale(.94) translateY(8px)}}
.av-cab{
  display:flex;align-items:center;justify-content:space-between;
  padding:13px 15px;border-bottom:1px solid var(--borde);
}
.av-cab b{font-size:14.5px}
.av-x{
  width:30px;height:30px;border-radius:50%;border:0;cursor:pointer;
  background:var(--sup2);color:var(--tenue);font-size:17px;display:grid;place-items:center;
}
.av-lista{max-height:min(64dvh,420px);overflow-y:auto}
.av-item{
  display:flex;gap:11px;padding:13px 15px;border-bottom:1px solid var(--borde);
  color:var(--texto);text-align:left;
}
.av-item:last-child{border-bottom:0}
a.av-item{transition:background-color .15s ease}
@media (hover:hover){ a.av-item:hover{background:var(--sup2)} }
.av-ico{
  width:34px;height:34px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:rgba(245,158,11,.16);font-size:16px;
}
.av-urge .av-ico{background:rgba(239,68,68,.2)}
.av-nuevo{background:rgba(168,85,247,.18)}
.av-tx{flex:1;min-width:0}
.av-tx b{display:block;font-size:14px;line-height:1.3}
.av-urge .av-tx b{color:var(--tx-mal)}
.av-tx span{display:block;font-size:12.5px;color:var(--tenue);margin-top:3px;line-height:1.45}
.av-btn{margin-top:10px;min-height:38px;padding:0 16px;border-radius:999px;font-size:13px}
@media (prefers-reduced-motion:reduce){
  .av-globo{animation:none}
  .av-panel{animation:none}
}

/* La ficha del vencimiento en la tarjeta del admin */
.neg-vence{border-top:1px solid var(--borde);padding-top:12px}
.neg-vence summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:11px;
  padding:8px 4px;border-radius:10px;transition:background-color .15s ease;
}
.neg-vence summary::-webkit-details-marker{display:none}
@media (hover:hover){ .neg-vence summary:hover{background:var(--sup2)} }
.nv-ico{
  width:34px;height:34px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:var(--sup2);font-size:15px;
}
.neg-vence.urge .nv-ico{background:rgba(239,68,68,.18)}
.neg-vence.urge .na-txt span{color:var(--tx-mal);font-weight:700}
.nv-meses{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:12px}
.nv-meses .btn{flex:1;min-width:88px;min-height:42px;border-radius:999px}
.nv-fecha{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.nv-fecha .neg-campo{flex:1;min-width:150px}
.nv-fecha .btn{min-height:48px;padding:0 22px}
/* El chip "Por vencer" late cuando hay alguno */
.neg-filtro i{
  font-style:normal;font-size:11px;font-weight:800;margin-left:5px;
  padding:1px 6px;border-radius:999px;background:var(--sup2);
}
.neg-filtro.on i{background:var(--acento);color:var(--acento-txt)}
.neg-filtro.urge{border-color:rgba(239,68,68,.55);color:var(--tx-mal)}
.neg-filtro.urge i{background:rgba(239,68,68,.22);color:var(--tx-mal)}

/* ═══ ESPERANDO PAGO ═══
   Lo que NO se cocina todavía. Vive fuera del tablero y con marco propio para
   que nadie lo confunda con la cola: cocinar algo impago es perder el plato. */
.espera-pago{
  margin:0 14px 14px;border-radius:16px;overflow:hidden;
  background:linear-gradient(120deg, rgba(59,130,246,.1), var(--sup) 65%);
  border:1px solid rgba(59,130,246,.4);
}
.ep-cab{display:flex;align-items:center;gap:11px;flex-wrap:wrap;padding:13px 16px}
.ep-ico{
  width:34px;height:34px;border-radius:10px;flex:none;display:grid;place-items:center;
  background:rgba(59,130,246,.2);font-size:16px;
}
.ep-cab b{font-size:15px;letter-spacing:-.01em}
.ep-n{
  min-width:24px;height:24px;padding:0 7px;border-radius:999px;
  background:#3B82F6;color:#fff;font-size:12.5px;font-weight:800;
  display:grid;place-items:center;
}
.ep-nota{flex:1;min-width:180px;color:var(--tenue);font-size:12.5px}
.ep-lista{
  display:grid;gap:10px;padding:0 16px 16px;
  grid-template-columns:repeat(auto-fill,minmax(280px,1fr));
}
/* La comanda retenida: azul, sin los botones de cocinar */
.comanda.retenida{
  border-color:rgba(59,130,246,.45)!important;
  box-shadow:0 0 0 1px rgba(59,130,246,.25);
}
.cm-retiene{
  margin:-2px -2px 10px;padding:8px 12px;border-radius:12px 12px 0 0;
  background:linear-gradient(120deg,#1D4ED8,#1E3A8A);color:#fff;
  font-size:12.5px;font-weight:700;text-align:center;
}
body.pg-cocina:not(.tema-claro) .kpi-espera{
  background:linear-gradient(120deg,#0C2036,#040A14 70%);border-color:#153455;
}
body.pg-cocina .kpi-espera .kpi-ico{background:#3B82F6}

/* ═══════════════════════════════════════════════════════════════════════
   COCINA A PANTALLA COMPLETA (iPad y computador)
   Medido antes de tocar: en un iPad de 768px de alto, el tablero empezaba en
   el píxel 776 — había que hacer SCROLL para ver la primera comanda. La
   cabecera, la franja de encendido y los KPIs se comían la pantalla entera.
   Aquí todo eso se convierte en UNA franja del alto del logo. Solo aplica a
   la cocina: en las demás pantallas el aire ayuda a leer.
   ═══════════════════════════════════════════════════════════════════════ */
@media (min-width:700px){
  /* ── La cabecera: una sola franja horizontal ── */
  body.cocina-fija .topbar{
    flex-direction:row;align-items:center;gap:16px;
    padding:calc(8px + env(safe-area-inset-top,0px)) 16px 8px;
  }
  body.cocina-fija .topbar-fila{
    display:contents;             /* marca y controles entran a la misma fila */
  }
  body.cocina-fija .marca{order:1;flex:none}
  body.cocina-fija .marca-logo{height:30px;max-width:150px}
  body.cocina-fija .nav{
    order:2;flex:1;min-width:0;justify-content:flex-start;
    gap:6px;padding:0;overflow-x:auto;scrollbar-width:none;
  }
  body.cocina-fija .navlink{flex:none;white-space:nowrap}
  body.cocina-fija .nav::-webkit-scrollbar{display:none}
  body.cocina-fija .navlink{
    flex-direction:row;align-items:center;gap:7px;
    padding:8px 11px;border-radius:999px;min-width:0;font-size:13px;
  }
  body.cocina-fija .navlink::after{display:none}      /* la rayita no cabe */
  body.cocina-fija .navlink.on{background:var(--sup3);color:var(--texto)}
  body.cocina-fija .nav-ico{width:19px;height:19px}
  body.cocina-fija .nav-ico svg{width:18px;height:18px}
  body.cocina-fija .topbar-controles{
    display:flex;order:3;flex:none;flex-direction:row;align-items:center;gap:9px;
    padding:0;border:0;
  }
  body.cocina-fija .cima{margin:0;padding:0}
  body.cocina-fija .cima .salir{padding:5px}
  body.cocina-fija .tema-fila{padding:0}
  body.cocina-fija .tema-eti{display:none}            /* en la franja no cabe */
  body.cocina-fija .tema-sw{font-size:11px}
  body.cocina-fija .salir .salir-txt{display:none}    /* la inicial basta */

  /* ── El encendido: franja delgada, no una tarjeta ── */
  body.pg-cocina .encender{
    padding:8px 14px;margin-bottom:10px;border-radius:999px;gap:12px;flex-wrap:nowrap;
  }
  body.pg-cocina .encender .luz .luz{width:34px;height:34px}
  body.pg-cocina .encender .txt b{font-size:14.5px}
  body.pg-cocina .encender .txt span{font-size:12px}
  body.pg-cocina .encender .btn{min-height:38px;padding:0 16px;font-size:13px}

  /* La franja de pausa se aprieta igual que la de encendido: en la tablet de
     la pared cada píxel de alto es media comanda menos. */
  body.pg-cocina .pausa-franja{
    padding:7px 14px;margin-bottom:10px;border-radius:999px;gap:12px;flex-wrap:nowrap;
  }
  body.pg-cocina .pf-ico{width:34px;height:34px}
  body.pg-cocina .pf-ico svg{width:17px;height:17px}
  body.pg-cocina .pf-tx{min-width:0}
  body.pg-cocina .pf-tx > b{font-size:14.5px}
  body.pg-cocina .pf-tx span{font-size:12px}
  body.pg-cocina .pf-btn{min-height:36px;padding:0 13px;font-size:12.5px;white-space:nowrap}

  /* ── Los KPIs: fichas bajitas, el dato al lado de la etiqueta ── */
  body.pg-cocina .kpis{gap:8px;margin-bottom:10px}
  body.pg-cocina .kpi{padding:8px 12px;gap:10px;border-radius:14px}
  body.pg-cocina .kpi-ico{width:30px;height:30px;font-size:14px;border-radius:999px}
  body.pg-cocina .kpi-tx{display:flex;align-items:baseline;gap:8px}
  body.pg-cocina .kpi-tx span span{font-size:11.5px}
  body.pg-cocina .kpi-tx b b{margin-top:0;font-size:20px}

  /* ── Y el tablero se queda con TODO lo que sobra ── */
  body.cocina-fija{height:100dvh;overflow:hidden;display:flex;flex-direction:column}
  body.cocina-fija .tablero{flex:1;min-height:0}
  body.cocina-fija .col-lista{overflow-y:auto}
  body.pg-cocina .producir summary{padding:9px 14px}
  body.pg-cocina .producir{margin-bottom:10px}
  body.pg-cocina .espera-pago{margin-bottom:10px}
}
/* En el sidebar de escritorio la cabecera ya es vertical: solo se recorta lo
   que sigue comiendo alto. */
@media (min-width:1200px){
  /* OJO: el padding de abajo del sidebar NO se toca — esos 170px son el hueco
     RESERVADO para el botón rojo de encendido, que va posicionado encima. Al
     recortarlo aquí, el botón quedó montado sobre "Viendo X", el tema y Salir. */
  body.pg-cocina .topbar{
    flex-direction:column;
    padding:calc(16px + env(safe-area-inset-top,0px)) 14px calc(170px + env(safe-area-inset-bottom));
  }
  body.cocina-fija .topbar-fila{display:contents}
  body.cocina-fija .marca{order:1;margin-bottom:18px}
  body.cocina-fija .marca-logo{height:38px;max-width:210px}
  body.cocina-fija .nav{order:2;flex-direction:column;overflow:visible}
  body.cocina-fija .navlink{padding:10px 13px;font-size:var(--t-ui)}
  body.cocina-fija .nav-ico{width:22px;height:22px}
  body.cocina-fija .salir .salir-txt{display:inline}
  body.cocina-fija .tema-eti{display:block}
  body.cocina-fija .tema-sw{font-size:13.5px}
}

@media (min-width:700px){
  /* La bandeja de "esperando pago" medía 405px: con dos pedidos se comía media
     pantalla de iPad. Pasa a franja HORIZONTAL —se desliza de lado, no crece
     hacia abajo— y las comandas de ahí van compactas: no se están cocinando,
     solo hay que decidir sobre su plata. */
  body.pg-cocina .ep-lista{
    display:flex;gap:10px;overflow-x:auto;padding:0 16px 14px;
    scroll-snap-type:x proximity;scrollbar-width:thin;
  }
  body.pg-cocina .ep-lista .comanda{
    flex:0 0 clamp(240px,26vw,300px);scroll-snap-align:start;margin:0;
  }
  /* En la bandeja solo hace falta: quién, cuánto le queda y el botón. El
     detalle del pedido se ve en Caja, que es donde se decide la plata. */
  body.pg-cocina .ep-lista .cm-items,
  body.pg-cocina .ep-lista .cm-ojo,
  body.pg-cocina .ep-lista .cm-etqs{display:none}
  body.pg-cocina .ep-lista .comanda{padding:10px}
  body.pg-cocina .ep-lista .cm-retiene{
    margin:-8px -8px 8px;padding:6px 10px;font-size:11.5px;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  }
  body.pg-cocina .ep-lista .cm-cabeza{margin-bottom:8px}
  body.pg-cocina .ep-lista .cm-turno{font-size:26px}
  body.pg-cocina .ep-lista .cm-reloj{width:36px;height:36px;font-size:12px}
  body.pg-cocina .ep-lista .cm-pie{margin-top:0}
  body.pg-cocina .ep-lista .btn{min-height:42px;font-size:13px}
  body.pg-cocina .ep-cab{padding:10px 16px}
  body.pg-cocina .ep-nota{display:none}

  /* "A producir ahora" también se desliza de lado en vez de apilar filas. */
  body.pg-cocina .pr-lista{
    display:flex;gap:8px;overflow-x:auto;padding:0 14px 12px;scrollbar-width:thin;
  }
  body.pg-cocina .pr-item{flex:0 0 auto;min-width:150px}
}

/* La cuenta regresiva del pedido que espera transferencia */
.cm-cuenta{
  display:inline-block;margin-left:8px;padding:2px 9px;border-radius:999px;
  background:rgba(255,255,255,.16);font-variant-numeric:tabular-nums;
  font-size:12px;font-weight:800;letter-spacing:.02em;
}
.cm-cuenta.poquito{background:#EF4444;color:#fff;animation:cnt-late 1s ease-in-out infinite}
.cm-cuenta.vencida{background:#7F1D1D;color:#fff}
@keyframes cnt-late{50%{opacity:.55}}
@media (prefers-reduced-motion:reduce){ .cm-cuenta.poquito{animation:none} }

/* ═══ Pantalla completa de la cocina ═══ */
.pc-btn{
  width:44px;min-height:44px;padding:0;flex:none;display:grid;place-items:center;
  border-radius:999px;
}
.pc-btn svg{width:20px;height:20px}
.pc-btn .pc-cerrar{display:none}
.pc-btn.on .pc-abrir{display:none}
.pc-btn.on .pc-cerrar{display:block}
.pc-btn.on{border-color:var(--acento);color:var(--acento)}
.pc-btn.pc-no{opacity:.55}
/* Con la preferencia guardada, late suave: "tócame y vuelvo a pantalla completa" */
.pc-btn.pc-espera{border-color:var(--acento);animation:pc-late 2.2s ease-in-out infinite}
@keyframes pc-late{50%{box-shadow:0 0 0 4px color-mix(in srgb, var(--acento) 22%, transparent)}}
@media (prefers-reduced-motion:reduce){ .pc-btn.pc-espera{animation:none} }
/* Ya en pantalla completa, la franja puede ceder un poco más de alto */
body.pantalla-completa.cocina-fija .topbar{padding-top:6px;padding-bottom:6px}

/* ═══ CLIENTES ═══
   Misma gramática que Negocios y Caja: cabecera con quién es, datos con su
   etiqueta, acciones abajo. Aquí lo que manda no es la lista sino el botón de
   escribirle: un cliente que vuelve es la venta más barata que existe. */
.cl-barra{display:flex;flex-direction:column;gap:10px;margin:18px 0 16px}
.cl-buscar{display:flex;gap:9px}
.cl-buscar input[type="search"]{
  flex:1;min-width:0;min-height:48px;padding:10px 16px;border-radius:12px;
  background:var(--sup2);border:1px solid var(--borde);color:var(--texto);font-size:15px;
}
.cl-buscar input[type="search"]:focus{border-color:var(--acento);outline:none}
.cl-buscar .btn{min-height:48px;padding:0 20px;flex:none}

.cl-card{display:flex;flex-direction:column;gap:12px;padding:14px}
.cl-dormido{border-color:rgba(245,158,11,.35)}
.cl-cab{display:flex;align-items:center;gap:11px;color:var(--texto);flex-wrap:wrap}
.cl-inicial{
  width:42px;height:42px;border-radius:50%;flex:none;display:grid;place-items:center;
  background:var(--sup3);color:var(--acento);
  font-family:var(--f-titulo);font-size:19px;font-weight:800;
}
.cl-quien{flex:1;min-width:0}
.cl-quien b{display:block;font-size:15.5px;letter-spacing:-.01em;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cl-quien span{display:block;font-size:12.5px;color:var(--tenue);margin-top:2px}
.cl-datos{padding:10px 12px}
.cl-datos b{font-size:14.5px}
.cl-lejos{color:var(--tx-ojo)}
.cl-acciones{display:flex;gap:8px}
.cl-acciones .btn{flex:1;min-height:44px;border-radius:999px;font-size:13.5px}

/* La ficha de un cliente */
.cl-ficha{margin:12px 0 18px;display:flex;flex-direction:column;gap:14px}
.cl-cab-grande .cl-inicial{width:54px;height:54px;font-size:24px}
.cl-cab-grande .cl-quien b{font-size:21px}
.cl-wa{flex:none;min-height:44px;padding:0 20px;border-radius:999px}
.cl-desde{margin:0}
.cl-nota{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-end;
  padding-top:12px;border-top:1px solid var(--borde)}
.cl-nota .campo{margin:0}
.cl-nota .campo:first-of-type{flex:3;min-width:220px}
.cl-nota .campo:nth-of-type(2){flex:1;min-width:130px}
.cl-nota .btn{min-height:48px;padding:0 22px}
body:not(.tema-claro) .kpi-azul{background:linear-gradient(120deg,#0C2036,#040A14 70%);border-color:#153455}
.kpi-azul .kpi-ico{background:#3B82F6}


/* ═══════════ FIN DE LA PRUEBA / CUENTA VENCIDA ═══════════
   Una pantalla, una decisión. Sin barra lateral, sin menú y sin nada que
   sondee: quien llega aquí no viene a trabajar, viene a decidir si sigue.
   Por eso el único botón grande es el de activar, y "Salir" es un enlace
   discreto — no compiten. */
body.pg-fin{
  min-height:100dvh;display:grid;place-items:center;padding:var(--e6);
  background:radial-gradient(120% 80% at 50% 0%,rgba(255,122,69,.10),transparent 60%),var(--fondo);
}
.fin{
  width:min(440px,100%);text-align:center;
  animation:lanza-entra .4s var(--ease-salida) backwards;
}
.fin-logo{height:34px;margin:0 auto var(--e8);display:block;object-fit:contain}
.fin-ico{
  display:grid;place-items:center;width:76px;height:76px;margin:0 auto var(--e5);
  border-radius:50%;font-size:34px;
  background:rgba(255,122,69,.10);border:1px solid rgba(255,122,69,.28);
}
.fin h1{
  font-size:clamp(24px,5vw,30px);line-height:1.15;letter-spacing:-.025em;
  margin-bottom:var(--e3);
}
.fin p{color:var(--tenue);font-size:var(--t-base);line-height:1.55;margin-bottom:var(--e6)}
.fin-cta{
  display:flex;align-items:center;justify-content:center;min-height:var(--toque);
  padding:0 var(--e6);border-radius:var(--r);text-decoration:none;
  background:linear-gradient(180deg,var(--acento2),var(--acento));color:#1A0A02;
  font-size:var(--t-ui);font-weight:800;
  transition:transform .16s var(--ease-salida),box-shadow .16s var(--ease-salida);
}
.fin-cta:active{transform:scale(.98)}
@media (hover:hover){ .fin-cta:hover{box-shadow:0 10px 30px -10px rgba(255,122,69,.6)} }
.fin-nota{
  margin:var(--e5) 0 0;font-size:var(--t-chico);color:var(--tenue2);line-height:1.5;
}
.fin-salir{
  display:inline-block;margin-top:var(--e8);padding:var(--e2) var(--e4);
  color:var(--tenue2);font-size:var(--t-chico);font-weight:600;text-decoration:none;
}
@media (hover:hover){ .fin-salir:hover{color:var(--texto)} }
@media (prefers-reduced-motion:reduce){ .fin{animation:none} }


/* ═══════════ ABRIR CUENTA DE PRUEBA ═══════════
   Dos columnas: a la izquierda por qué vale la pena, a la derecha el
   formulario. En el celular la venta va primero y corta rápido — nadie llena
   cinco campos en una pantalla en la que todavía no sabe qué le van a dar. */
body.pg-alta{
  min-height:100dvh;
  background:radial-gradient(90% 60% at 15% 0%,rgba(255,122,69,.12),transparent 62%),var(--fondo);
}
.alta{
  display:grid;gap:var(--e8);align-items:center;
  max-width:1120px;margin:0 auto;padding:var(--e6) var(--e5) var(--e8);
}
@media (min-width:960px){
  .alta{grid-template-columns:1fr minmax(400px,460px);gap:56px;
    padding:var(--e8) var(--e6);min-height:100dvh}
}

/* ── La venta ── */
.alta-marca{display:inline-block;margin-bottom:var(--e6);color:var(--texto);text-decoration:none}
.alta-marca img{height:32px;display:block;object-fit:contain}
.alta-marca b{font-size:var(--t-titulo);letter-spacing:-.02em}
.alta-venta h1{
  font-size:clamp(30px,5.2vw,46px);line-height:1.06;letter-spacing:-.03em;
  margin-bottom:var(--e4);
}
.alta-venta h1 em{font-style:normal;color:var(--acento)}
.alta-sub{color:var(--tenue);font-size:var(--t-base);line-height:1.6;margin-bottom:var(--e6)}
.alta-lista{list-style:none;display:flex;flex-direction:column;gap:var(--e4);margin-bottom:var(--e6)}
.alta-lista li{
  display:grid;grid-template-columns:38px 1fr;gap:0 var(--e3);align-items:start;
  font-size:var(--t-chico);color:var(--tenue);line-height:1.45;
}
.alta-lista li span{
  grid-row:span 2;width:38px;height:38px;border-radius:11px;display:grid;place-items:center;
  font-size:18px;background:var(--sup);border:1px solid var(--borde);
}
.alta-lista li b{font-size:var(--t-ui);color:var(--texto);display:block;margin-bottom:1px}
.alta-nada{
  font-size:var(--t-chico);color:var(--tenue2);line-height:1.5;
  padding-left:var(--e4);border-left:2px solid rgba(255,122,69,.4);
}

/* ── El formulario ── */
.alta-caja{
  background:var(--sup);border:1px solid var(--borde);border-radius:var(--r-tarjeta);
  padding:var(--e6);
}
@media (min-width:960px){ .alta-caja{padding:var(--e8) var(--e6)} }
.alta-form h2{font-size:var(--t-titulo);letter-spacing:-.02em;margin-bottom:var(--e5)}
.alta-form .aviso{margin-bottom:var(--e4)}
.alta-form .campo{display:block;margin-bottom:var(--e4)}
.alta-dos{display:grid;gap:var(--e3);grid-template-columns:1fr}
@media (min-width:420px){ .alta-dos{grid-template-columns:1fr 1fr} }
.alta-form small{display:block;margin-top:6px;font-size:var(--t-mini);color:var(--tenue2);line-height:1.4}
.alta-btn{
  width:100%;min-height:var(--toque);margin-top:var(--e5);border:0;border-radius:var(--r);
  background:linear-gradient(180deg,var(--acento2),var(--acento));color:#1A0A02;
  font:inherit;font-size:var(--t-ui);font-weight:800;cursor:pointer;
  transition:transform .16s var(--ease-salida),box-shadow .16s var(--ease-salida);
}
.alta-btn:active{transform:scale(.99)}
@media (hover:hover){ .alta-btn:hover{box-shadow:0 12px 32px -12px rgba(255,122,69,.65)} }
.alta-pie{margin-top:var(--e4);text-align:center;font-size:var(--t-chico);color:var(--tenue2)}
.alta-pie a{color:var(--acento);font-weight:600}
/* El campo señuelo. Fuera de la pantalla y no `display:none`: hay robots que
   saltan lo que está oculto con display, pero llenan esto. */
.alta-trampa{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}


/* ── La cuenta archivada con reloj corriendo hacia el borrado ──
   El candado va DONDE SE VE EL PELIGRO, no escondido en ajustes: quien lee
   "se borra en 4 días" es el que tiene que poder pararlo ahí mismo. */
.neg-riesgo{
  display:flex;align-items:center;gap:var(--e3);margin:var(--e3) 0;
  padding:10px var(--e3);border-radius:var(--r);
  background:rgba(239,68,68,.10);border:1px solid rgba(239,68,68,.3);
}
.neg-salvada{background:rgba(34,197,94,.09);border-color:rgba(34,197,94,.3)}
.nr-ico{font-size:17px;flex:none}
.nr-tx{flex:1;min-width:0;line-height:1.3}
.nr-tx b{display:block;font-size:var(--t-chico);color:var(--tx-mal)}
.neg-salvada .nr-tx b{color:var(--tx-ok)}
.nr-tx span{font-size:var(--t-mini);color:var(--tenue)}
.nr-btn{min-height:36px;padding:0 var(--e3);font-size:var(--t-mini);white-space:nowrap}
.neg-web{background:rgba(147,197,253,.12);border-color:rgba(147,197,253,.3);color:var(--tx-info)}


/* El formulario dentro de la pantalla centrada (recuperar contraseña). */
.rec-form{text-align:left;margin-top:var(--e5)}
.rec-form .campo{margin-bottom:var(--e4)}
.rec-btn{width:100%;border:0;cursor:pointer;font:inherit;font-size:var(--t-ui);font-weight:800}


/* ═══════════ EL CONTEO DEL DÍA (cocina) ═══════════
   Hermano del panel "a producir ahora" y con su misma estética: se pliega,
   porque en un servicio tranquilo estorba, y se abre solo cuando falta cargar.
   Los colores dicen el estado sin que nadie lea el número: verde alcanza,
   ámbar se está acabando, rojo se acabó, gris no se ha cargado. */
.inv{
  background:var(--sup);border:1px solid var(--borde);border-radius:var(--r-tarjeta);
  margin-bottom:var(--e4);overflow:hidden;
}
.inv > summary{
  list-style:none;cursor:pointer;display:flex;align-items:center;gap:var(--e3);
  padding:var(--e3) var(--e4);font-size:var(--t-ui);
}
.inv > summary::-webkit-details-marker{display:none}
.inv-falta{color:var(--tx-ojo);font-weight:800}
.inv-cero-n{color:var(--tx-mal);font-weight:800;margin-left:8px}
.inv-poco-n{color:var(--tx-ojo);font-weight:700;margin-left:8px}

.inv-lista{padding:0 var(--e4) var(--e4);display:flex;flex-direction:column;gap:6px}
.inv-fila{
  display:grid;grid-template-columns:1fr auto auto auto;align-items:center;gap:var(--e3);
  padding:9px var(--e3);border-radius:var(--r-chico);
  background:var(--sup2);border-left:3px solid var(--borde2);
}
.inv-ok{border-left-color:var(--listo)}
.inv-poco{border-left-color:var(--prep);background:rgba(245,158,11,.07)}
.inv-cero{border-left-color:var(--malo);background:rgba(239,68,68,.08)}
.inv-vacio{border-left-color:var(--gris-muerto);opacity:.72}
.inv-nom{min-width:0;font-size:var(--t-ui);font-weight:650;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.inv-quedan{display:flex;flex-direction:column;align-items:center;line-height:1;min-width:46px}
.inv-quedan b{font-size:var(--t-medio);font-weight:800;font-variant-numeric:tabular-nums}
.inv-quedan i{font-style:normal;font-size:var(--t-micro);color:var(--tenue2);margin-top:2px}
.inv-poco .inv-quedan b{color:var(--tx-ojo)}
.inv-cero .inv-quedan b{color:var(--tx-mal)}
.inv-nada{color:var(--tenue2);font-size:var(--t-medio)}
.inv-vendido{font-size:var(--t-mini);color:var(--tenue2);min-width:76px;text-align:right}

/* Los tres controles: menos, cuántas hay, más. Todos de tamaño de dedo — esto
   se usa en una tablet, de pie y con prisa. */
.inv-mas{display:flex;align-items:center;gap:5px}
.inv-b{
  width:38px;height:38px;flex:none;border-radius:var(--r-chico);cursor:pointer;
  background:var(--sup3);border:1px solid var(--borde);color:var(--texto);
  font:inherit;font-size:19px;font-weight:800;line-height:1;
  transition:transform .16s var(--ease-salida),background-color .16s var(--ease-salida);
}
.inv-b:active{transform:scale(.94);background:var(--borde)}
.inv-b:disabled{opacity:.35;cursor:default}
.inv-n{
  width:64px;height:38px;text-align:center;border-radius:var(--r-chico);
  background:var(--fondo);border:1px solid var(--borde2);color:var(--texto);
  font:inherit;font-size:var(--t-ui);font-weight:800;font-variant-numeric:tabular-nums;
}
.inv-pie{display:flex;gap:var(--e2);margin-top:var(--e3)}
.inv-pie .btn{flex:1;min-height:46px}
.inv-ayuda{margin-top:var(--e3)}

@media (max-width:640px){
  .inv-fila{grid-template-columns:1fr auto auto;row-gap:8px}
  .inv-vendido{display:none}
  .inv-nom{grid-column:1/-1}
}


/* ═══════════ LAS MESAS DEL SALÓN (Ajustes) ═══════════ */
.mesa-lista{display:flex;flex-direction:column;gap:2px;margin-bottom:var(--e5)}
.mesa-zona{
  font-size:var(--t-micro);font-weight:800;letter-spacing:.1em;text-transform:uppercase;
  color:var(--tenue2);margin:var(--e4) 0 var(--e2);
}
.mesa-zona:first-child{margin-top:0}
.mesa-fila{
  display:flex;align-items:center;gap:var(--e3);padding:9px var(--e3);
  border-radius:var(--r-chico);background:var(--sup2);
}
.mesa-fila > b{
  min-width:42px;height:34px;display:grid;place-items:center;border-radius:9px;
  background:var(--sup3);font-size:var(--t-ui);font-weight:800;
}
.mesa-fila > span{flex:1;min-width:0;font-size:var(--t-chico);color:var(--tenue)}
.mesa-fuera{opacity:.5}
.mesa-fuera > b{background:transparent;box-shadow:inset 0 0 0 1px var(--borde)}
.mesa-b{min-height:34px;padding:0 var(--e3);font-size:var(--t-mini)}
.mesa-nueva{display:flex;gap:var(--e3);align-items:flex-end;flex-wrap:wrap}
.mesa-nueva .campo{margin:0}
.mesa-nueva .btn{min-height:46px}


/* ═══════════ EL SALÓN DEL MESERO ═══════════
   Una tablet en la mano, de pie, entre mesas. Las mesas son cuadradas y
   grandes: se tocan sin mirar. El color dice el estado antes que el texto —
   gris libre, naranja mía, azul de otro. */
.ms-zona{
  font-size:var(--t-micro);font-weight:800;letter-spacing:.12em;text-transform:uppercase;
  color:var(--tenue2);margin:var(--e6) 0 var(--e3);
}
.ms-salon{
  display:grid;gap:var(--e3);
  grid-template-columns:repeat(auto-fill,minmax(132px,1fr));
}
.ms-mesa{
  position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:3px;min-height:118px;padding:var(--e3);border-radius:var(--r-tarjeta);cursor:pointer;
  background:var(--sup);border:1px solid var(--borde);color:var(--texto);font:inherit;
  transition:transform .16s var(--ease-salida),border-color .16s var(--ease-salida);
}
.ms-mesa:active{transform:scale(.97)}
@media (hover:hover){ .ms-mesa:hover{border-color:var(--borde2)} }
.ms-num{font-size:var(--t-dato);font-weight:800;line-height:1;font-variant-numeric:tabular-nums}

.ms-libre .ms-num{color:var(--tenue2)}
.ms-libre-tx{font-size:var(--t-chico);color:var(--tenue2)}
.ms-sillas{font-size:var(--t-micro);color:var(--tenue2);opacity:.8}

.ms-mia{
  border-color:rgba(255,122,69,.45);
  background:linear-gradient(170deg,rgba(255,122,69,.12),transparent 60%),var(--sup);
}
.ms-mia .ms-num{color:var(--acento)}
.ms-otro{
  border-color:rgba(59,130,246,.4);
  background:linear-gradient(170deg,rgba(59,130,246,.10),transparent 60%),var(--sup);
}
.ms-otro .ms-num{color:var(--tx-info)}

.ms-reloj{font-size:var(--t-micro);color:var(--tenue2);font-variant-numeric:tabular-nums}
.ms-largo{color:var(--tx-ojo);font-weight:700}
.ms-quien{font-size:var(--t-mini);font-weight:700}
.ms-plata{font-size:var(--t-ui);font-weight:800;font-variant-numeric:tabular-nums;margin-top:2px}
.ms-rondas{font-size:var(--t-micro);color:var(--tenue2)}

/* Cuántos se sentaron: botones gordos, se toca uno y la mesa queda abierta. */
.ms-comensales{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--e2)}
.ms-c{
  min-height:56px;border-radius:var(--r);cursor:pointer;font:inherit;
  font-size:var(--t-titulo);font-weight:800;
  background:var(--sup2);border:1px solid var(--borde);color:var(--texto);
  transition:transform .16s var(--ease-salida),background-color .16s var(--ease-salida);
}
.ms-c:active{transform:scale(.95)}
@media (hover:hover){ .ms-c:hover{background:var(--sup3);border-color:var(--acento)} }
