/*
 * Complementos do app.css, todos nascidos da saida do WordPress:
 *  - o botao flutuante de WhatsApp, que era um widget Lottie servido por um
 *    WordPress de staging que saiu do ar;
 *  - o honeypot e o estado "enviando" dos formularios, agora tratados por
 *    /assets/forms.js no lugar do Contact Form 7.
 *
 * O posicionamento fixo do botao continua vindo do app.css, pela classe
 * .elementor-element-612bf10 que o Elementor gerou - aqui so entra a aparencia
 * do icone que substituiu a animacao.
 */

.qs-whatsapp-float__icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border-radius: 50%;
  background: #25d366;
  color: #fff;
  font-size: 36px;
  line-height: 1;
  box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22);
  transition: transform 0.2s ease, box-shadow 0.2s ease;
}

.elementor-widget-lottie a:hover .qs-whatsapp-float__icon,
.elementor-widget-lottie a:focus-visible .qs-whatsapp-float__icon {
  transform: scale(1.08);
  box-shadow: 0 8px 22px rgba(0, 0, 0, 0.3);
}

/* Pulso discreto, no lugar do loop da animacao antiga. */
@media (prefers-reduced-motion: no-preference) {
  .qs-whatsapp-float__icon {
    animation: qs-whatsapp-pulse 2.4s ease-in-out infinite;
  }
}

@keyframes qs-whatsapp-pulse {
  0%,
  100% {
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22), 0 0 0 0 rgba(37, 211, 102, 0.5);
  }
  50% {
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.22), 0 0 0 14px rgba(37, 211, 102, 0);
  }
}

/* Texto so para leitor de tela: o icone sozinho nao diz o que o link faz. */
.qs-visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Honeypot injetado por forms.js. */
.qs-form__hp {
  position: absolute;
  left: -9999px;
  width: 1px;
  height: 1px;
  overflow: hidden;
}

.qs-form--sending {
  opacity: 0.7;
  pointer-events: none;
}

/*
 * Pontos de melhoria de layout apontados manualmente (alinhamento e
 * espacamento que o app.css, vindo do Elementor, deixa inconsistente):
 */

/* 1) Pagina Institucional / Sobre nos: a grade de imagens + legendas logo
 * abaixo de "Nossa historia" (secao .elementor-element-260f225: Laboratorios,
 * Salas de aulas, Centro tecnologico e Biblioteca) nascia desalinhada: o
 * app.css da text-align:center a tres legendas e text-align:end so a
 * "Salas de aulas" (.elementor-element-58b7e37), que ficava jogada para a
 * direita, fora de esquadro com as outras tres e com as imagens.
 *
 * ATENCAO a especificidade: o app.css escreve essas regras na forma composta
 * do Elementor - .elementor-66 .elementor-element.elementor-element-58b7e37,
 * que vale 0,3,0. Um override simples (.elementor-element-58b7e37, 0,1,0)
 * perde e nao surte efeito nenhum; por isso repetimos aqui o mesmo formato.
 * Heranca do container tambem nao resolve, porque o app.css mira cada
 * legenda diretamente e declaracao direta sempre vence heranca.
 *
 * O text-align na secao cuida das imagens, que nao tem regra propria (o
 * widget de imagem do Elementor e inline-block e segue o alinhamento do pai). */
.elementor-66 .elementor-element.elementor-element-260f225 {
  text-align: center;
}

.elementor-66 .elementor-element.elementor-element-242c933,
.elementor-66 .elementor-element.elementor-element-58b7e37,
.elementor-66 .elementor-element.elementor-element-ef58499,
.elementor-66 .elementor-element.elementor-element-7f335fb {
  text-align: center;
}

