/*
 * Identidade visual baseada no site de referencia do NPI/Inovajurr
 * (https://npi.tjrr.jus.br/4premio/). --cor-primaria-inicio/--cor-primaria-fim
 * sao definidas em tempo de execucao pelo layout.php (vem de
 * configuracoes_visuais, editavel pelo Admin) - os valores abaixo sao so o
 * fallback caso a variavel nao chegue a ser injetada.
 * Aplica-se as paginas publicas (site-page) e, num bloco proprio abaixo,
 * ao painel administrativo (body.admin-page) - desktop-first, conforme
 * requisito nao-funcional (nao precisa ser responsivo, mas precisa ter
 * identidade visual).
 */

:root {
    --cor-primaria-inicio: #FF6600;
    --cor-primaria-fim: #FF9955;
    --cor-escura: #191919;
    --cor-branco: #fff;
    --cor-texto: #222;
    --cor-texto-suave: #444;
    --cor-borda: #e5e5e5;
    --cor-fundo-alt: #f7f7f7;
    --fonte-titulo: 'Poppins', -apple-system, 'Segoe UI', sans-serif;
    --fonte-corpo: 'Roboto', -apple-system, 'Segoe UI', sans-serif;
}

/* Reserva o espaco da barra de rolagem vertical sempre, mesmo em paginas
   curtas que nao precisam rolar - sem isso, o conteudo "pula" alguns
   pixels pra esquerda/direita toda vez que uma pagina passa a ter barra de
   rolagem e outra nao. Ao contrario de "overflow-y: scroll" (forca a barra
   a aparecer sempre, mesmo sem necessidade), scrollbar-gutter so reserva o
   espaco - a barra em si continua some/aparece conforme o conteudo precisa. */
html {
    scrollbar-gutter: stable;
    scroll-behavior: smooth;
}

/* ===================== Site publico ===================== */

.site-page {
    font-family: var(--fonte-corpo);
    color: var(--cor-texto);
    line-height: 1.5;
}

.site-page h1,
.site-page h2,
.site-page h3,
.site-page h4 {
    font-family: var(--fonte-titulo);
    font-weight: 700;
}

/* Cabecalho */
.site-header {
    background: var(--cor-branco);
    border-bottom: 1px solid var(--cor-borda);
    padding: 0.75rem 1rem;
    position: sticky;
    top: 0;
    z-index: 10;
}

.site-header-inner {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 0.75rem;
    max-width: 1100px;
    margin: 0 auto;
}

.site-logo {
    height: 44px;
}

.site-nav {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: 0.75rem 1rem;
    font-size: 0.9rem;
}

.site-nav a:not(.btn) {
    color: var(--cor-texto);
    text-decoration: none;
}

.site-nav a:not(.btn):hover {
    color: var(--cor-primaria-fim);
}

/* Fase 19 (#84): cabecalho com imagem de fundo propria (opcional, por
   concurso) - sem imagem cadastrada, .site-header-nav se comporta
   identico ao antigo .site-header-inner (sticky, solido, sempre). */
.site-header-nav {
    background: var(--cor-branco);
}

.site-header-com-imagem {
    padding: 0;
    border-bottom: none;
    position: relative;
    min-height: clamp(480px, 85vh, 760px);
    background-size: cover;
    /* Fase 19 (#84 v4): "center top" em vez de "center" - fotos de
       fachada/predio costumam ter a placa/letreiro na parte de cima;
       "center" (meio da imagem) cortava justamente essa parte quando a
       proporcao da foto nao bate com a altura do cabecalho. */
    background-position: center top;
    display: flex;
}

/* Fase 19 (#84 v4): tint translucido com a propria cor primaria do site
   (ja configuravel em Tema -> Cores) por cima da foto de fundo - mesmo
   efeito do site modelo. Confirmado direto no CSS real do site modelo
   (.bg-overlay::after): e' um radial-gradient (circle closest-side),
   nao um linear-gradient - e' o formato radial (mais claro/"brilho" no
   centro, mais escuro/solido nas bordas) que da a sensacao de "vida"
   que um degrade linear plano nao reproduz. */
.site-header-com-imagem::before {
    content: '';
    position: absolute;
    inset: 0;
    background: radial-gradient(circle closest-side, var(--cor-primaria-fim) 0%, var(--cor-primaria-inicio) 100%);
    opacity: var(--cabecalho-overlay-opacidade, 0.5);
}

.site-header-com-imagem .site-header-nav {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    z-index: 10;
    background: transparent;
    padding: 0.75rem 1rem;
}

/* Fase 20 (#116): .site-edicao-indicador NAO entra nessa lista - ele tem
   fundo proprio opaco (--cor-fundo-alt, claro) em qualquer estado do
   cabecalho, entao forcar o texto pra branco (pensado pros itens sem
   fundo, sobre a foto) deixava o badge com texto branco sobre fundo
   claro - ilegivel/"invertido". */
.site-header-com-imagem .site-header-nav .site-nav a:not(.btn),
.site-header-com-imagem .site-header-nav .site-menu-toggle,
.site-header-com-imagem .site-header-nav .site-header-icone {
    color: var(--cor-branco);
    border-color: rgba(255, 255, 255, 0.5);
}

.site-header-com-imagem .site-header-nav.site-header-nav-fixa {
    position: fixed;
    background: var(--cor-branco);
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.12);
}

.site-header-com-imagem .site-header-nav.site-header-nav-fixa .site-nav a:not(.btn),
.site-header-com-imagem .site-header-nav.site-header-nav-fixa .site-menu-toggle,
.site-header-com-imagem .site-header-nav.site-header-nav-fixa .site-header-icone {
    color: var(--cor-texto);
    border-color: var(--cor-borda);
}

.site-header-sentinela {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 1px;
    height: 1px;
}

/* Fase 19 (#84 v4): onda de transicao na base do cabecalho, igual ao
   site modelo (.shape.shape-bottom) - fecha visualmente a foto de fundo
   com uma curva branca em vez de um corte reto. Valores conferidos
   direto no CSS real do site modelo (nao presumidos): o wrapper gira
   180deg (a mesma curva do path serve tanto pro topo quanto pra base,
   so' invertida) e o svg e' bem maior que 100% da largura (228%,
   recentralizado) - sem isso a mesma curva fica "espremida" e parece
   ter mais ondulacoes do que realmente tem. */
.site-header-shape-bottom {
    position: absolute;
    bottom: -1px;
    left: 0;
    width: 100%;
    line-height: 0;
    overflow: hidden;
    z-index: 2;
    transform: rotate(180deg);
}

.site-header-shape-bottom svg {
    display: block;
    height: 275px;
    width: calc(228% + 1.3px);
    position: relative;
    left: 50%;
    transform: translateX(-50%);
}

.site-header-shape-bottom path {
    fill: var(--cor-branco);
}

/* Fase 19 (#84 v4): alternativas de transicao "diagonal" (a onda acima
   continua sendo a opcao "onda") - cunha branca sobreposta na base do
   cabecalho, sem recortar o header em si (clip-path no proprio header
   arriscaria cortar tambem a nav quando ela fica position:fixed). */
.site-header-shape-diagonal {
    position: absolute;
    bottom: -1px;
    left: 0;
    width: 100%;
    height: 90px;
    background: var(--cor-branco);
    z-index: 2;
}

.site-header-shape-diagonal-esquerda {
    clip-path: polygon(0 100%, 100% 40%, 100% 100%);
}

.site-header-shape-diagonal-direita {
    clip-path: polygon(0 40%, 100% 100%, 0 100%);
}

/* Fase 19 (#84 v3): conteudo livre do hero (titulo/slogan/imagens),
   inteiramente controlado pelo admin via editor rico - sem estrutura
   fixa de colunas/uploads dedicados. */
.site-header-hero-conteudo {
    position: relative;
    z-index: 1;
    width: 100%;
    max-width: 1100px;
    margin: 0 auto;
    padding: 6rem 1rem 3rem;
    align-self: center;
}

.site-header-hero-texto {
    color: var(--cor-branco);
}

/* Fase 20 (#115/#113): imagem inserida pelo admin no editor rico do
   titulo nao pode exceder a largura do container - sem max-width:100%,
   uma imagem colada no tamanho natural estoura a largura do
   .site-header-hero-conteudo (causa direta de overflow horizontal no
   mobile). Bonus sem campo novo: a mesma imagem ganha o efeito de
   "boiar" do site modelo. Isto e' so' o fallback estatico (todas na
   mesma duracao) - quem corrige o nome da animacao (pra imagens coladas
   do site modelo, que trazem inline um `animation: ...bounceHero`,
   keyframe que so' existe la') e dessincroniza a duracao de cada imagem
   e' assets/js/cabecalho-flutuar.js (nth-of-type nao funciona aqui
   porque cada imagem colada vem dentro do seu proprio <span> - e' sempre
   a unica do tipo dentro do seu proprio pai, entao nunca bate com
   nth-of-type(2), (3) etc). */
.site-header-hero-texto img {
    max-width: 100%;
    height: auto;
    animation: site-header-bounce 6s ease-in-out infinite;
}

@keyframes site-header-bounce {
    0%, 100% { transform: translateY(0); }
    50% { transform: translateY(20px); }
}

/* Fase 20 (#114): efeito de entrada configuravel do titulo/conteudo do
   cabecalho (Configuracoes -> Cabecalho), aplicado uma vez ao carregar
   a pagina - "both" mantem o estado final da animacao (nao volta pro
   "from" depois de terminar). */
.site-header-hero-entrada-fade {
    animation: site-header-entrada-fade 0.9s ease-out both;
}

.site-header-hero-entrada-subir {
    animation: site-header-entrada-subir 0.9s ease-out both;
}

.site-header-hero-entrada-zoom {
    animation: site-header-entrada-zoom 0.9s ease-out both;
}

@keyframes site-header-entrada-fade {
    from { opacity: 0; }
    to { opacity: 1; }
}

@keyframes site-header-entrada-subir {
    from { opacity: 0; transform: translateY(30px); }
    to { opacity: 1; transform: translateY(0); }
}

@keyframes site-header-entrada-zoom {
    from { opacity: 0; transform: scale(0.92); }
    to { opacity: 1; transform: scale(1); }
}

.site-logo-claro {
    display: none;
}

.site-header-com-imagem .site-header-nav .site-logo-solido {
    display: none;
}

.site-header-com-imagem .site-header-nav .site-logo-claro {
    display: block;
}

.site-header-com-imagem .site-header-nav.site-header-nav-fixa .site-logo-claro {
    display: none;
}

.site-header-com-imagem .site-header-nav.site-header-nav-fixa .site-logo-solido {
    display: block;
}

.site-header-icone {
    background: none;
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    padding: 0.35rem 0.5rem;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    color: var(--cor-texto);
}

/* Fase 19 (#86): painel lateral deslizante - hoje usado so' pelo cronograma
   (ver assets/js/painel-lateral.js), mas generico o bastante pra outros
   paineis reaproveitarem as mesmas classes. */
.site-painel-lateral {
    position: fixed;
    top: 0;
    right: 0;
    height: 100vh;
    width: min(420px, 90vw);
    background: var(--cor-branco);
    box-shadow: -4px 0 24px rgba(0, 0, 0, 0.18);
    transform: translateX(100%);
    transition: transform 0.3s ease;
    z-index: 40;
    overflow-y: auto;
    display: flex;
    flex-direction: column;
}

.site-painel-lateral.aberto {
    transform: translateX(0);
}

.site-painel-cabecalho {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 1rem 1.25rem;
    border-bottom: 1px solid var(--cor-borda);
}

.site-painel-cabecalho h2 {
    margin: 0;
    font-size: 1.2rem;
}

.site-painel-fechar {
    background: none;
    border: none;
    font-size: 1.5rem;
    line-height: 1;
    cursor: pointer;
    color: var(--cor-texto);
}

