/* ==========================================================================
   GRIFFO Repanalytics — CAMADA MOBILE
   Carregar SEMPRE POR ÚLTIMO (depois de redesign.css e do CSS da tela).
   Media query não altera especificidade: o que faz esta camada vencer é a
   ordem de origem. Por isso o link precisa ser o último da <head>.

   Breakpoints:
     <= 768px  celular / tablet em retrato
     <= 480px  celular em retrato (iPhone SE 375 · Android 360-412 · Max 430)
     <= 380px  celular pequeno
     altura <= 520px + paisagem  celular deitado

   Por que o corte por ALTURA na seção 7: deitado o celular passa dos 768px
   de largura (~780-950px), então a faixa de largura não o alcança e o layout
   caía nas regras de tablet. Altura é o que separa de verdade um telefone
   deitado (menos de ~520px) de um tablet em retrato (1000px ou mais).

   Índice:
     0. Fundações sem breakpoint
     1. <= 768px  Fundações
     2. <= 768px  Por tela
     3. <= 480px  Fundações
     4. <= 480px  Por tela
     5. <= 380px  Ajustes finos
     6. Login em retrato (faixa da marca + card)
     7. Celular deitado
     8. Combobox (a lista suspensa que o iPhone não desenha)
   ========================================================================== */


/* ==========================================================================
   0. FUNDAÇÕES SEM BREAKPOINT
   ========================================================================== */

/* Impede que qualquer elemento largo (tabela, gráfico, banner) empurre a
   página inteira e crie scroll lateral — o vilão nº 1 de layout em celular.
   A rolagem horizontal fica contida no bloco que precisa dela (seção 1).

   `clip` em vez de `hidden`: `overflow-x: hidden` transforma o elemento em
   contêiner de rolagem e isso QUEBRA o `position: sticky` do .header
   (redesign.css). `clip` corta o transbordo sem criar contêiner de rolagem.
   A linha `hidden` fica antes como fallback para navegador sem suporte. */
html{
    overflow-x: hidden;
    overflow-x: clip;
    -webkit-text-size-adjust: 100%;
    text-size-adjust: 100%;
}
body{
    overflow-x: hidden;
    overflow-x: clip;
}

/* Nada de mídia estourando a largura do container.
   `canvas` fica de fora de propósito: os gráficos já são dimensionados pelo
   container (altura fixa no card + canvas em height:100%) e mexer aqui
   atrapalharia o cálculo do Chart.js. */
img, svg, video, iframe{
    max-width: 100%;
}

/* Trava o scroll do fundo enquanto a sidebar está aberta (classe posta pelo
   sidebar_standard.js). Sem isso o conteúdo rola atrás do menu no iOS. */
body.no-scroll{
    overflow: hidden !important;
    position: fixed;
    width: 100%;
}

/* Altura do menu lateral.
   O standard_layout_style usa `min-height: 100vh`, e no celular 100vh é a
   altura da viewport COM A BARRA DE ENDEREÇO ESCONDIDA — maior que a área
   realmente visível. O painel ficava mais alto que a tela e o rodapé
   (Meu Perfil / Sair), ancorado no fim por `margin-top: auto`, caía fora.
   `dvh` é a altura visível de verdade. Como o scroll do fundo fica travado
   enquanto o menu está aberto, a barra do navegador não se mexe e o valor
   não oscila. No desktop 100dvh é igual a 100vh, então nada muda lá. */
.left-sidebar{
    height: 100vh;
    height: 100dvh;
    min-height: 0 !important;
    max-height: 100dvh;
    overflow: hidden;
}
/* a navegação rola por dentro; o rodapé nunca encolhe */
.left-sidebar .nav-buttons{
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
}
.left-sidebar .sidebar-footer{
    flex-shrink: 0;
}

/* A tabela é o único bloco que legitimamente passa da largura da tela.
   Esta regra NÃO pode ficar dentro de media query: `table thead th` tem
   `white-space: nowrap` em qualquer largura (redesign.css), então a tabela
   transborda bem antes do desktop — e o `overflow-x: clip` acima impede a
   página de rolar de lado. Sem um container rolável em toda largura, as
   colunas da direita ficam inalcançáveis (era o caso do celular deitado,
   entre 769px e 1024px, onde a camada mobile não chegava).
   Quando a tabela cabe, `overflow-x: auto` não faz nada. */
.admin-table-wrap,
.abc-table-wrap,
.sellout-panel,
.dataTables_wrapper .row > div:has(> table),
.main-content:has(> table),
.main-content > form:has(> table),
.main-content > div:has(> table){
    overflow-x: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior-x: contain;
}


/* ==========================================================================
   1. <= 768px — FUNDAÇÕES
   ========================================================================== */
