/* ---------------------------------------------------------------------------
   Verde no conteudo do portal — Bootstrap e os azuis cravados no CSS antigo.

   O azul do portal vem de tres lugares, e cada um pede um tratamento:

   1. **Mantine** (~43% do que aparece numa tela): resolvido no Python, pelo `theme` do
      `MantineProvider` (`layouts/tema_v2.py`). Nao ha nada dele aqui — as variaveis do
      Mantine sao declaradas em `:root[data-mantine-color-scheme="light"]`, que vence um
      `:root` proprio, entao CSS nao resolveria mesmo.
   2. **Bootstrap** (~19%): os componentes trazem o azul **literal** (`.btn-primary
      { --bs-btn-bg: #0d6efd }`), e nao `var(--bs-primary)` — trocar a variavel nao muda
      nada. Cada familia precisa da sua regra, e e o grosso deste arquivo.
   3. **CSS do proprio portal** (~38%): `#2959b0`, `#2959c6`, `#00AEF9` cravados em
      `css_erp.css`, `custom1.css` e `mobile.css`. Nenhum tema alcanca; a unica saida e
      sobrescrever seletor por seletor, o que esta na secao final.

   Dois ancoradouros, os dois presos a `LAYOUT_V2` (nada aqui vale com a flag desligada):

   - `:root:has(#sidebar.sidebar_v2)` — o padrao. Alcanca **tambem o que o React renderiza
     em portal**, fora da arvore do `#main-content`: modal, tooltip, popover, offcanvas. Foi
     por nao alcancar isso que os titulos `.bigblue` continuavam azuis dentro dos modais,
     mesmo com a regra "aplicada" — o `dbc.Modal` do react-bootstrap e pendurado
     direto no `<body>`.
   - `#sidebar.sidebar_v2 ~ #main-content` — onde o alvo **precisa** ser o conteudo, e nao a
     barra: as abas, o recuo do topo no mobile e os `<a>` sem classe. Este ultimo em
     especial: com o ancoradouro amplo ele passaria a pintar tambem os links da sidebar, que
     vivem sobre fundo escuro.

   Este arquivo carrega depois de `mobile.css` e `style.css` na ordem alfabetica que o
   Dash usa, que e o que permite vencer as regras de la.
   --------------------------------------------------------------------------- */

/* Tres verdes, e a diferenca entre eles nao e capricho — e o fundo em que cada um vive.

   O `#4CC3A6` do logo (usado na sidebar e no login) nasceu para o `#08130F`; sobre o
   branco do conteudo ele fica lavado e texto branco em cima quase nao le. Por isso o
   conteudo usa tons mais fechados, e o mais fechado de todos fica no texto, onde o que
   conta e contraste e nao presenca de marca.

   Gemeos de `COR_CONTEUDO` e `COR_TEMA_ESCURA` em `layouts/tema_v2.py`, que alimentam a
   escala do Mantine — os dois lados tem de andar juntos. */
:root {
    --v-marca: #2E8B76;
    --v-marca-hover: #25705F;
    --v-medio: #1D5A4C;
    --v-escuro: #12332E;
    --v-claro: #E8F5F1;
    --v-sobre-marca: #FFFFFF;

    /* Do handoff `Conteudo Portal BDR`, compartilhados pelas abas e pela tabela. O
       `#2E8B6F` esta a um digito do `--v-marca` (#2E8B76) e e visualmente o mesmo verde;
       mantido como o handoff escreveu. Se um dia forem unificados, e trocar aqui. */
    --v-verde-escuro: #2E8B6F;
    --v-texto-inativo: #42544E;
    --v-borda-clara: #D8E2DE;

    /* Tabela (`TABELA_SOLICITACOES.md`). */
    --v-tab-divisoria: #E4ECE9;
    --v-tab-cabecalho: #F2F7F5;
    --v-tab-texto: #122A23;
    --v-tab-texto-sub: #6B7F78;
    --v-tab-hover: #F7FAF9;

    /* Controles de formulario (`SIMULADOR_PORTAL.md`), usados no
       `tema_simulador_v2.css`. Sao dois cinzas, e a diferenca importa: a borda do
       controle vazio (checkbox, radio) e mais escura que a do campo em volta, senao o
       quadradinho desaparece dentro da propria caixa. */
    --v-tint: #EAF3F0;
    --v-borda-tint: #BFDCD2;
    --v-borda-input: #CBD8D3;
    --v-borda-controle: #B7C7C1;

    /* Aviso (`RESULTADO_SIMULACAO.md`, "callout atencao"). Ambar e nao vermelho: o portal
       usa isto para "leia antes de seguir" — o nome do fundo que vai aparecer no extrato,
       a agenda que ainda nao abriu — e nao para erro. Vermelho nesses casos le como culpa
       de quem esta na tela. */
    --v-aviso-fundo: #FCF7EC;
    --v-aviso-borda: #EAD9B0;
    --v-aviso-icone: #D9A13B;
    --v-aviso-texto: #5C4A22;
    --v-aviso-forte: #3E3113;

    /* Bloqueio: o passo nao da para seguir agora. Um degrau acima do ambar, e nao um
       tratamento paralelo — mesma estrutura de cinco tons, so a matiz muda.

       Tijolo abafado, e nao o `firebrick` do CSS antigo: sobre fundo claro e ao lado do
       verde, vermelho saturado puxa a tela inteira para ele. */
    --v-erro-fundo: #FDF3F1;
    --v-erro-borda: #F0D2CB;
    --v-erro-icone: #C4503A;
    --v-erro-texto: #6B322A;
    --v-erro-forte: #4A2019;
}

/* ============================================================ BOOTSTRAP */