.site-painel-corpo {
    padding: 1rem 1.25rem;
}

.site-painel-item {
    padding-bottom: 1rem;
    margin-bottom: 1rem;
    border-bottom: 1px solid var(--cor-borda);
}

.site-painel-item:last-child {
    border-bottom: none;
}

.site-painel-backdrop {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.4);
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.3s ease;
    z-index: 39;
}

.site-painel-backdrop.aberto {
    opacity: 1;
    visibility: visible;
}

/* Botoes
 * Tecnica igual ao site de referencia: o botao nunca tem fundo solido direto.
 * ::before (2px maior, atras de tudo) pinta o degrade como um anel de borda;
 * ::after (do tamanho exato, na frente do anel mas atras do texto) pinta um
 * preenchimento por cima - por isso parece "so borda". No hover o ::after
 * some (opacity:0), revelando o degrade inteiro por baixo.
 * Desvio deliberado do original: texto em repouso usa a cor primaria (nao
 * um cinza fixo), a pedido do usuario.
 */
.btn {
    display: inline-block;
    position: relative;
    z-index: 1;
    padding: 0.65rem 1.5rem;
    border-radius: 999px;
    border: 2px solid transparent;
    box-sizing: border-box;
    outline: 0 none;
    text-decoration: none;
    font-weight: 600;
    font-size: 0.9rem;
    line-height: 1;
    cursor: pointer;
    text-align: center;
    background: transparent;
    color: var(--cor-primaria-fim);
    transition: color 0.2s ease;
}

.btn::before,
.btn::after {
    content: "";
    position: absolute;
    border-radius: inherit;
    transition: opacity 0.3s ease;
}

.btn::before {
    top: -2px;
    left: -2px;
    height: calc(100% + 4px);
    width: calc(100% + 4px);
    z-index: -2;
    background: linear-gradient(45deg, var(--cor-primaria-inicio) 15%, var(--cor-primaria-fim) 65%);
}

.btn::after {
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: -1;
    background: var(--cor-branco);
}

.btn:hover,
.btn:focus {
    color: var(--cor-branco);
}

.btn:hover::after,
.btn:focus::after {
    opacity: 0;
}

/* Variante para uso sobre fundo escuro (ex. hero): borda branca real
   (nao pseudo-elemento), preenchimento em degrade revelado no hover. */
.btn-bordered-white {
    border: 2px solid var(--cor-branco);
    box-sizing: border-box;
    color: var(--cor-branco);
}

.btn-bordered-white::before {
    display: none;
}

.btn-bordered-white::after {
    top: -2px;
    left: -2px;
    height: calc(100% + 4px);
    width: calc(100% + 4px);
    background: linear-gradient(45deg, var(--cor-primaria-inicio) 15%, var(--cor-primaria-fim) 65%);
    opacity: 0;
}

.btn-bordered-white:hover,
.btn-bordered-white:focus {
    border-color: transparent;
    color: var(--cor-branco);
}

.btn-bordered-white:hover::after,
.btn-bordered-white:focus::after {
    opacity: 1;
}

.btn-large {
    padding: 0.85rem 2rem;
    font-size: 1.05rem;
}

/* Botao secundario: mesma tecnica do .btn, mas usa --cor-secundaria (solida,
   sem degrade) em vez da cor primaria - para acoes secundarias (Reabrir,
   Cancelar) se distinguirem visualmente das acoes primarias. */
.btn-secundario {
    color: var(--cor-secundaria);
}

.btn-secundario::before {
    background: var(--cor-secundaria);
}

/* Botao so-icone: acoes compactas em tabelas administrativas (ex.: coluna
   "Acoes" da lista de usuarios) - usa title="" nativo do navegador como
   tooltip em vez de texto visivel. Seletor com tag+classe pra vencer a regra
   generica "body.admin-page button" (mais especifica que uma classe sozinha),
   que senao esmaga o icone com o padding/pill do botao padrao do painel. */
body.admin-page button.btn-icone,
body.admin-page a.btn-icone {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2rem;
    height: 2rem;
    padding: 0;
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    background: var(--cor-branco);
    color: var(--cor-texto-suave);
    cursor: pointer;
    box-sizing: border-box;
    text-decoration: none;
}

body.admin-page button.btn-icone::before,
body.admin-page button.btn-icone::after {
    content: none;
}

body.admin-page button.btn-icone:hover,
body.admin-page button.btn-icone:focus,
body.admin-page a.btn-icone:hover,
body.admin-page a.btn-icone:focus {
    background: var(--cor-fundo-alt);
    color: var(--cor-texto);
}

/* Agrupa varios icones de acao lado a lado (ex.: coluna "Acoes" de uma
   tabela) - flex explicito em vez de depender de display:inline em cada
   form/a individualmente, que e fragil dentro de celulas de tabela. */
.acoes-icones {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    flex-wrap: wrap;
}

.acoes-icones form {
    margin: 0;
    display: inline-flex;
}

/* Hero */
.hero {
    position: relative;
    overflow: hidden;
    background: linear-gradient(135deg, var(--cor-primaria-inicio) 0%, var(--cor-primaria-fim) 100%);
    background-size: cover;
    background-position: center;
    color: var(--cor-branco);
    text-align: center;
    padding: 3.5rem 1.25rem;
}

.hero-shape {
    position: absolute;
    width: 140%;
    height: 220%;
    left: -20%;
    top: -60%;
    background: rgba(255, 255, 255, 0.08);
    border-radius: 45%;
    transform: rotate(-8deg);
    pointer-events: none;
}

.hero-conteudo {
    position: relative;
    max-width: 700px;
    margin: 0 auto;
}

.hero-title {
    font-size: 1.85rem;
    margin: 0 0 0.5rem;
}

.hero-subtitle {
    font-size: 1.05rem;
    color: rgba(255, 255, 255, 0.9);
    margin: 0 0 1.5rem;
}

/* Secoes */
.site-section {
    padding: 2.75rem 1.25rem;
    max-width: 900px;
    margin: 0 auto;
}

.site-section-alt {
    background: var(--cor-fundo-alt);
    max-width: none;
    padding-left: 0;
    padding-right: 0;
}

.site-section-inner {
    max-width: 900px;
    margin: 0 auto;
    padding: 0 1.25rem;
}

.site-section-com-imagem {
    display: flex;
    flex-direction: column;
    gap: 1.25rem;
    align-items: center;
}

.section-imagem {
    width: 100%;
    max-width: 420px;
    border-radius: 12px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}

.section-title {
    font-size: 1.4rem;
    margin: 0 0 1rem;
    color: var(--cor-primaria-fim);
}

.section-text {
    color: var(--cor-texto-suave);
    white-space: pre-line;
}