@media screen and (max-width: 768px){

    /* ---------- F3 · Header ---------- */
    :root{
        --header-h: 56px;
    }
    .header{
        height: 56px !important;
        padding: 0 12px !important;
        padding-left: max(12px, env(safe-area-inset-left)) !important;
        padding-right: max(12px, env(safe-area-inset-right)) !important;
        gap: 10px !important;
    }
    .header-logo a img{
        width: 34px !important;
    }
    .menu-hamburger{
        width: 44px !important;
        height: 44px !important;
        margin-left: -6px;
    }

    /* ---------- F2 · Sidebar em tela cheia ---------- */
    .left-sidebar{
        max-width: 100% !important;
        width: 100% !important;
        padding-top: env(safe-area-inset-top) !important;
        padding-bottom: env(safe-area-inset-bottom) !important;
        box-shadow: none !important;
        border-right: 0 !important;
    }
    .sidebar-header{
        padding: 16px 16px 14px !important;
    }
    .close-sidebar-button{
        width: 44px !important;
        height: 44px !important;
    }
    .close-sidebar-button .icon-close-modal{
        width: 15px !important;
        height: 15px !important;
    }
    /* alvos de toque confortáveis na navegação */
    .sidebar-button{
        min-height: 46px !important;
        align-items: center !important;
    }
    .sub-button{
        min-height: 42px !important;
    }
    /* o overlay some: a sidebar já cobre a tela toda */
    .sidebar-compliment-bg.sidebar-bg-active{
        background-color: rgba(2,44,77,.75) !important;
    }

    /* ---------- F4 · Densidade do conteúdo ---------- */
    .main-content,
    .main-content.dashboard-v2,
    .main-content.abc-page,
    .main-content.admin-page,
    .main-content:has(.database-info),
    .main-content:has(.filters-container),
    .main-content:has(#table_wrapper){
        padding: 14px 12px 32px !important;
        padding-left: max(12px, env(safe-area-inset-left)) !important;
        padding-right: max(12px, env(safe-area-inset-right)) !important;
        gap: 14px !important;
    }

    /* ---------- F5 · Alvos de toque e zoom do iOS ----------
       O iOS dá zoom automático ao focar campo com fonte < 16px. */
    input[type="text"],
    input[type="number"],
    input[type="date"],
    input[type="email"],
    input[type="password"],
    input[type="search"],
    select,
    textarea{
        font-size: 16px !important;
        min-height: 44px !important;
    }
    button,
    .btn,
    a.exclude,
    a.activate,
    a.deactivate{
        min-height: 44px;
    }

    /* ---------- F6 · Tabelas ----------
       Containers reais de tabela no sistema (`.page-lower` do CSS antigo NÃO
       existe no HTML — é regra morta e por isso não serve de gancho):
         .dataTables_wrapper .row > div   order, produtos, clientes, fábricas,
                                          status de clientes, log de acessos
         .admin-table-wrap                log de acessos
         .abc-table-wrap                  curva ABC
         .sellout-panel                   sell out (3 tabelas)
         .main-content > table            detalhe do pedido (sem wrapper)
         .main-content > form > table     edição de grupo
       (o `overflow-x: auto` desses containers está na seção 0, sem media
        query — ver o comentário lá sobre o celular deitado)                  */

    /* A tabela passa a ter a largura do próprio conteúdo (as células estão em
       nowrap), com o container como piso. Assim não há nem coluna espremida
       nem largura mínima artificial obrigando a rolar mais do que o necessário. */
    .main-content table{
        width: max-content !important;
        min-width: 100% !important;
        /* redesign.css põe `overflow: hidden` na tabela para arredondar os
           cantos; isso a torna um contexto de recorte e ANULA o position:
           sticky das células. O arredondamento passa para o container. */
        overflow: visible !important;
        border-radius: 0 !important;
        border-left: 0 !important;
        border-right: 0 !important;
    }
    .admin-table-wrap,
    .abc-table-wrap{
        border-radius: var(--r-md);
        overflow-x: auto !important;
    }

    /* tipografia densa: o padrão de 12-13px com 12px de padding ocupa muito
       espaço numa tela de 400px */
    .main-content table th,
    .main-content table td{
        white-space: nowrap;
        padding: 7px 9px !important;
        font-size: 11.5px !important;
        line-height: 1.25 !important;
    }
    .main-content table thead th{
        font-size: 10px !important;
        letter-spacing: 0.03em !important;
        padding: 8px 9px !important;
    }

    /* Rede de segurança: se o scrollX do DataTables for reativado em alguma
       tela, o <thead> duplicado do corpo não pode virar uma faixa azul vazia
       (ver comentário em datatables_defaults.js). */
    .dataTables_scrollBody thead th,
    .dataTables_scrollBody thead td{
        padding: 0 !important;
        line-height: 0 !important;
        border: 0 !important;
    }
    /* Primeira coluna fixa: mantém a referência da linha durante a rolagem.
       A célula precisa de fundo opaco, senão o conteúdo rolando passa por
       baixo dela. Em vez de fixar uma cor (que perderia as listras, o hover
       e a linha selecionada), a célula herda o fundo da própria linha —
       assim acompanha .odd/.even/:hover/.selected automaticamente. */
    .main-content table tbody tr{
        background: var(--white);
    }
    .main-content table tbody td:first-child{
        position: sticky;
        left: 0;
        z-index: 2;
        background: inherit !important;
        box-shadow: 1px 0 0 var(--gray-200);
    }
    /* o cabeçalho já tem fundo azul opaco vindo do redesign.css */
    .main-content table thead th:first-child{
        position: sticky;
        left: 0;
        z-index: 3;
        box-shadow: 1px 0 0 var(--griffo-blue-800);
    }

    /* toolbar do DataTables empilhada */
    #table_wrapper > .row:first-child,
    .dataTables_wrapper > .row:first-child{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 8px !important;
    }
    #table_wrapper > .row:first-child > [class*="col-"],
    .dataTables_wrapper > .row:first-child > [class*="col-"]{
        width: 100% !important;
        max-width: 100% !important;
        flex: 1 1 100% !important;
        display: flex !important;
        flex-direction: column !important;
        align-items: stretch !important;
        justify-content: flex-start !important;
        gap: 8px !important;
    }
    /* "10 por página" numa linha só, sem virar um bloco alto */
    .dataTables_length,
    #table_length{
        width: 100% !important;
    }
    .dataTables_length label,
    #table_length label{
        display: flex !important;
        align-items: center !important;
        gap: 8px !important;
        margin: 0 !important;
        font-size: 11.5px !important;
    }
    .dataTables_length select,
    #table_length select{
        width: auto !important;
        min-width: 64px !important;
        height: 36px !important;
        min-height: 36px !important;
    }
    .dataTables_filter,
    #table_filter{
        width: 100% !important;
        text-align: left !important;
    }
    .dataTables_filter label,
    #table_filter label{
        width: 100% !important;
        display: flex !important;
    }
    .dataTables_filter input,
    #table_filter input{
        width: 100% !important;
        min-width: 0 !important;
        margin-left: 0 !important;
    }
    /* PDF e Excel lado a lado: empilhados viravam dois blocos altos */
    #createdButtonsContainer{
        display: grid !important;
        grid-template-columns: 1fr 1fr !important;
        gap: 8px !important;
        margin-left: 0 !important;
        width: 100% !important;
    }
    #createdButtonsContainer > button{
        width: 100% !important;
        min-height: 38px !important;
        height: 38px !important;
        padding: 0 8px !important;
        font-size: 11.5px !important;
        justify-content: center !important;
    }
    .dataTables_filter input,
    #table_filter input{
        height: 40px !important;
        min-height: 40px !important;
    }
    /* paginação e info: centralizadas e quebrando linha */
    .dataTables_wrapper > .row:last-child{
        flex-direction: column !important;
        gap: 6px !important;
        text-align: center !important;
    }
    .dataTables_info{
        text-align: center !important;
        width: 100% !important;
    }
    .dataTables_paginate{
        display: flex !important;
        justify-content: center !important;
        flex-wrap: wrap !important;
        width: 100% !important;
    }
    .dataTables_paginate .pagination{
        flex-wrap: wrap !important;
        justify-content: center !important;
    }
    .dataTables_paginate .page-link{
        min-width: 40px;
        min-height: 40px;
        display: inline-flex;
        align-items: center;
        justify-content: center;
    }

    /* ---------- F7 · Gráficos ----------
       O padrão do projeto é: o CARD tem altura explícita e o <canvas> fica em
       height:100%. Portanto no celular se ajusta a altura do card — mexer no
       canvas brigaria com o dimensionamento do Chart.js. */
    .chart-wrapper,
    .chart-wrapper-w70,
    .chart-card,
    .abc-chart-card{
        width: 100% !important;
        padding: 12px !important;
    }
    /* dashboard e sell out */
    .dashboard-v2 .chart-hero,
    .dashboard-v2 .chart-donut,
    .dashboard-v2 .chart-bar,
    .dashboard-v2 .chart-stack{
        height: 300px !important;
    }
    /* fábricas, clientes e grupos */
    body:has(.factoryContentHeader) .chart-wrapper:not(.hidden),
    body:has(.factoryContentHeader) .chart-wrapper-w70:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper-w70:not(.hidden){
        height: 300px !important;
        min-height: 300px !important;
        max-height: 300px !important;
    }
    /* curva ABC */
    .abc-chart-wrapper{
        height: 280px !important;
    }
    .abc-chart-pareto{ height: 320px !important; }
    .abc-chart-donut{ height: 240px !important; }
    .charts-container,
    .charts-block-container,
    .charts-inner-container,
    .charts-inner-container2,
    .charts-row,
    .abc-charts-row{
        display: flex !important;
        flex-direction: column !important;
        width: 100% !important;
        gap: 12px !important;
    }

    /* ---------- F8 · Filtros ----------
       Um campo por linha empurrava o formulário para ~500px de altura só de
       filtros. Em duas colunas cai pela metade e continua legível, já que os
       valores são curtos (código, CNPJ, data, quantidade). */
    .database-info,
    .filters-container{
        flex-direction: column !important;
        align-items: stretch !important;
        padding: 8px 10px !important;
        gap: 6px !important;
    }
    /* :not(.hidden) é obrigatório — `.advancedFilters-container.hidden` usa
       `display: none` SEM !important, então forçar display aqui deixaria os
       filtros avançados permanentemente abertos. */
    .filtersForm,
    .advancedFilters-container:not(.hidden){
        display: flex !important;
        flex-direction: column !important;
        align-items: stretch !important;
        width: 100% !important;
        gap: 8px !important;
    }
    #filters-form,
    .baseFilters-container,
    .advancedFilters-container .inputs-container{
        display: grid !important;
        grid-template-columns: 1fr 1fr !important;
        align-items: end !important;
        width: 100% !important;
        gap: 6px 8px !important;
    }
    #filters-form .input-wrapper,
    .filters-container .input-wrapper,
    .database-info .input-wrapper{
        width: auto !important;
        min-width: 0 !important;
        flex: 1 1 auto !important;
        gap: 1px !important;
    }
    /* o que não faz sentido pela metade ocupa a linha inteira */
    .database-title,
    .advanced-check-container,
    .personalization-row,
    .cg-filters-head,
    .cg-filters-bottom,
    .input-wrapper-lock,
    #filters-form > .buttons-container,
    .baseFilters-container > .buttons-container,
    .advancedFilters-container .inputs-container > .formButton-wrapper{
        grid-column: 1 / -1 !important;
    }
    /* rótulo e campo mais enxutos */
    .database-info label,
    .filters-container .input-wrapper label{
        font-size: 9px !important;
        margin-bottom: 0 !important;
        line-height: 1.25 !important;
    }
    /* 38px ainda é alvo de toque confortável (mínimo Android é 36dp) e o
       campo continua com 16px de fonte, que é o que impede o zoom do iOS */
    .database-info input,
    .database-info select,
    .filters-container .input-wrapper input,
    .filters-container .input-wrapper select,
    #filters-form input,
    #filters-form select{
        height: 38px !important;
        min-height: 38px !important;
        padding: 0 9px !important;
    }
    .advanced-check-container{
        padding: 4px 9px !important;
    }
    /* botões do próprio formulário acompanham a altura dos campos */
    #filters-form > button,
    .formButton-wrapper > button,
    .filters-container button{
        height: 38px !important;
        min-height: 38px !important;
    }
    /* barra de filtros salvos mais rasa */
    .personalization-row{ gap: 6px !important; }
    .saved-filter-chip,
    .saved-filter-add{
        min-height: 32px !important;
        font-size: 11px !important;
    }
    .buttons-container,
    .formButton-wrapper,
    .abc-filters-actions,
    .admin-filter-actions{
        display: flex !important;
        flex-wrap: wrap !important;
        width: 100% !important;
        margin-left: 0 !important;
        gap: 8px !important;
    }
    .buttons-container > button,
    .formButton-wrapper > button,
    .abc-filters-actions > button,
    .admin-filter-actions > button{
        flex: 1 1 calc(50% - 4px) !important;
        justify-content: center !important;
    }

    /* ---------- F8 · Modais em tela cheia ---------- */
    #customModal .modal-content,
    .chart-modal-content{
        width: 100% !important;
        height: 100% !important;
        max-width: 100% !important;
        max-height: 100% !important;
        top: 0 !important;
        left: 0 !important;
        transform: none !important;
        border-radius: 0 !important;
        padding-top: env(safe-area-inset-top);
        padding-bottom: env(safe-area-inset-bottom);
    }
    .chart-modal{
        padding: 0 !important;
    }
    .modal-header-bar,
    .chart-modal-header{
        padding: 12px 14px !important;
        gap: 10px !important;
        flex-wrap: wrap !important;
    }
    .modal-header-actions{
        gap: 6px !important;
    }
    .modal-header-actions button{
        min-height: 40px;
        padding: 0 10px !important;
    }
    /* modal de personalização (salvar filtro / editar KPIs) */
    .pers-modal-backdrop{
        padding: 0 !important;
        align-items: flex-end !important;
    }
    .pers-modal,
    .pers-modal.wide{
        width: 100% !important;
        max-width: 100% !important;
        max-height: 92vh !important;
        overflow-y: auto !important;
        border-radius: 16px 16px 0 0 !important;
        padding-bottom: env(safe-area-inset-bottom);
    }
    /* modal de detalhe do log (admin) */
    .log-detail-modal{
        padding: 0 !important;
        align-items: flex-end !important;
    }
    .log-detail-content{
        max-width: 100% !important;
        max-height: 92vh !important;
        border-radius: 16px 16px 0 0 !important;
    }
    /* modal genérico com largura fixa (clients_groups) */
    .modal-content{
        max-width: calc(100vw - 24px) !important;
    }

    /* ---------- Chips de filtros salvos ---------- */
    .personalization-row{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 8px !important;
    }
    .saved-filters-bar{
        overflow-x: auto !important;
        flex-wrap: nowrap !important;
        -webkit-overflow-scrolling: touch;
        padding-bottom: 4px;
    }
    .saved-filter-chip,
    .saved-filter-add{
        flex-shrink: 0;
        min-height: 36px;
    }
    .saved-filter-chip .chip-action{
        min-width: 28px;
        min-height: 28px;
    }
}


