/* dá mais espaço à coluna direita — pedido explícito do usuário pra o
   vídeo dos heroes de Gestão (dentro do .notebook-frame) ficar maior.
   Modificador em vez de mudar `.hero__grid` genérico, que os heroes
   com `.phone-frame` (super-app.html) e a logo (transnet-ia.html)
   continuam usando sem alteração. */
.hero__grid--video{grid-template-columns:1fr 1.15fr}
.section--tight{padding:90px 0}
/* ========================================================
   CARDS DE FUNCIONALIDADES / GRADE DE MÓDULOS
   ======================================================== */
.grid{display:grid;gap:22px}
.grid--3{grid-template-columns:repeat(3,1fr)}
.card{
  position:relative;
  padding:32px;
  border-radius:var(--radius-lg);
  background:linear-gradient(180deg, rgba(20,26,42,.55) 0%, rgba(12,16,28,.55) 100%);
  border:1px solid rgba(255,255,255,.06);
  overflow:hidden;
  transition:border-color .35s, transform .35s var(--ease-out);
  isolation:isolate;
}
.card::before{
  content:"";position:absolute;inset:0;z-index:-1;
  background:radial-gradient(420px 220px at var(--mx,50%) var(--my,0%), rgba(13,110,233,.18), transparent 65%);
  opacity:0;transition:opacity .35s;
}
.card:hover{transform:translateY(-4px);border-color:rgba(13,110,233,.35)}
.card:hover::before{opacity:1}
.card__icon{
  width:50px;height:50px;border-radius:13px;
  display:grid;place-items:center;
  background:linear-gradient(135deg, rgba(13,110,233,.22), rgba(58,141,255,.10));
  border:1px solid rgba(13,110,233,.35);
  color:var(--primary-2);
  margin-bottom:22px;
  box-shadow:inset 0 0 20px rgba(13,110,233,.18);
}
.card__icon svg{width:22px;height:22px}
.card__title{font-size:19px;color:#fff;font-weight:600;margin-bottom:10px;letter-spacing:-.01em}
.card__text{color:var(--text-dim);font-size:14.5px;line-height:1.6}
/* prints reais das telas do Transnet (assets/img/telas-transnet/*.webp) no
   lugar do .dash (mockup de gráfico falso) na 2ª seção das 3 páginas de
   Gestão — mesmo tratamento "sem cartão" do .showcase__visual--video, já
   que os prints já vêm com sombra/perspectiva própria (composição de 3
   telas em ângulo) sobre fundo transparente; um card por baixo só
   duplicaria a sombra e destoaria. */
.showcase__visual--screens{
  padding:0;display:flex;align-items:center;justify-content:center;
  background:transparent;box-shadow:none;border:none;
  overflow:visible;isolation:isolate;
}
.showcase__visual--screens::before{display:none}
/* iluminação atrás dos prints — pedido explícito do usuário ("coloque uma
   iluminação atrás das imagens das telas que ficam à direita do texto").
   Mesma receita do .ia-hero-visual::before (glow radial bem desfocado, sem
   nenhuma aresta reta, isolation:isolate + z-index:-1 pra ficar atrás do
   <img> sem depender de ordem no DOM): overflow, que a base .showcase__visual
   deixa em hidden, precisou virar visible aqui — do contrário o glow
   (inset negativo, de propósito maior que a própria imagem) seria cortado
   pela borda arredondada do card antes de conseguir "vazar" ao redor do
   print. */
.showcase__visual--screens::after{
  content:"";position:absolute;inset:-15% -10%;z-index:-1;
  background:radial-gradient(closest-side, rgba(13,110,233,.4), transparent 70%);
  filter:blur(60px);
  pointer-events:none;
}
.showcase__img{width:100%;height:auto;display:block}
/* ========================================================
   SHOWCASE DE IA — bloco de chat / consulta
   ======================================================== */
.ai-wave-canvas{
  position:absolute;inset:0;
  width:100%;height:100%;
  pointer-events:none;
  z-index:0;
}
/* ========================================================
   GRADE DE INTEGRAÇÕES
   ======================================================== */
/* Redesenho completo, pedido explícito do usuário: "quero que a seção de
   integrações deixe de ser um carrossel e vire uma seção com cards, quero
   a seção com um tema branco e quero que você acrescente algum elemento
   ao fundo que diferencie um pouco a seção." Deixou de ser carrossel
   (trilho horizontal com scroll/arrasto + setas de navegação) e virou
   grid estático — todos os 12 `.integ-card` visíveis de uma vez, sem
   scroll horizontal. Como essa seção é replicada **idêntica** em 5
   páginas (`gestao-operacional.html`, `gestao-frotas.html`,
   `gestao-administrativa.html`, `power-bi.html`, `transnet-ia.html`, ver
   CLAUDE.md), o redesenho foi aplicado nas 5 de uma vez, mantendo a
   sincronia que já era regra pra esse componente — confirmado com o
   usuário antes de mexer, já que é uma mudança estrutural grande.
   `.integ-carousel`/`.integ-track`/`.integ-nav` (CSS do carrossel) foram
   **removidos por completo** (não deixados como código morto) — eram
   exclusivos deste componente, que não é mais um carrossel em nenhuma
   página do site, então não há motivo pra manter. */
.integrations{position:relative;z-index:1}
/* "Seção branca" — mesma receita padrão de sempre (ver "Convenções
   gerais" no CLAUDE.md). Modificador `--light` mesmo não havendo mais
   nenhuma instância escura desse componente (todas as 5 páginas usam o
   mesmo HTML/CSS) — mantém a convenção do projeto de nomear o tema
   explicitamente, útil se algum dia pedir pra reverter só essa seção. */
.integrations--light{background:#e2e7f0}
.integrations--light .section__title{color:#0b0f1a}
.integrations--light .section__lead{color:var(--text-mute)}
/* Elemento de fundo pra diferenciar a seção, a pedido do usuário ("seja
   criativo") — reaproveita o canvas `[data-wave-grid]` (grade pontilhada
   que ondula e reage ao mouse, já generalizado em `initWaveGridAll()`,
   ver "Grade de onda" no CLAUDE.md) com as mesmas cores calibradas pro
   tema claro já usadas em `#ai` (home) e nos heroes das páginas de
   Gestão (`data-wave-base="15,23,42" data-wave-peak="13,110,233"` —
   pontos escuro-marinho em repouso, acendendo pro azul da marca nos
   picos/perto do cursor). Zero JS novo — só o atributo no `<canvas>`.
   `.integrations` já tinha `position:relative`, então o canvas
   (`position:absolute;inset:0;z-index:0`) já se ancora certo; `.container
   {z-index:1}` (regra global) garante que os cards fiquem por cima. */
/* Grid estático no lugar do trilho — `repeat(6,1fr)` fecha as 12 integrações
   em 2 linhas de 6 no desktop, mesma técnica de colunas fixas + breakpoints
   já usada em `.craft`/`.pillars`. */
.integ-grid{
  display:grid;grid-template-columns:repeat(6,1fr);gap:20px;
  margin-top:56px;
}
@media (max-width:980px){.integ-grid{grid-template-columns:repeat(4,1fr)}}
@media (max-width:640px){.integ-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:420px){.integ-grid{grid-template-columns:repeat(2,1fr)}}
/* Redesenho do card — pedido explícito do usuário ("não gostei da
   interação, faça essa seção de uma forma mais bonita"), depois de duas
   rodadas anteriores (fundo azul claro no hover, depois ícone sem
   rotação) não terem ficado satisfatórias. 4 mudanças, todas voltando a
   uma linguagem mais próxima do resto do site (mais previsível = mais
   "bonita" nesse caso) + um ajuste de layout novo:
   1. Hover volta a "virar" azul-escuro sólido (mesma receita comprovada
      de `.pillar`/`.social-card`/`.bi-pillar`, abandonando o experimento
      "azul claro" da rodada anterior) — texto/ícone voltam a claro só no
      hover, mesmo contraste alto de sempre.
   2. Removido o brilho de spotlight que seguia o mouse (`::after`,
      radial-gradient com `--mx`/`--my`) — com o hover já mudando fundo +
      ícone + texto + anel de gradiente, mais uma camada de brilho ficava
      visualmente carregado; a interação agora é mais limpa/direta.
      `initSpotlight()` (main.js) continua rodando sem nenhuma mudança —
      ela seta as custom properties `--mx`/`--my` em qualquer `.card,
      .integ-card`, e simplesmente não sobra nenhum CSS pra consumi-las
      aqui agora (inofensivo, outras seções com `.card` continuam usando).
   3. Ícone ganhou um leve tingimento azul já em repouso (`rgba(13,110,
      233,.08)`, era tint neutro cinza) — mais vida antes do hover, sem
      abandonar `var(--primary)` como cor do traço (mesma regra de
      contraste de sempre).
   4. Cards com altura mínima uniforme (`min-height:152px` +
      `display:flex;flex-direction:column;justify-content:center`) — os
      12 nomes têm comprimentos bem diferentes ("GPS" vs. "APC - Contador
      Automático de Passageiros"), então sem isso a grade ficava com
      bordas inferiores desalinhadas (cards de 1 linha de texto ficavam
      visivelmente mais baixos que os de 2 linhas); agora todos fecham a
      grade com a mesma altura, ícone+texto sempre centralizados
      verticalmente. */
.integ-card{
  position:relative;isolation:isolate;
  display:flex;flex-direction:column;justify-content:center;min-height:152px;
  padding:24px 18px;
  border-radius:16px;
  background:#e9edf5;
  border:1px solid rgba(11,15,26,.08);
  box-shadow:0 12px 28px -22px rgba(11,15,26,.2);
  text-align:center;
  transition:transform .4s var(--ease-out), border-color .35s, box-shadow .4s, background .3s;
}
/* anel de gradiente, escondido até o hover — inalterado, já funciona
   sobre qualquer fundo de card */
.integ-card::before{
  content:"";position:absolute;inset:-1px;border-radius:inherit;padding:1.5px;
  background:linear-gradient(135deg, var(--primary) 0%, var(--primary-2) 100%);
  -webkit-mask:linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite:xor;mask-composite:exclude;
  opacity:0;transition:opacity .35s;
  pointer-events:none;
}
.integ-card:hover{
  background:#0d1f3d;
  border-color:transparent;
  transform:translateY(-8px);
  box-shadow:0 24px 48px -20px rgba(5,7,13,.45);
}
.integ-card:hover::before{opacity:1}
.integ-card .ic{
  width:46px;height:46px;border-radius:12px;margin:0 auto 14px;
  display:grid;place-items:center;
  background:rgba(13,110,233,.08);
  border:1px solid rgba(13,110,233,.16);
  color:var(--primary);
  transition:transform .35s var(--ease-out), box-shadow .35s, background .35s, border-color .35s, color .35s;
}
.integ-card .ic svg{width:22px;height:22px}
.integ-card .t{font-size:13px;color:#0b0f1a;font-weight:600;transition:color .3s}
.integ-card:hover .ic{
  transform:scale(1.14);
  box-shadow:0 0 26px rgba(13,110,233,.5);
  background:rgba(255,255,255,.1);
  border-color:rgba(255,255,255,.18);
  color:var(--primary-2);
}
.integ-card:hover .t{color:#fff}
/* botão "Conhecer soluções" abaixo do grid — pedido explícito do
   usuário, mesmo markup canônico de sempre (`.btn.btn--primary
   .btn--solucoes` + seta, ver "Convenções gerais" no CLAUDE.md). */
.integ-cta{display:flex;justify-content:center;margin-top:48px}
/* ========================================================
   SEÇÃO DE MÓDULOS — Abas
   ======================================================== */
.modules{position:relative}
.modules::before,.modules::after{
  content:"";position:absolute;left:0;right:0;height:140px;z-index:1;pointer-events:none;
}
.modules::before{top:0;background:linear-gradient(180deg, var(--bg-0), transparent)}
.modules::after{bottom:0;background:linear-gradient(0deg, var(--bg-0), transparent)}
.modules__tabs{
  display:flex;flex-wrap:wrap;gap:10px;
  justify-content:center;margin-bottom:48px;
}
.modules__tab{
  padding:11px 22px;border-radius:999px;
  border:1px solid rgba(255,255,255,.08);
  background:rgba(255,255,255,.025);
  color:var(--text-dim);font-weight:500;font-size:14px;
  transition:all .25s;
}
.modules__tab:hover{color:#fff;border-color:rgba(255,255,255,.18)}
.modules__tab.active{
  background:linear-gradient(135deg,var(--primary),var(--primary-2));
  color:#fff;border-color:transparent;
  box-shadow:0 10px 30px -10px var(--primary-glow);
}
.modules__panel{display:none}
.modules__panel.active{display:grid}
.modules__cta{grid-column:1/-1;justify-self:center;margin-top:10px}
/* ========================================================
   CABEÇALHO DE PÁGINA (páginas internas)
   ======================================================== */
.page-header{
  padding:200px 0 100px;
  text-align:center;
  position:relative;
  background:
    radial-gradient(600px 300px at 50% 0%, rgba(13,110,233,.25), transparent 60%);
}
.page-header h1{
  font-size:clamp(40px,5vw,70px);
  color:#fff;letter-spacing:-.028em;
}
.page-header h1 span{
  color:var(--primary-2);
}
.page-header p{margin-top:22px;color:var(--text-dim);font-size:18px;max-width:680px;margin-left:auto;margin-right:auto}
.page-header__bg{
  position:absolute;inset:-20px;z-index:0;
  background-size:cover;background-position:center;
  filter:saturate(1.05) brightness(.8) blur(4px);
}
/* variante "split" — só em transnet-ia.html (.page-header--split), pedido
   explícito do usuário pra essa página ser "um pouco diferente das
   outras": sem imagem de banner, texto alinhado à esquerda (não
   centralizado como o .page-header genérico) e uma logo ao lado, em vez
   de balões ou fundo com foto. Reaproveita `.hero__grid`/`.hero__left`/
   `.hero__right` (o grid de 2 colunas texto/visual que já existe pro
   hero da home) em vez de criar um grid novo — texto na coluna esquerda,
   logo na direita; no mobile, `.hero__right{display:none}` (regra já
   existente, ver `@media(max-width:980px)` acima) esconde a logo e o
   grid vira coluna única, sem precisar de nenhuma regra nova aqui.
   `text-align:left` sobrescreve o `text-align:center` do `.page-header`
   base — como é herdado, basta essa única declaração pro h1/p (que não
   têm `text-align` próprio) alinharem à esquerda também. */
.page-header--split{text-align:left;min-height:95vh;display:flex;align-items:center;overflow:hidden}
/* pontos de luz desfocados no hero das 3 páginas de Gestão — pedido explícito
   do usuário ("coloque pontos de luz desfocados que se movimentam pela seção,
   eles não devem se sobrepor aos elementos da seção, ele irá se sobrepor
   apenas ao plano de fundo delas"). Reaproveita o canvas [data-ambient-lights]
   genérico (initAmbientLights(), main.js) sem nenhuma mudança de JS — mesmo
   efeito já usado em #sobre-resumo e na galeria do Power BI. Diferente
   dessas outras instâncias (onde o wrapper fica sempre em z-index:0, abaixo
   do .container por ter um número menor), aqui a seção já tem
   .page-header__bg (imagem, z:0) e .page-header__scrim (véu escuro, z:1) por
   baixo — sem subir esse z-index, os focos ficariam escondidos atrás do véu
   escuro. z-index:1 empata com o véu e com o .container; o empate é
   resolvido pela ordem no DOM (este wrapper vem depois do véu e antes do
   .container no HTML), mesma técnica de empate proposital já usada entre
   .page-header__scrim e .container — resultado: os focos pintam por cima do
   véu/imagem de fundo, mas o conteúdo real (texto, botão, notebook) ainda
   pinta por cima deles, já que vem depois no DOM. */
.page-header--split .particles-bg{z-index:1}
/* suaviza a costura entre o hero e a seção seguinte — pedido explícito do
   usuário ("deixe a transição entre a seção inicial e a segunda mais
   suave"). Sem isso, a rede de partículas (`.particle-canvas`) do fundo
   terminava seca bem na borda inferior da seção, criando um corte visível
   contra a seção 2. Mesma técnica de degradê já usada em `.modules::after`
   (`#modulos`) — aqui só o rodapé precisa (o topo já fica atrás da nav). */
.page-header--split::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:140px;z-index:1;
  background:linear-gradient(0deg, var(--bg-0), transparent);
  pointer-events:none;
}
/* véu escuro leve — pedido explícito do usuário depois de ter pedido a
   remoção completa do véu forte anterior ("coloque uma sombra leve no
   background"). Tom uniforme bem mais sutil (.36, era .78-.9 na versão
   forte; começou em .28, escurecido "só mais um pouco" a pedido do
   usuário) na maior parte da seção; só nos últimos 38% sobe até
   opacidade 1 (mesma cor de --bg-0) pra continuar "derretendo" no fundo
   da seção seguinte sem deixar uma linha visível na costura — mesma
   técnica de sempre, só que partindo de um tom bem mais claro. */
.page-header__scrim{
  position:absolute;inset:0;z-index:1;
  background:linear-gradient(180deg, rgba(5,7,13,.36) 0%, rgba(5,7,13,.36) 62%, rgba(5,7,13,1) 100%);
}
/* página de funcionalidades do módulo */
.feat-list__btn{margin-top:24px}
.feat-list{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}
@media (max-width:680px){.feat-list{grid-template-columns:1fr}}
.feat-item{
  display:flex;gap:14px;
  padding:22px;border-radius:14px;
  background:rgba(15,20,35,.45);border:1px solid rgba(255,255,255,.06);
  transition:all .25s;
}
.feat-item:hover{border-color:rgba(13,110,233,.3)}
/* .feat-item .ic continua em uso — não é mais referenciado pelas 3 páginas
   de Gestão (ver .feat-item__num abaixo), mas o mesmo componente .feat-item
   também é usado em super-app.html (seção "Completo para motoristas e
   colaboradores"), que continua com o selo de ícone SVG de sempre; por
   isso essa regra não podia ser removida. */
.feat-item .ic{width:38px;height:38px;flex:0 0 38px;border-radius:10px;background:linear-gradient(135deg,rgba(13,110,233,.22),rgba(58,141,255,.06));border:1px solid rgba(13,110,233,.3);color:var(--primary-2);display:grid;place-items:center}
.feat-item .ic svg{width:18px;height:18px}
.feat-item h4{font-size:15px;color:#fff;margin-bottom:4px;font-weight:600}
.feat-item p{font-size:13.5px;color:var(--text-dim);line-height:1.55}
/* numeração no lugar do ícone SVG — pedido explícito do usuário ("tire os
   ícones dos cards e substitua por outra coisa"), só nas 3 páginas de
   Gestão (gestao-operacional/frotas/administrativa.html — super-app.html
   não foi tocada, ver nota acima). O .feat-list--plain que existia só pra
   gestao-operacional.html (removia fundo/borda do .ic ali) foi removido —
   diretamente substituído por este componente, não só pausado. Mesmo
   estilo do círculo sólido com gradiente já usado em .ia-step__num
   (stepper "Como funciona" de transnet-ia.html), só menor (38px, o mesmo
   tamanho que o .ic ocupava) pra caber no layout horizontal ícone+texto do
   .feat-item, em vez do stepper vertical/centralizado de onde o estilo foi
   copiado. */
.feat-item__num{
  width:38px;height:38px;flex:0 0 38px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  background:linear-gradient(135deg,var(--primary),var(--primary-2));
  color:#fff;font-weight:800;font-size:13px;
  box-shadow:0 8px 20px -8px var(--primary-glow);
}
/* ========================================================
   GESTÃO — moldura de notebook (componente genérico)
   ======================================================== */
/* emoldura os vídeos reais dos 3 módulos de Gestão (assets/video/
   modulo_{operacional,frotas,administrativo}.webm, 1920×1080, gravações
   de tela do ERP rodando no navegador) como se fossem a tela de um
   notebook — mesma lógica do .phone-frame acima (moldura escura +
   sombra), só que pro formato 16:9/paisagem desses vídeos, que são
   telas de desktop, não recordings de celular. `aspect-ratio:16/9`
   bate exato com a resolução de origem, sem crop.
   Segunda versão — a primeira (só uma borda fina + uma barrinha embaixo)
   não lia como notebook de verdade, reportado pelo usuário. Reforçada com
   3 pistas visuais que a primeira não tinha: (1) uma linha de "dobradiça"
   entre tela e base, separando as duas peças; (2) a base **mais larga que
   a tela** (`width:112%`, centralizada com margin negativa) via
   `clip-path` trapezoidal — um notebook visto de frente tem a base do
   teclado alargando/apoiando por baixo da tela, não alinhada borda-a-borda
   com ela; (3) gradiente na base simulando luz batendo numa superfície de
   metal/plástico, em vez de uma cor sólida chapada. */
.notebook-frame{width:100%;max-width:760px;margin:0 auto}
.notebook-frame__screen{
  position:relative;
  aspect-ratio:16/9;
  background:#000;
  border:12px solid #1b202b;
  border-radius:12px 12px 3px 3px;
  overflow:hidden;
  box-shadow:0 30px 70px -24px rgba(0,0,0,.65);
}
/* "câmera" do notebook — mesmo papel do notch do .phone-frame, só que
   um ponto único centralizado (webcam), não uma barra. */
.notebook-frame__cam{
  position:absolute;top:4px;left:50%;transform:translateX(-50%);
  width:5px;height:5px;border-radius:50%;
  background:#3a4152;z-index:2;
}
.notebook-frame__screen video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block}
/* linha de dobradiça — separa visualmente tela e base, reforçando que
   são duas peças articuladas, não um bloco único. */
.notebook-frame__hinge{
  height:5px;
  background:linear-gradient(180deg,#0d0f14,#1b202b);
  box-shadow:inset 0 1px 2px rgba(0,0,0,.6);
}
/* "base"/teclado — deliberadamente mais larga que a tela (112%,
   centralizada) e em trapézio (mais estreita no topo, mais larga embaixo)
   via clip-path, imitando a perspectiva de uma base de notebook vista de
   frente. Recorte central simula o vão de abertura da tampa. Ainda não
   tenta desenhar um teclado de verdade — só o volume/silhueta certos. */
.notebook-frame__base{
  position:relative;
  width:112%;margin-left:-6%;
  height:22px;
  background:linear-gradient(180deg,#2b323e 0%,#181d26 55%,#0c0e13 100%);
  clip-path:polygon(3% 0, 97% 0, 100% 100%, 0% 100%);
  border-radius:0 0 10px 10px;
  box-shadow:0 14px 24px -8px rgba(0,0,0,.6);
}
.notebook-frame__base::before{
  content:"";position:absolute;top:0;left:50%;transform:translateX(-50%);
  width:72px;height:8px;border-radius:0 0 8px 8px;
  background:#05070d;
}