/* Centralizar o texto, porem, so resolve metade: as quatro fotos tem alturas
 * nativas diferentes (616, 552, 594 e 500px para a mesma largura de 800), e
 * como as duas colunas de cada linha comecam no mesmo topo, cada legenda
 * acabava comecando numa altura diferente da vizinha.
 *
 * Fixamos uma proporcao unica (perto da media das quatro, para nao mudar a
 * escala do bloco) com object-fit:cover, que recorta em vez de distorcer. Com
 * as imagens da mesma altura, as legendas de cada linha se alinham sozinhas.
 * A mascara SVG do Elementor (mask-size:contain) continua valendo normalmente:
 * ela se ajusta a nova caixa, igual nas quatro. */
.elementor-66 .elementor-element.elementor-element-739454c .elementor-widget-container img,
.elementor-66 .elementor-element.elementor-element-2a5eef3 .elementor-widget-container img,
.elementor-66 .elementor-element.elementor-element-c457619 .elementor-widget-container img,
.elementor-66 .elementor-element.elementor-element-a58cf26 .elementor-widget-container img {
  width: 100%;
  height: auto;
  aspect-ratio: 800 / 570;
  object-fit: cover;
}

/* 2) Cards de "Noticias recentes" (home e /blog): o app.css define a caixa
 * de miniatura com padding-bottom proporcional (aspect ratio), mas so
 * centraliza/corta a imagem dentro dela quando o container tem a classe
 * .elementor-has-item-ratio - classe que o HTML gerado aqui nunca inclui.
 * Sem ela, cada <img> mantem sua proporcao nativa (ex.: 2048x1365, 1080x1080,
 * 2226x2560, 1500x1000) e desalinha a grade de cards. Aplicamos o mesmo
 * recorte/centralizacao independente dessa classe. */
.elementor-post__thumbnail {
  position: absolute;
  inset: 0;
}

.elementor-post__thumbnail img {
  position: absolute;
  top: 50%;
  left: 50%;
  width: 100%;
  height: 100%;
  transform: translate(-50%, -50%);
  object-fit: cover;
}

/* 3) Paginas de post do blog (template Elementor #1283, compartilhado por
 * todas as noticias): titulo, meta-dados e corpo do texto ficam colados uns
 * nos outros porque as regras responsivas do app.css zeram os paddings
 * (.elementor-element-943a405 e .elementor-element-deac2fb). Devolvemos um
 * respiro consistente entre esses blocos e entre os paragrafos do texto. */
.elementor-1283 .elementor-element-a1cfa5f {
  margin-bottom: 16px;
}

.elementor-1283 .elementor-element-943a405 {
  padding-top: 40px !important;
  padding-bottom: 60px !important;
}

.elementor-1283 .elementor-element-deac2fb > .elementor-widget-container {
  padding: 0 10px !important;
}

.elementor-1283 .elementor-element-deac2fb .wp-block-paragraph {
  margin-bottom: 1.4em;
}

.elementor-1283 .elementor-element-deac2fb figure {
  margin: 1.6em 0;
}

/* 4) Formularios "Deseja se matricular?" (home), "Cadastre seu curriculo"
 * (/trabalhe-conosco) e /cadastrar-curriculo: o Contact Form 7 emitia um
 * <fieldset class="hidden-fields-container"> vazio como wrapper dos inputs
 * hidden, contando com a folha de estilo do proprio CF7 para neutraliza-lo.
 * Essa folha nao veio no clone, entao valia o border:2px groove padrao do
 * browser - um retangulo vazio de largura total acima do "Nome Completo".
 * O fieldset ja foi removido do markup dos tres .ejs (os forms hoje sao
 * tratados por forms.js, nao pelo CF7); as regras abaixo so existem como
 * rede de seguranca caso o HTML do CF7 reapareca.
 *
 * A .screen-reader-response e a live region do CF7, que forms.js tambem nao
 * usa - ela cria seu proprio .wpcf7-response-output. Mantemos no DOM pela
 * acessibilidade, mas sem ocupar espaco: o <p> e o <ul> vazios dentro dela
 * somavam margens antes do primeiro campo. */
.hidden-fields-container {
  display: none !important;
}

