/* `tokens.css` NÃO entra por @import.
 *
 * A URL importada não recebe o `?v=<mtime>` que o AssetResolver carimba, e o
 * CDN serve `css/` com uma semana de cache. Na prática: alterar um token e
 * publicar não chegava a quem já tinha visitado — medido, o navegador
 * continuou servindo o valor antigo mesmo com o CDN já atualizado, e furar o
 * cache do <link> desta folha não alcança o filho importado.
 *
 * Ele passa a ser <link> versionado, emitido por Moldura::estilos() DEPOIS
 * desta folha — medido em /admin/auth/resetpassword, a ordem servida é
 * app-*.css, global_sistema.css, pages/…/resetpassword.css, fontes,
 * tokens.css, moldura.css, listas.css. Custom property não se resolve por
 * ordem de declaração: `var(--accent)` escrito aqui enxerga o valor que
 * tokens.css declara depois, e é por isso que a inversão não quebrou nada.
 *
 * O que ela quebrou está logo abaixo, no bloco de reserva.
 */

/* ═════════════════════════════════════════════════════════════════════════════
   Tema do backoffice do ARGS.

   Esta folha NÃO declara mais cor. A paleta inteira vive em `tokens.css`,
   medida pixel a pixel nos dois logotipos; aqui ficam só as regras que dizem
   ONDE cada papel se aplica. Uma verdade só sobre a cor de um botão, que era o
   que este cabeçalho prometia e ainda não cumpria: até aqui os literais
   estavam espalhados por 40 lugares deste arquivo.

   Duas mudanças de papel vieram junto com os tokens, e valem registro:

   1. O azul deixou de ser MARINHO e passou a ser o PETRÓLEO do emblema
      (#154b83 / #1e75a2 / #72aac6, medidos). O marinho de antes (#12294a) não
      existe em lugar nenhum do logotipo — foi escolha minha em 06/09, e ao
      lado do carmim da marca ele puxava para o roxo.

   2. Título de página, de cartão e de modal deixaram de ser azuis e passaram a
      ser tinta (`--text-strong`). O azul passou a significar "isto é ação ou
      navegação"; um `<h3>` não é nem uma coisa nem outra, e quando tudo é azul
      o azul não avisa mais nada.

   O que muda é acabamento, não estrutura: mesmas telas, mesmos fluxos, mesmos
   menus. Ver os commits de 06/09/2026.
   ═════════════════════════════════════════════════════════════════════════════ */

/* ── Reserva de papéis, para quem não recebe `tokens.css` ─────────────────────

   `Moldura::estilos()` é quem emite o <link> do `tokens.css`, e quem não passa
   pelo layout do backoffice não o recebe. A tela de ACESSO é exatamente esse
   caso: `AuthController` a devolve terminal — ela declara o próprio <head>,
   nunca chama `moldura()` —, e o `AssetResolver` só lhe entrega o bundle, esta
   folha e `pages/admin/auth/login.css`.

   O resultado, medido em 08/09 em /admin/auth/login: dos 44 papéis que esta
   folha consome, os 44 resolviam para NADA. Toda declaração `var(--papel)`
   ficava inválida e caía no valor inicial — 36 dos 41 elementos da tela
   pintavam diferente do pretendido. O pior deles era o botão que abre o
   sistema: `pages/admin/auth/login.css` pede `background: var(--args-navy)`,
   `--args-navy` é apelido de `--accent`, `--accent` não existia ali, o fundo
   virou `transparent` e sobrou texto BRANCO sobre o cartão BRANCO — 1:1, a
   ação principal do sistema invisível. As bordas dos campos e do filete, que
   deviam ser `#ddd9d7`, pintavam PRETAS pelo mesmo motivo.

   Estes valores são cópia dos que `tokens.css` produz no tema claro, lidos do
   estilo computado, não transcritos à mão. A cópia é inerte onde o original
   chega: `tokens.css` vem DEPOIS desta folha e ganha por ordem na mesma
   especificidade, e os blocos escuros de lá (`:root[data-theme="dark"]`,
   `@media (prefers-color-scheme: dark) :root:not([data-theme="light"])`) têm
   especificidade maior e ganham dos dois. Conferido elemento a elemento em
   /admin/auth/resetpassword, claro e escuro: nenhuma cor mudou.

   Reserva é remendo, não arquitetura. O conserto de verdade é uma linha —
   `tokens.css` no <head> de `admin/auth/login.phtml`, ou no `AssetResolver`
   para todo módulo que não seja `application` — e vive em view/PHP, fora
   desta frente. Enquanto ela não vier, isto é o que impede a tela de acesso
   de sair sem paleta; no dia em que vier, este bloco inteiro sai. Ele NÃO é
   lugar para token novo: quem manda continua sendo `tokens.css`. */
:root {
    /* Marca e ação */
    --brand: #8e262a;
    --accent: #1e75a2;
    --accent-hover: #175f92;
    --accent-text: #154b83;
    --text-on-accent: #fff;

    /* Superfícies e texto */
    --paper: #eeeae7;
    --surface: #fff;
    --surface-hover: #efeceb;
    --surface-sunken: #f8f7f6;
    --text: #2b2726;
    --text-strong: #171414;
    --text-muted: #6b6461;
    /* `tokens.css` calcula este com `color-mix`; o resultado medido é este. */
    --text-subtle: #6f6865;

    /* Bordas */
    --border: #ddd9d7;
    --border-strong: #bbb5b2;
    --border-subtle: #efeceb;
    --border-field: #8d8683;

    /* Barra lateral e topo */
    --chrome: #154b83;
    --chrome-hover: rgba(255, 255, 255, .1);
    --chrome-active: rgba(255, 255, 255, .16);
    --chrome-text: rgba(255, 255, 255, .82);
    --chrome-text-strong: #fff;

    /* Estados */
    --success: #296a41;
    --success-text: #225533;
    --success-subtle: #e8f8ee;
    --success-subtle-border: #b8e6ca;
    --warning: #8b521f;
    --warning-text: #6d3e1b;
    --warning-subtle: #fff4e3;
    --warning-subtle-border: #fedaa0;
    --danger: #8e262a;
    --danger-text: #791c20;
    --danger-subtle: #fff2f1;
    --danger-subtle-border: #ffc8c7;
    --info-text: #154b83;
    --info-subtle: #f3f9fb;
    --info-subtle-border: #d0e4ed;

    /* Foco, relevo e raio */
    --focus-outline: 3px solid rgba(30, 117, 162, .55);
    --focus-ring: 0 0 0 4px rgba(30, 117, 162, .28);
    --scrim: rgba(13, 51, 105, .35);
    --shadow: 0 1px 2px rgba(21, 75, 131, .06), 0 4px 16px rgba(21, 75, 131, .07);
    --shadow-lg: 0 12px 40px rgba(21, 75, 131, .18);
    --shadow-bar: 0 1px 0 rgba(255, 255, 255, .06), 0 2px 12px rgba(13, 51, 105, .3);
    --radius: 10px;
    --radius-lg: 14px;
}

