/* Base canônica do Design System: tokens + os componentes oficiais, sem o
   shell das páginas de documentação. A partir daqui a landing NÃO redefine
   mais .btn, .btnPrimary, .btnGhost, .btnIcon, .inputGold, .serviceCard,
   .panel ou .panelContact — herda do DS. Editar ds/botoes.css, ds/cards.css
   ou ds/inputs.css agora alcança esta página. O que sobra abaixo são só
   deltas de escala da landing, marcados como tal. Ver ds/components.css. */
/* components.css — a base canônica do Design System, importável de fora
   das páginas de documentação.

   ds/ds.css carrega tokens + TODOS os componentes + o shell das páginas de
   doc (body{display:flex}, main{margin-left}, .comp, .g2/.g3, .ovGrid).
   Esse shell não pode vazar para uma página real: a landing tem o próprio
   layout (sidebar + .dsShell + .wrap), e `body{display:flex}` junto com
   `main{margin-left}` quebraria os dois.

   Este arquivo é a resposta: os mesmos componentes, sem o shell. Qualquer
   página fora de ds/ importa este aqui em vez de reimplementar .btn,
   .inputGold, .serviceCard, .panel — que era exatamente a duplicação que
   já tinha se desviado na landing.

   O que NÃO entra aqui:
   - menu.css       → sidebar e demonstrações; o shell de viewport estreito
                      que governava a sidebar foi para o fim do menu.css.
   - marca.css,
     tipografia.css,
     cores.css,
     visao-geral.css → estilos das próprias páginas de documentação, não
                      componentes reutilizáveis (usa só tokens de tokens.css).

   Para mexer num componente, edite o arquivo do componente. Este arquivo
   não deve ganhar regra própria: é só a lista do que o sistema tem.

   A ordem abaixo replica a de ds.css de propósito. Dois arquivos definem
   .spinner (feedback.css e inputs.css) e o vencedor depende da ordem — em
   ds.css o feedback vem primeiro, então o .spinner do inputs.css é o que
   vale. Mudar a ordem aqui mudaria o componente em silêncio. */
/* ── TOKENS CORE (11) — paleta enxuta ── */
:root{
  /* Base */
  --bg:#f4f6fa;
  --surface:#ffffff;
  --text:#14233b;
  --muted:#5f6f84;
  --line:#d8e0ea;

  /* Marca */
  --navy:#112b49;
  --gold:#9d7a35;
  --gold-bright:#d9b66a;

  /* Sinais */
  --success:#1f8f63;
  --warning:#c2410c;
  --danger:#b94d4d; /* Esse é o vermelho da paleta da DM */

  /* ── Receitas derivadas (usar color-mix direto, sem token fixo) ──
     navy-tint:    color-mix(in srgb, var(--navy) 6%, transparent)
     gold-tint:    color-mix(in srgb, var(--gold) 12%, transparent)
     success-tint: color-mix(in srgb, var(--success) 10%, transparent)
     danger-tint:  color-mix(in srgb, var(--danger) 8%, transparent)
     line-strong:  color-mix(in srgb, var(--text) 18%, transparent) */

  /* ── Módulo background / Névoa Dourada (fora do core) ── */
  --gold-dots-bg:#e8cd8e; /* glow/partículas do background de páginas públicas — NÃO é cor de UI */
  --mist-bg:#07101d;
  --mist-bg-alt:#050b15;
  --mist-bg-top:#08111f;
  --mist-radial-navy:rgba(17,43,73,0.22);
  --mist-radial-gold:color-mix(in srgb, var(--gold-dots-bg) 10%, transparent);
  --mist-particle-1:#d9b66a;
  --mist-particle-2:#d9b66a;

  /* ── Módulo identidade / logo (escudo) — NÃO é cor de UI ── */
  --logo-graphite:#3d4d5c; /* lado M do escudo */
  --logo-silver:#b8bfc6;   /* detalhes, separadores do escudo */

  /* Forma — escala por tamanho do elemento */
  --radius-xs:8px;   /* controles mínimos: theme-btn, btnSm, chip, slot */
  --radius-sm:10px;  /* controles: botões, inputs, nav */
  --radius:12px;     /* padrão de controles médios */
  --radius-lg:16px;  /* superfícies: cards, modais, painéis, banners */
  --r-pill:999px;    /* pills, toggles, badges */

  /* Sombras */
  --shadow: 0 4px 16px rgba(17,43,73,0.06);
  --shadow-soft: 0 2px 6px rgba(17,43,73,0.04);
  --shadow-lg: 0 8px 24px rgba(17,43,73,0.06);

  /* Foco — dourado, não navy */
  --focus-ring:0 0 0 3px rgba(217,182,106,0.18);
  --focus-ring-strong:0 0 0 3px rgba(217,182,106,0.35);

  /* Tipografia — Opção B: Public Sans (corpo/UI) + Source Serif 4 (títulos) · OFL, via Google Fonts */
  --font-body:"Public Sans","Segoe UI","Calibri",system-ui,sans-serif;
  --font-heading:"Source Serif 4",Georgia,"Times New Roman",serif;
  --font-mono:ui-monospace,"Cascadia Mono",Menlo,Consolas,"Courier New",monospace;

  /* Escala fluida (clamp) */
  --step-0:clamp(0.82rem,0.78rem + 0.2vw,0.9rem);
  --step-1:clamp(0.95rem,0.88rem + 0.3vw,1.05rem);
  --step-2:clamp(1.1rem,1rem + 0.5vw,1.25rem);
  --step-3:clamp(1.5rem,1.2rem + 1.2vw,2rem);
  --step-4:clamp(2rem,1.5rem + 2.5vw,3.2rem);
  --step-5:clamp(2.4rem,1.8rem + 3.4vw,4.2rem);

  /* Motion */
  --ease-standard:cubic-bezier(0.4,0,0.2,1);
  --dur-fast:180ms;
  --dur-med:220ms;
  --dur-reveal:700ms;

  /* Layout */
  --max-width:1120px;
  --page-gutter:18px;
  --sidebar-w:232px;
  --control-h:44px; /* altura padrão de botões e campos do DS (alvo de toque) */

  color-scheme:light;
}
/* Dark mode — selector correto: body[data-theme="dark"] */
body[data-theme="dark"]{
  --bg:#07101d;
  --surface:#0e1828;
  --text:#e8eef9;
  --muted:#acb8cc;
  --line:rgba(255,255,255,0.12);
  --navy:#214a7a;
  --shadow: 0 4px 24px rgba(7,16,29,0.8), 0 2px 8px rgba(7,16,29,0.6);
  --shadow-soft: 0 2px 12px rgba(7,16,29,0.6), 0 1px 4px rgba(7,16,29,0.4);
  --shadow-lg: 0 12px 32px rgba(7,16,29,0.9), 0 4px 16px rgba(7,16,29,0.6);
  color-scheme:dark;
}
/* Component specific CSS for tokens.css */
/* ── TOAST ────────────────────────────────────── */
.toast{
  position:fixed;bottom:24px;right:24px;
  background:rgba(17,43,73,0.97);color:#fff;
  font-family:var(--font-body);font-size:0.82rem;font-weight:700;
  line-height:1.4;
  padding:10px 20px;border-radius:var(--r-pill);
  /* A pílula é de uso genérico e as mensagens variam de tamanho: sem teto,
     um aviso longo estourava a viewport no celular. */
  max-width:min(420px,calc(100vw - 48px));
  text-align:center;
  box-shadow: 0 4px 16px rgba(17,43,73,0.15);
  z-index:999;transform:translateY(60px);opacity:0;pointer-events:none;
  transition:all 200ms var(--ease-standard);
}
.toast.show{transform:translateY(0);opacity:1;}
body[data-theme="dark"] .toast{background:rgba(14,24,40,0.97);box-shadow:var(--shadow-lg);}
.divider{height:1px;background:var(--line);margin:16px 0;}
/* ── ALERT BOX ────────────────────────────────── */
.alert-box{
  padding:8px 12px;border-radius:var(--radius-xs);font-size:var(--step-0);
  font-weight:700;border:1px solid transparent;
  display:flex;align-items:center;gap:8px;line-height:1.5;
}
.alert-info{background:rgba(17,43,73,0.07);border-color:rgba(17,43,73,0.15);color:var(--navy);}
body[data-theme="dark"] .alert-info{background:rgba(33,74,122,0.18);border-color:rgba(33,74,122,0.30);color:var(--muted);}
::-webkit-scrollbar{width:5px;}
::-webkit-scrollbar-track{background:transparent;}
::-webkit-scrollbar-thumb{background:rgba(20,35,59,0.16);border-radius:3px;}
/* ── ALERTS (oficial, 4 variantes) ───────────── */
.alert{
  display:flex;gap:12px;align-items:center;
  padding:14px 16px;border-radius:var(--radius-sm);border:1px solid transparent;
  font-size:var(--step-0);font-weight:600;line-height:1.55;
}
.alert .ai{flex-shrink:0;width:18px;height:18px;align-self:center;}
.alert .alert-content{display:flex;flex-direction:column;justify-content:center;}
.alert strong{display:block;font-weight:800;margin-bottom:2px;}
/* Os sinais puros sobre o próprio tint não passam de 4.5:1 em texto normal:
   success 3.6:1, warn 3.3:1, danger 4.45:1. A mesma receita usada no ouro da
   landing e no verde dos requisitos de senha resolve — 4.8:1, 4.6:1 e 5.9:1 —
   sem mexer nos tokens --success/--warning/--danger, que outras regras usam. */
