portal_publico/static/css/dashboard-contabil.css

1388 lines
34 KiB
CSS

/* .dc-* — só usado em dashboard-contabil.html. Reaproveita perfis-acesso.css
(.pa-table/.pa-tabs/.pa-table-wrap) e components.css (.modal-* / .btn-*),
mesmo padrão de importacao-plano-saude.css/indicador-desempenho.css. */
.dc-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-4);
margin-bottom: var(--space-5);
flex-wrap: wrap;
}
.dc-header h2 {
font-size: 1.05rem;
font-weight: 700;
}
/* flex-basis:auto (o padrão) mede o bloco de título+subtítulo pela largura
que o parágrafo teria numa única linha só, bem maior que o espaço
realmente disponível — o flex-wrap decide quebrar linha com base nessa
largura "hipotética" de conteúdo, não na largura já quebrada em várias
linhas, então o botão era empurrado pra uma linha própria mesmo sobrando
espaço na tela. flex-basis:0% (via "flex: 1 1 0%") tira o conteúdo dessa
conta: o bloco passa a ocupar só o espaço que sobra depois do botão. */
.dc-header > *:first-child {
min-width: 0;
flex: 1 1 0%;
}
/* flex-shrink:0 mantém o botão/ações no tamanho natural (nunca é ele que
cede espaço); margin-left:auto é só uma rede de segurança pro caso raro
de a tela ser estreita demais mesmo assim e a linha quebrar de verdade —
sem isso, um item sozinho numa linha própria fica alinhado à esquerda
mesmo com justify-content:space-between (não sobra outro item pra
"espaçar" contra). */
.dc-header > *:last-child {
flex-shrink: 0;
margin-left: auto;
}
.dc-header-actions {
display: flex;
gap: var(--space-3);
flex-wrap: wrap;
}
.dc-subtitle {
font-size: 0.85rem;
color: var(--text-muted);
margin-top: 2px;
max-width: 70ch;
}
.dc-review-empresa {
font-weight: 400;
color: var(--text-muted);
font-size: 0.9rem;
}
.dc-empty {
text-align: center;
color: var(--text-muted);
font-size: 0.9rem;
padding: var(--space-6);
border: 1px dashed var(--border-subtle);
border-radius: var(--radius-md);
}
.dc-concluida-aviso {
font-size: 0.85rem;
color: var(--gold);
background: rgba(var(--gold-rgb), 0.12);
border: 1px solid rgba(var(--gold-rgb), 0.3);
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-4);
margin-bottom: var(--space-4);
}
.dc-form {
max-width: 560px;
}
/* .modal-actions (components.css) nasce alinhado à direita, pensado pro
rodapé de um modal estreito — aqui "Nova Análise" é a própria página, não
um modal, e os botões devem ficar junto do campo de arquivo acima deles,
à esquerda, não soltos do outro lado da página. */
.dc-form .modal-actions {
justify-content: flex-start;
}
.dc-file-field {
position: relative;
display: flex;
align-items: center;
gap: var(--space-3);
flex-wrap: wrap;
}
.dc-file-field__btn {
display: inline-flex;
align-items: center;
gap: var(--space-2);
cursor: pointer;
flex-shrink: 0;
}
.dc-file-field__input {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
.dc-file-field__input:focus-visible + .dc-file-field__name {
outline: 2px solid var(--accent);
outline-offset: 2px;
border-radius: var(--radius-sm);
}
.dc-file-field__name {
font-size: 0.85rem;
color: var(--text-muted);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
max-width: 320px;
}
.dc-file-field__remove {
flex-shrink: 0;
}
/* Achados */
/* Resumo do topo da aba Observações — donut por severidade (SVG puro, sem
Chart.js/dependência nova nesta tela interativa, diferente do relatório
estático "Gerar Dashboard" que já usa Chart.js via CDN) + um card por
categoria/regra de auditoria com a lista de contas/linhas apontadas, ou
"Nenhum apontamento encontrado" quando a regra não gerou achado nesta
apuração. Donut e cards são clicáveis e filtram a lista detalhada logo
abaixo (ver renderAchadosResumo/pidDcSelecionarSeveridade em
dashboard-contabil.js). Inspirado numa tela de auditoria de outro sistema
que o usuário trouxe como referência visual. */
.dc-achados-resumo {
display: flex;
gap: var(--space-5);
flex-wrap: wrap;
margin-bottom: var(--space-5);
padding-bottom: var(--space-5);
border-bottom: 1px solid var(--border-subtle);
}
.dc-achados-resumo__chart {
display: flex;
align-items: center;
gap: var(--space-4);
flex-shrink: 0;
}
.dc-donut {
position: relative;
width: 150px;
height: 150px;
flex-shrink: 0;
}
/* Técnica de donut com pathLength="100" — cada segmento é um <circle> com
stroke-dasharray "pct (100-pct)" e stroke-dashoffset acumulado, contado a
partir de 25 (um quarto de volta) pra começar às 12h em vez de às 3h.
pointer-events do SVG só considera pixel realmente pintado (stroke), então
cada segmento é clicável só na própria fatia, sem precisar de hit-test
manual por ângulo. */
.dc-donut-svg {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
}
.dc-donut-svg__bg {
fill: none;
stroke: var(--bg-surface-raised);
stroke-width: 4;
}
.dc-donut-svg__seg {
fill: none;
stroke-width: 4;
cursor: pointer;
transition: stroke-width var(--transition-fast);
}
.dc-donut-svg__seg:hover,
.dc-donut-svg__seg.is-active {
stroke-width: 5.5;
}
.dc-donut__hole {
position: absolute;
inset: 20%;
border-radius: 50%;
background: var(--bg-surface);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.dc-donut__total {
font-size: 1.4rem;
font-weight: 700;
}
.dc-donut__label {
font-size: 0.68rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.02em;
}
.dc-donut-legend {
display: flex;
flex-direction: column;
gap: var(--space-2);
font-size: 0.78rem;
color: var(--text-secondary);
}
.dc-donut-legend__item {
display: flex;
align-items: center;
gap: var(--space-2);
cursor: pointer;
padding: 2px var(--space-2);
margin: 0 calc(-1 * var(--space-2));
border-radius: var(--radius-sm);
transition: background var(--transition-fast), color var(--transition-fast);
}
.dc-donut-legend__item:hover {
background: var(--bg-surface-raised);
}
.dc-donut-legend__item.is-active {
color: var(--text-primary);
font-weight: 700;
}
.dc-donut-legend__dot {
width: 9px;
height: 9px;
border-radius: 50%;
flex-shrink: 0;
}
.dc-achados-categorias {
flex: 1 1 640px;
min-width: 0;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
gap: var(--space-3);
align-content: start;
}
.dc-categoria-card {
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-4);
background: var(--bg-surface);
}
.dc-categoria-card__header {
display: flex;
align-items: center;
gap: var(--space-2);
}
.dc-categoria-card__dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
background: var(--dc-categoria-cor);
}
.dc-categoria-card__titulo {
flex: 1 1 auto;
min-width: 0;
font-size: 0.82rem;
font-weight: 600;
}
.dc-categoria-card__contagem {
flex-shrink: 0;
min-width: 20px;
text-align: center;
padding: 1px var(--space-2);
border-radius: var(--radius-pill);
background: var(--bg-surface-raised);
color: var(--text-secondary);
font-size: 0.72rem;
font-weight: 700;
}
/* Uma linha por regra dentro do card do grupo — substitui a antiga tabela
por conta (uma linha por achado com badge de status), que era a maior
fonte de poluição visual com 10 cards soltos. Detalhe por conta/status
continua disponível na lista abaixo, ao clicar numa regra. */
.dc-categoria-card__regras {
display: flex;
flex-direction: column;
margin-top: var(--space-2);
}
.dc-categoria-card__regra {
display: flex;
align-items: center;
gap: var(--space-2);
padding: var(--space-1) 0;
border-top: 1px solid var(--border-subtle);
font-size: 0.78rem;
color: var(--text-secondary);
}
.dc-categoria-card__regra:first-child {
border-top: none;
}
.dc-categoria-card__regra--vazia {
color: var(--text-muted);
}
.dc-categoria-card__regra--clicavel {
cursor: pointer;
transition: color var(--transition-fast);
}
.dc-categoria-card__regra--clicavel:hover {
color: var(--text-primary);
}
.dc-categoria-card__regra--clicavel.is-active {
color: var(--text-primary);
font-weight: 700;
}
.dc-categoria-card__regra-label {
flex: 1 1 auto;
min-width: 0;
}
.dc-categoria-card__regra-contagem {
flex-shrink: 0;
min-width: 16px;
text-align: right;
font-weight: 700;
}
.dc-categoria-card__regra--vazia .dc-categoria-card__regra-contagem {
font-weight: 400;
}
.dc-achados-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
gap: var(--space-4);
flex-wrap: wrap;
margin-bottom: var(--space-4);
}
/* Aparece só quando um card de categoria está ativo (filtroRegra != null,
ver renderAchados) — os chips de severidade/status já têm seu próprio
estado visual (.is-active), mas o filtro por categoria não tem um chip
equivalente, então esta faixa avisa qual categoria está isolada e oferece
uma forma explícita de limpar (além de clicar de novo no mesmo card). */
.dc-regra-filtro-ativo {
display: flex;
align-items: center;
gap: var(--space-3);
font-size: 0.82rem;
color: var(--text-secondary);
background: var(--bg-surface-raised);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-2) var(--space-4);
margin-bottom: var(--space-4);
}
.dc-regra-filtro-limpar {
margin-left: auto;
background: none;
border: none;
color: var(--accent);
font-size: 0.82rem;
cursor: pointer;
padding: 0;
}
.dc-regra-filtro-limpar:hover {
text-decoration: underline;
}
.dc-chip-row {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
.dc-chip {
padding: var(--space-2) var(--space-4);
border-radius: var(--radius-pill);
border: 1px solid var(--border-subtle);
font-size: 0.8rem;
font-weight: 600;
color: var(--text-secondary);
background: var(--bg-surface);
transition: border-color var(--transition-fast), color var(--transition-fast), background var(--transition-fast);
}
.dc-chip:hover {
border-color: var(--accent);
}
.dc-chip.is-active {
background: var(--accent);
border-color: var(--accent);
color: var(--accent-contrast);
}
.dc-achados-list {
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.dc-achado-card {
border: 1px solid var(--border-subtle);
border-left-width: 4px;
border-radius: var(--radius-md);
padding: var(--space-4);
background: var(--bg-surface);
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: var(--space-4);
flex-wrap: wrap;
}
.dc-achado-card--alta {
border-left-color: var(--danger);
}
.dc-achado-card--media {
border-left-color: var(--gold);
}
.dc-achado-card--baixa {
border-left-color: var(--text-muted);
}
.dc-achado-card__main {
flex: 1 1 320px;
min-width: 0;
}
.dc-achado-card__titulo {
font-weight: 600;
font-size: 0.92rem;
display: flex;
align-items: center;
gap: var(--space-2);
flex-wrap: wrap;
}
.dc-achado-card__mensagem {
font-size: 0.85rem;
color: var(--text-secondary);
margin-top: var(--space-2);
}
.dc-achado-card__observacao {
font-size: 0.8rem;
color: var(--text-muted);
margin-top: var(--space-2);
font-style: italic;
}
.dc-achado-card__actions {
display: flex;
gap: var(--space-2);
flex-shrink: 0;
flex-wrap: wrap;
}
/* Expande/recolhe a conta usada no apontamento (achado.conta) — só
presente em achados vinculados a uma conta específica; regras gerais
(ex. balanceamento Ativo x Passivo) não têm esse toggle. */
.dc-achado-card__toggle-conta {
display: inline-flex;
align-items: center;
gap: var(--space-1);
margin-top: var(--space-2);
padding: 0;
background: none;
border: none;
color: var(--accent);
font-size: 0.78rem;
cursor: pointer;
}
.dc-achado-card__toggle-conta:hover {
text-decoration: underline;
}
.dc-achado-card__toggle-conta svg {
transition: transform var(--transition-fast);
}
.dc-achado-card__toggle-conta.is-expanded svg {
transform: rotate(90deg);
}
.dc-achado-card__conta {
margin: var(--space-2) 0 0;
padding: var(--space-3);
background: var(--bg-surface-raised);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
display: grid;
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
gap: var(--space-2) var(--space-4);
}
.dc-achado-card__conta dt {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.02em;
}
.dc-achado-card__conta dd {
margin: 2px 0 0;
font-size: 0.85rem;
font-variant-numeric: tabular-nums;
}
/* Tabelas de Balancete/DRE — reaproveitam .pa-table, só ajustes de alinhamento
numérico e da célula de observação (que embute um botão). */
.dc-contas-table td:nth-child(n + 3):nth-child(-n + 6),
.dc-dre-table td:nth-child(2) {
text-align: right;
font-variant-numeric: tabular-nums;
}
/* Análise Vertical tem um número variável de colunas de Valor/Variação (uma
dupla por mês, ver ContabilApuracao.analise_vertical_meses) — diferente
da DRE (sempre uma única coluna de valor, `td:nth-child(2)` acima), então
alinha à direita toda coluna que não seja a 1ª (descrição) nem a última
(observação), em vez de fixar um índice. */
.dc-av-table td:not(:first-child):not(:last-child) {
text-align: right;
font-variant-numeric: tabular-nums;
}
.dc-contas-table td:nth-child(1) {
white-space: nowrap;
color: var(--text-muted);
font-size: 0.82rem;
}
/* Linha sintética (grupo do plano de contas, ex. "1.01 CIRCULANTE") — só
negrito pra se destacar das analíticas que ela agrupa, mesmo padrão visual
do PDF original (coluna "S/A"); sem fundo elevado, pra manter a tabela com
uma cor de fundo única (mesmo visual já usado na DRE, que só usa negrito
pra linha totalizadora — pedido explícito do usuário pra unificar). */
.dc-conta-row--sintetica {
font-weight: 600;
}
/* Destaque temporário nas contas recém-reveladas ao expandir um grupo —
pedido explícito do usuário: ao expandir uma conta, as contas que aparecem
embaixo dela ganham esse realce; ao expandir uma delas em seguida, o
realce se move pros filhos dela e as linhas destacadas antes voltam à cor
padrão (dcContasDestaque/dcDreDestaque em dashboard-contabil.js sempre
representam só a última leva revelada, nunca acumulam). `.pa-table td` já
tem `transition: background`, então a troca de destaque anima sozinha.
Cor por tema via as duas variáveis abaixo, não hardcoded na regra, pra dar
pra inverter o efeito no tema claro sem duplicar a regra em si. No escuro,
o destaque usa `--bg-canvas` (o tom mais escuro do tema — pedido explícito
do usuário depois de ver `--card-bg-hover`, mais claro, nas linhas
destacadas: queria o oposto, destaque mais escuro e o resto mais claro) e
as linhas fora do destaque usam `--bg-surface-raised` (mais claro que
`--bg-canvas`/`--bg-surface`, mas ainda distinto de `--card-bg-hover` —
senão o hover das linhas não-destacadas ficaria idêntico ao repouso, sem
nenhum feedback visual). No claro, o efeito já nasceu invertido por pedido
anterior do usuário — as linhas fora do destaque é que ganham a cor
(`--accent-rgb` bem sutil), e a leva recém-revelada fica em branco
(`--bg-surface`), lida como "limpa" em vez de tingida; não mexido nesta
rodada, só o tema escuro pediu a troca. */
:root {
--dc-destaque-bg: var(--bg-canvas);
--dc-row-tint-bg: var(--bg-surface-raised);
}
:root[data-theme="light"] {
--dc-destaque-bg: var(--bg-surface);
--dc-row-tint-bg: rgba(var(--accent-rgb), 0.08);
}
.dc-contas-table tbody tr td,
.dc-dre-table tbody tr td {
background-color: var(--dc-row-tint-bg);
}
/* Especificidade proposital mais alta que a regra acima (duas classes, não
uma) — senão a regra de tingimento genérico, com mais seletores de tipo
(tbody+tr+td), venceria por especificidade e o destaque nunca apareceria. */
.dc-contas-table .dc-conta-row--destaque td,
.dc-dre-table .dc-conta-row--destaque td {
background-color: var(--dc-destaque-bg);
}
.dc-conta-desc-cell {
display: flex;
align-items: center;
gap: var(--space-2);
}
/* Recolhe/expande os filhos de uma conta sintética (árvore construída a
partir do nível de indentação, ver dcContaNivel em dashboard-contabil.js)
— mesmo espírito de uma matriz do Power BI, pedido explícito do usuário
pra facilitar a conferência de um balancete com muitas contas. Reaproveitado
também pela árvore da DRE (renderDre), sobre ContabilLinhaDre.nivel. */
.dc-conta-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
width: 18px;
height: 18px;
flex-shrink: 0;
border-radius: var(--radius-sm);
color: var(--text-muted);
background: none;
border: none;
cursor: pointer;
transition: transform var(--transition-fast), background var(--transition-fast), color var(--transition-fast);
}
.dc-conta-toggle:hover {
color: var(--text-primary);
background: var(--bg-surface-raised);
}
.dc-conta-toggle.is-expanded svg {
transform: rotate(90deg);
}
.dc-conta-toggle svg {
transition: transform var(--transition-fast);
}
.dc-conta-toggle-spacer {
display: inline-block;
width: 18px;
height: 18px;
flex-shrink: 0;
}
/* Botão de observação — sempre o mesmo ícone (pedido explícito do usuário:
nem "+ Observação" nem o texto da observação em si devem aparecer na
tabela, poluía a coluna visualmente); só a cor muda pra indicar de
relance quais linhas já têm observação preenchida (`title`/tooltip
mostra o texto quando houver). Mesmo padrão dos outros ícones de tabela
(`.icon-btn`, `perfis-acesso.css`), mas menor, pra caber numa célula sem
aumentar a altura da linha. */
.dc-conta-observacao-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
border-radius: 50%;
color: var(--text-muted);
background: none;
border: none;
cursor: pointer;
padding: 0;
}
.dc-conta-observacao-btn:hover {
background: var(--card-bg-hover);
color: var(--accent);
}
.dc-conta-observacao-btn--preenchida {
color: var(--accent);
}
/* Coluna "Observação" agora tem 2 botões lado a lado (validado + observação)
— pedido explícito do usuário. Este `display:flex` fica num `<div>` *dentro*
do `<td>`, nunca no próprio `<td>` — um `<td>` com `display:flex` deixa de
se comportar como célula de tabela (altura/fundo/borda não acompanham mais
a linha direito), o que já causou um bug visual real (linha "quebrando"
antes de chegar nos botões, ver `renderContas()`/`renderDre()`). */
.dc-obs-cell-actions {
display: flex;
align-items: center;
gap: var(--space-1);
}
/* Botão de "validado" (check) — cor fixa `--teal`, deliberadamente diferente
de `--accent` (usado em `.dc-conta-observacao-btn--preenchida` e também a
cor de tema que o usuário escolhe em "Tema de cores", ver tokens.css), pra
não confundir "tem observação preenchida" com "conta já conferida". */
.dc-conta-validado-btn {
display: inline-flex;
align-items: center;
justify-content: center;
width: 26px;
height: 26px;
border-radius: 50%;
color: var(--text-muted);
background: none;
border: none;
cursor: pointer;
padding: 0;
}
.dc-conta-validado-btn:hover {
background: var(--card-bg-hover);
color: var(--teal);
}
.dc-conta-validado-btn--validado {
color: var(--teal);
}
/* Estado "parcial" do tri-state de uma conta/linha sintética (com filhos) —
pedido explícito do usuário: amarelo enquanto nem todo descendente estiver
validado, mesmo depois de marcar a própria sintética. Vira
`--validado` (verde/teal) assim que 100% dos descendentes estiverem
validados — ver dcEstadoValidacaoGrupo()/dcValidadoInfo() em
dashboard-contabil.js. */
.dc-conta-validado-btn--parcial {
color: var(--gold);
}
.dc-conta-validado-btn:disabled {
cursor: default;
opacity: 0.5;
}
/* Editor inline de observação — substitui o antigo modal `#dc-observacao-modal`
(pedido explícito do usuário, pra não perder o texto por causa de um
clique acidental fora de um popup): uma linha extra logo abaixo da conta/
linha, dentro da própria tabela. Fundo distinto do tingimento padrão das
linhas (ver `--dc-row-tint-bg`/`--dc-destaque-bg` acima) — 2 classes,
maior especificidade que a regra genérica de 1 classe + 3 seletores de
tipo, então não precisa se preocupar com a ordem de declaração. */
.dc-contas-table .dc-obs-edit-row td,
.dc-dre-table .dc-obs-edit-row td {
background-color: var(--bg-surface);
}
.dc-obs-edit-row td {
padding: var(--space-4);
}
.dc-obs-edit {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.dc-obs-edit .modal-field {
margin: 0;
}
.dc-obs-edit .modal-actions {
margin-top: 0;
}
/* Resumo de observações no final do Balancete/DRE (pedido explícito do
usuário) — reaproveita `.dc-dash-obs-list`/`.dc-dash-obs*` (já definidas
mais abaixo) pros itens da lista, só a moldura da seção é nova. */
.dc-obs-resumo {
margin-top: var(--space-5);
padding-top: var(--space-5);
border-top: 1px solid var(--border-subtle);
}
.dc-obs-resumo__titulo {
display: flex;
align-items: center;
gap: var(--space-2);
font-size: 0.95rem;
margin: 0 0 var(--space-3);
}
.dc-obs-resumo__count {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 22px;
height: 22px;
padding: 0 var(--space-2);
border-radius: var(--radius-pill);
background: rgba(var(--accent-rgb), 0.14);
color: var(--accent);
font-size: 0.75rem;
font-weight: 700;
}
.dc-dre-row--totalizador td {
font-weight: 700;
}
.dc-dre-row td:first-child {
white-space: nowrap;
}
/* Selos de severidade/status do achado — pequenos o bastante pra ficar ao
lado do título do card, sem depender de .status-pill (definida em
nao-conformidades.css, não carregado nesta página). */
.dc-badge {
display: inline-flex;
align-items: center;
padding: 2px var(--space-3);
border-radius: var(--radius-pill);
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
}
.dc-badge--alta {
color: var(--danger);
background: rgba(var(--danger-rgb), 0.14);
}
.dc-badge--media {
color: var(--gold);
background: rgba(var(--gold-rgb), 0.18);
}
.dc-badge--baixa {
color: var(--text-muted);
background: var(--bg-surface-raised);
}
.dc-badge--tratado {
color: #2f9e6e;
background: rgba(47, 158, 110, 0.14);
}
.dc-badge--ignorado {
color: var(--text-muted);
background: var(--bg-surface-raised);
}
.dc-badge--pendente {
color: var(--accent);
background: rgba(var(--accent-rgb), 0.14);
}
/* ---- Aba "Dashboard" (pré-visualização do relatório "Gerar Dashboard") ---- */
.dc-dash-intro {
font-size: 0.85rem;
color: var(--text-muted);
max-width: 80ch;
margin-bottom: var(--space-5);
}
.dc-dash-section {
margin-bottom: var(--space-6);
}
.dc-dash-section__header {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
flex-wrap: wrap;
margin-bottom: var(--space-1);
}
.dc-dash-section__titulo {
font-size: 0.95rem;
font-weight: 700;
margin-bottom: var(--space-3);
}
.dc-dash-section__header .dc-dash-section__titulo {
margin-bottom: 0;
}
.dc-dash-section__dica {
font-size: 0.78rem;
color: var(--text-muted);
margin-bottom: var(--space-3);
}
/* Resumo do Fechamento — editor de texto rico (mesmo padrão de
.ag-richtext em acessos-gerais.css/.ajuda-modal__editor em
components.css: contenteditable + colar/arrastar imagem, ver
pidDcInicializaResumoFechamentoEditor() em dashboard-contabil.js).
Duplicado por tela de propósito, mesmo espírito dos outros dois — não é
um componente compartilhado no projeto. */
.dc-dash-resumo-fechamento {
margin-bottom: var(--space-5);
padding-bottom: var(--space-4);
border-bottom: 1px solid var(--border-subtle);
}
.dc-dash-resumo-fechamento__titulo {
font-size: 0.85rem;
font-weight: 700;
margin: 0 0 var(--space-1);
}
.dc-dash-resumo-fechamento__dica {
font-size: 0.78rem;
color: var(--text-muted);
margin: 0 0 var(--space-2);
}
.dc-dash-richtext {
min-height: 120px;
max-height: 340px;
overflow-y: auto;
padding: var(--space-3);
border-radius: var(--radius-sm);
border: 1px solid var(--border-subtle);
background: var(--bg-canvas);
color: var(--text-primary);
font-size: 0.88rem;
line-height: 1.5;
}
.dc-dash-richtext:focus {
outline: none;
border-color: var(--accent);
}
.dc-dash-richtext:empty::before {
content: attr(data-placeholder);
color: var(--text-muted);
}
.dc-dash-richtext img {
max-width: 100%;
border-radius: var(--radius-sm);
margin: var(--space-2) 0;
}
.dc-dash-richtext[contenteditable="false"] {
cursor: default;
opacity: 0.85;
}
.dc-dash-resumo-fechamento__acoes {
display: flex;
align-items: center;
gap: var(--space-3);
margin-top: var(--space-2);
}
.dc-dash-resumo-fechamento__status {
font-size: 0.78rem;
color: var(--text-muted);
}
.dc-dash-grupo {
margin-bottom: var(--space-4);
}
.dc-dash-grupo__titulo {
font-size: 0.78rem;
font-weight: 600;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.03em;
margin-bottom: var(--space-2);
}
.dc-dash-cards-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
gap: var(--space-3);
}
.dc-dash-card {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-2);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-3);
background: var(--bg-surface);
cursor: pointer;
transition: opacity var(--transition-fast), border-color var(--transition-fast);
}
.dc-dash-card:hover {
border-color: var(--accent);
}
.dc-dash-card.is-oculto {
opacity: 0.5;
}
.dc-dash-card__info {
display: flex;
flex-direction: column;
gap: 2px;
min-width: 0;
}
.dc-dash-card__actions {
display: flex;
align-items: center;
gap: 2px;
flex-shrink: 0;
}
.dc-dash-card__label {
font-size: 0.7rem;
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.02em;
}
.dc-dash-card__valor {
font-size: 1rem;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
.dc-dash-obs-list {
display: flex;
flex-direction: column;
gap: var(--space-2);
}
.dc-dash-obs {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--space-3);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-4);
background: var(--bg-surface);
transition: opacity var(--transition-fast);
}
.dc-dash-obs.is-oculto {
opacity: 0.5;
}
.dc-dash-obs__info {
min-width: 0;
}
.dc-dash-obs__origem {
display: inline-block;
font-size: 0.68rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
color: var(--accent);
margin-right: var(--space-2);
}
.dc-dash-obs__referencia {
font-size: 0.82rem;
font-weight: 600;
}
.dc-dash-obs__texto {
margin-top: var(--space-1);
font-size: 0.82rem;
color: var(--text-secondary);
white-space: pre-wrap;
}
.dc-dash-toggle-btn {
flex-shrink: 0;
width: 34px;
height: 34px;
}
.dc-dash-toggle-btn:disabled {
opacity: 0.4;
cursor: default;
}
/* Modal "Ver fórmula" (#dc-indicador-formula-modal) */
.dc-ind-formula-box {
margin-top: var(--space-2);
padding: var(--space-3) var(--space-4);
border-radius: var(--radius-md);
background: var(--bg-canvas);
border: 1px solid var(--border-subtle);
}
.dc-ind-formula-box__label {
display: block;
font-size: 0.7rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.03em;
color: var(--text-muted);
margin-bottom: var(--space-1);
}
.dc-ind-formula-box p {
font-size: 0.88rem;
font-family: "DM Mono", monospace;
color: var(--text-primary);
}
/* Modal "Novo/Editar Indicador" (#dc-indicador-modal) — construtor de
componentes: cada .dc-ind-componente é um termo da fórmula (chave + tipo
+ o "picker" certo pro tipo, ver pidDcRenderComponentePicker em
dashboard-contabil.js), reaproveitando .checklist-box/.checklist-item/
.checklist-search de components.css pros pickers de conta/linha da DRE. */
.dc-ind-componentes-header {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--space-3);
margin-top: var(--space-4);
margin-bottom: var(--space-2);
font-size: 0.85rem;
font-weight: 600;
}
.dc-ind-componente {
border: 1px solid var(--border-subtle);
border-radius: var(--radius-md);
padding: var(--space-3);
background: var(--bg-canvas);
margin-bottom: var(--space-3);
}
/* Não reaproveita .modal-field-row (grid de exatamente 2 colunas,
components.css) porque esta linha tem um 3º elemento (o botão de
remover) que precisa ficar ao lado dos dois campos, não quebrar pra uma
"3ª coluna" inexistente. */
.dc-ind-componente__linha {
display: flex;
align-items: flex-end;
gap: var(--space-3);
}
.dc-ind-componente__linha .modal-field {
flex: 1;
min-width: 0;
}
.dc-ind-comp-chave,
.dc-ind-comp-tipo,
.dc-ind-comp-indicador {
width: 100%;
padding: var(--space-2) var(--space-3);
border-radius: var(--radius-sm);
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
color: var(--text-primary);
font-size: 0.85rem;
}
.dc-ind-comp-remover {
flex-shrink: 0;
margin-bottom: 2px;
}
.dc-ind-comp-picker {
margin-top: var(--space-2);
}
/* Único scroll de verdade dentro do construtor de componentes — o
checklist de contas/linhas da DRE em si (até ~150 itens). Antes havia
TAMBÉM um scroll na lista de componentes por fora (.dc-ind-componentes-lista,
320px) — dois scrolls aninhados deixavam a área útil minúscula, a ponto
de nem um componente inteiro caber sem rolar duas vezes (relatado pelo
usuário). Removido o scroll externo: agora só o modal inteiro rola
(`.modal-card` já tem `max-height`/`overflow-y`, ver components.css), e
este checklist, bem maior que antes, é o único scroll aninhado que
sobra — genuinamente necessário, já que uma apuração real tem ~100-150
contas/linhas. */
.dc-ind-comp-picker .checklist-box {
max-height: 260px;
}
.dc-ind-formula-hint {
font-size: 0.76rem;
color: var(--text-muted);
margin-top: var(--space-1);
}
/* Seletor de ícone do indicador (modal "Novo/Editar Indicador") — cada
botão já é o próprio preview (mesmo ícone que aparece no card do
relatório "Gerar Dashboard", ver dashboard-contabil-relatorio.html);
`.is-selecionado` é a única indicação de estado, sem nenhum input
escondido visível — o valor real fica em memória (dcIndicadorIconeSelecionado
em dashboard-contabil.js) até o Salvar. */
.dc-ind-icone-grid {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
.dc-ind-icone-btn {
display: flex;
align-items: center;
justify-content: center;
width: 40px;
height: 40px;
border-radius: var(--radius-md);
border: 1px solid var(--border-subtle);
background: var(--bg-surface);
color: var(--text-muted);
cursor: pointer;
transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
}
.dc-ind-icone-btn:hover {
background: var(--card-bg-hover);
color: var(--text-primary);
}
.dc-ind-icone-btn.is-selecionado {
background: rgba(var(--accent-rgb), 0.16);
border-color: var(--accent);
color: var(--accent);
}
.dc-ind-componentes-lista {
margin-bottom: var(--space-2);
}
/* Resultado de "Calcular com esta apuração" (#dc-indicador-calcular-btn) —
mostra o valor resolvido de cada componente + o resultado final da
fórmula, contra a apuração aberta agora, sem salvar nada. Pedido
explícito do usuário: conferir se a fórmula pegou a conta certa antes
de confirmar. */
.dc-ind-preview {
margin-top: var(--space-3);
padding: var(--space-3) var(--space-4);
border-radius: var(--radius-md);
background: var(--bg-canvas);
border: 1px solid var(--border-subtle);
}
.dc-ind-preview__lista {
display: flex;
flex-direction: column;
gap: var(--space-1);
font-size: 0.85rem;
font-family: "DM Mono", monospace;
}
.dc-ind-preview__lista li {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: var(--space-3);
padding: var(--space-1) 0;
border-bottom: 1px solid var(--border-subtle);
}
.dc-ind-preview__lista li:last-child {
border-bottom: none;
}
.dc-ind-preview__lista li span:first-child {
color: var(--text-muted);
}
.dc-ind-preview__lista li span:last-child {
font-weight: 600;
color: var(--text-primary);
}
.dc-ind-preview__resultado {
margin-top: var(--space-2);
padding-top: var(--space-2);
border-top: 1px solid var(--border-subtle);
font-size: 0.9rem;
}
.dc-ind-preview__resultado strong {
color: var(--accent);
}
.dc-ind-preview__erro {
font-size: 0.85rem;
color: var(--danger);
}
.dc-ind-preview__carregando {
font-size: 0.85rem;
color: var(--text-muted);
}
/* Modal "Gerenciar Indicadores" (#dc-indicadores-hub-modal) — lista todo
indicador personalizado (padrão e não padrão), pra visualizar/editar
mesmo os que não estão ativos nesta apuração agora (ver
pidDcRenderHubIndicadores em dashboard-contabil.js). */
.dc-ind-hub-secao {
margin-bottom: var(--space-4);
}
.dc-ind-hub-secao__titulo {
font-size: 0.85rem;
font-weight: 700;
margin-bottom: var(--space-2);
}
.dc-ind-hub-lista {
display: flex;
flex-direction: column;
gap: var(--space-2);
max-height: 240px;
overflow-y: auto;
}
.dc-ind-hub-item {
display: flex;
align-items: center;
gap: var(--space-3);
padding: var(--space-2) var(--space-3);
border: 1px solid var(--border-subtle);
border-radius: var(--radius-sm);
background: var(--bg-canvas);
}
.dc-ind-hub-item__ativo {
width: 16px;
height: 16px;
flex-shrink: 0;
accent-color: var(--accent);
}
.dc-ind-hub-item__spacer {
width: 16px;
flex-shrink: 0;
}
/* Reset de <button> pra parecer texto clicável — abre "Ver fórmula" (ver
data-dc-hub-ver em dashboard-contabil.js). */
.dc-ind-hub-item__nome {
flex: 1;
min-width: 0;
text-align: left;
background: none;
border: none;
padding: 0;
font-size: 0.85rem;
color: var(--text-primary);
cursor: pointer;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dc-ind-hub-item__nome:hover {
color: var(--accent);
text-decoration: underline;
}