/* ── Compatibilidade: os nomes antigos viram apelidos dos papéis ──────────────

   Cinco folhas por página (`pages/admin/auth/login.css`, `pages/admin/perfil`,
   `pages/cadastro.css`, `pages/site.css`, `pages/application/escala`) e 28
   regras deste arquivo consomem `--args-*`. Reapontar os apelidos troca a cor
   das cinco de uma vez, sem editar nenhuma delas e sem tocar em nenhuma view.

   Não crie `--args-*` novo: em código novo use o papel (`--accent`, `--text`,
   `--border`) direto de tokens.css. */
:root {
    /* Marca. `navy` guarda o nome antigo, mas o marinho acabou: aponta para o
       azul-petróleo que trabalha. As folhas por página usam este apelido das
       duas maneiras — como texto sobre cartão claro (escala) e como fundo de
       botão com texto branco por cima (login) —, e o azul-700 é o único passo
       da rampa que serve para as duas com 5:1 ou mais. */
    --args-navy: var(--accent);
    --args-navy-claro: var(--accent-hover);
    --args-vermelho: var(--brand);
    --args-ceu: var(--accent);

    /* Neutros. Passaram de viés AZUL para viés QUENTE — o porquê está em
       tokens.css: cinza frio encostado em carmim esverdeia. */
    --args-tinta: var(--text);
    --args-cinza: var(--text-muted);
    --args-cinza-claro: var(--text-subtle);
    --args-borda: var(--border);
    --args-fundo: var(--paper);
    --args-superficie: var(--surface);
    --args-superficie-alt: var(--surface-sunken);

    /* Semânticos */
    --args-ok: var(--success);
    --args-ok-fundo: var(--success-subtle);
    --args-atencao: var(--warning);
    --args-atencao-fundo: var(--warning-subtle);
    --args-erro: var(--danger);
    --args-erro-fundo: var(--danger-subtle);
    --args-info: var(--info-text);
    --args-info-fundo: var(--info-subtle);

    --args-raio: var(--radius);
    --args-raio-g: var(--radius-lg);
    --args-sombra: var(--shadow);
    --args-sombra-alta: var(--shadow-lg);
}

/* ── Base ────────────────────────────────────────────────────────────────── */

body {
    background-color: var(--paper);
    color: var(--text);
    -webkit-font-smoothing: antialiased;
}

a {
    color: var(--accent);
}

a:hover {
    color: var(--accent-hover);
}

/* Cabeçalho e conteúdo dividem a mesma caixa, com as mesmas margens, e a
   caixa é a janela inteira.

   Houve aqui um teto de 1560px só no `.page-content` — que deixava o título e
   os botões com 1956px e a tabela logo abaixo com 1560 — e depois um de
   2100px no `article`, que resolvia o desalinhamento mas devolvia margens de
   230px de cada lado num monitor de 2560. Nos dois casos a conta era minha, e
   nos dois a tela sobrava.

   Sem teto: a grade da escala, que é o caso extremo (uma coluna por instrutor,
   dezoito colunas num dia cheio), usa cada pixel disponível. O que limita a
   largura de uma tela passa a ser o conteúdo dela, não um número escolhido
   aqui. */
article {
    /* O rodapé é fixo: sem esta folga o último botão do formulário fica
       embaixo dele. "Salvar" ficava cortado na tela de notícias. */
    padding: 20px 24px 72px;
}

/* A barra fixa do topo já é compensada pelo padding do body; a margem daqui
   somava mais 30px e empurrava o título para 110px do topo da janela. */
.page-content {
    max-width: none;
}

hr {
    border-color: var(--border);
    opacity: 1;
}

/* ── Barra de navegação ──────────────────────────────────────────────────── */

.navbar.bg-dark {
    background-color: var(--chrome) !important;
    box-shadow: var(--shadow-bar);
    padding-top: .35rem;
    padding-bottom: .35rem;
}

.navbar .navbar-brand {
    padding: 4px 18px 4px 4px;
}

.navbar .navbar-brand img {
    height: 34px;
}

.navbar .nav-link {
    color: var(--chrome-text);
    border-radius: 8px;
    padding: .4rem .7rem;
    font-size: 14.5px;
    transition: background-color .12s ease, color .12s ease;
}

.navbar .nav-link:hover,
.navbar .nav-link:focus,
.navbar .nav-item.show > .nav-link {
    color: var(--chrome-text-strong);
    background-color: var(--chrome-hover);
}

.navbar .nav-link.active {
    color: var(--chrome-text-strong);
    background-color: var(--chrome-active);
}

.navbar .nav-link i.fa {
    opacity: .85;
    margin-right: 2px;
}

.navbar .dropdown-menu {
    border: 1px solid var(--border);
    border-radius: var(--radius);
    box-shadow: var(--shadow-lg);
    padding: 6px;
    margin-top: 6px;
}

.navbar .dropdown-item {
    border-radius: 7px;
    padding: .45rem .6rem;
    font-size: 14px;
    color: var(--text);
}

.navbar .dropdown-item:hover,
.navbar .dropdown-item:focus {
    background-color: var(--surface-sunken);
    color: var(--accent-text);
}

.navbar .dropdown-item.active {
    background-color: var(--accent);
    color: var(--text-on-accent);
}

.navbar .dropdown-item i.fa {
    width: 18px;
    text-align: center;
    color: var(--text-subtle);
    margin-right: 4px;
}

.navbar .dropdown-item:hover i.fa {
    color: var(--accent);
}

.navbar .dropdown-item.active i.fa {
    color: var(--text-on-accent);
    opacity: .8;
}

.navbar .dropdown-divider {
    border-color: var(--border);
    margin: 5px 4px;
}