/* Cronograma */
.timeline {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.timeline-item {
    background: var(--cor-branco);
    border-left: 4px solid var(--cor-primaria-inicio);
    border-radius: 0 8px 8px 0;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
    padding: 0.75rem 1rem;
}

.timeline-trilha {
    display: block;
    font-size: 0.75rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    color: var(--cor-primaria-fim);
    font-weight: 600;
}

.timeline-nome {
    display: block;
    font-size: 1.05rem;
}

.timeline-datas {
    display: block;
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
}

/* Fase 29 (Bug 2): prazo final de submissao, quando diferente do fim da
   etapa - precisa se destacar do resto (cor do texto normal), nao so'
   herdar o cinza discreto de .timeline-datas. */
.timeline-prazo {
    display: block;
    font-size: 0.85rem;
    color: var(--cor-escura);
}

.timeline-descricao {
    margin: 0.25rem 0 0;
    color: var(--cor-texto-suave);
}

/* Temas/Desafios (redesenho Fase 19 #103): abas por trilha + cards de
   Tema recolhiveis + busca, em vez do mural unico anterior. */
.temas-abas {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin: 1rem 0;
}

.temas-aba {
    display: inline-flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.5rem 1rem;
    border: 1px solid var(--cor-borda);
    border-radius: 999px;
    background: var(--cor-branco);
    color: var(--cor-texto);
    font-weight: 600;
    font-size: 0.9rem;
    cursor: pointer;
}

.temas-aba.ativo {
    border-color: var(--cor-primaria-fim);
    background: var(--cor-fundo-alt);
    color: var(--cor-primaria-fim);
}

.temas-aba-contador {
    background: var(--cor-fundo-alt);
    color: var(--cor-texto-suave);
    border-radius: 999px;
    padding: 0.05rem 0.5rem;
    font-size: 0.78rem;
}

.temas-aba.ativo .temas-aba-contador {
    background: var(--cor-branco);
}

.temas-busca-rotulo {
    display: block;
    margin-bottom: 1.25rem;
}

.temas-busca {
    width: 100%;
    max-width: 480px;
    padding: 0.6rem 1rem;
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    font-size: 0.9rem;
    box-sizing: border-box;
}

.temas-eixo-conteudo {
    display: none;
    flex-direction: column;
    gap: 1rem;
}

.temas-eixo-conteudo.ativo {
    display: flex;
}

.tema-card {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
    overflow: hidden;
}

.tema-card-cabecalho {
    display: flex;
    align-items: flex-start;
    gap: 0.75rem;
    width: 100%;
    padding: 1.1rem;
    background: none;
    border: none;
    text-align: left;
    cursor: pointer;
    font-family: inherit;
    color: inherit;
}

.tema-card-titulos {
    flex: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.3rem;
}

.tema-card-meta {
    display: flex;
    align-items: center;
    gap: 0.6rem;
}

.tema-numero-pill {
    background: var(--cor-fundo-alt);
    color: var(--cor-primaria-fim);
    font-weight: 700;
    font-size: 0.78rem;
    padding: 0.15rem 0.6rem;
    border-radius: 999px;
}

.tema-contador {
    font-size: 0.8rem;
    color: var(--cor-texto-suave);
}

.tema-nome {
    margin: 0;
    font-size: 1.05rem;
    color: var(--cor-texto);
}

.tema-descricao {
    margin: 0;
    font-size: 0.88rem;
    color: var(--cor-texto-suave);
}

.tema-chevron {
    flex: 0 0 auto;
    margin-top: 0.2rem;
    color: var(--cor-texto-suave);
    transition: transform 0.2s ease;
}

.tema-card.expandido .tema-chevron {
    transform: rotate(180deg);
}

.tema-card-corpo {
    display: none;
    padding: 0 1.1rem 1.1rem 1.1rem;
    border-top: 1px solid var(--cor-borda);
}

.tema-card.expandido .tema-card-corpo {
    display: block;
    padding-top: 1rem;
}

.tema-desafios-lista {
    list-style: decimal;
    padding-left: 1.4rem;
    margin: 0;
}

.tema-desafio-item {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.6rem 0;
    border-bottom: 1px solid var(--cor-borda);
    font-size: 0.9rem;
}

.tema-desafio-item:last-child {
    border-bottom: none;
}

.tema-desafio-texto {
    padding-top: 0.3rem;
}

/* Rodape (redesenho Fase 19 #107, padrao do site modelo indicado pelo
   usuario: logo / texto institucional / navegacao / contato em colunas,
   com barra inferior separada). */
.site-footer {
    background: var(--cor-escura);
    color: rgba(255, 255, 255, 0.85);
    padding: 3rem 1.25rem 0;
}

.site-footer a {
    color: rgba(255, 255, 255, 0.85);
    text-decoration: none;
}

.site-footer a:hover {
    color: var(--cor-primaria-fim);
}

.site-footer-colunas {
    max-width: 1100px;
    margin: 0 auto;
    display: grid;
    grid-template-columns: 1fr;
    gap: 2rem;
    padding-bottom: 2.5rem;
}

/* Fase 19 (#107): sem enviar uma segunda imagem so' pro rodape - inverte
   preto->branco e usa hue-rotate pra devolver a cor laranja original
   (truque padrao de CSS pra reaproveitar uma logo escura sobre fundo
   escuro; nao e' pixel-perfect pra qualquer cor, mas funciona bem pra
   preto+laranja). */
.site-footer-logo {
    height: 48px;
    width: auto;
    object-fit: contain;
    filter: invert(1) hue-rotate(180deg);
}

.site-footer-coluna h2 {
    color: var(--cor-branco);
    font-size: 0.8rem;
    text-transform: uppercase;
    letter-spacing: 0.05em;
    margin: 0 0 0.9rem;
    padding-bottom: 0.6rem;
    border-bottom: 1px solid rgba(255, 255, 255, 0.15);
}

.site-footer-coluna ul {
    list-style: none;
    padding: 0;
    margin: 0;
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.site-footer-texto {
    font-size: 0.85rem;
    line-height: 1.6;
    color: rgba(255, 255, 255, 0.7);
}

.site-footer-contato li {
    display: flex;
    align-items: flex-start;
    gap: 0.5rem;
    font-size: 0.85rem;
}

.site-footer-contato svg {
    flex: 0 0 auto;
    margin-top: 0.15rem;
    color: var(--cor-primaria-fim);
}

.site-footer-redes {
    display: flex;
    flex-wrap: wrap;
    gap: 0.75rem;
}

.site-footer-barra {
    max-width: 1100px;
    margin: 0 auto;
    padding: 1.25rem 0;
    border-top: 1px solid rgba(255, 255, 255, 0.15);
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    justify-content: space-between;
    gap: 0.75rem;
}

.site-footer-links {
    font-size: 0.8rem;
}

.site-footer-topo {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 2.25rem;
    height: 2.25rem;
    border-radius: 999px;
    background: rgba(255, 255, 255, 0.1);
}

.site-footer-topo:hover {
    background: var(--cor-primaria-fim);
    color: var(--cor-branco);
}

/* Fase 19 (#107): botao flutuante do WhatsApp, acesso direto ao suporte. */
.site-whatsapp-flutuante {
    position: fixed;
    right: 1.25rem;
    bottom: 1.25rem;
    z-index: 500;
    width: 3.25rem;
    height: 3.25rem;
    border-radius: 999px;
    background: #25D366;
    color: var(--cor-branco);
    display: flex;
    align-items: center;
    justify-content: center;
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.25);
    transition: transform 0.15s ease;
}

.site-whatsapp-flutuante:hover {
    transform: scale(1.08);
    color: var(--cor-branco);
}

/* Formulario publico de submissao */
.site-form-page {
    max-width: 700px;
    margin: 0 auto;
    padding: 2rem 1.25rem;
}

.site-form-page fieldset {
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1rem;
    margin-bottom: 1rem;
}

.site-form-page input[type="text"],
.site-form-page input[type="number"],
.site-form-page input[type="email"],
.site-form-page input[type="url"],
.site-form-page select,
.site-form-page textarea {
    width: 100%;
    box-sizing: border-box;
    padding: 0.5rem;
    margin-top: 0.35rem;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
}


/* Desktop */
@media (min-width: 768px) {
    .site-header-inner {
        flex-direction: row;
        justify-content: space-between;
    }

    .hero-title {
        font-size: 2.5rem;
    }

    .hero-subtitle {
        font-size: 1.25rem;
    }

    .site-section-com-imagem {
        flex-direction: row;
        text-align: left;
    }

    .site-section-com-imagem > div {
        flex: 1;
    }

    /* Fase 19 (#98): posicao da imagem em relacao ao texto, configuravel
       por bloco - so' importa em telas maiores (mobile sempre empilha,
       imagem primeiro). */
    .site-section-com-imagem-direita {
        flex-direction: row-reverse;
    }

    /* Fase 19 (#107): rodape em colunas lado a lado a partir daqui. */
    .site-footer-colunas {
        grid-template-columns: 0.9fr 1.1fr 1fr 1.2fr;
    }
}

/* ===================== Painel administrativo ===================== */
/* Desktop-first de proposito (requisito nao-funcional): nao precisa ser
   responsivo para celular, mas precisa ter identidade visual - por isso
   os estilos abaixo miram diretamente nas tags semanticas ja usadas em
   todas as views de app/Views/admin/**, sem precisar de classe por view. */

body.admin-page {
    font-family: var(--fonte-corpo);
    color: var(--cor-texto);
    background: var(--cor-fundo-alt);
    margin: 0;
    padding: 0 0 2.5rem;
}

body.admin-page .admin-topbar {
    background: var(--cor-branco);
    border-bottom: 1px solid var(--cor-borda);
}

/* Container compartilhado que alinha o conteudo do topbar e da barra de
   abas com a mesma largura maxima do conteudo abaixo (.admin-shell, 1400px)
   - sem isso, em telas largas o topbar/abas ficam colados nas bordas da
   janela enquanto o conteudo fica centralizado num bloco mais estreito. */
body.admin-page .admin-largura-max {
    max-width: 1400px;
    margin-left: auto;
    margin-right: auto;
    box-sizing: border-box;
}

body.admin-page .admin-topbar .admin-largura-max {
    padding: 0.75rem 1.5rem;
    display: flex;
    align-items: center;
    justify-content: space-between;
}

body.admin-page .admin-topbar img {
    height: 36px;
}

body.admin-page .admin-topbar a {
    color: var(--cor-texto);
    text-decoration: none;
    font-size: 0.9rem;
}

body.admin-page .admin-topbar-acoes {
    display: flex;
    align-items: center;
    gap: 1.25rem;
}

.notificacoes-sino-wrapper {
    position: relative;
}

/* 3 icones do topbar (sino de notificacoes, Meu perfil, Sair) - mesmo
   tamanho/borda/hover pra formar um conjunto visual unico. Seletor com tag
   (button/a) + classe pra vencer a regra generica "body.admin-page button"
   do painel (que senao aplica seu proprio padding/pill e o !important da
   especificidade ganha da classe sozinha). */
body.admin-page button.notificacoes-sino-botao,
body.admin-page a.topbar-icone {
    position: relative;
    width: 2.25rem;
    height: 2.25rem;
    box-sizing: border-box;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    border: 1px solid var(--cor-borda);
    border-radius: 50%;
    background: var(--cor-branco);
    color: var(--cor-texto-suave);
    padding: 0;
    cursor: pointer;
    text-decoration: none;
}

body.admin-page button.notificacoes-sino-botao::before,
body.admin-page button.notificacoes-sino-botao::after {
    content: none;
}

body.admin-page button.notificacoes-sino-botao:hover,
body.admin-page button.notificacoes-sino-botao:focus,
body.admin-page a.topbar-icone:hover,
body.admin-page a.topbar-icone:focus {
    background: var(--cor-fundo-alt);
    color: var(--cor-texto);
    border-color: var(--cor-texto-suave);
}

.notificacoes-sino-badge {
    position: absolute;
    top: -2px;
    right: -2px;
    min-width: 16px;
    height: 16px;
    padding: 0 4px;
    border-radius: 999px;
    background: #cc3333;
    color: var(--cor-branco);
    font-size: 0.65rem;
    font-weight: 700;
    line-height: 16px;
    text-align: center;
}

.notificacoes-sino-painel {
    display: none;
    position: absolute;
    right: 0;
    top: calc(100% + 8px);
    width: 320px;
    max-width: 90vw;
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
    z-index: 50;
}

.notificacoes-sino-painel.aberto {
    display: block;
}

.notificacoes-sino-cabecalho {
    display: flex;
    align-items: center;
    justify-content: space-between;
    padding: 0.6rem 0.9rem;
    border-bottom: 1px solid var(--cor-borda);
    font-size: 0.75rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--cor-texto-suave);
}

.notificacoes-sino-lista {
    max-height: 320px;
    overflow-y: auto;
}

/* Cada notificacao e' uma linha com o link (titulo+mensagem, leva a
   marcarLida()+abrir a tela de tratamento) e, quando nao lida, um icone
   separado (marcarLida() sozinho, sem navegar) - ver Fase 15 Bug 2. */
.notificacoes-sino-linha {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    padding: 0.4rem 0.6rem 0.4rem 0.9rem;
    border-bottom: 1px solid var(--cor-fundo-alt);
}

.notificacoes-sino-linha:last-child {
    border-bottom: none;
}

.notificacoes-sino-linha.nao-lida {
    background: #fff4ec;
}

.notificacoes-sino-linha:hover {
    background: var(--cor-fundo-alt);
}

.notificacoes-sino-item {
    flex: 1;
    min-width: 0;
    padding: 0.2rem 0;
    text-decoration: none;
    color: var(--cor-texto);
}

.notificacoes-sino-linha form {
    margin: 0;
    flex-shrink: 0;
}

.notificacoes-sino-titulo {
    display: block;
    font-size: 0.85rem;
    font-weight: 700;
}

.notificacoes-sino-mensagem {
    display: block;
    font-size: 0.8rem;
    color: var(--cor-texto-suave);
    margin-top: 0.15rem;
}

.notificacoes-sino-vazio {
    padding: 1.5rem 0.9rem;
    text-align: center;
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
}

body.admin-page .admin-tabs {
    background: var(--cor-branco);
    border-bottom: 3px solid var(--cor-primaria-inicio);
    margin-bottom: 1.5rem;
}

body.admin-page .admin-tabs .admin-largura-max {
    padding: 0 1.5rem;
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
}

body.admin-page .admin-tab {
    display: inline-block;
    padding: 0.85rem 1rem;
    color: var(--cor-texto-suave);
    text-decoration: none;
    font-size: 0.85rem;
    font-weight: 600;
    border-bottom: 3px solid transparent;
    margin-bottom: -3px;
}

body.admin-page .admin-tab:hover {
    color: var(--cor-primaria-fim);
}

body.admin-page .admin-tab.active {
    color: var(--cor-primaria-fim);
    border-bottom-color: var(--cor-primaria-fim);
}

/* Recuo/largura das paginas "planas" (fora da arvore de Concursos) - um
   unico wrapper em vez de listar tag por tag, pra nao repetir o bug de
   titulo/tabela cortado sempre que uma view nova usa uma tag que a lista
   antiga nao previa (ja aconteceu com h2/h3 em avaliacao/index e
   usuarios_editar). 1400px pra bater com .admin-largura-max/.admin-shell -
   antes era 1000px, deixando Painel/Paginas/Tema/Auditoria/Configuracoes/
   Usuarios visivelmente mais estreitos que o topbar/abas e que a tela
   Concursos (que usa a arvore, .admin-shell, 1400px). */
body.admin-page .admin-conteudo-flat {
    max-width: 1400px;
    margin-left: auto;
    margin-right: auto;
    padding-left: 1.5rem;
    padding-right: 1.5rem;
    box-sizing: border-box;
}

/* ================= Arvore lateral (Fase 8) ================= */

body.admin-page .admin-shell {
    display: grid;
    grid-template-columns: 280px 1fr;
    align-items: start;
    max-width: 1400px;
    margin: 0 auto;
    padding: 0 1.5rem;
    box-sizing: border-box;
    gap: 1.5rem;
}

body.admin-page .admin-sidebar {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    padding: 1rem 0.5rem;
    position: sticky;
    top: 1rem;
    max-height: calc(100vh - 2rem);
    overflow-y: auto;
}

#arvore-admin ul {
    list-style: none;
    margin: 0;
    padding: 0;
}

#arvore-admin .arvore-raiz {
    padding-left: 0;
}

#arvore-admin .arvore-filhos {
    padding-left: 1.1rem;
}

#arvore-admin .arvore-filhos-fechado {
    display: none;
}

#arvore-admin .arvore-linha {
    display: flex;
    align-items: center;
    gap: 0.25rem;
    padding: 0.25rem 0.35rem;
    border-radius: 4px;
}

#arvore-admin .arvore-no.ativo > .arvore-linha {
    background: var(--cor-fundo-alt);
}

#arvore-admin .arvore-no.ativo > .arvore-linha .arvore-rotulo {
    color: var(--cor-primaria-fim);
    font-weight: 600;
}