/* ==========================================================================
   2. <= 768px — POR TELA
   ========================================================================== */
@media screen and (max-width: 768px){

    /* ---------- 2 · Dashboard e 3 · Sell Out ---------- */
    .dashboard-headline{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 12px !important;
    }
    .dashboard-title{ font-size: 20px !important; }
    .dashboard-subtitle{ font-size: 12px !important; }
    .kpi-grid{
        grid-template-columns: 1fr 1fr !important;
        gap: 10px !important;
    }
    .kpi-card{ padding: 12px !important; }
    .kpi-value{ font-size: 20px !important; }

    /* tabelas do Sell Out (estilos no <style> inline da página) */
    .sellout-tables{
        display: flex !important;
        flex-direction: column !important;
        gap: 12px !important;
    }
    .sellout-panel{ padding: 14px !important; }

    /* ---------- 4 · Pedidos ---------- */
    .order-summary{
        grid-template-columns: 1fr 1fr !important;
        gap: 10px !important;
    }
    .summary-card{ padding: 12px !important; }
    .advanced-check-container{
        align-self: stretch !important;
        justify-content: space-between !important;
    }

    /* ---------- 5 · Detalhe do pedido (página e iframe do modal) ---------- */
    .order-details-actions{
        flex-direction: column !important;
        align-items: stretch !important;
        padding: 12px 14px !important;
    }
    .order-details-buttons{
        width: 100%;
    }
    .order-details-buttons > button{
        flex: 1;
        justify-content: center;
    }

    /* ---------- 6 · Produtos ---------- */
    .empty-state-card{
        max-width: 100% !important;
    }

    /* ---------- 7 · Curva ABC ---------- */
    .abc-headline{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 12px !important;
    }
    .abc-kpis{
        grid-template-columns: 1fr 1fr !important;
        gap: 10px !important;
    }
    .abc-filters{
        grid-template-columns: 1fr !important;
    }
    /* A matriz 3x3 é grade de largura fixa. Em vez de espremer as células até
       ficarem ilegíveis, o próprio .abc-matrix-grid vira a área de rolagem:
       min-width:0 libera o item a encolher dentro do grid pai e o piso do
       minmax() das colunas força o transbordo para dentro dele. */
    .abc-matrix{
        grid-template-columns: 1fr !important;
        max-width: 100% !important;
    }
    .abc-matrix-axis-y{
        writing-mode: horizontal-tb !important;
        transform: none !important;
        padding: 0 0 6px !important;
        text-align: left !important;
    }
    .abc-matrix-grid{
        grid-template-columns: 64px repeat(4, minmax(96px, 1fr)) !important;
        min-width: 0 !important;
        overflow-x: auto;
        -webkit-overflow-scrolling: touch;
        overscroll-behavior-x: contain;
        padding-bottom: 6px;
    }
    .abc-matrix-cell{
        min-height: 66px !important;
        padding: 8px 6px !important;
    }
    /* abas roláveis na horizontal em vez de quebrar em 3 linhas */
    .abc-tabs{
        flex-wrap: nowrap !important;
        overflow-x: auto !important;
        -webkit-overflow-scrolling: touch;
        padding-bottom: 8px !important;
    }
    .abc-tab{
        flex-shrink: 0;
        min-height: 40px;
    }
    .abc-actions{
        flex-wrap: wrap !important;
        width: 100%;
    }
    .abc-btn{
        flex: 1 1 calc(50% - 4px);
        justify-content: center;
        min-height: 44px;
    }

    /* ---------- 8 · Clientes · 9 · Grupos · 10 · Fábricas ---------- */
    .factoryContentHeader,
    .clientContentHeader{
        flex-direction: column !important;
        align-items: stretch !important;
        padding: 14px 16px !important;
        text-align: left !important;
    }
    .contentHeaderUp,
    .contentHeaderMiddle{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 10px !important;
        width: 100%;
    }
    .factoryName-wrapper h2,
    .factoryName-wrapper,
    .clientName-wrapper h2{
        font-size: 18px !important;
        word-break: break-word;
    }
    .factoryImage-wrapper img{
        max-height: 46px;
        width: auto !important;
    }
    .contentHeaderDown{
        grid-template-columns: 1fr !important;
    }
    /* pares de KPI de fábricas/clientes em coluna única */
    body:has(.factoryContentHeader) .infoCards-container,
    body:has(.clientContentHeader) .infoCards-container{
        grid-template-columns: 1fr !important;
    }
    /* grid de gráficos vira coluna */
    body:has(.factoryContentHeader) .charts-block-container:first-child,
    body:has(.clientContentHeader) .charts-block-container:first-child{
        display: flex !important;
        flex-direction: column !important;
    }
    /* grupos: cabeçalho do card de filtros e barra de exportação empilham */
    .cg-filters-head{
        flex-direction: column !important;
        align-items: flex-start !important;
        gap: 8px !important;
    }
    .cg-filters-head #groupInfo,
    div.database-info .cg-filters-head span#groupInfo{
        white-space: normal !important;
        text-align: left !important;
    }
    .cg-filters-head .cg-return-link,
    div.database-info a#returnGroups.cg-return-link{
        height: 40px !important;
        width: 100%;
        justify-content: center;
    }
    .cg-export-toggle-row,
    .cg-buttons-inline,
    .cg-pers-row{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 8px !important;
    }
    .cg-pie-card{
        width: 100% !important;
    }

    /* ---------- 12 · Log de acessos ---------- */
    .admin-headline{
        flex-direction: column !important;
        align-items: stretch !important;
        gap: 12px !important;
    }
    .admin-kpis{
        grid-template-columns: 1fr 1fr !important;
        gap: 10px !important;
    }
    .admin-grid-2col{
        grid-template-columns: 1fr !important;
    }
    .admin-filters{
        grid-template-columns: 1fr !important;
    }
    .admin-table-wrap{
        padding: 12px !important;
    }

    /* ---------- 13 · Perfil ---------- */
    .profile-cards,
    .pref-grid{
        grid-template-columns: 1fr !important;
        gap: 12px !important;
    }
    .profile-identity{
        flex-direction: column !important;
        align-items: flex-start !important;
        gap: 10px !important;
        text-align: left !important;
    }
    .profile-card{
        padding: 16px !important;
    }
    .profile-submit{
        width: 100% !important;
        justify-content: center !important;
    }

    /* ---------- 14 · Importações ---------- */
    .upload-container{
        flex-direction: column !important;
        align-items: stretch !important;
        width: 100% !important;
        gap: 12px !important;
    }
    .upload-container form,
    #templateForm{
        width: 100% !important;
        max-width: 100% !important;
    }

    /* ---------- 15 · Cadastro / edição de grupo ---------- */
    body:has(form[action*="group_register"]) .main-content,
    body:has(form[action*="group_edit"]) .main-content{
        width: 100% !important;
        max-width: 100% !important;
        padding: 18px 14px !important;
        border-radius: 12px !important;
    }
}