/* `position: inherit` aqui vinha do layout antigo. Como o seletor é por id,
   ganhava do `position: relative` da barra da escala pública — e o filete da
   marca, que é um ::before absoluto, perdia o ancestral posicionado e ia
   grudar no topo da janela, atravessado na tela inteira. */
#divNavEscala {
    position: relative;
}

/* ── Cabeçalho da página ─────────────────────────────────────────────────── */

.cabecalho-pagina {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    justify-content: space-between;
    gap: 12px 20px;
    padding-bottom: 16px;
    margin-bottom: 20px;
    border-bottom: 1px solid var(--border);
}

.cabecalho-pagina h3 {
    margin: 0;
    font-size: 22px;
    font-weight: 700;
    letter-spacing: -.015em;
    color: var(--text-strong);
    display: flex;
    align-items: center;
    gap: 10px;
}

.cabecalho-pagina h3 i.fa {
    color: var(--text-subtle);
    font-size: 19px;
}

.cabecalho-pagina__subtitulo {
    margin: 4px 0 0;
    font-size: 13.5px;
    color: var(--text-muted);
}

.cabecalho-pagina__acoes {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    margin-left: auto;
}

/* Compatibilidade com telas que ainda montam o cabeçalho à mão. */
.page-header {
    padding-top: 0;
    margin: 0 0 16px;
}

.page-header h3 {
    margin: 0;
    font-size: 22px;
    font-weight: 700;
    color: var(--text-strong);
}

/* ── Botões ──────────────────────────────────────────────────────────────── */

.btn {
    border-radius: 8px;
    font-weight: 600;
    letter-spacing: .005em;
    border-width: 1px;
    transition: background-color .12s ease, border-color .12s ease, box-shadow .12s ease, transform .05s ease;
}

.btn:active {
    transform: translateY(1px);
}

.btn:focus-visible {
    outline: var(--focus-outline);
    outline-offset: 2px;
    box-shadow: none;
}

.btn-sm {
    padding: .38rem .8rem;
    font-size: 13.5px;
}

/* As sete variantes de botão (`primary`, `success`, `info`, `danger`,
   `warning`, `secondary`, `link`) moravam aqui, com dez hexadecimais soltos
   entre elas. Foram para a ponte de componentes de `tokens.css`, com as mesmas
   decisões de sempre — inclusive as duas que valem repetir:

     · o `btn-info` do "Pesquisar" continua sendo um botão CLARO de contorno: o
       ciano de fábrica dá 1,9:1 com texto branco;
     · o `btn-warning` idem, pelo mesmo motivo.

   O que muda é que agora o `btn-primary` é o azul-petróleo medido no emblema e
   escurece no hover, em vez de clarear — e que as sete variantes acompanham o
   tema escuro sem uma linha a mais, porque apontam para papel e não para cor.
   O motivo de estarem lá e não aqui é o site público: `global_site.css` não
   carrega esta folha, e antes ficava com os botões azul-Bootstrap. */

/* ── Formulários ─────────────────────────────────────────────────────────── */

/* O rótulo era `--text-muted`: cinza médio sobre cinza claro, e o formulário
   inteiro parecia desabilitado. O rótulo é o que se lê primeiro — vai no tom
   do texto. */
label,
.control-label {
    font-size: 13px;
    font-weight: 600;
    color: var(--text);
    margin-bottom: 6px;
    letter-spacing: .005em;
}

/* Um <label> que é pedaço de campo (o "Calmo" do vento, no PO) herdava a
   regra acima: a margem de baixo encolhia a caixa dentro do grupo — 35 px ao
   lado de campos de 40 — e a fonte menor destoava dos vizinhos. */
.input-group > label.input-group-text {
    margin-bottom: 0;
    font-size: inherit;
    font-weight: inherit;
    color: inherit;
}

/* O contorno do campo tem de aparecer: 3:1 contra o fundo (WCAG 1.4.11).
   `--border` (ink-200) dava menos de 2:1, e no cartão branco o campo sumia —
   o "formulário apagado" era isto. `--border-field` (tokens.css) dá 3,6:1 sobre
   branco e 4,6:1 sobre o cartão do tema escuro. */
.form-control,
.form-select {
    min-height: 42px;
    border-radius: 8px;
    border-color: var(--border-field);
    color: var(--text-strong);
    padding: .55rem .8rem;
    font-size: 14.5px;
    background-color: var(--surface);
    transition: border-color .15s ease, box-shadow .15s ease;
}

.form-control-sm,
.form-select-sm {
    min-height: 34px;
}

.form-control:hover:not(:focus):not(:disabled):not([readonly]),
.form-select:hover:not(:focus):not(:disabled) {
    border-color: var(--text-muted);
}

.form-control:focus,
.form-select:focus {
    border-color: var(--accent);
    box-shadow: var(--focus-ring);
}

textarea.form-control {
    min-height: 110px;
    line-height: 1.5;
}

/* O `::placeholder` do Bootstrap, e a regra que havia aqui, só alcançam
   `.form-control` — e boa parte dos campos do sistema não leva essa classe: o
   campo de busca da moldura (`#molduraBusca`, presente em TODA tela) e os
   campos de data e hora das configurações são os casos medidos. Sem regra que
   os alcance vale o cinza padrão do navegador, #757575, que sobre `--surface`
   no tema escuro dá 3,67:1 — abaixo dos 4,5:1 exigidos.

   Por elemento, e não por classe, justamente para não depender da view: a
   classe que falta é defeito de marcação, mas a cor ilegível é problema aqui.

   O literal de reserva existe porque o `tokens.css` NÃO é carregado na tela de
   login, que mesmo assim carrega esta folha: sem ele, `var()` sem valor cairia
   para o herdado e o placeholder ficaria com a cor do texto digitado. #767676
   é o cinza mais claro que ainda dá 4,54:1 sobre branco. */