#arvore-admin .arvore-caret {
    background: none;
    border: none;
    cursor: pointer;
    color: var(--cor-texto-suave);
    font-size: 0.65rem;
    line-height: 1;
    width: 14px;
    height: 14px;
    padding: 0;
    margin: 0;
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    transition: transform 0.15s ease;
}

#arvore-admin .arvore-caret.aberto {
    transform: rotate(90deg);
}

#arvore-admin .arvore-caret.carregando {
    opacity: 0.4;
}

#arvore-admin .arvore-spacer {
    display: inline-block;
    width: 14px;
    flex: 0 0 auto;
}

#arvore-admin .arvore-rotulo {
    color: var(--cor-texto);
    text-decoration: none;
    font-size: 0.9rem;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

#arvore-admin .arvore-rotulo:hover {
    color: var(--cor-primaria-fim);
}

#arvore-admin .arvore-vazio {
    color: var(--cor-texto-suave);
    font-size: 0.8rem;
    font-style: italic;
    padding: 0.25rem 0.35rem;
}

body.admin-page .admin-conteudo-wrapper {
    min-width: 0;
}

body.admin-page .abas-secundarias {
    background: var(--cor-branco);
    border-bottom: 2px solid var(--cor-borda);
    display: flex;
    flex-wrap: wrap;
    gap: 0.25rem;
    margin-bottom: 1.5rem;
    padding: 0 0.5rem;
}

body.admin-page .aba-secundaria {
    display: inline-block;
    padding: 0.65rem 0.85rem;
    color: var(--cor-texto-suave);
    text-decoration: none;
    font-size: 0.82rem;
    font-weight: 600;
    border-bottom: 2px solid transparent;
    margin-bottom: -2px;
}

body.admin-page .aba-secundaria:hover {
    color: var(--cor-primaria-fim);
}

body.admin-page .aba-secundaria.active {
    color: var(--cor-primaria-fim);
    border-bottom-color: var(--cor-primaria-fim);
}

/* Indicador granular "X/N criterios" na lista de submissoes do avaliador. */
body.admin-page .status-avaliacao {
    display: inline-block;
    padding: 0.2rem 0.6rem;
    border-radius: 12px;
    font-size: 0.8rem;
    font-weight: 600;
}

body.admin-page .status-avaliacao.completa {
    background: #e3f6e8;
    color: #1e7d3c;
}

body.admin-page .status-avaliacao.parcial {
    background: #fdf1dc;
    color: #a0630d;
}

body.admin-page .status-avaliacao.pendente {
    background: var(--cor-fundo-alt);
    color: var(--cor-texto-suave);
}

/* Pill de status generico (mesma tecnica de .status-avaliacao, mas para
   homologacao de equipe/integrante em vez de avaliacao) - Fase 15,
   tela unica do participante. */
.status-pill {
    display: inline-block;
    padding: 0.2rem 0.6rem;
    border-radius: 12px;
    font-size: 0.8rem;
    font-weight: 600;
}

.status-pill.verde {
    background: #e3f6e8;
    color: #1e7d3c;
}

.status-pill.laranja {
    background: #fdf1dc;
    color: #a0630d;
}

.status-pill.vermelho {
    background: #fbe4e4;
    color: #a3242c;
}

/* Fase 19 (#101): azul piscina para o status "Futuro" do cronograma. */
.status-pill.azul {
    background: #d4f4f9;
    color: #0f7a8c;
}

/* Fase 30: cinza pra "aguardando assinatura" (ainda nao chegou pra equipe
   do TJRR agir) e roxo pra "esclarecimento solicitado" (bola com o lider,
   nao com um atendente especifico - sinal visualmente diferente de
   "escalado", que ja usa laranja). */
.status-pill.cinza {
    background: #e8e8ea;
    color: #55585c;
}

.status-pill.roxo {
    background: #ede4fb;
    color: #6b3fa0;
}

/* Recuo do conteudo dentro da arvore (#conteudo-admin) fica no proprio
   container, no mesmo valor de .abas-secundarias (0.5rem), em vez de listar
   tag por tag (h1/p/form/table/fieldset) - repetia o mesmo bug de alinhamento
   toda vez que uma view usava uma tag nova (ja aconteceu com h2/h3) e ficava
   sempre 0.5rem fora de alinhamento com a barra de abas secundarias. */
body.admin-page #conteudo-admin {
    padding: 0 0.5rem;
    box-sizing: border-box;
}

body.admin-page h1 {
    font-family: var(--fonte-titulo);
    font-size: 1.6rem;
    color: var(--cor-escura);
    margin: 0.5rem auto 1rem;
}

body.admin-page a {
    color: var(--cor-primaria-fim);
}

body.admin-page table {
    width: 100%;
    border-collapse: collapse;
    background: var(--cor-branco);
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
    margin-bottom: 1.5rem;
}

body.admin-page table th,
body.admin-page table td {
    text-align: left;
    padding: 0.6rem 0.9rem;
    border-bottom: 1px solid var(--cor-borda);
    font-size: 0.9rem;
}

body.admin-page table th {
    background: var(--cor-escura);
    color: var(--cor-branco);
    font-weight: 600;
}

body.admin-page table tr:nth-child(even) td {
    background: var(--cor-fundo-alt);
}

body.admin-page fieldset {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1.25rem 1.5rem;
    margin-bottom: 1.5rem;
}

body.admin-page legend {
    font-family: var(--fonte-titulo);
    font-weight: 600;
    color: var(--cor-primaria-fim);
    padding: 0 0.5rem;
}

body.admin-page label {
    display: block;
    margin-bottom: 1rem;
    font-size: 0.9rem;
}

body.admin-page input[type="text"],
body.admin-page input[type="email"],
body.admin-page input[type="date"],
body.admin-page input[type="datetime-local"],
body.admin-page input[type="number"],
body.admin-page select,
body.admin-page textarea {
    display: block;
    margin-top: 0.35rem;
    padding: 0.5rem;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
    font-family: inherit;
    font-size: 0.9rem;
}

/* Mesma tecnica de .btn/.btn-bordered (anel em degrade + preenchimento
   branco revelado no hover) via seletor de tag, ja que as views admin nao
   usam classe no botao. */
body.admin-page button,
body.admin-page input[type="submit"] {
    position: relative;
    z-index: 1;
    padding: 0.55rem 1.4rem;
    border: 2px solid transparent;
    box-sizing: border-box;
    border-radius: 999px;
    outline: 0 none;
    font-weight: 600;
    font-size: 0.9rem;
    cursor: pointer;
    background: transparent;
    color: var(--cor-primaria-fim);
    transition: color 0.2s ease;
}

body.admin-page button::before,
body.admin-page button::after,
body.admin-page input[type="submit"]::before,
body.admin-page input[type="submit"]::after {
    content: "";
    position: absolute;
    border-radius: inherit;
    transition: opacity 0.3s ease;
}

body.admin-page button::before,
body.admin-page input[type="submit"]::before {
    top: -2px;
    left: -2px;
    height: calc(100% + 4px);
    width: calc(100% + 4px);
    z-index: -2;
    background: linear-gradient(45deg, var(--cor-primaria-inicio) 15%, var(--cor-primaria-fim) 65%);
}

body.admin-page button::after,
body.admin-page input[type="submit"]::after {
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: -1;
    background: var(--cor-branco);
}

body.admin-page button:hover,
body.admin-page button:focus,
body.admin-page input[type="submit"]:hover,
body.admin-page input[type="submit"]:focus {
    color: var(--cor-branco);
}

body.admin-page button:hover::after,
body.admin-page button:focus::after,
body.admin-page input[type="submit"]:hover::after,
body.admin-page input[type="submit"]:focus::after {
    opacity: 0;
}

/* Botao secundario no painel: mesma tecnica, cor solida (--cor-secundaria)
   em vez do degrade primario, para acoes secundarias (Reabrir, Cancelar). */
body.admin-page button.btn-secundario,
body.admin-page input.btn-secundario {
    color: var(--cor-secundaria);
}

body.admin-page button.btn-secundario::before,
body.admin-page input.btn-secundario::before {
    background: var(--cor-secundaria);
}

/* Link "Voltar" estilizado como botao secundario (mesma tecnica de anel em
   degrade + preenchimento solido dos demais botoes do painel, mas fixo na
   cor secundaria porque "Voltar" nunca e' a acao primaria da tela) - Fase 15
   Bug 6: padroniza o antigo link solto "Voltar"/"Voltar ao painel" acima do
   formulario como botao ao lado do Salvar. */
body.admin-page a.btn-voltar {
    position: relative;
    z-index: 1;
    display: inline-block;
    padding: 0.55rem 1.4rem;
    border: 2px solid transparent;
    box-sizing: border-box;
    border-radius: 999px;
    outline: 0 none;
    font-weight: 600;
    font-size: 0.9rem;
    cursor: pointer;
    background: transparent;
    color: var(--cor-secundaria);
    text-decoration: none;
    transition: color 0.2s ease;
}

body.admin-page a.btn-voltar::before,
body.admin-page a.btn-voltar::after {
    content: "";
    position: absolute;
    border-radius: inherit;
    transition: opacity 0.3s ease;
}

body.admin-page a.btn-voltar::before {
    top: -2px;
    left: -2px;
    height: calc(100% + 4px);
    width: calc(100% + 4px);
    z-index: -2;
    background: var(--cor-secundaria);
}

body.admin-page a.btn-voltar::after {
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: -1;
    background: var(--cor-branco);
}

body.admin-page a.btn-voltar:hover,
body.admin-page a.btn-voltar:focus {
    color: var(--cor-branco);
}

body.admin-page a.btn-voltar:hover::after,
body.admin-page a.btn-voltar:focus::after {
    opacity: 0;
}

/* Agrupa o botao "Voltar" com a acao primaria (Salvar/Adicionar/Convidar) no
   rodape do formulario, lado a lado. */
.form-acoes {
    display: flex;
    align-items: center;
    gap: 0.75rem;
}

/* Barra de filtros horizontal (Fase 15, tela Auditoria) - grid fluido em vez
   de empilhar cada <label> na vertical; auto-fit/minmax reflow sozinho pra
   menos colunas em telas estreitas, sem precisar de media query separada
   pra isso. Fundo levemente destacado (--cor-fundo-alt) pra virar um
   "card" de filtros, coerente com o resto do painel. */
body.admin-page .filtros-barra-wrapper {
    background: var(--cor-fundo-alt);
    border-radius: 8px;
    padding: 1rem 1.25rem;
    margin-bottom: 1.25rem;
}

body.admin-page .filtros-barra {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 10px;
    align-items: end;
}

body.admin-page .filtros-barra label {
    margin-bottom: 0;
}

/* Sem isso, o input/select fica com a largura "natural" do navegador em vez
   de preencher a celula do grid, deixando o gap entre campos inconsistente. */
body.admin-page .filtros-barra input,
body.admin-page .filtros-barra select {
    width: 100%;
    box-sizing: border-box;
}

/* Busca livre fica mais estreita que os demais campos, de proposito. */
body.admin-page .filtros-barra .filtro-busca input {
    max-width: 200px;
}