.screen-reader-response {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* 5) Paginas de noticia: a data sobre a imagem de capa vinha embrulhada num
 * <a href="/AAAA/MM/DD"> - o arquivo por data do WordPress, uma rota que este
 * site nao tem (src/routes/pages.js so registra /:slug e /category/:slug), e
 * que por isso caia no 404. O link virou <span class="qs-post-date"> nos 19
 * .ejs de noticia.
 *
 * Como o alinhamento do icone de calendario com a data e a centralizacao do
 * conjunto vinham de .elementor-icon-list-item a{display:flex;...} no app.css,
 * o flex precisa ser reposto no <span>. Aproveitamos para aumentar a fonte,
 * que era os 18px de .elementor-element-5524881 .elementor-icon-list-item. */
.elementor-1283 .elementor-post-info .qs-post-date {
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 22px;
}

/* 6) Curso "Informatica Completa" (.elementor-2933), hero .elementor-element-e1a1b16:
 * duas colunas lado a lado - dd253b1 (60%) com a background-image e 3741e20
 * (40%) com o card vermelho do "Desconto Especial". A secao e
 * elementor-section-items-middle, ou seja, align-items:center no container:
 * as colunas nao esticam, cada uma tem altura propria. O card vermelho
 * (heading + icone + 4 campos + botao + 115px de padding em cima e embaixo)
 * fica mais alto que a coluna da imagem e sobra para fora dela.
 *
 * Esticamos a coluna da imagem ate a altura do card em vez de encolher o card:
 * nada do formulario e cortado, o background-size:cover preenche o espaco
 * extra sozinho, e as alturas continuam batendo em qualquer resolucao.
 *
 * O align-items:center vem de .elementor-section.elementor-section-items-middle
 * > .elementor-container (0,3,0), entao usamos a forma composta do Elementor
 * (0,4,0) para vencer com folga. */
.elementor-2933
  .elementor-element.elementor-element-e1a1b16
  > .elementor-container {
  align-items: stretch;
}

.elementor-2933
  .elementor-element.elementor-element-e1a1b16
  > .elementor-container
  > .elementor-column
  > .elementor-widget-wrap {
  height: 100%;
}

/* 7) Paginas de curso: o ultimo bloco de conteudo encostava direto no rodape.
 * Um respiro antes do footer. O seletor pega as 15 paginas de curso pela
 * categoria que o WordPress deixou na classe do <main>, sem precisar listar
 * slug por slug; as noticias sao category-blog e ficam de fora (ja tem o
 * proprio espacamento no bloco 3). */
main.site-main[class*="category-cursos-de-"] > .page-content,
main.site-main[class*="category-formacao-profissional"] > .page-content,
main.site-main[class*="category-qualificacao-profissional"] > .page-content {
  padding-bottom: 80px;
}

/* 8) Carrossel de banners da home: os banners tem proporcoes diferentes e o
 * Swiper segurava a altura do mais alto, deixando faixa branca no celular.
 * A altura agora acompanha o slide visivel (autoHeight em site-extras.js). */
.elementor-element-1279e45 .swiper-wrapper {
  align-items: flex-start;
  transition-property: transform, height;
}

/* Cada banner tem duas versoes (views/pages/index.ejs): 2172x724 no desktop e
 * quadrada 1080x1080 no celular, trocadas por <picture>. O slide inteiro e um
 * link para /matriculas, ja que os banners trazem o botao de matricula. */
.elementor-element-1279e45 .swiper-slide > a {
  display: block;
}

.elementor-element-1279e45 .swiper-slide-image {
  display: block;
  width: 100%;
  height: auto;
}

/* 9) Pagina /cursos no modelo da Educamacro: hero, 4 beneficios e a grade de
 * cursos (foto, titulo e botao de matricula). Marcacao propria em
 * views/pages/cursos.ejs, fora do Elementor; cores da paleta global do app.css. */
