/**
 * Overrides propios del proyecto Contagram sobre el template NexaDash.
 * Se carga globalmente (config/dz.php → global.css.bottom), así aplica a
 * TODAS las páginas y tablas.
 */

/* --------------------------------------------------------------------------
 * Paleta de marca (Pompei Sanitarios) — azul oscuro + celeste del isologo.
 * Colores tomados por muestreo de píxeles del logo real: azul oscuro
 * #0F1237, celeste #28ACE3.
 *
 * Alcance (decidido con el usuario):
 *  - Azul oscuro → --primary GLOBAL: botones, links, hover/active genéricos,
 *    topbar (--headerbg). Reemplaza el celeste-azulado (#1D69D6) que traía
 *    el template.
 *  - Celeste → NO toca --primary. Se usa puntualmente en 3 lugares:
 *    1) Íconos de la topbar (campana/sobre/pantalla completa).
 *    2) Hover/active del ítem de menú en el sidebar (en vez de heredar el
 *       --primary navy, para diferenciar "dónde estoy parado" del resto de
 *       la UI).
 *    3) Botones/textos "secundarios": mapeado sobre el --bs-info de
 *       Bootstrap (2AA3E7 → 28ACE3), porque ya es la variante que usan
 *       algunas pantallas para acciones secundarias (`text-info`,
 *       `btn-outline-info`, iconos `text-info`, etc. — ver clientes/index).
 *       Así no hace falta tocar cada vista: heredan el celeste solas.
 * ------------------------------------------------------------------------ */
:root {
    --primary: #0F1237;
    --primary-hover: #23285e;
    --primary-dark: #05060d;
    --rgba-primary-1: rgba(15, 18, 55, 0.1);
    --rgba-primary-2: rgba(15, 18, 55, 0.2);
    --rgba-primary-3: rgba(15, 18, 55, 0.3);
    --rgba-primary-4: rgba(15, 18, 55, 0.4);
    --rgba-primary-5: rgba(15, 18, 55, 0.5);
    --rgba-primary-6: rgba(15, 18, 55, 0.6);
    --rgba-primary-7: rgba(15, 18, 55, 0.7);
    --rgba-primary-8: rgba(15, 18, 55, 0.8);
    --rgba-primary-9: rgba(15, 18, 55, 0.9);
    --bs-primary: #0F1237;
    --bs-primary-rgb: 15, 18, 55;
    --bs-info: #28ACE3;
    --bs-info-rgb: 40, 172, 227;
    --headerbg: #0F1237;
}

/* El customizer del template setea `data-headerbg="color_N"` en <body> (según
 * lo último elegido/guardado), y ESE nodo redefine `--headerbg` localmente
 * ahí — como es más cercano en el DOM a `.header` que nuestro `:root` de
 * arriba, gana por herencia (no es un tema de especificidad). Con el
 * selector por presencia de atributo (sin importar el valor) empatamos esa
 * especificidad y, al cargar después, ganamos por orden de cascada. */
[data-headerbg] {
    --headerbg: #0F1237;
}

/* Cabecera del sidebar (`.nav-header`, fondo = --nav-headbg) al mismo color
 * que la topbar (--headerbg), para que ambas cabeceras luzcan unificadas.
 * El logo (isologo + wordmark) venía en trazos oscuros (var(--primary) y
 * #1C2430/#6F767E) pensado para fondo blanco; sobre el navy pasa a blanco,
 * igual que hace el template en sus variantes de color de nav-header
 * (ver `[data-nav-headerbg="color_2"]` en style.css como referencia). */
:root {
    --nav-headbg: #0F1237;
}

[data-nav-headerbg] {
    --nav-headbg: #0F1237;
}

.nav-header .brand-logo .logo-abbr path,
.nav-header .brand-title path {
    fill: #fff !important;
}

.nav-header .hamburger svg path {
    fill: #fff !important;
}