.filtros-barra-acoes {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

/* Linha "X registros encontrados" + exportar CSV, acima da tabela. */
.auditoria-resumo {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    margin-bottom: 0.75rem;
    font-size: 0.9rem;
    color: var(--cor-texto-suave);
}

/* Rolagem horizontal da tabela em telas estreitas, sem quebrar o layout da
   pagina - a tabela em si mantem largura minima legivel. */
.tabela-scroll {
    overflow-x: auto;
}

/* Linha de detalhes da Auditoria (JSON antes/depois): sem isso, um valor
   longo numa unica linha do JSON (ex.: o corpo HTML de um e-mail dentro de
   dados_depois) fica numa linha so' sem quebra, forcando a tabela inteira a
   ficar largura absurda e "sumindo" com as outras colunas na tela. */
.auditoria-detalhes-linha pre {
    white-space: pre-wrap;
    overflow-wrap: break-word;
    max-width: 100%;
}

.auditoria-paginacao {
    display: flex;
    align-items: center;
    gap: 0.5rem;
}

/* Titulo da pagina + acao (ex.: Voltar) na mesma linha, alinhados nas
   pontas - usado quando o botao Voltar nao faz mais sentido solto abaixo
   do titulo (Fase 15, tela Auditoria). */
.pagina-titulo-acoes {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 1rem;
    flex-wrap: wrap;
    margin-bottom: 1.25rem;
}

body.admin-page .pagina-titulo-acoes h1 {
    margin: 0;
}

/* Agrupa os botoes do lado direito da linha de titulo (ex.: Salvar/+Novo
   ao lado de Voltar), pra nao depender so' do space-between do wrapper
   quando ha mais de um botao. */
.pagina-titulo-botoes {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    flex-wrap: wrap;
}

/* Link estilizado como botao primario (mesma tecnica do botao padrao do
   painel, mas aplicada a uma <a>) - usado pras acoes de "+ Novo X" que
   agora sobem pra linha do titulo ao lado de Voltar, em vez de link de
   texto solto. */
body.admin-page a.btn-acao {
    position: relative;
    z-index: 1;
    display: inline-block;
    padding: 0.55rem 1.4rem;
    border: 2px solid transparent;
    box-sizing: border-box;
    border-radius: 999px;
    outline: 0 none;
    font-weight: 600;
    font-size: 0.9rem;
    cursor: pointer;
    background: transparent;
    color: var(--cor-primaria-fim);
    text-decoration: none;
    transition: color 0.2s ease;
}

body.admin-page a.btn-acao::before,
body.admin-page a.btn-acao::after {
    content: "";
    position: absolute;
    border-radius: inherit;
    transition: opacity 0.3s ease;
}

body.admin-page a.btn-acao::before {
    top: -2px;
    left: -2px;
    height: calc(100% + 4px);
    width: calc(100% + 4px);
    z-index: -2;
    background: linear-gradient(45deg, var(--cor-primaria-inicio) 15%, var(--cor-primaria-fim) 65%);
}

body.admin-page a.btn-acao::after {
    top: 0;
    left: 0;
    height: 100%;
    width: 100%;
    z-index: -1;
    background: var(--cor-branco);
}

body.admin-page a.btn-acao:hover,
body.admin-page a.btn-acao:focus {
    color: var(--cor-branco);
}

body.admin-page a.btn-acao:hover::after,
body.admin-page a.btn-acao:focus::after {
    opacity: 0;
}

/* Estado "ativo" de um botao-icone (ex.: "Ver detalhes" expandido) - mesmo
   destaque sutil (fundo + borda na cor primaria) usado em outros toggles
   do painel, pra deixar claro que clicar de novo desfaz a acao. */
body.admin-page button.btn-icone.ativo {
    background: var(--cor-fundo-alt);
    border-color: var(--cor-primaria-fim);
    color: var(--cor-primaria-fim);
}

/* Painel (dashboard inicial) */
.admin-dashboard-cards {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
    gap: 1rem;
    margin: 0 0 1.5rem;
}

.admin-stat-card {
    background: var(--cor-branco);
    border-radius: 8px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
    padding: 1.25rem 1.5rem;
    border-left: 4px solid var(--cor-primaria-inicio);
}

.admin-stat-numero {
    display: block;
    font-family: var(--fonte-titulo);
    font-size: 2rem;
    font-weight: 700;
    color: var(--cor-escura);
}

.admin-stat-rotulo {
    display: block;
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
    margin-top: 0.25rem;
}

/* Fase 20 (#118): quadro de progresso de avaliacao (etapa vigente do
   concurso ativo), no mesmo painel. */
.admin-progresso-item {
    background: var(--cor-branco);
    border-radius: 8px;
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
    padding: 1rem 1.25rem;
    margin-bottom: 0.75rem;
}

.admin-progresso-link {
    display: block;
    text-decoration: none;
    color: inherit;
    transition: box-shadow 0.2s ease;
}

.admin-progresso-link:hover {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.16);
}

.admin-progresso-cabecalho {
    display: flex;
    justify-content: space-between;
    gap: 1rem;
    font-size: 0.9rem;
    margin-bottom: 0.5rem;
}

.admin-progresso-barra-fundo {
    background: var(--cor-fundo-alt);
    border-radius: 999px;
    height: 10px;
    overflow: hidden;
}

.admin-progresso-barra-preenchimento {
    background: var(--cor-primaria-fim);
    height: 100%;
    border-radius: 999px;
    transition: width 0.3s ease;
}

/* ===================== Tela de login (convidado) ===================== */

body.guest-page {
    margin: 0;
    min-height: 100vh;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 1rem;
    padding: 2rem 1rem;
    background: var(--cor-fundo-alt);
    font-family: var(--fonte-corpo);
    box-sizing: border-box;
}

.guest-card {
    width: 100%;
    max-width: 380px;
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 12px;
    box-shadow: 0 8px 24px rgba(0, 0, 0, 0.06);
    padding: 2rem;
    box-sizing: border-box;
}

.guest-logo {
    display: block;
    height: 48px;
    margin: 0 auto 1.5rem;
}

.guest-titulo {
    font-family: var(--fonte-titulo);
    font-size: 1.3rem;
    text-align: center;
    margin: 0 0 0.35rem;
    color: var(--cor-escura);
}

.guest-subtitulo {
    text-align: center;
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
    margin: 0 0 1.5rem;
}

.guest-google {
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 0.6rem;
    width: 100%;
    box-sizing: border-box;
    padding: 0.7rem;
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    background: var(--cor-branco);
    color: var(--cor-texto);
    font-size: 0.85rem;
    font-weight: 500;
    text-decoration: none;
    margin-bottom: 1.25rem;
}

.guest-google:hover {
    background: var(--cor-fundo-alt);
}

.guest-divisor {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    margin-bottom: 1.25rem;
    font-size: 0.75rem;
    color: var(--cor-texto-suave);
}

.guest-divisor::before,
.guest-divisor::after {
    content: "";
    flex: 1;
    height: 1px;
    background: var(--cor-borda);
}

.guest-card label {
    display: block;
    font-size: 0.85rem;
    font-weight: 600;
    margin-bottom: 1rem;
}

.guest-card input[type="text"],
.guest-card input[type="email"],
.guest-card input[type="password"] {
    display: block;
    width: 100%;
    box-sizing: border-box;
    margin-top: 0.4rem;
    padding: 0.6rem 0.75rem;
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    font-size: 0.9rem;
}

.guest-card button[type="submit"] {
    width: 100%;
    box-sizing: border-box;
    margin-top: 0.25rem;
}

.guest-cadastro {
    text-align: center;
    font-size: 0.85rem;
    margin-top: 1.25rem;
    color: var(--cor-texto-suave);
}

.guest-voltar {
    color: var(--cor-texto-suave);
    text-decoration: none;
    font-size: 0.8rem;
}

.guest-voltar:hover {
    color: var(--cor-primaria-fim);
}

.guest-copyright {
    color: #999;
    font-size: 0.75rem;
}

/* Modal generico reutilizavel (Fase 17 - Bug 5/Melhoria 1) - primeiro
   componente desse tipo no projeto. Overlay + caixa centralizada, fechado
   por padrao via [hidden]. */
.modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0, 0, 0, 0.55);
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 1.5rem;
    z-index: 2000;
}

.modal-overlay[hidden] {
    display: none;
}

.modal-caixa {
    position: relative;
    background: var(--cor-branco);
    border-radius: 10px;
    max-width: 720px;
    width: 100%;
    max-height: 85vh;
    overflow-y: auto;
    padding: 1.75rem;
    box-shadow: 0 8px 30px rgba(0, 0, 0, 0.25);
}

.modal-caixa h2 {
    margin-top: 0;
    padding-right: 2rem;
}

/* Fase 19 (#109): precisa da mesma especificidade "body.admin-page button"
   que .btn-icone ja usa (ver comentario acima de .btn-icone) - senao o
   padding/border-radius/anel em degrade do botao padrao do painel vaza por
   cima do X (aparecia como pilula laranja sobre o titulo do modal). */
body.admin-page button.modal-fechar {
    position: absolute;
    top: 0.75rem;
    right: 0.9rem;
    width: auto;
    height: auto;
    background: none;
    border: none;
    border-radius: 0;
    font-size: 1.5rem;
    line-height: 1;
    color: var(--cor-texto-suave);
    cursor: pointer;
    padding: 0.25rem 0.5rem;
}

body.admin-page button.modal-fechar::before,
body.admin-page button.modal-fechar::after {
    content: none;
}

body.admin-page button.modal-fechar:hover,
body.admin-page button.modal-fechar:focus {
    color: var(--cor-primaria-fim);
    background: none;
}

/* Ficha de leitura do conteudo de uma submissao (Fase 17 - Bug 5/Melhoria 1) -
   substitui a <table> generica (que herdava o th preto pensado pra tabelas de
   dados, nao pra ficha). height:auto natural, sem o vazio da tabela. */
.ficha-submissao {
    display: flex;
    flex-direction: column;
    gap: 1rem;
}

.ficha-item {
    background: var(--cor-fundo-alt);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 0.9rem 1.1rem;
}

.ficha-item-label {
    font-size: 0.78rem;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 0.03em;
    color: var(--cor-texto-suave);
    margin-bottom: 0.35rem;
}

.ficha-item-valor {
    color: var(--cor-texto);
    line-height: 1.5;
}

/* Tela de lancamento de notas do avaliador, redesenhada (Fase 17 -
   Melhoria 1): largura maxima centralizada, mais facil de escanear que
   esticado na tela toda. */
.pagina-avaliacao {
    max-width: 900px;
    margin: 0 auto;
}

/* Fase 28: layout compartilhado (notar_compartilhado.php) precisa de mais
   largura que o de abas - ficha unica + video 16:9 grande + linhas de
   criterio com nota alinhada a direita ficam espremidos em 900px. So' essa
   view usa o modificador; a tela de abas continua em 900px. */
.pagina-avaliacao.pagina-avaliacao-larga {
    max-width: 1200px;
}

.ficha-submissao-sticky {
    position: sticky;
    top: 0;
    z-index: 5;
    background: var(--cor-branco);
    padding-top: 0.5rem;
    padding-bottom: 0.5rem;
    max-height: 40vh;
    overflow-y: auto;
}

#progresso-avaliacao {
    display: inline-block;
    background: var(--cor-fundo-alt);
    border-radius: 999px;
    padding: 0.35rem 1rem;
    font-weight: 600;
    font-size: 0.85rem;
}

.criterio-bloco {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1.25rem 1.5rem;
    margin-bottom: 1.25rem;
}

/* Fase 19 (#10): abas por criterio - precisa da mesma especificidade
   "body.admin-page button" que .btn-icone/.modal-fechar ja usam (ver
   comentario acima de .btn-icone), senao o padding/pill/anel em degrade
   do botao padrao do painel bagunça o visual da aba. */
.criterio-abas {
    display: flex;
    flex-wrap: wrap;
    gap: 0.5rem;
    margin: 1rem 0;
}

body.admin-page button.criterio-aba {
    padding: 0.5rem 1.1rem;
    border: 1px solid var(--cor-borda);
    border-radius: 999px;
    background: var(--cor-branco);
    color: var(--cor-texto);
    font-weight: 600;
    font-size: 0.85rem;
    cursor: pointer;
}

body.admin-page button.criterio-aba::before,
body.admin-page button.criterio-aba::after {
    content: none;
}

body.admin-page button.criterio-aba.ativo {
    border-color: var(--cor-primaria-fim);
    background: var(--cor-fundo-alt);
    color: var(--cor-primaria-fim);
}