/* ==========================================================================
   3. <= 480px — FUNDAÇÕES (celular em retrato)
   ========================================================================== */
@media screen and (max-width: 480px){

    :root{
        --header-h: 52px;
    }
    .header{
        height: 52px !important;
    }
    .header-logo a img{
        width: 30px !important;
    }

    .main-content,
    .main-content.dashboard-v2,
    .main-content.abc-page,
    .main-content.admin-page,
    .main-content:has(.database-info),
    .main-content:has(.filters-container),
    .main-content:has(#table_wrapper){
        padding: 12px 10px 28px !important;
        padding-left: max(10px, env(safe-area-inset-left)) !important;
        padding-right: max(10px, env(safe-area-inset-right)) !important;
    }

    /* títulos de tela */
    .main-content > h1:first-child,
    .main-content > h2:first-child{
        font-size: 18px !important;
    }

    /* botões de ação passam a ocupar a linha inteira
       (PDF/Excel ficam de fora: continuam lado a lado na grade da toolbar) */
    .buttons-container > button,
    .formButton-wrapper > button,
    .abc-filters-actions > button,
    .admin-filter-actions > button,
    .abc-btn{
        flex: 1 1 100% !important;
    }

    /* gráficos um pouco mais baixos */
    .dashboard-v2 .chart-hero,
    .dashboard-v2 .chart-donut,
    .dashboard-v2 .chart-bar,
    .dashboard-v2 .chart-stack{
        height: 260px !important;
    }
    body:has(.factoryContentHeader) .chart-wrapper:not(.hidden),
    body:has(.factoryContentHeader) .chart-wrapper-w70:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper-w70:not(.hidden){
        height: 260px !important;
        min-height: 260px !important;
        max-height: 260px !important;
    }
    .abc-chart-wrapper{ height: 250px !important; }
    .abc-chart-pareto{ height: 280px !important; }
    .abc-chart-donut{ height: 220px !important; }

    /* Cards ficam em 2 colunas mesmo no retrato: empilhados em coluna única
       cada um virava uma faixa de ~180px e os 4 tomavam a tela inteira antes
       de aparecer qualquer conteúdo. Em 2x2 o bloco cabe numa olhada. */
    .kpi-grid,
    .order-summary,
    .abc-kpis,
    .admin-kpis{
        grid-template-columns: 1fr 1fr !important;
        gap: 8px !important;
    }
    .summary-card,
    .kpi-card,
    .abc-kpi,
    .admin-kpi{
        padding: 9px 10px !important;
        gap: 1px !important;
        border-radius: 9px !important;
    }
    .summary-label,
    .kpi-label,
    .abc-kpi-label,
    .admin-kpi-label{
        font-size: 9px !important;
        letter-spacing: 0.06em !important;
    }
    .summary-value,
    .kpi-value,
    .abc-kpi-value,
    .admin-kpi-value{
        font-size: 16px !important;
        letter-spacing: -0.02em !important;
    }
    .summary-value.summary-value-sm{ font-size: 14px !important; }
    .summary-hint,
    .kpi-compare,
    .kpi-period,
    .abc-kpi-sub,
    .admin-kpi-sub{
        font-size: 9.5px !important;
        line-height: 1.3 !important;
    }
    .kpi-badge{
        font-size: 9.5px !important;
        padding: 2px 6px !important;
    }
    .kpi-footer{
        flex-wrap: wrap !important;
        gap: 3px !important;
    }

    /* tabela ainda mais densa no retrato */
    .main-content table th,
    .main-content table td{
        padding: 6px 8px !important;
        font-size: 11px !important;
    }
    .main-content table thead th{
        font-size: 9.5px !important;
        padding: 7px 8px !important;
    }
    /* botão de ação dentro da célula não precisa de 44px de altura */
    .main-content table td a.exclude,
    .main-content table td a.activate,
    .main-content table td a.deactivate,
    .main-content table td .btn{
        min-height: 0 !important;
        padding: 4px 10px !important;
        font-size: 10.5px !important;
    }

    /* dica de rolagem: sombra na borda direita do bloco rolável */
    .admin-table-wrap,
    .abc-table-wrap,
    .dataTables_wrapper .row > div:has(> table){
        background-image: linear-gradient(to left, rgba(2,44,77,.08), transparent 24px);
        background-repeat: no-repeat;
        background-position: right center;
        background-size: 24px 100%;
        background-attachment: local;
    }
}