input::placeholder,
textarea::placeholder {
    color: var(--text-subtle, #767676);
    opacity: 1;   /* o Firefox aplica opacidade própria ao placeholder */
}

.form-control:disabled,
.form-control[readonly] {
    background-color: var(--surface-sunken);
    color: var(--text-muted);
}

.input-group-text {
    background-color: var(--surface-sunken);
    border-color: var(--border-field);
    color: var(--text-muted);
    border-radius: 8px;
}

/* Boa parte dos formulários emite <input type="checkbox"> puro, sem as classes
   do Bootstrap. Em vez de reescrever dezenas de views, o acento vem por CSS. */
input[type="checkbox"],
input[type="radio"] {
    accent-color: var(--accent);
    width: 15px;
    height: 15px;
    vertical-align: -2px;
    cursor: pointer;
}

input[type="checkbox"]:focus-visible,
input[type="radio"]:focus-visible {
    outline: var(--focus-outline);
    outline-offset: 1px;
}

.form-check-input:checked {
    background-color: var(--accent);
    border-color: var(--accent);
}

.form-check-input:focus {
    border-color: var(--accent);
    box-shadow: var(--focus-ring);
}

.formFields {
    margin-bottom: 16px;
}

/* ── O seletor com seta ─────────────────────────────────────────────────────
   `FormSelect` emite `<select class="form-control">`, e o `.form-control` do
   Bootstrap tira a aparência nativa: "Ativo", "Casado(a)", "Diretoria" saíam
   com cara de caixa de texto, sem nada dizendo que abrem uma lista. A seta é
   desenhada aqui, a mesma em todo seletor do sistema — inclusive nos filtros,
   que tinham a seta nativa, diferente em cada navegador. */
select.form-control:not([multiple]):not([size]),
.campo-filtro > select:not([multiple]),
.form-campo > select:not([multiple]) {
    appearance: none;
    -webkit-appearance: none;
    padding-right: 2.4rem;
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%236b6461' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m3 6 5 5 5-5'/%3e%3c/svg%3e");
    background-repeat: no-repeat;
    background-position: right .8rem center;
    background-size: 14px 14px;
}

@media (prefers-color-scheme: dark) {
    :root:not([data-theme="light"]) select.form-control:not([multiple]):not([size]),
    :root:not([data-theme="light"]) .campo-filtro > select:not([multiple]),
    :root:not([data-theme="light"]) .form-campo > select:not([multiple]) {
        background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23bbb5b2' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m3 6 5 5 5-5'/%3e%3c/svg%3e");
    }
}

:root[data-theme="dark"] select.form-control:not([multiple]):not([size]),
:root[data-theme="dark"] .campo-filtro > select:not([multiple]),
:root[data-theme="dark"] .form-campo > select:not([multiple]) {
    background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23bbb5b2' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m3 6 5 5 5-5'/%3e%3c/svg%3e");
}

/* O botão "Escolher arquivo" era cinza sobre cinza; no acento claro ele se
   anuncia como botão. */
.form-control::file-selector-button {
    background-color: var(--accent-subtle);
    color: var(--accent-text);
    font-weight: 600;
    border-inline-end-color: var(--accent-subtle-border);
}

.form-control:hover:not(:disabled):not([readonly])::file-selector-button {
    background-color: color-mix(in srgb, var(--accent-subtle) 82%, var(--accent));
}

/* ── O formulário é um cartão ───────────────────────────────────────────────
   Sem abas, os campos ficavam soltos no chão bege da página. Agora o próprio
   <form> é o cartão branco; com abas, o cartão é o das abas (ver "Abas").
   `form-sistema` vem de `Core\Form\Form`, e só vale dentro da moldura — o
   formulário de uma janela modal já está dentro de um cartão. */
.args-moldura form.form-sistema:not(:has(.tab-content)) {
    padding: 22px 22px 6px;
    background-color: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-sm);
}

/* No formulário que é cartão, a barra de ações é o RODAPÉ dele — e não um
   segundo cartão dentro do primeiro. As margens negativas levam a barra até
   a borda (o respiro lateral do cartão é 22px; o de baixo, 6px). */
.args-moldura form.form-sistema:not(:has(.tab-content)) .form-actions {
    margin: 20px -22px -6px;
    border-width: 1px 0 0;
    border-radius: 0 0 var(--radius-lg) var(--radius-lg);
    background-color: var(--surface-sunken);
    box-shadow: none;
}

.args-moldura .modal form.form-sistema {
    padding: 0;
    background: none;
    border: 0;
    box-shadow: none;
}

/* Título de seção dentro do formulário ("Dados de acesso"): era um h4 enorme
   com ícone, maior que o título da tela. Vira a divisória da seção. */
.form-sistema h4:has(> i),
.tab-pane h4:has(> i) {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 8px 0 14px;
    padding-top: 18px;
    border-top: 1px solid var(--border-subtle);
    font-size: 15px;
    font-weight: 700;
    color: var(--text-strong);
}

.form-sistema h4:has(> i) > i,
.tab-pane h4:has(> i) > i {
    color: var(--accent);
    font-size: 14px;
}

/* Barra de ações do formulário. Tinha altura fixa de 53px: qualquer botão que
   quebrasse de linha saía para fora dela. Agora é uma barra branca com sombra,
   que na tela larga acompanha a rolagem — formulário longo não esconde mais o
   "Salvar" lá embaixo. No celular, as ações vão para a barra da moldura
   (`#molduraAcoes` clona os botões da tela), e esta fica no fluxo. */
.form-actions {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: center;
    gap: 8px;
    min-height: 60px;
    padding: 10px 16px;
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    background-color: var(--surface);
    box-shadow: var(--shadow);
    margin-top: 20px;
}

/* `sticky` só anda dentro do pai. As views embrulham a barra em
   `.row > .col-12`, um pai da altura dela: quem gruda é a `.row`, cujo pai é
   o formulário inteiro. */
@media (min-width: 900px) {
    .form-actions,
    .row:has(> [class*="col"] > .form-actions) {
        position: sticky;
        bottom: 16px;
        z-index: 20;
    }
}

.form-actions button {
    margin-top: 0;
}

.titleSubGroup h4 {
    margin: 6px 0 4px;
    font-size: 16px;
    font-weight: 700;
    color: var(--text-strong);
    display: flex;
    align-items: center;
    gap: 8px;
}

.titleSubGroup h4 i {
    color: var(--text-subtle);
    font-size: 15px;
}

.titleSubGroup hr {
    margin: 0 0 14px;
}

.sepCadAux {
    margin: 7px 0;
    color: transparent;
}

/* ── Tabelas ─────────────────────────────────────────────────────────────── */

/* A `.row` que envolve a tabela traz as calhas negativas do Bootstrap e
   escapa 12px de cada lado do cartão. Ficava escondido pelo `overflow` do
   cartão, mas desalinhava a rolagem horizontal das listas largas. */
