/* ════════════════════════════════════════════════════════════════
   VARIÁVEIS GLOBAIS — Design System
   Centraliza todas as cores, gradientes e transições do site.
   Alterar aqui reflete automaticamente em TODO o projeto.
════════════════════════════════════════════════════════════════ */
:root {
  /* Cores de fundo e texto */
  --bg-dark: #050505;              /* Fundo principal — quase preto */
  --accent-primary: #7c3aed;       /* Roxo vibrante — cor de destaque principal */
  --accent-secondary: #3b82f6;     /* Azul elétrico — cor de destaque secundária */
  --text-main: #f8fafc;            /* Texto principal — branco suave */
  --text-muted: #94a3b8;           /* Texto secundário — cinza azulado */

  /* Glassmorphism — efeito de vidro fosco */
  --glass-bg: rgba(255, 255, 255, 0.03);    /* Fundo translúcido dos cards */
  --glass-border: rgba(255, 255, 255, 0.08); /* Borda sutil dos cards de vidro */

  /* Efeitos visuais */
  --scanline-color: rgba(124, 58, 237, 0.2); /* Cor da linha de scanner animada */
  --glow-opacity: 0.15;                       /* Intensidade do glow do cursor */

  /* Gradiente padrão do site (roxo → azul, diagonal 135°) */
  --gradient: linear-gradient(
    135deg,
    var(--accent-primary),
    var(--accent-secondary)
  );

  /* Transições reutilizáveis */
  --transition-slow: 0.6s cubic-bezier(0.22, 1, 0.36, 1); /* Suave com "bounce" sutil */
  --transition-fast: 0.3s ease;                            /* Rápida para micro-interações */
}

/* ────────────────────────────────────────────────────────────────
   TEMA CLARO — Sobrescreve apenas as variáveis de cor.
   Ativado pelo JavaScript ao adicionar data-theme="light" no <html>.
   Todos os outros estilos continuam funcionando automaticamente.
────────────────────────────────────────────────────────────────── */
[data-theme="light"] {
  --bg-dark: #f8fafc;              /* Fundo claro — quase branco */
  --text-main: #0f172a;            /* Texto escuro — quase preto */
  --text-muted: #475569;           /* Texto secundário — cinza médio */
  --glass-bg: rgba(0, 0, 0, 0.05);    /* Cards com fundo claro translúcido */
  --glass-border: rgba(0, 0, 0, 0.1); /* Borda visível no tema claro */
  --scanline-color: rgba(124, 58, 237, 0.05); /* Scanline quase invisível no claro */
  --glow-opacity: 0.3;             /* Glow mais intenso para compensar o fundo claro */
}

/* ────────────────────────────────────────────────────────────────
   VIEW TRANSITIONS API — Troca de tema suave
   A API nativa View Transitions permite animar a troca de tema
   (claro/escuro) como se fosse uma transição de página inteira.
   Aqui desativamos a animação padrão para controlar o z-index
   manualmente e evitar flashes indesejados.
────────────────────────────────────────────────────────────────── */
::view-transition-old(root),
::view-transition-new(root) {
  animation: none;       /* Remove a animação padrão da API */
  mix-blend-mode: normal;
}

::view-transition-old(root) {
  z-index: 1;    /* Estado antigo fica por baixo durante a troca */
}

::view-transition-new(root) {
  z-index: 9999; /* Novo estado aparece por cima, garantindo transição limpa */
}

/* ════════════════════════════════════════════════════════════════
   RESET & BASE — Estilos fundamentais aplicados a todos os elementos
════════════════════════════════════════════════════════════════ */

/* Reset universal: remove margens e paddings padrão do navegador.
   box-sizing: border-box faz padding e border não aumentar o tamanho do elemento. */
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  scroll-behavior: smooth; /* Rolagem suave ao clicar em âncoras */
}

/* Configuração base do body: cor de fundo, fonte padrão e prevenção de scroll horizontal */
body {
  background-color: var(--bg-dark);
  font-family: "Inter", sans-serif; /* Fonte do texto corrido — legível e moderna */
  color: var(--text-main);
  overflow-x: hidden; /* Impede scroll horizontal indesejado em mobile */
  line-height: 1.6;   /* Espaçamento entre linhas confortável para leitura */
}

/* Títulos e logo usam a fonte Outfit — mais expressiva e geométrica */
h1,
h2,
h3,
.logo {
  font-family: "Outfit", sans-serif;
  font-weight: 800;
}

/* Container centralizado com largura máxima — mantém o conteúdo alinhado */
.container {
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 20px; /* Padding lateral para não grudar nas bordas em telas pequenas */
}

/* ════════════════════════════════════════════════════════════════
   LOADER — Tela de carregamento inicial
   Cobre a página inteira durante o carregamento. O JavaScript
   remove essa camada com fadeOut após os assets carregarem.
════════════════════════════════════════════════════════════════ */
.loader-wrapper {
  position: fixed;
  inset: 0;           /* Cobre toda a viewport */
  background: var(--bg-dark);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 9999;       /* Fica acima de absolutamente tudo */
}

/* ════════════════════════════════════════════════════════════════
   EFEITO SCANLINE (CRT / Monitor Retrô)
   Simula as linhas horizontais de um monitor CRT antigo.
   Aplicado via body::before como camada fixa transparente.
   pointer-events: none garante que não bloqueie cliques.
════════════════════════════════════════════════════════════════ */
body::before {
  content: "";
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  /* Duas camadas de gradiente sobrepostas:
     1. Linhas horizontais escuras a cada 4px (efeito scan)
     2. Leve aberração cromática RGB nas bordas laterais */
  background: linear-gradient(
    rgba(18, 16, 16, 0) 50%,
    rgba(0, 0, 0, 0.25) 50%
  ),
  linear-gradient(
    90deg,
    rgba(255, 0, 0, 0.06),
    rgba(0, 255, 0, 0.02),
    rgba(0, 0, 255, 0.06)
  );
  background-size: 100% 4px, 3px 100%;
  z-index: 9998;
  pointer-events: none; /* Transparente para interações do usuário */
  opacity: 0.15;        /* Sutil — apenas visível em telas escuras */
}

/* ────────────────────────────────────────────────────────────────
   LINHA DE SCANNER ANIMADA
   Uma linha violeta que desce continuamente pela tela, como
   um scanner ou radar. Reforça a estética futurista.
────────────────────────────────────────────────────────────────── */
body::after {
  content: "";
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 2px;
  background: var(--scanline-color);
  z-index: 9999;
  pointer-events: none;
  animation: scanline 8s linear infinite; /* 8s para um ciclo completo */
  box-shadow: 0 0 15px rgba(124, 58, 237, 0.5); /* Glow violeta na linha */
}

/* A linha começa acima da viewport e termina abaixo — loop infinito */
@keyframes scanline {
  0%   { transform: translateY(-100vh); }
  100% { transform: translateY(100vh); }
}

/* Spinner de carregamento — anel que gira continuamente */
.loader {
  width: 60px;
  height: 60px;
  border: 3px solid var(--glass-border);       /* Anel base transparente */
  border-top: 3px solid var(--accent-primary); /* Arco superior colorido cria o efeito de giro */
  border-radius: 50%;
  animation: spin 1s linear infinite;
}

@keyframes spin {
  to { transform: rotate(360deg); } /* Rotação completa para criar o loop do spinner */
}

/* ════════════════════════════════════════════════════════════════
   TEXTO COM GRADIENTE
   Aplica o gradiente roxo→azul diretamente no texto.
   Técnica: aplica o gradiente como background, depois "recorta"
   o background apenas na forma do texto com background-clip.
════════════════════════════════════════════════════════════════ */
.gradient-text {
  background: var(--gradient);
  -webkit-background-clip: text; /* Suporte legacy para Safari */
  background-clip: text;         /* Padrão moderno */
  -webkit-text-fill-color: transparent; /* Torna o preenchimento do texto transparente */
}