/* ==========================================================================
   4. <= 480px — POR TELA
   ========================================================================== */
@media screen and (max-width: 480px){

    /* ---------- 1 · Login ---------- */
    /* (o layout em si está no bloco de login em retrato, mais abaixo) */
    .loginTitle{
        font-size: 24px !important;
    }
    .login-alert{
        align-items: flex-start !important;
    }
    .login-alert-msg{
        font-size: 13px !important;
    }

    /* ---------- 2 · Dashboard e 3 · Sell Out ----------
       (o tamanho dos KPIs vem do bloco de cards da seção 3) */
    .dashboard-title{ font-size: 18px !important; }
    .dashboard-eyebrow{ font-size: 9.5px !important; }
    .dashboard-subtitle{ font-size: 11px !important; }
    .kpi-edit-trigger{
        flex: 1 1 100%;
        justify-content: center;
        min-height: 40px;
    }

    /* ---------- 7 · Curva ABC ---------- */
    .abc-matrix-grid{
        grid-template-columns: 56px repeat(4, minmax(84px, 1fr)) !important;
    }
    .abc-scenario-form{
        grid-template-columns: 1fr !important;
    }

    /* ---------- 8/9/10 · Banner de cliente, grupo e fábrica ---------- */
    .factoryContentHeader *,
    .clientContentHeader *{
        font-size: 18px !important;
    }
    .contentHeaderDown .info-container span:nth-child(2){
        font-size: 15px !important;
    }
    .contentHeaderDown .info-container span:last-child{
        font-size: 10px !important;
    }

    /* ---------- 12 · Log de acessos ---------- */
    .admin-title{ font-size: 18px !important; }

    /* ---------- 15 · Cadastro / edição de grupo ---------- */
    body:has(form[action*="group_register"]) .main-content,
    body:has(form[action*="group_edit"]) .main-content{
        padding: 16px 12px !important;
    }
}