/* `.btn-info`/`.btn-outline-info`/`.badge-info` de NexaDash hardcodean el hex
 * en vez de leer `--bs-info-rgb` (a diferencia de `.text-info`/`.bg-info`/
 * `.border-info`, que sí lo leen y ya quedan celestes con el override de
 * arriba). Hay que repetir acá los mismos 3 estados (normal/hover/active)
 * que trae el template, sólo que centrados en el celeste de marca. */
.btn-info {
    --bs-btn-bg: #28ACE3;
    --bs-btn-border-color: #28ACE3;
    --bs-btn-hover-bg: #48bae7;
    --bs-btn-hover-border-color: #3cb4e6;
    --bs-btn-focus-shadow-rgb: 34, 148, 192;
    --bs-btn-active-bg: #53bee8;
    --bs-btn-active-border-color: #3cb4e6;
    --bs-btn-disabled-bg: #28ACE3;
    --bs-btn-disabled-border-color: #28ACE3;
}

.btn-outline-info {
    --bs-btn-color: #28ACE3;
    --bs-btn-border-color: #28ACE3;
    --bs-btn-hover-bg: #28ACE3;
    --bs-btn-hover-border-color: #28ACE3;
    --bs-btn-focus-shadow-rgb: 40, 172, 227;
    --bs-btn-active-bg: #28ACE3;
    --bs-btn-active-border-color: #28ACE3;
    --bs-btn-disabled-color: #28ACE3;
    --bs-btn-disabled-border-color: #28ACE3;
}

.badge-info {
    background-color: #28ACE3;
}

/* Topbar (`.header`, fondo = --headerbg de arriba): los íconos de
 * notificación venían con `fill="black"` fijo en el SVG y desaparecían
 * sobre el azul oscuro. Los pasamos a celeste (acento de marca) y a azul
 * oscuro sólo cuando el hover les pone un círculo blanco de fondo. */
.header-right .notification_dropdown > .nav-link > svg path {
    fill: #28ACE3 !important;
}

.header-right .notification_dropdown > .nav-link:hover > svg path {
    fill: var(--primary) !important;
}

/* Selector de idioma (demo del template, sin uso funcional en esta app):
 * el texto quedaba oscuro y se perdía sobre la topbar azul oscuro. */
.header .select-country .normal-select .btn,
.header .select-country .normal-select .dropdown-toggle::after {
    color: #fff;
}

/* Sidebar — hover/active en celeste (no hereda el --primary navy global,
 * para diferenciar "sección activa" del resto de la UI). Mismos selectores
 * que usa el template en `style.css` (misma especificidad); como este
 * archivo se carga después, gana por orden en la cascada — sin !important. */
.deznav .metismenu > li:hover > a,
.deznav .metismenu > li:focus > a,
.deznav .metismenu > li.mm-active > a {
    color: #28ACE3;
}

.deznav .metismenu > li:hover > a g [fill],
.deznav .metismenu > li:focus > a g [fill],
.deznav .metismenu > li.mm-active > a g [fill],
.deznav .metismenu > li.mm-active > a .menu-icon svg path {
    fill: #28ACE3;
}

.deznav .metismenu > li.mm-active > a:before {
    background-color: #28ACE3;
}

.deznav .metismenu ul a:hover,
.deznav .metismenu ul a:focus,
.deznav .metismenu ul a.mm-active {
    color: #28ACE3;
}

.deznav .metismenu ul a:hover:before {
    background: rgba(40, 172, 227, 0.5);
}

/* Icono "+" al lado de un ítem de submenú (crea y abre el modal de alta
 * directo). El template asume un único <a> de ancho completo por <li> con
 * padding-left grande y un guioncito ":before" absoluto — sin este reset el
 * segundo <a> hereda ambos y el guioncito queda flotando antes del ícono. */
.deznav .metismenu ul li .menu-crear-btn {
    display: inline-flex !important;
    align-items: center;
    padding: 0 0.9375rem 0 0.5rem !important;
    flex: 0 0 auto;
}