.alert-success{background:color-mix(in srgb, var(--success) 10%, transparent);border-color:rgba(31,143,99,0.22);color:color-mix(in srgb, var(--success) 78%, var(--text));}
.alert-danger{background:color-mix(in srgb, var(--danger) 8%, transparent);border-color:rgba(185,77,77,0.22);color:color-mix(in srgb, var(--danger) 78%, var(--text));}
.alert-warn{background:rgba(194,65,12,0.08);border-color:rgba(194,65,12,0.24);color:color-mix(in srgb, var(--warning) 78%, var(--text));}
.alert-neutral{background:color-mix(in srgb, var(--navy) 6%, transparent);border-color:rgba(17,43,73,0.16);color:var(--navy);}
body[data-theme="dark"] .alert-success{background:rgba(31,143,99,0.16);border-color:rgba(31,143,99,0.36);color:color-mix(in srgb, var(--success) 68%, var(--text));}
body[data-theme="dark"] .alert-danger{background:rgba(185,77,77,0.16);border-color:rgba(185,77,77,0.40);color:color-mix(in srgb, var(--danger) 68%, var(--text));}
body[data-theme="dark"] .alert-warn{background:rgba(194,65,12,0.16);border-color:rgba(194,65,12,0.40);color:color-mix(in srgb, var(--warning) 72%, var(--text));}
body[data-theme="dark"] .alert-neutral{background:rgba(33,74,122,0.16);border-color:rgba(33,74,122,0.3);color:color-mix(in srgb, var(--navy) 60%, var(--text));}
/* ── DASHBOARD BADGES (from DashboardPage.css) ── */
.dashBadge{
  display:inline-block;padding:4px 14px;border-radius:var(--r-pill);
  font-size:0.78rem;font-weight:800;letter-spacing:0.06em;text-transform:uppercase;
}
.dashBadge.admin{background:color-mix(in srgb, var(--navy) 6%, transparent);color:var(--navy);border:1px solid rgba(17,43,73,0.15);}
.dashBadge.cliente{background:color-mix(in srgb, var(--gold) 12%, transparent);color:color-mix(in srgb, var(--gold) 78%, var(--text));border:1px solid rgba(157,122,53,0.20);}
body[data-theme="dark"] .dashBadge.admin{border-color:rgba(33,74,122,0.40);background:rgba(33,74,122,0.12);color:color-mix(in srgb, var(--navy) 45%, #e8eef9);}
body[data-theme="dark"] .dashBadge.cliente{border-color:rgba(157,122,53,0.40);background:rgba(157,122,53,0.12);color:var(--gold-bright);}
/* ── STATUS BADGE (oficial) ──────────────────────
   Pílula textual discreta para status em tabelas e listas.
   Texto sempre visível — cor nunca é o único significado.
   Sem bolinha, sem ícone, sem glow, sem cor saturada. */
.statusBadge{
  display:inline-flex;align-items:center;gap:7px;
  padding:4px 10px;border-radius:var(--r-pill);
  font-size:0.75rem;font-weight:700;line-height:1.2;
  letter-spacing:0.01em;white-space:nowrap;
  border:1px solid var(--line);background:var(--surface);color:var(--text);
  cursor:pointer;transition:all 120ms;
}
.statusBadge:hover{border-color:rgba(17,43,73,0.28);}
.chip-close{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;border-radius:50%;font-size:1.1em;line-height:1;opacity:0.5;margin-left:4px;margin-right:-2px;transition:all 0.15s;}
.chip-close:hover{opacity:1;color:color-mix(in srgb, var(--danger) 78%, var(--text));background:color-mix(in srgb, var(--danger) 15%, transparent);}
.chip-add{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;font-size:1.1em;line-height:1;background:var(--bg);color:var(--muted);border:1px dashed var(--line);cursor:pointer;transition:all 0.15s;vertical-align:middle;margin-left:4px;}
.chip-add:hover{color:var(--text);border-color:var(--text);border-style:solid;}
.statusBadge.isActive{background:color-mix(in srgb, var(--navy) 6%, transparent);border-color:rgba(17,43,73,0.34);color:var(--navy);}
.statusBadge.isPending{background:color-mix(in srgb, var(--gold) 12%, transparent);border-color:rgba(157,122,53,0.34);color:color-mix(in srgb, var(--gold) 78%, var(--text));}
.statusBadge.isInactive{background:var(--bg);border-color:var(--line);color:var(--muted);}
.statusBadge.isDanger{background:color-mix(in srgb, var(--danger) 8%, transparent);border-color:rgba(185,77,77,0.34);color:color-mix(in srgb, var(--danger) 78%, var(--text));}
body[data-theme="dark"] .statusBadge{background:rgba(255,255,255,0.04);}
body[data-theme="dark"] .statusBadge.isActive{background:rgba(31,143,99,0.16);border-color:rgba(31,143,99,0.36);color:color-mix(in srgb, var(--success) 60%, #fff);}
body[data-theme="dark"] .statusBadge.isPending{background:rgba(157,122,53,0.16);border-color:rgba(157,122,53,0.40);color:var(--gold-bright);}
body[data-theme="dark"] .statusBadge.isInactive{background:rgba(172,184,204,0.12);border-color:rgba(172,184,204,0.30);color:var(--muted);}
body[data-theme="dark"] .statusBadge.isDanger{background:rgba(185,77,77,0.14);border-color:rgba(185,77,77,0.40);color:color-mix(in srgb, var(--danger) 65%, var(--text));}
/* DEPRECATED — .statusItem / .statusDot (ponto colorido).
   Substituído por .statusBadge. Mantido só para retrocompat; não usar. */
.statusItem{display:inline-flex;align-items:center;gap:8px;font-size:var(--step-0);font-weight:700;color:var(--text);}
.statusDot{width:8px;height:8px;border-radius:50%;flex-shrink:0;}
.sd-ok{background:var(--success);box-shadow:0 0 0 3px color-mix(in srgb, var(--success) 10%, transparent);}
.sd-warn{background:var(--warning);box-shadow:0 0 0 3px rgba(194,65,12,0.15);}
.sd-err{background:var(--danger);box-shadow:0 0 0 3px color-mix(in srgb, var(--danger) 8%, transparent);}
.sd-idle{background:var(--muted);box-shadow:0 0 0 3px rgba(95,111,132,0.14);}
/* ── REAL BUTTONS (from styles.css) ──────────── */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  min-height:var(--control-h);
  border-radius:var(--radius-sm);border:1px solid var(--line);padding:11px 14px;
  font-family:var(--font-body);font-weight:800;letter-spacing:0.01em;
  cursor:pointer;background:#fff;color:var(--navy);text-decoration:none;
  transition:transform 120ms ease,background-color 120ms ease,border-color 120ms ease,box-shadow 120ms ease;
  font-size:var(--step-1);
}
.btn:hover{box-shadow:var(--focus-ring-strong);}
.btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);}
/* ── REGRA DE HOVER ───────────────────────────────
   O hover é o anel de foco, e nada mais. É o que a linha "HOVER" de
   ds/botoes.html mostra: o botão idêntico ao repouso, com um anel de 3px
   em volta. Antes o hover somava elevação de 1px, engrossava a borda e
   pingava a cor no fundo — três efeitos que a página de demonstração não
   mostra, então o hover real e o hover documentado divergiam.

   Além disso, pingar o fundo move a superfície na direção do texto e
   derruba a razão de contraste (o .btnSecondary caía de 9.7:1 para 8.5:1
   no claro). Como agora o hover não toca em fundo, borda nem posição, o
   contraste entre os dois estados é idêntico por construção — não por
   cálculo — e vale para qualquer variante nova que alguém acrescentar. */
.btnPrimary{
  background:var(--navy);
  border-color:rgba(17,43,73,0.9);color:#fff;
  box-shadow: 0 4px 16px rgba(17,43,73,0.18);
}
.btnPrimary:hover{box-shadow:0 0 0 3px rgba(17,43,73,0.35);}
.btnPrimary:focus-visible{box-shadow:0 0 0 3px rgba(17,43,73,0.35);}
.btnGhost{background:rgba(255,255,255,0.85);border-color:rgba(20,35,59,0.14);}
body[data-theme="dark"] .btn{border-color:rgba(255,255,255,0.12);background:rgba(255,255,255,0.03);color:var(--text);}
body[data-theme="dark"] .btn:hover{box-shadow:var(--focus-ring-strong);}
body[data-theme="dark"] .btnPrimary{background:linear-gradient(180deg,#214a7a,#214a7a);border-color:rgba(33,74,122,0.8);color:#fff;}
body[data-theme="dark"] .btnPrimary:hover{box-shadow:0 0 0 3px rgba(33,74,122,0.45);}
body[data-theme="dark"] .btnPrimary:focus-visible{box-shadow:0 0 0 3px rgba(33,74,122,0.45);}
body[data-theme="dark"] .btnGhost{background:transparent;border-color:rgba(255,255,255,0.14);color:var(--text);}
/* ── SECONDARY BUTTON (oficial) ──────────────── */
.btnSecondary{
  background:color-mix(in srgb, var(--navy) 6%, transparent);border-color:rgba(17,43,73,0.22);color:var(--navy);
}
body[data-theme="dark"] .btnSecondary{background:rgba(33,74,122,0.18);border-color:rgba(33,74,122,0.4);color:color-mix(in srgb, var(--navy) 60%, var(--text));}
/* O --danger puro sobre o próprio tint fica em 4.46:1, abaixo do piso de 4.5:1
   para texto normal. A mesma receita do ouro e dos sinais dos .alert leva a
   5.5:1 sem mexer no token --danger. */
.btnDanger{background:color-mix(in srgb, var(--danger) 8%, transparent);border-color:rgba(185,77,77,0.3);color:color-mix(in srgb, var(--danger) 78%, var(--text));}
.btnDanger:hover{box-shadow:0 0 0 3px rgba(185,77,77,0.25);}
.btnDanger:focus-visible{box-shadow:0 0 0 3px rgba(185,77,77,0.25);}
body[data-theme="dark"] .btnDanger{background:rgba(185,77,77,0.14);border-color:rgba(185,77,77,0.4);color:color-mix(in srgb, var(--danger) 65%, var(--text));}
body[data-theme="dark"] .btnDanger:hover{box-shadow:0 0 0 3px rgba(185,77,77,0.45);}
body[data-theme="dark"] .btnDanger:focus-visible{box-shadow:0 0 0 3px rgba(185,77,77,0.45);}
.btn:disabled,.btn[disabled]{opacity:0.5;cursor:not-allowed;transform:none;box-shadow:none;}
/* ── SMALL BUTTON ────────────────────────────── */
.btnSm{padding:7px 11px;font-size:var(--step-0);border-radius:var(--radius-xs);}
/* ── ICON BUTTON ─────────────────────────────── */
.btnIcon{
  display:inline-flex;align-items:center;justify-content:center;
  width:var(--control-h);height:var(--control-h);padding:0;border-radius:var(--radius-sm);
  border:1px solid var(--line);background:var(--surface);color:var(--muted);
  cursor:pointer;transition:all 120ms;flex-shrink:0;
}
.btnIcon:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);}
body[data-theme="dark"] .btnIcon{border-color:rgba(255,255,255,0.12);background:rgba(255,255,255,0.03);color:var(--muted);}
/* ── BUTTON GROUP ────────────────────────────── */
.btn-group{display:inline-flex;gap:0;}
.btn-group .btn{border-radius:0;}
.btn-group .btn:first-child{border-radius:var(--radius-sm) 0 0 var(--radius-sm);}
.btn-group .btn:last-child{border-radius:0 var(--radius-sm) var(--radius-sm) 0;}
.btn-group .btn+.btn{border-left:none;}
.btn-group .btn:focus-visible{z-index:2;position:relative;}
/* ── CARD ─────────────────────────────────────── */
.card{
  background:var(--surface);border:1px solid var(--line);
  border-radius:var(--radius-lg);padding:16px;
  transition:transform 140ms ease, box-shadow 140ms ease, border-color 140ms ease;
  display:flex;flex-direction:column;justify-content:center;
  box-shadow:var(--shadow);
}
.card:hover{transform:translateY(-2px);box-shadow:var(--shadow-lg);}
body[data-theme="dark"] .card:hover{box-shadow:var(--shadow-lg);}
.cardTtl{
  font-family:var(--font-heading);font-size:1.1rem;
  color:var(--navy);letter-spacing:-0.01em;line-height:1.2;
  margin:0 0 6px;
}
body[data-theme="dark"] .cardTtl{color:var(--text);}
.cardTxt{
  font-size:var(--step-0);color:var(--muted);
  line-height:1.55;text-wrap:pretty;margin:0;font-weight:600;
}
/* ── AUTH CARD ────────────────────────────────── */
.authCard{
  width:100%;max-width:440px;border-radius:var(--radius-lg);border:1px solid var(--line);
  background:var(--surface);box-shadow:var(--shadow);
  padding:20px 20px 20px;position:relative;overflow:hidden;
}
/* Faixa dourada → navy no topo — elemento identitário real */
.authCard::before{
  content:"";position:absolute;top:0;left:0;right:0;height:4px;
  background:linear-gradient(90deg,var(--gold) 0%,var(--navy) 100%);
}
.authLogo{display:flex;align-items:center;gap:12px;margin-bottom:8px;}
.authLogo img{width:42px;height:42px;object-fit:contain;}
.authLogoText{display:grid;gap:1px;}
.authLogoText strong{font-size:1rem;color:var(--navy);letter-spacing:0.01em;}
body[data-theme="dark"] .authLogoText strong{color:var(--text);}
.authLogoText small{font-size:0.78rem;color:var(--muted);font-weight:700;}
.authTitle{
  margin:20px 0 4px;font-family:var(--font-heading);
  font-size:1.5rem;line-height:1.15;letter-spacing:-0.01em;color:var(--navy);
}
body[data-theme="dark"] .authTitle{color:var(--text);}
.authSubtitle{margin:0 0 16px;color:var(--muted);font-weight:600;font-size:0.93rem;}
.authForm{display:grid;gap:16px;}
.authLinks{margin-top:12px;text-align:center;font-size:0.88rem;color:var(--muted);}
.authLinks a{color:var(--navy);font-weight:700;}
body[data-theme="dark"] .authLinks a{color:var(--gold-bright);}
/* ── SERVICE CARD (from styles.css) ──────────── */
.serviceCard{
  position:relative;overflow:hidden;
  border-radius:var(--radius-lg);border:1px solid var(--line);
  background:var(--surface);
  padding:16px;
  transition:transform 140ms ease,box-shadow 140ms ease,border-color 140ms ease;
  display:flex;flex-direction:column;justify-content:center;
}
.serviceCard:hover{transform:translateY(-2px);border-color:rgba(17,43,73,0.34);box-shadow:var(--focus-ring-strong),var(--shadow-lg);}
.serviceCard h3{font-family:var(--font-heading);font-size:1.1rem;color:var(--navy);line-height:1.2;margin:0 0 6px;}
.serviceCard p{color:var(--muted);font-size:var(--step-0);line-height:1.55;margin:0;font-weight:600;}
body[data-theme="dark"] .serviceCard h3{color:var(--text);}
body[data-theme="dark"] .serviceCard:hover{border-color:rgba(33,74,122,0.4);box-shadow:var(--focus-ring-strong),var(--shadow-lg);}
body[data-theme="dark"] .serviceCard p{color:#acb8cc;}
/* ── PANEL (from styles.css) ─────────────────── */
.panel{border-radius:var(--radius-lg);border:1px solid var(--line);background:var(--surface);padding:16px;display:flex;flex-direction:column;justify-content:center;}
/* Título de .panel.existia como lacuna: só .panelContact tinha h3, então um
   .panel solto na mão do consumidor ficava com o h3 do navegador. Mesmo
   tratamento do .panelContact — uma régua, dois painéis. */
.panel h3{
  font-family:var(--font-heading);font-size:1.1rem;font-weight:600;
  color:var(--navy);line-height:1.2;letter-spacing:-0.01em;margin:0 0 6px;
}
body[data-theme="dark"] .panel h3{color:var(--text);}
.panelContact{
  background:radial-gradient(520px 180px at 100% 0%,rgba(17,43,73,0.05),transparent 70%),linear-gradient(180deg,var(--surface),color-mix(in srgb, var(--surface) 94%, var(--bg)));
  border-color:rgba(157,122,53,0.24);
  box-shadow:inset 0 0 0 1px rgba(157,122,53,0.06);
  padding:20px;
}
.panelContact h3{color:var(--navy);font-family:var(--font-heading);font-size:1.1rem;margin:0 0 6px;line-height:1.2;}
.panelContact p{color:var(--muted);font-size:var(--step-0);line-height:1.6;margin:0;}
body[data-theme="dark"] .panel{border-color:rgba(255,255,255,0.10);background:rgba(14,24,40,0.96);}
body[data-theme="dark"] .panelContact{border-color:rgba(217,182,106,0.28);}
/* ── DARK CARD (padrão oficial do tema escuro) ──
   Card de conteúdo normal em superfície escura — NÃO um CTA, não um bloco
   promocional, sem filete dourado obrigatório. Equivalente ao .card claro,
   só que para telas escuras. É o que o .card vira sob data-theme="dark". */
.cardDark{
  background:#0e1828;
  border:1px solid rgba(255,255,255,0.12);border-radius:var(--radius-lg);
  padding:20px;color:#e8eef9;position:relative;
  display:flex;flex-direction:column;justify-content:center;
  box-shadow:var(--shadow-soft);
}
.cardDark h3{font-family:var(--font-heading);font-size:1.1rem;color:var(--text);line-height:1.2;margin:0 0 6px;}
.cardDark p{color:#acb8cc;font-size:var(--step-0);line-height:1.6;margin:0;}
/* Grade de demonstracao dos cards (usada em cards.html) */
.cardRow{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-bottom:16px;}
@media(max-width:720px){.cardRow{grid-template-columns:1fr;}}
.cardCell{display:flex;flex-direction:column;}
/* ── SPLIT COM FILETE DOURADO (ornamento identitário) ──
   Dois painéis lado a lado separados pelo filete vertical dourado com dois
   losangos no centro — mesmo gesto da seção "Onde estamos" da landing. */
.cardSplit{display:grid;grid-template-columns:1fr auto 1fr;gap:36px;align-items:stretch;margin-bottom:16px;}
.splitDivider{
  position:relative;width:1px;
  background:linear-gradient(180deg,transparent 0%,var(--gold) 20%,var(--gold) 80%,transparent 100%);
  opacity:0.55;
}
.splitDivider::before,
.splitDivider::after{
  content:"";position:absolute;left:50%;
  width:7px;height:7px;border:1px solid var(--gold);background:var(--bg);
  transform:translateX(-50%) rotate(45deg);
}
.splitDivider::before{top:42%;}
.splitDivider::after{top:58%;}
@media(max-width:720px){.cardSplit{grid-template-columns:1fr;gap:16px;}.cardSplit .splitDivider{display:none;}}
/* ── FILETE DOURADO AFINADO COM RÓTULO (sem losangos) ──
   Filete horizontal que se dissolve nas pontas (afina), ladeando o eyebrow —
   mesmo gesto da seção "Atuação integrada" da landing. */
.sectionEyebrowRow{display:flex;align-items:center;gap:14px;}
.sectionEyebrowRow .eyebrow{line-height:1;margin:0;padding:0;}
.sectionDeco{position:relative;height:1px;}
.sectionDecoLeft{flex:0 0 clamp(80px,14vw,200px);}
.sectionDecoRight{flex:1 1 auto;min-width:80px;}
.sectionDeco::before,
.sectionDeco::after{content:"";position:absolute;inset:0;pointer-events:none;}
.sectionDeco::before{
  background:linear-gradient(90deg,transparent 0%,var(--gold) 25%,var(--gold) 75%,transparent 100%);
  opacity:0.35;
}
.sectionDeco::after{
  background:linear-gradient(90deg,transparent 0%,var(--gold) 40%,var(--gold) 60%,transparent 100%);
  opacity:0.22;
}
@media(max-width:720px){
  .sectionEyebrowRow{gap:12px;}
  .sectionEyebrowRow .sectionDecoLeft{display:none;}
  .sectionEyebrowRow .sectionDecoRight{flex:1 1 auto;}
}
/* ── EMPTY STATE ──────────────────────────────── */
.emptyState{
  display:flex;flex-direction:column;align-items:center;
  text-align:center;gap:14px;padding:16px;
}
.emptyIcon{
  width:56px;height:56px;border-radius:var(--radius);display:flex;
  align-items:center;justify-content:center;
  background:color-mix(in srgb, var(--navy) 6%, transparent);
  border:1px solid color-mix(in srgb, var(--gold-bright) 22%, transparent);
  color:var(--navy);
}
body[data-theme="dark"] .emptyIcon{
  color:var(--gold-bright);
  background:color-mix(in srgb, var(--navy) 18%, transparent);
  border-color:color-mix(in srgb, var(--gold-bright) 14%, transparent);
}
.emptyState h3{
  font-family:var(--font-heading);font-size:var(--step-2);
  color:var(--navy);letter-spacing:-0.01em;line-height:1.25;
  margin:4px 0 0;
}
body[data-theme="dark"] .emptyState h3{color:var(--text);}
.emptyState p{
  font-size:var(--step-0);color:var(--muted);
  max-width:38ch;line-height:1.55;text-wrap:pretty;
  margin:0;
}
.emptyState .btn{margin-top:6px;}
/* ── SKELETON / LOADING ──────────────────────── */
.skeleton-card{
  height:100px;
  background:linear-gradient(90deg,var(--line) 25%,color-mix(in srgb,var(--surface) 62%,var(--line)) 37%,var(--line) 63%);
  background-size:400% 100%;animation:shimmer 1.4s ease infinite;
}
body[data-theme="dark"] .skeleton-card{
  background:linear-gradient(90deg,rgba(255,255,255,0.04) 25%,rgba(255,255,255,0.08) 37%,rgba(255,255,255,0.04) 63%);
  background-size:400% 100%;
}
.skeleton{
  background:linear-gradient(90deg,var(--line) 25%,color-mix(in srgb,var(--surface) 50%,var(--line)) 37%,var(--line) 63%);
  background-size:400% 100%;border-radius:var(--radius-sm);animation:shimmer 1.4s ease infinite;
}
body[data-theme="dark"] .skeleton{background:linear-gradient(90deg,rgba(255,255,255,0.04) 25%,rgba(255,255,255,0.08) 37%,rgba(255,255,255,0.04) 63%);background-size:400% 100%;}
@keyframes shimmer{0%{background-position:100% 0;}100%{background-position:0 0;}}
/* ── DOTS ────────────────────────────────────── */
.dots{display:inline-flex;gap:6px;align-items:center;}
.dots span{
  width:8px;height:8px;border-radius:50%;
  background:var(--navy);opacity:0.35;
  animation:dotPulse 1.2s ease infinite;
}
.dots span:nth-child(2){animation-delay:0.15s;}
.dots span:nth-child(3){animation-delay:0.3s;}
@keyframes dotPulse{0%,80%,100%{opacity:0.2;transform:scale(0.8);}40%{opacity:1;transform:scale(1);}}
body[data-theme="dark"] .dots span{background:var(--gold-bright);}
/* ── BAR LOAD ────────────────────────────────── */
.barLoad{
  height:4px;border-radius:4px;background:var(--line);overflow:hidden;position:relative;
}
.barLoad::after{
  content:'';position:absolute;inset:0;border-radius:4px;
  background:linear-gradient(90deg,var(--navy),var(--gold));
  clip-path:inset(0 100% 0 0);
  animation:barReveal 1.6s var(--ease-standard) infinite;
}
/* O degradê fica fixo na trilha e é revelado por corte (clip-path):
   preenche da esquerda até o fim e depois some da esquerda, em loop. */
@keyframes barReveal{
  0%{clip-path:inset(0 100% 0 0);}
  55%{clip-path:inset(0 0 0 0);}
  100%{clip-path:inset(0 0 0 100%);}
}
/* ── SPINNER (feedback) ──────────────────────── */
.spinner{
  display:inline-block;width:20px;height:20px;
  border:2.5px solid rgba(17,43,73,0.25);
  border-top-color:var(--navy);
  border-radius:50%;animation:spin 0.7s linear infinite;
}
@keyframes spin{to{transform:rotate(360deg);}}
body[data-theme="dark"] .spinner{border-color:rgba(255,255,255,0.15);border-top-color:var(--gold-bright);}
/* ── EMPTY STATE (oficial) ───────────────────── */
.emptyState{
  text-align:center;padding:36px 20px;max-width:380px;margin:0 auto;
}
.emptyIcon{
  width:56px;height:56px;border-radius:var(--radius);margin:0 auto 16px;
  display:flex;align-items:center;justify-content:center;
  background:color-mix(in srgb, var(--navy) 6%, transparent);border:1px solid rgba(17,43,73,0.14);color:var(--navy);
}
.emptyState h3{font-family:var(--font-heading);font-size:var(--step-2);color:var(--navy);margin-bottom:6px;}
body[data-theme="dark"] .emptyState h3{color:var(--text);}
.emptyState p{color:var(--muted);font-weight:600;font-size:var(--step-0);line-height:1.55;margin-bottom:8px;text-wrap:pretty;}
/* ── SPINNER (estado de loading de botão) ─────── */
.spinner{
  display:inline-block;width:18px;height:18px;
  border:2px solid rgba(255,255,255,0.3);border-top-color:#fff;
  border-radius:50%;animation:spin 0.6s linear infinite;margin-right:8px;
}
@keyframes spin{to{transform:rotate(360deg);}}
/* ── AUTH INPUTS (from AuthLayout.css) ───────── */
.inputGroup{display:grid;gap:5px;}
.inputGroup label{font-weight:700;font-size:0.9rem;color:var(--navy);}
body[data-theme="dark"] .inputGroup label{color:var(--text);}
.inputNavy{
  width:100%;border:1px solid var(--line);border-radius:var(--radius-sm);
  background:var(--bg);color:var(--text);
  padding:11px 14px;font:inherit;font-size:16px;min-height:var(--control-h);
  transition:border-color 120ms ease,box-shadow 120ms ease;outline:none;
}
.inputNavy::placeholder{color:var(--muted);opacity:0.7;}
.inputNavy:hover {
  border-color: color-mix(in srgb, var(--line) 60%, var(--text));
}
.inputNavy:focus{
  /* Foco unificado no dourado, igual ao .inputGold: a borda fica neutra e só o
     anel dourado comunica o foco. Antes o auth usava anel navy. */
  box-shadow:var(--focus-ring-strong);
}
.inputNavy[aria-invalid="true"]{
  border-color:var(--danger);
  box-shadow:0 0 0 3px color-mix(in srgb, var(--danger) 8%, transparent);
}
body[data-theme="dark"] .inputNavy{border-color:rgba(255,255,255,0.12);background:rgba(255,255,255,0.03);color:var(--text);}
body[data-theme="dark"] .inputNavy:hover{border-color:rgba(255,255,255,0.25);}
body[data-theme="dark"] .inputNavy:focus{box-shadow:var(--focus-ring-strong);}
body[data-theme="dark"] .inputNavy[aria-invalid="true"]{border-color:var(--danger);}
/* ── AUTH FORM COLUMN (padrão preferencial) ──── */
/* Coluna de formulário sem caixa externa. Sem borda,
   sem fundo fechado, sem sombra de card. Só alinhamento,
   espaçamento, largura e contraste dos próprios campos.
   Usada quando o background já fornece contexto visual. */
.authFormColumn{
  width:100%;max-width:380px;
  display:grid;gap:18px;
  background:transparent;border:none;box-shadow:none;
  padding:0;
}
/* halo opcional muito sutil — nunca uma moldura fechada */
.authFormColumn.hasHalo{
  filter: drop-shadow(0 8px 24px rgba(7,16,29,0.12));
}
/* filete dourado curto opcional acima do título */
.authFormColumn .authLead{
  width:48px;height:2px;border-radius:2px;
  background:linear-gradient(90deg,var(--gold) 0%,rgba(157,122,53,0) 100%);
  margin-bottom:4px;
}
.authFormColumn .authTitle{margin:0 0 4px;}
.authFormColumn .authSubtitle{margin:0 0 8px;}
/* ── LANDING FORM FOCUS (from styles.css) ─────── */
.inputGold{
  width:100%;border:1px solid var(--line);border-radius:var(--radius-sm);
  background:#fff;color:var(--text);padding:11px 12px;outline:none;
  font:inherit;font-size:16px;min-height:var(--control-h);
  transition:border-color 120ms ease,box-shadow 120ms ease;
}
.inputGold:hover{
  border-color: color-mix(in srgb, var(--line) 60%, var(--text));
}
.inputGold:focus{
  /* Só o anel dourado, igual ao hover do .btn. Antes o foco também trocava a
     cor da borda (--gold no claro, --gold-bright no escuro), o que criava uma
     linha sólida de tom diferente por dentro do halo translúcido — o "detalhe"
     que destoava. A borda fica neutra; o anel comunica o foco. */
  box-shadow:var(--focus-ring-strong); /* foco dourado na landing */
}
.inputGold.is-error{border-color:var(--danger);animation:fieldShake 350ms var(--ease-standard);}
.inputGold.is-valid{border-color:rgba(217,182,106,0.55);}
/* ── MENSAGEM DE ERRO DE CAMPO ─────────────────
   Texto auxiliar que acompanha qualquer campo em erro (.inputGold.is-error,
   .dsSelect e .toggleWrap.is-error). Usa a receita de contraste para texto de
   sinal: --danger misturado com --text, nunca o token cru como texto. */
.fieldError{
  font-size:0.8rem;font-weight:600;line-height:1.35;
  color:color-mix(in srgb, var(--danger) 78%, var(--text));
}
body[data-theme="dark"] .fieldError{
  color:color-mix(in srgb, var(--danger) 68%, var(--text));
}
@keyframes fieldShake{0%,100%{transform:none;}20%{transform:translateX(-5px);}60%{transform:translateX(5px);}}
body[data-theme="dark"] .inputGold{border-color:rgba(255,255,255,0.12);background:rgba(255,255,255,0.03);color:var(--text);}
body[data-theme="dark"] .inputGold:hover{border-color:rgba(255,255,255,0.25);}
/* No tema escuro estas regras têm de vir depois e com especificidade maior que
   body[data-theme="dark"] .inputGold, senão o erro/validade era sobrescrito pela
   borda neutra do escuro (a borda vermelha "sumia" e só restava o anel). */
body[data-theme="dark"] .inputGold.is-error{border-color:var(--danger);}
body[data-theme="dark"] .inputGold.is-valid{border-color:rgba(217,182,106,0.55);}
body[data-theme="dark"] .dsSelect__trigger[aria-invalid="true"]{border-color:var(--danger);}
/* ── SELECT / PAINEL DE LISTA ───────────────────────
   O <select> nativo sozinho não serve: o popup dele é desenhado pelo sistema
   operacional e ignora border-radius, sombra e hover — a lista ficava
   quadrada, sem a identidade do resto do sistema. Então o componente é um
   botão que abre um painel próprio (.dsSelect), com o mesmo raio, a mesma
   borda e a mesma sombra dos outros componentes.

   É progressive enhancement de verdade: sem JS, o <select> nativo aparece e
   funciona. O .is-enhanced só é posto por ds/select.js, e é ele que troca o
   select nativo pelo painel. O select continua no DOM por baixo — recortado,
   não display:none — para preservar id, name, validação e envio do
   formulário, e o JS o mantém sincronizado.

   O gatilho reaproveita .inputGold, então herda foco, erro e valid states. */
.dsSelect{position:relative;}
.dsSelect select{width:100%;}
.dsSelect__trigger{
  display:none;width:100%;align-items:center;justify-content:space-between;
  gap:12px;text-align:left;cursor:pointer;font:inherit;font-size:16px;
  font-weight:500;color:var(--text);min-height:var(--control-h);
}
.dsSelect.is-enhanced .dsSelect__trigger{display:inline-flex;}
.dsSelect.is-enhanced select{
  position:absolute;width:1px;height:1px;margin:0;padding:0;
  opacity:0;pointer-events:none;inset:auto;
}
.dsSelect__trigger[aria-invalid="true"]{
  border-color:var(--danger);
  box-shadow:0 0 0 4px color-mix(in srgb, var(--danger) 18%, transparent);
}
.dsSelect__value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dsSelect__value.is-placeholder{color:var(--muted);}
.dsSelect__chev{
  width:12px;height:12px;flex:0 0 auto;color:var(--muted);
  transition:transform var(--dur-fast) var(--ease-standard);
}
.dsSelect__trigger[aria-expanded="true"] .dsSelect__chev{transform:rotate(180deg);}
.dsSelect__list{
  position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:60;
  margin:0;padding:6px;list-style:none;
  max-height:60vh;overflow-y:auto;overscroll-behavior:contain;
  border-radius:var(--radius);
  border:1px solid color-mix(in srgb, var(--text) 18%, transparent);
  background:var(--surface);
  box-shadow:var(--shadow-lg);
  transform-origin:top center;
}
.dsSelect__list[hidden]{display:none;}
.dsSelect.is-open .dsSelect__list{animation:dsSelectIn var(--dur-fast) var(--ease-standard);}
.dsSelect.is-dropup .dsSelect__list{top:auto;bottom:calc(100% + 6px);transform-origin:bottom center;}
@keyframes dsSelectIn{from{opacity:0;transform:translateY(-4px) scaleY(0.97);}to{opacity:1;transform:none;}}
@media (prefers-reduced-motion: reduce){
  .dsSelect.is-open .dsSelect__list{animation:none;}
}
.dsSelect__opt{
  display:flex;align-items:center;justify-content:space-between;gap:12px;
  padding:10px 12px;border-radius:var(--radius-xs);cursor:pointer;
  font-size:var(--step-1);line-height:1.35;color:var(--text);
  transition:background-color var(--dur-fast) var(--ease-standard);
}
/* Ativa é tint NEUTRO; marcada é tint NAVY mais o peso 700. Famílias de cor
   diferentes de propósito: se as duas fossem navy, os dois estados só se
   distinguiriam pelo peso, e o estado marcado não se limitaria a cor. */
.dsSelect__opt.is-active{background:color-mix(in srgb, var(--text) 7%, transparent);}
.dsSelect__opt[aria-selected="true"]{
  background:color-mix(in srgb, var(--navy) 14%, transparent);
  font-weight:700;
}
.dsSelect__opt[aria-selected="true"]::after{
  content:"";width:14px;height:1px;flex:none;background:var(--gold);
}
.dsSelect__opt.is-placeholder{color:var(--muted);}
/* ── PASSWORD FIELD ──────────────────────────── */
.pwField{position:relative;}
.pwField input{padding-right:46px;}
.pwToggle{
  position:absolute;right:8px;top:50%;transform:translateY(-50%);
  width:30px;height:30px;display:flex;align-items:center;justify-content:center;
  border:none;background:none;color:var(--muted);cursor:pointer;border-radius:var(--radius-xs);
  transition:color 120ms,background 120ms;
}
.pwToggle:hover{color:var(--navy);background:var(--bg);}
body[data-theme="dark"] .pwToggle:hover{color:var(--gold-bright);}
/* ── PASSWORD STRENGTH (medidor estático e determinístico — NÃO é loading) ──
   Cresce/diminui só conforme a senha digitada. Sem animação de espera.
   Usa o mesmo degradê da barra de loading (.barLoad do feedback.css): navy → gold. */
.passwordStrength{display:grid;gap:7px;}
.passwordStrengthTrack{position:relative;height:6px;background:var(--line);border-radius:var(--r-pill);overflow:hidden;}
/* O degradê fica ancorado na trilha inteira e é revelado por corte (clip-path):
   no começo só aparece o navy; o gold só surge conforme a senha fica forte. */
.passwordStrengthFill{position:absolute;top:0;left:0;height:100%;width:100%;border-radius:var(--r-pill);background:linear-gradient(90deg,var(--navy),var(--gold));clip-path:inset(0 100% 0 0);transition:clip-path 220ms var(--ease-standard);}
.passwordStrengthLabel{font-size:0.82rem;font-weight:700;color:var(--muted);}
/* Só o quanto é revelado indica a força — a cor é o degradê da marca, não um semáforo. */
.passwordStrength[data-level="1"] .passwordStrengthFill{clip-path:inset(0 75% 0 0);}
.passwordStrength[data-level="2"] .passwordStrengthFill{clip-path:inset(0 50% 0 0);}
.passwordStrength[data-level="3"] .passwordStrengthFill{clip-path:inset(0 25% 0 0);}
.passwordStrength[data-level="4"] .passwordStrengthFill{clip-path:inset(0 0 0 0);}
/* Sobre painel escuro (telas de auth sobre a Névoa Dourada) */
.passwordStrength.onDark .passwordStrengthTrack{background:rgba(255,255,255,0.16);}
.passwordStrength.onDark .passwordStrengthLabel{color:rgba(232,238,249,0.75);}
/* ── REQUISITOS DA SENHA ("o que falta para ficar forte") ──
   Mesma lógica do medidor: cada item acende quando atendido.
   Forte = os quatro itens atendidos. */
.passwordRequirements{
  list-style:none;margin:3px 0 0;padding:0;
  display:grid;grid-template-columns:1fr 1fr;gap:7px 14px;
}
.pwReq{
  display:flex;align-items:center;gap:7px;
  font-size:0.78rem;font-weight:600;line-height:1.25;color:var(--muted);
  transition:color 140ms var(--ease-standard);
}
.pwReqIcon{display:inline-flex;align-items:center;justify-content:center;width:14px;height:14px;flex:0 0 auto;}
.pwReqCheck{display:none;}
.pwReq.is-met{color:color-mix(in srgb, var(--success) 78%, var(--text));}
.pwReq.is-met .pwReqDot{display:none;}
.pwReq.is-met .pwReqCheck{display:block;}
@media(max-width:380px){
  .passwordRequirements{grid-template-columns:1fr;}
}
/* ── TOGGLE (CHECKBOX/RADIO) ─────────────────── */
.toggleWrap {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-size: 0.95rem;
  color: var(--text);
}
.ds-toggle {
  accent-color: var(--navy);
  width: 16px;
  height: 16px;
  cursor: pointer;
}
body[data-theme="dark"] .ds-toggle {
  accent-color: var(--navy);
}
/* ── TOGGLE EM ERRO (obrigatório não marcado) ───
   Sem contorno na caixa: o outline ficava pesado e feio em cima do controle
   nativo. O erro é comunicado pelo tom da label + a mensagem abaixo, e o check
   mantém o accent navy da marca (azul), não fica vermelho. */
.toggleWrap.is-error{color:color-mix(in srgb, var(--danger) 78%, var(--text));}
body[data-theme="dark"] .toggleWrap.is-error{color:color-mix(in srgb, var(--danger) 68%, var(--text));}
/* ── DATA TABLE (oficial) ────────────────────── */
.dataTable{width:100%;border-collapse:collapse;font-size:var(--step-0);font-variant-numeric:tabular-nums lining-nums;}
.dataTable thead th{
  text-align:left;padding:12px 18px;background:var(--bg);
  font-family:var(--font-body);font-size:0.72rem;font-weight:700;
  letter-spacing:0.08em;text-transform:uppercase;color:var(--muted);
  border-bottom:1px solid var(--line);
}
.dataTable tbody td{padding:13px 18px;border-bottom:1px solid var(--line);color:var(--text);font-weight:600;}
.dataTable tbody tr{transition:background 120ms;}
.dataTable tbody tr:hover{background:var(--bg);}
.dataTable tbody tr:last-child td{border-bottom:none;}
.tableWrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow);}
.table-client-id{font-size:0.8em;color:var(--muted);font-weight:400;}
.icon-btn-edit{
  background:transparent;border:none;color:var(--muted);cursor:pointer;
  display:flex;align-items:center;justify-content:center;padding:4px;border-radius:4px;
  transition:color 120ms ease;
}
.icon-btn-edit:hover{color:var(--navy);}
body[data-theme="dark"] .icon-btn-edit:hover{color:var(--gold-bright);}
/* ── MODAL (oficial) ─────────────────────────── */
.modalDemo{
  position:relative;background:rgba(17,43,73,0.32);border-radius:var(--radius-lg);
  padding:20px;display:flex;align-items:center;justify-content:center;
  -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);
}
.modalCard{
  width:100%;max-width:480px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--radius-lg);
  box-shadow:var(--shadow);position:relative;
}
.modalHead{padding:20px 20px 0;display:flex;justify-content:space-between;align-items:flex-start;gap:16px;}
.modalHead h3{font-family:var(--font-heading);font-size:1.25rem;color:var(--navy);letter-spacing:-0.01em;}
body[data-theme="dark"] .modalHead h3{color:var(--text);}
.modalBody{padding:12px 20px 8px;color:var(--muted);font-weight:600;font-size:var(--step-0);line-height:1.55;}
.modalFoot{padding:16px 20px 20px;display:flex;gap:12px;justify-content:flex-end;}