/* ==========================================================================
   5. <= 380px — AJUSTES FINOS (celular pequeno)
   ========================================================================== */
@media screen and (max-width: 380px){

    .header{
        padding: 0 8px !important;
    }
    .main-content,
    .main-content.dashboard-v2,
    .main-content.abc-page,
    .main-content.admin-page{
        padding: 10px 8px 24px !important;
    }
    .dashboard-v2 .chart-hero,
    .dashboard-v2 .chart-donut,
    .dashboard-v2 .chart-bar,
    .dashboard-v2 .chart-stack{
        height: 230px !important;
    }
    body:has(.factoryContentHeader) .chart-wrapper:not(.hidden),
    body:has(.factoryContentHeader) .chart-wrapper-w70:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper-w70:not(.hidden){
        height: 230px !important;
        min-height: 230px !important;
        max-height: 230px !important;
    }
    .abc-chart-wrapper{ height: 220px !important; }
    .abc-chart-pareto{ height: 250px !important; }
    .abc-chart-donut{ height: 200px !important; }
    /* valores longos (R$ 193.924.732,47) precisam caber em ~140px de coluna */
    .summary-value,
    .kpi-value,
    .abc-kpi-value,
    .admin-kpi-value{ font-size: 14px !important; }
    .summary-value.summary-value-sm{ font-size: 13px !important; }
    .dashboard-title,
    .admin-title,
    .abc-title{ font-size: 17px !important; }
    /* filtros voltam a uma coluna: 2 colunas em 350px espremeria demais */
    #filters-form,
    .baseFilters-container,
    .advancedFilters-container .inputs-container{
        grid-template-columns: 1fr !important;
    }
    .abc-matrix-grid{
        grid-template-columns: 48px repeat(4, minmax(74px, 1fr)) !important;
    }
}


/* ==========================================================================
   6. LOGIN EM RETRATO — faixa da marca + card
   O split-screen do desktop some abaixo de 900px (regra do login_redesign),
   e o que sobrava era um formulário solto no branco, com muito vazio em cima
   e embaixo. Aqui o mesmo split volta girado: a arte vira uma faixa no topo
   e o formulário sobe por cima dela como um card de cantos arredondados.
   Reaproveita a marcação e a arte que já existem em index.php.
   Escopo em `orientation: portrait` de propósito — deitado não há altura
   para a faixa (ver seção 7).
   ========================================================================== */