/* ════════════════════════════════════════════════════════════════
   GLOW DO CURSOR (Mouse Follower)
   Um halo de luz violeta que segue o mouse pela página.
   Posicionado via JavaScript que atualiza left/top continuamente.
   filter: blur cria o efeito de "nuvem luminosa" difusa.
════════════════════════════════════════════════════════════════ */
.cursor-glow {
  position: fixed;
  width: 500px;
  height: 500px;
  background: radial-gradient(
    circle,
    rgba(124, 58, 237, var(--glow-opacity)) 0%, /* Centro: violeta semi-transparente */
    transparent 70%                              /* Bordas: totalmente transparente */
  );
  border-radius: 50%;
  pointer-events: none;          /* Não interfere com cliques */
  z-index: -1;                   /* Fica atrás de todo o conteúdo */
  transform: translate(-50%, -50%); /* Centraliza o glow no ponto do cursor */
  filter: blur(40px);            /* Suaviza as bordas — cria o efeito de aura */
}

/* ════════════════════════════════════════════════════════════════
   HEADER / NAVEGAÇÃO
   Fixo no topo, fica transparente ao topo da página e
   ganha fundo de vidro fosco ao rolar (classe .scrolled).
════════════════════════════════════════════════════════════════ */
header {
  position: fixed;  /* Permanece visível durante a rolagem */
  top: 0;
  left: 0;
  width: 100%;
  padding: 20px 0;
  z-index: 1000;    /* Acima do conteúdo, abaixo do loader e lightbox */
  transition: var(--transition-fast);
}

/* Estado após rolagem: glassmorphism aplicado pelo JavaScript */
header.scrolled {
  background: rgba(5, 5, 5, 0.8);  /* Fundo semi-opaco escuro */
  backdrop-filter: blur(10px);     /* Efeito de vidro fosco sobre o conteúdo abaixo */
  border-bottom: 1px solid var(--glass-border);
  padding: 15px 0; /* Reduz o padding para "encolher" o header ao rolar */
}

header nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.logo {
  font-size: 1.8rem;
  letter-spacing: 2px;
  position: relative;
}

.logo a {
  text-decoration: none;
  color: inherit;
}

/* Pseudo-elemento decorativo para o Logo */
/* Cria um bracket "[" que aparece suavemente à esquerda ao passar o mouse */
.logo::before {
  content: "[";
  position: absolute;
  left: -20px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--accent-primary);
  opacity: 0;
  transition: all 0.3s ease;
  font-family: inherit;
}

/* Cria um bracket "]" que aparece suavemente à direita ao passar o mouse */
.logo::after {
  content: "]";
  position: absolute;
  right: -20px;
  top: 50%;
  transform: translateY(-50%);
  color: var(--accent-primary);
  opacity: 0;
  transition: all 0.3s ease;
  font-family: inherit;
}

/* Efeito ao passar o mouse no Logo: brackets aparecem e "abraçam" o nome */
.logo:hover::before {
  left: -15px;
  opacity: 1;
}

.logo:hover::after {
  right: -15px;
  opacity: 1;
}

.nav-links {
  display: flex;
  list-style: none;
  gap: 40px;
  align-items: center;
}

.nav-links a:not(.btn-primary) {
  text-decoration: none;
  color: var(--text-muted);
  font-size: 0.9rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 1px;
  transition: var(--transition-fast);
  position: relative;
  padding: 5px 0;
}

/* Efeito de Sublinhado Animado (Sliding Underline) apenas para links normais */
.nav-links a:not(.btn-primary)::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 50%;
  width: 0;
  height: 2px;
  background: var(--gradient);
  transition: all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55);
  transform: translateX(-50%);
  border-radius: 2px;
}

/* Hover: apenas para links normais */
.nav-links a:not(.btn-primary):hover {
  color: var(--text-main);
  transform: scale(1.05);
  text-shadow: 0 0 10px rgba(124, 58, 237, 0.3);
}

.nav-links a:not(.btn-primary):hover::after,
.nav-links a.active:not(.btn-primary)::after {
  width: 100%;
}

.nav-links a.active:not(.btn-primary) {
  color: var(--text-main);
}

.menu-toggle {
  display: none;
  cursor: pointer;
}

.theme-toggle {
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  color: var(--text-main);
  width: 40px;
  height: 40px;
  border-radius: 12px;
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
  transition: var(--transition-fast);
  margin-left: 20px;
}

.theme-toggle:hover {
  background: var(--accent-primary);
  color: white;
  border-color: var(--accent-primary);
  transform: translateY(-2px);
}

.theme-toggle i {
  width: 20px;
  height: 20px;
}

/* ════════════════════════════════════════════════════════════════
   BOTÕES — Dois estilos: primário (gradiente) e secundário (outline)
════════════════════════════════════════════════════════════════ */

/* Botão principal: preenchido com gradiente roxo→azul */
.btn-primary {
  background: var(--gradient);
  color: white;
  padding: 12px 28px;
  border-radius: 50px; /* Formato "pill" — bordas completamente arredondadas */
  text-decoration: none;
  font-weight: 600;
  border: none;
  cursor: pointer;
  transition: var(--transition-fast);
  display: inline-block;
}

/* Hover: sobe levemente e ganha sombra violeta — efeito de elevação */
.btn-primary:hover {
  transform: translateY(-2px);
  box-shadow: 0 10px 20px rgba(124, 58, 237, 0.3);
}

/* Botão secundário: apenas borda, fundo transparente — estilo "ghost" */
.btn-secondary {
  border: 1px solid var(--glass-border);
  color: var(--text-main);
  padding: 12px 28px;
  border-radius: 50px;
  text-decoration: none;
  font-weight: 600;
  transition: var(--transition-fast);
}

/* Hover: ganha fundo translúcido sutil */
.btn-secondary:hover {
  background: var(--glass-bg);
  border-color: var(--text-muted);
}

/* Botão de Retorno ao Projeto Principal */
.btn-back-main {
  position: absolute;
  top: 100px;
  left: 20px;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 10px 20px;
  background: var(--glass-bg);
  border: 1px solid var(--accent-secondary);
  color: var(--accent-secondary);
  text-decoration: none;
  font-family: var(--font-heading);
  font-size: 0.8rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 1px;
  border-radius: 8px;
  backdrop-filter: blur(5px);
  transition: var(--transition-fast);
  z-index: 100;
  animation: fadeInUp 1s ease forwards 1s;
  opacity: 0;
}

.btn-back-main:hover {
  background: var(--accent-secondary);
  color: #fff;
  box-shadow: 0 0 20px var(--accent-secondary);
  transform: translateX(5px);
}

/* ════════════════════════════════════════════════════════════════
   SEÇÃO HERO — Tela inicial de impacto (index.html)
   Ocupa 100% da altura da viewport. Contém texto de apresentação
   à esquerda e card visual com foto à direita.
════════════════════════════════════════════════════════════════ */
.hero {
  height: 100vh;     /* Ocupa toda a altura da tela */
  display: flex;
  align-items: center;
  position: relative;
  padding-top: 80px; /* Compensa a altura do header fixo */
  overflow: hidden;  /* Impede que animações de partículas causem scroll */
}

#hero-particles {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  z-index: 1;
  pointer-events: none;
}

.hero-content {
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: center;
  gap: 60px;
  position: relative;
  z-index: 2;
}

.badge {
  display: inline-block;
  padding: 6px 16px;
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  border-radius: 20px;
  font-size: 0.8rem;
  text-transform: uppercase;
  letter-spacing: 1px;
  margin-bottom: 20px;
}

.hero-text h1 {
  font-size: 4rem;
  line-height: 1.1;
  margin-bottom: 25px;
  position: relative;
  cursor: pointer;
}

/* Animação SURPRESA: Efeito de Brilho Corrediço (Shimmer) constante */
.hero-text h1::before {
  content: "Ivanildo Melo";
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  color: transparent;
  background: linear-gradient(
    90deg,
    transparent,
    rgba(255, 255, 255, 0.4),
    transparent
  );
  background-size: 200% 100%;
  -webkit-background-clip: text;
  background-clip: text;
  animation: shine 3s infinite linear;
  pointer-events: none;
  z-index: 1;
}

@keyframes shine {
  0% { background-position: -200% 0; }
  100% { background-position: 200% 0; }
}