#tableList > .row {
    --bs-gutter-x: 0;
    margin-left: 0;
    margin-right: 0;
}

#tableList > .row > [class^="col-"] {
    padding-left: 0;
    padding-right: 0;
}

#tableList,
.tabela-cartao {
    background-color: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow);
    overflow: hidden;
}

table.table {
    margin-bottom: 0;
    --bs-table-bg: transparent;
    border-color: var(--border);
}

table.table thead tr th {
    text-align: center;
    white-space: nowrap;
    vertical-align: middle;
    background-color: var(--surface-sunken);
    color: var(--text-muted);
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: .06em;
    text-transform: uppercase;
    padding: 12px 10px;
    border-bottom: 1px solid var(--border);
}

table.table tbody tr td {
    text-align: left;
    padding: 11px 10px;
    vertical-align: middle;
    font-size: 14px;
    border-color: var(--border-subtle);
}

/* O Bootstrap 5.3 pinta zebra e realce com box-shadow interno, não com
   background-color — mudar a cor de fundo aqui não apareceria por baixo dela. */
table.table tbody tr:hover > * {
    box-shadow: inset 0 0 0 9999px var(--surface-hover);
    color: var(--text);
}

/* Dentro do cartão, as linhas verticais da tabela duplicam a moldura que a
   borda do cartão já dá. Ficam só as horizontais, que é o que separa registro
   de registro. Fora do cartão (grade da escala) a grade continua inteira. */
#tableList table.table-bordered > :not(caption) > * > * {
    border-left-width: 0;
    border-right-width: 0;
}

table.table tbody tr td.tdActions {
    width: 1%;
    text-align: center;
    white-space: nowrap;
}

/* `margin-right` em cada ícone sobra no último e joga o grupo 4px para a
   esquerda do centro da coluna. Com `gap` o espaçamento fica entre eles, e o
   grupo cai no meio. */
table.table tbody tr td.tdActions {
    white-space: nowrap;
}

table.table tbody tr td.tdActions a,
table.table tbody tr td.tdActions i.fa {
    margin: 0 6px;
    color: var(--accent);
}

table.table tbody tr td.tdActions a:first-child { margin-left: 0; }
table.table tbody tr td.tdActions a:last-child  { margin-right: 0; }

table.table tbody tr td.tdActions a:hover {
    color: var(--accent);
}

table.table tbody tr td.tdActions a.fa,
table.table tbody tr td.tdActions i.fa {
    font-size: 18px;
}

table.table tbody tr td.tdCenter {
    text-align: center;
}

table td.tdFit,
table td.thFit {
    width: 1% !important;
    white-space: nowrap !important;
}

table td.thCenter,
table td.tdCenter {
    text-align: center !important;
    vertical-align: middle !important;
}

/* Rodapé da lista: recarregar à esquerda, itens por página à direita. Era
   feito com dois `float` e margens soltas em atributo `style`. */
.rodapeLista {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
}

.rodapeLista > a.fa {
    font-size: 16px;
    text-decoration: none;
}

.rodapeLista__porPagina {
    display: flex;
    align-items: center;
    gap: 8px;
    margin: 0;
    font-weight: 500;
}

.rodapeLista__porPagina select {
    width: auto;
    min-width: 72px;
}

table.table tfoot tr td {
    background-color: var(--surface-sunken);
    border-top: 1px solid var(--border);
    padding: 8px 10px;
    font-size: 13px;
    color: var(--text-muted);
}

.tableWidget {
    background-color: var(--surface);
}

.tableWidget tfoot,
.tableWidget tfoot tr td {
    padding: 0;
}

.tableWidget tfoot tr td a {
    font-size: 18px;
    margin: 6px 10px;
    float: right;
}

/* ── Paginação ───────────────────────────────────────────────────────────── */

.pagination {
    margin: 16px 0 0;
    gap: 4px;
    align-items: center;
    flex-wrap: wrap;
}

/* A paginação vem dentro do mesmo cartão da lista: sem folga, os números
   encostavam na borda de baixo. */
#tableList .pagination {
    margin: 0;
    padding: 12px 14px;
    border-top: 1px solid var(--border);
    background-color: var(--surface-sunken);
    font-size: 13.5px;
    color: var(--text-muted);
}

.pagination .page-link,
ul.pagination > li > a,
ul.pagination > li > span {
    border-radius: 8px;
    border: 1px solid var(--border);
    color: var(--accent);
    padding: .35rem .7rem;
    font-size: 13.5px;
    background-color: var(--surface);
}

.pagination .page-item.active .page-link,
ul.pagination > li.active > a,
ul.pagination > li.active > span {
    background-color: var(--accent);
    border-color: var(--accent);
    color: var(--text-on-accent);
}

/* ── Emblemas de situação ────────────────────────────────────────────────── */

/* O fundo cinza vem no `.badge` e não só no `.badge-default` porque no
   Bootstrap 3 a pastilha nua era cinza de fábrica, e no 5 ela ficou sem fundo
   nenhum — herda `color: #fff` e mais nada. Um `<span class="badge">` migrado
   sem variante virava texto branco no branco: 1,07:1, invisível. Três deles
   viviam no widget de CMA do painel. Aqui a variante sobrepõe (usa
   `!important`), então nenhum caso colorido muda. */
.badge {
    border-radius: 999px;
    padding: .38em .75em;
    font-size: 11.5px;
    font-weight: 700;
    letter-spacing: .02em;
    background-color: var(--surface-sunken);
    border: 1px solid var(--border-strong);
    color: var(--text-muted);
}

/* Pastilhas: fundo claro e texto escuro leem melhor numa tabela densa do que
   seis retângulos saturados disputando atenção com o conteúdo. */
.badge.badge-default,
.badge.bg-secondary {
    background-color: var(--surface-sunken) !important;
    border-color: var(--border-strong);
    color: var(--text-muted) !important;
}

.badge.badge-primary,
.badge.bg-primary {
    background-color: var(--info-subtle) !important;
    border-color: var(--info-subtle-border);
    color: var(--info-text) !important;
}

.badge.badge-success,
.badge.bg-success {
    background-color: var(--success-subtle) !important;
    border-color: var(--success-subtle-border);
    color: var(--success) !important;
}

.badge.badge-info,
.badge.bg-info {
    background-color: var(--info-subtle) !important;
    border-color: var(--info-subtle-border);
    color: var(--info-text) !important;
}