.deznav .metismenu ul li .menu-crear-btn:before {
    content: none !important;
}

/* `.deznav .metismenu > li a > i` (style.css) fuerza font-family: 'Material
 * Icons' + font-weight normal en CUALQUIER <i> descendiente de un <a> bajo un
 * <li> de primer nivel — alcanza también a este ícono anidado y lo dibujaba
 * con el glyph equivocado (el "marcador raro"). Se lo devuelve a Font Awesome. */
.deznav .metismenu ul li .menu-crear-btn i {
    font-family: "Font Awesome 6 Free" !important;
    font-weight: 900 !important;
    font-size: 0.75rem;
    margin-right: 0;
}

/* --------------------------------------------------------------------------
 * DataTables — paginación
 * Fix: los botones "Anterior/Siguiente" se apilaban en vertical (una letra
 * por línea) porque el texto rompía dentro de un contenedor angosto.
 * Forzamos que no se corten y que la barra de paginación fluya en horizontal.
 * Aplicar SIEMPRE en tablas nuevas (ya es global, no hace falta repetir).
 * ------------------------------------------------------------------------ */
.dataTables_wrapper .dataTables_paginate {
    white-space: nowrap;
    overflow: visible;
    /* El template (style.css) pone display:flex + flex-wrap:wrap acá. En
     * contenedores angostos (ej. bandeja de Mensajería) eso hace que
     * "Anterior/1/Siguiente" se apilen verticalmente en vez de quedar en una
     * sola fila. Forzamos flex en fila sin wrap. */
    display: flex !important;
    flex-wrap: nowrap !important;
    align-items: center;
    max-width: 100%;
    overflow-x: auto;
}

.dataTables_wrapper .dataTables_paginate .paginate_button {
    display: inline-block !important;
    white-space: nowrap !important;
    width: auto !important;
    height: auto !important;
    min-width: 2.25rem;
    padding: 0.35rem 0.85rem !important;
    margin: 0 2px;
    box-sizing: border-box;
    text-align: center;
    line-height: 1.4 !important;
    word-break: keep-all;
    overflow: visible;
}

/* El número de página activo (".current") viene envuelto en un <span> y el
 * template le fija height/width:24px + line-height:25px — con nuestro padding
 * de arriba eso hacía que el fondo redondeado quedara recortado arriba/abajo
 * en vez de contener el número completo. */
.dataTables_wrapper .dataTables_paginate span .paginate_button {
    height: auto !important;
    width: auto !important;
    line-height: 1.4 !important;
}

/* Los enlaces "Anterior" / "Siguiente" necesitan más ancho que los números */
.dataTables_wrapper .dataTables_paginate .paginate_button.previous,
.dataTables_wrapper .dataTables_paginate .paginate_button.next {
    min-width: 5.5rem;
}

/* Contenedor de paginación (variante Bootstrap de DataTables) */
.dataTables_wrapper .dataTables_paginate ul.pagination {
    flex-wrap: nowrap;
    margin-bottom: 0;
}

.dataTables_wrapper .dataTables_paginate .page-link {
    white-space: nowrap !important;
}

/* Fila inferior del wrapper (info + paginación): que puedan convivir sin
 * comprimir la paginación hasta romper el texto. */
.dataTables_wrapper .row:last-child {
    align-items: center;
}

/* --------------------------------------------------------------------------
 * Formularios — controles compactos y uniformes (GLOBAL)
 * Los inputs/selects se veían demasiado altos. Los dejamos finos y a la MISMA
 * altura entre sí igualando padding + font-size + line-height (con border-box,
 * misma altura resultante para text/date/select). Labels más ajustados.
 * Regla GLOBAL: aplica a todo el proyecto, no repetir por pantalla.
 * ------------------------------------------------------------------------ */