/* Somente o que é específico da landing (não pertence ao núcleo do DS). */
:root {
  /* Superfícies derivadas da paleta — sem hex novo. */
  --bg-alt: color-mix(in srgb, var(--bg) 90%, var(--line));
  --surface-soft: color-mix(in srgb, var(--surface) 94%, var(--bg));
  --surface-ghost: color-mix(in srgb, var(--surface) 98%, var(--bg));

  /* Receita oficial de linha forte (mesma do DESIGN.md). */
  --line-strong: color-mix(in srgb, var(--text) 18%, transparent);

  /* Altura da faixa de aviso dentro da barra fixa. É medida e reescrita
     pelo JS; o valor aqui é o fallback para quando o JS não roda. */
  --notice-h: 60px;

  /* Altura do cabeçalho fixo. Cai para 68px no mobile, onde o padding
     vertical diminui (ver landing-theme.css). */
  --header-h: 80px;

  /* Área segura (iOS). */
  --safe-top: env(safe-area-inset-top, 0px);
  --safe-right: env(safe-area-inset-right, 0px);
  --safe-bottom: env(safe-area-inset-bottom, 0px);
  --safe-left: env(safe-area-inset-left, 0px);
}

/* Indica ao navegador que o tema padrão é claro (inputs nativos, etc.). */
body {
  color-scheme: light;
}

