/* =========================================================================
   MOBILE-RESPONSIVE LAYER  ·  Sistema Aduanal 2.0  ·  Fase 1
   -------------------------------------------------------------------------
   ARCHIVO ADITIVO. Cargado DESPUES de style.css y CDN para tener
   precedencia natural sin !important salvo casos puntuales.

   PRINCIPIO:
   - 100% de las reglas estan dentro de @media (max-width: X). Desktop
     permanece intacto por construccion: si comentas el <link> de este
     archivo, el sistema vuelve a su estado anterior.
   - Sin reglas globales fuera de media queries (excepto utility classes
     opt-in via data-attribute o clase explicita).

   BREAKPOINTS (target objetivo: 360px y arriba):
   - <= 1199.98px  : laptop pequeno / tablet horizontal
   - <= 991.98px   : tablet vertical (sidebar pasa a drawer - YA EXISTE)
   - <= 767.98px   : movil grande (la mayoria de fixes aplican aqui)
   - <= 575.98px   : movil estandar (modales fullscreen, cards 100%)
   - <= 359.98px   : safety net para Android antiguo (paddings minimos)
   ========================================================================= */


/* =========================================================================
   0b. SAFEGUARD GLOBAL CONTRA "LETRA POR LETRA"
   -------------------------------------------------------------------------
   Algunos contenedores podian heredar word-break: break-all/break-word que
   causa que el texto se rompa letra por letra en celdas estrechas. Aqui
   forzamos word-break: normal en contenedores tipicos para que la ruptura
   solo ocurra en espacios entre palabras (comportamiento esperado).
   overflow-wrap: anywhere se mantiene como salvavidas para URLs/hashes
   muy largos sin espacios.
   ========================================================================= */
@media (max-width: 767.98px) {
    .floating-card,
    .floating-card *,
    .card-body,
    .card-body *,
    .modal-body,
    .modal-body *,
    .dropdown-menu,
    .nav-link,
    .btn,
    td, th, .table td, .table th {
        word-break: normal;
    }
    /* overflow-wrap: anywhere SOLO en contenedores que pueden recibir
       cadenas largas sin espacios (urls, hashes, codigos). No bloquea
       el wrap normal en espacios. */
    .floating-card,
    .modal-body,
    td, th {
        overflow-wrap: anywhere;
    }
}


/* =========================================================================
   0. ANTI-OVERFLOW HORIZONTAL  (CRITICO)
   -------------------------------------------------------------------------
   Sin esto, cualquier tabla ancha o elemento que se salga del viewport
   empuja el <body> horizontalmente. Consecuencias:
     - El usuario puede hacer scroll horizontal en TODA la pagina
     - El sidebar drawer asoma por el costado cuando se "scrollea" la pagina
     - La hamburguesa pasa a estar fuera del area tocable (parece que no
       funciona, pero esta corrida porque la pagina se movio)
     - .top-navbar con position:sticky se rompe en algunos browsers
   La regla clipea a nivel body/main-content; las tablas siguen pudiendo
   scrollear horizontalmente DENTRO de su .table-responsive (lo cual SI
   se permite).
   ========================================================================= */
@media (max-width: 991.98px) {
    html, body {
        overflow-x: hidden;
        max-width: 100vw;
    }
    .main-content {
        overflow-x: hidden;
        max-width: 100vw;
        min-width: 0;
    }
    .content-body {
        overflow-x: hidden;
        max-width: 100%;
        min-width: 0;
    }
    /* Cards y rows tampoco pueden empujar el viewport */
    .floating-card,
    .card {
        max-width: 100%;
        overflow-x: hidden;
    }
    .row { max-width: 100%; }
}


/* =========================================================================
   1. MODALES FULLSCREEN AUTO  (afecta los 60+ modales del sistema)
   -------------------------------------------------------------------------
   Por defecto todos los modales pasan a pantalla completa en <576px.
   Excepcion: agregar clase .modal-no-fullscreen al .modal-dialog para
   modales de confirmacion pequenos que queremos centrados.
   ========================================================================= */
@media (max-width: 575.98px) {

    /* Bootstrap reset de modal-dialog en xs */
    .modal-dialog:not(.modal-no-fullscreen) {
        max-width: 100% !important;
        width: 100% !important;
        margin: 0 !important;
        height: 100vh !important;
        height: 100dvh !important; /* dvh = dynamic vh (resta barra URL movil) */
    }

    /* Modal-content como flex column: header + body (scroll) + footer.
       Patron estandar mas confiable que position:sticky (que tenia issues
       de scroll lock con el body al seleccionar formularios). */
    .modal-dialog:not(.modal-no-fullscreen) .modal-content {
        border-radius: 0 !important;
        height: 100vh;
        height: 100dvh;
        min-height: 100vh;
        min-height: 100dvh;
        border: 0;
        display: flex;
        flex-direction: column;
    }

    /* Header fijo arriba (flex item, no sticky) */
    .modal-dialog:not(.modal-no-fullscreen) .modal-header {
        flex: 0 0 auto;
        background: #fff;
    }

    /* Body toma todo el espacio restante y SCROLLEA su contenido */
    .modal-dialog:not(.modal-no-fullscreen) .modal-body {
        flex: 1 1 auto;
        overflow-y: auto;
        overflow-x: hidden;
        -webkit-overflow-scrolling: touch;
        /* Asegurar scroll completo: el contenido puede ser cualquier alto */
        min-height: 0;
    }

    /* Footer fijo abajo con safe-area iOS */
    .modal-dialog:not(.modal-no-fullscreen) .modal-footer {
        flex: 0 0 auto;
        background: #fff;
        padding-bottom: calc(0.75rem + env(safe-area-inset-bottom, 0));
    }

    /* Botones del footer al 100% por defecto (mejor target touch) */
    .modal-dialog:not(.modal-no-fullscreen) .modal-footer > .btn {
        flex: 1 1 auto;
        min-height: 44px;
    }

    /* CRITICO: si un <form> envuelve body+footer (patron comun), debe heredar
       el layout flex-column para que el body SCROLLEE y el footer quede fijo.
       Sin esto, el form (no-flex) deja el body sin scroll y empuja el footer
       fuera de pantalla -> no se alcanza "Guardar". Aplica a form directo o
       form > fieldset que contenga el body. */
    .modal-dialog:not(.modal-no-fullscreen) .modal-content > form,
    .modal-dialog:not(.modal-no-fullscreen) .modal-content > form > fieldset {
        flex: 1 1 auto;
        min-height: 0;
        display: flex;
        flex-direction: column;
        width: 100%;
    }

    /* Listas marcadas .relajar-scroll-movil: quitan su scroll propio en movil
       para no crear una trampa de scroll anidado (el cuerpo del modal scrollea). */
    .modal-dialog:not(.modal-no-fullscreen) .relajar-scroll-movil {
        max-height: none !important;
        overflow: visible !important;
    }
}