.form-control,
.form-select {
    padding-top: 0.375rem;
    padding-bottom: 0.375rem;
    font-size: 0.8125rem;
    line-height: 1.4;
    min-height: 0;          /* anular cualquier min-height/height heredado */
    height: auto;
}

/* Los select llevan la flecha nativa; mantenemos padding-right holgado. */
.form-select {
    padding-right: 2rem;
}

/* Variante chica (filas de contacto, etc.): aún más fina. */
.form-control-sm,
.form-select-sm {
    padding-top: 0.25rem;
    padding-bottom: 0.25rem;
    font-size: 0.78125rem;
}

.form-label {
    margin-bottom: 0.25rem;
    font-size: 0.8125rem;
    font-weight: 500;
    color: #495057;
}

/* Contraste de inputs/selects: el default de NexaDash usa borde casi blanco
 * (#e6e6e6) y placeholder muy claro, y dentro de una card queda todo "lavado".
 * Subimos el contraste del borde (reposo y focus) y del placeholder, sin
 * perder el look flat del template. Regla GLOBAL. */
.form-control,
.form-select {
    border-color: #c9ced4;
}

.form-control::placeholder {
    color: #8a929b;
    opacity: 1;
}

.form-control:focus,
.form-select:focus {
    border-color: #28ACE3;
    box-shadow: 0 0 0 0.2rem rgba(40, 172, 227, 0.15);
}

/* Textareas: alto acorde al nuevo tamaño. */
textarea.form-control {
    min-height: auto;
    line-height: 1.4;
}

/* Icono "ojo" de mostrar/ocultar contraseña (login): style.css lo posiciona con
 * `top: 38px` fijo, calibrado para el alto de input viejo (~45px, antes del
 * override de arriba). Con el input compacto quedaba mal ubicado. Usamos `bottom`
 * en vez de `top`: el <span> es el último hijo en el flujo de `.position-relative`,
 * así que su borde inferior coincide con el del input sin importar cuánto mida el
 * label de arriba. */
.eye {
    top: auto;
    bottom: 0.5rem;
}

/* Botones compactos ("sm") por defecto en todo el proyecto.
 * OJO: NexaDash redefine `.btn` MÁS ABAJO en style.css con valores LITERALES
 * (`padding: 10px 20px; font-size: 14px`), que le ganan a un override por
 * variables `--bs-btn-*`. Por eso acá seteamos padding/font-size literales.
 * NO usar !important: `contagram-custom.css` carga después de style.css, así que
 * con igual especificidad (0,1,0) este `.btn` gana por orden. Y como los
 * `.btn-lg`/`.btn-sm` del template son `.btn.btn-lg`/`.btn.btn-sm` (0,2,0),
 * conservan su propio tamaño → un CTA grande con `.btn-lg` explícito sigue
 * funcionando. */
.btn {
    padding: 0.3rem 0.75rem;
    font-size: 0.8125rem;
    line-height: 1.4;
    font-weight: 500;
}

/* --------------------------------------------------------------------------
 * Modal de cliente — ritmo vertical compacto (parecido al form de Contagram)
 * y scroll garantizado del cuerpo. El form es largo; que el modal-body scrollee
 * siempre y el header/footer queden fijos.
 * ------------------------------------------------------------------------ */
#modal-cliente .modal-body .mb-3 {
    margin-bottom: 0.6rem !important;
}

#modal-cliente .modal-body hr {
    margin-top: 0.75rem;
    margin-bottom: 0.75rem;
}

#modal-cliente .modal-body h6 {
    margin-bottom: 0.5rem !important;
}

/* Garantía de scroll: aunque el template ya lo define para
 * .modal-dialog-scrollable, lo reforzamos por si el contenido supera la
 * altura de viewport en pantallas chicas (laptops). Regla GLOBAL: aplica a
 * cualquier modal del proyecto con esa clase (Cliente, Producto, Proveedor,
 * y los que se agreguen a futuro) — antes estaba sólo en #modal-cliente y el
 * mismo problema reapareció en #modal-producto por no estar generalizada. */