.qs-cursos {
  --qs-red: #ee3338;
  --qs-red-dark: #c8232a;
  --qs-green: #9dbc37;
  --qs-ink: #1f1f1f;
  --qs-muted: #5f5f5f;
  font-family: "Roboto", sans-serif;
  color: var(--qs-ink);
}

.qs-cursos-wrap {
  width: 100%;
  max-width: 1200px;
  margin: 0 auto;
  padding: 0 16px;
  box-sizing: border-box;
}

.qs-cursos .qs-cursos-btn {
  display: inline-block;
  padding: 12px 28px;
  border-radius: 999px;
  background: var(--qs-red);
  color: #fff;
  font-weight: 700;
  font-size: 15px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-decoration: none;
  transition: background-color 0.2s ease, transform 0.2s ease;
}

.qs-cursos .qs-cursos-btn:hover,
.qs-cursos .qs-cursos-btn:focus-visible {
  background: var(--qs-red-dark);
  color: #fff;
  transform: translateY(-2px);
}

.qs-cursos .qs-cursos-btn--light {
  background: #fff;
  color: var(--qs-red);
}

.qs-cursos .qs-cursos-btn--light:hover,
.qs-cursos .qs-cursos-btn--light:focus-visible {
  background: var(--qs-green);
  color: #fff;
}

.qs-cursos-hero {
  padding: 72px 0 88px;
  background: linear-gradient(135deg, var(--qs-red) 0%, var(--qs-red-dark) 100%);
  color: #fff;
  text-align: center;
}

.qs-cursos-hero__eyebrow {
  margin: 0 0 12px;
  font-size: 18px;
  font-weight: 500;
}

.qs-cursos-hero__title {
  margin: 0;
  font-size: clamp(34px, 7vw, 60px);
  font-weight: 800;
  line-height: 1.1;
  color: #fff;
}

.qs-cursos-hero__title span {
  color: var(--qs-green);
  background: #fff;
  padding: 0 12px;
  border-radius: 12px;
}

.qs-cursos-hero__subtitle {
  margin: 16px 0 32px;
  font-size: clamp(20px, 3.5vw, 28px);
  font-weight: 300;
}

.qs-cursos-beneficios {
  margin-top: -48px;
}

.qs-cursos-beneficios__grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 16px;
}

.qs-cursos-beneficio {
  padding: 28px 24px;
  border-radius: 16px;
  background: #fff;
  box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
  text-align: center;
}

.qs-cursos-beneficio__icon {
  width: 44px;
  height: 44px;
  fill: var(--qs-green);
}

.qs-cursos-beneficio__title {
  margin: 12px 0 8px;
  font-size: 20px;
  font-weight: 700;
  color: var(--qs-red);
}

.qs-cursos-beneficio__text {
  margin: 0;
  font-size: 15px;
  line-height: 1.5;
  color: var(--qs-muted);
}

.qs-cursos-lista {
  padding: 72px 0 96px;
}

.qs-cursos-lista__title {
  margin: 0 0 40px;
  font-size: clamp(30px, 5vw, 44px);
  font-weight: 800;
  text-align: center;
  text-transform: uppercase;
  color: var(--qs-red);
}

.qs-cursos-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: 24px;
}

.qs-curso-card {
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 28px 20px;
  border-radius: 20px;
  background: #f4f4f4;
  text-align: center;
  transition: box-shadow 0.2s ease, transform 0.2s ease;
}

.qs-curso-card:hover {
  box-shadow: 0 12px 28px rgba(0, 0, 0, 0.12);
  transform: translateY(-4px);
}

/* Seletor composto (0,2,0) de proposito: na home a grade fica dentro do
 * wrapper .elementor, e o ".elementor img" do app.css (0,1,1) zerava borda,
 * border-radius e max-width - voltavam os cantos brancos das fotos. */