:root:has(#sidebar.sidebar_v2) .btn-primary {
    --bs-btn-bg: var(--v-marca);
    --bs-btn-border-color: var(--v-marca);
    --bs-btn-color: var(--v-sobre-marca);
    --bs-btn-hover-bg: var(--v-marca-hover);
    --bs-btn-hover-border-color: var(--v-marca-hover);
    --bs-btn-hover-color: var(--v-sobre-marca);
    --bs-btn-active-bg: var(--v-marca-hover);
    --bs-btn-active-border-color: var(--v-marca-hover);
    --bs-btn-active-color: var(--v-sobre-marca);
    --bs-btn-disabled-bg: var(--v-marca);
    --bs-btn-disabled-border-color: var(--v-marca);
    --bs-btn-disabled-color: var(--v-sobre-marca);
    --bs-btn-focus-shadow-rgb: 76, 195, 166;
}

:root:has(#sidebar.sidebar_v2) .btn-outline-primary {
    --bs-btn-color: var(--v-medio);
    --bs-btn-border-color: var(--v-marca);
    --bs-btn-hover-bg: var(--v-marca);
    --bs-btn-hover-border-color: var(--v-marca);
    --bs-btn-hover-color: var(--v-sobre-marca);
    --bs-btn-active-bg: var(--v-marca);
    --bs-btn-active-border-color: var(--v-marca);
    --bs-btn-active-color: var(--v-sobre-marca);
    --bs-btn-disabled-color: var(--v-medio);
    --bs-btn-disabled-border-color: var(--v-marca);
    --bs-btn-focus-shadow-rgb: 76, 195, 166;
}

:root:has(#sidebar.sidebar_v2) .btn-link {
    --bs-btn-color: var(--v-medio);
    --bs-btn-hover-color: var(--v-escuro);
}

:root:has(#sidebar.sidebar_v2) .form-check-input:checked {
    background-color: var(--v-marca);
    border-color: var(--v-marca);
}

