/* ================================================================
   AlfamaWeb — estilos GLOBAIS
   Tokens, reset, tipografia e os componentes que aparecem em mais
   de uma página (navbar, footer, botões, tags, banner de CTA).
   O que é exclusivo de uma página mora no CSS daquela página
   (ex.: home.css). Ver LEIA-ME.txt.

   Os valores vêm do Design System do Figma (página "Foundations" /
   "Documentation"): 37 variáveis de cor, 20 text styles, 12 tokens
   de espaçamento, 8 de raio. Nunca escreva um hex solto aqui —
   se a cor não existe como token, ela não existe no design.
   ================================================================ */

/* Roboto é a única família do sistema. O arquivo é VARIÁVEL: um só
   woff2 (43 KB, subset latin) serve os pesos 100–900, então os cinco
   pesos em uso (400/500/600/700/800) não custam cinco downloads.
   Auto-hospedada, e não via fonts.googleapis.com, pelo mesmo motivo
   do lake-village: a folha do Google é render-blocking e paga TLS
   com origem nova antes de o arquivo da fonte poder ser descoberto.
   `swap` porque texto invisível é pior que texto com fallback. */
@font-face {
  font-family: "Roboto";
  src: url("../fonts/roboto-latin-var.woff2") format("woff2-variations");
  font-weight: 100 900;
  font-style: normal;
  font-display: swap;
}

:root {
  /* ---- Brand ---- */
  --brand-primary: #f97415;
  --brand-primary-hover: #e46001;
  --brand-primary-active: #ff9334;
  --brand-secondary: #3b3eba;
  --brand-dark-blue: #0f3460;

  /* ---- Background ---- */
  --bg-primary: #060609;
  --bg-surface: #0c0c0c;
  --bg-tertiary: #111117;
  --bg-elevated: #1d2929;

  /* ---- Surface ---- */
  --surface-dark: #2c2c2c;
  --surface-medium: #353535;
  --surface-light: #595959;
  --surface-card: #26262e;
  --surface-track: #d9d9de;

  /* ---- Text ---- */
  --text-primary: #eaeaea;
  --text-secondary: #b2b2b2;
  --text-muted: #bfbfbf;
  --text-light: #bcbcbc;
  --text-disabled: #d9d9d9;

  /* ---- Border ---- */
  --border-default: #eaeaea;
  --border-medium: #484848;
  --border-dark: #545658;

  /* ---- Neutral ---- */
  --white: #ffffff;
  --black: #000000;

  /* ---- Status ---- */
  --status-success: #38a169;
  --status-error: #e53e3e;
  --status-warning: #ecc94b;
  --status-info: #4299e1;

  /* ---- Spacing (2px → 140px) ---- */
  --space-3xs: 2px;
  --space-2xs: 4px;
  --space-micro: 6px;
  --space-xs: 8px;
  /* A altura da navbar, medida na tela: 95px no desktop, 93 nos demais.
     Serve ao `scroll-padding-top` do html, que só precisa dela como
     piso — alguns pixels a mais não fazem diferença, a menos não. */
  --altura-navbar: 96px;

  --space-sm: 12px;
  --space-md: 16px;
  --space-lg: 24px;
  --space-xl: 32px;
  --space-2xl: 40px;
  --space-3xl: 56px;
  --space-4xl: 80px;
  --space-5xl: 140px;

  /* ---- Border radius ---- */
  --radius-xs: 4px;
  --radius-sm: 8px;
  --radius-md: 12px;
  --radius-lg: 16px;
  --radius-xl: 24px;
  --radius-2xl: 48px;
  --radius-full: 80px;
  --radius-pill: 999px;

  /* ---- Border width ---- */
  --border-thin: 1px;
  --border-medium-w: 2px;
  --border-thick: 3px;

  /* ---- Sombras ---- */
  --shadow-sm: 0 2px 4px rgba(0, 0, 0, .25);
  --shadow-md: 0 4px 8px rgba(0, 0, 0, .3);
  --shadow-lg: 0 8px 16px 4px rgba(0, 0, 0, .35);
  --shadow-glow-brand: 0 8px 16px 4px rgba(249, 116, 21, .35);

  /* ---- Tipografia ---- */
  --font: "Roboto", -apple-system, BlinkMacSystemFont, "Segoe UI", Arial, sans-serif;

  /* Os tamanhos são fluidos entre mobile (375) e desktop (1600). O
     `clamp` substitui três blocos de media query por breakpoint: o
     valor do meio interpola no viewport e os extremos travam nos
     números que o Figma define em cada prancha. */
  --fs-display: clamp(2.5rem, 1.66rem + 3.59vw, 4rem);      /* 40 → 64 */
  --fs-h1: clamp(2.25rem, 1.61rem + 2.73vw, 3.5rem);        /* 36 → 56 */
  --fs-h2: clamp(2rem, 1.44rem + 2.39vw, 3rem);             /* 32 → 48 */
  --fs-h3: clamp(1.75rem, 1.33rem + 1.79vw, 2.5rem);        /* 28 → 40 */
  --fs-h4: clamp(1.5rem, 1.22rem + 1.19vw, 2rem);           /* 24 → 32 */
  --fs-h5: 1.5rem;                                          /* 24 */
  --fs-h6: 1.25rem;                                         /* 20 */
  --fs-body-lg: clamp(1rem, .94rem + .27vw, 1.125rem);      /* 16 → 18 */
  --fs-body-md: 1rem;                                       /* 16 */
  --fs-body-sm: .875rem;                                    /* 14 */
  --fs-button: 1rem;                                        /* 16 */
  --fs-label: .875rem;                                      /* 14 */
  --fs-nav: .9375rem;                                       /* 15 */
  --fs-overline: .875rem;                                   /* 14 */

  --lh-display: 1.05;
  --lh-heading: 1.1;
  --lh-body: 1.6;
  --lh-tight: 1.3;

  /* ---- Grid ----
     Desktop: 12 colunas, gutter 24, margem 140, base 1600 →
     a faixa de conteúdo tem 1600 - 280 = 1320px.
     Tablet: 8 colunas, gutter 20, margem 40.
     Mobile: 4 colunas, gutter 16, margem 20.
     `--gutter-x` é a margem lateral; ele muda nos media queries lá
     embaixo e TODA seção o consome, então o alinhamento vertical das
     seções nunca depende de cada uma lembrar do número. */
  --content-max: 1320px;
  --gutter-x: var(--space-5xl);

  --ease: cubic-bezier(.22, .61, .36, 1);
  --transition: 180ms var(--ease);
}

/* ================================================================
   RESET
   ================================================================ */

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