/* Canvas de fundo (névoa dourada interativa). Renderizado no script.js. */
.particle-bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  width: 100vw;
  height: 100dvh;
  mix-blend-mode: multiply;
  opacity: 0.6;
}
body[data-theme="dark"] .particle-bg {
  mix-blend-mode: screen;
  opacity: 1;
}
.topbar, main { position: relative; z-index: 1; }

/* Reset simples para cálculo de largura/altura mais previsível. */
* {
  box-sizing: border-box;
}

/* Rolagem suave entre âncoras da página. */
html {
  scroll-behavior: smooth;
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}

/* Base visual da página (tipografia, cor de texto e fundo geral). */
body {
  margin: 0;
  min-height: 100vh;
  padding-bottom: var(--safe-bottom);
  font-family: var(--font-body);
  color: var(--text);
  line-height: 1.5;
  /* Bloqueia scroll horizontal em qualquer viewport. Defesa contra
     break-outs com negative margin, transforms ou elementos com
     largura maior que o container. */
  overflow-x: clip;
  /* Uma única vinheta navy sobre a cor base — antes eram três gradientes
     empilhados sob o canvas de névoa, o que só sujava a atmosfera. */
  background:
    radial-gradient(900px 500px at 100% 0%, color-mix(in srgb, var(--navy) 8%, transparent), transparent 70%),
    var(--bg);
}