/* Animação de Glitch Estiloso ao passar o mouse */
.hero-text h1:hover {
  animation: glitch 0.3s cubic-bezier(.25, .46, .45, .94) both infinite;
}

@keyframes glitch {
  0% {
    transform: translate(0);
    text-shadow: 0 0 0 transparent;
  }
  20% {
    transform: translate(-3px, 3px);
    text-shadow: 2px 0 var(--accent-primary), -2px 0 var(--accent-secondary);
  }
  40% {
    transform: translate(-3px, -3px);
    text-shadow: -2px 0 var(--accent-primary), 2px 0 var(--accent-secondary);
  }
  60% {
    transform: translate(3px, 3px);
    text-shadow: 2px 0 var(--accent-secondary), -2px 0 var(--accent-primary);
  }
  80% {
    transform: translate(3px, -3px);
    text-shadow: -2px 0 var(--accent-secondary), 2px 0 var(--accent-primary);
  }
  100% {
    transform: translate(0);
  }
}

.hero-text p {
  color: var(--text-muted);
  font-size: 1.1rem;
  margin-bottom: 40px;
  max-width: 500px;
}

.hero-btns {
  display: flex;
  gap: 20px;
}

.hero-visual {
  position: relative;
}

.glass-card {
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  border-radius: 30px;
  padding: 20px;
  backdrop-filter: blur(10px);
  overflow: hidden;
  position: relative;
  z-index: 10;
}

.glass-card img {
  width: 100%;
  border-radius: 20px;
  display: block;
  transition: var(--transition-slow);
}

.glass-card:hover img {
  transform: scale(1.05);
}

.floating-element {
  position: absolute;
  width: 100px;
  height: 100px;
  border-radius: 20px;
  background: var(--gradient);
  filter: blur(40px);
  opacity: 0.3;
  z-index: 1;
}

.element-1 {
  top: -20px;
  right: -20px;
  animation: float 6s infinite ease-in-out;
}
.element-2 {
  bottom: -20px;
  left: -20px;
  animation: float 6s infinite 3s ease-in-out;
}

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

.scroll-indicator {
  position: absolute;
  bottom: 30px;
  left: 50%;
  transform: translateX(-50%);
}

.mouse {
  width: 26px;
  height: 42px;
  border: 2px solid var(--text-muted);
  border-radius: 20px;
  position: relative;
}

.mouse::before {
  content: "";
  position: absolute;
  width: 4px;
  height: 8px;
  background: var(--text-muted);
  left: 50%;
  transform: translateX(-50%);
  top: 8px;
  border-radius: 2px;
  animation: scroll 2s infinite;
}

@keyframes scroll {
  0% {
    transform: translate(-50%, 0);
    opacity: 1;
  }
  100% {
    transform: translate(-50%, 15px);
    opacity: 0;
  }
}

/* ════════════════════════════════════════════════════════════════
   SEÇÃO SOBRE (About) — index.html
   Grid de duas colunas: texto/estatísticas à esquerda,
   card de experiência visual à direita.
════════════════════════════════════════════════════════════════ */
.about {
    padding: 150px 0;
    position: relative;
}

.about-grid {
    display: grid;
    grid-template-columns: 1.2fr 0.8fr;
    gap: 80px;
    align-items: center;
}

.stats-grid {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 20px;
    margin-top: 50px;
}

.stat-item {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    padding: 25px;
    border-radius: 20px;
    text-align: center;
    position: relative;
    overflow: hidden;
    transition: var(--transition-fast);
}

/* Pseudo-elemento para criar um brilho sutil no fundo ao passar o mouse */
.stat-item::before {
    content: "";
    position: absolute;
    top: -50%;
    left: -50%;
    width: 200%;
    height: 200%;
    background: radial-gradient(circle, rgba(124, 58, 237, 0.1) 0%, transparent 70%);
    opacity: 0;
    transition: var(--transition-slow);
    pointer-events: none;
}

.stat-item:hover {
    transform: translateY(-5px);
    border-color: var(--accent-primary);
}

.stat-item:hover::before {
    opacity: 1;
}

.stat-item h3 {
    font-size: 1.8rem;
    color: var(--accent-primary);
    margin-bottom: 5px;
}

.stat-item p {
    font-size: 0.8rem;
    text-transform: uppercase;
    letter-spacing: 1px;
    color: var(--text-muted);
}

.about-visual {
    position: relative;
    display: flex;
    justify-content: center;
}

.exp-card {
    background: var(--gradient);
    padding: 40px;
    border-radius: 30px;
    color: white;
    text-align: center;
    position: relative;
    z-index: 2;
    box-shadow: 0 20px 40px rgba(124, 58, 237, 0.3);
}

.exp-card i {
    width: 60px;
    height: 60px;
    margin-bottom: 20px;
    color: white;
}

.exp-card p {
    font-size: 1.1rem;
    font-weight: 500;
    line-height: 1.4;
}

/* --- Cabeçalhos de Seção (Pseudo-elementos decorativos) --- */
/* Esta seção utiliza pseudo-elementos para criar linhas animadas abaixo dos títulos */

.section-header {
  margin-bottom: 50px;
  position: relative;
}

.section-header .subtitle {
  display: block;
  font-size: 0.9rem;
  color: var(--accent-primary);
  text-transform: uppercase;
  letter-spacing: 2px;
  margin-bottom: 10px;
}

/* Criando uma linha decorativa usando pseudo-elemento ::after */
.section-header h2 {
  position: relative;
  display: inline-block;
}

.section-header h2::after {
  content: "";
  position: absolute;
  bottom: -15px;
  left: 0;
  width: 60px;
  height: 4px;
  background: var(--gradient);
  border-radius: 2px;
  transition: var(--transition-slow);
}

/* Efeito 'pseudo-animado' ao interagir com o cabeçalho */
.section-header:hover h2::after {
  width: 100%;
}

/* ════════════════════════════════════════════════════════════════
   SEÇÃO PORTFOLIO — index.html
   Grid de 3 colunas com cards de projeto. Cada card tem overlay
   de informações que aparece ao passar o mouse (hover reveal).
════════════════════════════════════════════════════════════════ */
.portfolio {
  padding: 100px 0;
}

.portfolio-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 20px;
}

.portfolio-item {
  position: relative;
  border-radius: 24px;
  overflow: hidden;
  aspect-ratio: 4/5;
}

.portfolio-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: var(--transition-slow);
}

.portfolio-overlay {
  position: absolute;
  inset: 0;
  background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: 30px;
  opacity: 0;
  transition: var(--transition-fast);
}

.portfolio-item:hover .portfolio-overlay {
  opacity: 1;
}

.portfolio-item:hover img {
  transform: scale(1.1);
}

/* ════════════════════════════════════════════════════════════════
   SEÇÃO CONTATO — index.html
   Card grande com glassmorphism dividido em duas colunas:
   informações de contato + redes sociais à esquerda,
   formulário de mensagem à direita.
════════════════════════════════════════════════════════════════ */
.contact {
  padding: 100px 0;
}

.contact-card {
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  border-radius: 40px;
  padding: 60px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 60px;
  align-items: center;
}

.contact-info h2 {
  font-size: 2.5rem;
  margin-bottom: 20px;
}

.contact-info p {
  color: var(--text-muted);
  margin-bottom: 40px;
}

.socials {
  display: flex;
  gap: 20px;
}

.socials a {
  color: var(--text-main);
  background: var(--glass-bg);
  width: 50px;
  height: 50px;
  display: flex;
  justify-content: center;
  align-items: center;
  border-radius: 15px;
  border: 1px solid var(--glass-border);
  transition: var(--transition-fast);
}

.socials a:hover {
  background: var(--accent-primary);
  border-color: var(--accent-primary);
}

.socials a img {
  width: 28px;
  height: 28px;
  object-fit: cover;
  border-radius: 6px;
}

/* --- Formulário de Contato Ultra-Futurista (Cyber-HUD) --- */
#contact-form-container {
  background: rgba(10, 10, 15, 0.4);
  backdrop-filter: blur(25px) saturate(180%);
  border: 1px solid rgba(124, 58, 237, 0.2);
  padding: 50px 40px;
  border-radius: 24px;
  box-shadow: 0 25px 80px rgba(0, 0, 0, 0.5),
              inset 0 0 20px rgba(124, 58, 237, 0.1);
  position: relative;
  overflow: visible; /* Necessário para os cantos HUD */
}