html {
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
  /* A navbar é `sticky; top: 0`, então toda âncora interna — inclusive o
     "Pular para o conteúdo" — aterrissava por baixo dela, sem jeito de
     rolar de volta. O `scroll-padding-top` reserva a faixa dela em TODO
     salto de rolagem, o do clique e o que o navegador faz sozinho ao
     mover o foco. Medido: 93–95px nos três breakpoints; a folga do
     `--space-md` evita o texto colado na borda. */
  scroll-padding-top: calc(var(--altura-navbar) + var(--space-md));
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *,
  *::before,
  *::after {
    animation-duration: .01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .01ms !important;
  }
}

body {
  margin: 0;
  background: var(--bg-primary);
  color: var(--text-primary);
  font-family: var(--font);
  font-size: var(--fs-body-md);
  line-height: var(--lh-body);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  overflow-x: hidden;
}

h1, h2, h3, h4, h5, h6, p, figure, blockquote { margin: 0; }
ul, ol { margin: 0; padding: 0; list-style: none; }

img, svg, video { display: block; max-width: 100%; }
img { height: auto; }

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

button {
  font: inherit;
  color: inherit;
  background: none;
  border: 0;
  padding: 0;
  cursor: pointer;
}

/* O focus ring do Design System: Brand/Primary a 50%, 3px de spread,
   sem blur. Só no foco por teclado — `:focus-visible`, não `:focus`,
   para o anel não aparecer em clique de mouse. */
:focus-visible {
  outline: none;
  box-shadow: 0 0 0 3px rgba(249, 116, 21, .5);
  border-radius: var(--radius-xs);
}

/* Conteúdo só para leitor de tela. */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* Pular para o conteúdo: invisível até receber foco. */
.skip-link {
  position: absolute;
  top: var(--space-xs);
  left: var(--space-xs);
  z-index: 200;
  padding: var(--space-sm) var(--space-md);
  background: var(--brand-primary);
  color: var(--black);
  border-radius: var(--radius-sm);
  font-weight: 600;
  transform: translateY(-200%);
  transition: transform var(--transition);
}
.skip-link:focus { transform: translateY(0); }

/* ================================================================
   LAYOUT
   ================================================================ */

/* A seção é quem paga a margem lateral; o miolo trava em 1320px e
   centraliza. Assim uma seção full-bleed (fundo que sangra) e uma
   seção comum usam a mesma regra e ficam alinhadas entre si. */
.secao {
  padding-block: var(--space-4xl);
  padding-inline: var(--gutter-x);
}

.secao__interno {
  width: 100%;
  max-width: var(--content-max);
  margin-inline: auto;
}

/* ================================================================
   TIPOGRAFIA
   ================================================================ */

.display {
  font-size: var(--fs-display);
  font-weight: 800;
  line-height: var(--lh-display);
}

.titulo-h2 {
  font-size: var(--fs-h2);
  font-weight: 700;
  line-height: var(--lh-heading);
}

.titulo-h3 {
  font-size: var(--fs-h3);
  font-weight: 700;
  line-height: var(--lh-heading);
}

.titulo-h4 {
  font-size: var(--fs-h4);
  font-weight: 700;
  line-height: 1.2;
}

.titulo-h5 {
  font-size: var(--fs-h5);
  font-weight: 600;
  line-height: 1.2;
}

/* O laranja dentro dos títulos. É sempre um trecho do MESMO título,
   nunca um heading separado — por isso um span e não um <strong>:
   a ênfase aqui é visual, não semântica. */
.destaque { color: var(--brand-primary); }

.texto-lg {
  font-size: var(--fs-body-lg);
  line-height: var(--lh-body);
  color: var(--text-secondary);
}

.texto-md {
  font-size: var(--fs-body-md);
  line-height: var(--lh-body);
  color: var(--text-secondary);
}

.texto-sm {
  font-size: var(--fs-body-sm);
  line-height: 1.5;
  color: var(--text-secondary);
}

/* ================================================================
   TAG / PÍLULA DE SEÇÃO  ("Quem Somos", "Nossos Serviços"…)
   ================================================================ */

.tag {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 32px;
  padding: var(--space-xs) var(--space-md);
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-full);
  background: var(--bg-surface);
  color: var(--text-muted);
  font-size: var(--fs-label);
  font-weight: 500;
  line-height: var(--lh-tight);
  white-space: nowrap;
}

/* A tag da seção "Quem Somos" usa fundo e borda um pouco mais claros. */
.tag--clara {
  background: var(--bg-tertiary);
  border-color: var(--surface-light);
}

/* ================================================================
   TRILHA (breadcrumb)
   Aparece em Contato, A Alfama e Política de Privacidade — por isso
   mora aqui e não no CSS de uma página só.

   É uma <ol> dentro de <nav aria-label>: a ordem importa (é um
   caminho), e o separador é um ::before decorativo, não um caractere
   no meio do texto que o leitor de tela teria de soletrar.
   ================================================================ */

.trilha ol {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--space-xs);
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
}

.trilha li { display: flex; align-items: center; gap: var(--space-xs); }

.trilha li + li::before {
  content: ">";
  color: var(--text-secondary);
}

.trilha a { transition: color var(--transition); }
.trilha a:hover { color: var(--text-primary); }

.trilha [aria-current="page"] { color: var(--brand-primary); }

/* ================================================================
   CAMPOS DE FORMULÁRIO
   Usados hoje só em Contato, mas um formulário nunca fica numa página
   só — orçamento, newsletter e candidatura vêm depois com os mesmos
   campos.
   ================================================================ */

.campo {
  display: flex;
  flex: 1 1 0;
  flex-direction: column;
  gap: var(--space-xs);
  min-width: 0;
}

.campo__rotulo {
  color: var(--text-primary);
  font-size: var(--fs-body-sm);
  font-weight: 500;
  line-height: 1.4;
}

/* O asterisco é `aria-hidden` no HTML: quem anuncia a obrigatoriedade
   é o `required` do campo, e não um símbolo solto no meio do rótulo. */
.campo__rotulo span { color: var(--brand-primary); }

.campo__entrada {
  width: 100%;
  min-height: 48px;
  padding: var(--space-sm) var(--space-md);
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-sm);
  background: var(--bg-surface);
  color: var(--text-primary);
  font-family: inherit;
  font-size: var(--fs-body-md);
  line-height: 1.5;
  transition: border-color var(--transition), background-color var(--transition);
}

.campo__entrada::placeholder { color: var(--text-secondary); opacity: 1; }

.campo__entrada:hover { border-color: var(--border-dark); }

.campo__entrada:focus-visible {
  border-color: var(--brand-primary);
  box-shadow: 0 0 0 3px rgba(249, 116, 21, .5);
  border-radius: var(--radius-sm);
}

/* `:invalid` sozinho pintaria de vermelho um campo obrigatório ainda
   vazio antes de a pessoa digitar qualquer coisa. `:user-invalid` só
   vale depois da interação — que é quando o erro é de fato um erro. */
.campo__entrada:user-invalid {
  border-color: var(--status-error);
}