/* Links herdam cor do contexto para manter consistência visual. */
a {
  color: inherit;
  text-decoration: none;
}

/* O reset global de outline (landing-theme.css) exige um anel próprio para
   cada elemento focável. Links não têm componente de botão, então definem
   o seu aqui. */
a:focus-visible {
  outline: none;
  border-radius: var(--radius-xs);
  box-shadow: var(--focus-ring-strong);
}

/* Atalho de teclado: fica fora da tela até receber foco, então quem navega
   por Tab pula a sidebar inteira sem passar por 20 links. */
.skipLink {
  position: fixed;
  top: 10px;
  left: 10px;
  z-index: 200;
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 16px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--line);
  background: var(--surface);
  color: var(--navy);
  font-weight: 800;
  font-size: var(--step-0);
  box-shadow: var(--shadow-lg);
  transform: translateY(-180%);
  transition: transform 160ms var(--ease-standard);
}

.skipLink:focus {
  outline: none;
  transform: translateY(0);
  box-shadow: var(--focus-ring-strong), var(--shadow-lg);
}

/* Container central usado em header e conteúdo principal. */
.wrap {
  width: min(var(--max-width), calc(100vw - (var(--page-gutter) * 2) - var(--safe-left) - var(--safe-right)));
  margin: 0 auto;
}

/* Barra superior fixa com leve transparência. */
.topbar {
  position: sticky;
  top: 0;
  z-index: 30;
  padding-top: var(--safe-top);
  border-bottom: 1px solid color-mix(in srgb, var(--text) 8%, transparent);
  background: color-mix(in srgb, var(--bg) 90%, transparent);
  -webkit-backdrop-filter: blur(10px);
  backdrop-filter: blur(10px);
}

/* Faixa de chamada para a triagem: vive dentro da barra fixa, logo abaixo do
   cabeçalho, então acompanha a rolagem com ele. O tint de navy separa a faixa
   do menu sem competir com o hero — o botão continua secundário. */
.noticeBar {
  background: color-mix(in srgb, var(--navy) 6%, transparent);
  border-top: 1px solid color-mix(in srgb, var(--text) 9%, transparent);
}

/* Dispensada pelo usuário: a classe é aplicada no <html> pelo script do
   <head>, antes do primeiro paint, para a faixa não piscar. */
html.notice-off .noticeBar {
  display: none;
}

html.notice-off {
  --notice-h: 0px;
}

.noticeBarInner {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 10px 0;
}

.noticeBarText {
  margin: 0;
  flex: 1 1 auto;
  min-width: 0;
  font-size: var(--step-0);
  font-weight: 600;
  color: var(--navy);
}

.noticeBarActions {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  flex: 0 0 auto;
}

/* Estrutura interna do cabeçalho: marca, navegação e ações. */
.siteHeader {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  position: relative;
  padding: 16px 0;
}

/* Bloco da marca (ícone + texto). */
.brand {
  display: inline-flex;
  align-items: center;
  gap: 12px;
  flex-shrink: 0;
}

/* Marca visual (logo). */
.brandMark {
  width: 48px;
  height: 48px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  flex: 0 0 auto;
}

.brandMark img {
  width: 100%;
  height: 100%;
  display: block;
  object-fit: contain;
}

.brandText {
  display: grid;
  gap: 2px;
}