/* Cantos HUD Decorativos */
#contact-form-container::before,
#contact-form-container::after {
  content: "";
  position: absolute;
  width: 30px;
  height: 30px;
  border: 2px solid var(--accent-primary);
  pointer-events: none;
  z-index: 2;
  transition: all 0.5s ease;
  filter: drop-shadow(0 0 5px var(--accent-primary));
}

/* Canto Superior Esquerdo */
#contact-form-container::before {
  top: -2px;
  left: -2px;
  border-right: none;
  border-bottom: none;
  border-radius: 12px 0 0 0;
}

/* Canto Inferior Direito */
#contact-form-container::after {
  bottom: -2px;
  right: -2px;
  border-left: none;
  border-top: none;
  border-radius: 0 0 12px 0;
}

.contact-form {
  display: flex;
  flex-direction: column;
  gap: 20px;
  position: relative;
  z-index: 5;
}

.input-group {
  position: relative;
}

.input-group input,
.input-group textarea {
  width: 100%;
  background: rgba(0, 0, 0, 0.3);
  border: 1px solid rgba(255, 255, 255, 0.05);
  padding: 20px 25px;
  border-radius: 12px;
  color: white;
  font-family: inherit;
  font-size: 1rem;
  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  box-shadow: inset 0 2px 10px rgba(0, 0, 0, 0.5);
  /* Textura de Scanline sutil nos inputs */
  background-image: linear-gradient(rgba(124, 58, 237, 0.03) 1px, transparent 1px);
  background-size: 100% 3px;
}

.input-group input:focus,
.input-group textarea:focus {
  outline: none;
  background-color: rgba(124, 58, 237, 0.08);
  border-color: var(--accent-primary);
  box-shadow: 0 0 30px rgba(124, 58, 237, 0.25), 
              inset 0 0 15px rgba(124, 58, 237, 0.1);
  transform: scale(1.01);
}

/* Efeito de Feixe de Luz (Border Beam) na borda do Card de Contato */
.contact-card {
  position: relative;
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  border-radius: 40px;
  padding: 60px;
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 60px;
  align-items: center;
  overflow: hidden;
}

.contact-card::before {
  content: "";
  position: absolute;
  top: -50%;
  left: -50%;
  width: 200%;
  height: 200%;
  background: conic-gradient(
    from 180deg at 50% 50%,
    transparent 0deg,
    var(--accent-primary) 180deg,
    transparent 360deg
  );
  animation: rotate-beam 6s linear infinite;
  opacity: 0.15;
  pointer-events: none;
}

@keyframes rotate-beam {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

/* Botão de Envio de Próxima Geração */
#contact-form .btn {
  background: var(--gradient);
  color: white;
  padding: 20px 35px;
  border: none;
  border-radius: 50px;
  font-family: var(--font-heading);
  font-weight: 800;
  font-size: 0.9rem;
  letter-spacing: 3px;
  cursor: pointer;
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 15px;
  transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  box-shadow: 0 10px 40px rgba(124, 58, 237, 0.4);
  text-transform: uppercase;
  position: relative;
  overflow: hidden;
}

#contact-form .btn::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
  transform: translateX(-100%);
  transition: transform 0.6s ease;
}

#contact-form .btn:hover {
  transform: translateY(-8px) scale(1.05);
  box-shadow: 0 20px 60px rgba(124, 58, 237, 0.6);
  letter-spacing: 4px;
}

#contact-form .btn:hover::after {
  transform: translateX(100%);
}

#contact-form .btn i {
  color: var(--accent-secondary);
  filter: drop-shadow(0 0 5px white);
}

/* Mensagem de Feedback do Formulário */
.form-message {
  margin-top: 25px;
  padding: 15px;
  border-radius: 12px;
  text-align: center;
  font-family: var(--font-heading);
  font-size: 0.9rem;
  letter-spacing: 1px;
  font-weight: 700;
  text-transform: uppercase;
  display: none;
  animation: cyberSlide 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
  z-index: 10;
  position: relative;
}

.form-message.visible {
  display: block;
}

.form-message.success {
  background: rgba(16, 185, 129, 0.1);
  border: 1px solid #10b981;
  color: #10b981;
  box-shadow: 0 0 20px rgba(16, 185, 129, 0.3), inset 0 0 10px rgba(16, 185, 129, 0.1);
}

.form-message.error {
  background: rgba(239, 68, 68, 0.1);
  border: 1px solid #ef4444;
  color: #ef4444;
}

@keyframes cyberSlide {
  from { opacity: 0; transform: translateY(20px) scale(0.9); filter: blur(10px); }
  to { opacity: 1; transform: translateY(0) scale(1); filter: blur(0); }
}

/* ════════════════════════════════════════════════════════════════
   FOOTER — Rodapé de todas as páginas
   Linha simples com copyright à esquerda e links rápidos à direita.
════════════════════════════════════════════════════════════════ */
footer {
  padding: 40px 0;
  border-top: 1px solid var(--glass-border);
}

.footer-content {
  display: flex;
  justify-content: space-between;
  align-items: center;
}

.footer-content p {
  color: var(--text-muted);
  font-size: 0.9rem;
}

.footer-links {
  display: flex;
  gap: 30px;
}

.footer-links a {
  text-decoration: none;
  color: var(--text-muted);
  font-size: 0.9rem;
}

/* ════════════════════════════════════════════════════════════════
   RESPONSIVIDADE — Media Queries
   Adapta o layout para diferentes tamanhos de tela.
   Estratégia: desktop-first (estilos base = desktop,
   media queries reduzem para telas menores).
════════════════════════════════════════════════════════════════ */

/* ── Tablets grandes (≤ 1200px) ── */
@media (max-width: 1200px) {
  .container {
    padding: 0 40px;
  }
}

/* ── Tablets (≤ 992px): colapsa grids de 2 colunas para 1 coluna ── */
@media (max-width: 992px) {
  .hero-content {
    grid-template-columns: 1fr;
    text-align: center;
    gap: 40px;
  }
  .hero-text p {
    margin-left: auto;
    margin-right: auto;
  }
  .hero-btns {
    justify-content: center;
  }
  .about-grid {
    grid-template-columns: 1fr;
    gap: 50px;
  }
  .services-grid,
  .portfolio-grid {
    grid-template-columns: repeat(2, 1fr);
  }
  .contact-card {
    grid-template-columns: 1fr;
    padding: 40px;
  }
  .subpage-hero h1 {
    font-size: 3.5rem;
  }
}

/* ── Mobile (≤ 768px): menu hamburguer, layout em coluna única ── */
@media (max-width: 768px) {
  header {
    padding: 15px 0;
  }
  
  .menu-toggle {
    display: block;
    z-index: 1001;
  }

  .nav-links {
    position: fixed;
    top: 0;
    right: -100%;
    width: 80%;
    height: 100vh;
    background: rgba(10, 10, 10, 0.98);
    backdrop-filter: blur(20px);
    flex-direction: column;
    justify-content: center;
    gap: 30px;
    transition: var(--transition-slow);
    border-left: 1px solid var(--glass-border);
    z-index: 1000;
  }

  .nav-links.active {
    right: 0;
  }

  .hero-text h1 {
    font-size: 2.8rem;
  }
  
  .stats-grid {
    grid-template-columns: 1fr;
  }

  .services-grid,
  .portfolio-grid {
    grid-template-columns: 1fr;
  }
  
  .footer-content {
    flex-direction: column;
    gap: 30px;
    text-align: center;
  }
  
  .footer-links {
    justify-content: center;
  }

  .subpage-hero h1 {
    font-size: 2.5rem;
  }

  .timeline {
    padding-left: 20px;
  }
  
  .project-large-card {
    padding: 30px;
    border-radius: 30px;
  }
  
  .project-info-box h3 {
    font-size: 1.8rem;
  }
}