.campo__entrada--area {
  min-height: 140px;
  resize: vertical;
}

/* O <select> nativo com a seta desenhada por nós. `appearance: none`
   tira a seta do sistema; o padding à direita abre o espaço da nossa. */
.campo__selecao { position: relative; }

.campo__selecao .campo__entrada {
  appearance: none;
  -webkit-appearance: none;
  padding-right: var(--space-2xl);
  cursor: pointer;
}

.campo__seta {
  position: absolute;
  top: 50%;
  right: var(--space-md);
  width: 16px;
  height: 16px;
  transform: translateY(-50%);
  fill: none;
  stroke: var(--text-secondary);
  pointer-events: none;
}

/* ================================================================
   BOTÕES
   Três tamanhos (sm/md/lg) × estados Default/Hover/Active/Focus.
   Todos têm min-height 44px — o alvo de toque mínimo do WCAG 2.5.5.
   A altura VISUAL do sm continua menor; quem cresce é a área de
   clique, via padding.
   ================================================================ */

.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
  min-height: 44px;
  height: 46px;
  padding-inline: var(--space-lg);
  border: var(--border-thin) solid transparent;
  border-radius: var(--radius-full);
  font-size: var(--fs-button);
  font-weight: 500;
  line-height: var(--lh-body);
  white-space: nowrap;
  cursor: pointer;
  transition: background-color var(--transition), border-color var(--transition),
              color var(--transition), transform var(--transition);
}

.btn:active { transform: translateY(1px); }

.btn__icone {
  width: 10px;
  height: 13px;
  flex: none;
  fill: currentColor;
  transform: rotate(90deg);
  transition: transform var(--transition);
}

.btn:hover .btn__icone { transform: rotate(90deg) translateY(-2px); }

/* Primário — o azul da marca. É o CTA dominante da navbar, do hero
   e do "Quem Somos". */
.btn--primario {
  /* O tom do hover mora numa custom property porque quem o aciona nem
     sempre é o próprio botão: no card de CTA dos serviços quem acende é
     o card, que é o link de verdade. */
  --btn-primario-hover: #3235a5;
  background: var(--brand-secondary);
  color: var(--text-primary);
}
.btn--primario:hover { background: var(--btn-primario-hover); }
.btn--primario:active { background: #2b2e93; }

/* Laranja — reservado ao CTA final ("Solicitar orçamento"), onde ele
   é o único botão colorido e não disputa com o azul. */
.btn--laranja {
  background: var(--brand-primary);
  color: var(--black);
}
.btn--laranja:hover { background: var(--brand-primary-hover); color: var(--white); }
.btn--laranja:active { background: var(--brand-primary-active); }

/* Secundário — superfície elevada com borda. */
.btn--secundario {
  background: var(--bg-elevated);
  border-color: var(--border-medium);
  color: var(--white);
}
.btn--secundario:hover {
  background: var(--surface-medium);
  border-color: var(--border-dark);
}

/* Claro — sobre o banner de CTA, onde o fundo já é quente. */
.btn--claro {
  background: var(--text-primary);
  color: var(--black);
}
.btn--claro:hover { background: var(--white); }

/* Link com seta, sem caixa ("Já sou cliente", "Mais projetos"). */
.link-seta {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2xs);
  color: var(--text-light);
  font-size: var(--fs-label);
  font-weight: 500;
  line-height: var(--lh-tight);
  transition: color var(--transition);
}
.link-seta:hover { color: var(--text-primary); }

.link-seta__icone {
  width: 12px;
  height: 12px;
  flex: none;
  fill: currentColor;
  transition: transform var(--transition);
}

/* ================================================================
   NAVBAR
   ================================================================ */

.navbar {
  position: sticky;
  top: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-lg);
  padding: var(--space-lg) var(--gutter-x);
  background: var(--bg-surface);
  border-bottom: 1.5px solid var(--surface-dark);
  border-radius: 0 0 var(--radius-2xl) var(--radius-2xl);
}

.navbar__logo { display: block; flex: none; }
.navbar__logo img { width: 177px; height: 24px; }

.navbar__conteudo {
  display: flex;
  align-items: center;
  gap: var(--space-4xl);
}

.navbar__links {
  display: flex;
  align-items: center;
  gap: var(--space-2xl);
  font-size: var(--fs-label);
}

.navbar__link {
  position: relative;
  display: inline-block;
  padding-block: var(--space-xs);
  color: var(--text-light);
  line-height: 1.5;
  white-space: nowrap;
  transition: color var(--transition);
}
.navbar__link:hover { color: var(--text-primary); }

/* O indicador da página ativa: a barrinha laranja de 35×3 que no
   Figma fica colada na borda inferior da navbar. Ela é ::after do
   próprio link, e não um elemento posicionado por pixel, para
   continuar sob o link certo quando os rótulos mudarem. */
.navbar__link--ativo {
  color: var(--text-primary);
  font-weight: 600;
}
.navbar__link--ativo::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: calc(var(--space-lg) * -1 - 1.5px);
  width: 35px;
  height: 3px;
  transform: translateX(-50%);
  background: var(--brand-primary);
  border-radius: var(--radius-sm);
}

.navbar__acoes {
  display: flex;
  align-items: center;
  gap: var(--space-md);
}

/* ---- "Já sou cliente" + o dropdown de WhatsApp ---- */

.navbar__cliente { position: relative; }

.navbar__cliente-botao { cursor: pointer; }

/* A seta aponta para baixo e gira quando o painel abre — é o sinal visual
   do mesmo estado que o `aria-expanded` carrega para o leitor de tela. */
.navbar__cliente-botao .link-seta__icone {
  transform: rotate(90deg);
  transition: transform var(--transition);
}
.navbar__cliente-botao[aria-expanded="true"] .link-seta__icone {
  transform: rotate(-90deg);
}

/* O painel. Mesma estrutura do site atual (.dropdown > .item, ícone +
   link com <strong>), com os tokens deste design system.

   `hidden` no HTML é o estado inicial e vale ANTES de o CSS carregar —
   é o JS que o tira e o devolve. Por isso o `display` abaixo não força
   nada quando o atributo está presente. */
.dropdown {
  position: absolute;
  top: calc(100% + var(--space-sm));
  right: 0;
  z-index: 110;
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
  min-width: 220px;
  padding: var(--space-xs);
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-md);
  background: var(--bg-tertiary);
  box-shadow: var(--shadow-lg);
}
.dropdown[hidden] { display: none; }

.dropdown .item {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  padding: var(--space-sm);
  border-radius: var(--radius-sm);
  transition: background-color var(--transition);
}
.dropdown .item:hover { background: var(--bg-surface); }

.dropdown .item__icone {
  width: 20px;
  height: 20px;
  flex: none;
  fill: var(--brand-primary);
}