/* =========================================================================
   2. INPUTS / FORMS  -  anti-zoom iOS + tamaño touch
   -------------------------------------------------------------------------
   iOS Safari hace zoom automatico cuando un input tiene font-size < 16px.
   ========================================================================= */
@media (max-width: 575.98px) {

    .form-control,
    .form-select,
    input[type="text"],
    input[type="email"],
    input[type="password"],
    input[type="search"],
    input[type="tel"],
    input[type="number"],
    input[type="date"],
    input[type="datetime-local"],
    input[type="time"],
    textarea,
    select {
        font-size: 16px !important; /* obligatorio para evitar zoom iOS */
        min-height: 44px;
    }

    /* Excepcion: inputs dentro de tablas estilo "edicion inline"
       (donde 16px rompe la grilla) — fuerzan compactos */
    table .form-control,
    table .form-select {
        font-size: 14px !important;
        min-height: 36px;
        padding: .25rem .5rem;
    }

    /* Labels mas legibles arriba en lugar de inline */
    .form-label {
        margin-bottom: .25rem;
        font-size: .82rem;
        font-weight: 600;
    }

    /* Form-floating labels: que no se monten encima del input gigante */
    .form-floating > label {
        font-size: 14px;
    }
}


/* =========================================================================
   3. BOTONES  -  target touch minimo 44x44 + grupos apilados
   -------------------------------------------------------------------------
   IMPORTANTE: el min-height de 44px aplica SOLO a botones "estandar"
   (texto inline). NO aplica a:
     - .btn-sm / .btn-xs               (sizes explicitos pequenos)
     - .btn-link / .btn-close          (sin chrome)
     - .page-link, .pagination .btn    (paginacion DataTables/Bootstrap)
     - .btn-group .btn                 (toolbars de view-toggle)
     - Botones flex-column (icono+texto apilado) ya tienen altura propia
   ========================================================================= */
@media (max-width: 575.98px) {

    /* Boton estandar: target touch 44px + nunca dejar que el texto haga wrap */
    .btn:not(.btn-sm):not(.btn-xs):not(.btn-link):not(.btn-close):not(.page-link):not(.btn-tight) {
        min-height: 44px;
        white-space: nowrap;
    }

    /* Headers tipo "<title> + <action-button>" deben envolver para que el
       boton baje a la siguiente linea (en lugar de comprimirse y forzar
       el texto del boton a apilarse verticalmente "+\n Nueva\n Cuenta") */
    .d-flex.justify-content-between {
        flex-wrap: wrap;
        gap: .75rem;
    }
    .d-flex.justify-content-between > * {
        min-width: 0;
    }

    /* Paginacion: respeta tamano nativo */
    .pagination .btn,
    .pagination .page-link,
    .dataTables_paginate .paginate_button,
    .dataTables_paginate .pagination .page-link {
        min-height: 0 !important;
        padding: .35rem .65rem !important;
        font-size: .85rem !important;
    }

    /* btn-group (toolbars como Lista/Agrupado/Calendario): respeta tamano */
    .btn-group > .btn,
    .btn-toolbar > .btn {
        min-height: 0;
    }

    /* Botones con icono-encima-texto (flex-column): ya tienen altura.
       Detectar por el patron mas comun: estilo "card-action" donde el
       <i> esta separado del texto por un <br> o display:block. */
    .btn[class*="flex-column"],
    .btn.d-flex.flex-column,
    .btn-action-stacked,
    .btn-card-action {
        min-height: 0;
        height: auto;
    }

    /* Botones .rounded-circle (FAB / icon-only) — respetan su tamano */
    .btn.rounded-circle {
        min-height: 0;
    }

    /* btn-group opt-in para pasar a stack vertical */
    .btn-group.btn-group-mobile-stack {
        display: flex;
        flex-direction: column;
        width: 100%;
    }
    .btn-group.btn-group-mobile-stack > .btn {
        border-radius: var(--radius-sm, 12px) !important;
        margin-bottom: .25rem;
    }

    /* d-flex con muchos botones inline: forzar wrap */
    .d-flex.gap-2,
    .d-flex.gap-3 {
        flex-wrap: wrap;
    }
}


/* =========================================================================
   4. CARDS / GRIDS  -  col-md-X sin col-12 → forzar 100% width
   -------------------------------------------------------------------------
   En Bootstrap "col-md-4" SIN col-X significa "auto" debajo de 768px,
   lo cual deja columnas que se comprimen sin orden. Forzamos 100%.
   ========================================================================= */