.brandText strong {
  font-size: 1rem;
  letter-spacing: 0.01em;
  color: var(--navy);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

.brandText small {
  color: var(--muted);
  font-weight: 700;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* Navegação principal — direção clássica: âncoras em texto simples,
   centralizadas na barra, com o item ativo sublinhado em dourado. */
.siteNav {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: wrap;
  margin: 0 auto;
}

.siteNav a:not(.btn) {
  color: var(--muted);
  font-weight: 700;
  font-size: 0.93rem;
  padding: 8px 11px;
  border-radius: var(--radius-xs);
  border: 1px solid transparent;
  transition: background-color 120ms ease, color 120ms ease, border-color 120ms ease;
}

.siteNav a:not(.btn):hover,
.siteNav a:not(.btn):focus-visible {
  color: var(--navy);
  background: color-mix(in srgb, var(--surface) 72%, transparent);
  border-color: color-mix(in srgb, var(--text) 8%, transparent);
}

/* Seção em foco, marcada pelo scroll (assets/landing.js). */
.siteNav a[aria-current="true"] {
  color: var(--navy);
  text-decoration: underline;
  text-decoration-color: var(--gold);
  text-decoration-thickness: 1px;
  text-underline-offset: 6px;
}

/* O acesso ao portal vive nas ações do cabeçalho no desktop e desce para
   dentro do painel do menu no mobile (ver landing-theme.css). */
.siteNav .navPortal {
  display: none;
}

.headerActions {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  flex: 0 0 auto;
}

/* Ações do cabeçalho: usam os botões oficiais do DS (.btn.btnSecondary e
   .btn.btnIcon). Aqui ficam apenas ajustes de layout/comportamento. */
/* Botões de ação do cabeçalho: quadrados, com alvo de toque de 44px. */
.themeToggle {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
}

/* Ícone sol/lua: o estado vem do aria-pressed que o JS mantém no botão. */
.themeIcon {
  width: 16px;
  height: 16px;
  display: block;
}

.themeToggle[aria-pressed="false"] .themeIconSun,
.themeToggle[aria-pressed="true"] .themeIconMoon {
  display: none;
}

/* Utilitário de acessibilidade: texto só para leitores de tela. */
.srOnly {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

.themeToggleLabel {
  white-space: nowrap;
}

.menuToggleBars {
  display: grid;
  gap: 4px;
}

.menuToggleBars span {
  display: block;
  width: 18px;
  height: 2px;
  border-radius: var(--r-pill);
  background: currentColor;
  transform-origin: center;
  transition: transform 140ms ease, opacity 140ms ease;
}

.siteHeader[data-menu-open="true"] .menuToggle {
  border-color: color-mix(in srgb, var(--navy) 34%, transparent);
  background: color-mix(in srgb, var(--navy) 12%, transparent);
}

.siteHeader[data-menu-open="true"] .menuToggleBars span:nth-child(1) {
  transform: translateY(6px) rotate(45deg);
}

.siteHeader[data-menu-open="true"] .menuToggleBars span:nth-child(2) {
  opacity: 0;
}

.siteHeader[data-menu-open="true"] .menuToggleBars span:nth-child(3) {
  transform: translateY(-6px) rotate(-45deg);
}

/* Espaçamento padrão entre seções. */
.section {
  padding: 28px 0 24px;
}

/* Evita que títulos fiquem escondidos atrás da barra fixa ao navegar por
   âncoras. A altura da faixa entra na conta porque ela faz parte do bloco. */
.section[id] {
  scroll-margin-top: calc(96px + var(--notice-h, 0px) + var(--safe-top));
}

/* Área hero de abertura da página. */
/* Hero ocupa pelo menos a viewport útil (descontando o header). Usa
   min-height pra deixar a hero crescer caso o conteúdo precise, sem
   cortar o topo do h1 atrás do header sticky. */
/* O hero ocupa a altura que sobra da barra fixa — cabeçalho mais a faixa de
   aviso. Sem número chumbado: com a faixa visível o CTA continuaria visível
   em qualquer tela, e ao fechá-la o hero volta a crescer. */
.hero {
  min-height: calc(100vh - var(--header-h) - var(--notice-h, 0px));
  min-height: calc(100svh - var(--header-h) - var(--notice-h, 0px));
  display: flex;
  align-items: center;
  padding: 16px 0 12px;
}

@supports (height: 100dvh) {
  .hero {
    min-height: calc(100dvh - var(--header-h) - var(--notice-h, 0px));
  }
}

/* Hero "quiet luxury": layout centrado, sem card, deixa a tipografia liderar.
   Padding vertical escala pela altura da viewport (dvh) pra acompanhar
   notebook ou monitor sem estourar. Horizontal segue largura como sempre. */
.heroPanel {
  width: 100%;
  max-width: 920px;
  margin: 0 auto;
  padding: clamp(20px, 5dvh, 64px) clamp(16px, 4vw, 40px);
  text-align: center;
  background: transparent;
  border: 0;
  border-radius: 0;
  box-shadow: none;
  position: relative;
}

/* Filete dourado curto no topo do hero — único ornamento, calado e decisivo. */
.heroRule {
  display: block;
  width: 56px;
  height: 1px;
  margin: 0 auto 28px;
  background: var(--gold);
  opacity: 0.9;
}

/* Rótulos pequenos de seção (eyebrow). Uma única especificação para as três
   ocorrências da página, com as métricas do .eyebrow do DS (ds/ds.css).
   O ouro puro sobre --bg fica em 3.7:1, abaixo do piso de 4.5:1 para um
   rótulo de 11,5px — por isso o misto, que sobe para 4.98:1 no claro e
   10.3:1 no escuro sem precisar de uma regra por tema. */
.eyebrow,
.sectionEyebrow {
  margin: 0 0 12px;
  font-family: var(--font-body);
  font-size: 0.72rem;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  color: color-mix(in srgb, var(--gold) 78%, var(--text));
}

/* No hero centrado o rótulo só muda de alinhamento e respiro. */
.heroPanel .eyebrow {
  margin: 0 auto 24px;
}

/* Título principal da página. */
h1 {
  margin: 0 0 14px;
  font-family: var(--font-heading);
  font-size: var(--step-5);
  line-height: 1.02;
  letter-spacing: -0.02em;
  color: var(--navy);
  max-width: 14ch;
}

/* No hero centrado, o h1 ganha respiro lateral e quebra equilibrada.
   max-width 22ch (em vez de 18) garante que a frase do site real quebre
   em 3 linhas em vez de 4-5, cabendo melhor em viewports curtas. */
.heroPanel h1 {
  max-width: 22ch;
  margin: 0 auto 18px;
  text-wrap: balance;
}

/* Texto de apoio do hero. */
.heroSub {
  margin: 0;
  max-width: 68ch;
  color: var(--muted);
  font-size: var(--step-1);
  font-weight: 600;
  line-height: 1.55;
}

/* No hero centrado, o lede fica largura controlada e quebra natural. */
.heroPanel .heroSub {
  margin: 0 auto;
  max-width: 58ch;
  font-size: var(--step-2);
  line-height: 1.65;
  text-wrap: pretty;
}

/* Linhas de botões (hero e contato). */
.ctaRow,
.contactActions {
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 18px;
}

/* Form de contato (V01): mais gap e respiro vertical, alinhamento horizontal. */
.contactActions {
  gap: 14px;
  margin-top: 32px;
}

/* No hero centrado, os CTAs ficam centralizados e com mais respiro vertical. */
.heroPanel .ctaRow {
  justify-content: center;
  margin-top: 36px;
  gap: 14px;
}

/* ── BOTÕES ───────────────────────────────────────
   A base (.btn, .btnPrimary, .btnSecondary, .btnGhost, .btnSm, .btnIcon e
   o estado :disabled, mais todas as réguas de tema escuro) vem de
   ds/botoes.css via ds/components.css. Aqui ficam só os três deltas reais
   da landing — nada mais. Antes estas ~130 linhas re-declaravam o
   componente inteiro, o que mascarava qualquer correção feita no DS. */

/* Alvo de toque: os controles do cabeçalho são operados com o dedo. */
.btn,
.themeToggle,
.menuToggle,
.siteNav a {
  touch-action: manipulation;
}

.themeToggle {
  flex: 0 0 auto;
  width: 44px;
  height: 44px;
}

/* O hambúrguer (.btn.btnIcon) só aparece no layout mobile. */
.menuToggle {
  display: none;
  width: 44px;
  height: 44px;
}


/* Cabeçalho das seções: eyebrow centralizado entre 2 filetes dourados
   animados (wave breathing), h2 na primeira coluna e nota lateral à direita. */
.sectionTitle {
  margin-bottom: 18px;
  display: block;
}

/* Linha do eyebrow com 2 filetes douradas — esquerda curta, direita longa. */
.sectionEyebrowRow {
  display: flex;
  align-items: center;
  gap: 14px;
}

/* No row dos filetes, o eyebrow precisa de line-height próxima da altura
   visual do texto (maiúsculas com letter-spacing). Sem isso a "caixa" do
   <p> fica mais alta que o glifo, e align-items: center centraliza pela
   caixa, deixando a linha visualmente abaixo do texto. */
.sectionEyebrowRow .sectionEyebrow {
  line-height: 1;
  margin: 0;
  padding: 0;
}

/* Decoração dourada animada (V02 wave breathing). Filete tapered base
   + glow deslizando ciclicamente. Aplicada via ::before (base) e
   ::after (glow animado). */
.sectionDeco {
  position: relative;
  height: 1px;
}

.sectionDecoLeft {
  flex: 0 0 clamp(80px, 14vw, 200px);
}

.sectionDecoRight {
  flex: 1 1 auto;
  min-width: 80px;
}

.sectionDeco::before {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    90deg,
    transparent 0%,
    var(--gold) 25%,
    var(--gold) 75%,
    transparent 100%
  );
  opacity: 0.35;
  pointer-events: none;
}

/* Brilho estático sobre o filete — sem animação contínua. O movimento
   infinito da versão anterior era ornamento puro e concorria com o
   canvas de névoa, que já carrega o movimento da página. */
.sectionDeco::after {
  content: "";
  position: absolute;
  inset: 0;
  background: linear-gradient(
    90deg,
    transparent 0%,
    var(--gold) 40%,
    var(--gold) 60%,
    transparent 100%
  );
  opacity: 0.22;
  pointer-events: none;
}

/* Corpo do header da seção: h2 à esquerda, nota lateral à direita. */
.sectionBody {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: end;
  gap: 32px;
  margin-top: 18px;
}

.sectionTitle h2 {
  margin: 0;
  font-family: var(--font-heading);
  font-size: var(--step-4);
  line-height: 1.06;
  letter-spacing: -0.02em;
  color: var(--navy);
  text-wrap: balance;
}

.sectionNote {
  margin: 0;
  color: var(--muted);
  font-weight: 700;
  font-size: var(--step-0);
  text-align: right;
  text-wrap: pretty;
  max-width: 36ch;
  padding-bottom: 0.5em;
}

/* Grade de cards de serviços (3 colunas em desktop). */
.serviceGrid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 20px;
}

/* ── CARD DE SERVIÇO ──────────────────────────────
   Superfície, raio, borda, hover (deslocamento de 2px + anel de foco),
   .serviceCard h3 em Source Serif 4 e .serviceCard p em --muted/600, com as
   réguas de tema escuro, vêm de ds/cards.css via ds/components.css. O card
   segue plano, como o .serviceCard do DS: a borda de 1px é o que separa.

   Delta da landing: altura mínima para os seis cards da grade terminarem
   na mesma linha de base, mais a medida e o balanço do título.

   Nota: o DS se contradiz aqui — .card tem box-shadow e .serviceCard não
   tem. A landing segue o .serviceCard. Se a intenção for cards com sombra,
   o ajuste é em ds/cards.css e alcança as duas famílias de uma vez. */
.serviceCard {
  min-height: 240px;
}

.serviceCard h3 {
  max-width: 22ch;
  text-wrap: balance;
}

/* Layout "onde estamos" (V02 — alternada com filete dourado central):
   3 colunas, painel | filete | painel. Em mobile, vira 1 coluna com filete
   horizontal entre os painéis. */
.splitGrid {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  gap: 36px;
  align-items: stretch;
}

/* Filete vertical dourado com 2 losangos no centro (gesto identitário V02). */
.splitDivider {
  position: relative;
  width: 1px;
  background: linear-gradient(
    180deg,
    transparent 0%,
    var(--gold) 20%,
    var(--gold) 80%,
    transparent 100%
  );
  opacity: 0.55;
}

.splitDivider::before,
.splitDivider::after {
  content: "";
  position: absolute;
  left: 50%;
  width: 7px;
  height: 7px;
  border: 1px solid var(--gold);
  background: var(--bg);
  transform: translateX(-50%) rotate(45deg);
}

.splitDivider::before { top: 42%; }
.splitDivider::after  { top: 58%; }

/* ── PAINÉIS ──────────────────────────────────────
   .panel (raio, borda, superfície, coluna flexível e o tratamento opaco do
   tema escuro) vem de ds/cards.css. .panelContact (fundo, borda dourada,
   filete interno e o h3/p) também.

   Delta da landing: .panelSoft, uma superfície levemente recuada usada nos
   dois painéis de "onde estamos" — o DS não tem essa variante. */
.panelSoft {
  background: var(--surface-soft);
}

/* Os títulos dos dois painéis de "onde estamos" vêm de .panel h3 no
   ds/cards.css. A landing só ajusta o balanço da linha. */
.panel h3 {
  text-wrap: balance;
}

/* Utilitários de texto e listas. */
.muted {
  color: var(--muted);
}

.introCopy {
  margin: 0;
  font-weight: 600;
}

/* Lista do endereço (V02): bullet vira hairline dourado curto à esquerda. */
.list {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 14px;
  margin: 28px 0 0;
  padding: 0;
  color: var(--text);
  font-weight: 500;
}

.list li {
  display: grid;
  grid-template-columns: 14px 1fr;
  gap: 14px;
  align-items: baseline;
  font-size: 0.98rem;
  line-height: 1.55;
}

.list li::before {
  content: "";
  display: block;
  width: 8px;
  height: 1px;
  background: var(--gold);
  margin-top: 0.7em;
  opacity: 0.85;
}

.list li + li {
  margin-top: 0;
}

/* Lista numerada do fluxo (V02): numeração "01 02 03" em pílula dourada. */
.listOrdered {
  counter-reset: flow;
  padding: 0;
  gap: 22px;
}

.listOrdered li {
  counter-increment: flow;
  grid-template-columns: auto 1fr;
  gap: 22px;
  line-height: 1.6;
  text-wrap: pretty;
}

.listOrdered li::before {
  content: counter(flow, decimal-leading-zero);
  width: auto;
  height: auto;
  background: color-mix(in srgb, var(--gold) 8%, transparent);
  border: 1px solid var(--line-strong);
  border-radius: var(--r-pill);
  padding: 5px 11px;
  margin-top: 2px;
  font-family: var(--font-mono);
  font-size: 0.72rem;
  font-weight: 500;
  letter-spacing: 0.18em;
  color: color-mix(in srgb, var(--gold) 78%, var(--text));
  white-space: nowrap;
  opacity: 1;
}

/* ── PAINEL DE CONTATO ────────────────────────────
   Fundo em duas camadas, borda dourada, filete interno e o tratamento opaco
   do tema escuro vêm de .panelContact no ds/cards.css. Deltas da landing:
   o respiro do formulário (grid, hint e ações) e a medida do texto de
   abertura, que precisa caber numa coluna de leitura. */
.panelContact .introCopy {
  margin: 0 0 36px;
  max-width: 60ch;
  font-size: var(--step-1);
  line-height: 1.65;
}

/* Estruturas do formulário (grades e campos). */
form {
  margin-top: 12px;
}

.formGrid {
  display: grid;
  gap: 24px 22px;
}

.formGrid2 {
  grid-template-columns: 1fr 1fr;
}

/* ── CAMPOS ───────────────────────────────────────
   O wrapper é .inputGroup e o campo é .inputGold — os dois vêm de
   ds/inputs.css via ds/components.css, como o DESIGN.md prescreve. A landing
   usava .field, que era o mesmo wrapper reimplementado (gap 8px em vez de
   5px, e a label sem a régua de tema escuro do DS).

   .inputGold (borda, raio, hover, foco dourado, :focus-visible, ::placeholder,
   .is-error com o shake e .is-valid) também vem do DS. O campo já mede ~50px
   com 12px de padding e 16px de fonte, acima do alvo de 44px — por isso a
   landing não impõe altura mínima. */

/* Deltas da landing: o campo que ocupa a linha inteira do grid (o textarea do
   problema), o respiro entre label e campo, o tracking da label e o
   escurecimento no foco. */
.inputGroup {
  gap: 8px;
}

.inputGroup.fieldFull {
  grid-column: 1 / -1;
}

.inputGroup label {
  letter-spacing: 0.02em;
  transition: color var(--dur-fast) var(--ease-standard);
}

/* Quando o usuário foca o input, a label escurece — feedback visual extra.
   Ouro puro (#9d7a35) sobre --bg fica em 3.7:1, abaixo do piso de 4.5:1 para
   um rótulo de 13px. A mesma receita do hero e da numeração do fluxo resolve:
   4.98:1 no claro, 10.3:1 no escuro. */
.inputGroup:focus-within label {
  color: color-mix(in srgb, var(--gold) 78%, var(--text));
}

/* Deltas da landing: a área do problema precisa de mais altura que um campo
   de uma linha, e o placeholder fica com opacidade total — o .inputGold do
   DS usa 0.7, que no claro cai para 2.85:1 sobre --surface. Placeholder
   também é texto. */
.inputGold::placeholder,
textarea.inputGold::placeholder {
  color: var(--muted);
  opacity: 1;
}

textarea.inputGold {
  min-height: 140px;
  resize: vertical;
}

.fieldHint {
  margin: 0;
  color: var(--muted);
  font-size: 0.9rem;
  font-weight: 600;
}

@keyframes fieldShake {
  0%, 100% { transform: none; }
  20% { transform: translateX(-5px); }
  60% { transform: translateX(5px); }
}
@media (prefers-reduced-motion: reduce) {
  .inputGold.is-error { animation: none; }
}

/* Os dois campos de escolha (faixa de funcionários e urgência) são <select>
   nativos com .inputGold do DS — inclusive o cursor, a cor da lista de opções
   e o estado vazio em --muted, que agora estão em ds/inputs.css junto com o
   resto do componente. A versão anterior substituía o select por um
   role="listbox" montado à mão: ~150 linhas de CSS e ~110 de JS para
   reimplementar um controle que a plataforma já entrega. */

.siteFooter {
  margin-top: 20px;
  padding: 18px 0 28px;
  border-top: 1px solid color-mix(in srgb, var(--text) 10%, transparent);
}

.siteFooter p {
  margin: 0;
}

.siteFooter p + p {
  margin-top: 4px;
}

/* ── RODAPÉ DA LANDING (três colunas) ──────────────────────────────
   Fica fora do <main class="wrap"> para poder ocupar a largura toda;
   o conteúdo interno se alinha ao mesmo container do resto da página. */
.ft {
  background: var(--surface);
  border-top: 1px solid var(--line);
  font-family: var(--font-body);
  --ft-fg: var(--navy);
}

.ft a {
  transition: color 120ms ease;
}

.ft a:hover,
.ft a:focus-visible {
  text-decoration: underline;
  text-underline-offset: 4px;
}

.ft a:focus-visible {
  outline: none;
  box-shadow: var(--focus-ring-strong);
  border-radius: var(--radius-xs);
}

/* A marca é um escudo navy: precisa de base clara nos dois temas. */
.ftLogoPlate {
  width: 46px;
  height: 46px;
  padding: 4px;
  border-radius: var(--radius-xs);
  background: #fff;
  display: grid;
  place-items: center;
  flex: 0 0 auto;
}

.ftLogoPlate img {
  width: 100%;
  height: 100%;
  object-fit: contain;
}

.ftInner {
  display: grid;
  grid-template-columns: 1.5fr 0.85fr 1.15fr 1fr;
  gap: 36px;
  padding: 52px 0 40px;
}

.ftBrandRow {
  display: flex;
  align-items: flex-start;
  gap: 14px;
}

.ftName {
  font-family: var(--font-heading);
  font-size: 1.15rem;
  line-height: 1.2;
  letter-spacing: -0.01em;
  color: var(--ft-fg);
}

.ftTagline {
  margin-top: 8px;
  max-width: 44ch;
  color: var(--muted);
  font-size: 0.9rem;
  line-height: 1.65;
}

.ftCol h3 {
  font-family: var(--font-mono);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--muted);
  margin-bottom: 12px;
}

.ftCol p,
.ftCol a {
  display: block;
  font-size: 0.9rem;
  color: var(--muted);
  line-height: 1.75;
  overflow-wrap: break-word;
}

.ftBase {
  border-top: 1px solid var(--line);
}

.ftBaseInner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px 24px;
  flex-wrap: wrap;
  padding: 16px 0;
  font-size: 0.82rem;
  color: var(--muted);
}

/* Defesa contra rolagem horizontal em telas estreitas: palavras longas
   (endereço, nome de arquivo, e-mail) quebram em vez de empurrar a página. */
.noticeBarText,
.ftTagline,
.ftCol p,
.ftBaseInner {
  overflow-wrap: break-word;
}



/* Remove outline padrão e mantém foco estilizado pelos componentes. */
:focus-visible {
  outline: 0;
}

/* Tema escuro: a base dos tokens vem de ds/tokens.css
   (body[data-theme="dark"]). Aqui entram apenas os extras da landing. */
body[data-theme="dark"] {
  --bg-alt: var(--mist-bg-alt);
  --surface-soft: color-mix(in srgb, var(--surface) 92%, var(--text));
  --surface-ghost: color-mix(in srgb, var(--surface) 96%, var(--text));
  --line-strong: color-mix(in srgb, var(--text) 22%, transparent);

  /* No escuro o dourado sobe de tom para os filetes continuarem legíveis. */
  --gold: var(--gold-bright);

  background:
    radial-gradient(900px 520px at 100% 0%, color-mix(in srgb, var(--navy) 18%, transparent), transparent 68%),
    radial-gradient(760px 420px at 0% 14%, color-mix(in srgb, var(--gold-bright) 12%, transparent), transparent 72%),
    linear-gradient(180deg, var(--mist-bg-top) 0%, var(--bg) 40%, var(--bg-alt) 100%);
}

body[data-theme="dark"] .topbar {
  border-bottom-color: var(--line);
  background: color-mix(in srgb, var(--bg) 82%, transparent);
}

