/* =============================================================================
   Estilos da apresentação "Caçando bugs em Python: do olho humano à IA"
   (baseado no CSS de demo do impress.js, agora limpo e reorganizado).

   Organização do arquivo:
     1. Variáveis
     2. Reset e base
     3. Mensagem de fallback (navegador sem suporte)
     4. Mecânica dos passos (impress)
     5. Tipografia base dos slides
     6. Imagens
     7. Slides de conteúdo (em ordem de aparição no HTML)
     8. Overview (zoom-out final)
     9. Cromo da tela: barra de progresso e contador

   IDs padronizados em snake_case. As regras por slide seguem a ordem em que os
   slides aparecem no HTML.
   ========================================================================== */

/* ============================ 1. VARIÁVEIS =============================== */

:root {
    /* Fonte dos slides */
    --fonte: sans-serif;

    --fonte-codigo: monospace;

    /* Cor padrão do texto */
    --cor-texto: #000;

    /* Escala tipográfica (px no espaço de design 1920x1080 do impress) */
    --fs-h1: 140px;
    --fs-h1-medio: 120px; /* títulos um pouco longos */
    --fs-h1-menor: 100px; /* títulos bem longos */
    --fs-h2: 80px;
    --fs-h3: 70px;
    --fs-corpo: 30px; /* texto base dentro do cartão do slide */
    --fs-paragrafo: 70px; /* parágrafos centrais da maioria dos slides */
    --fs-paragrafo-denso: 60px; /* parágrafos dos slides densos em números */
    --fs-ul: 45px;

    /* Espaçamento vertical padrão acima de cada parágrafo central */
    --espaco-paragrafo: 45px;
    --espaco-li: 25px;
    --recuo-li: 40px;
}

/* ========================== 2. RESET E BASE ============================== */

*,
*::before,
*::after {
    box-sizing: border-box;
}

/* Reset enxuto (baseado no de Eric Meyer, reduzido aos elementos usados aqui).
   "font: inherit" mantém os títulos com peso normal — o visual atual depende
   disso; nossos próprios estilos definem o tamanho. */
html,
body,
div,
span,
h1,
h2,
h3,
h4,
h5,
h6,
p,
blockquote,
pre,
a,
code,
em,
strong,
b,
i,
img,
ul,
ol,
li,
table,
caption,
thead,
tbody,
tfoot,
tr,
th,
td,
figure,
figcaption,
header,
footer,
section,
nav {
    margin: 0;
    padding: 0;
    border: 0;
    font: inherit;
    vertical-align: baseline;
}

ul,
ol {
    list-style: none;
}

table {
    border-collapse: collapse;
    border-spacing: 0;
}

/* Restaura a ênfase visual que o reset removeu. */
b,
strong {
    font-weight: bold;
}

i,
em {
    font-style: italic;
}

/* Impede navegadores móveis de inflar fontes dentro do canvas escalado do
   impress (a "text inflation" quebra o layout dos slides). */
html {
    -webkit-text-size-adjust: none;
    text-size-adjust: none;
}