.badge.badge-warning,
.badge.bg-warning {
    background-color: var(--warning-subtle) !important;
    border-color: var(--warning-subtle-border);
    color: var(--warning) !important;
}

.badge.badge-danger,
.badge.bg-danger {
    background-color: var(--danger-subtle) !important;
    border-color: var(--danger-subtle-border);
    color: var(--danger) !important;
}

/* ── Avisos ──────────────────────────────────────────────────────────────── */

.alert {
    border-radius: var(--radius);
    border-width: 1px;
    font-size: 14px;
    padding: 12px 14px;
}

.alert-success {
    background-color: var(--success-subtle);
    border-color: var(--success-subtle-border);
    color: var(--success-text);
}

.alert-info {
    background-color: var(--info-subtle);
    border-color: var(--info-subtle-border);
    color: var(--info-text);
}

.alert-warning {
    background-color: var(--warning-subtle);
    border-color: var(--warning-subtle-border);
    color: var(--warning-text);
}

.alert-danger {
    background-color: var(--danger-subtle);
    border-color: var(--danger-subtle-border);
    color: var(--danger-text);
}

/* ── Painéis e abas ──────────────────────────────────────────────────────── */

.card,
.panel {
    border: 1px solid var(--border);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow);
}

.card > .card-header {
    background-color: var(--surface-sunken);
    border-bottom: 1px solid var(--border);
    font-weight: 700;
    color: var(--text-strong);
}

/* Painéis do painel inicial. Cada um traz o seu próprio <style>, com regras
   bem específicas para altura e espaçamento do cabeçalho; o que falta é o
   tamanho do título, que herdava o h4 do navegador — 24px numa faixa de 32px
   de altura. `.card-header h4.tituloWidget` passa por cima do `div.widgetX h4`
   de cada partial sem precisar de !important. */
.card-header h4.tituloWidget {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 16px;
    font-weight: 700;
    line-height: 22px;
    color: var(--text-strong);
}

.card-header h4.tituloWidget i.fa {
    font-size: 15px;
    color: var(--text-subtle);
}

/* ── Abas ────────────────────────────────────────────────────────────────────
   Abas e painel formam um cartão só: as abas são o cabeçalho branco, a ativa
   sublinhada no acento; o painel é o corpo. Antes o painel era cinza quase do
   tom do chão da página, e o formulário não se destacava de nada. */
.nav-tabs {
    border-bottom: 1px solid var(--border);
    gap: 2px;
}

.nav-tabs .nav-link {
    margin-bottom: -1px;
    padding: 12px 14px;
    border: 0;
    border-bottom: 2px solid transparent;
    border-radius: 0;
    color: var(--text-muted);
    font-weight: 600;
    font-size: 14px;
    background: transparent;
}

.nav-tabs .nav-link:hover {
    color: var(--text-strong);
    border-bottom-color: var(--border-strong);
    background: transparent;
}

.nav-tabs .nav-link.active {
    color: var(--accent-text);
    border-bottom-color: var(--accent);
    background: transparent;
}

.nav-tabs:has(+ .tab-content) {
    padding: 4px 10px 0;
    background-color: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
}

ul#myTab li.active a {
    background-color: transparent;
}

div.tab-content div.tab-pane {
    padding: 22px 22px 8px;
    border: 1px solid var(--border);
    border-top: 0;
    border-radius: 0 0 var(--radius-lg) var(--radius-lg);
    background-color: var(--surface);
    box-shadow: var(--shadow-sm);
}

/* ── Janelas ─────────────────────────────────────────────────────────────── */

.modal-content {
    border: 0;
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    overflow: hidden;
}

.modal-header {
    background-color: var(--surface-sunken);
    border-bottom: 1px solid var(--border);
    padding: 14px 18px;
}

/* Mesma regra do cabeçalho dos cartões (abaixo): a marcação herdada põe o
   fechar ANTES do título, e o `margin-left: auto` do Bootstrap empurrava os
   dois para a direita — o X colado na lupa, o título encostado na borda. */
.modal-header .modal-title {
    order: 1;
    margin: 0;
}

.modal-header .btn-close {
    order: 2;
    margin: 0 0 0 auto;
}

.modal-title {
    font-size: 17px;
    font-weight: 700;
    color: var(--text-strong);
    display: flex;
    align-items: center;
    gap: 8px;
}

.modal-body {
    padding: 18px;
}

.modal-footer {
    background-color: var(--surface-sunken);
    border-top: 1px solid var(--border);
    padding: 12px 18px;
    gap: 8px;
}

/* `width` em .modal-dialog é do Bootstrap 3; no 5 quem manda é max-width. */
#divModalPesquisa .modal-dialog,
#divModal .modal-dialog,
#divModalHabilitacao .modal-dialog {
    max-width: min(96vw, 1100px);
    width: auto !important;
}

#divModalPesquisa .modal-footer button.btn {
    margin: 0;
}

/* Estes modais recebem o conteúdo por AJAX e não sabem a altura de antemão.
   Sem rolagem própria, um formulário mais alto que a janela — o de marcar voo,
   com a lista de horários — empurra o rodapé para fora da tela, e o botão
   Salvar fica inalcançável. O cabeçalho e o rodapé ficam fixos, o corpo rola. */
#divModal .modal-content,
#divModalHabilitacao .modal-content {
    max-height: calc(100vh - 3.5rem);
}

#divModal .modal-content > form,
#divModal .modal-content > .card,
#divModal .modal-content > form > .card,
#divModalHabilitacao .modal-content > form,
#divModalHabilitacao .modal-content > .card,
#divModalHabilitacao .modal-content > form > .card {
    display: flex;
    flex-direction: column;
    min-height: 0;
    max-height: 100%;
    border: 0;
    border-radius: 0;
    box-shadow: none;
}

#divModal .card-body,
#divModalHabilitacao .card-body {
    overflow-y: auto;
    min-height: 0;
}

#divModal .card-footer,
#divModalHabilitacao .card-footer {
    display: flex;
    flex-wrap: wrap;
    justify-content: flex-end;
    align-items: center;
    gap: 8px;
    padding: 12px 18px;
    background-color: var(--surface-sunken);
    border-top: 1px solid var(--border);
    flex-shrink: 0;
}