/* ── Mobile pequeno (≤ 480px): ajustes finos de fonte e botões ── */
@media (max-width: 480px) {
    .container {
        padding: 0 20px;
    }
    .hero-text h1 {
        font-size: 2.2rem;
    }
    .hero-btns {
        flex-direction: column;
        width: 100%;
    }
    .hero-btns a {
        width: 100%;
        text-align: center;
    }
}

/* ════════════════════════════════════════════════════════════════
   BOTÃO FLUTUANTE DO WHATSAPP
   Fixo no canto inferior direito. Verde característico do WhatsApp.
   Hover: cresce levemente e sobe (efeito de levitação).
════════════════════════════════════════════════════════════════ */
.whatsapp-float {
    position: fixed;
    bottom: 30px;
    right: 30px;
    width: 50px;
    height: 50px;
    background: #25d366;
    color: white;
    border-radius: 50%;
    display: flex;
    justify-content: center;
    align-items: center;
    box-shadow: 0 8px 15px rgba(37, 211, 102, 0.3);
    z-index: 1000;
    transition: var(--transition-fast);
    text-decoration: none;
}

.whatsapp-float:hover {
    transform: scale(1.1) translateY(-5px);
    box-shadow: 0 15px 30px rgba(37, 211, 102, 0.4);
}

.whatsapp-float i {
    width: 30px;
    height: 30px;
}


@media (max-width: 768px) {
    .chatbox-container {
        width: calc(100vw - 40px);
        right: -10px;
        bottom: 70px;
    }
}

/* ════════════════════════════════════════════════════════════════
   HERO DAS SUBPÁGINAS — trajetoria.html, projetos.html
   Versão mais compacta do hero principal. Centralizado, com
   gradiente radial sutil no fundo para dar profundidade.
════════════════════════════════════════════════════════════════ */
.subpage-hero {
    padding: 180px 0 100px;
    text-align: center;
    background: radial-gradient(circle at top, rgba(124, 58, 237, 0.05) 0%, transparent 70%);
}

.subpage-hero h1 {
    font-size: 4.5rem;
    margin: 20px 0;
}

.subpage-hero p {
    font-size: 1.25rem;
    color: var(--text-muted);
    max-width: 700px;
    margin: 0 auto;
}

/* ════════════════════════════════════════════════════════════════
   TIMELINE — Linha do Tempo (trajetoria.html)
   Linha vertical à esquerda com dots violeta nos marcos.
   Cada item desliza levemente para a direita ao hover.
   ::before cria a linha vertical usando pseudoelemento absoluto.
════════════════════════════════════════════════════════════════ */
.timeline-section {
    padding: 100px 0;
}

.timeline {
    max-width: 800px;
    margin: 0 auto;
    position: relative;
    padding-left: 40px;
}

.timeline::before {
    content: '';
    position: absolute;
    left: 0;
    top: 0;
    width: 2px;
    height: 100%;
    background: var(--glass-border);
}

.timeline-item {
    position: relative;
    margin-bottom: 60px;
}

.timeline-dot {
    position: absolute;
    left: -49px;
    top: 0;
    width: 18px;
    height: 18px;
    background: var(--accent-primary);
    border-radius: 50%;
    border: 4px solid var(--bg-dark);
    box-shadow: 0 0 15px var(--accent-primary);
    z-index: 2;
}

.timeline-content {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    padding: 30px;
    border-radius: 20px;
    transition: var(--transition-fast);
}

.timeline-content:hover {
    border-color: var(--accent-primary);
    transform: translateX(10px);
}

.timeline-content .date {
    display: block;
    color: var(--accent-primary);
    font-weight: 700;
    margin-bottom: 10px;
    font-size: 0.9rem;
}

.timeline-content h3 {
    margin-bottom: 15px;
}

.timeline-content p {
    color: var(--text-muted);
}

/* ════════════════════════════════════════════════════════════════
   SKILLS / HABILIDADES (trajetoria.html)
   Grid flexível de tags pill. Cada tag ganha fundo violeta
   e sobe ao hover (transform: translateY).
════════════════════════════════════════════════════════════════ */
.skills-highlight {
    padding: 100px 0;
    background: rgba(255, 255, 255, 0.02);
}

.skills-grid {
    display: flex;
    flex-wrap: wrap;
    gap: 15px;
    justify-content: center;
    margin-top: 40px;
}

.skill-tag {
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    padding: 12px 24px;
    border-radius: 50px;
    font-weight: 600;
    font-size: 0.9rem;
    transition: var(--transition-fast);
}

.skill-tag:hover {
    background: var(--accent-primary);
    border-color: var(--accent-primary);
    transform: translateY(-5px);
}

/* ════════════════════════════════════════════════════════════════
   PROJETOS DETALHADOS (projetos.html)
   Cards grandes em grid de 1 coluna. Cada card tem imagem
   à esquerda e texto à direita (grid 1fr 1fr).
   Hover: sobe 10px e destaca a borda com accent-secondary (azul).
   A imagem faz zoom suave dentro do card ao hover.
════════════════════════════════════════════════════════════════ */
.projects-list {
    padding: 100px 0;
}

.project-detailed-grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 60px;
}

.project-large-card {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 50px;
    align-items: center;
    background: var(--glass-bg);
    border: 1px solid var(--glass-border);
    border-radius: 40px;
    padding: 40px;
    transition: var(--transition-slow);
}

.project-large-card:hover {
    border-color: var(--accent-secondary);
    transform: translateY(-10px);
}

.project-img-box {
    border-radius: 30px;
    overflow: hidden;
    aspect-ratio: 16/10;
}

.project-img-box img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    transition: var(--transition-slow);
}

.project-large-card:hover .project-img-box img {
    transform: scale(1.05);
}

.project-info-box .category {
    color: var(--accent-secondary);
    font-weight: 700;
    font-size: 0.8rem;
    text-transform: uppercase;
    letter-spacing: 2px;
}

.project-info-box h3 {
    font-size: 2.2rem;
    margin: 15px 0 20px;
}

.project-info-box p {
    color: var(--text-muted);
    margin-bottom: 30px;
    font-size: 1.1rem;
}

.tech-used {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    list-style: none;
}

.tech-used li {
    background: rgba(59, 130, 246, 0.1);
    color: var(--accent-secondary);
    padding: 6px 14px;
    border-radius: 8px;
    font-size: 0.8rem;
    font-weight: 600;
}


/* ============================================================
   PÁGINA DE FOTOS — CARROSSEL PREMIUM (fotos.html)
============================================================ */

/* ── Hero da subpágina de fotos ── */
.photos-hero {
  padding: 140px 0 60px;
  text-align: center;
  position: relative;
  overflow: hidden;
}
.photos-hero::before {
  content: "";
  position: absolute;
  width: 600px;
  height: 600px;
  background: radial-gradient(circle, rgba(124,58,237,0.18) 0%, transparent 70%);
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  pointer-events: none;
  z-index: 0;
}
.photos-hero .container { position: relative; z-index: 1; }
.photos-hero h1 { font-size: 3.5rem; margin: 16px 0; }
.photos-hero p  { color: var(--text-muted); font-size: 1.1rem; max-width: 560px; margin: 0 auto; }

/* ── Seção e wrapper do carrossel ── */
.carousel-section  { padding: 20px 0 100px; }
.carousel-wrapper  { position: relative; max-width: 1100px; margin: 0 auto; padding: 0 40px; }

/* ── Stage (janela principal) ── */
.carousel-stage {
  position: relative;
  width: 100%;
  aspect-ratio: 4 / 3;
  border-radius: 24px;
  overflow: hidden;
  background: #0a0a0f;
  border: 1px solid var(--glass-border);
  box-shadow:
    0 0 0 1px rgba(124,58,237,0.2),
    0 40px 80px rgba(0,0,0,0.7),
    0 0 60px rgba(124,58,237,0.08);
}

/* ── Cada slide ── */
.carousel-slide {
  position: absolute;
  inset: 0;
  opacity: 0;
  pointer-events: none;
  will-change: transform, opacity, filter;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}

/* Fundo desfocado da mesma foto (backdrop) */
.carousel-slide::before {
  content: "";
  position: absolute;
  inset: -10px;
  background-image: var(--bg-src);
  background-size: cover;
  background-position: center;
  filter: blur(22px) brightness(0.35) saturate(0.7);
  transform: scale(1.1);
  z-index: 0;
  pointer-events: none;
}