@media screen and (max-width: 900px) and (orientation: portrait){

    /* o login_redesign trava o scroll do body para o split-screen; empilhado
       o conteúdo pode passar da tela em aparelho pequeno.
       Só o eixo Y — o X segue contido pela regra da seção 0. */
    body:has(.login-container){
        overflow-y: auto !important;
    }
    .container:has(.login-container){
        flex-direction: column !important;
        min-height: 100vh;
        min-height: 100svh;
        align-items: stretch !important;
    }

    /* ---- faixa da marca ---- */
    .wallpaper{
        display: block !important;
        flex: 0 0 auto !important;
        height: 32vh;
        height: 32svh;
        min-height: 190px;
        max-height: 260px;
        order: -1;
    }
    .wp-content{
        padding: 20px 22px 30px !important;
        justify-content: flex-end !important;
        gap: 10px;
    }
    .wp-headline h2{
        font-size: 23px !important;
        line-height: 1.15 !important;
    }
    .wp-headline p{
        font-size: 12px !important;
        max-width: 100% !important;
    }
    /* as pílulas de rodapé não cabem sem virar duas linhas apertadas */
    .wp-footer{ display: none !important; }
    /* o sheen é uma animação grande e contínua: fora do celular */
    .wp-sheen{ display: none !important; }
    .wp-photo{ animation: none !important; }

    /* ---- card do formulário sobrepondo a faixa ---- */
    .login-container{
        max-width: 100% !important;
        width: 100% !important;
        min-height: 0 !important;
        flex: 1 1 auto !important;
        padding: 22px 20px 28px !important;
        margin-top: -18px !important;
        border-radius: 18px 18px 0 0 !important;
        box-shadow: 0 -10px 28px rgba(2,44,77,.14) !important;
        justify-content: flex-start !important;
        z-index: 3;
    }
    .loginTitle-container{
        margin-bottom: 20px !important;
    }
    /* a marca já aparece na faixa acima; o logo repetido só ocupa espaço */
    .login-logo{
        width: 64px !important;
        margin-bottom: 14px !important;
    }
    .loginTitle{
        font-size: 22px !important;
    }
    .loginTitle::after{
        font-size: 13px !important;
    }
    #loginForm{
        gap: 12px !important;
    }
    /* o botão-seta vira barra de largura total, mais fácil de acertar */
    .loginButton-wrapper{
        width: 100%;
        margin-top: 18px !important;
    }
    .loginButton,
    .loginButton:disabled{
        width: 100% !important;
        height: 48px !important;
        border-radius: 10px !important;
    }
    /* o rodapé era absoluto ancorado em 60px; empilhado tem que fluir */
    .login-container::after{
        position: static !important;
        display: block;
        margin-top: 22px;
        text-align: center;
    }
}


/* ==========================================================================
   7. CELULAR DEITADO
   Faixa cega até aqui: em paisagem o celular passa dos 768px de largura
   (~780-950px), então nada da camada mobile se aplicava e o layout caía nas
   regras de tablet do redesign.css — que espalham os filtros e deixam a
   tabela transbordar. O corte é pela ALTURA, que é o que de fato distingue
   um celular deitado de um tablet: telefone em paisagem tem menos de ~520px
   de altura; tablet em retrato tem 1000px ou mais.
   ========================================================================== */
@media screen and (max-height: 520px) and (orientation: landscape){

    /* ---------- barra superior e conteúdo ---------- */
    .header{
        height: 48px !important;
        padding: 0 max(12px, env(safe-area-inset-left)) 0 max(12px, env(safe-area-inset-right)) !important;
    }
    .header-logo a img{ width: 30px !important; }
    .menu-hamburger{ width: 40px !important; height: 40px !important; }

    .main-content,
    .main-content.dashboard-v2,
    .main-content.abc-page,
    .main-content.admin-page,
    .main-content:has(.database-info),
    .main-content:has(.filters-container),
    .main-content:has(#table_wrapper){
        padding: 10px max(12px, env(safe-area-inset-left)) 20px !important;
        gap: 10px !important;
    }

    /* ---------- sidebar ---------- */
    /* em paisagem sobra largura e falta altura: painel lateral estreito
       rolável é melhor que ocupar a tela inteira */
    .left-sidebar{
        max-width: 300px !important;
        width: 300px !important;
    }
    .sidebar-header{ padding: 10px 14px !important; }
    .sidebar-button{ min-height: 38px !important; }
    .sub-button{ min-height: 34px !important; }

    /* ---------- filtros: 3 colunas, cabem bem na largura extra ---------- */
    .database-info,
    .filters-container{
        flex-direction: column !important;
        align-items: stretch !important;
        padding: 8px 10px !important;
        gap: 6px !important;
    }
    /* :not(.hidden) — ver comentário na seção 1 */
    .filtersForm,
    .advancedFilters-container:not(.hidden){
        display: flex !important;
        flex-direction: column !important;
        align-items: stretch !important;
        width: 100% !important;
        gap: 6px !important;
    }
    #filters-form,
    .baseFilters-container,
    .advancedFilters-container .inputs-container{
        display: grid !important;
        grid-template-columns: repeat(3, 1fr) !important;
        align-items: end !important;
        width: 100% !important;
        gap: 6px 8px !important;
    }
    #filters-form .input-wrapper,
    .filters-container .input-wrapper,
    .database-info .input-wrapper{
        width: auto !important;
        min-width: 0 !important;
        flex: 1 1 auto !important;
        gap: 1px !important;
    }
    .database-title,
    .personalization-row,
    .cg-filters-head,
    .cg-filters-bottom,
    #filters-form > .buttons-container,
    .baseFilters-container > .buttons-container,
    .advancedFilters-container .inputs-container > .formButton-wrapper{
        grid-column: 1 / -1 !important;
    }
    .database-info label,
    .filters-container .input-wrapper label{
        font-size: 9px !important;
        margin-bottom: 0 !important;
        line-height: 1.25 !important;
    }
    .database-info input,
    .database-info select,
    .filters-container .input-wrapper input,
    .filters-container .input-wrapper select,
    #filters-form input,
    #filters-form select{
        height: 34px !important;
        min-height: 34px !important;
        padding: 0 8px !important;
        font-size: 14px !important;
    }
    .advanced-check-container{
        padding: 4px 8px !important;
        align-self: end !important;
    }

    /* ---------- tabela densa ---------- */
    .main-content table{
        width: max-content !important;
        min-width: 100% !important;
        overflow: visible !important;
        border-radius: 0 !important;
    }
    .main-content table th,
    .main-content table td{
        white-space: nowrap;
        padding: 5px 9px !important;
        font-size: 11px !important;
        line-height: 1.2 !important;
    }
    .main-content table thead th{
        font-size: 9.5px !important;
        padding: 6px 9px !important;
    }
    .main-content table tbody tr{ background: var(--white); }
    .main-content table tbody td:first-child{
        position: sticky;
        left: 0;
        z-index: 2;
        background: inherit !important;
        box-shadow: 1px 0 0 var(--gray-200);
    }
    .main-content table thead th:first-child{
        position: sticky;
        left: 0;
        z-index: 3;
        box-shadow: 1px 0 0 var(--griffo-blue-800);
    }
    .main-content table td a.exclude,
    .main-content table td a.activate,
    .main-content table td a.deactivate{
        min-height: 0 !important;
        padding: 3px 9px !important;
        font-size: 10px !important;
    }

    /* toolbar numa linha só: aqui sobra largura */
    #table_wrapper > .row:first-child,
    .dataTables_wrapper > .row:first-child{
        flex-direction: row !important;
        flex-wrap: wrap !important;
        align-items: center !important;
        gap: 8px !important;
    }
    #createdButtonsContainer > button{
        min-height: 32px !important;
        height: 32px !important;
        font-size: 11px !important;
    }
    .dataTables_filter input,
    #table_filter input{
        height: 34px !important;
        min-height: 34px !important;
    }

    /* ---------- cards ---------- */
    .kpi-grid,
    .order-summary,
    .abc-kpis,
    .admin-kpis{
        grid-template-columns: repeat(4, 1fr) !important;
        gap: 8px !important;
    }
    .summary-card,
    .kpi-card,
    .abc-kpi,
    .admin-kpi{ padding: 8px 10px !important; }
    .summary-value,
    .kpi-value,
    .abc-kpi-value,
    .admin-kpi-value{ font-size: 15px !important; }
    .summary-label,
    .kpi-label{ font-size: 9px !important; }
    .summary-hint,
    .kpi-compare,
    .kpi-period{ font-size: 9px !important; }

    /* ---------- gráficos: altura contida, a tela é baixa ---------- */
    .dashboard-v2 .chart-hero,
    .dashboard-v2 .chart-donut,
    .dashboard-v2 .chart-bar,
    .dashboard-v2 .chart-stack{ height: 260px !important; }
    body:has(.factoryContentHeader) .chart-wrapper:not(.hidden),
    body:has(.factoryContentHeader) .chart-wrapper-w70:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper:not(.hidden),
    body:has(.clientContentHeader) .chart-wrapper-w70:not(.hidden){
        height: 260px !important;
        min-height: 260px !important;
        max-height: 260px !important;
    }
    .abc-chart-wrapper{ height: 250px !important; }
    .abc-chart-pareto{ height: 280px !important; }
    .abc-chart-donut{ height: 220px !important; }

    /* ---------- modais ---------- */
    #customModal .modal-content,
    .chart-modal-content{
        width: 100% !important;
        height: 100% !important;
        max-width: 100% !important;
        max-height: 100% !important;
        top: 0 !important;
        left: 0 !important;
        transform: none !important;
        border-radius: 0 !important;
    }
    .chart-modal{ padding: 0 !important; }

    /* ---------- login ---------- */
    /* pouca altura: sem banner, formulário centrado e enxuto */
    .wallpaper{ display: none !important; }
    .login-container{
        max-width: 100% !important;
        min-height: 100svh !important;
        padding: 18px 22px !important;
        justify-content: center !important;
    }
    .login-logo{ width: 56px !important; margin-bottom: 10px !important; }
    .loginTitle{ font-size: 20px !important; }
    .loginTitle-container{ margin-bottom: 16px !important; }
    #loginForm{ gap: 10px !important; }
    .loginButton,
    .loginButton:disabled{ height: 42px !important; }
    .login-container::after{ display: none !important; }
}