/* O link ocupa a linha toda: a área de clique é o item, não só a palavra. */
.dropdown .item a {
  flex: 1 1 auto;
  color: var(--text-primary);
  font-size: var(--fs-body-sm);
  transition: color var(--transition);
}
.dropdown .item a:hover { color: var(--brand-primary); }
.dropdown .item strong { font-weight: 600; }

/* Botão hambúrguer — só existe abaixo de 1200px. */
.navbar__toggle {
  display: none;
  width: 44px;
  height: 44px;
  align-items: center;
  justify-content: center;
  color: var(--text-primary);
}

/* As três barras do estado fechado. */
.navbar__toggle-barras,
.navbar__toggle-barras::before,
.navbar__toggle-barras::after {
  display: block;
  width: 24px;
  height: 2px;
  background: currentColor;
  border-radius: 2px;
}

.navbar__toggle-barras { position: relative; }
.navbar__toggle-barras::before,
.navbar__toggle-barras::after {
  content: "";
  position: absolute;
  left: 0;
}
.navbar__toggle-barras::before { top: -7px; }
.navbar__toggle-barras::after { top: 7px; }

/* O ✕ do estado aberto. Um desenho próprio, e não as barras giradas em
   45°: girar depende de três transforms coincidirem no mesmo ponto, e
   basta um pixel de diferença para o X sair torto. */
.navbar__toggle-x {
  display: none;
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
}

.navbar__toggle[aria-expanded="true"] .navbar__toggle-barras { display: none; }
.navbar__toggle[aria-expanded="true"] .navbar__toggle-x { display: block; }

/* ================================================================
   BOTÕES FLUTUANTES (assistente + WhatsApp)
   ================================================================ */

.flutuantes {
  position: fixed;
  right: var(--space-lg);
  top: 50%;
  z-index: 90;
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
  transform: translateY(-50%);
}

.flutuante {
  display: grid;
  place-items: center;
  width: 56px;
  height: 56px;
  border-radius: var(--radius-pill);
  color: var(--white);
  box-shadow: var(--shadow-md);
  transition: transform var(--transition), box-shadow var(--transition);
}
.flutuante:hover {
  transform: scale(1.06);
  box-shadow: var(--shadow-lg);
}

.flutuante--assistente { background: var(--brand-dark-blue); }
.flutuante--whatsapp { background: var(--brand-primary); }

.flutuante svg { width: 26px; height: 26px; fill: currentColor; }

/* ================================================================
   BANNER DE CTA  (aparece no fim de várias páginas)
   ================================================================ */

.cta-banner {
  position: relative;
  padding: var(--space-4xl) var(--space-2xl);
  border-radius: var(--radius-xl);
  background: var(--bg-surface);
  overflow: hidden;
  text-align: center;
  isolation: isolate;
}

/* O gradiente quente do Figma é uma imagem; ela entra como camada de
   fundo (não como <img>) porque é decoração — não tem o que descrever
   para um leitor de tela. */
.cta-banner__fundo {
  position: absolute;
  inset: 0;
  z-index: -1;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.cta-banner__conteudo {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-xl);
  max-width: 755px;
  margin-inline: auto;
}

.cta-banner__titulo {
  font-size: var(--fs-h2);
  font-weight: 700;
  line-height: var(--lh-heading);
  color: var(--text-primary);
}

.cta-banner__texto {
  font-size: var(--fs-body-lg);
  color: var(--text-primary);
}

.cta-banner__acoes {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-md);
}

/* A anotação manuscrita ("Tem uma ideia? …") com a setinha. */
.cta-banner__nota {
  display: flex;
  align-items: flex-start;
  gap: var(--space-xs);
  max-width: 220px;
  margin-top: var(--space-md);
  margin-inline: auto;
  color: var(--text-primary);
  font-size: var(--fs-body-sm);
  font-weight: 700;
  line-height: var(--lh-tight);
  text-align: left;
}

.cta-banner__nota svg {
  width: 69px;
  height: 22px;
  flex: none;
  fill: none;
  stroke: currentColor;
}

/* As duas fagulhas nos cantos do banner. */
.cta-banner__fagulha {
  position: absolute;
  width: 29px;
  height: 28px;
  fill: var(--text-primary);
  pointer-events: none;
}
.cta-banner__fagulha--1 { top: 40px; right: 141px; }
.cta-banner__fagulha--2 { bottom: 40px; left: 157px; }

/* ================================================================
   RODAPÉ
   ================================================================ */

.rodape {
  padding: var(--space-4xl) var(--gutter-x) var(--space-2xl);
  background: var(--bg-primary);
}

.rodape__interno {
  width: 100%;
  max-width: var(--content-max);
  margin-inline: auto;
}

.rodape__topo {
  display: grid;
  grid-template-columns: 362px 1fr;
  gap: var(--space-4xl);
  align-items: start;
}

.rodape__marca {
  display: flex;
  flex-direction: column;
  gap: var(--space-lg);
}

.rodape__logo img { width: 292px; height: 40px; }

.rodape__slogan {
  max-width: 320px;
  color: var(--text-secondary);
  font-size: var(--fs-body-sm);
  line-height: 1.5;
}

.rodape__parceiros {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
}
.rodape__parceiros img { opacity: .9; }

.rodape__menus {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: var(--space-4xl);
}

.rodape__menu {
  display: flex;
  flex-direction: column;
  gap: var(--space-lg);
}

/* Cada item é um link com uma linha embaixo e a seta à direita. O
   `border-bottom` no <a> substitui o retângulo de 1px que o Figma
   desenha solto — menos um nó, e a linha acompanha o link no hover. */
.rodape__item {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
  padding-bottom: var(--space-sm);
  border-bottom: var(--border-thin) solid var(--surface-dark);
  color: var(--text-primary);
  font-size: var(--fs-nav);
  line-height: 1.25;
  transition: color var(--transition), border-color var(--transition);
}
.rodape__item:hover {
  color: var(--brand-primary);
  border-bottom-color: var(--border-medium);
}

.rodape__item-icone {
  width: 16px;
  height: 16px;
  flex: none;
  fill: none;
  stroke: var(--text-secondary);
  transition: stroke var(--transition);
}
.rodape__item:hover .rodape__item-icone { stroke: var(--brand-primary); }

/* Ícones que são preenchidos em vez de traçados (e-mail). */
.rodape__item-icone--preenchido {
  fill: var(--text-secondary);
  stroke: none;
  transition: fill var(--transition);
}
.rodape__item:hover .rodape__item-icone--preenchido { fill: var(--brand-primary); }

.rodape__item-texto { flex: 1 0 auto; }

.rodape__item-seta {
  width: 9px;
  height: 18px;
  flex: none;
  fill: var(--text-secondary);
  transition: transform var(--transition), fill var(--transition);
}
.rodape__item:hover .rodape__item-seta {
  fill: var(--brand-primary);
  transform: translateX(3px);
}