/* Foto principal — INTEIRA, sem cortes */
.carousel-slide img {
  position: relative;
  z-index: 1;
  max-width: 100%;
  max-height: 100%;
  width: auto;
  height: auto;
  object-fit: contain;
  display: block;
  user-select: none;
  pointer-events: none;
  border-radius: 8px;
  box-shadow: 0 8px 40px rgba(0,0,0,0.5);
  cursor: zoom-in;
}

/* Slide ativo */
.carousel-slide.active { opacity: 1; pointer-events: auto; z-index: 2; }

/* ═══════════════════════════════════════════════════════════════
   13 EFEITOS DE TRANSIÇÃO ÚNICOS — cada foto usa um efeito próprio
   Cada efeito é composto por duas animações:
     .entering → como a nova foto ENTRA na tela
     .leaving  → como a foto atual SAI da tela
   Todos são aplicados via atributo data-fx no HTML do slide.
═══════════════════════════════════════════════════════════════ */

/* ──────────────────────────────────────────────────────────────────
   ①  FADE SUAVE  |  data-fx="fade"
   Efeito: dissolução simples — a foto vai de transparente a opaco e
   vice-versa. O transition CSS cuida da saída; a animation cuida da
   entrada. Duração: 1s entrada / 0.7s saída.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="fade"] { transition: opacity 1s ease; }
.carousel-slide[data-fx="fade"].leaving  { opacity: 0; transition: opacity 0.7s ease; }
.carousel-slide[data-fx="fade"].entering { animation: fx1-in 1s ease forwards; }
@keyframes fx1-in { from { opacity:0; } to { opacity:1; } }

/* ──────────────────────────────────────────────────────────────────
   ②  SLIDE DA DIREITA  |  data-fx="slide-right"
   Efeito: a nova foto entra deslizando da direita para o centro.
   A foto atual sai deslizando para a esquerda com fade.
   Usa curva cubic-bezier para um "overshoot" suave e natural.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="slide-right"].entering { animation: fx2-in  0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="slide-right"].leaving  { animation: fx2-out 0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
@keyframes fx2-in  { from { transform:translateX(100%);  opacity:0.4; } to { transform:translateX(0);    opacity:1; } }
@keyframes fx2-out { from { transform:translateX(0);     opacity:1;   } to { transform:translateX(-60%); opacity:0; } }

/* ──────────────────────────────────────────────────────────────────
   ③  SLIDE DA ESQUERDA  |  data-fx="slide-left"
   Efeito: inverso do anterior — a nova foto surge pela esquerda.
   A foto atual escapa para a direita. Cria ilusão de retroceder
   no carrossel, ideal para navegação pelo botão "anterior".
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="slide-left"].entering { animation: fx3-in  0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="slide-left"].leaving  { animation: fx3-out 0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
@keyframes fx3-in  { from { transform:translateX(-100%); opacity:0.4; } to { transform:translateX(0);   opacity:1; } }
@keyframes fx3-out { from { transform:translateX(0);     opacity:1;   } to { transform:translateX(60%); opacity:0; } }

/* ──────────────────────────────────────────────────────────────────
   ④  ZOOM SUAVE  |  data-fx="zoom-in"
   Efeito: a nova foto "cresce" de 75% até 100% surgindo do centro.
   A foto atual "encolhe" para 110% enquanto desaparece (zoom out).
   Cria uma sensação de profundidade e foco.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="zoom-in"].entering { animation: fx4-in  0.9s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="zoom-in"].leaving  { animation: fx4-out 0.7s ease forwards; }
@keyframes fx4-in  { from { opacity:0; transform:scale(0.75); } to { opacity:1; transform:scale(1);   } }
@keyframes fx4-out { from { opacity:1; transform:scale(1);    } to { opacity:0; transform:scale(1.1); } }

/* ──────────────────────────────────────────────────────────────────
   ⑤  FLIP 3D  |  data-fx="flip"
   Efeito: a foto gira no eixo Y como se fosse uma carta virada.
   A saída inclina 70° para trás; a entrada parte de -70° e se
   endireita. Usa perspective(1200px) para realismo tridimensional.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="flip"] { perspective: 1200px; }
.carousel-slide[data-fx="flip"].entering { animation: fx5-in  0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="flip"].leaving  { animation: fx5-out 0.85s ease forwards; }
@keyframes fx5-in  { from { opacity:0; transform:perspective(1200px) rotateY(-70deg) scale(0.9); } to { opacity:1; transform:perspective(1200px) rotateY(0deg)  scale(1);   } }
@keyframes fx5-out { from { opacity:1; transform:perspective(1200px) rotateY(0deg)   scale(1);   } to { opacity:0; transform:perspective(1200px) rotateY(70deg) scale(0.9); } }

/* ──────────────────────────────────────────────────────────────────
   ⑥  BLUR DISSOLVE  |  data-fx="blur"
   Efeito: a foto aparece saindo de um borrão (blur 24px) para
   nítida. A saída faz o caminho inverso — fica cada vez mais
   embaçada até sumir. Cria efeito de "foco de câmera".
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="blur"].entering { animation: fx6-in  1s    ease forwards; }
.carousel-slide[data-fx="blur"].leaving  { animation: fx6-out 0.75s ease forwards; }
@keyframes fx6-in  { from { opacity:0; filter:blur(24px) brightness(0.5); } to { opacity:1; filter:blur(0px) brightness(1);   } }
@keyframes fx6-out { from { opacity:1; filter:blur(0px);                   } to { opacity:0; filter:blur(24px) brightness(0.3); } }

/* ──────────────────────────────────────────────────────────────────
   ⑦  SLIDE DE CIMA  |  data-fx="slide-up"
   Efeito: a nova foto desce de cima para o centro da tela.
   A foto atual escorrega para baixo e desaparece. Cria ritmo
   vertical diferente das transições horizontais.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="slide-up"].entering { animation: fx7-in  0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="slide-up"].leaving  { animation: fx7-out 0.75s ease forwards; }
@keyframes fx7-in  { from { transform:translateY(-100%); opacity:0.4; } to { transform:translateY(0);   opacity:1; } }
@keyframes fx7-out { from { transform:translateY(0);     opacity:1;   } to { transform:translateY(60%); opacity:0; } }

/* ──────────────────────────────────────────────────────────────────
   ⑧  SLIDE DE BAIXO  |  data-fx="slide-down"
   Efeito: inverso do slide-up — a foto nova sobe de baixo.
   A foto atual escapa para cima. Combinado com o slide-up,
   os dois criam uma sensação de carrossel vertical alternado.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="slide-down"].entering { animation: fx8-in  0.85s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="slide-down"].leaving  { animation: fx8-out 0.75s ease forwards; }
@keyframes fx8-in  { from { transform:translateY(100%); opacity:0.4; } to { transform:translateY(0);    opacity:1; } }
@keyframes fx8-out { from { transform:translateY(0);    opacity:1;   } to { transform:translateY(-60%); opacity:0; } }

/* ──────────────────────────────────────────────────────────────────
   ⑨  ROTAÇÃO & ESCALA  |  data-fx="rotate-scale"
   Efeito: a foto surge girando levemente (-12°→0°) enquanto
   cresce de 70% para 100%. A saída gira no sentido oposto e encolhe.
   Dá um efeito dinâmico e "dramático" à transição.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="rotate-scale"].entering { animation: fx9-in  0.95s cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="rotate-scale"].leaving  { animation: fx9-out 0.75s ease forwards; }
@keyframes fx9-in  { from { opacity:0; transform:rotate(-12deg) scale(0.7); } to { opacity:1; transform:rotate(0deg)  scale(1);   } }
@keyframes fx9-out { from { opacity:1; transform:rotate(0deg)   scale(1);   } to { opacity:0; transform:rotate(12deg)  scale(0.7); } }

/* ──────────────────────────────────────────────────────────────────
   ⑩  DESVANECIMENTO COLORIDO  |  data-fx="curtain"
   Efeito: a foto entra com hue-rotate(180°) — completamente
   colorida de forma invertida — e vai gradualmente voltando às
   cores reais. A saída inverte o processo. Cria um efeito artístico
   de "revelação cromática" único.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="curtain"].entering { animation: fx10-in  1s    ease forwards; }
.carousel-slide[data-fx="curtain"].leaving  { animation: fx10-out 0.8s  ease forwards; }
@keyframes fx10-in {
  /* Começa com cores totalmente invertidas e supersaturadas */
  0%   { opacity:0; filter:hue-rotate(180deg) saturate(3)   brightness(0.4); transform:scale(0.96); }
  /* No meio do caminho, cores ainda ligeiramente alteradas */
  60%  { opacity:1; filter:hue-rotate(20deg)  saturate(1.5) brightness(1.1); transform:scale(1.01); }
  /* Termina com a foto em suas cores naturais */
  100% { opacity:1; filter:hue-rotate(0deg)   saturate(1)   brightness(1);   transform:scale(1);    }
}
@keyframes fx10-out {
  from { opacity:1; filter:hue-rotate(0deg)    saturate(1); }
  to   { opacity:0; filter:hue-rotate(-180deg) saturate(2) brightness(0.3); transform:scale(0.96); }
}