/* A faixa de aviso acompanha o tema: tint de navy mais denso no escuro. */
body[data-theme="dark"] .noticeBar {
  background: color-mix(in srgb, var(--navy) 18%, transparent);
  border-top-color: var(--line);
}

body[data-theme="dark"] .noticeBarText {
  color: var(--text);
}

/* Em telas estreitas o texto ocupa a linha toda e as ações vão para baixo,
   com alvos de toque de 44px. */
@media (max-width: 720px) {
  .noticeBarInner {
    flex-wrap: wrap;
    row-gap: 10px;
    padding: 12px 0;
  }

  .noticeBarText {
    flex: 1 1 100%;
  }

  .noticeBarActions {
    flex: 1 1 100%;
    justify-content: flex-end;
  }

  .noticeBar .btnSm {
    min-height: 44px;
    padding: 10px 14px;
  }

  .noticeBar .btnIcon {
    width: 44px;
    height: 44px;
  }
}

body[data-theme="dark"] .brandText strong {
  color: var(--text);
}

body[data-theme="dark"] .siteNav a:hover,
body[data-theme="dark"] .siteNav a:focus-visible {
  color: var(--text);
  background: color-mix(in srgb, var(--text) 5%, transparent);
  border-color: color-mix(in srgb, var(--text) 8%, transparent);
}

body[data-theme="dark"] .siteNav a[aria-current="true"] {
  color: var(--text);
  text-decoration-color: var(--gold-bright);
}

/* O visual das ações do cabeçalho vem dos botões oficiais do DS
   (.btn.btnSecondary / .btn.btnIcon); aqui só o estado "menu aberto". */
body[data-theme="dark"] .siteHeader[data-menu-open="true"] .menuToggle {
  border-color: color-mix(in srgb, var(--text) 22%, transparent);
  background: color-mix(in srgb, var(--text) 8%, transparent);
}

/* Em dark, o hero "quiet luxury" fica transparente para deixar o canvas
   de partículas douradas respirar atrás. Sem card, sem borda, sem sombra. */
body[data-theme="dark"] .heroPanel {
  background: transparent;
  border: 0;
  box-shadow: none;
}

/* No escuro os títulos de seção sobem para --text. A label não entra aqui:
   o ds/inputs.css já tem body[data-theme="dark"] .inputGroup label. Os títulos
   de .panel e .serviceCard também não — o ds/cards.css resolve. */
body[data-theme="dark"] h1,
body[data-theme="dark"] .sectionTitle h2 {
  color: var(--text);
}

/* O escurecimento da label no foco precisa do prefixo de tema para vencer a
   regra do DS acima, que por especificidade apagaria o estado. */
body[data-theme="dark"] .inputGroup:focus-within label {
  color: color-mix(in srgb, var(--gold) 78%, var(--text));
}

/* ── TEMA ESCURO: O QUE A LANDING AINDA DONA ──────
   Botões, .serviceCard, .panel, .panelContact e .inputGold já têm suas
   réguas de dark em ds/botoes.css e ds/cards.css (via ds/components.css).
   Elas eram re-declaradas aqui com os mesmos valores, o que dava dois donos
   para um estado. As réguas abaixo são exclusivas da landing. */

/* .panelSoft no escuro: precisa do prefixo de tema para vencer a régua
   body[data-theme="dark"] .panel do ds/cards.css, que é mais específica e
   colocaria aqui a superfície opaca padrão no lugar da variante recuada. */
body[data-theme="dark"] .panelSoft {
  background: var(--surface-soft);
}

body[data-theme="dark"] .list li {
  color: var(--text);
}

body[data-theme="dark"] .listOrdered li::before {
  color: var(--gold-bright);
  border-color: color-mix(in srgb, var(--text) 16%, transparent);
}

body[data-theme="dark"] .splitDivider::before,
body[data-theme="dark"] .splitDivider::after {
  background: var(--bg);
}

body[data-theme="dark"] .siteFooter {
  border-top-color: var(--line);
}

/* Rodapé da landing: no escuro o título da marca sobe para --text, como nos
   demais componentes. O resto já sai dos tokens. */
body[data-theme="dark"] .ft {
  --ft-fg: var(--text);
}

/* O rodapé passa de quatro para duas colunas e depois empilha, antes de as
   colunas ficarem apertadas. */
@media (max-width: 1040px) {
  .ftInner {
    grid-template-columns: 1fr 1fr;
    gap: 28px 32px;
  }
}

@media (max-width: 620px) {
  .ftInner {
    grid-template-columns: 1fr;
    gap: 28px;
    padding: 40px 0 32px;
  }
}

/* Responsividade: com o menu na horizontal e o acesso ao portal, a linha de
   apoio da marca sai de cena antes do header começar a quebrar. */
@media (max-width: 1120px) {
  .brandText small {
    display: none;
  }
}

/* Responsividade: com a sidebar ocupando 232px, a grade de serviços fica
   apertada bem antes do breakpoint do mobile. Duas colunas a partir daqui. */
@media (max-width: 1080px) {
  .serviceGrid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* O cabeçalho não cabe em uma linha juntando marca, três âncoras, acesso ao
   portal e botão de tema. Até 1024px o portal sai daqui — ele continua no
   rodapé, que é o lugar dele para quem já é cliente. */
@media (max-width: 1024px) {
  .headerActions .headerPortal {
    display: none;
  }
}

/* Responsividade: tablet/mobile (simplifica header e grids). */
@media (max-width: 900px) {
  .siteHeader {
    align-items: center;
    gap: 10px;
  }

  .brand {
    flex: 1 1 auto;
    min-width: 0;
  }

  .headerActions {
    margin-left: auto;
  }

  .siteNav {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    right: 0;
    z-index: 2;
    display: grid;
    gap: 8px;
    padding: 10px;
    border-radius: var(--radius);
    border: 1px solid var(--line);
    background: color-mix(in srgb, var(--surface) 98%, transparent);
    box-shadow: var(--shadow-lg);
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(-6px);
    transition: opacity 140ms ease, transform 140ms ease, visibility 140ms ease;
  }

  .siteHeader[data-menu-open="true"] .siteNav {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateY(0);
  }

  /* No painel suspenso cada link vira uma linha; o acesso ao portal vira um
     botão de largura total no fim da lista. */
  .siteNav a:not(.btn) {
    display: flex;
    align-items: center;
    min-height: 44px;
    padding: 10px 12px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--line);
    background: color-mix(in srgb, var(--surface) 72%, transparent);
  }

  /* O acesso ao portal troca de lugar: sai das ações (onde roubaria largura
     da marca) e vira um botão de largura total no fim do painel. */
  .siteNav .navPortal {
    display: inline-flex;
    width: 100%;
    min-height: 48px;
  }

  .headerActions .headerPortal {
    display: none;
  }

  /* O menu suspenso do mobile: o botão de ação só precisa virar quadrado. */
  .menuToggle {
    display: inline-flex;
  }

  .section[id] {
    scroll-margin-top: calc(102px + var(--notice-h, 0px) + var(--safe-top));
  }

  body[data-theme="dark"] .siteNav {
    border-color: var(--line);
    background: color-mix(in srgb, var(--surface) 98%, transparent);
    box-shadow: var(--shadow-lg);
  }

  body[data-theme="dark"] .siteNav a:not(.btn) {
    border-color: var(--line);
    background: color-mix(in srgb, var(--text) 3%, transparent);
  }

  body[data-theme="dark"] .siteNav a:not(.btn):hover,
  body[data-theme="dark"] .siteNav a:not(.btn):focus-visible {
    background: color-mix(in srgb, var(--text) 6%, transparent);
  }

  .hero {
    min-height: auto;
    padding-top: 18px;
  }

  h1 {
    max-width: none;
    font-size: clamp(36px, 10vw, 56px);
  }

  /* Em tablet, o sectionBody empilha h2 e nota lateral em coluna. */
  .sectionBody {
    grid-template-columns: 1fr;
    align-items: start;
    gap: 12px;
  }

  .sectionNote {
    text-align: left;
    max-width: 54ch;
    padding-bottom: 0;
  }

  /* Em mobile, as 2 linhas douradas do eyebrow somem — ornamento desnecessário
     em viewport pequeno e libera o eyebrow pra alinhar com o título. */
  .sectionEyebrowRow {
    gap: 0;
  }

  .sectionDeco {
    display: none;
  }

  .splitGrid {
    grid-template-columns: 1fr;
    gap: 0;
  }

  .formGrid2 {
    grid-template-columns: 1fr;
  }

  /* Em mobile, o filete divisor vira horizontal entre os 2 painéis,
     e os losangos somem (filete fino é suficiente). */
  .splitDivider {
    width: 100%;
    height: 1px;
    background: linear-gradient(
      90deg,
      transparent 0%,
      var(--gold) 20%,
      var(--gold) 80%,
      transparent 100%
    );
    margin: 28px 0;
  }

  .splitDivider::before,
  .splitDivider::after {
    display: none;
  }
}