:root:has(#sidebar.sidebar_v2) .form-check-input:focus,
:root:has(#sidebar.sidebar_v2) .form-control:focus,
:root:has(#sidebar.sidebar_v2) .form-select:focus {
    border-color: var(--v-marca);
    box-shadow: 0 0 0 .25rem rgba(76, 195, 166, .25);
}

:root:has(#sidebar.sidebar_v2) .text-primary {
    color: var(--v-medio) !important;
}

:root:has(#sidebar.sidebar_v2) .bg-primary,
:root:has(#sidebar.sidebar_v2) .text-bg-primary,
:root:has(#sidebar.sidebar_v2) .badge.bg-primary {
    background-color: var(--v-marca) !important;
    color: var(--v-sobre-marca) !important;
}

:root:has(#sidebar.sidebar_v2) .progress-bar {
    background-color: var(--v-marca);
}

/* Paginacao (`dbc.Pagination`, usada pelo `html_table`). Vem pelas variaveis do proprio
   Bootstrap 5.3, e nao por regra em cima de cada estado: assim hover, foco, ativo e
   desabilitado saem coerentes de uma vez, sem uma regra por combinacao.

   O Bootstrap encosta os itens (`margin-left: -1px`) e arredonda so as pontas, para virarem
   um bloco unico. Aqui cada pagina e um botao proprio, separado por `gap` — combina com o
   card da tabela, que ja e um retangulo so. */
:root:has(#sidebar.sidebar_v2) .pagination {
    --bs-pagination-color: var(--v-texto-inativo);
    --bs-pagination-bg: #fff;
    --bs-pagination-border-color: var(--v-borda-clara);
    --bs-pagination-border-radius: 8px;
    --bs-pagination-font-size: 13px;
    --bs-pagination-padding-x: .7rem;
    --bs-pagination-padding-y: .35rem;

    --bs-pagination-hover-color: var(--v-verde-escuro);
    --bs-pagination-hover-bg: var(--v-tab-cabecalho);
    --bs-pagination-hover-border-color: var(--v-borda-clara);

    --bs-pagination-focus-color: var(--v-verde-escuro);
    --bs-pagination-focus-bg: var(--v-tab-cabecalho);
    --bs-pagination-focus-box-shadow: 0 0 0 .2rem rgba(46, 139, 111, .2);

    --bs-pagination-active-color: #fff;
    --bs-pagination-active-bg: var(--v-verde-escuro);
    --bs-pagination-active-border-color: var(--v-verde-escuro);

    --bs-pagination-disabled-color: #A6B8B2;
    --bs-pagination-disabled-bg: #fff;
    --bs-pagination-disabled-border-color: var(--v-borda-clara);

    gap: 6px;
    font-family: Manrope, sans-serif;
    font-weight: 600;
}

:root:has(#sidebar.sidebar_v2) .pagination .page-link {
    border-radius: var(--bs-pagination-border-radius);
    /* O `-1px` do Bootstrap sobrepoe as bordas dos vizinhos; com `gap` ele deixaria o
       primeiro item deslocado. */
    margin-left: 0;
    transition: background-color .15s, color .15s;
}

:root:has(#sidebar.sidebar_v2) .list-group-item.active {
    background-color: var(--v-marca);
    border-color: var(--v-marca);
    color: var(--v-sobre-marca);
}

:root:has(#sidebar.sidebar_v2) .spinner-border.text-primary,
:root:has(#sidebar.sidebar_v2) .spinner-grow.text-primary {
    color: var(--v-marca) !important;
}

:root:has(#sidebar.sidebar_v2) .accordion {
    --bs-accordion-active-color: var(--v-medio);
    --bs-accordion-active-bg: var(--v-claro);
    --bs-accordion-btn-focus-box-shadow: 0 0 0 .25rem rgba(76, 195, 166, .25);
}

:root:has(#sidebar.sidebar_v2) .nav-pills {
    --bs-nav-pills-link-active-bg: var(--v-marca);
    --bs-nav-pills-link-active-color: var(--v-sobre-marca);
}

/* Modal de tela cheia (o checkout da simulacao).

   O react-bootstrap poe `padding-left` **inline** no `.modal` para compensar a barra de
   rolagem que ele tira do body. Num modal normal isso e invisivel: o dialogo tem margem e
   se acomoda. No `fullscreen` o dialogo e `width: 100vw`, entao os 20px empurram a tela
   inteira para fora e o `overflow: hidden` do `.modal` corta o outro lado — medido em
   440px de largura: conteudo comecando em 20 e terminando em 460.

   `!important` porque o alvo e estilo inline, e nao ha outra forma de venc-lo. O `:has(>
   .modal-fullscreen)` restringe aos de tela cheia: nos demais a compensacao continua
   fazendo o que deve. */
:root:has(#sidebar.sidebar_v2) .modal:has(> .modal-fullscreen) {
    padding-left: 0 !important;
    padding-right: 0 !important;
}

/* ==================================================== AZUIS DO PORTAL */

/* Classes de texto de `css_erp.css` e `custom1.css` — todas cravadas em `#2959b0`,
   `#2959ce` ou `#00AEF9`. Os nomes ("blue", "bigblue", "titleBlue") ficam como estao de
   proposito: sao centenas de usos espalhados pelos layouts, e o que importa agora e a cor.
   Renomear e um passo separado.

   O tom e o `--v-verde-escuro`, o mesmo do cabecalho da tabela e da aba ativa — um verde so
   para titulo em fundo claro, em vez de tres parecidos. */
:root:has(#sidebar.sidebar_v2) .link,
:root:has(#sidebar.sidebar_v2) label.blue,
:root:has(#sidebar.sidebar_v2) label.smallblue,
:root:has(#sidebar.sidebar_v2) .bigblue,
:root:has(#sidebar.sidebar_v2) .boldblue,
:root:has(#sidebar.sidebar_v2) label.titleBlue,
:root:has(#sidebar.sidebar_v2) label.biggerblue,
:root:has(#sidebar.sidebar_v2) label.label_master_tutorial {
    color: var(--v-verde-escuro);
}

/* `.tabTitle` fica fora da lista acima porque usa `rgb(41,89,194)` com `!important`, em
   vez dos hexadecimais das outras. */
:root:has(#sidebar.sidebar_v2) .tabTitle {
    color: var(--v-verde-escuro) !important;
}

:root:has(#sidebar.sidebar_v2) button.main_btn {
    background-color: var(--v-marca);
    border-color: var(--v-marca);
    color: var(--v-sobre-marca);
}

:root:has(#sidebar.sidebar_v2) button.main_btn:hover {
    background-color: var(--v-marca-hover);
    border-color: var(--v-marca-hover);
}

/* ==================================================== ABAS DO CONTEUDO */

/* Handoff `Conteudo Portal BDR` (desktop) e `MOBILE_PORTAL.md` (mobile). O portal monta as
   abas **duas vezes**, e so uma aparece de cada vez — quem decide e o `mobile.css`:

       #innertabs > div.flex_column
           > div#subnavbar_mobile.tabsLayout_mobile   <- card; `display: none` >= 768px
           > div.nav_container.tabsLayout             <- barra;  `display: none` <  768px

   Isso explica uma volta que custou caro: estilizar o `ul.listGroup_card` de dentro do
   `#subnavbar_mobile` no desktop nao muda nada na tela, porque aquele ramo inteiro esta
   oculto. Por isso cada bloco abaixo esta na sua `@media` — e nao so os seletores de
   geometria, mas tambem os de cor: `#innertabs .inner_nav_link` sem midia pintaria as
   opcoes do card do mobile com a cor da barra do desktop.

   A segunda armadilha esta no `change_tabs` (`application.py`): ele **substitui** o
   `className` das abas, colocando `'navitem_active'` na ativa e `None` nas demais. Depois
   da primeira navegacao as inativas ficam sem classe nenhuma — nem `nav-item` —, entao a
   aba do desktop e alcancada como filho direto do container. No mobile os itens da lista
   guardam o `list-group-item` do Bootstrap, que o callback nao toca, e esse serve. */

/* -------------------------------------------------------- abas: desktop */

@media (min-width: 768px) {
    #sidebar.sidebar_v2 ~ #main-content #innertabs .nav_container.tabsLayout {
        display: flex;
        flex-direction: row;
        gap: 28px;
        padding: 0 28px;
        background: #fff;
        border-bottom: 1px solid var(--v-borda-clara);
    }

    #sidebar.sidebar_v2 ~ #main-content #innertabs .nav_container.tabsLayout > div {
        padding: 18px 2px 14px;
        background: transparent;
        border: none;
        /* Reservado desde o estado inativo: sem isso a aba salta 2.5px ao virar ativa. */
        border-bottom: 2.5px solid transparent;
        border-radius: 0;
        cursor: pointer;
        width: auto;
    }

    #sidebar.sidebar_v2 ~ #main-content #innertabs .inner_nav_link {
        padding: 0;
        font: 600 14px Manrope, sans-serif;
        color: var(--v-texto-inativo) !important;
        background: none;
        border: none;
        transition: color .15s;
    }

    #sidebar.sidebar_v2 ~ #main-content #innertabs .nav_container.tabsLayout > div:hover .inner_nav_link {
        color: var(--v-verde-escuro) !important;
    }

    /* Ativa. O `mobile.css` crava `border-bottom: 4px solid #2959c6 !important` no
       `.navitem_active` e `color: #2959b0 !important` no `.inner_nav_link` — dai o
       `!important` aqui tambem. */
    #sidebar.sidebar_v2 ~ #main-content #innertabs .navitem_active {
        border-bottom: 2.5px solid var(--v-verde-escuro) !important;
        background: transparent !important;
    }

    #sidebar.sidebar_v2 ~ #main-content #innertabs .navitem_active .inner_nav_link {
        font-weight: 800;
        color: var(--v-verde-escuro) !important;
    }
}

/* --------------------------------------------------------- abas: mobile */

/* A barra de abas vira um seletor: um card com a aba atual e uma lista que abre por cima
   do conteudo. O componente ja existia (card + `dbc.Collapse`); o que muda e a pele e o
   fato de a lista passar a **flutuar** em vez de empurrar a pagina.

   O `:has(.collapse.show)` e o unico jeito de o CSS saber que a lista esta aberta: quem
   guarda esse estado e o `is_open` do `dbc.Collapse`, que vira a classe `show` do
   Bootstrap. Nao ha classe nenhuma no card nem no botao para pendurar a regra. */

@media (max-width: 767.98px) {
    /* Abaixo da app bar da sidebar (ver `--sb-appbar`, em `sidebar_v2.css`). O callback
       clientside do hamburguer tambem escreve este `margin-top` inline, com a altura
       medida do `#sidebar` — que e exatamente a app bar, entao os dois valores coincidem. */
    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile {
        margin-top: var(--sb-appbar);
        padding: 14px 16px 0;
    }

    /* O conteudo comeca abaixo da app bar, e mais abaixo ainda quando ha seletor de abas —
       os dois sao `position: fixed` e nao ocupam espaco no fluxo. */
    #sidebar.sidebar_v2 ~ #main-content {
        padding-top: calc(var(--sb-appbar) + 12px);
    }

    #sidebar.sidebar_v2 ~ #main-content:has(#subnavbar_mobile) {
        padding-top: calc(var(--sb-appbar) + 70px);
    }

    /* ---- gatilho (fechado) ---- */

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card {
        position: relative;
        border: 1px solid var(--v-borda-clara);
        border-radius: 11px;
        background: #fff;
        box-shadow: none;
        transition: border-color .18s;
    }

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card-header {
        padding: 10px 13px;
        background: #fff;
        border: none;
        border-radius: 11px;
        cursor: pointer;
    }

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile #active_tab_mobile {
        font: 800 13px Manrope, sans-serif;
        /* `!important` porque o `.tabTitle` do `mobile.css` tambem usa. */
        color: var(--v-verde-escuro) !important;
        margin: 0;
    }

    /* A seta. E um `<img>` apontando para `img/chevron_tabs_v2.svg` (ver
       `gen_subtabs_layout` e `toggle_collapse_tabs`); a pastilha e o fundo do proprio
       elemento, sem `<span>` a mais em volta — o `<img>` e o alvo do clique. */
    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card-header img {
        box-sizing: border-box;
        width: 22px;
        height: 22px;
        padding: 5.5px;
        border-radius: 7px;
        background: #EAF3F0;
        transition: transform .18s;
    }

    /* ---- gatilho (aberto) ---- */

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card:has(.collapse.show) {
        border: 1.5px solid var(--v-verde-escuro);
    }

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card:has(.collapse.show) .card-header img {
        transform: rotate(180deg);
    }

    /* ---- painel ---- */

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card > .collapse,
    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .card > .collapsing {
        position: absolute;
        top: calc(100% + 8px);
        left: 0;
        right: 0;
        z-index: 15;
        background: #fff;
        border: 1px solid var(--v-borda-clara);
        border-radius: 12px;
        padding: 5px;
        box-shadow: 0 16px 40px rgba(10, 30, 24, .18);
    }

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card {
        border: none;
        border-radius: 0;
    }

    /* ---- opcao ---- */

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card .list-group-item {
        display: flex;
        align-items: center;
        justify-content: space-between;
        gap: 10px;
        padding: 10px 11px;
        border: none;
        border-radius: 8px;
        background: transparent;
        cursor: pointer;
    }

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card .list-group-item:hover {
        background: #F2F7F5;
    }

    /* O `flex: 1` nao e estetica: quem escuta o clique e o `<a>` (`navlink_tabs`), nao o
       `<li>`. Sem ele o link so ocupa a largura da palavra e o toque no resto da linha —
       que e a maior parte dela — cai no `<li>`, que nao tem callback nenhum. */
    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card .inner_nav_link {
        flex: 1;
        padding: 0;
        border: none;
        background: none;
        font: 600 13px Manrope, sans-serif;
        color: var(--v-texto-inativo) !important;
    }

    /* A ativa. O `mobile.css` a **esconde** (`.navitem_active { display: none }`), porque
       no desenho antigo o titulo do card ja a repetia. No seletor novo ela volta para a
       lista, marcada — e o titulo do card continua sendo ela. */
    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card .navitem_active {
        display: flex;
        background: #EAF3F0;
    }

    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card .navitem_active .inner_nav_link {
        font-weight: 800;
        color: var(--v-verde-escuro) !important;
    }

    /* O tique. Desenhado em `::after`, e nao como imagem no Python, porque o `change_tabs`
       reescreve so o `className` dos itens — o conteudo deles ele nao toca. */
    #sidebar.sidebar_v2 ~ #main-content #subnavbar_mobile .listGroup_card .navitem_active::after {
        content: '';
        flex: none;
        width: 14px;
        height: 14px;
        background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232E8B6F' stroke-width='2.8' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 12.5l5 5L20 7'/%3E%3C/svg%3E") center / 14px no-repeat;
    }
}

/* Abas do Bootstrap fora do `#innertabs` (`dbc.Tabs` dentro das paginas e dos modais)
   seguem o mesmo verde, sem a geometria — la a marcacao e outra. Ancoradouro amplo para
   alcancar as que vivem dentro de modal; nao colide com a sidebar, que tem `.nav-link` mas
   nenhum ancestral `.nav-tabs`. */
:root:has(#sidebar.sidebar_v2) .nav-tabs .nav-link.active,
:root:has(#sidebar.sidebar_v2) .nav-tabs .nav-link:hover {
    color: var(--v-verde-escuro) !important;
    border-bottom-color: var(--v-verde-escuro) !important;
}

/* Links soltos do conteudo (`<a>` sem classe).

   A lista de excecoes existe porque este seletor carrega dois ids e quatro classes — nada
   com uma classe so o vence. Todo `<a>` que tiver cor propria precisa entrar aqui. */
#sidebar.sidebar_v2 ~ #main-content a:not(.btn):not(.nav-link):not(.page-link):not(.btn_refresh_v2) {
    color: var(--v-medio);
}

#sidebar.sidebar_v2 ~ #main-content a:not(.btn):not(.nav-link):not(.page-link):not(.btn_refresh_v2):hover {
    color: var(--v-escuro);
}

/* ========================================================= TABELA (html_table) */

/* Handoff `TABELA_SOLICITACOES.md`. Vale para toda tabela montada pelo `html_table`
   (`utils/html_table.py`), nao so a de solicitacoes — e a mesma funcao em varias telas.

   O desenho pressupoe um `display: grid` com `fr`; o portal usa flex com largura em
   porcentagem, vinda do `cols_widths` de cada chamada. Nao ha o que ganhar em converter:
   `2.2fr 1.6fr ...` e `cols_widths` resolvem a mesma coisa, e a porcentagem e escolha de
   quem chama a funcao. O que muda aqui e a pele.

   A marcacao que o `html_table` produz, por celula:

       div.linha_html_table[.cabecalho_html_table]        <- a linha
         div.outer_cell_table_mobile                      <- largura (inline, em %)
           div.main_cells_border.cell_table               <- bordas e altura (inline)
             div.inner_cell_table
               ...
                 div.margin_vl_table                      <- valor principal
                 label.margin_vl_table.smaller            <- subs

   O `.smaller` e o unico sinal que separa valor de sub, e ele e generico: serve para
   qualquer coluna, que e o que permite tipografar a tabela inteira sem a funcao saber o
   que cada coluna significa. */

:root:has(#sidebar.sidebar_v2) .corpo_html_table {
    background: #fff;
    border: 1px solid var(--v-borda-clara);
    /* 10px, e nao os 16px do handoff, porque as quinas ja vem arredondadas em 10px pelas
       classes `*_border_radius` das celulas (`get_border_style`) — trocar so aqui deixaria
       o card e o cabecalho desalinhados. O raio novo fica para depois, a pedido.

       Sem `overflow: hidden`: quando as colunas nao cabem, o `html_table` poe
       `overflow_scroll` **neste mesmo elemento**, e esconder o transbordo mataria a rolagem
       horizontal da tabela larga. */
    border-radius: 10px;
}

/* Sem grade vertical — o desenho separa so as linhas. As barras laterais vinham de
   `main_cells_border` (esquerda) e `last_column_border` (direita), celula a celula. */
:root:has(#sidebar.sidebar_v2) .corpo_html_table .cell_table {
    border-left: none;
    border-right: none;
    border-top-color: var(--v-tab-divisoria);
    padding: 14px;
}

:root:has(#sidebar.sidebar_v2) .corpo_html_table .last_row_border {
    border-bottom: none;
}

/* ---- cabecalho ---- */

:root:has(#sidebar.sidebar_v2) .cabecalho_html_table .cell_table {
    background: var(--v-tab-cabecalho);
    border-top: none;
    border-bottom: 1px solid var(--v-borda-clara);
    padding: 13px 14px;
}

/* Vence a regra generica de `.bigblue` la de cima (que pinta os titulos do conteudo de
   `--v-medio`) e o `font-size: 1.1rem` do `mobile.css`. */
:root:has(#sidebar.sidebar_v2) .cabecalho_html_table .bigblue {
    font: 800 13px Manrope, sans-serif;
    color: var(--v-verde-escuro) !important;
    text-align: center;
}

/* ---- linhas ---- */

/* A tipografia da linha mora na **celula**, e nao so no `.margin_vl_table`.

   O `html_table` so envolve o valor nesse `margin_vl_table` quando a coluna aparece em
   `row_formats` (`utils/html_table.py`, dentro do `if col in r_fmts`). Coluna sem
   formato declarado — a "Ocorrencia" do historico, por exemplo — cai direto no
   `flex_column center_all` e nao era alcancada por regra nenhuma: ficava com o 16px
   herdado do corpo, no meio de vizinhas de 12.5px.

   Presa a celula, a regra vale para as duas — a declarada e a que ninguem declarou — e o
   `.margin_vl_table` fica valendo so para o `.smaller` do sub, logo abaixo. */
:root:has(#sidebar.sidebar_v2) .linha_html_table:not(.cabecalho_html_table) .cell_table,
:root:has(#sidebar.sidebar_v2) .linha_html_table .margin_vl_table {
    font: 700 12.5px Manrope, sans-serif;
    color: var(--v-tab-texto);
}

:root:has(#sidebar.sidebar_v2) .linha_html_table .margin_vl_table.smaller {
    font: 500 11.5px Manrope, sans-serif;
    color: var(--v-tab-texto-sub);
    margin-top: 4px;
}

:root:has(#sidebar.sidebar_v2) .linha_html_table:not(.cabecalho_html_table):hover .cell_table {
    background: var(--v-tab-hover);
}

/* Os links e acoes dentro da tabela seguem o verde, nao o azul do `custom1.css`. */
:root:has(#sidebar.sidebar_v2) .linha_html_table .actions,
:root:has(#sidebar.sidebar_v2) .linha_html_table .link {
    color: var(--v-verde-escuro);
}

/* O icone de acao (`img/acao_raio.svg`, trocado no `html_table`). O `custom1.css` desenha
   `img.actions` com 2rem (32px), medida do PNG antigo; o handoff pede 18px, que ficou
   pequeno demais na tela real. 24px e o tamanho escolhido, e coincide com o `viewBox` do
   arquivo — o desenho sai na escala 1:1. A cor nao vem daqui: o `stroke` esta escrito
   dentro do SVG, porque um `<img>` nao herda `currentColor`. */
:root:has(#sidebar.sidebar_v2) .linha_html_table img.actions {
    width: 24px;
    height: 24px;
}

/* ================================================== SPINNERS (dcc.Loading) */

/* O portal tem ~380 `dcc.Loading`, quase todos sem `color`, e o padrao do Dash e um azul
   `#119DFF` cravado. Trocar um por um sairia caro e envelheceria mal; aqui a cor passa a
   ser a do tema de uma vez.

   O `!important` e ganho, nao preguica: o `dcc.Loading` **nao** usa `style` inline nem
   variavel de CSS. Ele monta um `<style>` proprio, com a cor interpolada no texto da regra,
   e o injeta junto do spinner — no corpo da pagina, portanto depois desta folha na ordem do
   documento. Sem `!important` aquele `<style>` vence por ordem, mesmo com especificidade
   igual.

   Os tres seletores sao os tres tipos que o portal usa: o padrao (barras), `type='dot'` e
   `type='circle'`. Todos pintam com `background-color` — inclusive o circle, que desenha as
   bolinhas em `::before`. Um tipo novo que apareca so precisa entrar nesta lista.

   Fora daqui ficam os dois `dcc.Loading` de tela cheia do `home_layout`, que ja recebem
   `color=COR_TEMA` como propriedade (o `dcc.Loading` a exige em Python, nao da para vir de
   CSS), e o modal de acoes das solicitacoes, que usa `custom_spinner` com o loader do
   Mantine. */

:root:has(#sidebar.sidebar_v2) .dash-default-spinner > div,
:root:has(#sidebar.sidebar_v2) .dash-dot-spinner > div,
:root:has(#sidebar.sidebar_v2) .dash-sk-circle .dash-sk-child:before {
    background-color: var(--v-marca) !important;
}


/* ================================================== BOTAO DE RECARREGAR

   Nasce no `_botao_refresh` (`layouts/erp/antecipacoes.py`), que so o monta com a
   `LAYOUT_V2` ligada — por isso este bloco nao leva o ancoradouro que prefixa o resto do
   arquivo: nao ha versao antiga desta classe para desambiguar.

   A cor vive aqui, e nao na prop `color` do `DashIconify`, justamente para poder viver
   aqui: sem a prop o icone desenha em `currentColor`. */

.btn_refresh_v2 {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 30px;
    height: 30px;
    border-radius: 9px;
    color: var(--v-verde-escuro);
    cursor: pointer;
    transition: background-color .15s, color .15s;
}

.btn_refresh_v2:hover,
.btn_refresh_v2:focus {
    background: var(--v-tint);
    color: var(--v-marca-hover);
}


/* ================================================== PAGINA NAO ENCONTRADA

   Handoff `Pagina Nao Encontrada BDR.dc.html`. Veste o `page_not_found`
   (`layouts/main.py`), que so monta esta arvore com a `LAYOUT_V2` ligada — por isso, como
   o botao de recarregar acima, este bloco nao leva o ancoradouro do resto do arquivo.

   A pagina vive **ao lado** da sidebar, dentro do `#main-content`. A altura vem em `vh`, e
   nao em `%`, porque nao ha o que preencher: o `#main-content` cresce com o conteudo, entao
   um `height: 100%` aqui resolveria contra um pai que ele proprio dimensiona — zero, ou
   uma referencia circular. Os 48px descontados sao o recuo do `#main-content` mais a
   folga do documento; medido na tela, sem eles sobravam 20px de rolagem. O bloco fica uns
   poucos pixels acima do centro exato — barra de rolagem por 20px numa pagina de erro
   incomoda mais do que isso. */

.pagina_404_v2 {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    min-height: calc(100vh - 48px);
    padding: 24px;
    box-sizing: border-box;
    font-family: Manrope, sans-serif;
}

/* No mobile a barra do topo come a altura util (ver `sidebar_v2.css`). */
@media (max-width: 767.98px) {
    .pagina_404_v2 {
        min-height: calc(100vh - var(--sb-appbar, 66px) - 48px);
    }
}

.icone_404_v2 {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 104px;
    height: 104px;
    flex: none;
    border-radius: 50%;
    background: var(--v-tint);
}

.icone_404_v2 img {
    width: 48px;
    height: 48px;
}

.titulo_404_v2 {
    margin-top: 24px;
    font: 800 22px Manrope, sans-serif;
    color: var(--v-tab-texto);
    letter-spacing: -.4px;
}

.texto_404_v2 {
    max-width: 400px;
    margin-top: 10px;
    font: 500 14px/1.6 Manrope, sans-serif;
    color: var(--v-tab-texto-sub);
}

.botoes_404_v2 {
    display: flex;
    gap: 10px;
    flex-wrap: wrap;
    justify-content: center;
    margin-top: 28px;
}

/* `<a>` e nao `<button>`: ele navega de fato, e o proprio `href` faz o trabalho — sem
   callback, funciona ate com o JS do Dash ainda carregando. */
.btn_principal_404_v2 {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    height: 48px;
    border-radius: 12px;
    cursor: pointer;
    text-decoration: none;
}

.btn_principal_404_v2 {
    padding: 0 24px;
    background: var(--v-verde-escuro);
    color: #fff;
    font: 800 14px Manrope, sans-serif;
    transition: background-color .15s;
}

/* `!important` porque a regra dos `<a>` soltos do conteudo carrega dois ids e quatro
   classes — a alternativa era somar mais um `:not()` la, e a lista ja esta longa. */
.btn_principal_404_v2,
.btn_principal_404_v2:hover {
    color: #fff !important;
}

.btn_principal_404_v2:hover {
    background: var(--v-marca-hover);
}

.rodape_404_v2 {
    margin-top: 22px;
    font: 500 12.5px Manrope, sans-serif;
    color: #93A6A0;
}

/* `!important` pelo mesmo motivo do botao primario: a regra dos `<a>` soltos do conteudo
   carrega dois ids e quatro classes, e sem isto o e-mail sai no `--v-medio` dela em vez do
   verde da marca. */
.rodape_404_v2 a,
.rodape_404_v2 a:hover {
    font-weight: 600;
    text-decoration: none;
}

.rodape_404_v2 a {
    color: var(--v-verde-escuro) !important;
}

.rodape_404_v2 a:hover {
    color: var(--v-marca-hover) !important;
}

/* Icone de estado dentro de tabela (`check_icon` do `utils/html_table.py`). Substituiu o
   emoji, que era desenhado pela fonte do sistema e mudava de cor a cada plataforma. */
.icone_check_tabela {
    width: 18px;
    height: 18px;
    vertical-align: middle;
}

/* ================================================== ESTADO VAZIO

   "Nenhuma informacao encontrada" — o cartao que ocupa o lugar da tabela quando a busca
   nao devolve linha nenhuma. Monta em `estado_vazio_v2` (`layouts/erp/antecipacoes.py`).

   Nomes em `_v2` como o resto do tema, e nao os `.icon` / `.title` do handoff: numa folha
   compartilhada esses dois sao genericos demais — qualquer `.title` que um dia caia dentro
   do cartao herdaria o estilo do titulo do vazio. O desenho e o do handoff, sem mudanca.

   Nada de vermelho: filtro que nao acha nada e um resultado, nao um erro. */

.estado_vazio_v2 {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    padding: 56px 24px;
    background: #fff;
    border: 1px solid var(--v-borda-clara);
    border-radius: 10px;
}

.estado_vazio_v2 .icone_estado_vazio_v2 {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 88px;
    height: 88px;
    border-radius: 50%;
    background: var(--v-tint);
    color: var(--v-verde-escuro);
}

/* O `tabler:*` desenha com `stroke-width="2"`, e o atributo vem no `<path>` de dentro,
   nao no `<svg>` — por isso o seletor precisa alcancar os filhos tambem, senao os 1.5 do
   handoff nao chegam ao traco. Atributo de apresentacao perde para folha de estilo. */
.estado_vazio_v2 .icone_estado_vazio_v2 svg,
.estado_vazio_v2 .icone_estado_vazio_v2 svg * {
    stroke-width: 1.5;
}

.estado_vazio_v2 .titulo_estado_vazio_v2 {
    margin-top: 18px;
    font: 800 17px Manrope, sans-serif;
    color: var(--v-tab-texto);
}

/* Variante de secao: mesmo cartao, menos ar. Usado quando o vazio ocupa um pedaco da
   tela e nao a tela inteira. */
.estado_vazio_compacto_v2 {
    padding: 32px 24px;
}

.estado_vazio_compacto_v2 .icone_estado_vazio_v2 {
    width: 64px;
    height: 64px;
}

.estado_vazio_compacto_v2 .titulo_estado_vazio_v2 {
    margin-top: 14px;
    font-size: 14.5px;
}

/* ================================================== KPI E PILLS DE STATUS

   Par rotulo/valor sem moldura, e as pills de contagem embaixo. Nasceu no Resumo das
   Solicitacoes e o Extrato usa o mesmo — por isso mora aqui, e nao na folha de uma tela.

   Sem mini-cartoes (o Historico usa os `cartao_indicador_v2`): quando sao sete ou oito
   numeros lado a lado, uma moldura em cada vira ruido. O que separa e o espaco da grade.

   O numero de colunas e classe, e nao `auto-fit`: cada tela sabe quantos numeros tem, e
   `minmax` fecharia todos numa fila so nas telas largas.
   ================================================== */
.grade_kpi_v2 {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 18px 28px;
}

.grade_kpi_7_v2 {
    grid-template-columns: repeat(7, 1fr);
    gap: 18px;
}

/* Numero que e um problema — "Nao Baixado" no Extrato.

   As duas classes juntas no seletor, e nao so a de erro: `.valor_kpi_v2` tambem crava
   `color` e vem depois nesta folha, entao com igual especificidade ela vencia e o
   vermelho nunca aparecia. Assim a regra deixa de depender da ordem. */
.valor_kpi_v2.valor_kpi_erro_v2 {
    color: #C4553F;
}

.rotulo_kpi_v2 {
    font: 700 11px Manrope, sans-serif;
    color: var(--v-tab-texto-sub);
    letter-spacing: .4px;
    text-transform: uppercase;
}

.valor_kpi_v2 {
    margin-top: 4px;
    font: 800 17px Manrope, sans-serif;
    color: var(--v-tab-texto);
}

.pills_status_v2 {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

.pill_status_v2 {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 11px;
    border: 1px solid var(--v-tab-divisoria);
    border-radius: 14px;
    font: 600 12px Manrope, sans-serif;
    color: var(--v-texto-inativo);
}

.pill_status_v2 b {
    color: var(--v-tab-texto);
}

/* Cancelado e o unico status que e um desfecho ruim; os demais sao etapas. */
.pill_status_erro_v2 {
    border-color: #F0D5D0;
    background: #FDF6F4;
    color: #C4553F;
}

.pill_status_erro_v2 b {
    color: #C4553F;
}

@media (max-width: 1399.98px) {
    .grade_kpi_7_v2 {
        grid-template-columns: repeat(4, 1fr);
    }
}

@media (max-width: 1199.98px) {
    .grade_kpi_v2 {
        grid-template-columns: repeat(3, 1fr);
    }
}

@media (max-width: 767.98px) {
    .grade_kpi_v2,
    .grade_kpi_7_v2 {
        grid-template-columns: repeat(2, 1fr);
    }
}


/* ============================================================ CONTROLES DE FILTRO

   Chips, segmented e a linha "ROTULO -> controles". Nasceram no handoff dos Atingimentos
   e o do Download de Agendas pede os mesmos, entao moram aqui, sem nome de tela.

   Todos desenham em cima do `dbc.Checklist` / `dbc.RadioItems`, que rendem
   `.form-check > input.form-check-input + label.form-check-label` dentro de um wrapper —
   a classe vai no wrapper.
   ============================================================ */

/* Rotulos e campos do Mantine dentro de um cartao de filtros. A classe vai no cartao. */
/* Os rotulos dos campos continuam vindo da prop `label` do Mantine — sao quatro ids ja
   ligados a callbacks, e mover cada um para um `<div>` proprio seria mexer em muita coisa
   por tipografia. */
.form_v2 .mantine-InputWrapper-label {
    margin-bottom: 7px;
    font: 700 12px Manrope, sans-serif;
    color: var(--v-verde-escuro);
    letter-spacing: .6px;
    text-transform: uppercase;
}

.form_v2 .mantine-Input-input {
    --input-height: 42px;
    min-height: 42px;
    border-radius: 10px;
    border-color: var(--v-borda-input);
    font: 600 13px Manrope, sans-serif;
    color: var(--v-tab-texto);
}

.form_v2 .mantine-Input-input:focus,
.form_v2 .mantine-Input-input:focus-within {
    border-color: var(--v-verde-escuro);
}

.form_v2 .mantine-Input-placeholder,
.form_v2 .mantine-Input-input::placeholder {
    color: #93A6A0;
}

.linha_filtro_v2 {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}

/* Largura natural: quem quiser alinhar as linhas numa coluna so crava a largura no
   proprio cartao (ver `.linhas_filtro_ating_v2` em `tema_atingimentos_v2.css`). Fixar
   74px aqui cortava "AGRUPAMENTO" no Download, que e a palavra mais longa dos dois
   handoffs — e o do Download nem pede coluna alinhada. */
.rotulo_linha_v2 {
    flex: none;
    font: 700 12px Manrope, sans-serif;
    color: var(--v-verde-escuro);
    letter-spacing: .6px;
    text-transform: uppercase;
}

.controles_linha_v2 {
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
}

/* "Nada marcado = todos". Mudo, e nao o secundario dos rotulos: e nota de rodape do
   controle ao lado, e nao mais um rotulo. */
.hint_filtro_v2 {
    font: 500 12px Manrope, sans-serif;
    color: #93A6A0;
}

/* ============================================================ CHIPS */

/* Checkbox solto (fora de chip), do `dbc.Checkbox`. 17px e radius 5, como os do Mantine
   nas Solicitacoes — os dois convivem na mesma tela e nao podem ter tamanhos diferentes. */
.check_v2 .form-check-input,
.check_v2.form-check .form-check-input {
    width: 17px;
    height: 17px;
    margin-top: 0;
    border-radius: 5px;
    border: 1.5px solid var(--v-borda-controle);
    cursor: pointer;
}

.check_v2 .form-check-input:checked,
.check_v2.form-check .form-check-input:checked {
    background-color: var(--v-verde-escuro);
    border-color: var(--v-verde-escuro);
}

.check_v2 .form-check-label,
.check_v2.form-check .form-check-label {
    font: 600 13px Manrope, sans-serif;
    color: var(--v-tab-texto);
    cursor: pointer;
}

/* Chip-pill com o checkbox dentro, no lugar da lista empilhada. O `dbc.Checklist` desenha
   `.form-check > input.form-check-input + label.form-check-label` dentro de um wrapper;
   quem recebe a classe e o wrapper, e quem vira pill e o `.form-check` — assim o clique
   no espaco entre a caixinha e o texto tambem alterna.

   `display: flex` no `.form-check` tambem resolve o `float: left` que o bootstrap poe no
   input: item de flex ignora float. */
.chips_v2 {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

.chips_v2 .form-check {
    display: flex;
    align-items: center;
    gap: 7px;
    margin: 0;
    padding: 7px 13px;
    min-height: 0;
    border: 1px solid var(--v-borda-input);
    border-radius: 16px;
    background: #fff;
    cursor: pointer;
}

.chips_v2 .form-check-input {
    width: 14px;
    height: 14px;
    margin: 0;
    flex: none;
    border: 1.5px solid var(--v-borda-controle);
    border-radius: 4px;
    cursor: pointer;
}

.chips_v2 .form-check-label {
    margin: 0;
    font: 600 12.5px Manrope, sans-serif;
    color: var(--v-tab-texto);
    cursor: pointer;
}

/* A borda engorda de 1px para 1.5px ao marcar. Sem compensar o padding a pill andaria
   1px para cada lado, e a fila inteira tremeria a cada clique. */
.chips_v2 .form-check:has(.form-check-input:checked) {
    border-width: 1.5px;
    border-color: var(--v-verde-escuro);
    background: var(--v-tint);
    padding: 6.5px 12.5px;
}

.chips_v2 .form-check-input:checked {
    background-color: var(--v-verde-escuro);
    border-color: var(--v-verde-escuro);
}

/* Variante de erro para OPCOES: sao tres recortes de problema, e o verde da marca leria
   como "ligado/bom". O texto ja nasce no tom de erro apagado e so ganha forca ao marcar. */
.chips_erro_v2 .form-check-label {
    color: var(--v-erro-texto);
}

.chips_erro_v2 .form-check:has(.form-check-input:checked) {
    border-color: var(--v-erro-icone);
    background: var(--v-erro-fundo);
}

.chips_erro_v2 .form-check:has(.form-check-input:checked) .form-check-label {
    color: var(--v-erro-icone);
}

.chips_erro_v2 .form-check-input:checked {
    background-color: var(--v-erro-icone);
    border-color: var(--v-erro-icone);
}

/* ============================================================ SPLIT (segmented) */

/* Tres escolhas exclusivas de uma coisa so: um controle unico com o segmento aceso diz
   isso melhor que tres radios soltos. O radio some, quem desenha e o label. */
.segmented_v2 {
    display: flex;
    border: 1px solid var(--v-borda-input);
    border-radius: 10px;
    overflow: hidden;
}

.segmented_v2 .form-check {
    margin: 0;
    padding: 0;
    min-height: 0;
}

.segmented_v2 .form-check + .form-check .form-check-label {
    border-left: 1px solid var(--v-borda-input);
}

.segmented_v2 .form-check-input {
    position: absolute;
    opacity: 0;
    pointer-events: none;
}

.segmented_v2 .form-check-label {
    display: block;
    margin: 0;
    padding: 9px 16px;
    font: 600 12.5px Manrope, sans-serif;
    color: var(--v-texto-inativo);
    cursor: pointer;
}

.segmented_v2 .form-check:has(.form-check-input:checked) .form-check-label {
    background: var(--v-verde-escuro);
    font-weight: 800;
    color: #fff;
}