body {
    font-family: var(--fonte);
    /* Fundo cinza atrás de tudo (aparece nas bordas e no zoom-out). */
    background: radial-gradient(#f0f0f0, #bebebe);
}

/* Links com leve realce. */
a {
    color: inherit;
    text-decoration: none;
    padding: 0 0.1em;
    border-radius: 0.2em;
    background: rgba(255, 255, 255, 0.5);
    text-shadow: -1px -1px 2px rgba(100, 100, 100, 0.9);
    transition: 0.5s;
}

a:hover,
a:focus {
    background: rgb(255, 255, 255);
    text-shadow: -1px -1px 2px rgba(100, 100, 100, 0.5);
}

/* ====================== 3. MENSAGEM DE FALLBACK ========================== */

/* Mostrada quando o navegador não suporta o impress; some ao carregar. */
.fallback-message {
    width: 780px;
    max-width: 100%;
    margin: 20px auto;
    padding: 10px 10px 0;
    font-family: sans-serif;
    line-height: 1.3;
    background: #eedc94;
    border: 1px solid #e4c652;
    border-radius: 10px;
}

.fallback-message p {
    margin-bottom: 10px;
}

.impress-supported .fallback-message {
    display: none;
}

/* ====================== 4. MECÂNICA DOS PASSOS =========================== */

/* Base de TODOS os passos, inclusive os passos "câmera" sem conteúdo
   (floresta_01, observacao, pegadas, etc.) que só servem para mover o voo
   sobre a imagem de fundo. O impress troca position para absolute via JS;
   o relative aqui é o estado pré-inicialização. */
.step {
    position: relative;
    width: 900px;
    margin: 20px auto;
    padding: 40px;
    font-family: var(--fonte);
    font-size: 48px;
    line-height: 1.5;
}

/* Slides de conteúdo: o cartão branco. Sobrepõe largura/tamanho de .step.
   A fonte é herdada de .step (var(--fonte)).

   Fundo em duas camadas: a mascote (cobra) decorativa no canto inferior direito
   e, POR CIMA dela (1ª imagem da lista = camada de cima), um gradiente branco
   semitransparente que a esmaece em direção ao branco — fica como textura fraca
   e não afeta o texto (primeiro plano). Aumente o 0.6 para clarear mais a cobra;
   diminua para deixá-la mais visível.

   O conteúdo é centralizado verticalmente no cartão (flex), em vez de ficar
   grudado no topo. */
.slide {
    display: flex;
    flex-direction: column;
    justify-content: center;
    width: 1600px;
    height: 900px;
    padding: 40px 90px;
    color: var(--cor-texto);
    font-size: var(--fs-corpo);
    letter-spacing: -1px;
    text-shadow: 0 2px 2px rgba(0, 0, 0, 0.1);
    border: 1px solid rgba(0, 0, 0, 0.3);
    border-radius: 10px;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
    background-color: #fff;
    background-image:
        linear-gradient(rgba(255, 255, 255, 0.4), rgba(255, 255, 255, 0.4)),
        url("../images/cobra_loading.svg");
    background-repeat: no-repeat;
    background-position:
        center,
        right bottom;
    background-size: auto, 25%;
}

/* Slides de conteúdo só aparecem quando ativos (sem o "fantasma" 0.3 do
   impress). O !important é necessário para vencer a opacidade que o impress
   aplica em .step (regra .impress-enabled .step, abaixo). */
.appear {
    opacity: 0 !important;
    transition: opacity 1s;
}

.appear.active {
    opacity: 1 !important;
}

/* Passos inativos ficam levemente transparentes (efeito padrão do impress). */
.impress-enabled .step {
    margin: 0;
    opacity: 0.3;
    transition: opacity 1s;
}

.impress-enabled .step.active {
    opacity: 1;
}

/* Aparição instantânea (sem transição), usada nas imagens-surpresa.
   O !important é necessário: ".impress-enabled .step" tem especificidade
   maior que ".sudden" e venceria a transição sem ele. */
.sudden {
    transition: opacity 0s !important;
}

/* Imagens sobrepostas (ex.: capivaras) posicionadas a partir do canto do
   slide; os -60px puxam a imagem um pouco para fora da margem. */
.absolute {
    position: absolute;
    top: -60px;
    left: -60px;
}

/* ==================== 5. TIPOGRAFIA BASE DOS SLIDES ====================== */

/* Títulos: todos centralizados; tamanho pela escala. (Peso normal, herdado.) */
h1 {
    font-size: var(--fs-h1);
    line-height: 1.1;
    text-align: center;
    color: var(--cor-texto);
}

h2 {
    font-size: var(--fs-h2);
    text-align: center;
    color: var(--cor-texto);
}

h3 {
    font-size: var(--fs-h3);
    text-align: center;
    color: var(--cor-texto);
}

/* Listas dentro dos slides. */
ul {
    margin: 20px 20px 20px 50px;
    padding: 0;
    list-style: none;
    font-size: 45px;
    color: var(--cor-texto);
    background-color: #d0d0d044;
    border-radius: 16px;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
}

/* Código sempre em fonte monoespaçada (nem o reset nem o tema do
   highlight.js definem a família). */
code {
    font-family: var(--fonte-codigo);
}

/* =============================== 6. IMAGENS ============================= */

/* Imagem de fundo: a "floresta" sobre a qual a apresentação voa.
   O scale amplia a imagem para cobrir todo o espaço percorrido pelo voo.
   (Antes isto era um style inline no <img> dentro do HTML.) */
#fundo {
    position: absolute;
    top: 0;
    left: 0;
    z-index: -1;
    scale: 10;
}

/* Logo do Python centralizado no slide de título. */
.logo-titulo {
    display: block;
    margin: 0 auto;
}