/* ==========================================================================
   8. COMBOBOX — a lista suspensa que o iPhone não desenha

   O Safari do iOS ignora o menu do <datalist>: joga as opções na barrinha de
   sugestões do teclado. Quem devolve a lista é o mobile_combobox.js, e ele só
   entra em ação em ponteiro grosso (dedo) — no desktop o menu nativo continua
   valendo, então nada aqui tem efeito lá.

   Sem media query de propósito: as classes gcb-* só existem quando o script
   roda, e ele já decidiu que é celular. A lista é ancorada no .input-wrapper
   (position: absolute) em vez de fixa na viewport porque, com o teclado aberto,
   o iOS rola a página para revelar o campo — presa ao campo ela acompanha o
   movimento sem cálculo nenhum.
   ========================================================================== */

.gcb-anchor{
    position: relative;
}

.gcb-menu{
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    z-index: 30;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    overscroll-behavior: contain;   /* rolou até o fim da lista, para por ali */
    padding: 4px;
    background: var(--white, #FFFFFF);
    border: 1px solid var(--gray-200, #E4E8EE);
    border-radius: var(--r-sm, 8px);
    box-shadow: 0 12px 28px rgba(2, 44, 77, .18);
    text-align: left;
}
.gcb-menu[hidden]{
    display: none;
}

/* sem espaço embaixo (campo perto do teclado): abre para cima */
.gcb-menu--up{
    top: auto;
    bottom: calc(100% + 6px);
}

.gcb-option{
    display: flex;
    flex-direction: column;
    justify-content: center;
    gap: 2px;
    min-height: 44px;               /* alvo de toque confortável */
    padding: 8px 12px;
    border-radius: var(--r-xs, 6px);
    font-size: 14px;
    line-height: 1.25;
    color: var(--gray-900, #16202F);
    cursor: pointer;
    -webkit-tap-highlight-color: transparent;
}
.gcb-option + .gcb-option{
    border-top: 1px solid var(--gray-100, #EFF2F6);
}
.gcb-option:active{
    background: var(--griffo-blue-100, #E6F0FA);
}

/* Nome do grupo em cima, id/CNPJ embaixo — o value é o que vai no campo.
   Razão social é comprida ("VESPOR AUTOMOTIVE DISTRIBUIDORA DE AUTO PECAS
   LTDA") e a tela é estreita: deixa usar duas linhas antes de cortar. */
.gcb-option-label{
    font-weight: 600;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.gcb-option-value{
    font-size: 12px;
    color: var(--gray-500, #6B7787);
}

.gcb-empty{
    padding: 14px 12px;
    font-size: 13px;
    color: var(--gray-500, #6B7787);
    text-align: center;
}