.criterio-painel {
    display: none;
}

.criterio-painel.ativo {
    display: block;
}

.criterio-bloco h3 {
    margin-top: 0;
}

.campo-nota {
    width: 110px;
}

.campo-nota-escala {
    font-size: 0.8rem;
    color: var(--cor-texto-suave);
    margin-left: 0.5rem;
}

.criterio-bloco textarea {
    width: 100%;
    box-sizing: border-box;
}

/* Fase 28: ficha da submissao no layout compartilhado - <details>/<summary>
   nativo (acessivel, sem JS) no lugar do antigo .ficha-submissao-sticky
   (max-height:40vh + scroll interno), que so' fazia sentido repetido dentro
   de cada aba do layout antigo - aqui a ficha aparece uma unica vez, entao
   forcar scroll so' escondia conteudo (ex.: ultimo campo da ficha) sem
   motivo. Marcador padrao do navegador escondido, substituido por um
   triangulo que gira ao abrir/fechar. */
.ficha-submissao-colapsavel {
    margin-bottom: 1.25rem;
}

.ficha-submissao-colapsavel summary {
    cursor: pointer;
    font-weight: 700;
    padding: 0.75rem 1rem;
    background: var(--cor-fundo-alt);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    list-style: none;
}

.ficha-submissao-colapsavel summary::-webkit-details-marker {
    display: none;
}

.ficha-submissao-colapsavel summary::before {
    content: "▸";
    display: inline-block;
    margin-right: 0.5rem;
    transition: transform 0.2s ease;
}

.ficha-submissao-colapsavel[open] summary::before {
    transform: rotate(90deg);
}

.ficha-submissao-colapsavel[open] summary {
    border-radius: 8px 8px 0 0;
    border-bottom: none;
}

.ficha-submissao-colapsavel .ficha-submissao {
    border: 1px solid var(--cor-borda);
    border-top: none;
    border-radius: 0 0 8px 8px;
    padding: 1rem;
}

/* Fase 30 (melhoria pos-teste): mesmo padrao de acordeao de
   .ficha-submissao-colapsavel, reaproveitado nas secoes do Painel
   administrativo (Duvidas/Requerimentos/Progresso da avaliacao) - comecam
   recolhidas (sem o atributo "open" no <details>). */
.painel-secao-colapsavel {
    margin-bottom: 1.5rem;
}

.painel-secao-colapsavel summary {
    cursor: pointer;
    font-weight: 700;
    font-size: 1.1rem;
    padding: 0.75rem 1rem;
    background: var(--cor-fundo-alt);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    list-style: none;
}

.painel-secao-colapsavel summary::-webkit-details-marker {
    display: none;
}

.painel-secao-colapsavel summary::before {
    content: "▸";
    display: inline-block;
    margin-right: 0.5rem;
    transition: transform 0.2s ease;
}

.painel-secao-colapsavel[open] summary::before {
    transform: rotate(90deg);
}

.painel-secao-colapsavel[open] summary {
    border-radius: 8px 8px 0 0;
    border-bottom: none;
}

.painel-secao-colapsavel-corpo {
    border: 1px solid var(--cor-borda);
    border-top: none;
    border-radius: 0 0 8px 8px;
    padding: 1rem;
}

/* Fase 28: layout compartilhado (notar_compartilhado.php) - quando todos os
   criterios da etapa enxergam o mesmo conteudo, a ficha some do
   .criterio-bloco (fica so' uma vez, fora do loop) e os criterios viram
   colunas lado a lado (ate 5, calculado no controller/view via
   grid-template-columns inline) em vez do empilhado das abas - melhor uso
   de tela larga quando ha' poucos criterios pra avaliar de uma vez. Abaixo
   de 720px cai pra 1 coluna (card empilhado), a tela fica estreita demais
   pra caber nota+escala legivel em 4-5 colunas. */
.criterios-compartilhados-grade {
    display: grid;
    gap: 1rem;
    margin-bottom: 1.25rem;
}

@media (max-width: 720px) {
    .criterios-compartilhados-grade {
        grid-template-columns: 1fr !important;
    }
}

.criterio-card {
    display: flex;
    flex-direction: column;
    gap: 0.4rem;
}

.criterio-card h3 {
    margin: 0;
    font-size: 1rem;
}

.criterio-card .campo-nota {
    width: 100%;
    box-sizing: border-box;
}

/* Precisa da mesma especificidade "body.admin-page button" que
   .btn-icone/.criterio-aba ja usam (ver comentario acima de .btn-icone),
   senao o padding/pill/degrade do botao padrao do painel esmaga o link. */
body.admin-page button[data-toggle-feedback] {
    background: none;
    border: none;
    padding: 0;
    color: var(--cor-primaria-fim);
    font-size: 0.85rem;
    font-weight: 600;
    cursor: pointer;
    margin-bottom: 0.5rem;
}

body.admin-page button[data-toggle-feedback]::before,
body.admin-page button[data-toggle-feedback]::after {
    content: none;
}

body.admin-page button[data-toggle-feedback]:hover,
body.admin-page button[data-toggle-feedback]:focus {
    text-decoration: underline;
}

/* Fase 17 (Melhoria 2): faixa fixa avisando que o Admin esta visualizando
   como outro usuario - cor de alerta (nao o laranja da marca, pra nao
   parecer uma acao normal do sistema). */
.faixa-visualizacao-como {
    background: #b45309;
    color: #fff;
    text-align: center;
    padding: 0.6rem 1rem;
    font-size: 0.9rem;
}

.faixa-visualizacao-como-botao {
    margin-left: 0.75rem;
    background: #fff;
    color: #b45309;
    border: none;
    border-radius: 999px;
    padding: 0.3rem 0.9rem;
    font-weight: 600;
    font-size: 0.82rem;
    cursor: pointer;
}

/* ===================== Fase 18: home publica nova ===================== */

.skip-link {
    position: absolute;
    left: -9999px;
    top: 0;
    background: var(--cor-primaria-fim);
    color: var(--cor-branco);
    padding: 0.75rem 1.25rem;
    z-index: 3000;
    border-radius: 0 0 6px 0;
}

.skip-link:focus {
    left: 0;
}