/* Ícones de contato: mesma altura para alinhar a linha. */
.contato-icone {
    width: auto;
    height: 72px;
}

/* Imagens decorativas grandes (capivaras) em convite/contato. */
.imagem-convite {
    width: 35%;
}

.imagem-contato {
    width: 25%;
}

/* Capturas de tela de ferramentas (ruff, mypy) exibidas em tela cheia,
   centralizadas no passo. (Antes eram estilos inline no <img>.) */
.print-ferramenta {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: 230%;
}

/* Diagramas exibidos em passos próprios, sem o cartão (analise_estatica_img e
   analise_baseada_em_ia_img). O translate desloca a imagem larga para
   centralizá-la no passo de 900px. (Antes era estilo inline no <img>.) */
.imagem-diagrama {
    transform: translate(-28%, 1%);
}

/* ============ 7. SLIDES DE CONTEÚDO (ORDEM DE APARIÇÃO) ================== */

/* --- Parágrafos centrais (compartilhado por vários slides) ---
   O corpo de texto central de 70px, centralizado, usado pela maioria dos slides
   de conteúdo. Reunido num único seletor para não repetir a regra.
   (Em #paralelo o text-align não afeta os <span> inline da tabela — o
   alinhamento das colunas é feito nas células, mais abaixo; mas afeta os <p>.)
   Ficam de fora: slides de imagem (sem <p>) e os de layout próprio
   (fuzzing_02 e ia_02). Ao criar um novo slide de conteúdo, inclua o <p> aqui.
   (Exceção: resultados/conclusões têm bloco próprio, com fonte menor.) */
#paralelo span,
#paralelo p,
#observacao_direta p,
#paralelo_2 p,
#tecnicas p,
#revisao_manual p,
#analise_estatica_01 p,
#analise_estatica_02 p,
#fuzzing_01 p,
#fuzzing_02 p,
#analise_baseada_em_ia_01 p,
#analise_baseada_em_ia_02 p,
#ferramentas p,
#ferramentas_analise_estatica_00 p,
#ferramentas_analise_estatica_01 p,
#ferramentas_fuzzing_01 p,
#ferramentas_ia_01 p {
    font-size: var(--fs-paragrafo);
    text-align: center;
    color: var(--cor-texto);
    padding-top: var(--espaco-paragrafo);
}

/* --- titulo --- */
/* Só ajusta o respiro do título; o resto do slide usa os tamanhos base. */
#titulo h1 {
    padding-top: 30px;
}

/* --- quem_sou --- */
/* Com o conteúdo centralizado verticalmente (flex em .slide), o hack de margem
   negativa não é mais necessário; um respiro positivo separa a lista do título.
   O fundo transparente tira o cinza padrão das listas (base ul, acima). */
#quem_sou ul {
    margin-top: 40px;
    padding-left: 160px;
    background-color: transparent;
}

#quem_sou li {
    font-size: 70px;
}

/* --- paralelo --- */
/* A tabela "Biologia : Programação" fica num cartão suave (cantos arredondados,
   leve preenchimento e sombra), combinando com o cartão branco do slide. */
.table-container {
    display: flex;
    justify-content: center;
    padding: 10px 40px;
    background: rgba(0, 0, 0, 0.03);
    border: 1px solid rgba(0, 0, 0, 0.15);
    border-radius: 16px;
    box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
}

#paralelo table {
    margin: 30px;
}

/* Alinhamento das colunas em direção aos dois-pontos centrais: alinhamos as
   células da tabela, que é o que tem efeito sobre o conteúdo inline. */
#paralelo td:first-child {
    text-align: right;
}

#paralelo td:last-child {
    text-align: left;
}

/* Respiro ao redor do ":" central. */
#paralelo .dois_pontos {
    margin-left: 15px;
    margin-right: 15px;
}

/* --- registro_indicios --- */
/* Subtítulo menor que o <h2> padrão (80px). */
#registro_indicios h2 {
    font-size: 50px;
    text-align: center;
    color: var(--cor-texto);
    padding-top: 60px;
}

/* --- armadilhas_fotograficas --- */
/* Título tem subtítulo logo abaixo, então fechamos o espaçamento. */
#armadilhas_fotograficas h1 {
    line-height: 100%;
    padding-bottom: 50px;
}

/* --- agentes_ia --- */
/* Título de duas linhas; um respiro evita que o subtítulo cole nele. */
#agentes_ia h1 {
    padding-bottom: 30px;
}

