/* Portal Arba — estilos personalizados sobre Bootstrap 5 (zero-build) */

/* Botones táctiles: altura mínima 44px (WCAG 2.5.5, Target Size) */
.btn {
  min-height: 44px;
}

/* Sidebar de escritorio (ancho fijo) */
.sidebar {
  width: 260px;
  min-width: 260px;
}

/* Enlaces de menú táctil-friendly con altura mínima de 44px */
.sidebar .nav-link,
.offcanvas .nav-link {
  min-height: 44px;
  display: flex;
  align-items: center;
}

/* El layout crece hasta ocupar la altura disponible bajo la barra superior */
.app-layout {
  flex-grow: 1;
}

/* Tarjetas del dashboard con altura uniforme */
.dashboard-card {
  height: 100%;
}

/* Defensa anti-bloqueo de clics: el offcanvas cerrado usa position: fixed con
   z-index elevado; si quedara superpuesto al sidebar de escritorio, impediría
   hacer clic en los enlaces del menú. Solo debe capturar eventos cuando está
   visible (.show) o en transición (.showing). */
.offcanvas:not(.show):not(.showing) {
  pointer-events: none;
}

/* Sábana matricial: cabecera fija (sticky) y columna de trabajador fija */
.matrix-table .matrix-sticky-header th {
  position: sticky;
  top: 0;
  z-index: 3;
  background-color: var(--bs-light, #f8f9fa);
}

.matrix-table .matrix-sticky-column {
  position: sticky;
  left: 0;
  z-index: 2;
  background-color: #ffffff;
  min-width: 160px;
}

.matrix-table thead .matrix-sticky-column {
  z-index: 4;
  background-color: var(--bs-light, #f8f9fa);
}

/* Celdas de la sábana: inputs compactos tipo hoja de cálculo */
.matrix-cell {
  min-width: 92px;
}

/* SPRINT 004-Z — Cabeceras fijas (sticky headers) en las tablas principales:
   al hacer scroll vertical la cabecera (`thead th`) permanece visible con fondo
   opaco (las filas nunca se transparentan a través de ella) y un filete inferior
   que la separa del cuerpo. CSS nativo Zero-Build: sin librerías externas. */
.table-sticky thead th,
.table-responsive thead.sticky-top th,
.sticky-table-header thead th {
  position: sticky;
  top: 0;
  z-index: 5;
  background-color: var(--bs-light, #f8f9fa) !important;
  box-shadow: inset 0 -1px 0 var(--bs-border-color, #dee2e6);
}

/* En las matrices con columna de trabajador fija, la cabecera sticky se pinta
   por encima de la columna fija (que conserva su propio z-index inferior). */
.table-sticky thead th.matrix-sticky-column,
.sticky-table-header thead th.matrix-sticky-column {
  z-index: 6;
}

/* SPRINT 005-B — Inmovilización real de cabeceras (*Freeze Panes*): el
   contenedor acota la altura de la tabla (72vh) y asume el scroll vertical
   (`overflow: auto`), de modo que la cabecera (`thead th`) queda anclada como
   en Excel mientras se recorre el cuerpo. El fondo opaco evita que las filas
   se transparenten a través de ella y el filete inferior la separa del cuerpo.
   CSS nativo Zero-Build: sin librerías externas. */
.table-freeze-container {
  max-height: 72vh;
  overflow: auto;
  position: relative;
  border: 1px solid var(--bs-border-color, #dee2e6);
  border-radius: 0.375rem;
}

.table-freeze-container thead th,
.table-freeze-container .table-sticky thead th {
  position: sticky;
  top: 0;
  background-color: #f8f9fa !important;
  z-index: 10;
  box-shadow: inset 0 -1px 0 var(--bs-border-color, #dee2e6), 0 2px 2px -1px rgba(0, 0, 0, 0.08);
}

/* FASE 1 Refactorización de Convenios: tablas horizontales de convenios.
   Los textos largos saltan de línea dentro de la celda (nunca desbordan) y
   cada celda reserva un ancho mínimo legible. */
.agreement-tables td,
.agreement-tables th {
  white-space: normal !important;
  word-wrap: break-word;
  min-width: 120px;
}

/* SPRINT 006A — Anti-desbordamiento horizontal: el contenido principal nunca
   ensancha el viewport del navegador (min-width: 0 en el flex-row y clipping
   lateral), de modo que el Navbar azul superior cubre SIEMPRE el 100% de la
   ventana sin huecos blancos. El scroll horizontal queda confinado a los
   contenedores .table-responsive de cada tabla. */
.app-layout > main {
  min-width: 0;
  overflow-x: hidden;
}

/* Columna ultra-estrecha «Tipo Cpto» (badges M/D/A) de los pluses dinámicos:
   ancho fijo y contenido centrado. La regla general min-width: 120px de las
   tablas de convenios NO aplica a esta columna (los !important la blindan). */
.col-tipo-cpto {
  width: 55px !important;
  min-width: 48px !important;
  max-width: 62px !important;
  padding-left: 2px !important;
  padding-right: 2px !important;
  text-align: center !important;
}

/* FASE 3 (Sprint 006A) — Spreadsheet Mode en «Tablas y Categorías»:
   cada bloque de tabla alterna entre la vista de lectura (.bulk-edit-read)
   y la cuadrícula editable (.bulk-edit-input) al activarse .edit-mode. */
.table-edit-block .bulk-edit-input {
  display: none;
}
.table-edit-block.edit-mode .bulk-edit-input {
  display: inline-block;
}
.table-edit-block.edit-mode .bulk-edit-read {
  display: none;
}
/* El <textarea> de Categoría lleva `display: none` en línea (homólogo del span
   de lectura); en modo edición se fuerza su visualización, ya que una
   declaración `!important` de hoja de estilos gana al estilo en línea. */
.table-edit-block.edit-mode textarea.bulk-edit-input {
  display: block !important;
}

/* Inputs compactos de la cuadrícula editable (navegación con Tab). */
.bulk-cell-input {
  width: 100%;
  min-width: 84px;
  padding: 2px 6px;
}

/* Badge M/D/A conmutable en modo edición (cursor de botón). */
.periodicity-badge {
  cursor: pointer;
  user-select: none;
}

/* FASE 3/4 (Sprint 006A) — Selector de visibilidad quirúrgico: cada columna
   individual de la matriz (.col-eq-*) se oculta en pantalla al desmarcar su
   checkbox y se omite también en la exportación Excel. */
.equivalence-matrix th.col-hidden,
.equivalence-matrix td.col-hidden {
  display: none;
}

/* FASE 3 (Sprint 006A) — Edición manual de importes en Equivalencias:
   .override-mode muestra los inputs numéricos en lugar de los valores. */
.equivalence-edit-block .override-input {
  display: none;
}
.equivalence-edit-block .override-read {
  display: inline;
}
.equivalence-edit-block.override-mode .override-input {
  display: block;
}
.equivalence-edit-block.override-mode .override-read {
  display: none;
}

/* Celda con ajuste manual: fondo ámbar sutil para distinguirla del cálculo
   teórico (acompañada del asterisco de boletín). */
.cell-override {
  background-color: var(--bs-warning-subtle, #fff3cd) !important;
}

/* Indicador de sobrescritura: asterisco de boletín en ámbar. */
.override-star {
  font-size: 0.75rem;
  vertical-align: super;
}

/* SPRINT 003-E — Matriz de Pactos Salariales Especiales (ficha del trabajador):
   cada casilla es un bloque .pact-field cuya etiqueta y texto de ayuda reservan
   la misma altura, de modo que las filas horizontales de las 4 columnas quedan
   perfectamente alineadas entre sí. */
/* SPRINT 004-J — Jerarquía visual de la Matriz de Pactos Salariales Especiales:
   los títulos pasan al AZUL CORPORATIVO (rgb(11, 101, 181) / #0b65b5) con peso
   600 y sin cursiva, de modo que el rótulo del concepto se identifique de un
   vistazo; los marcadores de ejemplo quedan atenuados para que un campo vacío se
   distinga nítidamente de un importe realmente introducido. */
.pact-label {
  color: rgb(11, 101, 181) !important;
  font-weight: 600 !important;
  font-style: normal !important;
  font-size: 0.84rem;
  line-height: 1.25;
  margin-bottom: 0.25rem;
  text-transform: none;
}

.pact-field input::placeholder {
  color: #adb5bd !important;
  opacity: 0.65 !important;
  font-size: 0.82rem;
}

.pact-field > .pact-label {
  min-height: 2.75rem;
}

.pact-field > .form-text {
  min-height: 2.4rem;
}

/* La nota aclaratoria de la Columna 3 se pega a su texto de ayuda y no reserva
   altura adicional (las filas de la matriz siguen alineadas entre columnas). */
.pact-field > .form-text.pact-note {
  min-height: 0;
}

/* SPRINT 004-I — Matrices horizontales de cierre (Pestañas 2 y 3 del módulo de
   incidencias): las cabeceras ordenables se comportan como botones (cursor y
   selección) y el indicador ▲/▼ queda alineado con el rótulo. */
table[data-sortable-table] thead th[data-sort-key] {
  white-space: nowrap;
  cursor: pointer;
  user-select: none;
}

table[data-sortable-table] thead th[data-sort-key] > a {
  cursor: pointer;
}

table[data-sortable-table] thead th[data-sort-key] [data-sort-indicator] {
  color: #6c757d;
  line-height: 1;
}

/* FASE 2 (Sprint 006A) — Impresión de la Matriz de Equivalencias (A4 apaisado).
   Al pulsar «Imprimir / PDF» se ocultan barras de navegación, botones y
   menús; la pestaña activa se pinta con fuente compacta, bordes nítidos y
   cabeceras repetidas en cada página.

   SPRINT 004-Z — Impresión pixel-perfect en A4 APAISADO: márgenes de 8mm/6mm, el
   contenedor de scroll deja de recortar columnas (`overflow: visible`) y ocupa el
   100 % del ancho, la tipografía se condensa a 0,65rem y las celdas no parten de
   línea, de modo que la matriz de equivalencias sale completa en la hoja sin
   barras de desplazamiento ni columnas mutiladas. */
@media print {
  @page {
    size: A4 landscape;
    margin: 8mm 6mm;
  }

  .navbar,
  .sidebar,
  .offcanvas,
  .btn,
  .nav-tabs,
  .dropdown-menu,
  .no-print,
  .table-scroll-top-wrapper {
    display: none !important;
  }

  body,
  .app-layout,
  .app-layout > main {
    display: block !important;
    width: 100% !important;
    min-width: 0 !important;
    margin: 0 !important;
    padding: 0 !important;
    overflow: visible !important;
    background: #ffffff !important;
  }

  /* Solo se imprime la pestaña activa (la matriz de equivalencias). */
  .tab-pane {
    display: none !important;
  }
  .tab-pane.show.active {
    display: block !important;
  }

  .tab-pane .card,
  .tab-pane .card-header,
  .tab-pane .card-body {
    border: none !important;
    box-shadow: none !important;
  }

  .table-responsive {
    overflow: visible !important;
    overflow-x: visible !important;
    display: block !important;
    width: 100% !important;
  }

  /* Sprint 005-B: en papel el contenedor de cabeceras congeladas deja de
     recortar la tabla (sin altura máxima ni barras de desplazamiento). */
  .table-freeze-container {
    max-height: none !important;
    overflow: visible !important;
    border: none !important;
  }

  table {
    font-size: 0.65rem !important;
    border-collapse: collapse !important;
    width: 100% !important;
  }

  thead {
    display: table-header-group;
  }

  th,
  td {
    border: 1px solid #555 !important;
    padding: 2px 4px !important;
    white-space: nowrap !important;
  }

  tr {
    page-break-inside: avoid;
  }

  /* Ninguna barra de desplazamiento se dibuja en el papel (Zero-Build). */
  ::-webkit-scrollbar {
    display: none !important;
  }

  * {
    scrollbar-width: none !important;
  }

  /* Fuente compacta y celdas sin partir para la matriz de muchas columnas. */
  .equivalence-matrix {
    font-size: 0.65rem !important;
    table-layout: auto !important;
  }

  .equivalence-matrix th,
  .equivalence-matrix td {
    font-size: 0.65rem !important;
    white-space: nowrap !important;
  }
}

/* SPRINT 004-Y — Informe de cierre de nómina (sábana matricial horizontal): se
   imprime de borde a borde en A4 apaisado, con tipografía condensada y sin
   barras de desplazamiento que recorten columnas. La plantilla
   `closure/report.html` es un documento AUTÓNOMO (solo Bootstrap por CDN), por
   lo que replica estas reglas en su propio bloque `@media print`; este bloque
   queda como red de seguridad para cualquier incrustación del informe en la
   shell de la aplicación (clase exclusiva `.closure-report-matrix`). */
@media print {
  .closure-report-matrix {
    width: 100% !important;
    table-layout: auto !important;
    font-size: 0.68rem !important;
  }

  .closure-report-matrix th,
  .closure-report-matrix td {
    padding: 2px 4px !important;
    white-space: nowrap !important;
  }

  .closure-report-matrix::-webkit-scrollbar {
    display: none !important;
  }
}
