/*
  public/css/app.css — Mafort ERP
  Tokens y clases extraídos literalmente de mafort-erp-mockup.html (raíz del proyecto).
  Se carga vía app/librerias/librerias.php ($libreriasCABE, Libreria9), después de
  Bootstrap para poder sobreescribirlo. No se reinventan estilos por módulo: todas
  las vistas reutilizan estas clases (ver CLAUDE.md sección 7).

  Nota: en el mockup #login y #app eran dos paneles alternables por JS en una sola
  página, solo para la demo. Aquí son cada uno una página real (login.php vs
  dashboard), así que se quitó ese toggle (display:none/.active) — cada bloque se
  muestra directo en su propia vista.
*/

:root{
  --ink:#0F1D33;
  --slate:#17304F;
  --steel:#3C7B9E;
  --amber:#E39A3B;
  --paper:#F4F6F8;
  --line:#DDE3E9;
  --muted:#6C7A89;
  --text:#1A2433;
  --ok:#3F8F6F;
}

html{overflow-x:hidden;}
body{font-family:'Inter',sans-serif;background:var(--paper);color:var(--text);overflow-x:hidden;}
h1,h2,h3,.display{font-family:'Sora',sans-serif;}
.mono{font-family:'IBM Plex Mono',monospace;}

/* ===== LOGIN ===== */
#login{min-height:100vh;display:flex;align-items:center;justify-content:center;background:
  linear-gradient(180deg, var(--ink) 0%, var(--slate) 100%);position:relative;overflow:hidden;}