.rodape__base {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-md);
  margin-top: var(--space-xl);
  padding-top: var(--space-xl);
  border-top: var(--border-thin) solid var(--surface-dark);
  color: var(--text-muted);
  font-size: var(--fs-body-sm);
  font-weight: 500;
  line-height: var(--lh-tight);
}

.rodape__legal {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
}
.rodape__legal a:hover { color: var(--brand-primary); }

.rodape__social {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
}

.rodape__social-icones {
  display: flex;
  align-items: center;
  gap: var(--space-md);
}

.rodape__social-icones a {
  display: grid;
  place-items: center;
  width: 24px;
  height: 24px;
  color: var(--text-primary);
  transition: color var(--transition), transform var(--transition);
}
.rodape__social-icones a:hover {
  color: var(--brand-primary);
  transform: translateY(-2px);
}
.rodape__social-icones svg { width: 24px; height: 24px; fill: currentColor; }

/* ================================================================
   REVELAÇÃO EM CASCATA
   Referência: redstone.software, `.slideAnim` + o `data-animate` que
   escalona os filhos. O elemento nasce 50px abaixo e transparente; ao
   entrar na tela ganha `.revelado` e volta ao lugar. O atraso de cada
   um vem de `--atraso`, que o JS escreve a partir do
   `data-animar-intervalo` do contêiner.

   Quem NÃO tem JS nunca recebe `.revelado` — por isso o estado escondido
   só vale sob `.js`. Sem script, os cards aparecem normalmente.
   ================================================================ */

.js .revela {
  opacity: 0;
  transform: translateY(50px);
  transition: opacity .8s cubic-bezier(.215, .61, .355, 1) var(--atraso, 0ms),
              transform .8s cubic-bezier(.215, .61, .355, 1) var(--atraso, 0ms);
}

.js .revela.revelado {
  opacity: 1;
  transform: none;
}

@media (prefers-reduced-motion: reduce) {
  .js .revela {
    opacity: 1;
    transform: none;
    transition: none;
  }
}

/* ================================================================
   CURSOR PERSONALIZADO
   Referência: redstone.software. Um círculo branco que segue o mouse
   e só aparece sobre o que é clicável de imagem inteira (card de
   projeto, capa de post) — onde a área é grande e o alvo do clique
   não é óbvio.

   `position: fixed` com `left/top` em px: é assim que o JS o move,
   com uma interpolação de 0,15 por quadro, que é o que dá o atraso
   elástico. `pointer-events: none` é obrigatório — sem ele o círculo
   ficaria embaixo do ponteiro e roubaria todo clique da página.
   ================================================================ */

.cursor {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 1000;
  display: none;
  pointer-events: none;
  will-change: left, top;
}

/* Só existe para ponteiro fino. Em toque não há cursor para seguir, e
   o círculo ficaria parado num canto. O JS confirma o mesmo teste. */
@media (pointer: fine) {
  .js .cursor { display: block; }
}

@media (prefers-reduced-motion: reduce) {
  .cursor { display: none !important; }
}

.cursor__bolha {
  --tamanho: 96px;
  position: absolute;
  /* O círculo nasce centrado no ponto que o JS escreve. */
  inset: calc(var(--tamanho) / -2) auto auto calc(var(--tamanho) / -2);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
  width: var(--tamanho);
  height: var(--tamanho);
  padding: var(--space-xs);
  border-radius: var(--radius-pill);
  background: var(--white);
  color: var(--black);
  font-size: var(--fs-body-sm);
  font-weight: 500;
  line-height: 1.1;
  transform: scale(0);
  transition: transform .25s linear;
  backface-visibility: hidden;
}

.cursor__bolha svg {
  width: 1.875em;
  height: 1.875em;
  fill: none;
  stroke: currentColor;
}

.cursor.is-link .cursor__bolha--link { transform: scale(1); }

/* ================================================================
   DIVISOR (a linha com o círculo no meio)
   ================================================================ */

.divisor {
  width: 100%;
  max-width: 825px;
  height: 12px;
  margin-inline: auto;
  opacity: .64;
}



/* ================================================================
   SEÇÕES COMPARTILHADAS ENTRE PÁGINAS
   Clientes, Depoimentos e Diferenciais nasceram na home e hoje
   aparecem também em "A Alfama". Pela regra do projeto (ver README),
   o que é usado por mais de uma página SOBE para cá — senão a segunda
   página teria de carregar o CSS da primeira inteiro.
   ================================================================ */

/* ================================================================
   CLIENTES — a esteira de logos
   ================================================================ */

.clientes {
  display: flex;
  align-items: center;
  gap: var(--space-2xl);
}

.clientes__titulo {
  flex: none;
  max-width: 340px;
  font-size: var(--fs-h4);
  font-weight: 700;
  line-height: var(--lh-heading);
  color: var(--text-primary);
}

/* A esteira rola sozinha. A lista é duplicada no HTML (a segunda
   cópia marcada `aria-hidden`) para que o loop de -50% emende sem
   salto visível. */
.clientes__esteira {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}

.clientes__trilha {
  display: flex;
  align-items: center;
  width: max-content;
  gap: var(--space-xl);
  animation: esteira 32s linear infinite;
}

.clientes__esteira:hover .clientes__trilha { animation-play-state: paused; }

@keyframes esteira {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

@media (prefers-reduced-motion: reduce) {
  .clientes__trilha { animation: none; }
}

.clientes__logo {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  width: 124px;
  height: 24px;
  flex: none;
  color: var(--text-secondary);
  font-size: var(--fs-body-md);
}

/* Placeholder do logo do cliente enquanto as marcas reais não vêm
   do CMS — o mesmo quadrado cinza que está no Figma. */
.clientes__logo-marca {
  width: 20px;
  height: 20px;
  flex: none;
  background: var(--text-secondary);
  border-radius: var(--radius-xs);
  opacity: .5;
}

.clientes__ponto {
  width: 8px;
  height: 8px;
  flex: none;
  fill: var(--brand-primary);
}

/* ================================================================
   DEPOIMENTOS
   ================================================================ */

.depoimentos {
  position: relative;
  overflow: hidden;
  isolation: isolate;
}

.depoimentos::before,
.depoimentos::after {
  content: "";
  position: absolute;
  z-index: -1;
  width: 600px;
  height: 600px;
  border-radius: 50%;
  pointer-events: none;
}
.depoimentos::before {
  top: 12%;
  left: -300px;
  background: radial-gradient(closest-side, rgba(249, 116, 21, .15), transparent);
}
.depoimentos::after {
  top: 10%;
  right: -260px;
  background: radial-gradient(closest-side, rgba(59, 62, 186, .18), transparent);
}

.depoimentos__grade {
  display: grid;
  grid-template-columns: 400px minmax(0, 1fr);
  gap: var(--space-2xl);
  align-items: start;
}

.depoimentos__retrato-col {
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
}

.depoimentos__retrato {
  width: 100%;
  aspect-ratio: 400 / 411;
  border: var(--border-thin) solid var(--border-dark);
  border-radius: var(--radius-xl);
  overflow: hidden;
}
.depoimentos__retrato img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.depoimentos__navegacao {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--space-2xl);
}