@media (max-width: 575.98px) {

    /* Si un col-md-X no trae col-X (xs), forzar full width */
    [class*="col-md-"]:not([class*="col-1"]):not([class*="col-2"]):not([class*="col-3"]):not([class*="col-4"]):not([class*="col-5"]):not([class*="col-6"]):not([class*="col-7"]):not([class*="col-8"]):not([class*="col-9"]):not([class*="col-10"]):not([class*="col-11"]):not([class*="col-12"]):not([class*="col-auto"]) {
        flex: 0 0 100%;
        max-width: 100%;
    }
    /* idem para col-lg-X / col-xl-X aislados */
    [class*="col-lg-"]:not([class*="col-1"]):not([class*="col-2"]):not([class*="col-3"]):not([class*="col-4"]):not([class*="col-5"]):not([class*="col-6"]):not([class*="col-7"]):not([class*="col-8"]):not([class*="col-9"]):not([class*="col-10"]):not([class*="col-11"]):not([class*="col-12"]):not([class*="col-md-"]):not([class*="col-sm-"]):not([class*="col-auto"]) {
        flex: 0 0 100%;
        max-width: 100%;
    }

    /* floating-card: reducir padding y border-radius */
    .floating-card {
        border-radius: 16px;
    }
    .floating-card .card-body,
    .card-body {
        padding: 1rem;
    }

    /* Gap excesivo entre cards (col-X g-4) */
    .row.g-4 { --bs-gutter-y: 1rem; --bs-gutter-x: 1rem; }
    .row.g-3 { --bs-gutter-y: .75rem; --bs-gutter-x: .75rem; }
}

@media (max-width: 767.98px) {
    /* En tablet vertical, KPIs col-md-3 sin xs → 2 por fila */
    .row > [class*="col-md-3"]:not([class*="col-sm-"]):not([class*="col-6"]):not([class*="col-12"]):not([class*="col-4"]) {
        flex: 0 0 50%;
        max-width: 50%;
    }
}


/* =========================================================================
   5. TABLAS  -  horizontal scroll suave + opt-in cards apiladas
   -------------------------------------------------------------------------
   Estrategia dual:
   A) .table-responsive  → mejora del scroll con sombras de aviso (todas)
   B) data-mobile-cards="true" en <table> → convierte a cards apiladas
      (opt-in, requiere data-label en <th> o que mobile-tables.js lo
      genere automaticamente).
   ========================================================================= */