/* ═══════════════════════════════════════════════════════════════════════════
   Conteúdo dos modais

   O conteúdo destes modais vem por AJAX e é escrito com as tags nuas do
   navegador: `<h3>Instrutor</h3>` para o rótulo de uma seção e `<h3>Guilherme
   Zitske Bartz</h3>` para o nome, ambos em 28px, dentro de uma janela de
   detalhe. Sem escala de tipo, tudo grita no mesmo volume e nada guia a
   leitura — o rótulo "Instrutor" tinha o mesmo peso do nome do instrutor.

   O padrão da marcação dá o gancho: um cabeçalho seguido de `<hr>` é sempre
   rótulo de seção; o mesmo cabeçalho sem `<hr>` é conteúdo. Daí a escala sai
   sem tocar em nenhuma das dezenas de views.
   ═══════════════════════════════════════════════════════════════════════════ */

.modal .card-body {
    padding: 20px 22px;
    font-size: 14px;
    color: var(--text);
}

/* ── Rótulo de seção: cabeçalho seguido de régua ─────────────────────────── */

.modal .card-body h3:has(+ hr),
.modal .card-body h4:has(+ hr),
.modal .card-body h5:has(+ hr) {
    margin: 0;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: .12em;
    text-transform: uppercase;
    color: var(--text-subtle);
}

.modal .card-body h3:has(+ hr) + hr,
.modal .card-body h4:has(+ hr) + hr,
.modal .card-body h5:has(+ hr) + hr {
    margin: 6px 0 12px;
    border: 0;
    border-top: 1px solid var(--border);
    opacity: 1;
}

/* ── Conteúdo: do mais forte ao mais discreto ────────────────────────────── */

.modal .card-body h3:not(:has(+ hr)) {
    margin: 0 0 2px;
    font-size: 18px;
    font-weight: 700;
    letter-spacing: -.01em;
    line-height: 1.25;
    color: var(--text-strong);
}

.modal .card-body h4:not(:has(+ hr)) {
    margin: 0 0 2px;
    font-size: 14px;
    font-weight: 600;
    color: var(--text-muted);
}

.modal .card-body h5:not(:has(+ hr)) {
    margin: 0 0 8px;
    font-size: 13px;
    font-weight: 500;
    color: var(--text-subtle);
}

.modal .card-body p {
    margin: 0 0 8px;
    font-size: 14px;
    line-height: 1.5;
    color: var(--text-muted);
}

/* ── Pares rótulo/valor ──────────────────────────────────────────────────── */

/* `<label>Resp. Cadastro:</label>&nbsp;Alvaro Masotti` — o rótulo recua e o
   valor avança, para a coluna ser lida na vertical. */
.modal .card-body label {
    margin: 0;
    font-size: 12px;
    font-weight: 600;
    color: var(--text-subtle);
}

.modal .card-body .row > [class^="col-"] {
    margin-bottom: 2px;
}

/* ── Retratos ────────────────────────────────────────────────────────────── */

/* A foto vinha com `width: 100%` da folha da própria view: numa coluna larga
   virava um retrato gigante, e quando o arquivo não existe — o normal para
   quem não tem foto — sobrava o ícone de imagem quebrada do navegador. */
.modal .card-body img.img-thumbnail {
    width: 76px;
    height: 76px;
    object-fit: cover;
    padding: 0;
    border-radius: 10px;
    border: 1px solid var(--border);
    background: var(--surface-sunken);
}

/* O quadrado de 76 px é o retrato do piloto na tela do voo. "Visualizar
   foto" e "Visualizar imagem" usam a mesma classe e viravam miniatura: lá a
   imagem é o conteúdo, e ocupa o modal. */
.modal .card-body img.img-thumbnail.fotoView,
.modal .card-body img.img-thumbnail.imagemView {
    width: auto;
    height: auto;
    max-width: 100%;
    max-height: 70vh;
    object-fit: contain;
}

/* ── Ações e emblemas dentro do modal ────────────────────────────────────── */

.modal .card-body a.fa {
    font-size: 15px;
    margin-right: 10px;
    color: var(--accent);
    text-decoration: none;
}

.modal .card-body a.fa:hover {
    color: var(--accent);
}

.modal .card-body .consultaAnac:not(.acao) img {
    width: 22px;
    height: auto;
    border: 0;
    border-radius: 0;
    background: none;
    vertical-align: -4px;
}

/* ── Cabeçalho ───────────────────────────────────────────────────────────── */

.modal .card-header {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 14px 18px !important;
    background-color: var(--surface-sunken);
    border-bottom: 1px solid var(--border);
}

/* Bloco, não flex: em flex, cada pedaço de texto do título vira um item, e
   um título longo (o do bloqueio, o de marcar voo) pulava inteiro para a
   linha de baixo no celular — o ícone ficava sozinho em cima. Em bloco o
   texto quebra como texto, e o ícone e o selo de situação acompanham. */
.modal .card-header h4 {
    flex: 1 1 auto;
    min-width: 0;
    margin: 0;
    font-size: 17px;
    font-weight: 700;
    line-height: 1.35;
    letter-spacing: -.01em;
    color: var(--text-strong);
    text-wrap: balance;
}

.modal .card-header h4 > i:first-child {
    margin-right: 8px;
}

.modal .card-header h4 .badge,
.modal .card-header h4 .selo {
    margin-left: 6px;
    vertical-align: 2px;
}

.modal .card-header h4 i.fa {
    color: var(--text-subtle);
    font-size: 15px;
}

/* O botão de fechar vinha antes do título na marcação; a ordem visual é a
   inversa em toda janela deste século. */
.modal .card-header .btn-close {
    order: 2;
    margin-left: auto;
}

/* ── Editor de texto ─────────────────────────────────────────────────────── */

.jqte {
    padding: 0;
    margin: 0;
}

.jqte div.jqte_editor,
textarea.richText {
    height: 250px;
}

.ql-toolbar.ql-snow {
    border-color: var(--border);
    border-radius: 8px 8px 0 0;
    background-color: var(--surface-sunken);
}

.ql-container.ql-snow {
    border-color: var(--border);
    border-radius: 0 0 8px 8px;
    font-size: 14.5px;
}

.ql-container .ql-editor {
    min-height: 190px;
}

/* ── Rodapé ──────────────────────────────────────────────────────────────── */

footer {
    position: fixed;
    bottom: 0;
    width: 100%;
    height: 42px;
    background-color: var(--surface);
    border-top: 1px solid var(--border);
    z-index: 5;
}

footer .footer {
    padding: 0 14px;
}