.depoimentos__seta {
  display: grid;
  place-items: center;
  width: 56px;
  height: 56px;
  flex: none;
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-pill);
  background: var(--surface-dark);
  color: var(--text-primary);
  transition: background-color var(--transition), color var(--transition), border-color var(--transition);
}
.depoimentos__seta:hover:not(:disabled) {
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: var(--black);
}
.depoimentos__seta:disabled { opacity: .4; cursor: default; }
.depoimentos__seta svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
}

/* A barra de progresso do carrossel: o trilho é o elemento e o
   preenchimento laranja é o ::after, largura definida em `--avanco`
   pelo JS. Sem JS a barra fica cheia, que é o estado honesto de
   "não há navegação". */
.depoimentos__barra {
  position: relative;
  width: 120px;
  height: 4px;
  flex: none;
  background: var(--border-medium);
  border-radius: 2px;
  overflow: hidden;
}
.depoimentos__barra::after {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: var(--avanco, 100%);
  background: var(--brand-primary);
  border-radius: 2px;
  transition: width 300ms var(--ease);
}

.depoimentos__conteudo {
  display: flex;
  flex-direction: column;
  gap: var(--space-2xl);
  padding-block: var(--space-lg);
}

.depoimento[hidden] { display: none; }

.depoimento {
  display: flex;
  flex-direction: column;
  gap: var(--space-2xl);
}

.depoimento__nota {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  font-size: var(--fs-h5);
  font-weight: 700;
  color: var(--text-primary);
}
.depoimento__nota svg {
  width: 24px;
  height: 24px;
  fill: none;
  stroke: var(--status-warning);
  stroke-width: 2;
  stroke-linecap: round;
}

.depoimento__texto {
  font-size: var(--fs-body-lg);
  line-height: var(--lh-body);
  color: var(--text-primary);
}

.depoimento__meta {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-lg);
  padding-top: var(--space-lg);
  border-top: var(--border-thin) solid var(--border-medium);
}

.depoimento__autor {
  display: flex;
  flex-direction: column;
  gap: var(--space-xs);
}
.depoimento__nome {
  font-size: var(--fs-body-md);
  font-weight: 700;
  color: var(--text-primary);
}
.depoimento__empresa {
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
}

.depoimento__selo {
  display: flex;
  align-items: center;
  gap: var(--space-xs);
  color: var(--text-primary);
  font-size: var(--fs-body-sm);
  font-weight: 700;
  letter-spacing: .04em;
}
.depoimento__selo svg {
  width: 20px;
  height: 20px;
  fill: none;
  stroke: var(--brand-primary);
  stroke-width: 2;
  stroke-linecap: round;
}

/* ================================================================
   DIFERENCIAIS
   ================================================================ */

.diferenciais {
  position: relative;
  background: var(--bg-surface);
  isolation: isolate;
}

/* A textura de ruído do Figma, em `multiply`. 34 KB que dão a
   granulação do fundo preto. */
.diferenciais::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background-image: url("../img/textura-ruido.webp");
  background-size: 134px 134px;
  mix-blend-mode: multiply;
  opacity: .6;
  pointer-events: none;
}

.diferenciais__conteudo {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-lg);
  align-items: center;
}

.diferenciais__cabecalho {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-xl);
}

.diferenciais__titulo {
  font-size: var(--fs-h2);
  font-weight: 700;
  line-height: var(--lh-heading);
}

.diferenciais__lista {
  display: flex;
  flex-direction: column;
  gap: var(--space-2xl);
}

.diferencial {
  display: flex;
  align-items: center;
  gap: var(--space-lg);
}

/* O anel de progresso é SVG, não imagem: o percentual do texto e o
   arco saem do MESMO número (`--pct`), então não há como um dizer
   99% e o outro desenhar outra coisa. */
.diferencial__anel {
  position: relative;
  width: 112px;
  height: 112px;
  flex: none;
}

.diferencial__anel svg {
  width: 100%;
  height: 100%;
  transform: rotate(-90deg);
}

.diferencial__anel circle {
  fill: none;
  stroke-width: 8.4;
}

.diferencial__trilho { stroke: var(--surface-track); }

.diferencial__arco {
  stroke: var(--brand-secondary);
  stroke-linecap: round;
  /* r = 51.8 → circunferência = 2πr ≈ 325.5 */
  stroke-dasharray: 325.5;
  stroke-dashoffset: calc(325.5 - 325.5 * var(--pct) / 100);
  transition: stroke-dashoffset 900ms var(--ease);
}

.diferencial__valor {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
  font-size: var(--fs-h5);
  font-weight: 700;
  color: var(--text-primary);
}

.diferencial__conteudo {
  display: flex;
  flex-direction: column;
  gap: var(--space-md);
}

.diferencial__titulo {
  color: var(--brand-primary);
  font-size: var(--fs-body-md);
  font-weight: 700;
  line-height: 1.2;
}

.diferencial__texto {
  color: var(--text-secondary);
  font-size: var(--fs-body-md);
  line-height: var(--lh-body);
}

/* ---------------------------------------------------------------
   Responsivo das três seções compartilhadas
   --------------------------------------------------------------- */

@media (max-width: 1200px) {
  .depoimentos__grade { grid-template-columns: 320px minmax(0, 1fr); }
}

@media (max-width: 900px) {
  .clientes {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-xl);
  }
  .clientes__titulo { max-width: none; }

  .depoimentos__grade {
    grid-template-columns: 1fr;
    gap: var(--space-xl);
  }
  .depoimentos__retrato { max-width: 400px; }

  .diferenciais__conteudo {
    grid-template-columns: 1fr;
    gap: var(--space-2xl);
  }
}

@media (max-width: 560px) {
  .depoimentos__navegacao { gap: var(--space-lg); }
  .depoimento__meta {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-md);
  }

  .diferencial { align-items: flex-start; }
}

/* Na largura mais estreita o anel do diferencial encolhe junto. */
@media (max-width: 400px) {
  .diferencial {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--space-md);
  }
}

/* ================================================================
   CARD DE PROJETO
   Nasceu na home e hoje serve também a página Projetos. Pela regra do
   projeto (ver README), subiu para cá. A SEÇÃO que envolve a grade
   continua sendo de cada página — o que é comum é o card.
   ================================================================ */

.projetos__grade {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--space-lg);
  align-items: start;
}

.projetos__coluna {
  display: flex;
  flex-direction: column;
  gap: var(--space-3xl);
}

/* O card INTEIRO é a âncora (ver partes/card-projeto.php). Enquanto a URL
   externa não estiver cadastrada ele sai sem `href` — e aí não é link:
   não recebe foco nem cursor de mão. */