.qs-cursos .qs-curso-card__img {
  width: 100%;
  max-width: 220px;
  height: auto;
  aspect-ratio: 1;
  border-radius: 50%;
  border: 6px solid var(--qs-green);
  object-fit: cover;
  /* as fotos ja vem recortadas em circulo sobre fundo branco; o leve zoom
   * elimina o anel branco que sobrava entre a foto e a borda verde. */
  transform: scale(1.05);
}

.qs-cursos .qs-curso-card__title {
  flex: 1;
  margin: 20px 0;
  font-size: 20px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--qs-ink);
}

.qs-cursos-lista__cta {
  margin-top: 40px;
  text-align: center;
}

.qs-cursos-lista--home {
  background: #fff;
}

.qs-cursos-lista--home .qs-cursos-lista__title {
  font-family: "Roboto", sans-serif;
  line-height: 1.2;
}

@media (min-width: 600px) {
  .qs-cursos-beneficios__grid,
  .qs-cursos-grid {
    grid-template-columns: repeat(2, 1fr);
  }
}

@media (min-width: 1025px) {
  .qs-cursos-beneficios__grid {
    grid-template-columns: repeat(4, 1fr);
  }

  .qs-cursos-grid {
    grid-template-columns: repeat(3, 1fr);
  }

  /* Pagina /cursos: 4 por linha (16 cursos = 4 linhas cheias); a vitrine da
   * home continua com 3. */
  .qs-cursos-lista:not(.qs-cursos-lista--home) .qs-cursos-grid {
    grid-template-columns: repeat(4, 1fr);
  }

  .qs-cursos-lista:not(.qs-cursos-lista--home) .qs-curso-card__title {
    font-size: 18px;
  }
}

@media (prefers-reduced-motion: reduce) {
  .qs-cursos .qs-cursos-btn,
  .qs-curso-card {
    transition: none;
  }

  .qs-cursos .qs-cursos-btn:hover,
  .qs-curso-card:hover {
    transform: none;
  }
}

/* 10) Institucional: texto "Ecossistema de Aprendizagem" (widget f7cf871) ganhou
 * subtitulos e lista; o widget de texto do Elementor nao traz estilo para eles. */
.qs-institucional__subtitle {
  margin: 1.6em 0 0.6em;
  font-family: "Roboto", sans-serif;
  font-size: 22px;
  font-weight: 700;
  color: #ee3338;
}

.qs-institucional__list {
  margin: 0 0 1em;
  padding-left: 1.2em;
}

.qs-institucional__list li {
  margin-bottom: 0.6em;
}

/* 11) Paginas de noticia: o fundo do topo (.elementor-element-4172f14) era a
 * imagem destacada de cada post, mas no app.css as 18 regras usam o mesmo
 * seletor e so a ultima valia - todas as noticias mostravam a mesma foto.
 * A imagem de cada post agora vai inline no proprio .ejs (style="background-
 * image:..."), tirada do HTML original em site_clone_raw/. */

/* 12) Mensagens de retorno dos formularios (escritas por forms.js): o texto de
 * erro do CF7 saia em cinza/vermelho sobre o fundo vermelho do formulario da
 * home e ficava ilegivel. Caixa branca com texto colorido: le bem sobre o
 * vermelho, o verde e o branco dos varios formularios do site. */
form .wpcf7-response-output.sent,
form .wpcf7-response-output.invalid,
form .elementor-message.elementor-message-success,
form .elementor-message.elementor-message-danger {
  margin: 16px 0 0;
  padding: 12px 16px;
  border: 0;
  border-radius: 10px;
  background: #fff;
  font-family: "Roboto", sans-serif;
  font-size: 16px;
  font-weight: 600;
  line-height: 1.4;
  box-shadow: 0 4px 14px rgba(0, 0, 0, 0.15);
}

form .wpcf7-response-output.invalid,
form .elementor-message.elementor-message-danger {
  color: #c8232a;
  border-left: 5px solid #c8232a;
}

form .wpcf7-response-output.sent,
form .elementor-message.elementor-message-success {
  color: #3f7d12;
  border-left: 5px solid #9dbc37;
}