/* ─────────────────────────────────────────────────────────────────────
   Responsividade: mobile (V01 editorial generoso, viewport ~380px).
   Origem: variação V01 do output Mobile Variacoes.html, refinada e
   plugada nas classes existentes sem trocar markup. Estratégia
   "editorial generoso" — espaço amplo entre seções, tipografia
   grande, cards com padding generoso, form com inputs altos pra
   leitura calma no celular.
─────────────────────────────────────────────────────────────────── */
@media (max-width: 640px) {
  /* O cabeçalho fica mais baixo aqui: 48px de logo + 10px de padding em cima
     e embaixo. O hero lê essa medida para calcular a altura que sobra. */
  :root {
    --header-h: 68px;
  }

  .wrap {
    width: min(var(--max-width), calc(100vw - 20px - var(--safe-left) - var(--safe-right)));
  }

  /* Alvos de toque de 44px também nos links do rodapé e nas opções do
     dropdown — são operados com o dedo, não com o mouse. */
  .ftCol a,
  .ftBaseInner a {
    display: flex;
    align-items: center;
    min-height: 44px;
  }

  /* Header: marca compacta + ações sem perder tap target.
     Topbar com padding-top fixo (em vez de safe-area) evita o "menu
     sobe um pouco" quando a URL bar do browser mobile retrai/expande
     no scroll. */
  .topbar {
    padding-top: 0;
  }

  .siteHeader {
    padding: 10px 0;
  }

  .brandText small {
    display: none;
  }

  .brandText strong {
    font-size: 0.95rem;
    line-height: 1.12;
  }

  .headerActions {
    gap: 6px;
  }

  /* Hero V01: padding generoso top/bottom com clamp pra escalar de
     iPhone SE (375px) até phablets (480-640px). heroPanel zerado,
     a .hero assume o respiro. */
  .hero {
    min-height: auto;
    padding: clamp(56px, 14vw, 80px) 0 clamp(72px, 18vw, 96px);
    align-items: stretch;
  }

  .heroPanel {
    padding: 0;
    max-width: none;
  }

  .heroRule {
    margin: 0 auto 28px;
  }

  .heroPanel .eyebrow {
    margin: 0 auto clamp(24px, 6vw, 32px);
  }

  .heroPanel h1 {
    font-size: clamp(2.2rem, 5.5vw + 0.5rem, 2.5rem);
    line-height: 1.06;
    margin: 0 auto clamp(20px, 5vw, 26px);
    max-width: 22ch;
  }

  .heroPanel .heroSub {
    font-size: 1.04rem;
    line-height: 1.65;
    max-width: 32ch;
  }

  .heroPanel .ctaRow {
    flex-direction: column;
    gap: 14px;
    margin-top: clamp(32px, 8vw, 40px);
  }

  .heroPanel .ctaRow .btn {
    min-height: 56px;
    font-size: 1rem;
    width: 100%;
  }

  /* Seções V01: respiro vertical generoso com clamp pra escalar bem
     de iPhone SE (375px) até phablets grandes (480-640px). Filete
     sutil entre seções pra organizar o ritmo editorial. */
  .section {
    padding: clamp(72px, 16vw, 104px) 0;
  }

  .section + .section {
    border-top: 1px solid var(--line);
  }

  /* Cabeçalho de seção V01: filete dourado curto à direita do eyebrow
     (fiel ao design). Em desktop os 2 filetes do wave breathing
     respiram; em mobile mantemos só o da direita, estático, sem
     animação - touch não tem hover e tela pequena pede menos ornamento. */
  .sectionTitle {
    margin-bottom: clamp(36px, 9vw, 48px);
  }

  .sectionEyebrowRow {
    gap: 12px;
  }

  .sectionEyebrowRow .sectionDecoLeft {
    display: none;
  }

  .sectionEyebrowRow .sectionDecoRight {
    display: block;
    flex: 1 1 auto;
    min-width: 40px;
    height: 1px;
  }

  /* Filete simples sem wave breathing em mobile. Mantém só o gradient
     tapered do ::before, neutraliza o ::after animado. */
  .sectionEyebrowRow .sectionDecoRight::after {
    display: none;
  }

  .sectionEyebrowRow .sectionDecoRight::before {
    opacity: 0.5;
  }

  .sectionTitle h2 {
    font-size: clamp(1.75rem, 5.2vw + 0.4rem, 2rem);
    line-height: 1.08;
  }

  .sectionNote {
    font-size: 0.98rem;
    margin-top: 18px;
    text-align: left;
  }

  /* Cards de serviço V01: 1 coluna alta, padding generoso 36×28,
     tipografia maior, filete dourado bottom estático (mobile não
     tem hover, então o gesto identitário fica sempre visível). */
  .serviceGrid {
    grid-template-columns: 1fr;
    gap: 18px;
  }

  .serviceCard {
    padding: clamp(28px, 8vw, 36px) clamp(22px, 6vw, 28px);
    min-height: auto;
  }

  .serviceCard h3 {
    font-size: clamp(1.2rem, 3.5vw + 0.4rem, 1.4rem);
    margin-bottom: 14px;
    max-width: none;
  }

  .serviceCard p {
    font-size: clamp(0.94rem, 2.4vw + 0.4rem, 1rem);
    line-height: 1.65;
  }

  .serviceCard::after {
    transform: scaleX(1);
    opacity: 0.65;
    left: clamp(22px, 6vw, 28px);
    right: clamp(22px, 6vw, 28px);
  }

  body[data-mobile-card-reveal="active"] .serviceCard {
    transition:
      opacity 300ms ease,
      transform 300ms ease,
      box-shadow 120ms ease,
      border-color 120ms ease;
  }

  body[data-mobile-card-reveal="active"] .serviceCard.is-reveal-pending {
    opacity: 0;
    transform: translateY(18px);
  }

  /* Painéis V01 (Onde estamos): padding generoso com clamp, h3 maior. */
  .panelSoft {
    padding: clamp(28px, 8vw, 36px) clamp(22px, 6vw, 28px);
    border-radius: var(--radius);
  }

  .panelSoft h3 {
    font-size: clamp(1.2rem, 3.5vw + 0.4rem, 1.4rem);
    margin-bottom: 14px;
  }

  .panelSoft .muted {
    font-size: clamp(0.94rem, 2.4vw + 0.4rem, 1rem);
    line-height: 1.65;
  }

  .list {
    margin-top: 24px;
    font-size: 0.98rem;
  }

  .listOrdered {
    gap: 22px;
  }

  /* Painel de contato V01: padding generoso com clamp, intro maior,
     form em coluna com gap 24px, inputs altos (56px). */
  .panelContact {
    padding: clamp(28px, 8vw, 36px) clamp(20px, 5vw, 24px);
    border-radius: var(--radius);
  }

  .panelContact .introCopy {
    font-size: 0.98rem;
    margin-bottom: clamp(24px, 7vw, 32px);
  }

  .formGrid {
    gap: 24px;
  }

  .inputGroup input,
  .inputGroup select,
  .inputGroup textarea {
    min-height: 56px;
    padding: 18px;
    font-size: 16px;
  }

  .inputGroup textarea {
    min-height: 140px;
    padding-top: 18px;
  }

  .fieldHint {
    font-size: 0.86rem;
    margin-top: 4px;
  }

  /* Ações do contato V01: coluna, full-width, altura 56px. */
  .contactActions {
    flex-direction: column;
    gap: 14px;
    margin-top: 8px;
  }

  .contactActions .btn {
    width: 100%;
    flex: none;
    min-height: 56px;
  }

  /* Full-width apenas nos grupos de CTA. O `.btn` agora também é usado nos
     controles do cabeçalho, que não podem virar largura total. */
  .ctaRow .btn,
  .contactActions .btn {
    width: 100%;
  }

  /* Onde estamos V01: bg-alt edge-to-edge pra alternar ritmo. Usa
     break-out via 100vw centralizado em ::before. O body ganhou
     `overflow-x: clip` no topo do styles.css pra prevenir scroll
     horizontal causado por essa técnica. */
  #onde-estamos {
    position: relative;
    isolation: isolate;
  }

  #onde-estamos::before {
    content: "";
    position: absolute;
    top: 0;
    bottom: 0;
    left: 50%;
    width: 100vw;
    background: var(--bg-alt);
    transform: translateX(-50%);
    z-index: -1;
    pointer-events: none;
  }

  body[data-theme="dark"] #onde-estamos::before {
    background: color-mix(in srgb, var(--text) 3%, transparent);
  }

  /* Filete dourado horizontal entre os 2 painéis com losangulo
     centralizado (V01). Sobrescreve o display:none do 900px e
     transforma um dos pseudo-elementos no losangulo center. */
  .splitDivider {
    position: relative;
    margin: 32px 0;
  }

  .splitDivider::before {
    display: block;
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 7px;
    height: 7px;
    border: 1px solid var(--gold);
    background: var(--bg-alt);
    transform: translate(-50%, -50%) rotate(45deg);
    opacity: 1;
  }

  .splitDivider::after {
    display: none;
  }
}

/* Reveal on scroll — aplicado via script.js a hero, sections e cards de serviço.
   Em mobile, conteúdo entra suavemente conforme o usuário rola. */
.js-revealable {
  opacity: 0;
  transform: translateY(22px);
  transition:
    opacity var(--dur-reveal) var(--ease-standard),
    transform var(--dur-reveal) var(--ease-standard);
  will-change: opacity, transform;
}
.js-revealable.is-revealed {
  opacity: 1;
  transform: none;
  will-change: auto;
}

/* Acessibilidade: desativa animações/transições para quem prefere menos movimento. */
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  * {
    transition: none !important;
  }

  /* Filete do header de seção: já é estático, só garante o brilho. */
  .sectionDeco::after {
    opacity: 0.3;
  }

  /* Garante que reveal não fique invisível para quem prefere menos movimento. */
  .js-revealable {
    opacity: 1;
    transform: none;
  }
}

/* ── SIDEBAR DO DS: menu superior em viewports intermediárias ────────────
   Quando a sidebar lateral está visível (232 px ou 78 px de rail), o espaço
   útil para a barra de navegação é reduzido. Sem este bloco, os itens da
   .siteNav quebram linha antes de o hambúrguer aparecer.

   Limiar: 1020 px — sidebar expandida (232 px) + logo (~140 px) + dois
   links de nav (~240 px) + ações do header (~160 px) + folgas ≈ 800 px
   de conteúdo, portanto 1020 px é o mínimo seguro com sidebar.
   Em telas ≤ 900 px a sidebar já some (ver landing-sidebar.css), então o
   bloco de 900 px do landing-theme.css assume normalmente a partir daí. */
@media (max-width: 1020px) {
  body.has-ds-sidebar .siteHeader {
    align-items: center;
    gap: 10px;
  }

  body.has-ds-sidebar .brand {
    flex: 1 1 auto;
    min-width: 0;
  }

  body.has-ds-sidebar .headerActions {
    margin-left: auto;
  }

  body.has-ds-sidebar .siteNav {
    position: absolute;
    top: calc(100% + 8px);
    left: 0;
    right: 0;
    z-index: 2;
    display: grid;
    gap: 8px;
    padding: 10px;
    border-radius: var(--radius);
    border: 1px solid var(--line);
    background: color-mix(in srgb, var(--surface) 98%, transparent);
    box-shadow: var(--shadow-lg);
    -webkit-backdrop-filter: blur(10px);
    backdrop-filter: blur(10px);
    opacity: 0;
    visibility: hidden;
    pointer-events: none;
    transform: translateY(-6px);
    transition: opacity 140ms ease, transform 140ms ease, visibility 140ms ease;
  }

  body.has-ds-sidebar .siteHeader[data-menu-open="true"] .siteNav {
    opacity: 1;
    visibility: visible;
    pointer-events: auto;
    transform: translateY(0);
  }

  body.has-ds-sidebar .siteNav a:not(.btn) {
    display: flex;
    align-items: center;
    min-height: 44px;
    padding: 10px 12px;
    border-radius: var(--radius-sm);
    border: 1px solid var(--line);
    background: color-mix(in srgb, var(--surface) 72%, transparent);
  }

  body.has-ds-sidebar .siteNav .navPortal {
    display: inline-flex;
    width: 100%;
    min-height: 48px;
  }

  body.has-ds-sidebar .headerActions .headerPortal {
    display: none;
  }

  body.has-ds-sidebar .menuToggle {
    display: inline-flex;
  }

  /* Dark mode dentro do dropdown lateral */
  body.has-ds-sidebar[data-theme="dark"] .siteNav {
    border-color: var(--line);
    background: color-mix(in srgb, var(--surface) 98%, transparent);
    box-shadow: var(--shadow-lg);
  }

  body.has-ds-sidebar[data-theme="dark"] .siteNav a:not(.btn) {
    border-color: var(--line);
    background: color-mix(in srgb, var(--text) 3%, transparent);
  }

  body.has-ds-sidebar[data-theme="dark"] .siteNav a:not(.btn):hover,
  body.has-ds-sidebar[data-theme="dark"] .siteNav a:not(.btn):focus-visible {
    background: color-mix(in srgb, var(--text) 6%, transparent);
  }
}



    .morePages{position:relative;display:inline-flex;}
    .morePagesToggle{
      display:inline-flex;align-items:center;gap:6px;
      padding:8px 11px;border:1px solid transparent;border-radius:var(--radius-xs);
      background:none;cursor:pointer;
      font-family:var(--font-body);font-weight:700;font-size:0.93rem;color:var(--muted);
      transition:background-color 120ms ease,color 120ms ease,border-color 120ms ease;
    }
    .morePagesToggle:hover,
    .morePages:focus-within .morePagesToggle,
    .morePages.is-open .morePagesToggle{
      color:var(--navy);
      background:color-mix(in srgb, var(--surface) 72%, transparent);
      border-color:color-mix(in srgb, var(--text) 8%, transparent);
    }
    .morePagesChev{width:12px;height:12px;flex:0 0 auto;transition:transform 160ms ease;}
    .morePages:hover .morePagesChev,
    .morePages:focus-within .morePagesChev,
    .morePages.is-open .morePagesChev{transform:rotate(180deg);}
    .morePagesMenu{
      position:absolute;top:calc(100% + 8px);right:0;z-index:40;
      min-width:230px;display:grid;gap:8px;padding:10px;
      border-radius:var(--radius-sm);border:1px solid var(--line);
      background:color-mix(in srgb, var(--surface) 98%, transparent);
      -webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);
      box-shadow:var(--shadow-lg);
      opacity:0;visibility:hidden;pointer-events:none;transform:translateY(-6px);
      transition:opacity 140ms ease,transform 140ms ease,visibility 140ms ease;
    }
    .morePages:hover .morePagesMenu,
    .morePages:focus-within .morePagesMenu,
    .morePages.is-open .morePagesMenu{opacity:1;visibility:visible;pointer-events:auto;transform:translateY(0);}
    .morePagesMenu a{
      display:flex;align-items:center;min-height:42px;padding:9px 12px;
      border:1px solid var(--line);border-radius:var(--radius-sm);
      background:color-mix(in srgb, var(--surface) 72%, transparent);
      color:var(--text);text-decoration:none;
      font-family:var(--font-body);font-weight:700;font-size:0.9rem;
      transition:background-color 120ms ease,border-color 120ms ease,color 120ms ease;
    }
    .morePagesMenu a:hover,
    .morePagesMenu a:focus-visible{
      color:var(--navy);
      background:color-mix(in srgb, var(--text) 6%, transparent);
      border-color:color-mix(in srgb, var(--text) 18%, transparent);
    }
    .morePagesMenu a:focus-visible{outline:none;box-shadow:var(--focus-ring-strong);}
    body[data-theme="dark"] .morePagesToggle:hover,
    body[data-theme="dark"] .morePages:focus-within .morePagesToggle,
    body[data-theme="dark"] .morePages.is-open .morePagesToggle{color:var(--text);}
    body[data-theme="dark"] .morePagesMenu a:hover,
    body[data-theme="dark"] .morePagesMenu a:focus-visible{color:var(--text);}
    /* No mobile o cabeçalho vira o painel do hambúrguer: o gatilho some e
       os itens entram como linhas do painel (mesmo estilo dos demais links). */
    @media (max-width:900px){
      .morePages{display:block;width:100%;}
      .morePagesToggle{display:none;}
      .morePagesMenu{
        position:static;opacity:1;visibility:visible;pointer-events:auto;transform:none;
        min-width:0;margin-top:0;padding:0;border:0;background:none;box-shadow:none;
        -webkit-backdrop-filter:none;backdrop-filter:none;
      }
    }


/* Consentimento LGPD necessário para a triagem. */
.consentField{display:flex;align-items:flex-start;gap:10px;margin-top:24px;color:var(--muted);font-size:.9rem;font-weight:700;line-height:1.45}
.consentField input{flex:0 0 auto;width:18px;height:18px;margin:2px 0 0;accent-color:var(--navy);cursor:pointer}
.consentField a{color:var(--navy);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:4px}
.consentField a:hover,.consentField a:focus-visible{color:var(--navy);box-shadow:var(--focus-ring)}
.consentField input:focus-visible{outline:2px solid var(--gold);outline-offset:3px}
.status{margin:4px 0 0;min-height:1.2rem;color:var(--muted);font-size:.92rem;font-weight:700}
body[data-theme="dark"] .consentField{color:rgba(232,238,249,.88)}
body[data-theme="dark"] .consentField a{color:var(--gold-bright)}
body[data-theme="dark"] .consentField a:hover,body[data-theme="dark"] .consentField a:focus-visible{color:#f7dfaa}