/* --- relatorios_campo (slide "Relatórios de Campo / SPOILERS") --- */
#relatorios_campo p {
    font-size: 50px;
    text-align: center;
    color: var(--cor-texto);
    padding-top: 60px;
}

/* --- analise_baseada_em_ia --- */
/* Título longo: reduzido para caber. */
#analise_baseada_em_ia_01 h1,
#analise_baseada_em_ia_02 h1 {
    font-size: var(--fs-h1-medio);
}

/* --- ferramentas_revisao_manual (slide de código) --- */
/* Título longo: reduzido para caber. */
#ferramentas_revisao_manual h1 {
    font-size: var(--fs-h1-medio);
}

/* Sem a mascote aqui: código é o que menos tolera sobreposição. */
#ferramentas_revisao_manual {
    background-image: none;
}

/* Código num painel claro destacado, do tamanho do conteúdo e centralizado
   (margens automáticas centralizam o item flex). */
#ferramentas_revisao_manual pre,
#ferramentas_fuzzing_03 pre,
#ferramentas_ia_05 pre {
    width: fit-content;
    max-width: 100%;
    margin: 0 auto;
    padding: 0.6em 1em;
    text-align: left;
    background: #f6f8fa99;
    border: 1px solid #d0d7de;
    border-radius: 8px;
}

#ferramentas_revisao_manual code {
    font-size: 120%; /* era 130%; reduzido para o bloco caber no cartão */
}

/* --- ferramentas_fuzzing_02 (slide do lafleur) ---
   O diagrama do ciclo do lafleur fica à esquerda (posição absoluta); o título e
   a lista de etapas vão à direita, com recuo à direita para não sobrepor a
   imagem. (Antes a imagem tinha estilo inline.) */
#ferramentas_fuzzing_02 img {
    position: absolute;
    top: 50%;
    left: 30%;
    transform: translate(-50%, -50%);
    width: 55%;
}

#ferramentas_fuzzing_02 h1,
#ferramentas_fuzzing_02 p {
    text-align: right;
    padding-top: 20px;
    padding-right: 250px;
}

#ferramentas_fuzzing_02 p {
    font-size: var(--fs-paragrafo);
    color: var(--cor-texto);
}

/* --- ferramentas_fuzzing_03 (código do bug do yield from) --- */
/* Fonte dimensionada para a linha mais longa (o raise de 67 colunas) caber
   no painel sem barra de rolagem — em monoespaçada, 40px estouram. */
#ferramentas_fuzzing_03 code {
    font-size: 33px;
}

/* --- ferramentas_ia (família -review-toolkit) --- */
/* Títulos repetidos e longos: tamanho menor, com respiro para o conteúdo. */
#ferramentas_ia_01 h1,
#ferramentas_ia_02 h1,
#ferramentas_ia_03 h1 {
    font-size: var(--fs-h1-menor);
    padding-bottom: 30px;
}

#ferramentas_ia_01 p {
    font-size: var(--fs-paragrafo-denso);
}

/* Rótulo "Família -review-toolkit:" e a lista de toolkits (slide ia_02). */
#ferramentas_ia_02 span {
    font-size: var(--fs-paragrafo);
    text-align: left;
    color: var(--cor-texto);
}

#ferramentas_ia_02 li {
    font-size: var(--fs-ul);
    text-align: left;
    color: var(--cor-texto);
    padding-top: var(--espaco-li);
    padding-left: var(--recuo-li);
}

#ferramentas_ia_04 p {
    font-size: 65px;
    text-align: center;
}

#ferramentas_ia_04 h1, #ferramentas_ia_05 h1 {
    font-size: 108px;
}

/* Dois painéis de código lado a lado somando ~90 colunas: fonte e respiros
   reduzidos para a tabela caber na largura do cartão sem vazar. */
#ferramentas_ia_05 {
    padding-left: 40px;
    padding-right: 40px;
}

#ferramentas_ia_05 pre {
    padding: 0.5em 0.6em;
}

#ferramentas_ia_05 td + td {
    padding-left: 20px;
}

#ferramentas_ia_05 code {
    font-size: 25px;
}

#achado_01 h1 {
    font-size: var(--fs-h1-menor);
    padding-bottom: 30px;
}

/* --- Diagramas de fluxo em <pre> (ia_03, achado_01, resultados_04) ---
   Texto centralizado com setas ↓ entre as etapas; linhas compactas.
   (Antes eram estilos inline em cada <pre>.) */