footer #logoBerniSoftware img {
    float: right;
    margin-right: 10px;
    max-height: 30px;
    width: auto;
    border: 0;
    padding: 0;
    background: none;
    opacity: .7;
    transition: opacity .12s ease;
}

footer #logoBerniSoftware:hover img {
    opacity: 1;
}

.linkRodape {
    display: inline-block;
    margin: 9px 0 0 8px;
    color: var(--text-muted);
    font-size: 18px;
}

.linkRodape:hover {
    color: var(--accent-hover);
    text-decoration: none;
}

#linkPublicoHabilitacoes img {
    width: 26px;
}

#linkPublicoMetar img {
    height: 22px;
}

.consultaAnac:not(.acao) img {
    width: 23px;
    margin-top: -10px;
}

/* ── Espera ──────────────────────────────────────────────────────────────── */

/* O anel do sistema, no lugar da biruta em GIF (loader2.gif): desenhado em
   CSS, nítido em qualquer tela, na cor de acento do tema — claro ou escuro —,
   e sem 45 KB de imagem a cada lista que recarrega. Quem prefere movimento
   reduzido vê um pulso lento em vez do giro.

   Uso: `$.carregando.bloco()` no lugar de um conteúdo que ainda vem;
   `$.carregando.linha()` no corpo de uma tabela. */
.carregando {
    display: grid;
    justify-items: center;
    gap: 10px;
    padding: 28px 12px;
    font-size: .9rem;
    color: var(--text-muted);
}

.carregando__anel {
    --tamanho: 28px;
    --espessura: 3px;
    width: var(--tamanho);
    height: var(--tamanho);
    border-radius: 50%;
    background: conic-gradient(from 90deg, transparent 0 15%, var(--accent));
    -webkit-mask: radial-gradient(farthest-side, transparent calc(100% - var(--espessura)), #000 calc(100% - var(--espessura) + .5px));
    mask: radial-gradient(farthest-side, transparent calc(100% - var(--espessura)), #000 calc(100% - var(--espessura) + .5px));
    animation: carregando-gira .8s linear infinite;
}

.carregando__anel--grande {
    --tamanho: 44px;
    --espessura: 4px;
}

@keyframes carregando-gira {
    to { transform: rotate(1turn); }
}

@keyframes carregando-pulsa {
    50% { opacity: .35; }
}

@media (prefers-reduced-motion: reduce) {
    .carregando__anel {
        animation: carregando-pulsa 1.6s ease-in-out infinite;
    }
}

/* O bloqueio da tela: cobre tudo NA HORA — é o que impede o clique num link
   de exclusão antes de o JavaScript prender a confirmação nele —, mas só
   APARECE depois de 250 ms. Requisição rápida não pisca a tela inteira; a
   demorada ganha o escurecimento e o cartão com o anel. */
#divAjaxLoading {
    position: fixed;
    inset: 0;
    z-index: 10000000;
    display: grid;
    place-items: center;
    cursor: progress;
    background: transparent;
    animation: bloqueio-escurece .2s ease .25s forwards;
}

#divAjaxLoading[hidden] {
    display: none !important;
}

.bloqueio__cartao {
    display: grid;
    justify-items: center;
    gap: 12px;
    padding: 22px 28px;
    font-size: .9rem;
    color: var(--text-muted);
    background: var(--surface);
    border-radius: var(--radius-lg);
    box-shadow: var(--shadow-lg);
    opacity: 0;
    transform: translateY(4px) scale(.98);
    animation: bloqueio-aparece .2s ease .25s forwards;
}

@keyframes bloqueio-escurece {
    to {
        background: var(--scrim);
        backdrop-filter: blur(1.5px);
    }
}

@keyframes bloqueio-aparece {
    to {
        opacity: 1;
        transform: none;
    }
}

@media (max-width: 768px) {
    article {
        padding: 14px 12px 72px;
    }

    .cabecalho-pagina__acoes {
        margin-left: 0;
    }
}

/* ── Janelas no celular: gaveta lateral de tela inteira ──────────────────────
   Padrão do sistema (pedido de 14/09/2026). Abaixo de 900px — o mesmo corte
   em que a barra lateral vira gaveta — toda janela `.modal` entra pela direita
   e ocupa a tela: no celular, uma caixa flutuante com margens deixa o
   formulário espremido e o "Salvar" fora de alcance. O cabeçalho fica
   parado, só o corpo rola.

   Os ids repetem os seletores de largura lá de cima (`#divModal …`), que por
   serem de id ganhariam desta regra. O diálogo de confirmação
   (`$.confirmar`) é um <dialog> próprio, não `.modal`, e continua pequeno:
   "tem certeza?" não pede tela inteira. */
@media (max-width: 899.98px) {
    .modal .modal-dialog,
    #divModal .modal-dialog,
    #divModalHabilitacao .modal-dialog,
    #divModalPesquisa .modal-dialog {
        position: fixed;
        inset: 0;
        width: 100% !important;
        max-width: none;
        height: 100%;
        margin: 0;
    }

    .modal.fade .modal-dialog {
        transform: translateX(100%);
        transition: transform .25s ease-out;
    }

    .modal.show .modal-dialog {
        transform: none;
    }

    .modal .modal-content,
    #divModal .modal-content,
    #divModalHabilitacao .modal-content {
        height: 100%;
        max-height: none;
        border-radius: 0;
        box-shadow: none;
    }

    .modal .modal-body {
        overflow-y: auto;
    }
}

@media (max-width: 899.98px) and (prefers-reduced-motion: reduce) {
    .modal.fade .modal-dialog {
        transition: none;
    }
}

/* Na gaveta, o cartão que o conteúdo AJAX traz (form > .card) ocupa a altura
   toda: o rodapé com "Fechar"/"Salvar" encosta no pé da tela, em vez de o
   cartão terminar no meio com cantos arredondados e uma faixa branca embaixo. */
@media (max-width: 899.98px) {
    #divModal .modal-content > form,
    #divModal .modal-content > .card,
    #divModal .modal-content > form > .card,
    #divModalHabilitacao .modal-content > form,
    #divModalHabilitacao .modal-content > .card,
    #divModalHabilitacao .modal-content > form > .card {
        flex: 1 1 auto;
        height: 100%;
    }

    #divModal .card-body,
    #divModalHabilitacao .card-body {
        flex: 1 1 auto;
    }
}