.rail{position:absolute;left:0;top:0;bottom:0;width:6px;background:linear-gradient(180deg,var(--amber),var(--steel));}
.login-grid{display:grid;grid-template-columns:1.1fr 0.9fr;max-width:940px;width:92%;background:#fff;border-radius:16px;overflow:hidden;box-shadow:0 30px 80px rgba(0,0,0,.35);}
.login-side{background:var(--ink);color:#fff;padding:52px 44px;display:flex;flex-direction:column;justify-content:space-between;position:relative;}
.login-side::before{content:"";position:absolute;top:0;right:0;width:140px;height:140px;background:radial-gradient(circle,var(--amber) 0%,transparent 70%);opacity:.25;}
.brand-mark{font-size:13px;letter-spacing:.14em;color:var(--amber);font-weight:600;text-transform:uppercase;margin-bottom:18px;}
.login-side h1{font-size:30px;line-height:1.25;font-weight:700;max-width:320px;}
.login-side p{color:#9FB1C4;font-size:14px;margin-top:16px;max-width:300px;line-height:1.6;}
.modules-strip{display:flex;flex-wrap:wrap;gap:8px;margin-top:32px;}
.modules-strip span{font-size:11px;font-family:'IBM Plex Mono';color:#B9C6D6;border:1px solid rgba(255,255,255,.15);padding:5px 9px;border-radius:20px;}

.login-form{padding:52px 44px;display:flex;flex-direction:column;justify-content:center;}
.login-form h2{font-size:22px;margin-bottom:6px;}
.login-form .sub{color:var(--muted);font-size:13px;margin-bottom:28px;}
.field{margin-bottom:16px;}
.field label{display:block;font-size:12px;font-weight:600;color:var(--muted);margin-bottom:6px;text-transform:uppercase;letter-spacing:.04em;}
.field input,
.field select,
.field textarea{width:100%;padding:12px 14px;border:1px solid var(--line);border-radius:8px;font-size:14px;font-family:'Inter';outline:none;transition:.15s;background:#fff;color:var(--text);}
.field input:focus,
.field select:focus,
.field textarea:focus{border-color:var(--steel);box-shadow:0 0 0 3px rgba(60,123,158,.15);}
.field select{appearance:none;-webkit-appearance:none;-moz-appearance:none;
	background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath fill='%236C7A89' d='M1 1l5 5 5-5'/%3E%3C/svg%3E");
	background-repeat:no-repeat;background-position:right 14px center;padding-right:36px;cursor:pointer;}
.field select:disabled{background-color:var(--paper);color:var(--muted);cursor:not-allowed;}
.field textarea{resize:vertical;line-height:1.5;min-height:80px;}

/* "Ojito" para mostrar/ocultar contraseña (public/js/app.js envuelve
   cualquier input[type="password"] en tiempo de ejecucion, no hace falta
   agregar esta clase a mano en cada vista). */
.campo-clave{position:relative;}
.campo-clave input{padding-right:38px;}
.toggle-clave{position:absolute;right:6px;top:50%;transform:translateY(-50%);background:none;border:none;font-size:15px;line-height:1;padding:4px;cursor:pointer;color:var(--muted);}
.toggle-clave:hover{color:var(--ink);}
/*
  Validacion de formularios (pedido por Ytalo, 2026-07-09: "agrega Bootstrap
  Validator o algo parecido" -- ese plugin jQuery esta discontinuado hace
  anios; se usa en cambio el mecanismo NATIVO de validacion HTML5 que ya
  disparan los atributos required/type=email/pattern ya presentes en los
  inputs, con el manejo de submit + estas clases en public/js/app.js
  (bloque "Validacion de formularios"). Aplica a TODOS los <form> del
  proyecto automaticamente (delegacion de evento en document), no solo a
  Colaboradores -- no hace falta tocar cada vista.
*/
form.was-validated .field input:invalid,
form.was-validated .field select:invalid,
form.was-validated .field textarea:invalid{border-color:#DC3545;box-shadow:0 0 0 3px rgba(220,53,69,.12);}
/* Restriccion de negocio puntual (no es HTML5 nativo, ej. margen por canal por
   debajo del Descuento Maximo -- Cotizaciones/Administracion) -- misma
   apariencia que .was-validated:invalid, pero controlada a mano por JS
   mientras el campo siga incumpliendo la regla, sin depender del submit. */
.campo-error{border-color:#DC3545 !important;box-shadow:0 0 0 3px rgba(220,53,69,.12) !important;}
/* Campo que debe ocupar toda la fila del grid de 4/3/2/1 columnas (ej. Misión,
   un textarea largo que se ve apretado en una sola columna angosta) --
   pedido por Ytalo, 2026-07-08. */
.field-full{grid-column:1/-1;}
/* Fuerza un salto de fila dentro de un form-inline, para agrupar visualmente
   un set de campos (ej. telefonos) separado del siguiente (ej. correos) sin
   que el grid los mezcle en la misma fila -- pedido por Ytalo, 2026-07-08. */
.field-break{grid-column:1/-1;height:0;margin:0;padding:0;}
.btn-primary{width:100%;background:var(--ink);color:#fff;border:none;padding:13px;border-radius:8px;font-weight:600;font-size:14px;cursor:pointer;margin-top:8px;transition:.15s;}
.btn-primary:hover{background:var(--slate);}
.forgot{text-align:right;font-size:12px;color:var(--steel);margin-top:8px;cursor:pointer;}

/* ===== DASHBOARD ===== */
#app{display:flex;min-height:100vh;}
.sidebar{width:250px;background:var(--ink);color:#fff;flex-shrink:0;display:flex;flex-direction:column;}
.sidebar-brand{padding:22px 22px 18px;border-bottom:1px solid rgba(255,255,255,.08);}
.sidebar-brand .name{font-family:'Sora';font-weight:700;font-size:17px;}
.sidebar-brand .tag{font-size:11px;color:var(--amber);font-family:'IBM Plex Mono';letter-spacing:.06em;margin-top:2px;}
.nav-group{padding:16px 12px;}
.nav-group .label{font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:#6E85A0;padding:0 10px;margin-bottom:8px;font-weight:600;}
.nav-item{display:flex;align-items:center;gap:11px;padding:10px 12px;border-radius:8px;color:#C6D3E0;font-size:13.5px;font-weight:500;cursor:pointer;margin-bottom:2px;position:relative;transition:.15s;}
.nav-item:hover{background:rgba(255,255,255,.06);color:#fff;}
.nav-item.active{background:rgba(227,154,59,.12);color:#fff;}
.nav-item.active::before{content:"";position:absolute;left:-12px;top:8px;bottom:8px;width:3px;background:var(--amber);border-radius:3px;}
.nav-item .dot{width:6px;height:6px;border-radius:50%;background:#3C7B9E;flex-shrink:0;}
/* Conteo de pendientes de autorizacion (CRM|APR) en el sidebar -- Ytalo, 2026-07-25. */
.nav-badge{margin-left:auto;background:var(--amber);color:var(--ink);font-size:11px;font-weight:700;line-height:1;padding:3px 7px;border-radius:10px;flex-shrink:0;}

.main{flex:1;display:flex;flex-direction:column;min-width:0;}
.topbar{height:64px;background:#fff;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:0 28px;}
.topbar-left{display:flex;align-items:center;gap:4px;min-width:0;}
#sidebarToggle{display:none;background:none;border:none;font-size:20px;line-height:1;color:var(--text);cursor:pointer;padding:6px 10px 6px 0;}
.topbar .crumb{font-size:13px;color:var(--muted);}
.topbar .crumb b{color:var(--text);}
.topbar .crumb a{color:var(--muted);font-weight:700;text-decoration:none;}
.topbar .crumb a:hover{color:var(--steel);text-decoration:underline;}
.topbar .crumb .sep{margin:0 6px;color:var(--line);}
/*
  Los dropdowns del topbar (selector de perfil + avatar) se posicionan
  relativos a .user-chip completo, NO a cada wrap chico individual -- si cada
  uno se posiciona relativo a su propio wrap angosto, segun donde caiga ese
  wrap en la pantalla el menu (190px) se puede salir tanto por la izquierda
  como por la derecha (paso las dos veces probando esto). Ancladno al borde
  derecho de .user-chip (que coincide con el padding derecho del topbar)
  siempre queda espacio de sobra hacia la izquierda.
*/
.user-chip{display:flex;align-items:center;gap:10px;position:relative;}
.dropdown-wrap{display:flex;align-items:center;}
.avatar{cursor:pointer;user-select:none;}
.role-badge.switchable{cursor:pointer;user-select:none;}
.role-badge.switching{background:rgba(227,154,59,.14);border-color:rgba(227,154,59,.4);color:#8a5a12;}
.dropdown-menu{display:none;position:absolute;right:0;top:44px;background:#fff;border:1px solid var(--line);border-radius:10px;box-shadow:0 8px 24px rgba(15,29,51,.14);width:190px;max-width:calc(100vw - 56px);max-height:min(320px, calc(100vh - 80px));overflow-y:auto;padding:6px;z-index:50;box-sizing:border-box;}
.dropdown-menu.open{display:block;}
.dropdown-menu a{display:block;padding:9px 12px;font-size:13px;color:var(--text);text-decoration:none;border-radius:6px;}
.dropdown-menu a:hover{background:var(--paper);}
.dropdown-menu a.current{color:var(--steel);font-weight:700;}
.dropdown-menu .divider{border-top:1px solid var(--line);margin:6px 2px;}
.avatar{width:34px;height:34px;border-radius:50%;background:var(--steel);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:13px;}
.role-badge{font-size:10.5px;font-family:'IBM Plex Mono';background:var(--paper);border:1px solid var(--line);padding:3px 8px;border-radius:20px;color:var(--muted);}

.content{padding:28px 32px;overflow-y:auto;}
.content h1{font-size:22px;margin-bottom:4px;}
.content .sub{color:var(--muted);font-size:13.5px;margin-bottom:26px;}

.kpi-row{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-bottom:28px;}
.kpi-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:18px 20px;}
.kpi-card .k-label{font-size:11.5px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-weight:600;}
.kpi-card .k-value{font-family:'IBM Plex Mono';font-size:26px;font-weight:600;margin-top:8px;color:var(--ink);}
.kpi-card .k-delta{font-size:12px;margin-top:6px;font-weight:600;}
.k-delta.up{color:var(--ok);}
.k-delta.down{color:#C0503F;}

.modules-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;}
.mod-card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:20px;border-left:4px solid var(--steel);transition:.15s;position:relative;}
.mod-card:hover{box-shadow:0 8px 24px rgba(15,29,51,.08);transform:translateY(-1px);}
.mod-card .top{display:flex;justify-content:space-between;align-items:flex-start;}
.mod-card h3{font-size:15.5px;}
.mod-card .icon{width:36px;height:36px;border-radius:9px;background:var(--paper);display:flex;align-items:center;justify-content:center;font-size:17px;}
.mod-card .stat-line{display:flex;gap:18px;margin-top:14px;}
.mod-card .stat-line div{font-family:'IBM Plex Mono';font-size:18px;font-weight:600;}
.mod-card .stat-line span{display:block;font-size:10.5px;color:var(--muted);font-weight:500;margin-top:2px;font-family:'Inter';}
.mod-card a{display:inline-block;margin-top:16px;font-size:12.5px;font-weight:600;color:var(--steel);text-decoration:none;}
.mod-card a:hover{text-decoration:underline;}
/* Tarjeta de Tipo de Cambio del dashboard (no es un modulo): ambar si no hay TC de hoy. */
.mod-card.tc-alerta{border-left-color:var(--amber);}
.mod-card .tc-detalle{margin-top:12px;font-size:12px;color:var(--muted);line-height:1.6;}
.mod-card .tc-detalle b{color:var(--ink);font-weight:600;}
.mod-card .tc-aviso{margin-top:10px;font-size:12px;color:#8a5a12;background:rgba(227,154,59,.10);border-radius:8px;padding:6px 10px;}

/* Nota: en el mockup los mod-card/nav-item "sin acceso" llevan .locked + un tag
   🔒 SIN ACCESO — eso era solo ilustrativo (ver CLAUDE.md sección 6/7). En el
   sistema real un módulo sin permiso no se pinta, así que .locked no se traslada. */

/* ===== FILAS ARRASTRABLES (reordenar por drag-and-drop) ===== */
.data-table tr.draggable{cursor:grab;}
.data-table tr.draggable td:first-child{position:relative;padding-left:26px;}
.data-table tr.draggable td:first-child::before{content:"⠿";position:absolute;left:8px;color:var(--line);font-size:14px;}
.data-table tr.draggable:hover td:first-child::before{color:var(--muted);}
.data-table tr.dragging{opacity:.5;background:var(--paper);cursor:grabbing;user-select:none;}
.data-table tr.dragging td{user-select:none;}

/* ===== CARD / TABLA / FORM DE LISTADO =====
   El mockup no cubría pantallas de listado/CRUD (solo login + dashboard).
   Estas clases extienden el mismo lenguaje visual (tokens, radios, bordes)
   para las pantallas de cada módulo — reutilizar en vez de reinventar. */
.card{background:#fff;border:1px solid var(--line);border-radius:12px;padding:22px;margin-bottom:22px;}
.card h2{font-size:16px;margin-bottom:16px;}

/* Grid explicito de 4 columnas, bajando a 3/2/1 segun el ancho -- antes era
   flex-wrap con min-width:180px por campo, lo que armaba una cantidad de
   columnas distinta segun el largo de cada etiqueta (se veia "sin ningun
   patron", reportado por Ytalo 2026-07-08). El boton de submit y el link
   "Cancelar" ocupan el ancho completo de la fila en cualquier cantidad de
   columnas (grid-column:1/-1), para no quedar metidos como una columna mas. */
.form-inline{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;align-items:end;}
.form-inline .field{margin-bottom:0;min-width:0;}
.form-inline > .btn-primary,
.form-inline > .btn-secondary{grid-column:1/-1;}
/* Encabezado de grupo dentro de un form-inline largo (ej. Colaboradores, con
   ~10 secciones) -- ocupa toda la fila del grid en vez de caer como una
   celda mas al costado de los inputs (por eso no bastaba un <h3> suelto). */
.form-inline .form-section{grid-column:1/-1;font-size:13px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--steel);border-bottom:1px solid var(--line);padding-bottom:6px;margin:18px 0 2px;}
.form-inline .form-section:first-child{margin-top:0;}

/* .form-colapsable normalmente envuelve el <form> ENTERO (Colaboradores/
   Clientes) -- pero en Oportunidades envuelve solo una SECCION dentro de un
   form-inline ya visible (los campos de "Prospecto nuevo", 2026-07-12). Sin
   esto, el wrapper caeria como una sola celda angosta del grid en vez de
   dejar que sus propios .field se repartan en columnas -- se convierte en un
   grid propio (mismas 4 columnas) que ademas ocupa toda la fila del padre. */
.form-inline .form-colapsable{grid-column:1/-1;margin-top:0;}
.form-inline .form-colapsable.open{display:grid;grid-template-columns:repeat(4,1fr);gap:14px;align-items:end;}

/* Formulario largo que nace plegado (ej. Colaboradores, ~10 secciones) --
   pedido por Ytalo 2026-07-09: el boton "+ Nuevo Colaborador" lo despliega.
   En edicion nace ya abierto (clase .open agregada por PHP), para no
   esconder el formulario que el usuario acaba de pedir editar. */
.form-colapsable{display:none;margin-top:14px;}
.form-colapsable.open{display:block;}

/* Oportunidades (2026-07-14) es la primera pantalla con un .form-colapsable
   ANIDADO dentro de otro (el formulario entero se pliega/despliega, Y el
   bloque de Prospecto sigue plegandose por separado adentro). El handler JS
   generico de .toggle-form-colapsable busca CUALQUIER .form-colapsable
   descendiente de la .card (find(), no solo el hijo directo) -- con 2 en la
   misma card, un clic en cualquiera de los 2 botones abriria/cerraria ambos
   a la vez. Se usa una clase exterior separada (misma apariencia, handler
   propio en app.js que solo mira hijos DIRECTOS de la card) para no arriesgar
   ninguna de las 30+ pantallas que ya usan el mecanismo generico. */
.form-colapsable-exterior{display:none;margin-top:14px;}
.form-colapsable-exterior.open{display:block;}

.btn-secondary{display:inline-block;background:#fff;color:var(--text);border:1px solid var(--line);padding:8px 14px;border-radius:8px;font-weight:600;font-size:13px;cursor:pointer;text-decoration:none;}
.btn-secondary:hover{background:var(--paper);}

/* Modal de video (Capacitación E-learning, 2026-07-13): el video (link de
   YouTube) se ve embebido dentro de un modal, con opción de pantalla completa
   propia del reproductor -- en vez de sacar al colaborador a una pestaña
   nueva de YouTube. El iframe se limpia (src='') al cerrar para cortar la
   reproducción. */
.modal-video-overlay{display:none;position:fixed;inset:0;background:rgba(15,29,51,.75);z-index:200;align-items:center;justify-content:center;padding:24px;}
.modal-video-overlay.open{display:flex;}
.modal-video-box{position:relative;width:100%;max-width:900px;background:var(--paper);border-radius:10px;padding:16px;}
.modal-video-frame{position:relative;width:100%;padding-top:56.25%;background:#000;border-radius:6px;overflow:hidden;}
.modal-video-frame iframe{position:absolute;top:0;left:0;width:100%;height:100%;border:0;}
.modal-video-frame.pdf{padding-top:0;height:75vh;background:#fff;}
.modal-video-cerrar{position:absolute;top:-14px;right:-14px;width:32px;height:32px;border-radius:50%;background:var(--ink);color:#fff;border:none;font-size:18px;line-height:1;cursor:pointer;}

/* Tablas de listado: en mobile, columnas largas (ej. Misión) empujaban el
   ancho de toda la tarjeta y la pagina terminaba con scroll horizontal
   (reportado por Ytalo 2026-07-08, tomando Puestos Corporativos de ejemplo).
   .table-scroll es el contenedor que absorbe ese overflow -- la pagina en si
   nunca se desborda, solo la tabla adentro de su propia tarjeta. */
.table-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;}
.table-scroll .data-table{min-width:640px;}
.data-table{width:100%;border-collapse:collapse;}
.data-table th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);font-weight:600;padding:10px 12px;border-bottom:1px solid var(--line);white-space:nowrap;}
.data-table td{padding:10px 12px;border-bottom:1px solid var(--line);font-size:13.5px;word-break:break-word;}
.data-table tr:last-child td{border-bottom:none;}
.data-table a{color:var(--steel);text-decoration:none;font-weight:600;font-size:12.5px;margin-right:10px;white-space:nowrap;}
.data-table a:hover{text-decoration:underline;}

/* DataTables (buscador/orden/paginacion, activado en public/js/app.js) --
   pisa el look generico de la libreria para que combine con el resto de la
   app (mismos tokens de color, Inter, bordes suaves) en vez de verse "pegado". */
.dataTables_wrapper{font-family:'Inter',sans-serif;font-size:13px;color:var(--text);}
.dataTables_wrapper .dataTables_length,
.dataTables_wrapper .dataTables_filter,
.dataTables_wrapper .dataTables_info,
.dataTables_wrapper .dataTables_paginate{margin:10px 0;}
.dataTables_wrapper .dataTables_filter input,
.dataTables_wrapper .dataTables_length select{border:1px solid var(--line);border-radius:8px;padding:7px 10px;font-family:'Inter',sans-serif;font-size:13px;outline:none;background:#fff;color:var(--text);}
.dataTables_wrapper .dataTables_filter input:focus,
.dataTables_wrapper .dataTables_length select:focus{border-color:var(--steel);box-shadow:0 0 0 3px rgba(60,123,158,.15);}
.dataTables_wrapper .dataTables_info{color:var(--muted);font-size:12.5px;}
.dataTables_wrapper .dataTables_paginate .paginate_button{border:1px solid var(--line);border-radius:6px;padding:5px 11px;margin-left:4px;cursor:pointer;color:var(--text)!important;background:#fff!important;}
.dataTables_wrapper .dataTables_paginate .paginate_button:hover{background:var(--paper)!important;border-color:var(--steel);color:var(--text)!important;}
.dataTables_wrapper .dataTables_paginate .paginate_button.current{background:var(--ink)!important;border-color:var(--ink);color:#fff!important;}
.dataTables_wrapper .dataTables_paginate .paginate_button.disabled{opacity:.45;cursor:not-allowed;}
table.dataTable thead th{cursor:pointer;position:relative;}
table.dataTable thead th.sorting_disabled{cursor:default;}

.tag-estado{display:inline-block;font-size:10.5px;font-family:'IBM Plex Mono';padding:3px 9px;border-radius:20px;font-weight:600;}
.tag-estado.act{background:rgba(63,143,111,.12);color:var(--ok);}
.tag-estado.anu{background:rgba(192,80,63,.12);color:#C0503F;}

.matrix-table td, .matrix-table th{padding:8px 12px;}
.matrix-table label{display:flex;align-items:center;gap:8px;font-size:13px;cursor:pointer;}

.hint-box{background:rgba(227,154,59,.10);border:1px solid rgba(227,154,59,.35);border-radius:10px;padding:12px 16px;font-size:13px;color:var(--text);margin-bottom:18px;}
.hint-box b{color:var(--ink);}

/* Variante de alerta (ej. aviso de mantenimiento en el login) -- mismo formato
   que .hint-box, solo cambia la paleta a rojo "danger" para que resalte mas. */
.hint-box-danger{background:rgba(220,53,69,.12);border:1px solid rgba(220,53,69,.45);border-radius:10px;padding:12px 16px;font-size:13px;color:#8c1c26;margin-bottom:18px;}
.hint-box-danger b{color:#DC3545;}

@media (max-width:1100px){
  .form-inline{grid-template-columns:repeat(3,1fr);}
}

@media (max-width:900px){
  .login-grid{grid-template-columns:1fr;}
  .login-side{display:none;}
  .kpi-row{grid-template-columns:repeat(2,1fr);}
  .modules-grid{grid-template-columns:1fr;}
  .sidebar{width:72px;}
  .sidebar .txt{display:none;}
  .form-inline{grid-template-columns:repeat(2,1fr);}
}

/* Mobile real: el sidebar deja de ser una columna angosta de iconos (eso
   pasa recien de 760 a 900px) y pasa a ser un acordeon que ocupa TODO el
   ancho, colapsado (max-height:0) hasta que se abre con #sidebarToggle
   (reportado por Ytalo 2026-07-08 -- antes, debajo de 900px, el sidebar
   seguia siempre visible como tira de iconos, nunca se ocultaba del todo). */
@media (max-width:760px){
  #app{flex-direction:column;}
  #sidebarToggle{display:inline-block;}
  .sidebar{width:100%;max-height:0;overflow:hidden;transition:max-height .25s ease;}
  .sidebar.open{max-height:2000px;}
  .sidebar .txt{display:inline;}
}

@media (max-width:500px){
  .form-inline{grid-template-columns:1fr;}
}