.modal-dialog-scrollable .modal-body {
    overflow-y: auto;
    max-height: calc(100vh - 12rem);
}

/* --------------------------------------------------------------------------
 * DataTables Responsive — detalle de fila desplegado alineado a la IZQUIERDA.
 * Por defecto (y con el CSS del template) las columnas ocultas que se muestran
 * al expandir una fila quedaban corridas a la derecha. Forzamos que el detalle
 * (título + valor) se lea de izquierda a derecha, como el resto de la tabla.
 * Regla GLOBAL: aplica a todas las DataTables responsive del proyecto.
 * ------------------------------------------------------------------------ */
table.dataTable > tbody > tr.child ul.dtr-details,
table.dataTable > tbody > tr.child span.dtr-title,
table.dataTable > tbody > tr.child span.dtr-data,
table.dataTable > tbody > tr.child td.child {
    text-align: left !important;
}

table.dataTable > tbody > tr.child ul.dtr-details {
    display: block;
    width: 100%;
    margin: 0;
    padding: 0;
}

table.dataTable > tbody > tr.child ul.dtr-details > li {
    display: flex;
    justify-content: flex-start;
    gap: 0.5rem;
    padding: 0.35rem 0;
    border-bottom: 1px solid rgba(0, 0, 0, 0.05);
}

table.dataTable > tbody > tr.child span.dtr-title {
    min-width: 11rem;
    font-weight: 600;
}

/* Botón ColVis ("Columnas"): pequeño respiro respecto del buscador. */
.dataTables_wrapper .dt-buttons {
    margin-right: 0.5rem;
}

/* --------------------------------------------------------------------------
 * DataTables Responsive — flecha de expandir (►) vs. dropdown "Acciones".
 * En todas las tablas del proyecto la columna "Acciones" es la primera
 * columna (convención `{ data: 'acciones' }` como primer item de `columns`),
 * así que Responsive le agrega la clase `dtr-control` y antepone la flechita
 * como `::before` inline-block. El dropdown de acciones es un `<div>`, o sea
 * un bloque, así que caía a una línea nueva debajo de la flecha en vez de al
 * lado. Alcanza con volverlo inline-block para que queden en la misma fila.
 *
 * NO usar `display:flex` en el `<td>`: saca la celda del algoritmo de layout
 * de la tabla (deja de participar del cálculo de ancho de columna). Se probó
 * en vivo y da exactamente el mismo resultado visual que esto, sin ese riesgo.
 *
 * Regla GLOBAL: aplica a todas las DataTables responsive del proyecto.
 * ------------------------------------------------------------------------ */
table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control > .dropdown {
    display: inline-block;
    vertical-align: middle;
}

table.dataTable.dtr-inline.collapsed > tbody > tr > td.dtr-control:before {
    vertical-align: middle;
}

/* ------------------------------------------------------------------------
 * Select2 (buscador en selects de datos dinámicos): alinear su alto y tipografía
 * con los form-control/form-select compactos del proyecto. Regla GLOBAL.
 *
 * OJO — gotcha ya pisado una vez (24/07/2026): `public/css/style.css` (NexaDash)
 * define `.select2-selection__rendered { min-height: 2.813rem }` (~45px) en el
 * SPAN INTERNO, no en `.select2-selection--single`. Un override que sólo resetea
 * el contenedor externo (height/min-height/padding) NO alcanza: el hijo con
 * min-height grande sigue empujando al padre (height:auto) a ~52px. Cualquier
 * ajuste futuro de alto de Select2 tiene que resetear min-height en AMBOS
 * niveles (contenedor Y `.select2-selection__rendered`), si no vuelve a pasar.
 * ------------------------------------------------------------------------ */