.projeto {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: var(--space-lg);
  color: inherit;
}
.projeto[href] { cursor: pointer; }

.projeto__midia {
  position: relative;
  width: 100%;
  border-radius: var(--radius-xl);
  overflow: hidden;
}

.projeto__midia img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  transition: transform 400ms var(--ease);
}
.projeto[href]:hover .projeto__midia img { transform: scale(1.04); }

.projeto--padrao .projeto__midia { aspect-ratio: 648 / 532; }
.projeto--alto   .projeto__midia { aspect-ratio: 648 / 665; }
.projeto--baixo  .projeto__midia { aspect-ratio: 648 / 487; }

/* A seta é só o indicador visual de que o card leva a algum lugar — quem
   é o link é o card. Por isso ela é um <span> aria-hidden. */
.projeto__seta {
  position: absolute;
  right: var(--space-2xl);
  bottom: var(--space-2xl);
  display: grid;
  place-items: center;
  width: 44px;
  height: 44px;
  background: var(--bg-tertiary);
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-pill);
  color: var(--text-primary);
  transition: background-color var(--transition), color var(--transition), transform var(--transition);
}
.projeto[href]:hover .projeto__seta,
.projeto[href]:focus-visible .projeto__seta {
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: var(--black);
  transform: translate(2px, -2px);
}
.projeto__seta svg { width: 22px; height: 22px; fill: currentColor; }

.projeto__info {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: var(--space-lg);
}

.projeto__nome {
  font-size: var(--fs-h5);
  font-weight: 600;
  line-height: 1.2;
  color: var(--text-primary);
  text-transform: uppercase;
}

.projeto__meta {
  display: flex;
  flex-direction: column;
  gap: var(--space-sm);
  text-align: right;
}

.projeto__categoria {
  color: var(--text-primary);
  font-size: var(--fs-body-md);
  line-height: 1.2;
}

.projeto__techs {
  display: flex;
  flex-direction: column;
  gap: var(--space-2xs);
  color: var(--text-secondary);
  font-size: var(--fs-body-sm);
  line-height: 1.5;
}

@media (max-width: 900px) {
  .projetos__grade { grid-template-columns: 1fr; }
  .projetos__coluna { gap: var(--space-3xl); }
}

@media (max-width: 560px) {
  .projeto__info { flex-direction: column; gap: var(--space-xs); }
  .projeto__meta { text-align: left; }
  .projeto__techs { flex-direction: row; flex-wrap: wrap; gap: var(--space-sm); }
}




/* ================================================================
   CARD DE POST
   Nasceu na home e hoje serve também a listagem do Blog e os
   "artigos relacionados" do post. Subiu para cá pela regra do projeto.
   ================================================================ */

.post {
  display: flex;
  flex-direction: column;
  background: var(--bg-tertiary);
  border: var(--border-thin) solid var(--border-dark);
  border-radius: var(--radius-lg);
  overflow: hidden;
  transition: border-color var(--transition), transform var(--transition);
}
.post:hover {
  border-color: var(--brand-primary);
  transform: translateY(-4px);
}

.post__midia {
  aspect-ratio: 424 / 240;
  overflow: hidden;
}
.post__midia img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.post__conteudo {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: var(--space-lg);
  padding: var(--space-lg);
}

.post__meta {
  display: flex;
  align-items: center;
  gap: var(--space-sm);
}

.post__categoria {
  padding: var(--space-2xs) var(--space-sm);
  border: var(--border-thin) solid var(--brand-primary);
  border-radius: 100px;
  background: rgba(249, 116, 21, .15);
  color: var(--brand-primary);
  font-size: var(--fs-body-sm);
  line-height: 1.5;
}

.post__ponto {
  width: 6px;
  height: 6px;
  flex: none;
  fill: var(--text-muted);
}

.post__data {
  color: var(--text-muted);
  font-size: var(--fs-body-sm);
}

.post__texto-bloco {
  display: flex;
  flex: 1 1 auto;
  flex-direction: column;
  gap: var(--space-sm);
}

.post__titulo {
  font-size: var(--fs-h6);
  font-weight: 700;
  line-height: 1.2;
  color: var(--text-primary);
  /* Dois títulos de tamanhos diferentes desalinhavam os três cards.
     O corte em 2 linhas mantém a régua sem cortar no meio da palavra. */
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.post__resumo {
  font-size: var(--fs-body-sm);
  line-height: 1.5;
  color: var(--text-secondary);
  display: -webkit-box;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.post__autor {
  display: flex;
  align-items: center;
  gap: var(--space-md);
  margin-top: auto;
}

.post__avatar {
  width: 40px;
  height: 40px;
  flex: none;
  border-radius: 100px;
  object-fit: cover;
}

.post__autor-nome {
  font-size: var(--fs-body-sm);
  font-weight: 700;
  color: var(--text-primary);
}

.post__autor-cargo {
  font-size: var(--fs-body-sm);
  color: var(--text-secondary);
}

.blog__rodape {
  display: flex;
  justify-content: center;
}

@media (max-width: 768px) {
  .post__titulo { -webkit-line-clamp: 3; line-clamp: 3; }
}

/* ================================================================
   FILTROS POR CATEGORIA
   Usados em A Alfama (time), Projetos e Blog. O JS que os liga está
   no global.js.
   ================================================================ */

/* Os filtros só existem com JS — sem ele não há quem filtre, e um
   botão morto é pior que botão nenhum. A lista aparece inteira. */
.filtros { display: none; }
.js .filtros {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-sm);
}

/* Um item escondido pelo filtro sai do fluxo. O seletor mira o ATRIBUTO
   `hidden`, que é o que o JS escreve — e que também tira o item da
   árvore de acessibilidade, então o leitor de tela não anuncia o que
   não está na tela. */
[data-categoria][hidden] { display: none; }

/* A mensagem de "nada encontrado", quando a página declara uma. */
.filtros-vazio {
  display: none;
  padding: var(--space-2xl);
  border: var(--border-thin) dashed var(--border-medium);
  border-radius: var(--radius-lg);
  color: var(--text-secondary);
  font-size: var(--fs-body-lg);
  text-align: center;
}
.filtros-vazio[data-visivel="sim"] { display: block; }

.filtro {
  padding: var(--space-sm) var(--space-lg);
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-full);
  background: var(--bg-tertiary);
  color: var(--text-secondary);
  font-size: var(--fs-body-sm);
  font-weight: 500;
  line-height: 1.4;
  white-space: nowrap;
  transition: background-color var(--transition), border-color var(--transition), color var(--transition);
}
.filtro:hover {
  border-color: var(--border-dark);
  color: var(--text-primary);
}

.filtro--ativo {
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: var(--black);
  font-weight: 600;
}
.filtro--ativo:hover {
  background: var(--brand-primary-hover);
  border-color: var(--brand-primary-hover);
  color: var(--white);
}