#ferramentas_ia_03 pre,
#achado_01 pre,
#resultados_04 pre {
    font-size: 62px;
    line-height: 90%;
    text-align: center;
}

/* O fluxo de ia_03 tem menos etapas, então cabe maior. */
#ferramentas_ia_03 pre {
    font-size: 80px;
}

/* --- capivarias --- */
/* Vídeos e imagem lado a lado, na mesma altura.
   (Antes eram estilos inline em cada elemento.) */
#capivarias video,
#capivarias img {
    height: 650px;
}

/* --- resultados_pub (capturas de publicações) --- */
#resultados_pub_01 img {
    height: 70%;
}

#resultados_pub_02 img {
    height: 650px;
}

/* --- resultados / conclusoes --- */
/* Slides densos em números: parágrafos centralizados como no seletor
   compartilhado, mas um pouco menores (60px) para as linhas com métricas
   (ex.: "Free threading: 4.556+ corridas, 30+ crashes") caberem sem quebra. */
#resultados_01 p,
#resultados_02 p,
#resultados_03 p,
#conclusoes_01 p,
#conclusoes_02 p,
#conclusoes_03 p,
#recursos p {
    font-size: var(--fs-paragrafo-denso);
    text-align: center;
    color: var(--cor-texto);
    padding-top: var(--espaco-paragrafo);
}

/* Títulos longos ("Importância das ..."): reduzidos para caber numa linha,
   mesmo tratamento dos títulos de ferramentas_ia. */
#conclusoes_01 h1,
#conclusoes_02 h1 {
    font-size: var(--fs-h1-menor);
    padding-bottom: 30px;
}

/* --- fechamento --- */
/* Parágrafos à esquerda (alinhamento padrão), maiores. */
#fechamento p {
    font-size: 65px;
    color: var(--cor-texto);
}

/* --- convite --- */
#convite p {
    font-size: 85px;
    color: var(--cor-texto);
}

/* --- contato --- */
/* Slide alinhado à esquerda, com o QR code no canto superior direito.
   display:block reverte o flex de .slide: o contato tem composição própria
   (conteúdo fluindo do topo). O #fff no atalho mantém o cartão branco (senão o
   background do contato sobrescreveria o branco herdado de .slide). */
#contato {
    display: block;
    font-size: 60px;
    text-align: left;
    color: var(--cor-texto);
    background: #fff url("../images/qrcode.svg") no-repeat right top / 530px;
}

#contato h1 {
    line-height: 100%;
    padding-bottom: 0;
}

/* vertical-align: top alinha o texto ao topo da linha, junto dos ícones. */
#contato span {
    font-size: 70px;
    text-align: left;
    vertical-align: top;
    color: var(--cor-texto);
}

/* =============================== 8. OVERVIEW ============================= */

/* Passo de overview: sem conteúdo, fica escondido para podermos clicar nos
   outros passos durante o zoom-out. */
#overview {
    display: none;
}

/* No modo overview, todos os passos ficam visíveis e clicáveis. */
.impress-on-overview .step {
    opacity: 1;
    cursor: pointer;
}

/* =================== 9. BARRA DE PROGRESSO E CONTADOR ==================== */

.impress-progressbar {
    position: absolute;
    /* As margens reservam espaço: à esquerda para o contador de %, à direita
       para a toolbar. Valores afinados para a largura de design (1920px). */
    left: 118px;
    right: 318px;
    bottom: 1px;
    border: 2px solid rgb(100, 100, 100);
    border-radius: 7px;
}

.impress-progressbar div {
    width: 0;
    height: 20px;
    background: rgb(175, 175, 175);
    border-radius: 5px;
    transition: width 1s linear;
}

.impress-progress {
    position: absolute;
    left: 40px;
    bottom: 1px;
    font-size: 30px;
    font-weight: bold;
    text-align: left;
    color: #000;
    background-color: #fff;
}

/* Em telas estreitas (celulares), o cromo da tela encolhe: as margens acima
   foram afinadas para janelas de ~1920px e deixariam a barra com largura
   negativa num celular. */
@media (max-width: 800px) {
    .impress-progressbar {
        left: 64px;
        right: 8px;
    }

    .impress-progressbar div {
        height: 10px;
    }

    .impress-progress {
        left: 8px;
        font-size: 16px;
    }
}