/* ──────────────────────────────────────────────────────────────────
   ⑪  PULSE GLOW  |  data-fx="pulse"
   Efeito: a foto irrompe com um brilho violeta intenso (drop-shadow
   + brightness aumentados), como se fosse uma explosão de luz.
   Depois se estabiliza suavemente. A saída faz um flash brilhante
   antes de desaparecer. Efeito estilo "flashlight" futurista.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="pulse"].entering { animation: fx11-in  1s    ease forwards; }
.carousel-slide[data-fx="pulse"].leaving  { animation: fx11-out 0.75s ease forwards; }
@keyframes fx11-in {
  /* Começa escuro e pequeno, sem brilho */
  0%   { opacity:0; filter:brightness(0.2) drop-shadow(0 0 0px  #7c3aed); transform:scale(0.88); }
  /* Pico do brilho — foto superiluminada com glow violeta forte */
  40%  { opacity:1; filter:brightness(1.6) drop-shadow(0 0 40px #7c3aed); transform:scale(1.04); }
  /* Começa a normalizar com glow mais suave */
  70%  {            filter:brightness(1.1) drop-shadow(0 0 15px #7c3aed); transform:scale(0.99); }
  /* Estado final — foto na luminosidade normal, sem glow */
  100% { opacity:1; filter:brightness(1)   drop-shadow(0 0 0px transparent); transform:scale(1); }
}
@keyframes fx11-out {
  from { opacity:1; filter:brightness(1); }
  /* Sai com um flash brilhante — como uma explosão de luz ao deixar a tela */
  to   { opacity:0; filter:brightness(2.5) drop-shadow(0 0 30px #7c3aed); transform:scale(1.06); }
}

/* ──────────────────────────────────────────────────────────────────
   ⑫  GLITCH DIGITAL  |  data-fx="glitch"
   Efeito: imita falhas de sinal digital/VHS. A foto aparece com
   deslocamentos aleatórios (translate + skewX) e mudanças rápidas
   de cor (hue-rotate). Usa steps() para criar a sensação de "frames
   pulados", característico de glitches reais. Efeito cyberpunk.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="glitch"].entering { animation: fx12-in  0.75s steps(14,end) forwards; }
.carousel-slide[data-fx="glitch"].leaving  { animation: fx12-out 0.65s steps(10,end) forwards; }
@keyframes fx12-in {
  /* Frame 0: invisível e centrado — estado inicial */
  0%   { opacity:0;   transform:translate(0,0)      skewX(0deg);  filter:none; }
  /* Frame 1: desloca para esquerda-baixo com distorção e falha de cor */
  10%  { opacity:0.4; transform:translate(-8px,4px)  skewX(-6deg); filter:hue-rotate(90deg)  brightness(1.5); }
  /* Frame 2: desloca inversamente com cor complementar */
  20%  { opacity:0.6; transform:translate(8px,-4px)  skewX(6deg);  filter:hue-rotate(-90deg); }
  /* Frames intermediários: oscilações menores — "settling" */
  35%  { opacity:0.5; transform:translate(-4px,2px)  skewX(-2deg); filter:hue-rotate(45deg); }
  50%  { opacity:0.8; transform:translate(4px,-2px)  skewX(2deg);  filter:none; }
  65%  { opacity:0.9; transform:translate(-2px,0px)  skewX(-1deg); }
  80%  { opacity:1;   transform:translate(2px,0px)   skewX(1deg); }
  /* Frame final: estabilizado e nítido */
  100% { opacity:1;   transform:translate(0,0)       skewX(0deg);  filter:none; }
}
@keyframes fx12-out {
  0%   { opacity:1;   transform:translate(0,0);      filter:none; }
  /* Falha forte — desloca e distorce cores ao sair */
  25%  { opacity:0.8; transform:translate(10px,-5px)  skewX(8deg);  filter:hue-rotate(90deg)  brightness(1.8); }
  50%  { opacity:0.5; transform:translate(-10px,5px)  skewX(-8deg); filter:hue-rotate(-90deg); }
  75%  { opacity:0.3; transform:translate(5px,-3px);               filter:saturate(3); }
  100% { opacity:0;   transform:translate(0,0);      filter:none; }
}

/* ──────────────────────────────────────────────────────────────────
   ⑬  ESPIRAL 3D  |  data-fx="diamond"
   Efeito: a foto entra girando simultaneamente nos eixos X e Z em
   perspectiva 3D, como se descesse em espiral do espaço.
   Começa em 60% de escala, borrada e inclinada; termina plana e
   nítida. A saída inverte o processo subindo em espiral.
   Efeito mais espetacular e "cinematográfico" do conjunto.
────────────────────────────────────────────────────────────────── */
.carousel-slide[data-fx="diamond"].entering { animation: fx13-in  1.1s  cubic-bezier(0.22,1,0.36,1) forwards; }
.carousel-slide[data-fx="diamond"].leaving  { animation: fx13-out 0.85s ease forwards; }
@keyframes fx13-in {
  /* Estado inicial: pequeno, inclinado e embaçado — "chegando de longe" */
  0%   { opacity:0; transform:perspective(1200px) rotateX(60deg)  rotateZ(-20deg) scale(0.6); filter:blur(10px); }
  /* No meio: já visível mas ainda levemente fora de foco */
  50%  { opacity:1; filter:blur(2px); }
  /* Estado final: plano, centralizado e nítido */
  100% { opacity:1; transform:perspective(1200px) rotateX(0deg)   rotateZ(0deg)   scale(1);   filter:blur(0px); }
}
@keyframes fx13-out {
  /* Parte do estado normal e vai girando para cima-trás até sumir */
  from { opacity:1; transform:perspective(1200px) rotateX(0deg)   rotateZ(0deg)   scale(1); }
  to   { opacity:0; transform:perspective(1200px) rotateX(-60deg) rotateZ(20deg)  scale(0.6); filter:blur(10px); }
}


/* ── Legenda do slide ── */
.slide-caption {
  position: absolute;
  bottom: 0; left: 0; right: 0;
  padding: 32px 36px 28px;
  background: linear-gradient(to top, rgba(0,0,0,0.8) 0%, rgba(0,0,0,0.3) 50%, transparent 100%);
  z-index: 5;
  transform: translateY(8px);
  opacity: 0;
  transition: opacity 0.4s ease, transform 0.4s ease;
}
.carousel-slide.active .slide-caption { opacity:1; transform:translateY(0); transition-delay:0.45s; }
.slide-caption .fx-badge {
  display: inline-block;
  padding: 4px 12px;
  background: rgba(124,58,237,0.75);
  border-radius: 20px;
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 1.5px;
  color: #fff;
  margin-bottom: 8px;
  backdrop-filter: blur(6px);
}
.slide-caption h3 {
  font-size: 1.15rem;
  color: #fff;
  font-family: "Outfit", sans-serif;
  text-shadow: 0 2px 8px rgba(0,0,0,0.6);
}

/* ── Contador ── */
.slide-counter {
  position: absolute;
  top: 18px; right: 18px;
  z-index: 10;
  background: rgba(0,0,0,0.55);
  backdrop-filter: blur(10px);
  border: 1px solid rgba(255,255,255,0.14);
  border-radius: 30px;
  padding: 6px 16px;
  font-size: 0.85rem;
  color: #fff;
  font-family: "Outfit", sans-serif;
  letter-spacing: 1px;
}

/* ── Botões prev/next ── */
.carousel-btn {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 10;
  width: 52px; height: 52px;
  border-radius: 50%;
  border: 1px solid rgba(255,255,255,0.2);
  background: rgba(5,5,5,0.65);
  backdrop-filter: blur(12px);
  color: #fff;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background 0.3s ease, border-color 0.3s ease, transform 0.25s ease, box-shadow 0.3s ease;
}
.carousel-btn:hover {
  background: var(--accent-primary);
  border-color: var(--accent-primary);
  box-shadow: 0 0 24px rgba(124,58,237,0.5);
  transform: translateY(-50%) scale(1.12);
}
.carousel-btn.prev { left:  -26px; }
.carousel-btn.next { right: -26px; }
.carousel-btn svg  { width: 22px; height: 22px; pointer-events: none; }

/* ── Barra de progresso autoplay ── */
.progress-bar {
  position: absolute;
  bottom: 0; left: 0;
  height: 3px;
  background: linear-gradient(90deg, var(--accent-primary), var(--accent-secondary));
  z-index: 10;
  width: 0%;
  transition: width 0.1s linear;
  border-radius: 0 3px 3px 0;
  box-shadow: 0 0 10px rgba(124,58,237,0.6);
}

/* ── Thumbnails ── */
.carousel-thumbs {
  display: flex;
  gap: 10px;
  margin-top: 22px;
  overflow-x: auto;
  padding-bottom: 6px;
  scrollbar-width: thin;
  scrollbar-color: var(--accent-primary) transparent;
  scroll-snap-type: x mandatory;
}
.carousel-thumbs::-webkit-scrollbar       { height: 4px; }
.carousel-thumbs::-webkit-scrollbar-track { background: transparent; }
.carousel-thumbs::-webkit-scrollbar-thumb { background: var(--accent-primary); border-radius: 2px; }

.thumb {
  flex: 0 0 88px; height: 60px;
  border-radius: 10px;
  overflow: hidden;
  cursor: pointer;
  border: 2px solid transparent;
  transition: border-color 0.3s ease, transform 0.3s ease, opacity 0.3s ease, box-shadow 0.3s ease;
  opacity: 0.45;
  scroll-snap-align: start;
  background: #0a0a0f;
}
.thumb img { width:100%; height:100%; object-fit:cover; display:block; pointer-events:none; }
.thumb.active {
  border-color: var(--accent-primary);
  opacity: 1;
  transform: translateY(-4px);
  box-shadow: 0 6px 20px rgba(124,58,237,0.4);
}
.thumb:hover:not(.active) { opacity:0.85; border-color:rgba(124,58,237,0.5); transform:translateY(-2px); }

/* ── Dots de navegação ── */
.carousel-dots { display:flex; justify-content:center; gap:8px; margin-top:20px; }
.dot {
  width:8px; height:8px;
  border-radius:50%;
  background: var(--glass-border);
  cursor: pointer;
  transition: background 0.3s ease, width 0.3s ease;
  border: none;
}
.dot.active { background: var(--accent-primary); width:24px; border-radius:4px; }

/* ── Barra de controles ── */
.carousel-controls-bar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-top: 20px;
  padding: 0 2px;
}
.autoplay-btn {
  background: var(--glass-bg);
  border: 1px solid var(--glass-border);
  color: var(--text-muted);
  padding: 8px 18px;
  border-radius: 30px;
  font-size: 0.82rem;
  cursor: pointer;
  display: flex; align-items: center; gap: 8px;
  font-family: "Inter", sans-serif;
  transition: background 0.3s, color 0.3s, border-color 0.3s;
}
.autoplay-btn.playing { background:rgba(124,58,237,0.15); border-color:var(--accent-primary); color:var(--accent-primary); }
.autoplay-btn svg { width:16px; height:16px; }
.fx-label      { font-size:0.82rem; color:var(--text-muted); letter-spacing:0.5px; }
.fx-label span { color:var(--accent-primary); font-weight:600; }

/* ── Lightbox (tela cheia) ── */
.lightbox {
  position: fixed;
  inset: 0;
  z-index: 9000;
  background: rgba(0,0,0,0.96);
  display: flex; align-items: center; justify-content: center;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.4s ease;
  backdrop-filter: blur(10px);
}
.lightbox.open { opacity:1; pointer-events:auto; }
.lightbox img {
  max-width: 95vw; max-height: 92vh;
  object-fit: contain;
  border-radius: 12px;
  box-shadow: 0 0 100px rgba(124,58,237,0.35);
  animation: lbIn 0.4s cubic-bezier(0.22,1,0.36,1);
}
@keyframes lbIn { from { transform:scale(0.88); opacity:0; } to { transform:scale(1); opacity:1; } }

.lightbox-close {
  position: fixed;
  top: 22px; right: 26px;
  background: rgba(255,255,255,0.08);
  border: 1px solid rgba(255,255,255,0.15);
  color: #fff;
  width: 44px; height: 44px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  cursor: pointer;
  transition: background 0.25s ease, transform 0.25s ease;
  font-size: 1.4rem; line-height: 1;
}
.lightbox-close:hover { background:var(--accent-primary); transform:rotate(90deg); }

/* ── Touch hint ── */
.touch-hint {
  position: absolute;
  bottom: 56px;
  left: 50%; transform: translateX(-50%);
  font-size: 0.75rem;
  color: rgba(255,255,255,0.4);
  display: flex; align-items: center; gap: 6px;
  pointer-events: none;
  z-index: 8;
  opacity: 0;
  animation: fadeHint 4s ease 2.5s forwards;
}
@keyframes fadeHint { 0%{opacity:0;} 20%{opacity:1;} 80%{opacity:1;} 100%{opacity:0;} }

/* ── Responsivo fotos ── */
@media (max-width: 768px) {
  .photos-hero h1    { font-size: 2.2rem; }
  .carousel-wrapper  { padding: 0 12px; }
  .carousel-btn.prev { left:  4px; }
  .carousel-btn.next { right: 4px; }
  .carousel-stage    { aspect-ratio: 3/2; border-radius: 16px; }
  .thumb             { flex: 0 0 64px; height: 44px; }
}

/* 
   SPOTIFY WIDGET
   Um player flutuante no canto inferior esquerdo.
   Interativo e com efeito Glassmorphism.
 */
.spotify-widget {
  position: fixed;
  bottom: 30px;
  left: 30px;
  z-index: 1000;
  display: flex;
  flex-direction: column-reverse;
  gap: 15px;
  transition: var(--transition-slow);
}

.spotify-toggle {
  width: 60px;
  height: 60px;
  background: var(--gradient);
  border: none;
  border-radius: 50%;
  color: white;
  cursor: pointer;
  display: flex;
  justify-content: center;
  align-items: center;
  box-shadow: 0 10px 20px rgba(124, 58, 237, 0.3);
  transition: var(--transition-fast);
  position: relative;
}

.spotify-toggle:hover {
  transform: scale(1.1) rotate(5deg);
  box-shadow: 0 15px 30px rgba(124, 58, 237, 0.5);
}

.spotify-toggle i {
  width: 25px;
  height: 25px;
}

.spotify-player-container {
  width: 300px;
  background: var(--glass-bg);
  backdrop-filter: blur(15px);
  border: 1px solid var(--glass-border);
  border-radius: 20px;
  padding: 5px;
  opacity: 0;
  visibility: hidden;
  transform: translateY(20px) scale(0.95);
  transition: all 0.5s cubic-bezier(0.175, 0.885, 0.32, 1.275);
  transform-origin: bottom left;
}

.spotify-widget.active .spotify-player-container {
  opacity: 1;
  visibility: visible;
  transform: translateY(0) scale(1);
}