@media (max-width: 991.98px) {

    /* Scroll horizontal suave + sombras de borde como hint visual */
    .table-responsive {
        position: relative;
        scroll-snap-type: x proximity;
        -webkit-overflow-scrolling: touch;
        background:
            linear-gradient(to right, #fff, #fff),
            linear-gradient(to right, #fff, #fff),
            linear-gradient(to right, rgba(0,0,0,.08), rgba(255,255,255,0)),
            linear-gradient(to left,  rgba(0,0,0,.08), rgba(255,255,255,0));
        background-position: left center, right center, left center, right center;
        background-repeat: no-repeat;
        background-color: #fff;
        background-size: 20px 100%, 20px 100%, 14px 100%, 14px 100%;
        background-attachment: local, local, scroll, scroll;
    }
}

/* B) Tablas opt-in: data-mobile-cards="true" → apilan en <768px */
@media (max-width: 767.98px) {

    table[data-mobile-cards="true"] {
        display: block;
        width: 100%;
    }
    table[data-mobile-cards="true"] thead {
        position: absolute;
        clip: rect(0 0 0 0);
        clip-path: inset(50%);
        height: 1px; width: 1px;
        overflow: hidden;
        white-space: nowrap;
    }
    table[data-mobile-cards="true"] tbody { display: block; }
    table[data-mobile-cards="true"] tr {
        display: block;
        margin-bottom: 1rem;
        background: #fff;
        border: 1px solid #f0f2f5;
        border-radius: 12px;
        padding: .75rem 1rem;
        box-shadow: 0 2px 8px rgba(0,0,0,.04);
    }
    /* CARDS APILADAS - layout vertical: label ARRIBA, contenido ABAJO
       Mucho menos saturado que label-izq + contenido-der, especialmente
       cuando los labels son largos ("CONCEPTO / PROVEEDOR", etc).

       ALINEACION:
         - Primera celda (concepto/proveedor/nombre): izquierda (es el
           titulo de la card, lee mas natural a la izq).
         - Resto de celdas: centro (Cant, Total, Equivalente, Estado,
           etc. quedan visualmente equilibradas en el ancho de la card).
       Esto da apariencia de "ficha" en lugar de "tabla apilada".
    */
    table[data-mobile-cards="true"] td {
        display: block !important;
        padding: .5rem 0 !important;
        border: 0 !important;
        text-align: right;
        font-size: .9rem;
        line-height: 1.45;
        overflow-wrap: anywhere;
        word-break: normal;
        min-width: 0;
        /* Separador sutil entre filas dentro de la card */
        border-top: 1px dashed #f0f2f5 !important;
    }
    /* Label tambien a la derecha (matches con valor) */
    table[data-mobile-cards="true"] td::before {
        text-align: right;
    }
    /* Primera celda SIN borde superior + alineada a la IZQ
       (es el "titulo" de la card: concepto, cliente, expediente, etc.) */
    table[data-mobile-cards="true"] tr > td:first-child {
        border-top: 0 !important;
        padding-top: .25rem !important;
        text-align: left;
        font-weight: 500;
        font-size: .95rem;
    }
    table[data-mobile-cards="true"] tr > td:first-child::before {
        text-align: left;
    }
    /* Label uppercase muted ENCIMA del valor (no a un lado).
       text-align se hereda del td contenedor (right por default, left
       para td:first-child). */
    table[data-mobile-cards="true"] td::before {
        content: attr(data-label);
        display: block;
        font-weight: 600;
        color: var(--text-muted, #879097);
        text-transform: uppercase;
        font-size: .65rem;
        letter-spacing: .05em;
        margin-bottom: .2rem;
        line-height: 1.2;
        overflow-wrap: break-word;
        word-break: normal;
    }
    /* Contenido (texto, badge, link, etc.) toma todo el ancho disponible.
       Mantenemos inline-display por defecto para no romper estructuras
       internas (badge + small, dropdown, etc). */
    table[data-mobile-cards="true"] td > * {
        max-width: 100%;
        overflow-wrap: anywhere;
        word-break: normal;
    }
    /* Si el contenido tiene varios elementos block (small d-block, p,
       div), heredan el ancho completo naturalmente. */

    /* TFOOT (filas de subtotal/total): tratamos como banner resumen.
       En lugar de apilar cada celda como una "card-row", mostramos toda
       la fila como una unica franja con label + valor en linea. */
    table[data-mobile-cards="true"] tfoot { display: block; }
    table[data-mobile-cards="true"] tfoot tr {
        display: flex !important;
        justify-content: space-between;
        align-items: center;
        gap: .5rem;
        padding: .65rem .75rem;
        background: #f8f9fa;
        border-radius: 8px;
        margin-top: .25rem;
        margin-bottom: .25rem;
        font-weight: 700;
    }
    table[data-mobile-cards="true"] tfoot td {
        display: inline !important;
        padding: 0 !important;
        border: 0 !important;
        font-size: .88rem;
        text-align: left;
        flex: 1 1 auto;
        min-width: 0;
    }
    /* La ultima td del tfoot (que tiene el valor) se alinea derecha */
    table[data-mobile-cards="true"] tfoot tr > td:last-child {
        text-align: right;
        flex: 0 0 auto;
    }
    /* Sin ::before en tfoot (no necesitamos labels apilados) */
    table[data-mobile-cards="true"] tfoot td::before { display: none; }

    /* Filas con colspan dentro de tbody (mensaje "sin datos" o subtotales
       intermedios): tratar como mensaje centrado, no como card-row */
    table[data-mobile-cards="true"] tbody td[colspan] {
        text-align: center !important;
        padding: 1rem 0 !important;
    }
    table[data-mobile-cards="true"] tbody td[colspan]::before {
        display: none;
    }

    /* Celda de "Acciones": separador mas marcado + alineacion derecha
       para que el dropdown 3-puntos quede a la derecha (UX comun) */
    table[data-mobile-cards="true"] td[data-label="Acciones"],
    table[data-mobile-cards="true"] td[data-label="Accion"],
    table[data-mobile-cards="true"] td.td-acciones {
        border-top: 1px solid #f0f2f5 !important;
        padding-top: .65rem !important;
        margin-top: .25rem;
        text-align: right;
    }
    table[data-mobile-cards="true"] td[data-label="Acciones"]::before,
    table[data-mobile-cards="true"] td[data-label="Accion"]::before,
    table[data-mobile-cards="true"] td.td-acciones::before {
        text-align: left;
    }
    /* Para botones tipo "Ver/Revisar" full width touch-friendly */
    table[data-mobile-cards="true"] td.td-acciones-stretch {
        text-align: center;
    }
    table[data-mobile-cards="true"] td.td-acciones-stretch > .btn,
    table[data-mobile-cards="true"] td.td-acciones-stretch > a.btn {
        width: 100%;
        display: block;
    }
}


/* =========================================================================
   6. SIDEBAR  -  refinamiento del drawer existente en <576px y <360px
   -------------------------------------------------------------------------
   El drawer ya funciona en <992px (style.css linea 824). Aqui ajustamos
   el ancho y padding para movil pequeno.

   IMPORTANTE: el style.css original esconde el sidebar con
   transform: translateX(calc(-1 * var(--sidebar-width))) usando 280px
   fijos. Cuando aqui cambiamos el ancho a 88% (mas que 280px), el sidebar
   asoma una franja en el borde izquierdo. Lo arreglamos forzando
   translateX(-105%) en todo el rango movil — mueve el elemento completo
   sin importar su ancho.
   ========================================================================= */

/* Fix franja asomando: aplicar a TODO el rango drawer (<=991.98px),
   no solo a <576px, por si en tablet vertical pasara algo parecido */
@media (max-width: 991.98px) {
    .sidebar {
        transform: translateX(-105%) !important;
    }
    body.sidebar-open .sidebar {
        transform: translateX(0) !important;
    }
}

@media (max-width: 575.98px) {

    .sidebar {
        width: 88%;
        max-width: 320px;
        padding: .75rem;
    }
    .sidebar-inner {
        padding: 1rem .75rem;
        border-radius: 16px;
    }
    .sidebar-brand-container { padding: 0 .25rem .75rem; }
    .nav-link-custom {
        padding: .65rem .75rem;
        min-height: 44px; /* touch */
    }
}

@media (max-width: 359.98px) {
    .sidebar { width: 92%; padding: .5rem; }
    .sidebar-inner { padding: .75rem .5rem; }
}


/* =========================================================================
   7. NAVBAR SUPERIOR
   -------------------------------------------------------------------------
   En <576px reducimos paddings y altura para ganar pantalla util.
   ========================================================================= */
@media (max-width: 767.98px) {

    .top-navbar {
        padding: 0 .75rem;
        gap: .5rem;
    }
    /* navbar-left puede comprimirse (titulo con ellipsis si no cabe) */
    .navbar-left {
        flex: 1 1 auto;
        min-width: 0;
        overflow: hidden;
    }
    .navbar-breadcrumb {
        min-width: 0;
        flex: 1 1 auto;
        overflow: hidden;
    }
    .page-title {
        font-size: .9rem;
        white-space: nowrap;
        overflow: hidden;
        text-overflow: ellipsis;
        max-width: 100%;
    }
    /* navbar-right NUNCA se comprime - el badge BCV se ve completo */
    .navbar-right {
        flex: 0 0 auto;
        gap: .35rem;
        flex-shrink: 0;
    }
    .tasa-badge {
        padding: .3rem .55rem;
        font-size: .75rem;
        white-space: nowrap;
        flex-shrink: 0;
    }
    .tasa-valor {
        font-size: .8rem;
        white-space: nowrap;
    }
    .user-pill {
        padding: .25rem;
        flex-shrink: 0;
    }
    .user-avatar { width: 32px; height: 32px; font-size: .85rem; }
}

@media (max-width: 575.98px) {
    /* Aun mas compacto: el icono de la tasa puede ocultarse para ganar
       espacio si el titulo es muy largo */
    .tasa-badge i.bi-graph-up-arrow {
        display: none;
    }
    .tasa-badge {
        padding: .35rem .6rem;
        gap: 0;
    }
}

@media (max-width: 359.98px) {
    .top-navbar { padding: 0 .5rem; gap: .35rem; }
    .page-title { font-size: .8rem; }
    .tasa-badge { font-size: .7rem; padding: .3rem .5rem; }
    .tasa-valor { font-size: .72rem; }
    .user-avatar { width: 28px; height: 28px; font-size: .75rem; }
}


/* =========================================================================
   8. CONTENT BODY  -  padding adaptativo
   ========================================================================= */
@media (max-width: 767.98px) {
    .content-body { padding: 1rem .75rem !important; }
}
@media (max-width: 359.98px) {
    .content-body { padding: .75rem .5rem !important; }
}


/* =========================================================================
   9. CHARTS (Chart.js)  -  altura adaptativa
   -------------------------------------------------------------------------
   Charts dentro de un contenedor .floating-card o con clase .chart-wrap
   se ajustan a altura razonable en movil.
   ========================================================================= */
@media (max-width: 767.98px) {
    .floating-card canvas,
    .chart-wrap canvas,
    canvas[id*="chart" i],
    canvas[id*="grafic" i] {
        max-height: 240px !important;
    }
}
@media (max-width: 575.98px) {
    .floating-card canvas,
    .chart-wrap canvas,
    canvas[id*="chart" i],
    canvas[id*="grafic" i] {
        max-height: 200px !important;
    }
}


/* =========================================================================
   10. FILTROS DENSOS  -  garantizar flex-wrap en barras de filtros
   ========================================================================= */
@media (max-width: 767.98px) {
    .row.g-2.align-items-end,
    .row.g-3.align-items-end {
        --bs-gutter-y: .5rem;
    }
    .filtros-bar,
    .toolbar-filtros {
        flex-wrap: wrap !important;
        gap: .5rem !important;
    }
}


/* =========================================================================
   10b. TABS DEL SISTEMA  -  scroll horizontal en lugar de wrap a 2 lineas
   -------------------------------------------------------------------------
   Las tabs (.sistema-tabs / .nav-pills / .nav-tabs) en lugar de envolver
   a 2 lineas en movil, pasan a scroll horizontal con snap. Mejor UX y
   se ve "organizado". Mask gradient en bordes como hint visual.
   ========================================================================= */
@media (max-width: 767.98px) {

    .nav.sistema-tabs,
    .nav.nav-pills:not(.flex-column),
    .nav.nav-tabs:not(.flex-column) {
        flex-wrap: nowrap !important;
        overflow-x: auto;
        overflow-y: hidden;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none; /* Firefox */
        scroll-snap-type: x proximity;
        padding-bottom: 6px; /* espacio para sombra del .active */
        margin-bottom: 1rem;
        /* NO mask-image: afecta dropdowns descendientes (ven cortados) */
    }
    /* Ocultar barra de scroll horizontal en webkit */
    .nav.sistema-tabs::-webkit-scrollbar,
    .nav.nav-pills::-webkit-scrollbar,
    .nav.nav-tabs::-webkit-scrollbar {
        display: none;
        height: 0;
    }
    /* Cada item: no shrink + snap al inicio */
    .nav.sistema-tabs > .nav-item,
    .nav.sistema-tabs > li,
    .nav.sistema-tabs > .nav-link,
    .nav.nav-pills > .nav-item,
    .nav.nav-pills > li,
    .nav.nav-pills > .nav-link,
    .nav.nav-tabs > .nav-item,
    .nav.nav-tabs > li,
    .nav.nav-tabs > .nav-link {
        scroll-snap-align: start;
        flex-shrink: 0;
    }
    .nav.sistema-tabs .nav-link,
    .nav.nav-pills .nav-link,
    .nav.nav-tabs .nav-link {
        white-space: nowrap;
    }
}


/* =========================================================================
   10c. TOOLBARS DE ACCIONES  -  scroll horizontal "deslizante" en movil
   -------------------------------------------------------------------------
   Pattern: <div class="d-flex gap-X flex-wrap"> con 2+ botones, comun en
   detalles de expediente, cotizacion, perfiles. En movil pasan a scroll
   horizontal con snap (mismo patron que tabs):
     - Compacto: solo 1 linea
     - Swipe horizontal para descubrir mas acciones
     - Mask fade en los bordes = pista visual de "hay mas"
     - Cada boton conserva su ancho natural (no se estiran)

   Selector :has() -> Chrome 105+, Safari 15.4+, Firefox 121+. En browsers
   viejos cae al wrap default (sigue funcional, solo menos bonito).
   Para forzar este comportamiento sin :has(): clase .acciones-toolbar.
   Para forzar GRID en lugar de scroll: clase .acciones-toolbar-grid.
   ========================================================================= */
/* Regla principal: .acciones-toolbar (taggeada por JS o markup).
   AISLADA en su propio bloque — si :has() no es soportado por el browser,
   esta regla sigue funcionando. */
@media (max-width: 767.98px) {

    .acciones-toolbar {
        flex-wrap: nowrap !important;
        overflow-x: auto;
        /* IMPORTANTE: NO usar mask-image aqui - afecta el rendering de
           descendientes (los dropdowns con position:fixed igual heredan
           el mask y se ven cortados/desvanecidos). En su lugar, el
           usuario solo ve el scroll horizontal sin fade visual.
           Si quieres un hint visual de "deslizable", usar el contenedor
           wrapper (no toolbar) con sombras inset que NO afecta hijos. */
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none; /* Firefox */
        scroll-snap-type: x proximity;
        padding-bottom: 6px;
        margin: 0 0 .75rem 0;
        max-width: 100%;
    }
    .acciones-toolbar::-webkit-scrollbar {
        display: none;
        height: 0;
    }
    .acciones-toolbar > * {
        flex-shrink: 0;
        scroll-snap-align: start;
        margin: 0 !important;
    }
    .acciones-toolbar > .btn,
    .acciones-toolbar > .dropdown > .btn,
    .acciones-toolbar > .btn-group > .btn {
        white-space: nowrap;
    }
}

/* Regla complementaria :has() — solo para browsers que la soporten
   (Chrome 105+, Safari 15.4+, Firefox 121+). Si el browser NO la soporta,
   este bloque entero se descarta SIN afectar la regla del .acciones-toolbar
   de arriba. El JS auto-tag garantiza cobertura en todos los browsers. */
@media (max-width: 767.98px) {
    .d-flex.flex-wrap.gap-2:has(> .btn ~ .btn),
    .d-flex.gap-2.flex-wrap:has(> .btn ~ .btn),
    .d-flex.flex-wrap.gap-3:has(> .btn ~ .btn),
    .d-flex.gap-3.flex-wrap:has(> .btn ~ .btn) {
        flex-wrap: nowrap !important;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        scrollbar-width: none;
        scroll-snap-type: x proximity;
        padding-bottom: 6px;
        margin: 0 0 .75rem 0;
        max-width: 100%;
        /* NO mask-image: afecta dropdowns descendientes (ven cortados) */
    }
    .d-flex.flex-wrap.gap-2:has(> .btn ~ .btn)::-webkit-scrollbar,
    .d-flex.gap-2.flex-wrap:has(> .btn ~ .btn)::-webkit-scrollbar,
    .d-flex.flex-wrap.gap-3:has(> .btn ~ .btn)::-webkit-scrollbar,
    .d-flex.gap-3.flex-wrap:has(> .btn ~ .btn)::-webkit-scrollbar {
        display: none;
        height: 0;
    }
    .d-flex.flex-wrap.gap-2:has(> .btn ~ .btn) > *,
    .d-flex.gap-2.flex-wrap:has(> .btn ~ .btn) > *,
    .d-flex.flex-wrap.gap-3:has(> .btn ~ .btn) > *,
    .d-flex.gap-3.flex-wrap:has(> .btn ~ .btn) > * {
        flex-shrink: 0;
        scroll-snap-align: start;
        margin: 0 !important;
    }
}

/* =========================================================================
   10c-alt. OPT-IN PARA GRID (en lugar de deslizante)
   -------------------------------------------------------------------------
   Si en algun caso especifico queremos grid 2-col en lugar de scroll
   horizontal, agregar la clase .acciones-toolbar-grid al contenedor.
   ========================================================================= */
@media (max-width: 575.98px) {
    .acciones-toolbar-grid {
        display: grid !important;
        grid-template-columns: repeat(2, 1fr);
        gap: .5rem !important;
        overflow: visible !important;
        -webkit-mask-image: none !important;
                mask-image: none !important;
    }
    .acciones-toolbar-grid > *,
    .acciones-toolbar-grid > .btn,
    .acciones-toolbar-grid > .dropdown,
    .acciones-toolbar-grid > .dropdown > .btn {
        width: 100%;
        margin: 0 !important;
    }
}
@media (max-width: 359.98px) {
    .acciones-toolbar-grid { grid-template-columns: 1fr; }
}


/* =========================================================================
   11. WIZARDS  -  steppers verticales en movil
   -------------------------------------------------------------------------
   Wizards con estructura .wizard-steps (modal_nuevo_expediente,
   cotizaciones, etc): pasan de barra horizontal a stack vertical.
   ========================================================================= */
@media (max-width: 575.98px) {

    .wizard-steps,
    .stepper,
    .nav-pills.wizard-nav {
        flex-direction: column !important;
        gap: .35rem !important;
    }
    .wizard-step,
    .stepper-item,
    .nav-pills.wizard-nav .nav-link {
        width: 100%;
        text-align: left;
    }

    /* Conector horizontal de stepper (linea) -> ocultar en movil */
    .wizard-step::after,
    .stepper-item::after,
    .stepper-connector {
        display: none !important;
    }

    /* Botonera Anterior/Siguiente: pasa a full-width stack */
    .wizard-actions,
    .wizard-buttons {
        flex-direction: column !important;
        gap: .5rem !important;
    }
    .wizard-actions .btn,
    .wizard-buttons .btn {
        width: 100%;
    }
}


/* =========================================================================
   12. DROPDOWNS  -  evitar overflow horizontal de menus largos + z-index
   -------------------------------------------------------------------------
   z-index alto es CRITICO en mobile: las cards siguientes (floating-card,
   KPIs) en flujo normal pintan despues que los dropdowns y los tapan.
   Bootstrap default es 1000; lo subimos a 1080 (sobre todo excepto
   modales y tooltips) para garantizar que el menu aparezca encima.
   ========================================================================= */
.dropdown-menu {
    z-index: 1080;
}
.dropdown-menu.show {
    z-index: 1080;
}

@media (max-width: 575.98px) {
    .dropdown-menu {
        max-width: 92vw;
        font-size: .9rem;
    }
    .dropdown-item {
        padding: .65rem 1rem;
        min-height: 44px;
        display: flex;
        align-items: center;
    }
}


/* =========================================================================
   13. SWEETALERT2  -  ancho razonable en movil
   ========================================================================= */
@media (max-width: 575.98px) {
    .swal2-popup {
        width: 92vw !important;
        max-width: 92vw !important;
        font-size: .9rem !important;
        padding: 1rem !important;
    }
    .swal2-title { font-size: 1.1rem !important; }
    .swal2-html-container { font-size: .9rem !important; }
    .swal2-actions { gap: .35rem !important; }
    .swal2-actions .swal2-styled {
        min-height: 44px;
        flex: 1 1 auto;
    }
}


/* =========================================================================
   14. SELECT2  -  fix de altura y touch
   ========================================================================= */
@media (max-width: 575.98px) {
    .select2-container--bootstrap-5 .select2-selection {
        min-height: 44px !important;
        font-size: 16px !important;
    }
    .select2-container--bootstrap-5 .select2-selection--single {
        padding: .25rem .75rem !important;
    }
    .select2-container--open .select2-dropdown {
        max-width: 92vw;
    }
    .select2-results__option {
        min-height: 44px;
        padding: .6rem .75rem !important;
        font-size: 15px;
    }
}


/* =========================================================================
   14b. FULLCALENDAR  -  toolbar mobile-friendly
   -------------------------------------------------------------------------
   FullCalendar 6 genera botones .fc-button con texto sin nowrap. En movil
   el contenedor estrecho hace que el texto se rompa letra-por-letra
   ("m\no\nn\nt\nh"). Forzamos nowrap + tamano compacto.
   ========================================================================= */
@media (max-width: 575.98px) {

    .fc .fc-toolbar {
        flex-wrap: wrap;
        gap: .5rem;
        justify-content: center;
    }
    .fc .fc-toolbar-title {
        font-size: 1rem !important;
        text-align: center;
        width: 100%;
        order: -1;
    }
    .fc .fc-button-group {
        flex-wrap: nowrap;
    }
    .fc .fc-button,
    .fc .fc-button-primary {
        font-size: .75rem !important;
        padding: .35rem .55rem !important;
        white-space: nowrap !important;
        min-height: 34px !important;
        line-height: 1.2 !important;
    }
    /* Headers de dia mas compactos */
    .fc .fc-col-header-cell {
        font-size: .7rem;
        padding: .25rem !important;
    }
    .fc .fc-daygrid-day-number {
        font-size: .75rem;
        padding: 2px 4px !important;
    }
    .fc .fc-event {
        font-size: .65rem;
        padding: 1px 3px;
    }
    .fc .fc-event-title {
        white-space: normal;
        overflow-wrap: anywhere;
    }
}


/* =========================================================================
   15. DATATABLES  -  responsive del wrapper
   ========================================================================= */
@media (max-width: 767.98px) {
    .dataTables_wrapper .row {
        --bs-gutter-y: .5rem;
    }
    .dataTables_filter,
    .dataTables_length {
        text-align: left !important;
    }
    .dataTables_filter input,
    .dataTables_length select {
        width: 100% !important;
        margin: .25rem 0 !important;
    }
    .dataTables_paginate .pagination {
        flex-wrap: wrap;
        gap: .25rem;
    }
}


/* =========================================================================
   16. UTILITIES OPT-IN  -  clases que el desarrollador agrega al markup
   -------------------------------------------------------------------------
   Para casos donde necesitamos forzar comportamiento desde una vista
   especifica sin tocar la regla global.
   ========================================================================= */

/* Forzar full-width en cualquier breakpoint */
.mobile-full      { /* default: no aplica */ }
@media (max-width: 575.98px) {
    .mobile-full      { width: 100% !important; flex: 0 0 100% !important; max-width: 100% !important; }
    .mobile-stack     { flex-direction: column !important; }
    .mobile-hide      { display: none !important; }
    .mobile-show      { display: block !important; }
    .mobile-show-flex { display: flex !important; }
    .mobile-text-sm   { font-size: .8rem !important; }
}
@media (min-width: 576px) {
    .mobile-show      { display: none !important; }
    .mobile-show-flex { display: none !important; }
}


/* =========================================================================
   17. SAFE-AREA iOS  (notch del iPhone + status bar en modo PWA)
   -------------------------------------------------------------------------
   Cuando la app corre instalada como PWA (display-mode: standalone) en
   iOS, la status bar del sistema (hora, bateria, wifi) queda sobrepuesta
   al contenido porque usamos apple-mobile-web-app-status-bar-style:
   black-translucent (necesario para que el theme color se vea).

   Fix: agregar padding-top con env(safe-area-inset-top) al navbar SOLO
   cuando display-mode es standalone. En el browser normal Safari ya
   tiene su barra de URL que da clearance natural.
   ========================================================================= */
@supports (padding: max(0px)) {
    .main-content {
        padding-left:  env(safe-area-inset-left, 0);
        padding-right: env(safe-area-inset-right, 0);
    }
}

/* PWA instalada en iOS: empujar el navbar debajo de la status bar */
@media (display-mode: standalone) {
    .top-navbar {
        padding-top: env(safe-area-inset-top, 0) !important;
        height: calc(var(--navbar-height, 68px) + env(safe-area-inset-top, 0)) !important;
    }
    /* Cuerpo de pagina respeta safe-area bottom (home indicator iPhone) */
    .main-content {
        padding-bottom: env(safe-area-inset-bottom, 0);
    }
    /* Sidebar drawer en mobile tambien respeta safe-area top */
    .sidebar {
        padding-top: calc(.75rem + env(safe-area-inset-top, 0)) !important;
    }
}

/* iOS PWA standalone tradicional (fallback para Safari viejo iOS<13) */
@supports (-webkit-touch-callout: none) {
    @media (display-mode: standalone) {
        .top-navbar {
            padding-top: env(safe-area-inset-top, 20px) !important;
        }
    }
}


/* =========================================================================
   18. CxC / CxP - vistas "Agrupado por cliente/proveedor"
   -------------------------------------------------------------------------
   Estas vistas usan layouts custom (NO tablas) con clases:
     .cxc-grupo-cliente, .cxc-grupo-cliente-header, .cxc-grupo-exp,
     .cxc-grupo-exp-items, .cxc-item-row
     .cxp-grupo, .cxp-grupo-header, .cxp-grupo-exp, .cxp-item-row
   Originalmente usan display:flex + justify-content:space-between +
   spans con min-width:90px/140px que NO wrappean en movil.

   Fix: en <576px desactivamos min-width fijos, permitimos wrap,
   apilamos botones de accion a full-width.
   ========================================================================= */
@media (max-width: 575.98px) {

    /* Headers de grupo: wrap si los hijos no caben */
    .cxc-grupo-cliente-header,
    .cxc-grupo-exp,
    .cxp-grupo-header,
    .cxp-grupo-exp {
        flex-wrap: wrap !important;
        align-items: flex-start !important;
        gap: .5rem !important;
        padding: 12px 14px !important;
    }
    .cxc-grupo-exp,
    .cxp-grupo-exp {
        padding-left: 16px !important; /* reducir indent que era 38px */
    }
    .cxc-grupo-exp-items,
    .cxp-grupo-exp-items {
        padding-left: 8px !important;
        padding-right: 8px !important;
    }

    /* Item rows (Liquidacion, Gasto Financiado, Operativa, etc): wrap */
    .cxc-item-row,
    .cxp-item-row {
        flex-wrap: wrap !important;
        padding: 10px !important;
        gap: 8px !important;
    }
    /* Badges, montos y estados dentro: no min-width fijo */
    .cxc-item-row > *,
    .cxp-item-row > *,
    .cxc-grupo-cliente-header > *,
    .cxc-grupo-exp > *,
    .cxp-grupo-header > *,
    .cxp-grupo-exp > * {
        min-width: 0 !important;
        max-width: 100%;
    }

    /* Override de inline style="min-width:XXpx" en spans de monto/badge */
    .cxc-item-row [style*="min-width"],
    .cxp-item-row [style*="min-width"],
    .cxc-grupo-cliente-header [style*="min-width"],
    .cxc-grupo-exp [style*="min-width"],
    .cxp-grupo-header [style*="min-width"],
    .cxp-grupo-exp [style*="min-width"],
    .cxc-monto-mono,
    .cxp-monto-mono {
        min-width: 0 !important;
        width: auto !important;
    }

    /* Botones de accion en header de grupo: full-width apilados
       (Estado de cuenta + Liquidar saldo + Cobrar todo / Pagar todo) */
    .cxc-grupo-cliente-header .btn,
    .cxp-grupo-header .btn {
        flex: 1 1 100%;
        min-height: 40px;
        font-size: .8rem;
    }
    .cxc-grupo-exp .btn,
    .cxp-grupo-exp .btn {
        flex: 1 1 auto;
        font-size: .75rem;
    }

    /* Barra flotante (.cxc-bar-flotante): mas compacta */
    .cxc-bar-flotante,
    .cxp-bar-flotante {
        padding: 10px 14px !important;
        gap: 8px !important;
        font-size: .75rem !important;
        margin: 12px -4px 0 !important;
    }
    .cxc-bar-flotante .btn,
    .cxp-bar-flotante .btn {
        flex: 1 1 auto;
        font-size: .8rem;
        min-height: 40px;
    }
}


/* =========================================================================
   19. TIMELINE de expediente (CSS local en expediente_detalle.php)
   -------------------------------------------------------------------------
   El timeline usa #tlContenido .tl-line con padding-left:38px y
   .tl-bullet con left:-30px. En <360px deja poco espacio para texto.
   ========================================================================= */
@media (max-width: 575.98px) {
    #tlContenido .tl-line,
    .timeline-line {
        padding-left: 22px !important;
    }
    #tlContenido .tl-bullet,
    .timeline-bullet {
        left: -20px !important;
        width: 18px !important;
        height: 18px !important;
        font-size: .65rem !important;
    }
}


/* =========================================================================
   20. RADIO BUTTONS / CHECKBOX GROUPS en flex - apilar en movil
   -------------------------------------------------------------------------
   Pattern: <div class="d-flex gap-2"> con <input type="radio">+<label>
   pares que en <360px se comprimen letra-por-letra ("Bolívares → USD").
   ========================================================================= */
@media (max-width: 575.98px) {

    /* d-flex gap-2 SIN flex-wrap: si tiene 2+ botones/labels, apilar
       Solo aplica a contenedores donde TODOS los hijos son inputs/labels */
    .d-flex.gap-2:not(.flex-wrap) > .btn,
    .d-flex.gap-2:not(.flex-wrap) > label.btn,
    .d-flex.gap-2:not(.flex-wrap) > .form-check {
        flex: 1 1 100%;
        min-width: 0;
    }
    /* Para que se apilen verticalmente, agregamos opt-in via clase */
    .d-flex.gap-2.mobile-stack-buttons {
        flex-direction: column !important;
    }
    .d-flex.gap-2.mobile-stack-buttons > * {
        width: 100% !important;
    }
}


/* =========================================================================
   21. NAVBAR LATERAL (Bandeja despachos detalle - galeria de fotos)
   -------------------------------------------------------------------------
   La galeria col-6 col-md-4 ya funciona, pero asegurar que aspect-ratio
   y absolute positioning del badge se mantengan.
   ========================================================================= */
@media (max-width: 359.98px) {
    /* Asegurar que galerias con col-6 sigan funcionando en 360px */
    .row > .col-6 > [style*="aspect-ratio"] {
        max-width: 100%;
    }
}


/* =========================================================================
   22. PWA INSTALL BUTTON  -  boton de instalacion en login (mobile only)
   -------------------------------------------------------------------------
   El boton se oculta por defecto. JS lo muestra cuando:
     - Es mobile (no desktop)
     - La app NO esta ya instalada (no es display-mode: standalone)
     - Hay 'beforeinstallprompt' disponible (Chrome/Edge Android)
       O es iOS Safari (mostramos instrucciones manuales)
   ========================================================================= */

/* Estilos base del bar de instalacion - aplica en todas las resoluciones
   pero se muestra solo en mobile por JS y media query */
.pwa-install-bar {
    margin-top: 1.5rem;
    padding-top: 1.25rem;
    border-top: 1px solid #eef0f2;
}

.btn-pwa-install {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 100%;
    padding: .85rem 1.25rem;
    background: linear-gradient(135deg, #2b3035 0%, #495057 100%);
    color: #fff;
    border: none;
    border-radius: 14px;
    font-weight: 600;
    font-size: .9rem;
    letter-spacing: .3px;
    cursor: pointer;
    transition: all .25s ease;
    font-family: inherit;
    box-shadow: 0 6px 16px rgba(43, 48, 53, 0.22);
    min-height: 48px;
}

.btn-pwa-install:hover,
.btn-pwa-install:active {
    background: linear-gradient(135deg, #1a1e22 0%, #343a40 100%);
    transform: translateY(-1px);
    box-shadow: 0 8px 20px rgba(43, 48, 53, 0.30);
}

.btn-pwa-install i { font-size: 1.05rem; }

.pwa-install-help {
    font-size: .72rem;
    line-height: 1.35;
}

/* Ocultar en desktop (escritorio puede instalar tambien pero, segun
   pedido del usuario, el boton solo aparece en movil) */
@media (min-width: 992px) {
    .pwa-install-bar { display: none !important; }
}

/* Ocultar si la app ya esta corriendo como PWA instalada */
@media (display-mode: standalone) {
    .pwa-install-bar { display: none !important; }
}


/* =========================================================================
   FIN DEL ARCHIVO  -  Sistema Aduanal 2.0 Mobile Layer v1
   ========================================================================= */