.sr-only {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

.site-flash {
    background: var(--cor-fundo-alt);
    border-left: 4px solid var(--cor-primaria-fim);
    padding: 0.75rem 1rem;
    margin: 1rem auto;
    max-width: 1100px;
}

.site-edicao-indicador {
    font-size: 0.8rem;
    font-weight: 600;
    color: var(--cor-texto-suave);
    background: var(--cor-fundo-alt);
    border-radius: 999px;
    padding: 0.25rem 0.85rem;
}

.site-menu-toggle {
    display: none;
    background: none;
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    font-size: 1.1rem;
    padding: 0.35rem 0.6rem;
    cursor: pointer;
}

.site-nav a.ativo:not(.btn) {
    color: var(--cor-primaria-fim);
    font-weight: 700;
}

@media (max-width: 780px) {
    .site-menu-toggle {
        display: inline-flex;
        align-items: center;
        justify-content: center;
    }

    .site-header-inner {
        flex-direction: row;
        justify-content: space-between;
        flex-wrap: wrap;
    }

    .site-nav {
        display: none;
        flex-direction: column;
        align-items: flex-start;
        width: 100%;
    }

    .site-nav.aberto {
        display: flex;
    }

    /* Fase 20 (#113): nenhuma regra mobile existia pra essa secao - o
       hero inteiro ficava fixo (padding, altura minima, largura do
       texto), quebrando o layout em telas estreitas. Valores de altura
       (min-height:0, shape menor) conferidos contra o CSS real do site
       modelo (responsive.css, breakpoint max-width:767px: la' o header
       vira height:100% auto). O padding-top do conteudo, porem, e'
       estimado (nao copiado do modelo): o .site-header-nav aqui vira
       linha unica (row + wrap) com o logo de 44px como maior item, o que
       da ~68px de altura real (12px padding + 44px logo + 12px padding);
       8rem cobre essa altura com folga e ainda absorve o caso do badge
       do concurso quebrar pra uma segunda linha em telas bem estreitas.
       Ajustar depois de conferir ao vivo num celular real. */
    .site-header-com-imagem {
        min-height: 0;
        padding-bottom: 2rem;
    }

    .site-header-hero-conteudo {
        padding: 8rem 1rem 2rem;
    }

    /* 112px = valor real do site modelo (style.css, .shape-bottom svg em
       @media max-width:991px), reduzido dos 275px do desktop. */
    .site-header-shape-bottom svg {
        height: 112px;
    }
}

/* Botao CTA preenchido (Inscreva-se, banners, blocos) - reaproveita a
   tecnica de degrade do .btn, so' que sempre "revelado" (nunca mostra o
   preenchimento branco de repouso). */
.btn-cta {
    color: var(--cor-branco);
}

.btn-cta::after {
    opacity: 0;
}

.btn-cta:hover,
.btn-cta:focus {
    color: var(--cor-branco);
    filter: brightness(0.93);
}

/* Fase 19 (#99): alinhamento do CTA de bloco de conteudo, configuravel. */
.btn-cta-esquerda { display: table; margin-right: auto; }
.btn-cta-centro { display: table; margin: 0 auto; }
.btn-cta-direita { display: table; margin-left: auto; }

/* 7 efeitos de hover do CTA (slideshow/banners), aplicados via classe
   efeito-<nome> vinda do campo cta_efeito_hover. */
.efeito-escurecer:hover { filter: brightness(0.8); }
.efeito-clarear:hover { filter: brightness(1.2); }
.efeito-escala:hover { transform: scale(1.06); }
.efeito-borda:hover { outline: 3px solid var(--cor-branco); outline-offset: 2px; }
.efeito-iluminar:hover { box-shadow: 0 0 18px 4px rgba(255, 200, 120, 0.85); }
.efeito-inverter:hover { filter: invert(1); }
[class*="efeito-"] { transition: filter 0.25s ease, transform 0.25s ease, box-shadow 0.25s ease; display: inline-block; }

/* Slideshow (3.2) */
.site-slideshow {
    position: relative;
    height: 480px;
    overflow: hidden;
}

.site-slideshow-trilho {
    position: relative;
    height: 100%;
}

.site-slide {
    position: absolute;
    inset: 0;
    background-size: cover;
    background-position: center;
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.6s ease, transform 0.6s ease;
    display: flex;
    align-items: flex-end;
}

.site-slide.ativo {
    opacity: 1;
    visibility: visible;
}

/* Fase 19 (#91): efeito de transicao configuravel por slide - fade e' o
   padrao (so' opacity, sem transform). */
.site-slide-efeito-slide { transform: translateX(30px); }
.site-slide-efeito-slide.ativo { transform: translateX(0); }
.site-slide-efeito-zoom { transform: scale(1.08); }
.site-slide-efeito-zoom.ativo { transform: scale(1); }

.site-slide-imagem-mobile {
    display: none;
}

/* Fase 19 (#91): efeitos de camada sobre a imagem de fundo do slide -
   portados literalmente do projeto LG Conecta
   (resources/views/components/slideshow.blade.php), so trocando o prefixo
   de classe lgss-ov- por site-slide-overlay-. A cor vem via "color" (os
   background-image/mask usam a keyword currentColor pra herdar essa cor),
   exceto "trama", que usa background-color com rgba() calculado no PHP. */
.site-slide-overlay {
    position: absolute;
    inset: 0;
    pointer-events: none;
    z-index: 0;
}

.site-slide-overlay-escurecer { background: linear-gradient(to right, currentColor, transparent 70%); }
.site-slide-overlay-vinheta { background: radial-gradient(ellipse at center, transparent 40%, currentColor); }
.site-slide-overlay-pontos { background-image: radial-gradient(currentColor 1px, transparent 1.6px); background-size: 6px 6px; }
.site-slide-overlay-linhas { background-image: repeating-linear-gradient(45deg, currentColor 0 2px, transparent 2px 9px); }
.site-slide-overlay-halftone {
    background-color: currentColor;
    -webkit-mask-image: radial-gradient(circle, transparent 0 1.3px, #000 1.7px);
    mask-image: radial-gradient(circle, transparent 0 1.3px, #000 1.7px);
    -webkit-mask-size: 6px 6px;
    mask-size: 6px 6px;
}
.site-slide-overlay-trama {
    background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAYAAABytg0kAAAAGUlEQVR4AWJiZGD8z8jIwMD0H0gzMDAyAAAAAP//ssJwrwAAAAZJREFUAwAccwMJqOu+JwAAAABJRU5ErkJggg==");
    background-repeat: repeat;
}

.site-slide-conteudo {
    position: relative;
    z-index: 1;
    background: linear-gradient(0deg, rgba(0, 0, 0, 0.65) 0%, rgba(0, 0, 0, 0) 60%);
    color: var(--cor-branco);
    width: 100%;
    padding: 2rem;
}

.site-slide-titulo h1,
.site-slide-titulo {
    font-size: 2rem;
    margin: 0 0 0.5rem;
}

.site-slide-separador {
    height: 4px;
    width: 80px;
    border-radius: 2px;
    margin-bottom: 0.75rem;
}

.site-slide-cta {
    display: inline-block;
    padding: 0.65rem 1.5rem;
    border-radius: 999px;
    font-weight: 600;
    text-decoration: none;
    background: var(--cor-primaria-fim);
    color: var(--cor-branco);
}

.site-slide-cta-pequeno { padding: 0.4rem 1rem; font-size: 0.85rem; }
.site-slide-cta-grande { padding: 0.9rem 2rem; font-size: 1.1rem; }

.site-slideshow-seta {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    background: rgba(0, 0, 0, 0.4);
    color: var(--cor-branco);
    border: none;
    font-size: 2rem;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    cursor: pointer;
    line-height: 1;
    z-index: 2;
}

.site-slideshow-seta-anterior { left: 1rem; }
.site-slideshow-seta-proxima { right: 1rem; }

.site-slideshow-marcadores {
    position: absolute;
    bottom: 1rem;
    left: 50%;
    transform: translateX(-50%);
    display: flex;
    gap: 0.5rem;
    z-index: 2;
}

.site-slideshow-marcador {
    width: 0.6rem;
    height: 0.6rem;
    border-radius: 50%;
    background: rgba(255, 255, 255, 0.5);
    border: none;
    cursor: pointer;
    padding: 0;
}

.site-slideshow-marcador.ativo {
    background: var(--cor-branco);
}

/* Banners empilhaveis (3.3) */
.site-banners {
    display: flex;
    flex-direction: column;
    gap: 0.75rem;
    padding: 0.75rem;
}

.site-banner {
    position: relative;
    min-height: 180px;
    background-size: cover;
    background-position: center;
    border-radius: 8px;
    overflow: hidden;
    display: flex;
    align-items: center;
    padding: 1.5rem;
}

.site-banner-conteudo {
    color: var(--cor-branco);
    max-width: 60%;
}

/* Fase 19 (#95): bloco de conteudo nao tinha nenhum controle de
   alinhamento - .site-banner (flex, sem justify-content) sempre grudava
   o conteudo a esquerda, independente de qualquer configuracao. */
.site-banner-conteudo-esquerda { margin-right: auto; text-align: left; }
.site-banner-conteudo-centro { margin: 0 auto; text-align: center; }
.site-banner-conteudo-direita { margin-left: auto; text-align: right; }

.site-banner-cta {
    position: absolute;
    display: inline-block;
    padding: 0.6rem 1.4rem;
    border-radius: 999px;
    background: var(--cor-primaria-fim);
    color: var(--cor-branco);
    text-decoration: none;
    font-weight: 600;
}

/* Fase 19 (#95): os seletores usavam hifen (superior-esquerda), mas
   BannerRepository::CTA_POSICOES grava com underscore (superior_esquerda)
   e _banners.php imprime o valor cru na classe - a classe gerada nunca
   batia com nenhum destes seletores, entao a posicao nunca era aplicada. */
.site-banner-cta-superior_esquerda { top: 1rem; left: 1rem; }
.site-banner-cta-superior_centro { top: 1rem; left: 50%; transform: translateX(-50%); }
.site-banner-cta-superior_direita { top: 1rem; right: 1rem; }
.site-banner-cta-centro_esquerda { top: 50%; left: 1rem; transform: translateY(-50%); }
.site-banner-cta-centro_centro { top: 50%; left: 50%; transform: translate(-50%, -50%); }
.site-banner-cta-centro_direita { top: 50%; right: 1rem; transform: translateY(-50%); }
.site-banner-cta-inferior_esquerda { bottom: 1rem; left: 1rem; }
.site-banner-cta-inferior_centro { bottom: 1rem; left: 50%; transform: translateX(-50%); }
.site-banner-cta-inferior_direita { bottom: 1rem; right: 1rem; }

/* Trilhas/segmentacao (3.5) */
.site-trilhas-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1.25rem;
}

/* Fase 19 (#101): 1 coluna por trilha, generico (nao fixo em 2). */
.site-cronograma-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
    gap: 1.5rem;
    align-items: start;
}

.site-cronograma-coluna-titulo {
    color: var(--cor-primaria-fim);
    font-size: 1.1rem;
    margin: 0 0 0.75rem;
}

.site-trilha-documentos {
    list-style: none;
    padding: 0;
    margin: 0.5rem 0 0;
}

.site-trilha-documento {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    padding: 0.6rem 0;
    border-bottom: 1px solid var(--cor-borda);
}

.site-trilha-documento:last-child {
    border-bottom: none;
}

.site-trilha-documento-icone {
    flex: 0 0 auto;
    margin-top: 0.1rem;
}

.site-trilha-documento-texto {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}

.site-trilha-documento-texto a {
    font-weight: 400;
    word-break: break-word;
}

.site-trilha-documento-meta {
    font-size: 0.8rem;
    color: var(--cor-texto-suave);
}

/* Cronograma (3.9) */
.site-cronograma-fuso {
    color: var(--cor-texto-suave);
    font-size: 0.85rem;
}

.timeline-item-concluido { opacity: 0.7; }

/* Premiacao (3.7) */
.site-premios-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 1.25rem;
    margin: 1.5rem 0;
}

.site-premio-card {
    text-align: center;
}

.site-premio-imagem {
    max-width: 100%;
    height: 100px;
    object-fit: contain;
    margin-bottom: 0.5rem;
}

.site-premio-posicao {
    display: block;
    font-size: 1.1rem;
    color: var(--cor-primaria-fim);
    margin-bottom: 0.35rem;
}

/* Fase 24: subtitulo de cada trilha quando a premiacao esta' no modo
   'por_trilha' (uma grade separada por trilha, em vez de uma unica). */
.site-premios-trilha-titulo {
    font-size: 1.25rem;
    color: var(--cor-escura);
    margin: 2rem 0 0;
}

.site-premios-trilha-titulo:first-of-type {
    margin-top: 0.5rem;
}

/* Temas/Desafios (3.8) - badges coloridos redesenhados na Fase 19 (#104),
   cor fixa por icone (App\Repositories\TemaRepository::ICONES_VISUAL). */
.tema-icone-badge {
    flex: 0 0 auto;
    width: 3rem;
    height: 3rem;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.5rem;
}

.tema-desafio-badge {
    flex: 0 0 auto;
    width: 2rem;
    height: 2rem;
    border-radius: 8px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 1.05rem;
}

/* FAQ (3.10) */
.site-faq-lista {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
}

.site-faq-item {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 0.9rem 1.1rem;
}

.site-faq-item summary {
    cursor: pointer;
    font-weight: 600;
}

.site-faq-resposta {
    margin-top: 0.6rem;
    color: var(--cor-texto-suave);
}

/* Rodape (3.12) */
.site-formulario-contato {
    max-width: 480px;
    margin: 1.5rem 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.site-formulario-contato input,
.site-formulario-contato textarea {
    padding: 0.5rem 0.75rem;
    border-radius: 6px;
    border: 1px solid var(--cor-borda);
    font-family: inherit;
}

/* Fase 19 (#107): .site-footer define color:branco (fundo escuro), mas
   este elemento usava --cor-texto-suave (cinza escuro pensado pra fundo
   claro) - contraste quase ilegivel sobre o rodape escuro. */
.site-footer-copyright {
    margin: 0;
    font-size: 0.8rem;
    color: rgba(255, 255, 255, 0.65);
}

/* Edicoes anteriores (3.11) */
.site-edicoes-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 1.25rem;
}

.site-edicao-card {
    text-decoration: none;
    color: inherit;
    display: block;
}

.site-edicao-card:hover .section-title {
    color: var(--cor-primaria-fim);
}

.site-breadcrumb {
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
    margin-bottom: 1rem;
}

.site-vencedores-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
    gap: 1.25rem;
}

.site-galeria-grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
    gap: 0.75rem;
}

.site-galeria-grid img {
    width: 100%;
    height: 140px;
    object-fit: cover;
    border-radius: 6px;
}

/* Cartao generico de proposito geral (Fase 18) - reaproveitavel em qualquer
   listagem/bloco admin novo que precise de um card simples (nao existia um
   componente generico desses antes, so' variantes ad-hoc por tela). */
.admin-card {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1rem 1.25rem;
}

.site-trilha-card h3 {
    font-weight: 600;
}

/* Fase 19: etapas + "Ver equipes homologadas" + "Ver resultado" viram uma
   lista so', com linha divisoria igual a lista de documentos (mesmo
   padrao visual, #90). */
.site-trilha-links {
    list-style: none;
    padding: 0;
    margin: 0.5rem 0;
}

.site-trilha-link-item {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    padding: 0.6rem 0;
    border-bottom: 1px solid var(--cor-borda);
}

.site-trilha-link-item:last-child {
    border-bottom: none;
}

.site-trilha-link-texto {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}

.site-trilha-link-meta {
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
}

.site-trilha-link-icone {
    flex: 0 0 auto;
    color: var(--cor-primaria-fim);
}

/* Editor de texto rico vanilla (Fase 18) - sem biblioteca de terceiros, ver
   assets/js/editor-rico.js. */
.editor-rico {
    margin-bottom: 1.25rem;
}

.editor-rico-rotulo {
    display: block;
    font-weight: 600;
    margin-bottom: 0.35rem;
}

.editor-rico-caixa {
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    overflow: hidden;
}

.editor-rico-caixa:focus-within {
    border-color: var(--cor-primaria-fim);
    box-shadow: 0 0 0 2px rgba(255, 153, 85, 0.25);
}

.editor-rico-barra {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 0.25rem;
    background: var(--cor-fundo-alt);
    border-bottom: 1px solid var(--cor-borda);
    padding: 0.4rem 0.5rem;
}

.editor-rico-btn {
    background: none;
    border: 1px solid transparent;
    border-radius: 4px;
    padding: 0.25rem 0.55rem;
    cursor: pointer;
    font-size: 0.85rem;
    line-height: 1;
    color: var(--cor-texto);
}

.editor-rico-btn:hover {
    background: var(--cor-branco);
    border-color: var(--cor-borda);
}

.editor-rico-select,
.editor-rico-tamanho {
    font-size: 0.78rem;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
    padding: 0.2rem 0.35rem;
}

/* Fase 30 (correcao pos-teste): dicionario de palavras-chave, exclusivo da
   tela de Modelos de Documento - fora do editor rico compartilhado de
   proposito (ver modelo-documento-dicionario.js). Icone no canto superior
   direito, logo acima do editor; passar o mouse mostra o painel (balao
   suspenso, so' CSS); clicar fixa aberto ate' outro clique. */
.modelo-corpo-wrapper {
    position: relative;
}