.select2-container--default .select2-selection--single {
    height: auto;
    min-height: 0;
    padding: 0.375rem 0.85rem;
    font-size: 0.8125rem;
    line-height: 1.4;
    border: 1px solid #c9ced4;
    border-radius: 0.5rem;
}
.select2-container--default.select2-container--focus .select2-selection--single,
.select2-container--default.select2-container--open .select2-selection--single {
    border-color: #28ACE3;
    box-shadow: 0 0 0 0.2rem rgba(40, 172, 227, 0.15);
}
.select2-container--default .select2-selection--single .select2-selection__rendered {
    min-height: 0;
    padding: 0;
    line-height: 1.4;
    color: inherit;
}
.select2-container--default .select2-selection--single .select2-selection__arrow {
    height: 100%;
    top: 0;
    right: 4px;
}
.select2-container--default .select2-selection--single .select2-selection__placeholder {
    color: #8a929b;
}
/* style.css (NexaDash) oculta el botón "x" de allowClear con display:none
 * global — se reactiva y se reposiciona a la izquierda de la flecha, que en
 * este override queda fija en right:4px (ver arriba). */
.select2-container--default .select2-selection--single .select2-selection__clear {
    display: inline-block;
    position: absolute;
    top: 50%;
    right: 22px;
    transform: translateY(-50%);
    margin: 0;
    font-size: 1rem;
    color: #8a929b;
}
.select2-container--default .select2-selection--single .select2-selection__clear:hover {
    color: #495057;
}
.select2-container .select2-search--dropdown .select2-search__field {
    font-size: 0.8125rem;
    padding: 0.35rem 0.5rem;
}
.select2-container--default .select2-results__option {
    font-size: 0.8125rem;
}
/* El dropdown debe superar el z-index del modal de Bootstrap. */
.select2-container--open {
    z-index: 1060;
}

/* --------------------------------------------------------------------------
 * Toastr — recupera sus colores propios (verde/rojo/celeste/naranja).
 * Bootstrap 5 también define un componente ".toast" (no relacionado) con la
 * misma especificidad; como carga después que toastr.min.css, su
 * background-color: var(--bs-toast-bg) le gana a .toast-success/.toast-error/
 * etc. y todos los toasts terminaban con el mismo azul oscuro de marca en vez
 * de su color de estado. Se sube la especificidad con el ID del contenedor.
 * ------------------------------------------------------------------------ */
#toast-container > .toast-success {
    background-color: #51a351 !important;
}
#toast-container > .toast-error {
    background-color: #bd362f !important;
}
#toast-container > .toast-info {
    background-color: #2f96b4 !important;
}
#toast-container > .toast-warning {
    background-color: #f89406 !important;
}

/* --------------------------------------------------------------------------
 * Spinner de carga en botones (window.AppBtn.loading, ver elements/btn-loading).
 * El helper reemplaza el HTML del botón por este spinner mientras dura la
 * llamada AJAX; `currentColor` hace que el spinner tome el color de texto que
 * ya tenía el botón (funciona igual para btn-primary, btn-outline-*, btn-light, etc.).
 * ------------------------------------------------------------------------ */
.btn-loading-spinner {
    display: inline-block;
    width: 1em;
    height: 1em;
    vertical-align: -0.15em;
    border: 0.15em solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: btn-loading-spin 0.75s linear infinite;
}

@keyframes btn-loading-spin {
    to {
        transform: rotate(360deg);
    }
}

/* ---------------------------------------------------------------------------
 * Select2 "catálogo editable" (spec 028): la fila fija "Crear X" usa
 * text-primary sobre fondo blanco, pero el resultado resaltado de Select2
 * pinta el fondo con el mismo azul primario (_form-addons-select2.scss) — sin
 * esta regla el texto queda invisible (azul sobre azul) al recorrer el
 * dropdown con el teclado o el mouse.
 * ------------------------------------------------------------------------ */
.select2-results__option--highlighted .select2-resultado-crear {
    color: #fff !important;
}