/* ================================================================
   PAGINAÇÃO
   Usada em Projetos e no Blog.
   ================================================================ */

.paginacao {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: var(--space-xs);
}

.paginacao__pagina,
.paginacao__seta {
  display: grid;
  place-items: center;
  min-width: 44px;
  min-height: 44px;
  padding: var(--space-xs);
  border: var(--border-thin) solid var(--border-medium);
  border-radius: var(--radius-sm);
  background: var(--bg-tertiary);
  color: var(--text-primary);
  font-size: var(--fs-body-md);
  font-weight: 500;
  line-height: 1;
  transition: background-color var(--transition), border-color var(--transition), color var(--transition);
}

.paginacao__pagina:hover:not(:disabled),
.paginacao__seta:hover:not(:disabled) {
  border-color: var(--brand-primary);
  color: var(--brand-primary);
}

/* Desabilitado de verdade: apagado E sem cursor de clique. */
.paginacao__pagina:disabled,
.paginacao__seta:disabled {
  opacity: .45;
  cursor: default;
}

.paginacao__pagina--ativa {
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: var(--black);
  font-weight: 600;
}

.paginacao__seta svg {
  width: 18px;
  height: 18px;
  fill: none;
  stroke: currentColor;
  stroke-width: 2;
  stroke-linecap: round;
}

.paginacao__reticencias {
  padding-inline: var(--space-xs);
  color: var(--text-secondary);
}

@media (max-width: 560px) {
  .paginacao__pagina,
  .paginacao__seta { min-width: 40px; min-height: 44px; }
}


/* ================================================================
   RESPONSIVO
   Os três breakpoints do Design System: 1600 (desktop), 768 (tablet)
   e 375 (mobile). O ponto de virada da navbar é 1200 e não 768 —
   medido no próprio layout: os seis links mais os dois CTAs deixam
   de caber antes disso.
   ================================================================ */

@media (max-width: 1200px) {
  /* ----------------------------------------------------------------
     MENU EM TELA ESTREITA
     O painel é a tela inteira abaixo da navbar, e leva TUDO: os links,
     o "Já sou cliente" e o CTA. É assim no Figma — e faz sentido, porque
     esconder o CTA principal em mobile seria esconder o botão que mais
     converte.

     A altura da navbar é derivada dos tokens, não um número mágico:
     44px é o alvo de toque do botão (WCAG 2.5.5), mais o padding de
     cima e de baixo, mais a borda de 1,5px.
     ---------------------------------------------------------------- */
  :root { --altura-navbar: calc(44px + var(--space-lg) * 2 + 1.5px); }

  .navbar__conteudo {
    position: fixed;
    top: var(--altura-navbar);
    right: 0;
    bottom: 0;
    left: 0;
    flex-direction: column;
    align-items: stretch;
    justify-content: space-between;
    gap: 0;
    padding: var(--space-xl) var(--gutter-x) var(--space-2xl);
    background: var(--bg-surface);
    overflow-y: auto;
    /* Acompanha a área segura de aparelhos com barra inferior. */
    padding-bottom: calc(var(--space-2xl) + env(safe-area-inset-bottom, 0px));
  }

  /* Recolhido só quando há JS para reabrir (ver o `.js` do <head>).
     Sem JS o painel fica aberto como lista — feio, mas navegável;
     escondê-lo ali deixaria o site sem menu. */
  .js .navbar__conteudo { display: none; }
  .js .navbar__toggle[aria-expanded="true"] ~ .navbar__conteudo { display: flex; }

  /* Enquanto o painel está aberto a página atrás não rola. A trava é uma
     classe no <html> e mora DENTRO do media query: no desktop o painel
     não existe, e a regra não pode sobrar por lá. */
  .js.menu-aberto, .js.menu-aberto body { overflow: hidden; }

  .navbar__links {
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 0;
    font-size: var(--fs-h6);
  }

  /* Sem linha entre os itens: o que separa é o espaço, como no Figma. */
  .navbar__link {
    padding-block: var(--space-md);
    color: var(--text-primary);
  }

  /* O ativo fica laranja com a barrinha logo abaixo do texto — a mesma
     barra do desktop, só que ancorada no próprio link em vez da borda
     da navbar. */
  .navbar__link--ativo {
    color: var(--brand-primary);
  }
  .navbar__link--ativo::after {
    left: 0;
    right: auto;
    bottom: var(--space-xs);
    width: 24px;
    height: 3px;
    transform: none;
  }

  /* O bloco de baixo: "Já sou cliente" e o CTA, separados dos links por
     uma linha. */
  .navbar__acoes {
    flex-direction: column;
    align-items: stretch;
    gap: var(--space-lg);
    padding-top: var(--space-lg);
    border-top: var(--border-thin) solid var(--surface-dark);
  }

  /* Aqui o dropdown não flutua: ele empurra o conteúdo, porque o painel
     rola e não há o que sobrepor. */
  .navbar__cliente { display: block; }
  .navbar__cliente-botao { width: 100%; justify-content: flex-start; }

  .dropdown {
    position: static;
    min-width: 0;
    margin-top: var(--space-sm);
    box-shadow: none;
  }

  .navbar__cta { display: inline-flex; width: 100%; }

  /* ----------------------------------------------------------------
     O BOTÃO: hambúrguer fechado, ✕ dentro de um círculo aberto
     ---------------------------------------------------------------- */
  .js .navbar__toggle { display: flex; }

  .navbar__toggle {
    border: var(--border-thin) solid transparent;
    border-radius: var(--radius-pill);
    transition: border-color var(--transition);
  }
  .navbar__toggle[aria-expanded="true"] {
    border-color: var(--border-medium);
  }
}

@media (max-width: 768px) {
  :root { --gutter-x: var(--space-2xl); }

  .secao { padding-block: var(--space-3xl); }

  .rodape__topo {
    grid-template-columns: 1fr;
    gap: var(--space-2xl);
  }
  .rodape__menus {
    grid-template-columns: repeat(2, 1fr);
    gap: var(--space-xl);
  }

  .cta-banner { padding: var(--space-2xl) var(--space-lg); }
  .cta-banner__fagulha { display: none; }
  .cta-banner__nota { display: none; }
}

@media (max-width: 560px) {
  :root { --gutter-x: var(--space-lg); }

  .rodape__logo img { width: 220px; height: auto; }
  .rodape__menus { grid-template-columns: 1fr; }

  .flutuantes {
    right: var(--space-md);
    top: auto;
    bottom: var(--space-lg);
    transform: none;
  }
  .flutuante { width: 48px; height: 48px; }
  .flutuante svg { width: 22px; height: 22px; }

  .cta-banner__acoes { flex-direction: column; align-items: stretch; }
  .cta-banner__acoes .btn { width: 100%; }
}