.modelo-dicionario-area {
    position: absolute;
    top: 0;
    right: 0;
    z-index: 5;
}

/* body.admin-page button (regra generica de botao-pilula, com pseudo-
   elementos de gradiente) tem mais especificidade que uma classe sozinha e
   cobria o SVG por dentro - precisa do prefixo "body.admin-page" pra vencer
   e "content: none" pra desligar os pseudo-elementos aqui. */
body.admin-page .modelo-dicionario-botao {
    padding: 0;
    width: 2rem;
    height: 2rem;
    border-radius: 6px;
    border: 1px solid var(--cor-borda);
    background: var(--cor-branco);
    display: inline-flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    color: var(--cor-texto);
}

body.admin-page .modelo-dicionario-botao::before,
body.admin-page .modelo-dicionario-botao::after {
    content: none;
}

body.admin-page .modelo-dicionario-botao:hover,
body.admin-page .modelo-dicionario-botao:focus {
    border-color: var(--cor-primaria-fim);
    color: var(--cor-primaria-fim);
}

.modelo-dicionario-painel {
    display: none;
    position: absolute;
    top: 100%;
    right: 0;
    margin-top: 6px;
    width: 300px;
    max-height: 420px;
    overflow-y: auto;
    z-index: 20;
    background: #fff;
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1rem;
    box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
    text-align: left;
}

.modelo-dicionario-area:hover .modelo-dicionario-painel,
.modelo-dicionario-painel.aberto {
    display: block;
}

.modelo-dicionario-painel h3 {
    margin-top: 0;
}

.modelo-dicionario-painel dl {
    margin: 0.5rem 0 0;
}

.modelo-dicionario-painel dt {
    font-weight: 600;
    margin-top: 0.5rem;
}

.modelo-dicionario-painel dd {
    margin: 0.15rem 0 0;
    color: #555;
}

@media (max-width: 900px) {
    .modelo-dicionario-painel {
        width: min(300px, 90vw);
    }
}

.editor-rico-tamanho {
    width: 5.5rem;
}

.editor-rico-cor {
    width: 1.9rem;
    height: 1.9rem;
    padding: 0;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
    cursor: pointer;
    background: none;
}

/* Fase 19 (#84 v5): campo de cor com hex editavel, reutilizavel (ver
   app/Views/admin/_campo_cor.php + assets/js/campo-cor.js). */
.campo-cor-rotulo {
    display: block;
    font-weight: 600;
    margin-bottom: 0.35rem;
}

.campo-cor-controles {
    display: flex;
    align-items: center;
    gap: 0.4rem;
}

.campo-cor-picker {
    width: 2.2rem;
    height: 2.2rem;
    padding: 0;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
    cursor: pointer;
    background: none;
}

.campo-cor-texto {
    width: 6rem;
    text-transform: uppercase;
    font-family: monospace;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
    padding: 0.35rem 0.5rem;
}

/* Seletor com tag+classe (nao so' classe) pra vencer a regra generica
   "body.admin-page button" (padding/pill do botao padrao do painel -
   mesma licao repetida nesta fase pra .modal-fechar/.criterio-aba). */
body.admin-page button.campo-cor-sem {
    width: 2.2rem;
    height: 2.2rem;
    padding: 0;
    border: 1px dashed var(--cor-borda);
    border-radius: 4px;
    background: none;
    color: var(--cor-texto-suave);
    font-size: 0.7rem;
    cursor: pointer;
}

body.admin-page button.campo-cor-limpar {
    padding: 0;
    border: none;
    border-radius: 0;
    background: none;
    font-size: 1.1rem;
    line-height: 1;
    color: var(--cor-texto-suave);
    cursor: pointer;
}

body.admin-page button.campo-cor-sem::before,
body.admin-page button.campo-cor-sem::after,
body.admin-page button.campo-cor-limpar::before,
body.admin-page button.campo-cor-limpar::after {
    content: none;
}

.campo-cor-limpar:hover {
    color: #c0392b;
}

/* Fase 19 (#84 v5): grade 3x3 de posicionamento, reutilizavel (ver
   app/Views/admin/_campo_posicao.php) - 100% CSS (input:checked + span),
   sem JS, mesmo mecanismo do LG Conecta. */
.campo-posicao-rotulo {
    display: block;
    font-weight: 600;
    margin-bottom: 0.35rem;
}

.campo-posicao-grade {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    grid-template-rows: repeat(3, 1fr);
    width: 7.5rem;
    height: 5rem;
    gap: 0.25rem;
    border: 2px solid var(--cor-borda);
    border-radius: 6px;
    padding: 0.5rem;
    background: var(--cor-fundo-alt);
}

/* Fase 20 (#110 v3): a causa real nao era o input, era o label nunca
   virar flex - "body.admin-page label" (site.css ~1588) tem
   especificidade maior (2 elementos + 1 classe) que ".campo-posicao-opcao"
   sozinho (1 classe), entao sempre ganhava e travava o label em
   display:block. Com o label em block, o <span> (sem display proprio,
   logo inline por padrao) ignora width/height - so' a borda aparecia,
   dando a "lasca" vertical. Qualificar com ".campo-posicao-grade" na
   frente sobe pra 2 classes, o suficiente pra vencer a regra do admin. */
.campo-posicao-grade .campo-posicao-opcao {
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
}

/* Fase 20 (#110 v2): a v1 (clip-path no lugar de clip:rect()) nao
   resolveu - o "traco" continuou. Causa real: sem appearance:none, o
   navegador insiste em pintar o widget nativo do radio no tamanho
   minimo dele proprio (maior que 1x1px), ignorando width/height do CSS -
   isso cria uma lasca vertical visivel mesmo com clip-path/clip:rect()
   aplicados, porque o clip corta a CAIXA do elemento, nao o desenho
   nativo que o navegador insiste em pintar por cima. appearance:none
   remove esse desenho nativo por completo, aí sim a caixa 1x1px +
   clip realmente escondem tudo. */
.campo-posicao-opcao input {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    opacity: 0;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    clip-path: inset(50%);
    white-space: nowrap;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
}

.campo-posicao-opcao span {
    width: 12px;
    height: 12px;
    border-radius: 999px;
    border: 2px solid var(--cor-texto-suave);
    background: var(--cor-branco);
    transition: background 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease;
}

.campo-posicao-opcao input:checked + span {
    background: var(--cor-primaria-fim);
    border-color: var(--cor-texto);
    box-shadow: 0 0 0 3px rgba(255, 153, 85, 0.3);
}

.campo-posicao-opcao input:focus-visible + span {
    box-shadow: 0 0 0 3px rgba(255, 153, 85, 0.5);
}

.editor-rico-area {
    min-height: 8rem;
    padding: 0.75rem 1rem;
    font-size: 0.95rem;
    line-height: 1.6;
    background: var(--cor-branco);
}

.editor-rico-area:focus {
    outline: none;
}

/* Fase 19 (#84 v5): modo codigo do editor rico - textarea com o HTML cru,
   pra correcao manual quando o WYSIWYG sozinho nao resolve. */
.editor-rico-codigo {
    display: block;
    width: 100%;
    min-height: 8rem;
    padding: 0.75rem 1rem;
    font-size: 0.85rem;
    font-family: monospace;
    line-height: 1.5;
    white-space: pre;
    background: var(--cor-fundo-alt);
    border: none;
    resize: vertical;
    box-sizing: border-box;
}

.editor-rico-btn[data-editor-alternar-modo].ativo {
    background: var(--cor-primaria-fim);
    color: var(--cor-branco);
}

/* Reordenacao por arrastar-e-soltar, generica (Fase 18) - HTML5 DnD nativo,
   sem lib. Botoes cima/baixo sao a alternativa por teclado, sempre visiveis
   (acessibilidade nao pode depender so' de mouse). Ver
   assets/js/reordenar-arrastar.js. */
.reordenar-lista {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0.5rem;
}

.reordenar-item {
    display: flex;
    align-items: center;
    gap: 0.75rem;
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 0.6rem 0.9rem;
}

.reordenar-item.arrastando {
    opacity: 0.5;
}

.reordenar-item.sobre-alvo {
    border-color: var(--cor-primaria-fim);
}

.reordenar-alca {
    cursor: grab;
    color: var(--cor-texto-suave);
    font-size: 1.1rem;
    padding: 0.15rem 0.3rem;
    user-select: none;
}

.reordenar-conteudo {
    flex: 1;
}

.reordenar-botoes {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
}

.reordenar-botoes button {
    background: none;
    border: 1px solid var(--cor-borda);
    border-radius: 4px;
    width: 1.6rem;
    height: 1.4rem;
    cursor: pointer;
    font-size: 0.7rem;
    line-height: 1;
}

.reordenar-botoes button:disabled {
    opacity: 0.35;
    cursor: default;
}

/* Fase 29 (Tira-Duvidas): tela de detalhe da duvida - cabecalho compacto,
   card de mensagem com avatar de iniciais, Responder/Escalar lado a lado
   (era duas secoes empilhadas em largura total, ocupando tela demais). */
.duvida-cabecalho {
    display: flex;
    align-items: center;
    gap: 0.6rem;
    margin-bottom: 1rem;
    flex-wrap: wrap;
}

.duvida-cabecalho h1 {
    margin: 0;
    font-size: 1.4rem;
}

.duvida-responsavel-atual {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    font-size: 0.85rem;
    color: var(--cor-texto-suave);
    margin-left: auto;
}

.duvida-mensagem {
    display: flex;
    gap: 0.75rem;
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1rem;
    margin-bottom: 0.75rem;
}

.duvida-avatar {
    flex-shrink: 0;
    width: 2.5rem;
    height: 2.5rem;
    border-radius: 50%;
    background: var(--cor-primaria-inicio);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    font-weight: 700;
    font-size: 0.85rem;
    /* Fase 29 (ajuste pos-push): mesma classe serve pra <img> (foto de "Meu
       perfil") e pra <div> (iniciais, reserva pra quem nunca enviou foto) -
       object-fit so' tem efeito na variante <img>. */
    object-fit: cover;
}

.duvida-mensagem-corpo {
    flex: 1;
    min-width: 0;
}

.duvida-mensagem-meta {
    font-size: 0.8rem;
    color: var(--cor-texto-suave);
    margin: 0.1rem 0 0.5rem;
}

.duvida-mensagem-texto {
    margin: 0;
}

.duvida-anexo {
    display: inline-flex;
    align-items: center;
    gap: 0.3rem;
    margin-top: 0.5rem;
    font-size: 0.85rem;
}

.duvida-acoes-grid {
    display: grid;
    grid-template-columns: 2fr 1fr;
    gap: 0.75rem;
    margin: 1rem 0;
}

@media (max-width: 720px) {
    .duvida-acoes-grid {
        grid-template-columns: 1fr;
    }
}

.duvida-acao-card {
    background: var(--cor-branco);
    border: 1px solid var(--cor-borda);
    border-radius: 8px;
    padding: 1rem;
}

.duvida-acao-card h2 {
    display: flex;
    align-items: center;
    gap: 0.4rem;
    font-size: 1rem;
    margin: 0 0 0.75rem;
}

.duvida-acao-card textarea,
.duvida-acao-card select {
    width: 100%;
    box-sizing: border-box;
    font-family: inherit;
}

.duvida-acao-rodape {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin-top: 0.6rem;
}

.duvida-limite {
    font-size: 0.78rem;
    color: var(--cor-texto-suave);
    margin: 0.5rem 0 0;
}

.duvida-historico-item {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 0.5rem;
    padding: 0.5rem 0.75rem;
    border: 1px solid var(--cor-borda);
    border-radius: 6px;
    font-size: 0.85rem;
    margin-bottom: 0.4rem;
}

.duvida-historico-quando {
    display: inline-flex;
    align-items: center;
    gap: 0.25rem;
    color: var(--cor-texto-suave);
    white-space: nowrap;
}
