/* Shell v2 (Fase 2b) - ajustes propios sobre AdminLTE 4 / Bootstrap 5.3 */
.v2-baja { background-color: #73211b !important; color: #fff !important; }
.v2-baja .tabulator-cell { color: #fff; }
.v2-waiting { position: fixed; inset: 0; z-index: 2000; background: rgba(0,0,0,.45); display: none;
  align-items: center; justify-content: center; flex-direction: column; color: #fff; gap: .75rem; }
.v2-waiting.show { display: flex; }
.v2-accion { background: none; border: 0; padding: 0 .4rem; cursor: pointer; font-size: 1.05rem; }
.v2-accion.editar { color: #f39c12; } .v2-accion.eliminar { color: #dd4b39; } .v2-accion.consultar { color: #3c8dbc; } .v2-accion.clonar { color: var(--bs-body-color); }
/* Grupos v2: marcado de campo invalido en Tom Select, historial y permisos */
.ts-wrapper.is-invalid .ts-control { border-color: #dc3545; }
.v2-hist-ok .tabulator-cell { color: #3c763d; background-color: #dff0d8; }
.v2-hist-quitado .tabulator-cell { color: #a94442; background-color: #f2dede; }
.divMenuOpts .permission { margin-bottom: .25rem; }
/* Tom Select dibuja la lista en el body (core/select.js): debe quedar por encima del modal de Bootstrap (1055) y de SweetAlert (1060). */
.ts-dropdown { z-index: 1090; }

/* Modales y tablas: barra de desplazamiento mas visible + flechas flotantes semitransparentes (core/scroll_hint.js, modal_scroll.js, tabla.js). */
.modal-body, .tabulator .tabulator-tableholder { scrollbar-width: auto; scrollbar-color: var(--bs-secondary-color) var(--bs-tertiary-bg); }
.v2-scroll-hint {
  position: absolute; z-index: 5;
  width: 36px; height: 36px; padding: 0; border: 0; border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  color: #fff; background: rgba(33, 37, 41, .55);
  box-shadow: 0 2px 8px rgba(0, 0, 0, .25); backdrop-filter: blur(2px);
  opacity: 0; pointer-events: none; transform: scale(.85);
  transition: opacity .2s, transform .2s, background-color .15s;
}
.v2-scroll-hint.visible { opacity: 1; pointer-events: auto; transform: scale(1); }
.v2-scroll-hint:hover { background: rgba(33, 37, 41, .85); }
.v2-scroll-hint-abajo.visible { animation: v2-scroll-hint-rebote 1.6s ease-in-out infinite; }
.v2-scroll-hint-derecha.visible { animation: v2-scroll-hint-rebote-x 1.6s ease-in-out infinite; }
@keyframes v2-scroll-hint-rebote { 0%, 100% { translate: 0 0; } 50% { translate: 0 3px; } }
@keyframes v2-scroll-hint-rebote-x { 0%, 100% { translate: 0 0; } 50% { translate: 3px 0; } }
@media (prefers-reduced-motion: reduce) {
  .v2-scroll-hint { transition: none; }
  .v2-scroll-hint-abajo.visible, .v2-scroll-hint-derecha.visible { animation: none; }
}

/* 04/10/2026: menu de usuario del shell (layout.php + core/usuario.js). */
.v2-usuario-foto { width: 32px; height: 32px; object-fit: cover; }
.v2-usuario-foto-grande { width: 80px; height: 80px; object-fit: cover; }
.v2-perfil-foto { width: 140px; height: 140px; object-fit: cover; }
#v2-tema-btn { border: 0; }
/* Fondo suave de los paneles con pestanas de Sucursal (antes inline `background: #d2e1f16b`). */
.v2-panel-suave { background: #d2e1f16b; }

/* 04/10/2026: tema oscuro (Bootstrap 5.3 `data-bs-theme="dark"` en <html>, core/usuario.js). AdminLTE 4, Bootstrap y la hoja
   bootstrap5 de Tabulator ya traen el modo oscuro; aca solo lo que queda con colores fijos. Prefijo `html[data-bs-theme=dark]`
   para ganarle en especificidad a las reglas oscuras de Tabulator (`html[data-bs-theme=dark] .tabulator ...`). */
html[data-bs-theme=dark] .v2-panel-suave { background: rgba(110, 168, 254, .08); }
html[data-bs-theme=dark] .tabulator .tabulator-tableholder .tabulator-table { background-color: var(--bs-body-bg); color: var(--bs-body-color); }
html[data-bs-theme=dark] .tabulator .tabulator-tableholder .tabulator-placeholder span { color: var(--bs-secondary-color); }
html[data-bs-theme=dark] .tabulator .tabulator-header .tabulator-col .tabulator-header-filter input { background-color: var(--bs-body-bg); border-color: var(--bs-border-color); color: var(--bs-body-color); }
html[data-bs-theme=dark] .tabulator .tabulator-header .tabulator-calcs-holder,
html[data-bs-theme=dark] .tabulator .tabulator-header .tabulator-calcs-holder .tabulator-row { background: var(--bs-tertiary-bg) !important; }
/* Las celdas toman el fondo de la fila (Tabulator les pone el del body): asi se ven las filas de baja, rayadas y con hover. */
html[data-bs-theme=dark] .tabulator .tabulator-row .tabulator-cell { background-color: inherit; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-baja .tabulator-cell { background-color: transparent !important; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-hist-ok .tabulator-cell { color: var(--bs-success-text-emphasis); background-color: var(--bs-success-bg-subtle); }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-hist-quitado .tabulator-cell { color: var(--bs-danger-text-emphasis); background-color: var(--bs-danger-bg-subtle); }
html[data-bs-theme=dark] .v2-scroll-hint { background: rgba(222, 226, 230, .25); }
html[data-bs-theme=dark] .v2-scroll-hint:hover { background: rgba(222, 226, 230, .45); }
/* Tom Select (bootstrap5) con colores fijos en los chips y el texto. */
html[data-bs-theme=dark] .ts-control, html[data-bs-theme=dark] .ts-control input, html[data-bs-theme=dark] .ts-dropdown { color: var(--bs-body-color); }
html[data-bs-theme=dark] .ts-wrapper.multi .ts-control > div { background: var(--bs-secondary-bg); border-color: var(--bs-border-color); color: var(--bs-body-color); }
html[data-bs-theme=dark] .ts-wrapper.multi .ts-control > div.active { background: var(--bs-primary); color: #fff; }
html[data-bs-theme=dark] .ts-wrapper.multi.disabled .ts-control > div { background: var(--bs-tertiary-bg); border-color: var(--bs-border-color); color: var(--bs-secondary-color); }
html[data-bs-theme=dark] .ts-dropdown { border-color: var(--bs-border-color); }
html[data-bs-theme=dark] .ts-dropdown .optgroup-header, html[data-bs-theme=dark] .ts-dropdown .create { color: var(--bs-secondary-color); }
html[data-bs-theme=dark] .ts-dropdown [data-selectable] .highlight { background: rgba(255, 237, 40, .25); }
html[data-bs-theme=dark] .ts-wrapper .dropdown-header-close { color: var(--bs-body-color); }
html[data-bs-theme=dark] .ts-wrapper.plugin-remove_button:not(.rtl) .item .remove { border-left-color: var(--bs-border-color); }
/* SweetAlert2 (hoja compartida con la clasica, no se edita): sus variables. */
html[data-bs-theme=dark] {
  --swal2-background: var(--bs-body-bg); --swal2-color: var(--bs-body-color); --swal2-footer-border-color: var(--bs-border-color);
  --swal2-input-background: var(--bs-body-bg); --swal2-validation-message-background: var(--bs-tertiary-bg);
  --swal2-validation-message-color: var(--bs-body-color); --swal2-close-button-color: var(--bs-secondary-color);
}

/* 04/10/2026: Informes v2 - barra de porcentaje con el valor encima (Contratistas: %Ocupacion / %Desercion). */
.v2-progreso { position: relative; height: 1.25rem; border-radius: 7px; }
.v2-progreso > span { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; font-size: .75rem; color: var(--bs-body-color); }
.v2-menu-columnas { max-height: 60vh; overflow-y: auto; }

/* 04/10/2026: filas "ya no avanza" (Tickets cerrados/rechazados), en verde como la clasica; sigue el tema. */
.v2-fila-ok { background-color: var(--bs-success-bg-subtle) !important; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-fila-ok .tabulator-cell { background-color: transparent !important; }

/* 04/10/2026: Checklist v2 - filas que no alcanzan el minimo (amarillo, como la clasica), item sin completar y fotos. */
.v2-fila-alerta { background-color: var(--bs-warning-bg-subtle) !important; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-fila-alerta .tabulator-cell { background-color: transparent !important; }
.v2-chk-faltante { outline: 2px solid var(--bs-danger); outline-offset: 3px; border-radius: 6px; }
.v2-chk-foto { width: 181px; height: 200px; object-fit: cover; }
/* 05/10/2026: editor de texto enriquecido (core/editor.js) y numeros cortos en linea (RRHH > Configurar). */
.v2-editor-area { min-height: 8rem; max-height: 24rem; overflow: auto; background-color: var(--bs-body-bg); }
.v2-editor-area:focus { outline: 2px solid var(--bs-primary); outline-offset: -2px; }
/* 10/10/2026: editor de texto enriquecido con barra completa, imagen unica, solo lectura y pantalla completa (core/editor.js). */
.v2-editor-area { overflow-wrap: anywhere; }
.v2-editor-area img { max-width: 100%; height: auto; border-radius: .25rem; }
.v2-editor-area table { max-width: 100%; }
.v2-editor-area td, .v2-editor-area th { min-width: 2rem; }
.v2-editor-barra .v2-ed-btn { min-width: 2rem; }
.v2-editor-barra .v2-ed-select { width: auto; min-width: 6.5rem; max-width: 9rem; }
.v2-ed-paleta.show { display: grid; }
.v2-ed-paleta { grid-template-columns: repeat(6, 1.6rem); gap: .25rem; }
.v2-ed-paleta .btn { grid-column: 1 / -1; }
.v2-ed-color { width: 1.6rem; height: 1.6rem; border: 1px solid var(--bs-border-color); border-radius: .25rem; padding: 0; }
.v2-ed-color:hover, .v2-ed-color:focus-visible { outline: 2px solid var(--bs-primary); outline-offset: 1px; }
.v2-ed-grilla { display: grid; grid-template-columns: repeat(6, 1.5rem); gap: 2px; }
.v2-ed-celda { width: 1.5rem; height: 1.5rem; border: 1px solid var(--bs-border-color); background: var(--bs-body-bg); padding: 0; }
.v2-ed-celda.on { background: var(--bs-primary-bg-subtle); border-color: var(--bs-primary); }
.v2-editor-lectura { border-color: transparent !important; }
.v2-editor-lectura .v2-editor-area { padding: 0 !important; min-height: 0; max-height: none; background: transparent; cursor: default; }
.v2-editor-lectura .v2-editor-area:focus { outline: 0; }
.v2-editor-lectura .v2-editor-area img { cursor: zoom-in; }
.v2-editor-completo { position: fixed; inset: 0; z-index: 1100; display: flex; flex-direction: column; background: var(--bs-body-bg); border-radius: 0 !important; }
.v2-editor-completo .v2-editor-area { flex: 1 1 auto; max-height: none; }
body.v2-editor-abierto { overflow: hidden; }
@media (max-width: 575.98px) {
  .v2-editor-barra .v2-ed-btn { min-width: 2.25rem; min-height: 2.25rem; }
  .v2-editor-barra .v2-ed-select { max-width: 7rem; }
}
/* Texto enriquecido mostrado en pantalla (modal de inicio, consultas): la misma tipografia y la imagen ajustada al ancho. */
.v2-html-rico { overflow-wrap: anywhere; text-align: left; }
.v2-html-rico img { max-width: 100%; height: auto; border-radius: .25rem; }
.v2-html-rico table { max-width: 100%; }
.v2-num-corto { width: 6.5rem; display: inline-block; }
/* 05/10/2026: portal publico de CVs (cv_publico/form). */
.v2-cv-logo { max-height: 120px; }
.v2-cvp-foto { width: 200px; height: 200px; object-fit: cover; }
/* 24/10/2026: alta publica de proveedor (v2) */
.v2-provp-logo { max-height: 120px; }
.v2-provp-foto { width: 200px; height: 200px; object-fit: cover; }
.v2-cvp-dni { width: 324px; max-width: 100%; height: 200px; object-fit: cover; }
.v2-cvp-desc { max-height: 6rem; overflow-y: auto; white-space: pre-line; }
.v2-cvp-mapa { height: 60vh; min-height: 300px; }
/* 05/10/2026: RRHH > Control de acceso - leyendas de puntualidad como botones de filtro y fotos de las marcas. */
.v2-ca-filtro { background-color: var(--bs-body-bg); color: var(--bs-body-color); border: 2px solid var(--bs-border-color); border-radius: .375rem; padding: .5rem .75rem; }
.v2-ca-filtro:hover { background-color: var(--bs-tertiary-bg); }
.v2-ca-filtro.activo { background-color: var(--bs-secondary-bg); border-color: var(--bs-emphasis-color); box-shadow: inset 0 0 4px rgba(0, 0, 0, .3); }
.v2-ca-foto { border-radius: 5px; cursor: pointer; transition: opacity .3s; }
.v2-ca-foto:hover { opacity: .7; }
.v2-ca-foto-previa { max-width: 300px; max-height: 300px; }
/* 05/10/2026: kiosco publico de asistencia (asistencia/kiosco), mismas medidas que faceRec.php. */
.v2-kiosco-activar { max-width: 640px; }
.v2-kiosco-clave { max-width: 300px; }
.v2-kiosco-instrucciones { width: min(640px, 92vw); margin: 0 auto 20px; font-size: clamp(1.3rem, 4vw, 2.4rem); font-weight: bold; line-height: 1.3; padding: 18px 20px; }
.v2-kiosco-gesto { color: var(--bs-orange); text-decoration: underline; }
.v2-kiosco-camara { position: relative; width: min(640px, 92vw); margin: 0 auto 20px; }
.v2-kiosco-camara video { border: 1px solid var(--bs-border-color); border-radius: 8px; transform: scaleX(-1); max-width: 100%; height: auto; display: block; }
.v2-kiosco-camara canvas { position: absolute; top: 0; left: 0; transform: scaleX(-1); max-width: 100%; height: auto; }
.v2-kiosco-panel { width: min(640px, 92vw); margin-left: auto; margin-right: auto; }
.v2-kiosco-sugerencias { position: absolute; z-index: 1061; width: 100%; max-height: 220px; overflow-y: auto; box-shadow: 0 2px 6px rgba(0, 0, 0, .2); }
/* 05/10/2026: RRHH > entrega_epp - filas eliminadas (rojo, como la clasica), insumo entregado (verde), cantidad que supera el maximo. */
.v2-fila-baja { background-color: var(--bs-danger-bg-subtle) !important; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-fila-baja .tabulator-cell { background-color: transparent !important; }
.v2-epp-item { border: 1px solid var(--bs-border-color); border-radius: .5rem; margin: 0 0 .75rem; padding: .5rem; }
.v2-epp-entregado { color: var(--bs-success-text-emphasis); background-color: var(--bs-success-bg-subtle); }
.v2-epp-sin-fondo { background-color: var(--bs-body-bg); }
.v2-epp-excede { background-color: var(--bs-danger-bg-subtle) !important; }
.v2-epp-excede-icono { color: var(--bs-danger); }
.v2-epp-excede-icono::before { font-family: FontAwesome; content: "\f071\00a0"; }
.v2-epp-disponibles { max-height: 30vh; overflow-y: auto; background-color: var(--bs-tertiary-bg); padding: .4rem; }
.productoPlan { color: var(--bs-danger-text-emphasis); }

/* ===================== RESPONSIVO (05/10/2026, pedido de Franco: telefono / tablet / PC) =====================
   Breakpoints de Bootstrap 5.3: telefono < 576px (xs) y < 768px (sm), tablet 768-991px (md), PC >= 992px (lg+).
   Complementa core/responsivo.js (modales a pantalla completa en telefono) y core/tabla.js (columnas colapsables). */
.v2-empresa-sel { min-width: 220px; }
.app-header .navbar-nav .nav-link { white-space: nowrap; }
/* Toque con el dedo: areas de click mas grandes en los iconos de accion. */
@media (pointer: coarse) {
  .v2-accion { padding: .35rem .6rem; font-size: 1.2rem; }
  .btn-sm { padding: .375rem .65rem; }
}
/* Telefono y tablet: pestanas en una sola linea, desplazables. */
@media (max-width: 991.98px) {
  .app-content .nav-tabs, .app-content .nav-pills, .modal .nav-tabs, .modal .nav-pills {
    flex-wrap: nowrap; overflow-x: auto; overflow-y: hidden; scrollbar-width: thin; -webkit-overflow-scrolling: touch;
  }
  .app-content .nav-tabs .nav-link, .app-content .nav-pills .nav-link, .modal .nav-tabs .nav-link, .modal .nav-pills .nav-link { white-space: nowrap; }
  .modal-xl { --bs-modal-width: 96vw; }
}
/* Telefono. */
@media (max-width: 767.98px) {
  .app-content-header { padding-top: .5rem; padding-bottom: .5rem; }
  .v2-titulo { font-size: 1.15rem; }
  .app-content > .container-fluid, .app-content-header > .container-fluid { padding-left: .5rem; padding-right: .5rem; }
  .app-content .card-body { padding: .75rem; }
  .app-content .card-header { padding: .5rem .75rem; }
  /* Las barras de botones de las tarjetas se reparten el ancho en vez de amontonarse. */
  .app-content .card-header.d-flex > .btn { flex: 1 1 auto; }
  .modal-footer { flex-wrap: wrap; }
  .modal-footer > .btn { flex: 1 1 40%; }
  /* Tabulator modo telefono: el detalle desplegado de la fila con el mismo estilo que el resto. */
  .tabulator .tabulator-responsive-collapse { padding: .25rem .5rem; border-top: 1px dashed var(--bs-border-color); }
  .tabulator .tabulator-responsive-collapse table td { padding: .15rem .35rem; vertical-align: top; }
  .tabulator .tabulator-responsive-collapse table td:first-child { font-weight: 600; color: var(--bs-secondary-color); white-space: nowrap; }
  .tabulator .tabulator-footer .tabulator-paginator { flex-wrap: wrap; justify-content: center; }
  .v2-ca-foto-previa, .v2-cvp-foto, .v2-provp-foto, .v2-chk-foto { max-width: 100%; height: auto; }
}
@media (max-width: 575.98px) {
  .app-header .container-fluid { flex-wrap: nowrap; padding-left: .25rem; padding-right: .25rem; }
  .v2-empresa-sel { min-width: 0; width: 46vw; max-width: 46vw; }
  .app-header .navbar-nav .nav-link { padding-left: .4rem; padding-right: .4rem; }
}
html[data-bs-theme=dark] .tabulator .tabulator-responsive-collapse { background-color: var(--bs-body-bg); color: var(--bs-body-color); }

/* ===== 05/10/2026 - RRHH > Calendario v2 (calendario/list.js): grilla personal x dia ===== */
.v2-cal-grilla .tabulator-col .tabulator-col-title { white-space: normal; text-align: center; line-height: 1.1; }
.v2-cal-grilla .tabulator-cell.v2-cal-dia { padding: 4px 1px; font-size: small; text-align: center; }
.v2-cal-grilla .tabulator-cell.v2-cal-sin { background-color: #ffa2a2; }
.v2-cal-grilla .tabulator-cell.v2-cal-descanso { background-color: lightgray; }
.v2-cal-grilla .tabulator-cell.v2-cal-fija { font-weight: 600; }
.v2-cal-punto { display: block; line-height: 1.1; }
.v2-cal-punto .fa { border: 1px solid #fafafa; border-radius: 80px; box-shadow: 1px 1px gray; }
html[data-bs-theme=dark] .v2-cal-grilla .tabulator-cell.v2-cal-sin { background-color: #6b2b2b; }
html[data-bs-theme=dark] .v2-cal-grilla .tabulator-cell.v2-cal-descanso { background-color: #4a4f55; }
html[data-bs-theme=dark] .v2-cal-punto .fa { border-color: #2b3035; box-shadow: 1px 1px #000; }

/* 05/10/2026: Programacion semanal (planilla_semanal_rrhh v2, assets/v2/js/programacion/). Colores por estado con
   transparencia (los mismos de la clasica), validos en tema claro y oscuro. */
.v2-plasem-tabla .tabulator-cell { white-space: normal; padding: 2px 3px; }
.v2-plasem-tabla .tabulator-cell.v2-plasem-est-C { background-color: rgba(3, 255, 10, .18) !important; }
.v2-plasem-tabla .tabulator-cell.v2-plasem-est-M { background-color: rgba(208, 0, 0, .33) !important; }
.v2-plasem-tabla .tabulator-cell.v2-plasem-est-R { background-color: rgba(255, 217, 0, .28) !important; }
.v2-plasem-celda { font-size: .75rem; line-height: 1.2; }
.v2-plasem-acc { line-height: 1; }
.v2-plasem-titulo { border-radius: 10px; padding: 1px 4px; margin: 2px 0; }
.v2-plasem-tit-C { background-color: rgba(3, 255, 10, .18); }
.v2-plasem-tit-M { background-color: rgba(255, 102, 102, .55); }
.v2-plasem-tit-R { background-color: rgba(255, 217, 0, .28); }
.v2-plasem-detalle { border: 2px solid rgba(154, 154, 154, .28); border-radius: 12px; padding: 3px 5px; margin: 2px 0; background-color: var(--bs-tertiary-bg); }
.v2-plasem-hora { display: block; font-size: .65rem; }
.v2-plasem-nombre { font-size: .85rem; }
.v2-plasem-pct-naranja { color: var(--bs-orange); }
.v2-plasem-pct-verde { color: var(--bs-success); }
.v2-plasem-pct-rojo { color: var(--bs-danger); }
.v2-plasem-pct-gris { color: var(--bs-secondary-color); }
/* Programacion de Operaciones: sub-linea del equipo (COD_PROP) y servicios clicables del estilo amplio. */
.v2-plasem-sub { color: var(--bs-secondary-color); font-size: .75rem; }
.v2-plasem-clic { cursor: pointer; }
.v2-plasem-clic:hover { filter: brightness(.95); }
html[data-bs-theme=dark] .v2-plasem-tit-C { background-color: rgba(3, 255, 10, .22); color: var(--bs-body-color); }
html[data-bs-theme=dark] .v2-plasem-tit-M { background-color: rgba(255, 102, 102, .35); color: var(--bs-body-color); }
html[data-bs-theme=dark] .v2-plasem-tit-R { background-color: rgba(255, 217, 0, .25); color: var(--bs-body-color); }
html[data-bs-theme=dark] .v2-plasem-clic:hover { filter: brightness(1.2); }
.v2-plasem-card:fullscreen { overflow: auto; background-color: var(--bs-body-bg); }
.v2-plasem-card:fullscreen .v2-plasem-tabla .tabulator { max-height: calc(100vh - 140px) !important; }

/* ===== 05/10/2026 - RRHH > Gestion de tareas / Solicitudes v2 (asignacion_de_tarea/list.js, form.js) ===== */
.v2-asig-fila-baja .tabulator-cell { color: #d6336c; }
.v2-asig-hoy { background-color: var(--bs-success-bg-subtle) !important; }
html[data-bs-theme=dark] .v2-asig-fila-baja .tabulator-cell { color: #f17fa8; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-asig-hoy .tabulator-cell { background-color: transparent !important; }
.v2-accion.v2-asig-acc-grupo { color: #d63384; } .v2-accion.v2-asig-acc-aut { color: var(--bs-success); }
.v2-accion.v2-asig-acc-rej { color: var(--bs-danger); } .v2-accion.v2-asig-acc-print { color: #00a65a; }
.v2-asig-clip { color: #a62cf3; }
.v2-asig-punto { text-shadow: 0 0 1px var(--bs-body-color); }
.v2-asig-foto { width: 181px; max-width: 100%; height: 200px; object-fit: cover; border-radius: 5px; border: 1px dotted var(--bs-border-color); cursor: zoom-in; }
.v2-asig-zoom { position: fixed; inset: 0; z-index: 2000; background: rgba(0, 0, 0, .9); display: flex; align-items: center; justify-content: center; cursor: zoom-out; padding: 1rem; }
.v2-asig-zoom[hidden] { display: none; }
.v2-asig-zoom img { max-width: 100%; max-height: 100%; }
.v2-asig-num { width: 6rem; }
.v2-asig-num-sel { width: auto; min-width: 8rem; }

/* ===================== RRHH > Personal (chofer, 05/10/2026) ===================== */
.v2-ch-busqueda { min-width: 220px; max-width: 100%; }
.v2-ch-vto-icono { font-size: 1.35rem; }
.v2-ch-vto-vencido { color: var(--bs-danger) !important; }
.v2-ch-vto-alerta { color: var(--bs-warning) !important; }
.v2-ch-vto-ok { color: var(--bs-success) !important; }
.v2-ch-vto-na { color: var(--bs-primary); opacity: .6; }
.v2-ch-miniatura { width: 40px; height: 40px; object-fit: cover; border-radius: .3rem; cursor: pointer; }
.v2-ch-foto { width: 150px; height: 200px; max-width: 100%; object-fit: cover; border-radius: .3rem; border: 1px dotted var(--bs-border-color); cursor: pointer; }
.v2-ch-video { width: 100%; max-width: 320px; border-radius: .3rem; border: 1px solid var(--bs-border-color); }
.v2-ch-mapa { width: 100%; height: 70vh; min-height: 320px; }
.v2-ch-anio { width: 6rem; }
.v2-ch-num { width: 8rem; display: inline-block; }
.v2-ch-menu-sueldos { min-width: min(560px, 95vw); }
.v2-ch-credenciales { background-color: var(--bs-success-bg-subtle); }
.v2-ch-vto-rojo { border-color: var(--bs-danger) !important; background-color: var(--bs-danger-bg-subtle); }
.v2-ch-vto-rojo .v2-ch-vto-label { color: var(--bs-danger-text-emphasis); }
.v2-ch-token { display: inline-block; max-width: 8rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }
.v2-ch-insumo-ok { background-color: var(--bs-success-bg-subtle); }
.v2-ch-gastos { background-color: var(--bs-success-bg-subtle); border: 1px solid var(--bs-border-color); }
.v2-ch-viatico { background-color: var(--bs-tertiary-bg); }
.v2-ch-comp-img { width: 100px; height: 100px; object-fit: cover; border-radius: .3rem; border: 1px dotted var(--bs-border-color); }
@media (max-width: 767.98px) { .v2-ch-busqueda { min-width: 0; width: 100%; } .v2-ch-mapa { height: 60vh; } }

/* Calendario Calidad (FullCalendar 6): ocupa el ancho de la tarjeta y se desplaza en telefono sin romper el layout */
.v2-cal-fc { min-height: 480px; overflow-x: auto; }
.v2-cal-fc .fc { min-width: 520px; }
.v2-cal-fc .fc-toolbar { flex-wrap: wrap; gap: .5rem; }

/* 06/10/2026: Informe de sucesos - color de fila por estado (cerrado verde, analizado violeta, iniciado amarillo), legible en claro y oscuro. */
.tabulator .tabulator-row.v2-suc-fila-cerrado .tabulator-cell { background-color: rgb(204, 255, 203); color: #1b1b1b; }
.tabulator .tabulator-row.v2-suc-fila-analizado .tabulator-cell { background-color: rgb(176, 186, 251); color: #1b1b1b; }
.tabulator .tabulator-row.v2-suc-fila-iniciado .tabulator-cell { background-color: #ffffb4; color: #1b1b1b; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-suc-fila-cerrado .tabulator-cell { background-color: #1e4d2b !important; color: #e6f4ea; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-suc-fila-analizado .tabulator-cell { background-color: #33397a !important; color: #e8eaff; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-suc-fila-iniciado .tabulator-cell { background-color: #5c5320 !important; color: #fff7cc; }
.tabulator .tabulator-row[class*=v2-suc-fila-] .tabulator-cell a { color: inherit; }

/* Operaciones > Pantalla (v2): tablero de servicios por dia. */
.v2-pant-contenedor { max-height: 75vh; overflow: auto; }
.v2-pant-tabla { width: max-content; min-width: 100%; }
.v2-pant-tabla thead th { position: sticky; top: 0; z-index: 1; background: #000; color: #fff; font-size: 12px; padding: 2px 4px; white-space: nowrap; }
.v2-pant-tabla td { vertical-align: top; min-width: 170px; padding: 4px; }
.v2-pant-item { font-size: 12px; border-bottom: 1px solid #8f8f8f; background: var(--bs-body-bg); box-shadow: 1px 0 6px -4px #000; margin: 0 0 5px; padding: 2px 3px; }
.v2-pant-linea { width: 160px; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
.v2-pant-linea:hover { overflow: visible; white-space: normal; cursor: pointer; }
.v2-pant-item.v2-pant-proximo { background: #84fb8466; }
#v2-pant-caja:fullscreen { background: var(--bs-body-bg); overflow: auto; }

/* ===================== Operaciones > Equipos (movil, 06/10/2026) ===================== */
.v2-mv-busqueda { min-width: 220px; max-width: 100%; }
.v2-mv-vto-icono { font-size: 1.35rem; }
.v2-mv-vto-vencido { color: var(--bs-danger) !important; }
.v2-mv-vto-alerta { color: var(--bs-warning) !important; }
.v2-mv-vto-ok { color: var(--bs-success) !important; }
.v2-mv-vto-na { color: var(--bs-primary); opacity: .6; }
.v2-mv-foto { max-width: 80px; height: auto; border-radius: 5px; cursor: zoom-in; transition: opacity .3s; }
.v2-mv-foto:hover { opacity: .7; }
.v2-mv-promedio { color: var(--bs-primary); font-weight: 600; }
html[data-bs-theme=dark] .v2-mv-vto-vencido { color: #ff6b6b !important; }
html[data-bs-theme=dark] .v2-mv-vto-alerta { color: #ffb84d !important; }
html[data-bs-theme=dark] .v2-mv-vto-ok { color: #5fd38d !important; }
html[data-bs-theme=dark] .v2-mv-vto-na { color: #8fb4ff; }
html[data-bs-theme=dark] .v2-mv-promedio { color: #8fb4ff; }
@media (max-width: 767.98px) { .v2-mv-busqueda { min-width: 0; width: 100%; } }

/* Operaciones > Equipos (v2), pestanas secundarias del formulario (combustible, preventivos, dispositivos, HikCentral, historial, compra, insumos, predictivos). */
.v2-mv-kpi { display: flex; flex-wrap: wrap; align-items: baseline; gap: .5rem; font-size: 1.1rem; }
.v2-mv-valor { color: #4a74ff; font-weight: 600; }
html[data-bs-theme=dark] .v2-mv-valor { color: #8fb0ff; }
.v2-mv-etiqueta { color: #1976d2; font-size: 1.05rem; }
html[data-bs-theme=dark] .v2-mv-etiqueta { color: #7fb8ff; }
.v2-mv-sensor-info { display: block; min-height: 1.25rem; font-size: .85rem; color: var(--bs-secondary-color); }
.v2-mv-sensor-info.v2-mv-sensor-ok { color: #3f8f00; }
.v2-mv-sensor-info.v2-mv-sensor-error { color: #d10000; }
html[data-bs-theme=dark] .v2-mv-sensor-info.v2-mv-sensor-ok { color: #7bd34a; }
html[data-bs-theme=dark] .v2-mv-sensor-info.v2-mv-sensor-error { color: #ff7a7a; }
.v2-mv-carroceria { color: var(--bs-secondary-color); }
.v2-mv-marca { color: #1976d2; }
.v2-mv-motor { color: #a0522d; }
.v2-mv-tipo { color: #d9534f; }
html[data-bs-theme=dark] .v2-mv-marca { color: #7fb8ff; }
html[data-bs-theme=dark] .v2-mv-motor { color: #d8a27a; }
html[data-bs-theme=dark] .v2-mv-tipo { color: #ff8a86; }
.v2-mv-rem-suman, .v2-mv-rem-restan { display: inline-block; font-size: .85rem; }
.v2-mv-ot, .v2-mv-remito { text-decoration: none; white-space: nowrap; }
#v2-mv-hikg-barra { transition: width .2s; }

/* ---- Equipos: formulario del equipo (movil/form.js) ---- */
.v2-mv-foto { width: 120px; max-width: 100%; border-radius: .375rem; border: 1px dotted var(--bs-border-color); cursor: pointer; }
.v2-mv-panel-abm { margin-top: .5rem; padding: 1rem; border-radius: .5rem; background: var(--bs-primary-bg-subtle); color: var(--bs-body-color); }
.v2-mv-modo-manual .v2-mv-manual > label { color: var(--bs-primary); }
.v2-mv-modo-manual .v2-mv-gpscampo > label { color: var(--bs-secondary-color); }
.v2-mv-modo-gps .v2-mv-manual > label { color: var(--bs-secondary-color); }
.v2-mv-modo-gps .v2-mv-gpscampo > label { color: var(--bs-primary); }
.v2-mv-vto .btn { min-width: 2.25rem; }
html[data-bs-theme=dark] .v2-mv-panel-abm { background: rgba(var(--bs-primary-rgb), .18); }
html[data-bs-theme=dark] .v2-mv-foto { border-color: var(--bs-border-color-translucent); }

/* ---- Servicios: formulario de servicio compartido (servicio/form.js) ---- */
.v2-sv-fechas { padding: .75rem; border: 1px solid var(--bs-border-color); border-radius: .5rem; }
.v2-sv-panel { padding: 1rem; border-radius: .5rem; background: var(--bs-primary-bg-subtle); color: var(--bs-body-color); }
.v2-sv-seguridad { padding: .75rem 1rem; border-radius: .5rem; border: 1px solid var(--bs-warning-border-subtle); background: var(--bs-warning-bg-subtle); color: var(--bs-body-color); }
.v2-sv-pax-origen { border: 1px dashed var(--bs-border-color); border-radius: .5rem; background: var(--bs-tertiary-bg); }
.v2-sv-pax-lista { list-style: none; margin: 0; padding: .5rem; min-height: 8rem; max-height: 18rem; overflow-y: auto; border: 1px solid var(--bs-border-color); border-radius: .5rem; background: var(--bs-body-bg); }
.v2-sv-pax-lista li { padding: .25rem .5rem; border-bottom: 1px solid var(--bs-border-color-translucent); }
.v2-sv-pax-lista li[hidden] { display: none; }
.v2-sv-mapa { width: 100%; height: 420px; border-radius: .5rem; background: var(--bs-secondary-bg); }
.v2-sv-insumo { position: relative; background: var(--bs-tertiary-bg); }
.v2-sv-no-disponible { outline: 2px solid var(--bs-danger); border-radius: .375rem; }
html[data-bs-theme=dark] .v2-sv-panel { background: rgba(var(--bs-primary-rgb), .18); }
html[data-bs-theme=dark] .v2-sv-seguridad { background: rgba(var(--bs-warning-rgb), .15); border-color: rgba(var(--bs-warning-rgb), .4); }
html[data-bs-theme=dark] .v2-sv-pax-origen { background: rgba(255, 255, 255, .04); }
html[data-bs-theme=dark] .v2-sv-pax-lista { background: rgba(0, 0, 0, .2); }
html[data-bs-theme=dark] .v2-sv-fechas { border-color: var(--bs-border-color-translucent); }

/* 06/10/2026: ABC de Servicios (lista v2). */
.v2-sl-celda { white-space: normal; line-height: 1.25; }
.v2-sl-op { white-space: normal; } /* 24/10/2026: el nombre baja de renglon en los espacios (antes se cortaba) */
.v2-sl-alerta { cursor: help; }
.v2-sl-ok { color: #198754; }
.v2-sl-rojo { color: #dc3545; }
.v2-sl-azul { color: #0d6efd; }
.v2-sl-menu { min-width: 12rem; }
.tabulator .tabulator-row.v2-sl-fila-mant { background-color: rgba(108, 117, 125, .18); }
.tabulator .tabulator-row.v2-sl-fila-res { color: #997404; }
.tabulator .tabulator-row.v2-sl-fila-ahora, .tabulator .tabulator-row.v2-sl-fila-ahora.tabulator-row-even { background-color: #d1f0dc; box-shadow: inset 3px 0 0 #198754; }
html[data-bs-theme=dark] .v2-sl-ok { color: #75b798; }
html[data-bs-theme=dark] .v2-sl-rojo { color: #ea868f; }
html[data-bs-theme=dark] .v2-sl-azul { color: #6ea8fe; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-sl-fila-mant { background-color: rgba(173, 181, 189, .16); }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-sl-fila-res { color: #ffda6a; }

/* 06/10/2026 (rehecho 11/10/2026): Estadisticas > Fluidos. Tanque de vidrio transparente con liquido animado (informe_comb/calculos.js `svgTanque`). */
.v2-ic-tanques { display: flex; flex-wrap: wrap; gap: 1rem; justify-content: center; }
.v2-ic-tanque { width: 150px; }
.v2-ic-cil { width: 120px; height: 190px; overflow: visible; }
.v2-ic-base { fill: var(--bs-body-color); opacity: .08; }
.v2-ic-vidrio-borde { stop-color: var(--bs-body-color); stop-opacity: .13; }
.v2-ic-vidrio-centro { stop-color: var(--bs-body-color); stop-opacity: .025; }
.v2-ic-s-C-0 { stop-color: #c4851a; } .v2-ic-s-C-1 { stop-color: #f2bd52; }
.v2-ic-s-A-0 { stop-color: #8fae27; } .v2-ic-s-A-1 { stop-color: #d2ec62; }
html[data-bs-theme=dark] .v2-ic-s-C-0 { stop-color: #a86f12; } html[data-bs-theme=dark] .v2-ic-s-C-1 { stop-color: #e0a63f; }
html[data-bs-theme=dark] .v2-ic-s-A-0 { stop-color: #789422; } html[data-bs-theme=dark] .v2-ic-s-A-1 { stop-color: #b9d44c; }
.v2-ic-superficie { opacity: .9; stroke: #fff; stroke-opacity: .45; stroke-width: 1; }
.v2-ic-sup-C { fill: #f8d98f; } .v2-ic-sup-A { fill: #e4f693; }
html[data-bs-theme=dark] .v2-ic-sup-C { fill: #e8b657; } html[data-bs-theme=dark] .v2-ic-sup-A { fill: #c8e062; }
.v2-ic-onda { fill: none; stroke: #fff; stroke-width: 1.2; opacity: 0; }
.v2-ic-brillo { fill: #fff; opacity: .38; }
.v2-ic-brillo-fino { opacity: .2; }
html[data-bs-theme=dark] .v2-ic-brillo { opacity: .22; } html[data-bs-theme=dark] .v2-ic-brillo-fino { opacity: .12; }
.v2-ic-burbuja { fill: #fff; opacity: 0; }
.v2-ic-marca { stroke: var(--bs-body-color); stroke-opacity: .4; stroke-width: 1; }
.v2-ic-borde { fill: none; stroke: var(--bs-secondary-color); stroke-width: 1.8; stroke-linejoin: round; }
.v2-ic-borde-fino { stroke-width: 1; opacity: .5; }
.v2-ic-pct { fill: var(--bs-body-color); font-size: 17px; font-weight: 700; paint-order: stroke; stroke: var(--bs-body-bg); stroke-opacity: .8; stroke-width: 3px; }
@media (prefers-reduced-motion: no-preference) {
  .v2-ic-nivel { animation: v2-ic-llenar 1.6s cubic-bezier(.22, .8, .3, 1) both; }
  .v2-ic-superficie { transform-box: fill-box; transform-origin: center; animation: v2-ic-balanceo 4.5s ease-in-out infinite alternate; }
  .v2-ic-onda { transform-box: fill-box; transform-origin: center; animation: v2-ic-ondular 3.4s ease-out infinite; }
  .v2-ic-onda-2 { animation-delay: 1.7s; }
  .v2-ic-burbuja { animation: v2-ic-subir 4.2s ease-in infinite; }
}
@media (max-width: 575.98px) { .v2-ic-tanques { gap: .5rem; } .v2-ic-tanque { width: 46%; max-width: 150px; } .v2-ic-cil { width: 104px; height: 165px; } }
@keyframes v2-ic-llenar { from { transform: translateY(var(--v2-baja)); } to { transform: translateY(0); } }
@keyframes v2-ic-balanceo { from { transform: translateX(-2px) scale(1, 1.08); } to { transform: translateX(2px) scale(1, .92); } }
@keyframes v2-ic-ondular { from { transform: scale(.45); opacity: .55; } to { transform: scale(1.05); opacity: 0; } }
@keyframes v2-ic-subir { 0% { transform: translateY(0); opacity: 0; } 12% { opacity: .65; } 100% { transform: translateY(calc(var(--v2-sube) * -1)); opacity: 0; } }

/* 06/10/2026: Estadisticas > Informe de Servicios / Servicios Admin (v2). */
.v2-isv-tot { display: flex; flex-direction: column; padding: .5rem .75rem; border: 1px solid var(--bs-success-border-subtle); border-radius: .5rem; background: var(--bs-success-bg-subtle); color: var(--bs-body-color); }
.v2-isv-tot strong { font-size: 1.1rem; }
.v2-isv-gps { color: #0d6efd; }
.v2-isv-tramite { color: #6f6fe0; font-size: .85em; }
.tabulator .tabulator-row.v2-isv-baja { color: var(--bs-secondary-color); text-decoration: line-through; background-color: rgba(220, 53, 69, .08); }
html[data-bs-theme=dark] .v2-isv-tot { background: rgba(var(--bs-success-rgb), .15); border-color: rgba(var(--bs-success-rgb), .4); }
html[data-bs-theme=dark] .v2-isv-gps { color: #6ea8fe; }
html[data-bs-theme=dark] .v2-isv-tramite { color: #a5a5f5; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-isv-baja { background-color: rgba(234, 134, 143, .12); }

/* 06/10/2026: Estadisticas_kpi > Estadistica (tarjetas de totales y tableros de graficos, estadistica/*.js). */
.v2-est-kpi { --est-color: #0aa2c0; position: relative; display: flex; flex-direction: column; height: 100%; border-radius: .5rem; overflow: hidden; color: #fff; background: var(--est-color); box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .18); }
.v2-est-kpi-aqua { --est-color: #0aa2c0; }
.v2-est-kpi-green { --est-color: #198754; }
.v2-est-kpi-yellow { --est-color: #b98600; }
.v2-est-kpi-red { --est-color: #c9302c; }
.v2-est-kpi-cuerpo { display: flex; align-items: center; justify-content: space-between; padding: .75rem 1rem .25rem; }
.v2-est-kpi-num { font-size: 2.25rem; font-weight: 700; line-height: 1.1; }
.v2-est-kpi-icono { font-size: 2.5rem; opacity: .35; }
.v2-est-kpi-sub { padding: 0 1rem; font-size: .85rem; }
.v2-est-kpi-pie { display: block; width: 100%; margin-top: auto; padding: .4rem 1rem; border: 0; text-align: center; color: #fff; background: rgba(0, 0, 0, .15); font-size: .9rem; }
button.v2-est-kpi-pie { cursor: pointer; }
button.v2-est-kpi-pie:hover, button.v2-est-kpi-pie:focus-visible { background: rgba(0, 0, 0, .3); }
.v2-est-kpi-pie-fijo { cursor: default; }
.v2-est-kpi.v2-est-activa { outline: 3px solid var(--bs-primary); outline-offset: 2px; }
.v2-est-titulo { text-align: center; color: var(--bs-secondary-color); font-weight: 600; margin: .5rem 0; }
h3.v2-est-titulo { font-size: 1.1rem; }
h4.v2-est-titulo { font-size: 1rem; }
.v2-est-slot:empty { display: none; }
.v2-est-ind { text-align: center; }
.v2-est-ind-titulo { font-size: .8rem; font-weight: 600; letter-spacing: .03em; color: var(--bs-secondary-color); margin: 0; }
.v2-est-ind-var { display: block; font-size: .85rem; }
.v2-est-ind-valor { font-size: 1.25rem; font-weight: 700; margin: 0; }
.v2-est-ref { text-align: center; padding: .25rem 0 .5rem; }
.v2-est-ref-item { display: inline-block; margin: 0 .6rem; white-space: nowrap; color: var(--bs-body-color); }
.v2-est-ref-raya { display: inline-block; width: 1rem; border-top: 2px solid; margin-right: .25rem; vertical-align: middle; }
html[data-bs-theme=dark] .v2-est-kpi { box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .5); }
html[data-bs-theme=dark] .v2-est-kpi-aqua { --est-color: #0b7285; }
html[data-bs-theme=dark] .v2-est-kpi-green { --est-color: #146c43; }
html[data-bs-theme=dark] .v2-est-kpi-yellow { --est-color: #8a6500; }
html[data-bs-theme=dark] .v2-est-kpi-red { --est-color: #a52a2a; }

/* ==== Estadisticas > Presupuestos (v2, 06/10/2026): color de fila por estado (los de la clasica sobre blanco) + variante oscura ==== */
.tabulator .tabulator-row.v2-ip-fila-S .tabulator-cell { background-color: #cfdd81; color: #1b1b1b; }
.tabulator .tabulator-row.v2-ip-fila-N .tabulator-cell { background-color: #ffa6a6; color: #1b1b1b; }
.tabulator .tabulator-row.v2-ip-fila-P .tabulator-cell { background-color: #faffb4; color: #1b1b1b; }
.tabulator .tabulator-row.v2-ip-fila-W .tabulator-cell { background-color: #fdff7a; color: #1b1b1b; }
.tabulator .tabulator-row.v2-ip-fila-X .tabulator-cell { background-color: #b5fcb5; color: #1b1b1b; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-ip-fila-S .tabulator-cell { background-color: #4a5a1b !important; color: #f0f5d8; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-ip-fila-N .tabulator-cell { background-color: #6b2323 !important; color: #ffe3e3; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-ip-fila-P .tabulator-cell { background-color: #5c5a2a !important; color: #fffbd0; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-ip-fila-W .tabulator-cell { background-color: #6b6a14 !important; color: #fffde0; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-ip-fila-X .tabulator-cell { background-color: #1f5a2a !important; color: #e0ffe5; }
.v2-accion.v2-ip-verificar { color: #dd6007; } .v2-accion.v2-ip-imprimir { color: #00a65a; }

/* ==== Administracion > Clientes y Contratos (v2, 06/10/2026) ==== */
.v2-accion.v2-emp-reset, .v2-accion.v2-vou-imprimir { color: #00a65a; }
.v2-accion.v2-emp-link { color: #3c8dbc; }
.v2-accion.v2-emp-gps { color: #dd4b39; }
.v2-vou-miniatura { max-height: 48px; max-width: 99px; width: auto; height: auto; border-radius: .25rem; cursor: zoom-in; background: #fff; }
.v2-vou-logo { max-height: 90px; max-width: 160px; width: auto; height: auto; border-radius: .25rem; background: #fff; }
.v2-vou-logo[hidden] { display: none; }
.v2-vou-grilla { max-height: 50vh; overflow: auto; border: 1px solid var(--bs-border-color); border-radius: .375rem; }
.v2-vou-grilla thead th { position: sticky; top: 0; z-index: 1; background: var(--bs-tertiary-bg); white-space: nowrap; }
.v2-vou-grilla input[type=number] { min-width: 110px; }
html[data-bs-theme=dark] .v2-accion.v2-emp-reset, html[data-bs-theme=dark] .v2-accion.v2-vou-imprimir { color: #4cc790; }
html[data-bs-theme=dark] .v2-accion.v2-emp-link { color: #6ea8fe; }
html[data-bs-theme=dark] .v2-accion.v2-emp-gps { color: #ea868f; }
html[data-bs-theme=dark] .v2-vou-miniatura, html[data-bs-theme=dark] .v2-vou-logo { background: #f8f9fa; }

/* ---- Administracion v2: Bancos y Cuentas contables ---- */
.v2-buscar-caja { min-width: 220px; }
.v2-bco-logo { height: 80px; max-width: 100%; object-fit: contain; }
.v2-bco-logo-link { cursor: pointer; }
.v2-bco-foto-prev { max-height: 120px; max-width: 100%; object-fit: contain; }
.v2-bco-nota { font-size: .85rem; color: #6c757d; }
.v2-bco-panel { border: 1px solid #dee2e6; border-radius: .375rem; padding: .75rem; background: #f8f9fa; }
.v2-bco-col-acc { white-space: nowrap; width: 1%; }
.v2-cc-contenedor { max-height: 90vh; overflow: auto; }
.v2-cc-arbol, .v2-cc-hijos { list-style: none; margin: 0; padding-left: 0; }
.v2-cc-hijos { display: none; padding-left: 1.25rem; }
.v2-cc-abierto > .v2-cc-hijos { display: block; }
.v2-cc-nodo { display: flex; align-items: center; gap: .35rem; padding: .15rem .35rem; border-radius: .25rem; cursor: pointer; }
.v2-cc-nodo:hover { background: #e9ecef; }
.v2-cc-nodo:focus-visible { outline: 2px solid #0d6efd; }
.v2-cc-toggle { display: inline-block; width: 1rem; text-align: center; }
.v2-cc-sel { background: #cfe2ff; }
.v2-cc-hit .v2-cc-texto { background: #fff3cd; font-weight: 600; }
.v2-cc-clase { margin-left: auto; }
.v2-cc-ayuda { font-size: .85rem; color: #6c757d; }
html[data-bs-theme=dark] .v2-bco-nota, html[data-bs-theme=dark] .v2-cc-ayuda { color: #adb5bd; }
html[data-bs-theme=dark] .v2-bco-panel { border-color: #495057; background: #212529; }
html[data-bs-theme=dark] .v2-cc-nodo:hover { background: #343a40; }
html[data-bs-theme=dark] .v2-cc-sel { background: #1a3a6b; }
html[data-bs-theme=dark] .v2-cc-hit .v2-cc-texto { background: #664d03; color: #fff; }

/* ---- Administracion v2: Centro de costos ---- */
.v2-cco-scroll { max-height: 70vh; overflow: auto; }
.v2-cco-tabla { border-collapse: separate; border-spacing: 0; font-size: .8rem; }
.v2-cco-tabla th, .v2-cco-tabla td { padding: 4px 6px; vertical-align: middle; text-align: center; }
.v2-cco-tabla thead th { position: sticky; top: 0; z-index: 2; background: #212529; color: #fff; white-space: nowrap; }
.v2-cco-tabla tbody th, .v2-cco-tabla tfoot th { position: sticky; left: 0; z-index: 1; background: #fff; text-align: left; border-right: 1px solid #ccc; box-shadow: 1px 0 0 0 #ccc; min-width: 160px; }
.v2-cco-tabla thead th:first-child { left: 0; z-index: 3; }
.v2-cco-celda { background: #d0defd; color: #000; }
.v2-cco-pie { border: 1px solid gray; border-radius: 3px; padding: 5px; text-align: center; white-space: nowrap; }
.v2-cco-tabla tfoot td, .v2-cco-tabla tfoot th { font-weight: 700; }
html[data-bs-theme=dark] .v2-cco-tabla tbody th, html[data-bs-theme=dark] .v2-cco-tabla tfoot th { background: #212529; color: #dee2e6; border-right-color: #495057; box-shadow: 1px 0 0 0 #495057; }
html[data-bs-theme=dark] .v2-cco-tabla thead th { background: #000; }
html[data-bs-theme=dark] .v2-cco-celda { background: #1a3a6b; color: #e9ecef; }
html[data-bs-theme=dark] .v2-cco-pie { border-color: #6c757d; }

/* ==== Administracion > Facturas (v2, 06/10/2026) ==== */
.v2-accion.v2-fa-conf { color: #49b73b; } .v2-accion.v2-fa-print { color: #00a65a; } .v2-accion.v2-fa-mail { color: #c99a1c; }
.v2-fa-est { white-space: nowrap; font-weight: 600; }
.v2-fa-est-ok { color: #198754; } .v2-fa-est-pend { color: #d9822b; } .v2-fa-est-rech { color: #dc3545; } .v2-fa-est-na { color: #0d6efd; }
.v2-fa-pasajes { white-space: pre-line; font-size: .85em; color: var(--bs-secondary-color); }
.v2-fa-seccion { background: var(--bs-info-bg-subtle); color: var(--bs-info-text-emphasis); text-align: center; padding: .5rem; border-radius: .375rem; text-transform: uppercase; font-size: .85rem; margin: 1rem 0 .75rem; }
html[data-bs-theme=dark] .v2-fa-est-ok { color: #75b798; } html[data-bs-theme=dark] .v2-fa-est-pend { color: #f0ad60; }
html[data-bs-theme=dark] .v2-fa-est-rech { color: #ea868f; } html[data-bs-theme=dark] .v2-fa-est-na { color: #6ea8fe; }
html[data-bs-theme=dark] .v2-accion.v2-fa-mail { color: #edbd4d; }

/* Compras: Nomenclador (v2-nom-) y Stock (v2-stk-) - 06/10/2026 */
.v2-accion.v2-nom-carpeta { color: #fb9e0b; }
.v2-accion.v2-stk-excel { color: #60bc3c; }
.v2-nom-pasos { margin-bottom: 1rem; }
.v2-nom-paso { display: flex; flex-direction: column; align-items: center; flex: 0 0 90px; }
.v2-nom-circulo { width: 28px; height: 28px; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: .85rem; background: var(--bs-secondary-bg); color: var(--bs-secondary-color); }
.v2-nom-paso-txt { font-size: .8rem; margin-top: .25rem; color: var(--bs-secondary-color); }
.v2-nom-activo .v2-nom-circulo { background: var(--bs-primary); color: #fff; }
.v2-nom-activo .v2-nom-paso-txt { color: var(--bs-body-color); font-weight: 600; }
.v2-nom-hecho .v2-nom-circulo { background: var(--bs-info-bg-subtle); color: var(--bs-info-text-emphasis); }
.v2-nom-linea { flex: 1; height: 2px; background: var(--bs-border-color); margin-top: -1rem; }
.v2-stk-flecha { transition: transform .3s; }
[aria-expanded="true"] > .v2-stk-flecha { transform: rotate(90deg); }
html[data-bs-theme=dark] .v2-accion.v2-nom-carpeta { color: #ffc107; }
html[data-bs-theme=dark] .v2-accion.v2-stk-excel { color: #4cc790; }

/* 06/10/2026: Mantenimiento > Proveedores v2 - fila "a revisar" (amarillo, como la clasica) y acciones de precios. */
.tabulator .tabulator-row.v2-prov-revisar .tabulator-cell { background-color: var(--bs-warning-bg-subtle); }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-prov-revisar .tabulator-cell { background-color: rgba(var(--bs-warning-rgb), .18); }
.v2-accion.v2-prov-precios-bajar { color: var(--bs-info); } .v2-accion.v2-prov-precios-subir { color: var(--bs-success); }
html[data-bs-theme=dark] .v2-accion.v2-prov-precios-bajar { color: #6edff6; } html[data-bs-theme=dark] .v2-accion.v2-prov-precios-subir { color: #75b798; }

/* 06/10/2026: Compras > Insumos v2 (productos/list.js, form.js, multi.js). */
.v2-accion.v2-prod-qr { color: var(--bs-body-color); } .v2-accion.v2-prod-kpi { color: var(--bs-primary); }
#v2-prod-tabla .v2-accion.clonar { color: var(--bs-success); }
html[data-bs-theme=dark] .v2-accion.v2-prod-kpi { color: #6ea8fe; }
.v2-prod-foto { cursor: pointer; border-radius: 4px; }
.v2-prod-panel { padding: 1rem; border-radius: .5rem; background: var(--bs-primary-bg-subtle); color: var(--bs-body-color); }
html[data-bs-theme=dark] .v2-prod-panel { background: rgba(var(--bs-primary-rgb), .18); }
.v2-prod-previa { max-width: 50%; max-height: 240px; object-fit: contain; }

/* Remitos v2 (06/10/2026): color de la fila segun el estado + tarjetas de insumos del formulario */
.tabulator .tabulator-row.v2-rem-fila-cerrado .tabulator-cell { background-color: rgb(204, 255, 203); color: #1b1b1b; }
.tabulator .tabulator-row.v2-rem-fila-abierto .tabulator-cell { background-color: #ffffb4; color: #1b1b1b; }
.tabulator .tabulator-row.v2-rem-fila-pendiente .tabulator-cell { background-color: #ffc4c4; color: #1b1b1b; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-rem-fila-cerrado .tabulator-cell { background-color: #1e4d2b !important; color: #e6f4ea; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-rem-fila-abierto .tabulator-cell { background-color: #5c5320 !important; color: #fff7cc; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-rem-fila-pendiente .tabulator-cell { background-color: #6b2b2b !important; color: #ffe3e3; }
.tabulator .tabulator-row[class*=v2-rem-fila-] .tabulator-cell a { color: inherit; }
.v2-accion.v2-rem-conf { color: #0d6efd; } .v2-accion.v2-rem-print { color: #00a65a; } .v2-accion.v2-rem-conf2 { color: #49b73b; }
html[data-bs-theme=dark] .v2-accion.v2-rem-conf { color: #6ea8fe; } html[data-bs-theme=dark] .v2-accion.v2-rem-print { color: #4cc790; }
.v2-rem-insumos { white-space: nowrap; }
.v2-rem-item { background: var(--bs-tertiary-bg); border-style: dotted !important; }
.v2-rem-item.v2-rem-item-movido { background: rgba(76, 124, 76, .2); }

/* Compras > Solicitudes v2 (SOL-A): colores de las acciones de la fila (los de la clasica) con variante oscura. */
.v2-accion.sol-hist { color: #0085ff; } .v2-accion.sol-buy, .v2-accion.sol-print { color: #00a65a; } .v2-accion.sol-aja { color: var(--bs-secondary-color); }
.v2-accion.sol-conf { color: #3c8dbc; } .v2-accion.sol-rem, .v2-accion.sol-fact { color: #a62cf3; } .v2-accion.sol-repro { color: #00a65a; }
html[data-bs-theme=dark] .v2-accion.sol-hist { color: #6cb2ff; } html[data-bs-theme=dark] .v2-accion.sol-buy, html[data-bs-theme=dark] .v2-accion.sol-print,
html[data-bs-theme=dark] .v2-accion.sol-repro { color: #4cc790; } html[data-bs-theme=dark] .v2-accion.sol-rem, html[data-bs-theme=dark] .v2-accion.sol-fact { color: #c58bf7; }

/* ===================== MENU LATERAL ===================== */
#v2-menu .sidebar-brand { height: 3.5rem; }
/* Buscador del menu (10/10/2026): fijo bajo el logo; el menu lleva el scroll. */
#v2-menu .v2-menu-buscar { flex: none; padding: .5rem .75rem .25rem; }
#v2-menu .v2-menu-buscar .form-control { border-radius: .65rem 0 0 .65rem; }
#v2-menu .v2-menu-buscar .input-group-text { border-radius: 0 .65rem .65rem 0; }
#v2-menu .v2-menu-sin-resultados { padding: .5rem .25rem 0; }
#v2-menu .nav-link p { white-space: normal; }
/* Iconos: una sola familia (FontAwesome, monocromatica) con el color del texto del tema -> contrastan en claro y oscuro; el elegido toma el color primario. */
#v2-menu .sidebar-menu .nav-icon { font-size: 1.05rem; width: 1.5rem; flex: 0 0 1.5rem; text-align: center; color: var(--bs-body-color); opacity: .88; }
#v2-menu .sidebar-menu .nav-treeview .nav-icon { font-size: .95rem; }
#v2-menu .sidebar-menu .nav-link:hover .nav-icon, #v2-menu .sidebar-menu .nav-link.active .nav-icon, #v2-menu .sidebar-menu .nav-link.v2-menu-padre-activo .nav-icon { opacity: 1; }

/* Menu lateral estilo "glass" (10/10/2026): el item elegido es un vidrio esmerilado con borde claro; el padre del item elegido lleva un vidrio mas suave
   y los hijos cuelgan de una guia vertical, asi se distingue el padre de sus hijos. Sin backdrop-filter (navegadores viejos) queda el fondo translucido. */
#v2-menu {
  --v2-glass-borde: rgba(255, 255, 255, .55); --v2-glass-brillo: rgba(255, 255, 255, .55); --v2-glass-sombra: rgba(var(--bs-primary-rgb), .28);
  --lte-sidebar-menu-active-bg: transparent; --lte-sidebar-menu-active-color: var(--bs-emphasis-color);
  background-image: radial-gradient(120% 55% at 0% 0%, rgba(var(--bs-primary-rgb), .20), transparent 62%), radial-gradient(110% 50% at 100% 100%, rgba(var(--bs-info-rgb), .16), transparent 62%);
}
html[data-bs-theme=dark] #v2-menu { --v2-glass-borde: rgba(255, 255, 255, .22); --v2-glass-brillo: rgba(255, 255, 255, .18); --v2-glass-sombra: rgba(0, 0, 0, .45); }
#v2-menu .sidebar-menu .nav-link { border: 1px solid transparent; border-radius: .65rem; margin: .12rem .5rem; transition: background-color .2s, box-shadow .2s, border-color .2s; }
#v2-menu .sidebar-menu .nav-link:hover { background-color: rgba(var(--bs-body-color-rgb), .07); }
#v2-menu .sidebar-menu .nav-link .nav-icon { transition: color .2s, transform .2s; }
#v2-menu .sidebar-menu .nav-link:hover .nav-icon { transform: scale(1.08); }
/* hijos colgados de una guia vertical bajo su padre */
#v2-menu .nav-treeview { margin: .1rem .5rem .4rem 1.5rem; padding-left: .25rem; border-left: 2px solid rgba(var(--bs-primary-rgb), .35); }
#v2-menu .nav-treeview .nav-link { margin: .1rem .25rem; }
/* padre abierto o con el item elegido adentro: vidrio suave */
#v2-menu .sidebar-menu > .nav-item.menu-open > .nav-link, #v2-menu .sidebar-menu > .nav-item > .nav-link.v2-menu-padre-activo {
  background-color: rgba(var(--bs-body-color-rgb), .08); border-color: var(--v2-glass-borde);
  -webkit-backdrop-filter: blur(8px) saturate(150%); backdrop-filter: blur(8px) saturate(150%); box-shadow: inset 0 1px 0 var(--v2-glass-brillo);
}
#v2-menu .sidebar-menu > .nav-item > .nav-link.v2-menu-padre-activo { font-weight: 600; }
#v2-menu .sidebar-menu > .nav-item > .nav-link.v2-menu-padre-activo .nav-icon { color: var(--bs-primary); }
/* item elegido: vidrio fuerte con brillo y sombra de color */
#v2-menu .sidebar-menu .nav-link.active, #v2-menu .sidebar-menu > .nav-item.menu-open > .nav-link.active {
  color: var(--bs-emphasis-color); font-weight: 600; background-color: rgba(var(--bs-primary-rgb), .24); border-color: var(--v2-glass-borde);
  -webkit-backdrop-filter: blur(12px) saturate(180%); backdrop-filter: blur(12px) saturate(180%);
  box-shadow: 0 6px 16px var(--v2-glass-sombra), inset 0 1px 0 var(--v2-glass-brillo);
}
#v2-menu .sidebar-menu .nav-link.active .nav-icon { color: var(--bs-primary); }
html[data-bs-theme=dark] #v2-menu .sidebar-menu .nav-link.active { background-color: rgba(var(--bs-primary-rgb), .34); }
html[data-bs-theme=dark] #v2-menu .sidebar-menu .nav-link.active .nav-icon, html[data-bs-theme=dark] #v2-menu .sidebar-menu > .nav-item > .nav-link.v2-menu-padre-activo .nav-icon { color: var(--bs-primary-text-emphasis); }
@media (prefers-reduced-motion: reduce) { #v2-menu .sidebar-menu .nav-link, #v2-menu .sidebar-menu .nav-link .nav-icon { transition: none; } #v2-menu .sidebar-menu .nav-link:hover .nav-icon { transform: none; } }

/* LOGO DE EMPRESA Y ALERTAS GLOBALES */
#v2-menu .v2-logo-empresa { max-height: 40px; max-width: 200px; object-fit: contain; background: #fafafa; border-radius: 4px; padding: 2px; }
[data-v2-aviso="clave"] { cursor: pointer; }
.v2-cumple-foto { width: 150px; height: 150px; object-fit: cover; border-radius: 50%; }

/* ONBOARDING FLOTANTE (07/10/2026): debajo de los modales de Bootstrap 5 (backdrop 1050, modal 1055). */
.v2-onb-fab { position: fixed; right: 20px; bottom: 20px; z-index: 1030; opacity: .55; transition: opacity .2s ease; }
.v2-onb-fab:hover, .v2-onb-fab.v2-onb-abierto { opacity: 1; }
.v2-onb-btn { width: 52px; height: 52px; }
.v2-onb-panel { position: absolute; right: 0; bottom: 62px; width: min(340px, calc(100vw - 40px)); }
.v2-onb-cerrar { position: absolute; top: -8px; left: -8px; width: 22px; height: 22px; padding: 0; line-height: 1; font-size: 14px; }
.v2-onb-reabrir { position: fixed; right: 0; bottom: 30px; z-index: 1030; border-radius: .375rem 0 0 .375rem; opacity: .55; }
.v2-onb-reabrir:hover { opacity: 1; }
.v2-onb-historial ul { margin: 2px 0 6px 16px; padding: 0; }
/* 07/10/2026: restriccion_butacas. */
.v2-rb-num { width: 5rem; }
.v2-rb-hora { width: 8rem; }
.v2-rb-scroll { max-height: 60vh; overflow: auto; }

/* LOGIN v2 (08/10/2026) */
.v2-lg-wrap { min-height: calc(100vh - 3rem); display: flex; align-items: center; justify-content: center; }
.v2-lg-card { width: 100%; max-width: 420px; }
.v2-lg-logo { max-height: 120px; cursor: pointer; background: #fff; border-radius: .5rem; padding: .5rem; }
.v2-lg-hp { position: absolute; left: -9999px; top: -9999px; width: 1px; height: 1px; opacity: 0; overflow: hidden; }
.v2-lg-tema { position: fixed; top: .5rem; right: .75rem; z-index: 10; }

/* 08/10/2026: paginas publicas pax y reservar v2. */
.v2-pax-logo, .v2-res-logo { max-height: 90px; max-width: 220px; object-fit: contain; }

/* 08/10/2026: portales publicos del proveedor (ofer y comprobante de OC). */
.v2-ofer-logo { width: 150px; max-width: 60%; }
.v2-ofer-totales { position: sticky; bottom: 0; z-index: 1020; box-shadow: 0 -2px 8px rgba(0, 0, 0, .15); max-height: 70vh; overflow-y: auto; }
.v2-ofer-totales summary { cursor: pointer; list-style: none; }
.v2-ofer-totales summary::-webkit-details-marker { display: none; }
.v2-ocp-logo { height: 56px; max-width: 60%; object-fit: contain; }
.v2-ocp-foto { max-height: 200px; cursor: pointer; }
.v2-ocp-ocs { max-height: 250px; overflow-y: auto; }
.v2-doc-html { background: #fff; color: #212529; padding: .5rem; overflow-x: auto; }

/* 08/10/2026: sitio publico de venta de pasajes (viaje/*) v2. */
.v2-vj-top { background: #333; }
.v2-vj-fb { color: #3b5998; background: #dfe3ee; width: 40px; text-align: center; font-size: 26px; line-height: 1.2; }
.v2-vj-logos img { max-width: 100%; height: auto; }
/* 21/10/2026 (pedido de Franco): se distingue TITULO (texto con linea de marca, sin relleno) de BOTON (relleno de marca, sombra, flecha, relieve al pasar).
   Antes titulos, banda y botones eran bloques rojos iguales y no se sabia que se podia presionar. */
.v2-vj-seccion { background: var(--bs-secondary-bg); color: #d03808; border-bottom: 3px solid #d03808; letter-spacing: .04em; text-transform: uppercase; font-size: .85rem; }
[data-bs-theme="dark"] .v2-vj-seccion { color: #ff9a78; }
.v2-vj-titulo { background: transparent; color: var(--bs-body-color); padding: .25rem .25rem .6rem; border-bottom: 3px solid #d03808; border-radius: 0; text-align: center; font-weight: 500; letter-spacing: .02em; }
.v2-vj-titulo strong { color: #d03808; }
[data-bs-theme="dark"] .v2-vj-titulo strong { color: #ff7a4d; }
.v2-vj-btn { --bs-btn-color: #fff; --bs-btn-bg: #d03808; --bs-btn-border-color: #d03808; --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #a72800; --bs-btn-hover-border-color: #a72800; --bs-btn-active-color: #fff; --bs-btn-active-bg: #8f2200; --bs-btn-active-border-color: #8f2200; --bs-btn-focus-shadow-rgb: 208, 56, 8; border-radius: 1.5rem; }
.v2-vj-btn { font-weight: 600; letter-spacing: .02em; box-shadow: 0 3px 0 #8f2200, 0 6px 12px rgba(0,0,0,.25); transition: transform .12s ease, box-shadow .12s ease, background-color .12s ease; }
.v2-vj-btn:hover:not(:disabled):not(.disabled) { transform: translateY(-2px); box-shadow: 0 5px 0 #8f2200, 0 9px 16px rgba(0,0,0,.3); }
.v2-vj-btn:active:not(:disabled):not(.disabled) { transform: translateY(2px); box-shadow: 0 1px 0 #8f2200; }
.v2-vj-btn:disabled, .v2-vj-btn.disabled { box-shadow: none; opacity: .55; }
.v2-vj-btn-flecha::after { content: "\203A"; display: inline-block; margin-left: .5rem; font-size: 1.4em; line-height: 1; vertical-align: -.1em; transition: transform .15s ease; }
.v2-vj-btn-flecha:hover::after { transform: translateX(4px); }
/* Boton secundario (contorno): acciones que no son el camino principal, p.ej. ingresar un codigo de grupo cerrado */
.v2-vj-btn-sec { --bs-btn-color: #d03808; --bs-btn-bg: transparent; --bs-btn-border-color: #d03808; --bs-btn-hover-color: #fff; --bs-btn-hover-bg: #d03808; --bs-btn-hover-border-color: #d03808; --bs-btn-active-color: #fff; --bs-btn-active-bg: #a72800; --bs-btn-active-border-color: #a72800; border-width: 2px; box-shadow: none; }
[data-bs-theme="dark"] .v2-vj-btn-sec { --bs-btn-color: #ff7a4d; --bs-btn-border-color: #ff7a4d; }
.v2-vj-btn-sec:hover:not(:disabled) { box-shadow: 0 4px 10px rgba(0,0,0,.3); }
/* Guia: aro que late sobre el siguiente paso recomendado */
@keyframes v2-vj-late { 0% { box-shadow: 0 3px 0 #8f2200, 0 0 0 0 rgba(255,122,77,.7); } 70% { box-shadow: 0 3px 0 #8f2200, 0 0 0 14px rgba(255,122,77,0); } 100% { box-shadow: 0 3px 0 #8f2200, 0 0 0 0 rgba(255,122,77,0); } }
.v2-vj-guia { animation: v2-vj-late 1.8s ease-out infinite; }
.v2-vj-paso-num { display: inline-flex; align-items: center; justify-content: center; width: 1.7rem; height: 1.7rem; margin-right: .5rem; border-radius: 50%; background: #d03808; color: #fff; font-size: .95rem; font-weight: 700; }
.v2-vj-ayuda { color: var(--bs-secondary-color); font-size: .9rem; }
.v2-vj-lista .list-group-item-action { border-left: 4px solid transparent; padding-right: 2.2rem; position: relative; }
.v2-vj-lista a.list-group-item-action:not(.disabled)::after { content: "\203A"; position: absolute; right: .9rem; top: 50%; transform: translateY(-50%); font-size: 1.8rem; color: #d03808; transition: right .15s ease; }
.v2-vj-lista a.list-group-item-action:not(.disabled):hover, .v2-vj-lista a.list-group-item-action:not(.disabled):focus-visible { border-left-color: #d03808; background: var(--bs-warning-bg-subtle); }
.v2-vj-lista a.list-group-item-action:not(.disabled):hover::after { right: .6rem; }
@media (prefers-reduced-motion: reduce) { .v2-vj-guia { animation: none; } .v2-vj-btn, .v2-vj-btn-flecha::after { transition: none; } .v2-vj-btn:hover:not(:disabled):not(.disabled) { transform: none; } }
.v2-vj-rojo { color: #d8251c; font-size: 1.15rem; font-weight: 600; }
.v2-vj-lista { max-height: 24rem; overflow-y: auto; }
.v2-vj-lista .disabled .v2-vj-rojo { color: var(--bs-secondary-color); }
.v2-vj-cv img { max-width: 100%; height: auto; opacity: .7; transition: opacity .6s ease; }
.v2-vj-cv:hover img, .v2-vj-cv:focus img { opacity: 1; }
.v2-vj-pie { border-radius: .25rem; overflow: hidden; }
.v2-vj-pie-logo { max-width: 440px; width: 100%; height: auto; }
.v2-vj-copy { background: #000; color: #fff; }
html[data-bs-theme=dark] .tabulator .tabulator-row.v2-sl-fila-ahora, html[data-bs-theme=dark] .tabulator .tabulator-row.v2-sl-fila-ahora.tabulator-row-even { background-color: rgba(25, 135, 84, .35); }
/* Menu de acciones con scroll propio (core/menu_scroll.js): el cuerpo se desplaza y las flechas flotantes avisan que hay mas opciones. */
.v2-menu-scroll { overflow-y: auto; overscroll-behavior: contain; scrollbar-width: thin; max-height: 70vh; }
.dropdown-menu[data-v2-menu-scroll] { overflow: visible; }
/* Tabulator trae transform:translateZ(0): vuelve contenedor de los position:fixed y el menu de acciones quedaba recortado dentro de la tabla. */
.tabulator { -webkit-transform: none; transform: none; }

/* Calendario multi-fecha (core/multifecha.js) */
.v2-multifecha-tabla { width: 100%; border-collapse: separate; border-spacing: 2px; table-layout: fixed; }
.v2-multifecha-tabla th { text-align: center; font-weight: 600; font-size: .75rem; color: var(--bs-secondary-color); padding-bottom: .25rem; }
.v2-multifecha-tabla td { padding: 0; }
.v2-multifecha-tabla .btn { width: 100%; padding: .25rem 0; }

/* Graficos Chart.js (core/graficos.js): el marco hace scroll horizontal si el lienzo pide ancho minimo (muchas columnas); el lienzo es el contenedor posicionado que Chart.js mide. */
.v2-graf { width: 100%; max-width: 100%; overflow-x: auto; overflow-y: hidden; }
.v2-graf-lienzo { position: relative; width: 100%; max-width: 100%; }
.v2-graf-lienzo > canvas { display: block; }
.v2-graf-titulo { text-align: center; font-weight: 600; font-size: .9rem; margin-bottom: .5rem; }
@media (max-width: 575.98px) { .v2-graf-lienzo { max-height: 70vh; } }
@media (prefers-reduced-motion: reduce) { .v2-graf-lienzo canvas { transition: none; } }

/* Personal (v2/chofer): columna fija de acciones/persona. En telefono se acota (maxWidth en list.js) y el contenido se parte en lineas:
   botones mas compactos, 4 por fila, y texto que baja de linea, para dejar ver las columnas de vencimientos. */
@media (max-width: 767.98px) {
  .tabulator .tabulator-cell.v2-ch-col-personal { white-space: normal; overflow-wrap: anywhere; padding: .25rem .35rem; }
  .v2-ch-col-personal .v2-ch-acciones { gap: .1rem; }
  .v2-ch-col-personal .v2-accion { padding: .2rem .3rem; font-size: 1.05rem; min-width: 32px; min-height: 32px; }
  .v2-ch-col-personal .v2-ch-miniatura { width: 32px; height: 32px; flex: 0 0 32px; }
  .v2-ch-col-personal .small { font-size: .72rem; }
}

/* Solicitud de compra v2: botones de disposicion de cada insumo (remito / autorizar / rechazar / expres): grandes y con texto */
.v2-disp-btn { font-weight: 600; padding: .45rem .85rem; }
.v2-disp-remito { --bs-btn-color: #8a1fd4; --bs-btn-border-color: #8a1fd4; --bs-btn-hover-bg: #8a1fd4; --bs-btn-hover-border-color: #8a1fd4; --bs-btn-hover-color: #fff; --bs-btn-active-bg: #8a1fd4; --bs-btn-active-border-color: #8a1fd4; --bs-btn-active-color: #fff; }

/* Tickets (13/10/2026): texto enriquecido del detalle y de las respuestas (HTML ya saneado por el servidor) */
.v2-tk-texto { overflow-wrap: anywhere; }
.v2-tk-texto img { max-width: 100%; height: auto; border-radius: .25rem; cursor: zoom-in; }
.v2-tk-texto table { max-width: 100%; }
.v2-tk-texto p:last-child { margin-bottom: 0; }

/* Celdas con lista de insumos (Solicitudes / Ordenes de compra, 13/10/2026): un insumo por renglon, el texto se parte en renglones y la columna no se ensancha */
.v2-celda-lista, .v2-celda-ancho { white-space: normal; overflow-wrap: break-word; min-width: 11rem; max-width: 22rem; }
.v2-celda-ancho { max-width: 28rem; }
.v2-celda-ancho .v2-celda-lista { max-width: none; min-width: 0; }
.v2-celda-lista-item + .v2-celda-lista-item { margin-top: .2rem; padding-top: .2rem; border-top: 1px dashed var(--bs-border-color); }

/* Menu de acciones de fila (core/menu_acciones.js, 13/10/2026): el icono conserva el color de `.v2-accion.<clase>` pero sin el relleno del boton suelto */
.v2-menu-acc .v2-accion { display: inline-block; padding: 0; font-size: inherit; cursor: inherit; }
.v2-menu-acc { white-space: nowrap; }
/* Columna congelada con menu de acciones abierto: sin esto las celdas congeladas de las filas de abajo se pintan encima del menu */
.tabulator .tabulator-cell.tabulator-frozen:has(.dropdown-menu.show) { z-index: 30; }

/* Tablas (Tabulator): el texto con espacios SALTA DE RENGLON en celdas y encabezados (13/10/2026, pedido de Federico) para ahorrar ancho de pantalla.
   Las columnas se ajustan al contenido pero la celda no pasa de 20rem y el titulo de 9rem; lo que no entra baja de renglon (un texto largo SIN espacios,
   ej. un mail, se parte en el limite en vez de cortarse con "..."). Lo que no debe partirse (botones de accion) lleva `text-nowrap` en su propio HTML. */
.tabulator .tabulator-cell, .tabulator .tabulator-row .tabulator-cell { white-space: normal; overflow-wrap: break-word; max-width: 20rem; }
.tabulator .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: break-word; max-width: 9rem; }

/* Personal: el CUIL se ve como texto pero un clic copia el DNI (13/10/2026) */
.v2-ch-cuil { font-size: inherit; line-height: inherit; text-align: left; text-decoration: underline dotted; text-underline-offset: 3px; color: inherit; cursor: copy; }
.v2-ch-cuil:hover { color: var(--bs-link-hover-color); }

/* Desplegables Tom Select (13/10/2026, pedido de Federico): la opcion bajo el mouse / teclado se resalta con fuerza (antes era un gris casi igual al fondo)
   y se distingue de la opcion ya elegida (celeste suave + negrita). Sirve en modo claro y oscuro (variables de Bootstrap). */
.ts-dropdown .option.selected { background-color: var(--bs-primary-bg-subtle); color: var(--bs-primary-text-emphasis); font-weight: 600; }
.ts-dropdown .option:hover, .ts-dropdown .option.active, .ts-dropdown .create.active { background-color: var(--bs-primary); color: #fff; }
.ts-dropdown .option.active .highlight, .ts-dropdown .option:hover .highlight { background: rgba(255, 255, 255, .3); color: inherit; }
html[data-bs-theme=dark] .ts-dropdown .option.active, html[data-bs-theme=dark] .ts-dropdown .option:hover { color: #fff; }

/* Formulario de servicio (ABC de Servicios / Programacion, 13/10/2026): ocupa el 95% del ancho y del alto de la pantalla del dispositivo */
.modal-dialog.v2-modal-95 { max-width: 95vw; width: 95vw; height: 95vh; margin: 2.5vh auto; }
.modal-dialog.v2-modal-95 .modal-content { height: 100%; }

/* Tom Select de seleccion unica: mientras se escribe para buscar se oculta el texto elegido (ej. "Seleccione opcion") (13/10/2026) */
.ts-wrapper.single.v2-ts-escribiendo .ts-control > .item { display: none; }

/* Programacion: destello del servicio/celda recien tocado al volver del formulario */
.tabulator-cell.v2-plasem-foco, .tabulator-row.v2-plasem-foco { animation: v2-plasem-foco 1.1s ease-in-out 3; outline: 3px solid var(--bs-warning, #ffc107); outline-offset: -3px; z-index: 5; }
@keyframes v2-plasem-foco { 0%, 100% { box-shadow: inset 0 0 0 100px rgba(255, 193, 7, .0); } 50% { box-shadow: inset 0 0 0 100px rgba(255, 193, 7, .35); } }

/* Formulario de servicio: sugerencias del campo Observaciones */
.v2-observa-lista { position: absolute; left: .75rem; right: .75rem; top: 100%; z-index: 1056; max-height: 14rem; overflow-y: auto; box-shadow: 0 .5rem 1rem rgba(0, 0, 0, .15); }
.v2-observa-lista .list-group-item { white-space: normal; text-align: left; }

/* Tooltips de Bootstrap (core/tooltips.js): un poco mas anchos que el default y alineados a la izquierda cuando llevan HTML */
.tooltip { --bs-tooltip-max-width: 320px; }
.tooltip .tooltip-inner { overflow-wrap: anywhere; }
.tooltip.v2-tip-detalle { --bs-tooltip-max-width: 380px; }
.tooltip.v2-tip-detalle .tooltip-inner { text-align: left; padding: .5rem .65rem; }
.v2-tip-serv + .v2-tip-serv { margin-top: .4rem; padding-top: .4rem; border-top: 1px solid rgba(255, 255, 255, .35); }
.v2-tip-mas { margin-top: .4rem; font-style: italic; opacity: .85; }

/* Visor de imagenes de Novedades/OT: por delante del modal de la OT (13/10/2026) */
#v2-nov-imagen { z-index: 1095; }

/* Menu de acciones generado por core/agrupar_acciones.js: el item conserva `.v2-accion` (para los listeners delegados) pero se ve como item de lista; el icono no atrapa el clic */
.dropdown-item.v2-menu-acc.v2-accion { color: var(--bs-body-color) !important; padding: .25rem 1rem; font-size: inherit; display: block; width: 100%; text-align: left; }
.v2-menu-acc .v2-accion { pointer-events: none; }

/* Encabezados con palabras enteras (13/10/2026): el titulo solo baja de renglon en los espacios; el ancho minimo de la columna lo calcula core/titulos_columnas.js */
.v2-titulos-enteros .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title { overflow-wrap: normal; word-break: normal; hyphens: none; max-width: none; }

/* Titulo de tarjeta dentro del cuerpo (14/10/2026): AdminLTE lo flota a la izquierda y los campos de abajo se acomodaban a su derecha. Aca va en su propia linea. */
.app-content .card-body > .card-title { float: none; display: block; margin-bottom: .75rem; }

/* Paginadores (14/10/2026): los botones se ven activos (color primario del tema, claro u oscuro) y no como deshabilitados. Aplica al paginador de Tabulator y al de core/parcial.js. */
.tabulator .tabulator-footer .tabulator-page { color: var(--bs-primary); background-color: var(--bs-body-bg); border-color: var(--bs-primary); font-weight: 600; }
html[data-bs-theme=dark] .tabulator .tabulator-footer .tabulator-page { color: var(--bs-primary-text-emphasis); background-color: var(--bs-body-bg); border-color: var(--bs-primary-border-subtle); }
.tabulator .tabulator-footer .tabulator-page.active,
html[data-bs-theme=dark] .tabulator .tabulator-footer .tabulator-page.active { color: #fff; background-color: var(--bs-primary); border-color: var(--bs-primary); }
.tabulator .tabulator-footer .tabulator-page:disabled,
html[data-bs-theme=dark] .tabulator .tabulator-footer .tabulator-page:disabled { color: var(--bs-tertiary-color); background-color: var(--bs-tertiary-bg); border-color: var(--bs-border-color); font-weight: 400; opacity: .7; }
@media (hover: hover) and (pointer: fine) {
  .tabulator .tabulator-footer .tabulator-page:not(:disabled):not(.active):hover,
  html[data-bs-theme=dark] .tabulator .tabulator-footer .tabulator-page:not(:disabled):not(.active):hover { color: #fff; background-color: var(--bs-primary); border-color: var(--bs-primary); }
}
/* El .active de core/parcial.js queda deshabilitado a la vez: se lo deja pleno, no atenuado. */
.v2-parcial .btn-group .btn:disabled[aria-current=page] { opacity: 1; }
.v2-parcial .btn-group .btn.btn-outline-primary:disabled:not([aria-current=page]) { opacity: .45; }
html[data-bs-theme=dark] .v2-parcial .btn-group .btn.btn-outline-primary:not(:disabled) { color: var(--bs-primary-text-emphasis); border-color: var(--bs-primary-border-subtle); }
html[data-bs-theme=dark] .v2-parcial .btn-group .btn.btn-outline-primary:not(:disabled):hover { color: #fff; background-color: var(--bs-primary); }

/* Ventanas modales grandes (14/10/2026, pedido de Federico): todas las `modal-xl` ocupan el 95% del ancho de la pantalla, como el formulario de servicios
   (hasta 991px ya ocupaban el 96%; Bootstrap las dejaba en 1140px). El alto sigue siendo el del contenido. */
@media (min-width: 992px) {
  .modal-dialog.modal-xl { --bs-modal-width: 95vw; max-width: 95vw; }
}

/* Solicitudes > Ofertas (14/10/2026): precios historicos desplegados debajo de la fila de la oferta. Sin colores propios (se ve con el tema claro u oscuro
   elegido): solo una barra lateral y un destello al abrirlos para que se note que aparecieron. */
.v2-sol-ofe-hist { padding: .5rem .75rem .75rem; border-left: 4px solid var(--bs-primary); border-top: 1px solid var(--bs-border-color); white-space: normal; max-width: 100%; box-sizing: border-box; outline: none; }
.v2-sol-ofe-hist .table { --bs-table-bg: transparent; font-size: .85em; margin-bottom: 0; }
.v2-sol-ofe-hist-foco { animation: v2-sol-hist-destello 1.4s ease-out 1; }
@keyframes v2-sol-hist-destello { 0% { box-shadow: inset 0 0 0 3px var(--bs-primary); } 100% { box-shadow: inset 0 0 0 3px transparent; } }
#v2-sol-f-ofe-grid .tabulator-cell { white-space: normal; }

/* Conciliacion > Resolver pendientes (14/10/2026): encabezados ordenables de la tabla de sugerencias */
.v2-oc-orden { background: none; border: 0; padding: 0; margin: 0; font: inherit; font-weight: inherit; color: inherit; text-align: inherit; cursor: pointer; white-space: nowrap; }
.v2-oc-orden:hover, .v2-oc-orden:focus-visible { color: var(--bs-primary); }
.v2-oc-orden .fa { opacity: .45; }
th[aria-sort=ascending] .v2-oc-orden .fa, th[aria-sort=descending] .v2-oc-orden .fa { opacity: 1; color: var(--bs-primary); }

/* Filas de grupo y encabezados "claros" que siguen el tema: en modo oscuro `table-light` pintaba fondo blanco con texto gris casi invisible */
.v2-fila-grupo,
.v2-fila-grupo > th,
.v2-fila-grupo > td {
  --bs-table-bg: var(--bs-tertiary-bg);
  --bs-table-color: var(--bs-body-color);
  --bs-table-border-color: var(--bs-border-color);
  background-color: var(--bs-tertiary-bg);
  color: var(--bs-body-color);
}
.v2-fila-grupo .text-body-secondary { color: var(--bs-secondary-color) !important; }

/* 17/10/2026: campos editables distinguibles (claro y oscuro). En Bootstrap 5.3 un input habilitado tiene el mismo fondo que la
   pagina y uno deshabilitado/readonly usa --bs-secondary-bg (gris): en los formularios no se ve cual se puede completar.
   Tema claro: fondo celeste muy tenue (el disabled es gris neutro). Tema oscuro: fondo mas OSCURO que el modal, como un "hueco"
   (el disabled es un gris mas CLARO). Al enfocar vuelve al fondo normal para que el foco de Bootstrap resalte. Aplica a input,
   select, textarea, tom-select y checkbox/radio (sin switches); excluye disabled, readonly y form-control-plaintext. */
html { --v2-campo-bg: #f1f6fd; --v2-campo-borde: #b9c4d3; }
html[data-bs-theme=dark] { --v2-campo-bg: #181c21; --v2-campo-borde: #5b6570; }
html .form-control:not(:disabled):not([readonly]):not(.form-control-plaintext),
html .form-select:not(:disabled):not([readonly]),
html .ts-wrapper:not(.disabled):not(.locked) .ts-control {
  background-color: var(--v2-campo-bg);
  border-color: var(--v2-campo-borde);
}
html .form-control:not(:disabled):not([readonly]):not(.form-control-plaintext):focus,
html .form-select:not(:disabled):not([readonly]):focus,
html .ts-wrapper:not(.disabled):not(.locked).focus .ts-control {
  background-color: var(--bs-body-bg);
  border-color: var(--bs-primary);
}
html .form-check-input:not(:checked):not(:indeterminate):not(:disabled):not([role=switch]) {
  background-color: var(--v2-campo-bg);
  border-color: var(--v2-campo-borde);
}
/* Los inputs dentro de una celda de Tabulator o de su filtro de cabecera conservan su estilo propio. */
html .tabulator .form-control:not(:disabled):not([readonly]) { background-color: var(--bs-body-bg); border-color: var(--bs-border-color); }

/* Menu de usuario del encabezado con nombre largo (20/10/2026): el nombre se recorta con puntos suspensivos y el desplegable queda siempre dentro de la pantalla. */
.navbar-nav .user-menu { min-width: 0; flex: 0 1 auto; }
.navbar-nav .user-menu > .nav-link { max-width: min(42vw, 360px); min-width: 0; }
.navbar-nav .user-menu > .nav-link [data-v2-usuario-nombre] { display: inline-block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; }
.navbar-nav .user-menu > .dropdown-menu { min-width: 260px; max-width: min(92vw, 340px); }
.navbar-nav .user-menu > .dropdown-menu [data-v2-usuario-nombre] { overflow-wrap: anywhere; }

/* Tablas compactas (19/10/2026 Servicios y Solicitudes; 21/10/2026 pasa a ser el estilo de TODAS las tablas v2 desde core/tabla.js, `compacta: false` lo desactiva): que entren todas las columnas en la pantalla; el texto baja de renglon en los espacios. */
.tabulator.v2-tabla-compacta .tabulator-row .tabulator-cell { padding: 3px 5px; line-height: 1.2; white-space: normal; overflow-wrap: break-word; word-break: normal; hyphens: none; } /* break-word: solo parte una palabra que por si sola no entra en la columna (ej. un mail) */
.tabulator.v2-tabla-compacta .tabulator-header .tabulator-col .tabulator-col-content { padding: 3px 4px; }
/* 21/10/2026: el titulo baja de renglon SOLO en los espacios; `min-width: min-content` gana sobre `max-width` y evita partir una palabra (COTIZAD/O). */
.tabulator.v2-tabla-compacta .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title { max-width: 6.5rem; min-width: min-content; white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: normal; word-break: normal; hyphens: none; }
/* (el tope de ancho de las columnas lo pone core/tabla.js con `maxWidth`; las listas largas admiten 224px) */
.v2-tabla-compacta .progress { min-width: 80px !important; }
/* Tablas que entran en el ancho de la pantalla y parten el texto SOLO en los espacios (Gestion de tareas, 20/10/2026, pedido de Franco): una palabra o fecha nunca se corta; si no entran todas las columnas aparece el scroll horizontal. */
.tabulator.v2-tabla-envuelve { font-size: .875rem; }
.tabulator.v2-tabla-envuelve .tabulator-row .tabulator-cell { white-space: normal; overflow-wrap: normal; word-break: normal; padding: 3px 5px; line-height: 1.2; }
.tabulator.v2-tabla-envuelve .tabulator-header .tabulator-col .tabulator-col-content { padding: 3px 4px; }
.tabulator.v2-tabla-envuelve .tabulator-header .tabulator-col .tabulator-col-content .tabulator-col-title { white-space: normal; overflow: visible; text-overflow: clip; overflow-wrap: normal; word-break: normal; }

/* Comunicados: indicadores de seguimiento que filtran las tablas. */
.v2-seg-indicador { cursor: pointer; transition: transform .1s, box-shadow .1s; }
.v2-seg-indicador:hover { transform: translateY(-1px); box-shadow: 0 2px 8px rgba(0, 0, 0, .3); }
.v2-seg-emp-fila { cursor: pointer; }
.v2-seg-emp-activa .tabulator-cell { background: rgba(var(--bs-primary-rgb), .25) !important; font-weight: 600; }
.v2-seg-indicador.v2-seg-activo { outline: 3px solid var(--bs-body-color); outline-offset: 2px; }

/* Plano de butacas (editor del legajo del equipo, 21/10/2026) */
.v2-plano-grilla { display: grid; gap: 3px; width: max-content; max-width: 100%; overflow: auto; padding: 6px; background: var(--bs-tertiary-bg); border-radius: .5rem; }
.v2-plano-celda { width: 2.6rem; height: 2.6rem; padding: 0; border: 1px dashed var(--bs-border-color); border-radius: .35rem; background: transparent; font-size: .8rem; font-weight: 600; color: #fff; line-height: 1; }
.v2-plano-celda:not(:disabled):hover { border-color: var(--bs-primary); }
.v2-plano-butaca { background: #5f7f9f; border-style: solid; }
.v2-plano-chofer { background: #f0ad4e; border-style: solid; color: #222; }
.v2-plano-puerta { background: #2fa36b; border-style: solid; }
.v2-plano-escalera { background: #9b7bd0; border-style: solid; }
.v2-plano-bano { background: #c58b4a; border-style: solid; }
.v2-plano-3d { height: 26rem; border-radius: .5rem; background: linear-gradient(#26303b, #161b22); overflow: hidden; color: #fff; display: flex; align-items: center; justify-content: center; text-align: center; }

/* Mapa de butacas real (venta online y Servicios) */
.v2-mapa-barra { display: flex; gap: .4rem; justify-content: center; margin-bottom: .5rem; }
.v2-mapa-2d { display: flex; flex-wrap: wrap; gap: 1rem; justify-content: center; }
.v2-mapa-piso-titulo { text-align: center; font-weight: 600; font-size: .85rem; margin-bottom: .25rem; }
.v2-mapa-grilla { display: grid; gap: 3px; justify-content: center; }
.v2-mapa-grilla > .v2-mapa-celda, .v2-mapa-grilla > .v2-mapa-fijo, .v2-mapa-grilla > .v2-mapa-vacio { width: var(--v2-celda, 2.6rem); height: var(--v2-celda, 2.6rem); padding: 0; margin: 0; }
.v2-mapa-fijo { display: flex; align-items: center; justify-content: center; color: #fff; font-size: .75rem; font-weight: 600; border-radius: .35rem; opacity: .85; }

/* Mapa de butacas en celular: celdas mas grandes (tactil), 3D mas alto y sin atrapar el scroll vertical */
.v2-mapa-2d { overflow-x: auto; }
@media (pointer: coarse) { .v2-mapa { --v2-celda: 2.9rem; } }
@media (max-width: 576px) { .v2-plano-3d { height: min(68vh, 28rem); } .v2-mapa-barra { flex-wrap: wrap; } }

/* 21/10/2026: tabla estirada al 100% del ancho (core/tabla.js::estirarColumnas): las celdas acompanan el ancho de su columna (sin el tope de 20rem). */
.tabulator.v2-tabla-estirada .tabulator-cell, .tabulator.v2-tabla-estirada .tabulator-row .tabulator-cell { max-width: none; }

/* 21/10/2026: celda "Acciones" de Equipos como tarjeta: boton y codigo arriba, foto de tamano fijo abajo (sin deformar ni recortar el boton). */
.v2-mv-tarjeta { display: flex; flex-direction: column; gap: 4px; align-items: flex-start; }
.v2-mv-tarjeta-cab { display: flex; align-items: center; gap: 6px; }
.tabulator .v2-mv-tarjeta .v2-mv-foto { display: block; width: 104px; height: 68px; max-width: none; object-fit: cover; border: 0; border-radius: 5px; cursor: zoom-in; }

/* ===== CARGA (22/10/2026): splash de arranque y esqueleto que se arma al tocar el menu ===== */
:root { --v2-widu-azul: #3fb0ea; --v2-widu-marino: #191b35; --v2-sk-brillo: var(--bs-body-bg); }
[data-bs-theme="dark"] { --v2-widu-marino: #e8ecf5; --v2-sk-brillo: color-mix(in srgb, var(--bs-body-color) 20%, var(--bs-secondary-bg)); }
.v2-splash, .v2-esqueleto { display: none; }
html.v2-carga-splash .v2-splash { display: flex; }
html.v2-carga-nav .v2-esqueleto { display: block; }
.v2-splash { position: fixed; inset: 0; z-index: 3000; flex-direction: column; align-items: center; justify-content: center; gap: 1.25rem;
  background: var(--bs-body-bg); color: var(--v2-widu-azul); transition: opacity .3s ease; }
html.v2-carga-saliendo .v2-splash, html.v2-carga-saliendo .v2-esqueleto { opacity: 0; transition: opacity .3s ease; }
.v2-splash-caja { position: relative; width: min(340px, 80vw); height: 200px; display: flex; align-items: center; justify-content: center; }
.v2-splash-logo { width: 170px; text-align: center; position: relative; z-index: 1; }
.v2-splash-logo svg { width: 100%; height: auto; overflow: visible; }
.v2-bloque { fill: var(--v2-widu-azul); transform-box: fill-box; transform-origin: center; animation: v2-bloque 3.4s ease-out infinite; animation-delay: calc(var(--i) * 55ms); }
@keyframes v2-bloque {
  0% { opacity: 0; transform: translate(var(--dx), var(--dy)) scale(.3); }
  18%, 82% { opacity: 1; transform: none; }
  100% { opacity: 0; transform: none; }
}
.v2-splash-marca { margin-top: .5rem; font: 800 3.4rem/1 var(--bs-font-sans-serif); letter-spacing: .06em; color: var(--v2-widu-marino); }
.v2-splash-marca span { color: var(--v2-widu-azul); }
.v2-eng { position: absolute; color: var(--v2-widu-azul); opacity: .35; --v2-hueco: var(--bs-body-bg); }
.v2-eng-a { width: 92px; height: 92px; left: -6px; top: 4px; animation: v2-gira 7s linear infinite; }
.v2-eng-b { width: 70px; height: 70px; right: -2px; bottom: 6px; animation: v2-gira 5.2s linear infinite reverse; }
.v2-eng-c { width: 44px; height: 44px; right: 26px; top: 0; animation: v2-gira 3.6s linear infinite; }
.v2-eng-hueco, .v2-eng-mini .v2-eng-hueco { fill: var(--v2-hueco, var(--bs-body-bg)); }
@keyframes v2-gira { to { transform: rotate(360deg); } }
.v2-splash-barra { width: min(260px, 60vw); height: 4px; border-radius: 2px; overflow: hidden; background: var(--bs-secondary-bg); }
.v2-splash-barra span { display: block; width: 40%; height: 100%; border-radius: 2px; background: var(--v2-widu-azul); animation: v2-barra 1.4s ease-in-out infinite; }
@keyframes v2-barra { 0% { transform: translateX(-100%); } 100% { transform: translateX(250%); } }
.v2-splash-txt { font-size: .85rem; letter-spacing: .12em; text-transform: uppercase; color: var(--bs-secondary-color); }

.app-main { position: relative; }
.v2-esqueleto { position: absolute; inset: 0; z-index: 50; background: var(--bs-tertiary-bg); overflow: hidden; transition: opacity .3s ease; }
.v2-esq-banner { display: flex; align-items: center; justify-content: center; gap: .5rem; padding: .4rem; font-size: .85rem; font-weight: 600;
  background: var(--bs-body-bg); border-bottom: 1px solid var(--bs-border-color); color: var(--v2-widu-azul); }
.v2-eng-mini { width: 20px; height: 20px; color: var(--v2-widu-azul); --v2-hueco: var(--bs-body-bg); animation: v2-gira 2.4s linear infinite; }
.v2-esq-contenido { padding: 1rem; display: flex; flex-direction: column; gap: 1rem; }
.v2-esq-filtros { display: flex; flex-wrap: wrap; gap: .75rem; }
.v2-esq-tabla { display: flex; flex-direction: column; gap: .5rem; background: var(--bs-body-bg); border: 1px solid var(--bs-border-color); border-radius: .5rem; padding: .75rem; }
.v2-esq-fila { display: grid; grid-template-columns: 1fr 2fr 1fr 1fr; gap: .75rem; }
.v2-esq-fila .v2-sk { height: 1rem; }
.v2-sk { border-radius: .35rem; background: linear-gradient(100deg, var(--bs-secondary-bg) 38%, var(--v2-sk-brillo) 50%, var(--bs-secondary-bg) 62%) 100% 0 / 250% 100%;
  opacity: 0; animation: v2-sk-entra .4s ease-out forwards, v2-sk-brillo 1.8s linear infinite; animation-delay: calc(var(--n, 0) * 70ms), 0s; }
.v2-esq-fila { opacity: 0; animation: v2-sk-entra .4s ease-out forwards; animation-delay: calc(var(--n, 0) * 70ms); }
.v2-esq-fila .v2-sk { opacity: 1; animation: v2-sk-brillo 1.8s linear infinite; }
.v2-sk-titulo { height: 1.75rem; width: 14rem; max-width: 60%; }
.v2-sk-campo { height: 2.25rem; width: 11rem; max-width: 45%; }
.v2-sk-boton { height: 2.25rem; width: 6rem; }
.v2-sk-cabecera { height: 1.75rem; width: 100%; }
@keyframes v2-sk-entra { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: none; } }
/* reflejo de luz de izquierda a derecha, velocidad media (1.8 s) */
@keyframes v2-sk-brillo { from { background-position: 100% 0; } to { background-position: 0 0; } }
/* Movimiento reducido (ej. Windows con "animaciones" apagadas, muy comun en Windows Server/RDP): los engranajes quedan quietos y los bloques
   solo aparecen con fundido, pero la barra de progreso y el brillo siguen porque son el indicador de que esta cargando. */
@media (prefers-reduced-motion: reduce) {
  .v2-eng, .v2-eng-mini { animation: none; }
  .v2-bloque { animation-name: v2-bloque-suave; }
  .v2-sk, .v2-esq-fila { animation-duration: .01s, 1.8s; }
}
@keyframes v2-bloque-suave { 0% { opacity: 0; } 18%, 82% { opacity: 1; } 100% { opacity: 0; } }

.v2-w-mini { width: 30px; height: 18px; fill: var(--v2-widu-azul); }

/* Popup para instalar la app (core/instalar.js) */
.v2-pwa-aviso { position: fixed; right: 1rem; bottom: 1rem; z-index: 1900; width: min(22rem, calc(100vw - 2rem)); }
.v2-pwa-logo { width: 40px; height: 40px; border-radius: .5rem; flex: none; }
@media (max-width: 575.98px) { .v2-pwa-aviso { left: 1rem; width: auto; } }

/* 24/10/2026: paginas publicas gps / geocodmap / checklist publico */
.v2-gps-mapa { height: 400px; width: 100%; }
.v2-chkp-foto { width: 181px; height: 200px; object-fit: cover; }

/* Selector de punto en mapa (core/mapa_punto.js, decision #237) */
.v2-mp-mapa { height: 55vh; min-height: 320px; width: 100%; }
/* Armar recorrido: la lista de paradas hace scroll adentro (con muchas paradas no corre la pagina ni el mapa). */
.v2-mar-lista { max-height: calc(55vh - 6rem); min-height: 8rem; overflow-y: auto; padding-right: .25rem; }
/* Mapa de puntos (core/mapa_puntos.js): ventanita de informacion de un marcador */
.v2-mpp-info { position: absolute; top: .5rem; left: .5rem; z-index: 5; max-width: 60%; }

/* 24/10/2026: pestanas de la campanita siempre en UNA fila (una al lado de la otra); si no entran, la fila se desplaza. */
.v2-campana-panel { width: min(26rem, calc(100vw - 1rem)); }
.v2-campana-panel > .nav { flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }
.v2-campana-panel > .nav::-webkit-scrollbar { display: none; }
.v2-campana-panel > .nav .nav-link { flex: 1 0 auto; white-space: nowrap; padding: .4rem .6rem; font-size: .9rem; }
/* En telefono el panel se ancla al ancho de la pantalla (Popper lo dejaba corrido a la izquierda y se cortaban las pestanas). */
@media (max-width: 575.98px) {
  .v2-campana-panel { position: fixed !important; top: 3.75rem !important; left: .5rem !important; right: .5rem !important; bottom: auto !important; width: auto !important; max-width: none; transform: none !important; max-height: calc(100vh - 4.5rem); overflow-y: auto; }
  .v2-campana-panel > .nav { padding-left: .25rem !important; padding-right: .25rem !important; }
  .v2-campana-panel > .nav .nav-link { padding: .4rem .45rem; font-size: .85rem; }
}

/* ---- Tablero de disponibilidad (24/10/2026, decision #240): linea de tiempo por persona ---- */
.v2-tb-scroll { overflow-x: auto; border: 1px solid var(--bs-border-color); border-radius: .5rem; max-height: 72vh; overflow-y: auto; }
.v2-tb-lienzo { position: relative; }
.v2-tb-fila { display: flex; border-bottom: 1px solid var(--bs-border-color-translucent); min-height: 2.6rem; }
.v2-tb-nombre { flex: 0 0 var(--v2-tb-nombre, 210px); width: var(--v2-tb-nombre, 210px); position: sticky; left: 0; z-index: 4; background: var(--bs-body-bg); padding: .3rem .6rem; border-right: 1px solid var(--bs-border-color); min-width: 0; display: flex; flex-direction: column; justify-content: center; }
.v2-tb-pista { position: relative; flex: 1 1 auto; min-width: 0; background-image: linear-gradient(to right, var(--bs-border-color-translucent) 1px, transparent 1px); background-size: calc(100% / var(--v2-tb-dias, 7)) 100%; }
.v2-tb-encabezado { position: sticky; top: 0; z-index: 6; background: var(--bs-body-bg); min-height: 2.4rem; }
.v2-tb-encabezado .v2-tb-nombre { z-index: 7; font-weight: 600; }
.v2-tb-eje { height: 2.4rem; background-image: none; }
.v2-tb-dia { position: absolute; top: 0; bottom: 0; display: flex; align-items: center; justify-content: center; font-size: .78rem; font-weight: 600; border-left: 1px solid var(--bs-border-color); white-space: nowrap; overflow: hidden; }
.v2-tb-dia.v2-tb-finde { background: rgba(var(--bs-warning-rgb), .12); }
.v2-tb-hora { position: absolute; bottom: 0; transform: translateX(-50%); font-size: .62rem; color: var(--bs-secondary-color); pointer-events: none; }
.v2-tb-resumen { min-height: 1.7rem; }
.v2-tb-resumen .v2-tb-pista { background-image: none; }
.v2-tb-calor { position: absolute; top: 2px; bottom: 2px; display: flex; align-items: center; justify-content: center; font-size: .75rem; font-weight: 600; border-radius: .25rem; border: 1px solid var(--bs-body-bg); }
.v2-tb-calor-alto { background: rgba(var(--bs-success-rgb), .28); }
.v2-tb-calor-medio { background: rgba(var(--bs-warning-rgb), .35); }
.v2-tb-calor-bajo { background: rgba(var(--bs-danger-rgb), .35); }
.v2-tb-calor-rojo { background: rgba(var(--bs-danger-rgb), .55); color: #fff; }
.v2-tb-calor-neutro { background: rgba(var(--bs-secondary-rgb), .12); color: var(--bs-secondary-color); }
.v2-tb-grupo { display: flex; background: var(--bs-tertiary-bg); border-bottom: 1px solid var(--bs-border-color); }
.v2-tb-grupo .v2-tb-nombre { flex: 1 1 auto; width: auto; background: var(--bs-tertiary-bg); font-weight: 600; flex-direction: row; gap: .4rem; align-items: center; }
.v2-tb-barra { position: absolute; top: 22%; bottom: 22%; z-index: 3; border: 0; border-radius: .3rem; padding: 0 .3rem; font-size: .72rem; font-weight: 600; color: #fff; overflow: visible; white-space: nowrap; text-overflow: ellipsis; text-align: left; cursor: pointer; line-height: 1; box-shadow: 0 1px 2px rgba(0, 0, 0, .25); }
.v2-tb-barra:hover { filter: brightness(1.12); }
.v2-tb-b-serv { background: var(--bs-success); }
.v2-tb-b-conf { background: #7f1d1d; }
.v2-tb-punto { border-radius: 50%; padding: 0; min-width: .7rem; }
.v2-tb-corta-izq { border-top-left-radius: 0; border-bottom-left-radius: 0; }
.v2-tb-corta-der { border-top-right-radius: 0; border-bottom-right-radius: 0; }
.v2-tb-ausencia { position: absolute; top: 4px; bottom: 4px; z-index: 1; border-radius: .3rem; font-size: .7rem; overflow: hidden; white-space: nowrap; padding: 0 .3rem; display: flex; align-items: center; color: var(--bs-body-color); }
.v2-tb-ausencia.v2-tb-b-aus { background: repeating-linear-gradient(135deg, rgba(var(--bs-secondary-rgb), .35), rgba(var(--bs-secondary-rgb), .35) 6px, rgba(var(--bs-secondary-rgb), .18) 6px, rgba(var(--bs-secondary-rgb), .18) 12px); border: 1px solid rgba(var(--bs-secondary-rgb), .55); }
.v2-tb-ausencia.v2-tb-b-pend { background: repeating-linear-gradient(135deg, rgba(var(--bs-warning-rgb), .35), rgba(var(--bs-warning-rgb), .35) 6px, rgba(var(--bs-warning-rgb), .15) 6px, rgba(var(--bs-warning-rgb), .15) 12px); border: 1px dashed rgba(var(--bs-warning-rgb), .8); }
.v2-tb-ahora { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--bs-danger); z-index: 2; pointer-events: none; }
.v2-tb-ley { display: inline-block; width: .9rem; height: .7rem; border-radius: .2rem; vertical-align: middle; }
.v2-tb-ley.v2-tb-b-aus { background: rgba(var(--bs-secondary-rgb), .45); }
.v2-tb-ley.v2-tb-b-pend { background: rgba(var(--bs-warning-rgb), .5); border: 1px dashed rgba(var(--bs-warning-rgb), .9); }
@media (max-width: 767.98px) { .v2-tb-nombre { flex-basis: 140px; width: 140px; } }
.v2-tb-b-mant { background: var(--bs-danger); }
.v2-tb-b-res { background: var(--bs-warning); color: #000; }
.v2-tb-b-venc { background: var(--bs-danger); }
.v2-tb-ley.v2-tb-b-mant { background: var(--bs-danger); }
.v2-tb-ley.v2-tb-b-res { background: var(--bs-warning); }
.v2-tb-ley-item { display: inline-flex; align-items: center; gap: .3rem; cursor: pointer; user-select: none; margin: 0; }
.v2-tb-ley-item .form-check-input { margin: 0; }
.v2-tb-ley-item .badge { font-weight: 600; }
.v2-tb-ley-off { opacity: .55; }
.v2-tb-ley-off .v2-tb-ley { filter: grayscale(1); }
.v2-tb-card[data-modo="personal"] .v2-tb-solo-equipos, .v2-tb-card[data-modo="equipos"] .v2-tb-solo-personal { display: none; }
.v2-tb-marca { position: absolute; top: 50%; transform: translate(-50%, -50%) rotate(45deg); width: .6rem; height: .6rem; z-index: 5; background: var(--bs-warning); border: 1px solid var(--bs-body-bg); cursor: help; }
.v2-tb-marca.v2-tb-marca-vencida { background: var(--bs-danger); }

/* Tablero de disponibilidad, etapa 2 (#240): arrastrar un servicio a otra fila */
.v2-tb-barra[data-arrastrable] { cursor: grab; touch-action: none; user-select: none; }
.v2-tb-barra.v2-tb-arrastrando { opacity: .45; cursor: grabbing; }
.v2-tb-fila.v2-tb-destino { outline: 2px dashed var(--bs-primary); outline-offset: -2px; background-color: rgba(var(--bs-primary-rgb), .08); }
.v2-tb-barra.v2-tb-arrastrando { z-index: 30; box-shadow: 0 4px 14px rgba(0, 0, 0, .35); }
.v2-tb-barra.v2-tb-b-borrador { outline: 2px dashed var(--bs-warning); outline-offset: -2px; background-image: repeating-linear-gradient(45deg, rgba(255, 255, 255, .22) 0 6px, transparent 6px 12px); }
.v2-tb-orig { position: absolute; top: 3px; bottom: 3px; border: 1px dashed var(--bs-secondary-color); border-radius: .3rem; opacity: .6; pointer-events: none; }
.v2-tb-fuera { opacity: .22; filter: grayscale(.6); }
.v2-tb-acc { position: absolute; right: 2px; top: 50%; transform: translateY(-50%); padding: 1px 4px; background: rgba(0, 0, 0, .28); border-radius: .25rem; opacity: .85; }
.v2-tb-mas { line-height: 1; opacity: .55; }
.v2-tb-mas:hover { opacity: 1; }
.v2-tb-menu { position: fixed; z-index: 2100; min-width: 12rem; display: block; }
.v2-tb-celda { position: absolute; top: 1px; bottom: 1px; z-index: 2; pointer-events: none; display: flex; align-items: center; justify-content: center; gap: .35rem; overflow: hidden; border: 2px solid var(--bs-primary); border-radius: .35rem; background: rgba(var(--bs-primary-rgb), .14); color: var(--bs-primary-text-emphasis); font-size: .72rem; font-weight: 600; white-space: nowrap; box-shadow: 0 0 0 1px var(--bs-body-bg) inset; }
.v2-tb-celda span { display: none; }
.v2-tb-celda.v2-tb-celda-ancha span { display: inline; }
html[data-bs-theme=dark] .v2-tb-celda { background: rgba(var(--bs-primary-rgb), .28); color: #fff; border-color: var(--bs-primary-border-subtle); }
.v2-tb-txt { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-tb-asa { position: absolute; top: -2px; bottom: -2px; width: 9px; z-index: 2; cursor: ew-resize; opacity: 0; transition: opacity .12s; }
.v2-tb-asa::after { content: ""; position: absolute; top: 24%; bottom: 24%; left: 3px; width: 3px; border-radius: 2px; background: #fff; box-shadow: 0 0 0 1px rgba(0, 0, 0, .55); }
.v2-tb-asa-ini { left: -4px; }
.v2-tb-asa-fin { right: -4px; }
.v2-tb-barra:hover .v2-tb-asa, .v2-tb-barra.v2-tb-arrastrando .v2-tb-asa { opacity: 1; }
.v2-tb-asa-chica { opacity: .55; width: 10px; }
.v2-tb-asa-chica.v2-tb-asa-ini { left: -7px; }
.v2-tb-asa-chica.v2-tb-asa-fin { right: -7px; }
.v2-tb-asa:hover { opacity: 1; }
.v2-tb-fantasma { position: fixed; z-index: 2000; pointer-events: none; padding: .35rem .6rem; border-radius: .4rem; font-size: .8rem; line-height: 1.3; background: var(--bs-body-bg); color: var(--bs-body-color); border: 1px solid var(--bs-border-color); box-shadow: 0 4px 14px rgba(0, 0, 0, .3); max-width: 340px; }
.v2-tb-fantasma.v2-tb-fantasma-conf { border-color: var(--bs-danger); color: var(--bs-danger-text-emphasis); }
.v2-tb-panel > summary { cursor: pointer; }
.v2-tb-mapa { overflow-x: auto; }
.v2-tb-mapa table { border-collapse: separate; border-spacing: 2px; font-size: .8rem; }
.v2-tb-mapa th { font-weight: 600; white-space: nowrap; padding: 2px 6px; text-align: center; }
.v2-tb-mapa th:first-child, .v2-tb-mapa td:first-child { text-align: left; white-space: nowrap; padding-right: 10px; }
.v2-tb-mapa td.v2-tb-mc { text-align: center; min-width: 54px; padding: 4px 6px; border-radius: .3rem; font-weight: 600; }
.v2-tb-mc-alto { background: rgba(var(--bs-success-rgb), .35); }
.v2-tb-mc-medio { background: rgba(var(--bs-warning-rgb), .45); }
.v2-tb-mc-bajo { background: rgba(var(--bs-danger-rgb), .45); }
.v2-tb-mc-cero { background: rgba(var(--bs-danger-rgb), .75); color: #fff; }
.v2-tb-mc-todas td { border-top: 1px solid var(--bs-border-color); }

/* 26/10/2026: tilde "marcar como leida" de los items de la campanita. */
/* Campanita: la lista hace scroll con muchos avisos y el pie (interruptores) queda siempre a la vista */
.v2-campana-cuerpo { display: flex; flex-direction: column; max-height: min(65vh, 30rem); }
.v2-campana-cuerpo > [data-v2-campana-panel] { overflow-y: auto; min-height: 0; flex: 1 1 auto; }
.v2-campana-cuerpo > [data-v2-campana-pie] { flex: 0 0 auto; }
.v2-campana-tilde { line-height: 1.2; font-size: .8rem; }
.v2-campana-panel .list-group-item[role="button"] { cursor: pointer; }
