/*
 * Utilitárias do projeto — substituem atributos `style=""` no HTML.
 *
 * Motivação (CSP / pentest 2026-08): atributo `style` é governado pelo
 * `style-src-attr` do CSP e, diferente de `<script>`, NÃO aceita nonce. A única
 * forma de autorizá-lo é `'unsafe-inline'`. Estilo declarado em folha carregada
 * é coberto por `'self'`, então tudo que sai do atributo aproxima a remoção do
 * `'unsafe-inline'` de `style-src`.
 *
 * Nenhuma regra aqui usa `!important`, de propósito: `.show()`, `.hide()` e
 * `.toggle()` do jQuery escrevem `display` inline via CSSOM (que o CSP não
 * governa) e precisam sobrepor a classe. O `.d-none` do Bootstrap é
 * `display: none !important` e venceria o inline, quebrando esses toggles —
 * por isso ele não serve para elemento que o JS mostra/esconde.
 *
 * Carregada depois de bootstrap/app em `layouts/app` e `layouts/guest`, para
 * vencer o empate de especificidade com utilitárias do Bootstrap de mesmo peso
 * (ex.: `.spinner-border`, que declara `display: inline-block`).
 *
 * Aqui ficam só utilitárias de comportamento/semântica. Geometria arbitrária
 * (larguras, alturas, offsets em px) mora em `public/css/dimensions.css`.
 */

/* Estado inicial oculto de elemento que o JS revela depois. */
.js-hidden {
    display: none;
}

/* Título em caixa alta com rastreamento aberto (header de card de risco/top). */
.ls-2px {
    letter-spacing: 2px;
}

/* Elemento clicável que não é <button>/<a> (a maioria com role="button"). */
.cursor-pointer {
    cursor: pointer;
}

/* Wrapper que não deve criar caixa própria — usado em linha de tabela e grid,
   para o filho herdar o contexto de layout do avô. Não existe no Bootstrap,
   que só cobre os valores de display do bloco d-*. */
.d-contents {
    display: contents;
}

/* Herda a cor do contexto, para link/ícone dentro de elemento já colorido. */
.text-inherit {
    color: inherit;
}

/*
 * Texto do <label> de formulário: trunca reservando os ~20px do asterisco de
 * campo obrigatório, que fica fora deste div. Ver components/form/input.blade.php.
 */
.form-label-truncate {
    max-width: calc(100% - 20px);
}

/*
 * Sangra a linha até a borda do card, cancelando o padding do .card-body.
 * O -1px/-2px extra cobre a borda do próprio card, senão sobra um filete.
 */
.row-bleed-card {
    margin-right: calc(-1.5rem + -1px);
    margin-left: calc(-1.5rem + -2px);
}

/*
 * Par vertical do .row-bleed-card, para o sparkline encostar na base do card:
 * cancela o padding inferior do .card-body (py-2 = .75rem) e o -1px extra cobre
 * o 1px que o ApexCharts reserva abaixo da grid no modo sparkline. Substitui o
 * .mb-n2 do Bootstrap, que só cancela o padding e deixa esse filete branco.
 */
.chart-bleed-card-bottom {
    margin-bottom: calc(-0.75rem + -1px);
}

/* Ocupa a altura do card descontando a margem inferior dele (mb-3 = 1.5rem). */
.h-card-fill {
    height: calc(100% - 1.5rem);
}

/* Centraliza na vertical encostando na borda direita do pai .position-relative. */
.position-center-end {
    right: 0;
    top: 50%;
    transform: translateY(-50%);
}

/* Rolagem só no eixo vertical — o Bootstrap só tem .overflow-auto (ambos eixos). */
.overflow-y-auto {
    overflow-y: auto;
}

/* Trunca com reticências (complementa .text-truncate quando só isso é desejado). */
.text-ellipsis {
    text-overflow: ellipsis;
}

/* Preserva quebras de linha do texto vindo do banco. */
.text-pre-wrap {
    white-space: pre-wrap;
}
