/* ============================================================================
   lp-editorial.css — the editorial-technical layer (#1214)
   ============================================================================

   Adopts the STRUCTURE of the reference direction (oma-machina.framer.website):
   mono eyebrows with an accent square, oversized tight-tracked display type,
   pill buttons, hairline section rules, generous rhythm, one full-bleed dark
   band, numbered steps, circle stats, badge-topped pricing.

   It adopts NONE of its colour. Every value below resolves through the tokens
   already declared in styles.css, so light/dark keep working and the palette
   stays Alfred's:

     --accent          navy (light) / amber (dark)   → primary CTA fill
     --accent-bright   amber (light) / amber (dark)  → the "brass detail" role:
                       eyebrow squares, rules, numerals. styles.css already
                       describes this token exactly that way, which is why the
                       reference's orange square maps onto it without inventing
                       a colour.
     --bg/--surface/--card/--border/--text/--dim      unchanged

   Additive on purpose: styles.css is 74 KB and shared by 23 pages. A page opts
   in by adding this sheet and using `ed-*` classes, so a half-migrated page is
   still a working page.
   ========================================================================= */

/* ------------------------------------------------------- ink-band tokens -- */

/* #1214 — the one full-bleed dark band (`.ed-dark`) is ALWAYS dark, in both
   themes. That is why its rules could not read --text/--dim/--muted: in the
   light theme those resolve to navy ink (--muted is #3a5470), which on a
   #0a1626 ground is invisible. So the band had ten colour literals written by
   hand — the single place in this sheet that broke its own header contract
   ("every value below resolves through the tokens already declared in
   styles.css").

   The fix is not to point them at the theme tokens; it is to give the band its
   own tokens. These are MODE-INVARIANT by design and therefore declared once
   in :root with no :root[data-theme="dark"] counterpart — the same shape as
   --accent-bright, which is brass in both themes because it is a brand role
   rather than a theme role. Their values are the dark theme's ink ramp. */
:root {
  --ink-band: #0a1626;
  --ink-band-text: #f6f1e6;
  --ink-band-strong: #ffffff;
  --ink-band-dim: #c8bfa8;
  --ink-band-muted: #a89e8c;
  /* Hairlines and icon tiles ON the band: the sheet's convention elsewhere is
     color-mix over a token, not a re-typed rgba() of that token's channels. */
  --ink-band-hairline: color-mix(in srgb, var(--ink-band-text) 12%, transparent);
  --ink-band-tile: color-mix(in srgb, var(--ink-band-text) 8%, transparent);
}

/* ---------------------------------------------------------------- rhythm -- */

.ed-section {
  /* #1214 — a escada de ritmo vertical ja existe em tokens (--sec-y-*).
   * Esta camada tinha reinventado dois degraus quase-iguais (9vw contra
   * 9.72vw, e um 48/6vw/88 que nao existe em lugar nenhum), entao a pagina
   * de referencia ensinava uma escada que o resto do site nao usa. */
  padding-block: var(--sec-y-md);
}
.ed-section--tight { padding-block: var(--sec-y-sm); }

/* Mesma caixa de conteudo que `.wrap` (styles.css:360 e o degrau mobile em
 * styles.css:1570): 1200px de teto, goteira de 32px que cai para 20px em
 * 720px. Esta camada tinha inventado 24px/16px@560px, ou seja duas colunas de
 * conteudo levemente desalinhadas quando uma secao editorial fica ao lado de
 * uma secao legada na mesma pagina. */
.ed-wrap {
  width: min(1200px, 100% - 2 * var(--ed-gutter));
  margin-inline: auto;
}

/* A goteira da pagina, promovida de literal a token. Era 32px escrito duas
 * vezes aqui (e uma terceira vez, como 64px, no calculo da largura); o quadro
 * de goteira abaixo precisa do MESMO valor, e duas copias do numero seriam
 * duas coisas que derivam uma da outra sem dizer isso. Nenhum valor novo:
 * 32px/20px sao exatamente o que .ed-wrap ja usava. */
:root { --ed-gutter: 32px; }
@media (max-width: 720px) {
  :root { --ed-gutter: 20px; }
}

/* Full-bleed hairline that spans the viewport while content stays in the grid.
   The reference leans on these instead of boxing every section in a card. */
.ed-rule {
  border: 0;
  border-top: 1px solid var(--border);
  margin: 0;
}
/* ---------------------------------------------------- quadro de goteira -- */

/* #1214 — o par de fios verticais de altura total que ladeia a pagina.
 *
 * O QUE A REFERENCIA FAZ (medido em pixel na oma-machina.framer.website, nao
 * deduzido): um fio de 1px em #ececec a 40px da borda esquerda e outro a 40px
 * da direita, continuos do topo ao rodape (a mesma cor dos fios horizontais de
 * secao), com o texto comecando mais 40px para dentro. Em 425px o par
 * sobrevive, recuado para 16px — ou seja o recuo do quadro e sempre MENOR que
 * a goteira do conteudo, senao o fio encostaria na letra.
 *
 * O MECANISMO: UM pseudo-elemento fixo no <body>, com dois gradientes de 1px
 * como background-image (um elemento desenha os dois fios). Fixo, e nao um
 * pseudo por faixa, por tres motivos medidos nesta base:
 *   1. `.hero::after` JA E USADO em 18 das 21 paginas (o halo ambar de
 *      styles.css:573, que o tema claro desliga com `display:none`), entao um
 *      ::after por faixa perdia justamente a primeira dobra;
 *   2. um pseudo de faixa com z-index negativo desaparece atras do fundo opaco
 *      do <body> em toda faixa que nao abre contexto de empilhamento proprio;
 *   3. varias faixas NAO sao full-bleed (`.pricing-sec` a 1200px em 6 paginas,
 *      as quatro caixas de carreiras.html), e nelas o fio cairia dentro do
 *      conteudo em vez de na goteira da pagina. O quadro da referencia e
 *      ancorado na viewport, nao na faixa.
 * z-index 2: acima do conteudo (que usa z-index 1) e abaixo de toda a mobilia
 * de chrome desta base (nav 180, banners 200+, modais 1000+), para o fio nunca
 * atravessar um dialogo. `pointer-events: none` para nao roubar clique.
 *
 * O QUE ISSO NAO FAZ: a referencia recolore o par ao cruzar a faixa quase
 * preta (#333 sobre #1a1a1a) e um unico elemento de viewport nao consegue.
 * Nas paginas reais nao existe faixa escura (`.final-sec` usa --bg e o
 * <footer> usa --surface), entao o caso nao ocorre hoje; se um dia ocorrer, o
 * caminho e um pseudo por faixa escura, nao um segundo overlay.
 *
 * Uma pagina adere pondo `ed-framed` no <body>. */
:root {
  /* Metade da goteira: o fio fica sempre por dentro da borda e por fora do
   * texto, em qualquer largura, sem um segundo numero para manter em sincronia
   * (32 -> 16 no desktop, 20 -> 10 no mobile). */
  --ed-frame-inset: calc(var(--ed-gutter) / 2);
  --ed-frame-line: var(--border);
}

.ed-framed::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: 2;
  pointer-events: none;
  background-image:
    linear-gradient(var(--ed-frame-line), var(--ed-frame-line)),
    linear-gradient(var(--ed-frame-line), var(--ed-frame-line));
  background-size: 1px 100%;
  background-position: var(--ed-frame-inset) 0, calc(100% - var(--ed-frame-inset)) 0;
  background-repeat: no-repeat;
}

/* ---------------------------------------------------------------- eyebrow -- */

/* ■ SERVICES WE OFFER — mono, uppercase, wide tracking, accent square.
   Uses --t-caption-mono's sizing intent; kept literal here because the LPs do
   not load the app's type-token sheet. */
.ed-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--dim);
}
.ed-eyebrow::before {
  content: '';
  inline-size: 10px;
  block-size: 10px;
  background: var(--accent-bright);
  flex: none;
}
/* On the dark band the eyebrow text lifts; the square is already amber.
   --ink-band-muted, not --muted: in the LIGHT theme --muted is #3a5470 navy,
   which on the band's #0a1626 ground measured ~1.6:1 — the eyebrow simply was
   not there on the default theme of all 18 pages that carry the band. */
.ed-dark .ed-eyebrow { color: var(--ink-band-muted); }

/* ---------------------------------------------------------------- display -- */

/* The single biggest departure from today's LPs: type gets much larger and the
   tracking goes negative, which is what makes the reference read as editorial
   rather than as a SaaS template. */
/* Entrelinha: a referencia roda o h1 de 70px em 63px (0.90). 1.02 abria um
   respiro entre as linhas que desmancha o bloco de titulo. Fechado para 0.95 e
   nao para os 0.90 medidos de proposito: o texto aqui e pt-BR e os diacriticos
   altos (A~, C,, A') colidem com a descendente da linha de cima abaixo disso. */
.ed-display {
  font-size: var(--fs-display);
  line-height: 0.95;
  letter-spacing: var(--ls-display);
  font-weight: 600;
  color: var(--text-strong);
  text-wrap: balance;
}
.ed-display--sm {
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
}
/* Titulo que quebra numa medida curta em vez de atravessar os 1200px — o par
   do `max-width: 58ch` da `.ed-lede`. */
.ed-display--measure { max-width: 20ch; }
/* Two-tone headline: neutral line + accent line. In light mode the accent line
   is amber (brass); in dark it is amber too — both AA on their canvas. */
.ed-display__accent { color: var(--accent-text, var(--accent-bright)); }

.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
}

/* ---------------------------------------------------------------- pills --- */

.ed-pill {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 15px 26px;
  border-radius: 999px;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  text-decoration: none;
  border: 1px solid transparent;
  cursor: pointer;
  transition: transform var(--dur-fast) var(--ease-out), background-color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out), opacity var(--dur-fast) var(--ease-out);
}
.ed-pill:hover { transform: translateY(-1px); }

/* Primary = --accent. Navy in light, amber in dark — i.e. exactly the CTA
   colour these pages already use. --btn-text is the token that already pairs
   safely with it (cream on navy / ink on amber), so AA is inherited rather
   than re-derived. Never hardcode #fff here: white on amber is 3.07:1. */
.ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
}
.ed-pill--primary:hover { background: var(--accent-deep); }

/* Secondary. Media na referencia, o par primario/secundario e vermelhao contra
   preto: duas cores, um contraste imediato. Aqui nao da para replicar isso pela
   cor, porque --accent no tema claro JA e a tinta navy (#0f2a4a) e o
   --text-strong era #0a1626 — os dois pills sadam praticamente o mesmo botao,
   lado a lado, sem hierarquia visivel. Em vez de mexer no --accent (decisao de
   token, deliberada), o secundario passa a ser o pill de superficie da propria
   referencia (o do nav): fundo claro, tinta forte, contorno na mesma tinta.
   Separa dos dois vizinhos — do primario cheio e do --ghost de fio fino — e
   inverte sozinho no tema escuro. */
.ed-pill--solid {
  background: var(--surface);
  color: var(--text-strong);
  border-color: var(--text-strong);
}
.ed-pill--solid:hover {
  background: var(--text-strong);
  color: var(--bg);
}

.ed-pill--ghost {
  background: transparent;
  color: var(--text);
  border-color: var(--border2);
}
.ed-pill--ghost:hover { border-color: var(--accent-bright); }

.ed-pill__arrow { transition: transform var(--dur-fast) var(--ease-out); }
.ed-pill:hover .ed-pill__arrow { transform: translateX(3px); }

/* ---------------------------------------------------------------- cards --- */

.ed-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 18px;
  padding: clamp(22px, 2.4vw, 34px);
}
/* Mesmo degrau que `.ed-step__title`: titulo de card e um tier de card, nao um
 * tier de display. O clamp(20px,1.7vw,26px) que estava aqui era um degrau que
 * nenhum token declara, e --ls-display-sm e o tracking dos titulos grandes. */
.ed-card__title {
  font-size: var(--fs-card-title);
  line-height: 1.2;
  letter-spacing: var(--ls-tight);
  font-weight: 600;
  color: var(--text-strong);
}
.ed-card__body { color: var(--dim); line-height: 1.6; margin-top: 10px; }

/* Checklist rows — mono, uppercase, amber tick. */
.ed-checks { list-style: none; margin-top: 20px; display: grid; gap: 11px; }
.ed-check {
  display: grid;
  grid-template-columns: 16px 1fr;
  gap: 11px;
  align-items: start;
  font-family: 'Geist Mono', monospace;
  font-size: 11.5px;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  color: var(--text);
  line-height: 1.45;
}
.ed-check__mark { color: var(--accent-text, var(--accent-bright)); font-weight: 600; }

/* ------------------------------------------------------------ dark band --- */

/* One full-bleed dark section, the reference's process block. In light mode it
   inverts to ink navy; in dark mode it is already the canvas, so it gets a
   hairline instead of becoming invisible. */
.ed-dark {
  background: var(--ink-band);
  color: var(--ink-band-text);
}
.ed-dark .ed-display { color: var(--ink-band-strong); }
.ed-dark .ed-lede,
.ed-dark .ed-card__body { color: var(--ink-band-dim); }
.ed-dark .ed-rule { border-top-color: var(--ink-band-hairline); }
:root[data-theme="dark"] .ed-dark {
  background: var(--surface);
  border-block: 1px solid var(--border2);
}

/* ------------------------------------------------------- malha decorativa --- */

/* MEDIDO em https://oma-machina.framer.website/ a 1440px: o rodape da
 * referencia (#1a1a1a) e coberto por uma malha de 420 <div> VAZIOS — 30 colunas
 * x 14 linhas, celulas de 46.66 x 37px, cada uma com
 * `0.5px solid rgba(255,255,255,.02)`. Bordas adjacentes se somam, entao o fio
 * efetivo entre duas celulas e de 1px a ~4% de branco. A malha ocupa
 * x = 20..1420, ou seja a goteira da pagina.
 *
 * E ESSA MALHA que produz a leitura de "colunas separadas por fios verticais"
 * no rodape da referencia: o conteudo do rodape dela NAO e uma grade de 4
 * colunas com separadores — ele flutua por cima da textura. Nosso `.foot-top`
 * ja e uma grade (lp-nav.css:275), entao o que faltava era a textura, nao a
 * grade.
 *
 * Sai de um unico background-image, e nao de 420 nos: replicar a marcacao da
 * referencia custaria 420 elementos sem conteudo em 21 paginas, com o mesmo
 * pixel no fim. A largura da celula e `100% / 30` em vez de 46.66px fixos para
 * que a contagem de colunas — o que a vista percebe — seja estavel em qualquer
 * largura; so a ALTURA fica fixa em 37px, como na referencia.
 *
 * O par de fios de `.ed-framed::before` fica exatamente sobre a primeira e a
 * ultima coluna da malha (ambos ancorados em --ed-frame-inset), entao o quadro
 * da Pass 5 le como a borda externa da malha, e nao como um segundo sistema. */
:root {
  --ed-texture-cols: 30;
  --ed-texture-row: 37px;
  /* Mais fraco que --border: a malha e textura, nao regra. A referencia usa
   * ~4% de branco sobre #1a1a1a — um delta de claridade de ~4/255. */
  --ed-texture-line: color-mix(in srgb, var(--border) 50%, transparent);
}
/* A mesma fracao nao serve aos dois temas. No escuro, --border (#1e3550) sobre
 * --surface (#0f2a4a) ja e um contraste baixo e 50% cai perto do delta da
 * referencia. No claro, --border (#d0c8b0) sobre #ffffff e MUITO mais forte:
 * a 50% a malha lia como papel milimetrado em vez de textura (verificado em
 * captura a 1440px), entao a fracao cai para trazer o delta de volta. */
:root[data-theme="light"] {
  --ed-texture-line: color-mix(in srgb, var(--border) 22%, transparent);
}

/* O rodape e a faixa que, na referencia, carrega a malha. */
.ed-framed footer { position: relative; }

.ed-framed footer::before {
  content: '';
  position: absolute;
  /* Ancorado na mesma goteira que o quadro, nao nas bordas da faixa. */
  inset: 0 var(--ed-frame-inset);
  z-index: 0;
  pointer-events: none;
  background-image:
    repeating-linear-gradient(
      to right,
      var(--ed-texture-line) 0 1px,
      transparent 1px calc(100% / var(--ed-texture-cols))
    ),
    repeating-linear-gradient(
      to bottom,
      var(--ed-texture-line) 0 1px,
      transparent 1px var(--ed-texture-row)
    );
}

/* O conteudo do rodape sobe acima da malha. */
.ed-framed footer > .foot-in { position: relative; z-index: 1; }

/* A referencia NAO desenha a malha no mobile — medido a 425px, a grade de 420
 * celulas simplesmente nao e renderizada. Faz sentido: 30 colunas em 425px dao
 * celulas de 14px, que viram ruido sob um rodape que ja colapsou para 2 colunas
 * e depois 1. Cortamos no mesmo 1000px em que `.foot-top` colapsa
 * (lp-nav.css:330), para a malha nunca sobreviver a grade que ela acompanha. */
@media (max-width: 1000px) {
  .ed-framed footer::before { content: none; }
}

/* #1214 — pass 10, print. Nenhum dos dois e sombra (o `box-shadow:none` global
 * do @media print em styles.css nao os alcanca) e `.ed-framed::before` e
 * `position: fixed`, que a maioria dos motores de impressao repete em TODA
 * pagina — os dois fios verticais da moldura sairiam correndo por baixo do
 * texto em cada folha, e a malha do rodape imprimiria tinta decorativa atras
 * do conteudo em preto e branco. Mesmo `content: none` do breakpoint acima. */
@media print {
  .ed-framed::before,
  .ed-framed footer::before { content: none; }
}

/* Sobre a faixa escura a malha inverte, como na referencia (fio claro sobre
 * fundo quase preto). Hoje `.ed-dark` so aparece em editorial-preview.html;
 * a regra existe para a primitiva ficar completa, nao porque alguma pagina de
 * producao tenha faixa escura. */
.ed-dark { --ed-texture-line: var(--ink-band-hairline); }

/* ---------------------------------------------------------------- steps --- */

.ed-step {
  display: grid;
  grid-template-columns: 44px 1fr auto;
  gap: 18px;
  align-items: center;
  padding-block: 26px;
  border-top: 1px solid var(--ink-band-hairline);
}
.ed-step__icon {
  inline-size: 44px;
  block-size: 44px;
  display: grid;
  place-items: center;
  border-radius: 12px;
  background: var(--ink-band-tile);
  color: var(--ink-band-text);
}
.ed-step__title {
  font-size: var(--fs-card-title);
  font-weight: 600;
  letter-spacing: var(--ls-tight);
  text-wrap: balance;
}
.ed-step__num {
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  letter-spacing: var(--ls-eyebrow);
  color: var(--ink-band-muted);
}
.ed-step__body {
  grid-column: 2 / -1;
  color: var(--ink-band-dim);
  line-height: 1.6;
  margin-top: 8px;
  max-width: 62ch;
}

/* ---------------------------------------------------------------- stats --- */

.ed-stats {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: clamp(24px, 3vw, 48px);
  text-align: center;
}
.ed-stat__circle {
  inline-size: clamp(150px, 15vw, 200px);
  block-size: clamp(150px, 15vw, 200px);
  margin-inline: auto;
  border: 1px solid var(--border);
  border-radius: 50%;
  display: grid;
  place-items: center;
  font-size: clamp(28px, 3vw, 42px);
  font-weight: 600;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
}
.ed-stat__label {
  margin-top: 18px;
  color: var(--dim);
  line-height: 1.55;
  max-width: 34ch;
  margin-inline: auto;
}

/* -------------------------------------------------------------- pricing --- */

.ed-prices {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
  gap: clamp(18px, 2vw, 28px);
  align-items: start;
}
.ed-price {
  position: relative;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 20px;
  padding: clamp(26px, 2.6vw, 38px);
  padding-top: clamp(38px, 3.4vw, 50px);
}
/* The promoted tier is outlined in amber rather than filled — a filled amber
   card would put a lot of saturated brass on screen, which is the exact thing
   DESIGN.md § v4.1 pulled back from. */
.ed-price--featured { border-color: var(--accent-bright); }

.ed-price__badge {
  position: absolute;
  top: 0;
  left: 50%;
  translate: -50% -50%;
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 8px 17px;
  border-radius: 999px;
  background: var(--surface);
  border: 1px solid var(--border);
  font-family: 'Geist Mono', monospace;
  font-size: 11px;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--text);
  white-space: nowrap;
}
.ed-price--featured .ed-price__badge {
  background: var(--accent-bright);
  border-color: var(--accent-bright);
  /* ink on amber — 4.67:1. Never cream/white here. */
  color: var(--on-accent-bright);
}
.ed-price__from {
  font-family: 'Geist Mono', monospace;
  font-size: 11px;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--muted);
}
.ed-price__amount {
  font-size: clamp(34px, 3.4vw, 46px);
  font-weight: 600;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
  margin-top: 6px;
}

/* -------------------------------------------------------------- partners -- */

/* The Meta Business Partner / Google block appears on 21 of 23 pages and is a
   trust asset — restyled to the new language, never removed (#1214 constraint 1). */
.ed-partners {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: clamp(16px, 2.4vw, 36px);
}
.ed-partners .partner-badge {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 11px 18px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
}
.ed-partners .pb-t {
  font-family: 'Geist Mono', monospace;
  font-size: 11.5px;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  color: var(--text);
  white-space: nowrap;
}

/* ------------------------------------------------------------------ misc -- */

.ed-head {
  display: grid;
  grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr);
  gap: clamp(24px, 4vw, 72px);
  align-items: end;
}
@media (max-width: 860px) {
  .ed-head { grid-template-columns: 1fr; align-items: start; }
  .ed-step { grid-template-columns: 40px 1fr auto; }
}

.ed-actions { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 30px; }

/* Cadencia interna da secao editorial (#1214).
 *
 * A pagina de referencia (editorial-preview.html) carregava onze `style=`
 * inline de layout — margin-top de 22/24/26/28/44/50/56/64px, um grid de
 * cards sem classe e tres pills com `width:100%` repetido. Era a unica pagina
 * do repo com layout inline, e é justamente a pagina que o PR manda abrir
 * para julgar o sistema: ela precisa ensinar as classes, nao contorna-las.
 *
 * Os dois degraus abaixo sao os que a propria camada ja usa: 22px entre o
 * eyebrow e o titulo (a cadencia dominante documentada mais abaixo, no bloco
 * `.app-head`/`.fc-head`) e um degrau maior entre o cabecalho da secao e o
 * bloco de conteudo. Escopadas em `.ed-section` para nao mexer no espacamento
 * das LPs, que herdam o seu de componentes legados. */
.ed-section .ed-eyebrow + .ed-head,
.ed-section .ed-eyebrow + .ed-display,
.ed-section .ed-eyebrow + .ed-partners { margin-top: 22px; }

.ed-block { margin-top: clamp(36px, 4vw, 56px); }

.ed-center { text-align: center; }

/* Grid de cards — o mesmo teto/gap de `.ed-prices`, que e o outro grid de
   cards desta camada. */
.ed-cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(290px, 1fr));
  gap: clamp(18px, 2vw, 28px);
  align-items: start;
}

/* Pill que ocupa a largura do card (rodape de plano). O padrao ja existia em
   `@media (max-width: 560px) { .hero-actions .ed-pill { width: 100% } }`;
   aqui ele passa a ser um modificador em vez de tres `style=` repetidos. */
.ed-pill--block { width: 100%; justify-content: center; }
.ed-price .ed-pill { margin-top: 24px; }

@media (prefers-reduced-motion: reduce) {
  .ed-pill,
  .ed-pill__arrow { transition: none; }
  .ed-pill:hover { transform: none; }
}

/* ==========================================================================
   ADOPTION BRIDGE — index.html (#1214)
   ==========================================================================
   styles.css / lp-prod.css / lp-pricing.css carry descendant selectors
   (`.section-head .eyebrow`, `.pain-sec .section-head h2`, `.pl-cta.primary`…)
   that out-specify the flat `.ed-*` classes above. This block re-asserts the
   editorial values at matching specificity ON THE HOST PAGE'S OWN SELECTORS.
   It lives here — never in styles.css — so the change stays additive and the
   other 22 pages are untouched. Nothing below invents a colour: every value is
   a token or is copied verbatim from the primitive it re-asserts.
   ========================================================================== */

/* -- eyebrow --------------------------------------------------------------
   The legacy markup keeps its <span class="eyebrow-dot">; the editorial
   eyebrow's marker is the ::before square, so the dot is hidden rather than
   removed (constraint: delete no markup). */
.section-head .ed-eyebrow,
.demo-eye .ed-eyebrow,
.hero .ed-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  margin-bottom: 4px;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--dim);
}
.section-head .ed-eyebrow::before,
.demo-eye .ed-eyebrow::before,
.hero .ed-eyebrow::before {
  content: '';
  inline-size: 10px;
  block-size: 10px;
  background: var(--accent-bright);
  flex: none;
}
.ed-eyebrow .eyebrow-dot { display: none; }

/* -- display headline ------------------------------------------------------
   Beats `.<sec> .section-head h2` (0,2,1) with an equal-specificity selector;
   this sheet loads last, so the tie resolves here. */
.section-head h2.ed-display,
.hero h1.ed-display,
h2.demo-headline.ed-display {
  font-weight: 600;
  font-size: var(--fs-display);
  line-height: 0.95;
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
  text-wrap: balance;
}
.section-head h2.ed-display--sm,
h2.demo-headline.ed-display--sm {
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
}

/* The section heads are centred, so the lede's measure has to centre with it. */
.section-head p.ed-lede,
p.demo-subhead.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin-inline: auto;
}

/* -- pills -----------------------------------------------------------------
   `.hero-actions .btn-cta`, `.final-in .btn-cta` and `.pl-cta.primary` all
   out-specify `.ed-pill--primary`. Re-asserted here, and the amber fill now
   pairs with --btn-text instead of the hardcoded #fff the pricing CTA and the
   plan badge used (white on amber is 3.07:1 — below AA). */
.hero-actions .ed-pill,
.final-in .ed-pill,
button.pl-cta.ed-pill {
  padding: 15px 26px;
  border-radius: 999px;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  border: 1px solid transparent;
  box-shadow: none;
  justify-content: center;
}
.hero-actions .ed-pill--primary,
.final-in .ed-pill--primary,
button.pl-cta.ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: var(--accent);
}
.hero-actions .ed-pill--primary:hover,
.final-in .ed-pill--primary:hover,
button.pl-cta.ed-pill--primary:hover {
  background: var(--accent-deep);
  opacity: 1;
}
.hero-actions .ed-pill--ghost,
button.pl-cta.ed-pill--ghost {
  background: transparent;
  color: var(--text);
  border-color: var(--border2);
}
.hero-actions .ed-pill--ghost:hover,
button.pl-cta.ed-pill--ghost:hover {
  border-color: var(--accent-bright);
  color: var(--text);
}
/* The hero/final CTAs keep their full-bleed behaviour on narrow viewports. */
.final-in .ed-pill { width: 100%; }
@media (max-width: 560px) {
  .hero-actions .ed-pill { width: 100%; }
}

/* -- pricing ---------------------------------------------------------------
   auto-fit at 240px still lands four columns inside the 1200px shell, so the
   promoted tier keeps its place in the row instead of wrapping 3 + 1. */
.pricing-grid.ed-prices {
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: clamp(18px, 2vw, 28px);
  align-items: stretch;
}
/* `.pl-badge-top` centres with transform, `.ed-price__badge` with `translate`.
   Both would apply and double the offset — the legacy transform is dropped. */
.pl-badge-top.ed-price__badge {
  top: 0;
  transform: none;
  translate: -50% -50%;
  padding: 8px 17px;
  font-size: 11px;
  letter-spacing: var(--ls-caps);
}
.pl-card.ed-price { padding-top: clamp(38px, 3.4vw, 50px); }
/* ink on amber — 4.67:1. Replaces `.pl-badge-top`'s #fff on amber. */
.pl-card.ed-price--featured .ed-price__badge {
  background: var(--accent-bright);
  border-color: var(--accent-bright);
  color: var(--on-accent-bright);
}
.pl-badge-top.alt.ed-price__badge {
  background: var(--surface);
  border: 1px solid var(--border);
  color: var(--text);
}

/* -- numbered steps --------------------------------------------------------
   `.ed-step` is written for the dark band; `--light` restates it in tokens so
   the same primitive reads correctly on the light canvas (and in dark theme,
   where the tokens invert on their own). */
.cust-grid { grid-template-columns: 1fr; max-width: 940px; }
.cust-card.ed-step {
  display: grid;
  grid-template-columns: 44px 1fr;
  gap: 12px 18px;
  align-items: center;
  padding: 26px 24px;
}
.ed-step--light { border-top-color: var(--border); }
.ed-step--light .ed-step__title { color: var(--text-strong); }
.ed-step--light .ed-step__body { color: var(--dim); }
.cust-num.ed-step__num {
  grid-row: 1;
  width: 44px;
  height: 44px;
  border-radius: 12px;
  border: 1px solid var(--border2);
  background: transparent;
  color: var(--accent-text, var(--accent-bright));
  font-family: 'Geist Mono', monospace;
  font-weight: 600;
  font-size: 12px;
  letter-spacing: var(--ls-eyebrow);
  margin-bottom: 0;
}
.cust-title.ed-step__title {
  margin-bottom: 0;
  font-size: var(--fs-card-title);
  letter-spacing: var(--ls-tight);
}
.cust-desc.ed-step__body {
  grid-column: 2 / -1;
  font-size: 15px;
  margin-top: 0;
  flex: none;
}
@media (max-width: 480px) {
  .cust-card.ed-step { grid-template-columns: 40px 1fr; gap: 10px 14px; padding: 22px 18px; }
  .cust-desc.ed-step__body { grid-column: 1 / -1; }
}

/* -- partners --------------------------------------------------------------
   Restyled, never removed (constraint 1). The badge keeps its logos. */
.partners.ed-partners .partner-badge,
.foot-partners.ed-partners .partner-badge { padding: 11px 18px; border-radius: 999px; }
.partners.ed-partners .partner-badge .pb-t,
.foot-partners.ed-partners .partner-badge .pb-t {
  font-family: 'Geist Mono', monospace;
  font-size: 11.5px;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  color: var(--text);
}
.foot-partners.ed-partners { justify-content: flex-start; gap: 12px; }

/* -- rules -----------------------------------------------------------------
   The hairlines replace boxed separation between bands. */
hr.ed-rule { width: 100%; }

/* ==========================================================================
   Shared final-band typography (dor/planos + misc/legal groups)
   styles.css reaches these through `.final-in h2` / `.final-in p` (0,1,1),
   so the flat `.ed-*` class loses; restated once at matching weight.
   ========================================================================== */
.cta-strip-in h2.ed-display--sm,
.final-in h2.ed-display--sm {
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
  text-wrap: balance;
}
.cta-strip-in h2 .ed-display__accent { color: var(--accent-text, var(--accent-bright)); }
.final-in h2 .ed-display__accent { color: var(--accent-text, var(--accent-bright)); }
.cta-strip-in p.ed-lede,
.final-in p.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 620px;
  margin: 0 auto 48px;
}

/* ADOPTION BRIDGE — segment LPs (agro, autonomo, educacao, financeiro, outros, saude, varejo, vendedor) — #1214 */

/* ==========================================================================
   Same contract as lp-editorial.css lines 388-611: re-assert the editorial
   values on the HOST PAGE'S OWN selectors, at matching specificity, in an
   additive sheet that loads last. No !important, no invented colour — every
   value below is a token or is copied verbatim from the primitive it
   re-asserts. Only these eight pages link this file.
   ========================================================================== */

/* -- eyebrow ---------------------------------------------------------------
   These pages carry the dor hero, whose `.eyebrow` gets extra padding from
   lp-dor.css (0,1,0). `.hero .ed-eyebrow` (0,2,0) in lp-editorial.css already
   beats it; the segment-specific piece is the `.hero-eye` variant, which also
   picks up `.hero-dor .hero-eye`. */
.hero-dor .hero-eye.ed-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--dim);
}
.hero-dor .hero-eye.ed-eyebrow::before {
  content: '';
  inline-size: 10px;
  block-size: 10px;
  background: var(--accent-bright);
  flex: none;
}

/* -- hero display ----------------------------------------------------------
   `.hero-dor h1` (0,1,1) out-specifies `.ed-display`. Beaten here with an
   equal-specificity selector that loads later. The dor headline's second line
   keeps `.punch` (--warn) rather than becoming amber: on these pages the
   accent line IS the pain statement, and lp-dor.css already colours it. */
.hero-dor h1.ed-display {
  font-weight: 600;
  font-size: var(--fs-display);
  line-height: 0.95;
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
  text-wrap: balance;
}
@media (max-width: 560px) {
  .hero-dor h1.ed-display { font-size: var(--fs-display-mob); }
}
/* The dor hero is centred, so its lede has to centre with it. `.hero-dor
   .hero-sub` (0,2,0) also sets the measure — re-asserted at equal weight. */
.hero-dor .hero-sub.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin: 0 auto 36px;
}

/* -- pills -----------------------------------------------------------------
   Both forms on these pages sit in `.hero-form-w`, so `.hero-form-w .btn-cta`
   (0,2,0) out-specifies `.ed-pill`, including the glow box-shadow. The final
   CTA is covered by lp-editorial.css's `.final-in .ed-pill`; this adds the
   hero/inline form. --btn-text is what pairs safely with --accent (cream on
   navy / ink on amber), so AA is inherited — never #fff on amber (3.07:1). */
.hero-form-w .ed-pill {
  padding: 15px 26px;
  border-radius: 999px;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  border: 1px solid transparent;
  box-shadow: none;
  justify-content: center;
  width: 100%;
}
.hero-form-w .ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: var(--accent);
}
.hero-form-w .ed-pill--primary:hover {
  background: var(--accent-deep);
  box-shadow: none;
  filter: none;
  transform: translateY(-1px);
}
/* The final form lives inside `.final-in .hero-form-w`, so both rules apply;
   the glow on the shared `.final-in .btn-cta:hover` is cleared too. */
.final-in .ed-pill:hover { box-shadow: none; filter: none; }

/* -- numbered steps --------------------------------------------------------
   `.ed-step--light` and `.cust-card.ed-step` already come from lp-editorial's
   bridge. The only thing missing here is the column count: styles.css pins
   `#como-funciona .cust-grid` to three columns at ≥720px with id specificity
   (1,1,0), which no flat selector can beat. Restated at equal weight so the
   three steps read as the editorial list they do on index.html. */
#como-funciona .cust-grid {
  max-width: 940px;
  grid-template-columns: 1fr;
}
@media (min-width: 720px) {
  #como-funciona .cust-grid { grid-template-columns: 1fr; }
}
/* The step rows are hairline-separated, so the legacy card chrome and its
   hover lift would double the boxing the rules replace. */
.cust-card.ed-step {
  background: transparent;
  border-left: 0;
  border-right: 0;
  border-bottom: 0;
  border-radius: 0;
}
.cust-card.ed-step:hover {
  background: transparent;
  transform: none;
  border-color: var(--border);
}
.cust-card.ed-step:hover .cust-num.ed-step__num {
  border-color: var(--accent-border);
  background: transparent;
  color: var(--accent-text, var(--accent-bright));
}

/* -- rules -----------------------------------------------------------------
   The hairlines replace boxed separation between bands, so the band that
   follows one must not draw its own border on top of it. */
hr.ed-rule + .partners-sec,
hr.ed-rule + .final-sec,
hr.ed-rule + .segx-sec { border-top: 0; }

/* Adoption bridge — dor group: atendimento / chatgpt / gestao / vender / whatsapp (#1214) */

/* ==========================================================================
   These five pages load styles.css + lp-prod.css + lp-dor.css (+ lp-dashboard
   on gestao, lp-whatsapp on vender/whatsapp). Those sheets carry descendant
   selectors that out-specify the flat `.ed-*` primitives, exactly as the
   index.html bridge (lp-editorial.css lines 388-611) documents. Everything
   below re-asserts an editorial value at MATCHING specificity on the host
   page's own selector. No new colour is invented: every value is a token or a
   verbatim copy of the primitive it re-asserts. Nothing here uses !important.
   ========================================================================== */

/* -- hero eyebrow ----------------------------------------------------------
   `.hero-eye` (styles.css) renders a bordered pill and the WhatsApp pages add
   `.wa-eye .eyebrow-dot`. The editorial eyebrow's marker is the ::before
   square, so the legacy dot is hidden rather than deleted. */
.hero .hero-eye.ed-eyebrow {
  margin-bottom: 24px;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--dim);
}
@media (max-width: 560px) {
  .hero .hero-eye.ed-eyebrow { font-size: 10.5px; letter-spacing: var(--ls-eyebrow); margin-bottom: 18px; }
  /* Os heros secundarios (carreiras/obrigado) seguem o mesmo degrau: o gap
     sobrancelha->display cai de 24 para 18 no mobile. */
  .careers-hero h1.ed-display--sm { margin-top: 18px; }
  .ty-hero .ty-eye.ed-eyebrow { margin-bottom: 18px; }
  /* As paginas legais usam a mesma escada sobrancelha->display. */
  .wrap .eyebrow.ed-eyebrow { margin-bottom: 18px; }
}

/* -- hero display ----------------------------------------------------------
   `.hero-dor h1` and `.wa-hero h1` are (0,2,1); an equal-specificity selector
   in a later sheet wins the tie. `.punch` is deliberately NOT re-coloured:
   lp-dor.css paints it `--warn` because it is the pain line, not the accent. */
.hero-dor h1.ed-display,
.wa-hero h1.ed-display,
.hero .hero-left h1.ed-display {
  font-weight: 600;
  font-size: var(--fs-display);
  line-height: 0.95;
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
  text-wrap: balance;
  margin-bottom: 24px;
}
@media (max-width: 560px) {
  .hero-dor h1.ed-display,
  .wa-hero h1.ed-display,
  .hero .hero-left h1.ed-display { font-size: var(--fs-display-mob); }
}

/* `.hero-dor .hero-sub` / `.wa-hero .hero-sub` are (0,2,0); these keep the
   centred measure those sheets set, at the editorial size. */
.hero-dor .hero-sub.ed-lede,
.wa-hero .hero-sub.ed-lede,
.hero .hero-left .hero-sub.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 620px;
  margin: 0 auto 36px;
}
@media (min-width: 1000px) {
  .hero-dor .hero-sub.ed-lede,
  .wa-hero .hero-sub.ed-lede { margin: 0 auto 36px; }
}

/* -- section heads ---------------------------------------------------------
   lp-editorial's bridge already covers `.section-head h2.ed-display--sm` and
   `.section-head p.ed-lede`. What it does not cover are the section wrappers
   these five pages use that are absent from index.html — same (0,2,1) shape,
   restated so the tie is not lost to a later-declared page sheet. */
.vs-sec .section-head h2.ed-display--sm,
.uses-sec .section-head h2.ed-display--sm,
.trust-sec .section-head h2.ed-display--sm,
.dash-sec .section-head h2.ed-display--sm,
.wa-how .section-head h2.ed-display--sm,
.wa-feat-sec .section-head h2.ed-display--sm,
.wa-vs-sec .section-head h2.ed-display--sm {
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
  text-wrap: balance;
}
@media (max-width: 560px) {
  .vs-sec .section-head h2.ed-display--sm,
  .uses-sec .section-head h2.ed-display--sm,
  .trust-sec .section-head h2.ed-display--sm,
  .dash-sec .section-head h2.ed-display--sm,
  .wa-how .section-head h2.ed-display--sm,
  .wa-feat-sec .section-head h2.ed-display--sm,
  .wa-vs-sec .section-head h2.ed-display--sm { font-size: var(--fs-h2-mob); }
}

/* -- closing band ----------------------------------------------------------
   `.final-in h2` / `.final-in p` (styles.css:1200-1201) out-specify the flat
   primitives. Matched here, so the closing headline reads like every other
   editorial display instead of the old 80px/-3.2px setting. */
.final-in h2.ed-display {
  font-weight: 600;
  font-size: var(--fs-display);
  line-height: 0.95;
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
  text-wrap: balance;
  margin-bottom: 24px;
}
@media (max-width: 560px) {
  .final-in h2.ed-display--sm,
  .cta-strip h2.ed-display--sm { font-size: var(--fs-h2-mob); }
  .cta-strip-in p.ed-lede { margin-bottom: 36px; }
  .final-in p.ed-lede { margin-bottom: 36px; }
}

/* -- form CTAs -------------------------------------------------------------
   Every CTA on these pages is the form submit inside `.hero-form-w` or
   `.final-in` (lp-prod.css:86-97, (0,2,0)). The pill fill is `--accent` paired
   with `--btn-text` — the token that is already AA against it in both themes.
   Never #fff on amber (3.07:1). The legacy amber drop-shadow is dropped
   because the flat pill is the point of the direction. */
.hero-form-w .ed-pill,
.final-in .ed-pill,
.cta-strip .ed-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  width: 100%;
  padding: 16px 26px;
  border-radius: 999px;
  border: 1px solid transparent;
  box-shadow: none;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  white-space: normal;
  transition: transform var(--dur-fast) var(--ease-out), background-color var(--dur-fast) var(--ease-out);
}
.hero-form-w .ed-pill--primary,
.final-in .ed-pill--primary,
.cta-strip .ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: var(--accent);
}
.hero-form-w .ed-pill--primary:hover,
.final-in .ed-pill--primary:hover,
.cta-strip .ed-pill--primary:hover {
  background: var(--accent-deep);
  box-shadow: none;
  filter: none;
  transform: translateY(-1px);
  opacity: 1;
}
.hero-form-w .ed-pill::after,
.final-in .ed-pill::after,
.cta-strip .ed-pill::after { content: none; }
@media (max-width: 560px) {
  .hero-form-w .ed-pill,
  .final-in .ed-pill { font-size: 11.5px; padding: 15px 18px; letter-spacing: var(--ls-caps); }
}


/* -- partners --------------------------------------------------------------
   Restyled, never removed (#1214 constraint 1). Four badges per page survive:
   two in the "Reconhecido por" band, two in the footer. */
.partners.ed-partners .partner-badge,
.foot-partners.ed-partners .partner-badge {
  padding: 11px 18px;
  border-radius: 999px;
  border: 1px solid var(--border);
  background: var(--surface);
}
.partners.ed-partners .partner-badge .pb-t,
.foot-partners.ed-partners .partner-badge .pb-t {
  font-family: 'Geist Mono', monospace;
  font-size: 11.5px;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  color: var(--text);
}
.foot-partners.ed-partners { justify-content: flex-start; gap: 12px; }
/* #1214 - o rodape da carreiras da a este badge uma coluna de 210px, e
 * "META BUSINESS PARTNER" em 11.5px monospace com o tracking de caixa-alta
 * mede 236px: o texto vazava a pilula. A coluna nao pode crescer (a proxima
 * comeca 16px adiante), entao o badge encolhe. Constraint 1 do #1214: o badge
 * fica, so muda de tamanho. */
.foot-partners.ed-partners .partner-badge { padding: 10px 12px; gap: 8px; max-width: 100%; }
.foot-partners.ed-partners .partner-badge .pb-t { font-size: 10px; }
@media (max-width: 425px) {
  .partners.ed-partners { gap: 12px; }
  .partners.ed-partners .partner-badge { padding: 9px 14px; }
  .partners.ed-partners .partner-badge .pb-t { font-size: 10.5px; letter-spacing: var(--ls-wide); }
}

/* -- rules -----------------------------------------------------------------
   Hairlines replace boxed separation between the hero / partners / closing
   bands. `.partners-sec` and `.final-sec` keep their own padding. */

/* ADOPTION BRIDGE — calc.html / demo.html / dor.html / vip.html (#1214) */

/* ==========================================================================
   Same job as lp-editorial.css lines 388-611, for the four interactive LPs.
   These pages carry their own per-page sheets (lp-calc / lp-demo / lp-dor /
   lp-vip) plus lp-extras / lp-prod, whose descendant selectors out-specify the
   flat `.ed-*` primitives. Everything below re-asserts an editorial value on
   the host page's OWN selector at matching-or-higher specificity. No new
   colour: every value is a token or is copied verbatim from lp-editorial.css.
   Additive — nothing here is loaded by the other 19 LPs.
   ========================================================================== */

/* -- eyebrows -------------------------------------------------------------
   lp-editorial's bridge covers `.section-head` / `.hero` / `.demo-eye`. These
   pages carry four more heading containers, plus vip's `.invite-tag`, which is
   a pill rather than an eyebrow and so needs the whole primitive restated. */
.prod-mini-head .ed-eyebrow,
.fc-head .ed-eyebrow,
.mini-calc-head .ed-eyebrow,
.app-head .ed-eyebrow,
.micro-conv-in .ed-eyebrow,
.hero-left .invite-tag.ed-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--dim);
}
.prod-mini-head .ed-eyebrow::before,
.fc-head .ed-eyebrow::before,
.mini-calc-head .ed-eyebrow::before,
.app-head .ed-eyebrow::before,
.micro-conv-in .ed-eyebrow::before,
.hero-left .invite-tag.ed-eyebrow::before {
  content: '';
  inline-size: 10px;
  block-size: 10px;
  border-radius: 0;
  background: var(--accent-bright);
  flex: none;
  animation: none;
}
.hero-left .invite-tag.ed-eyebrow { margin-bottom: 24px; }

/* -- display headings -----------------------------------------------------
   `.fc-head h3` (0,1,1), `.final-in h2` (0,1,1) and friends all out-specify
   `.ed-display`; the extra class token settles it. `.mini-calc-head h2` and
   `.app-head h2` keep their own inline `margin-top`, which is layout. */
.prod-mini-head h2.ed-display,
.fc-head h2.ed-display,
.micro-conv-in h2.ed-display,
.conn-strip-head h2.ed-display,
.gov-in h2.ed-display,
.mini-calc-head h2.ed-display,
.app-head h2.ed-display,
.final-in h2.ed-display {
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
  text-wrap: balance;
}
@media (max-width: 560px) {
  .prod-mini-head h2.ed-display,
  .fc-head h2.ed-display,
  .micro-conv-in h2.ed-display,
  .conn-strip-head h2.ed-display,
  .gov-in h2.ed-display,
  .mini-calc-head h2.ed-display,
  .app-head h2.ed-display,
  .final-in h2.ed-display { font-size: var(--fs-h2-mob); }
}

/* -- respiro do titulo de secao --------------------------------------------
   #1214: a mesma construcao (titulo pequeno de display sobre a prosa) rodava
   com tres margens diferentes conforme o bloco - 14px em .prod-mini-head,
   .fc-head, .mini-calc-head, .app-head e .gov-in, 10px em .micro-conv-in e
   .conn-strip-head. O valor dominante do site e o de `.section-head h2`,
   18px sobre 48px (0.38em). A banda de fecho (.final-in) fica de fora: e o
   seu proprio patamar, consistente nas 9 paginas. */
.prod-mini-head h2.ed-display,
.fc-head h2.ed-display,
.micro-conv-in h2.ed-display,
.conn-strip-head h2.ed-display,
.gov-in h2.ed-display,
.mini-calc-head h2.ed-display,
.app-head h2.ed-display { margin-bottom: 18px; }

/* -- respiro do sobretitulo ------------------------------------------------
   #1214: o par `.ed-eyebrow` + titulo tem uma cadencia dominante de 22px de
   espaco visual (4px de margem no sobretitulo + 18px no titulo), em 48
   ocorrencias de `.section-head`. Os mesmos blocos que corriam com margens
   proprias no titulo corriam tambem aqui: 3px em .prod-mini-head, 16px em
   .micro-conv-in, 18px em .fc-head, 21px em .app-head. O hero fica de fora
   (24px, patamar proprio nas 9 paginas). */
.prod-mini-head .ed-eyebrow,
.fc-head .ed-eyebrow,
.micro-conv-in .ed-eyebrow,
.conn-strip-head .ed-eyebrow,
.gov-in .ed-eyebrow,
.mini-calc-head .ed-eyebrow,
.app-head .ed-eyebrow { margin-bottom: 4px; }
.prod-mini-head .ed-eyebrow + h3.ed-display,
.fc-head .ed-eyebrow + h3.ed-display,
.micro-conv-in .ed-eyebrow + h3.ed-display,
.conn-strip-head .ed-eyebrow + h3.ed-display,
.gov-in .ed-eyebrow + h3.ed-display,
.mini-calc-head .ed-eyebrow + h2.ed-display,
.app-head .ed-eyebrow + h2.ed-display { margin-top: 18px; }

.prod-mini-head p.ed-lede,
.fc-head p.ed-lede,
.micro-conv-in p.ed-lede,
.conn-strip-head p.ed-lede,
.gov-in p.ed-lede,
.mini-calc-head p.ed-lede,
.app-head p.ed-lede,
.final-in p.ed-lede,
.section-head p.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin-inline: auto;
}
/* The hero lede is left-aligned in a single-column hero, so it must not centre. */
.hero-left p.hero-sub.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin-inline: 0;
}

/* -- pills ----------------------------------------------------------------
   `.hero-form-w .btn-cta` / `.micro-conv-form .btn-cta` / `.calc-gate-form
   .btn-cta` / `.mini-calc-result .mc-cta-btn` are all (0,2,0). A tag +
   two-class selector (0,2,1) wins without !important. --btn-text is the token
   that already pairs safely with --accent (never #fff on amber: 3.07:1). */
button.btn-cta.ed-pill,
a.mc-cta-btn.ed-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 15px 26px;
  border-radius: 999px;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  text-decoration: none;
  border: 1px solid transparent;
  box-shadow: none;
  background-image: none;
}
button.btn-cta.ed-pill--primary,
a.mc-cta-btn.ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: var(--accent);
}
button.btn-cta.ed-pill--primary:hover,
a.mc-cta-btn.ed-pill--primary:hover {
  background: var(--accent-deep);
  opacity: 1;
}
/* The gloss sweep belonged to the old gradient button; a flat pill has none. */
button.btn-cta.ed-pill::after { content: none; }
/* Form submits stay full-bleed — they are the width of the field above them. */
.form-stack button.btn-cta.ed-pill,
.micro-conv-form button.btn-cta.ed-pill,
.calc-gate-form button.btn-cta.ed-pill { width: 100%; }

/* -- numbered / step content ---------------------------------------------
   `.step-card`, `.why-card` and `.bk-card` are boxed cards; the editorial
   language separates them with a hairline instead. The grids are left alone so
   nothing reflows below 425px and no node a script indexes into moves. */
.step-card.ed-step,
.why-card.ed-step,
.bk-card.ed-step {
  display: block;
  background: transparent;
  border: 0;
  border-top: 1px solid var(--border);
  border-radius: 0;
  padding: 26px 0 0;
}
.step-card.ed-step:hover,
.why-card.ed-step:hover,
.bk-card.ed-step:hover {
  border-top-color: var(--accent-bright);
  transform: none;
}
.step-card .num.ed-step__num,
.why-num.ed-step__num,
.bk-num.ed-step__num {
  display: block;
  position: static;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: var(--ls-eyebrow);
  color: var(--accent-text, var(--accent-bright));
  margin-bottom: 12px;
}
.step-card .title.ed-step__title,
.why-title.ed-step__title,
.bk-title.ed-step__title {
  font-size: var(--fs-card-title);
  font-weight: 600;
  letter-spacing: var(--ls-tight);
  line-height: 1.2;
  color: var(--text-strong);
  margin-bottom: 8px;
}
.step-card .desc.ed-step__body,
.why-desc.ed-step__body,
.bk-desc.ed-step__body {
  font-size: 15px;
  color: var(--dim);
  line-height: 1.6;
  max-width: 62ch;
}

/* -- numeral de referencia (#1214, 7a passada) ----------------------------
   Na referencia o numeral nao e uma sobrancelha acima do titulo: e o filho
   direito de uma linha `space-between` cujo filho esquerdo e o titulo do
   passo — 18px Geist Mono 500, tracking negativo, na cor de apoio, com o fio
   de 1px separando um passo do outro (o fio ja e o `border-top` acima).
   Posto acima do titulo e em cor de destaque, o numeral compete com ele;
   posto a direita e em cor de apoio, ele numera.

   `.why-card` is the clean two-part pair (numeral + title, nothing between
   them). `.step-card` has a `.when` label sitting between the numeral and
   the title in markup order (numeral, when, title, desc) — a three-part
   row the reference site has no direct example of (its own numbered steps
   pair numeral+title with no secondary label). Extending the same
   language rather than inventing new visual vocabulary: the numeral still
   pins to the far right on the title's row; `.when` moves into its own row
   above the title, in normal left flow, so nothing between numeral and
   title competes with either. `.bk-num` carries composite text ("01 ·
   0.4s") so it keeps the shared block rule unchanged. */
.why-card.ed-step {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 16px;
  row-gap: 8px;
  align-items: baseline;
}
.why-card.ed-step .why-num.ed-step__num {
  grid-column: 2;
  grid-row: 1;
  font-size: var(--fs-step-num);
  font-weight: 500;
  letter-spacing: var(--ls-step-num);
  color: var(--dim);
  margin-bottom: 0;
}
.why-card.ed-step .why-title.ed-step__title {
  grid-column: 1;
  grid-row: 1;
  margin-bottom: 0;
}
.why-card.ed-step .why-desc.ed-step__body {
  grid-column: 1 / -1;
  grid-row: 2;
}

.step-card.ed-step {
  display: grid;
  grid-template-columns: minmax(0, 1fr) auto;
  column-gap: 16px;
  row-gap: 4px;
  align-items: baseline;
}
.step-card .when {
  grid-column: 1;
  grid-row: 1;
}
.step-card .num.ed-step__num {
  grid-column: 2;
  grid-row: 2;
  font-size: var(--fs-step-num);
  font-weight: 500;
  letter-spacing: var(--ls-step-num);
  color: var(--dim);
  margin-bottom: 0;
}
.step-card .title.ed-step__title {
  grid-column: 1;
  grid-row: 2;
  margin-bottom: 0;
}
.step-card .desc.ed-step__body {
  grid-column: 1 / -1;
  grid-row: 3;
}

/* -- rules ----------------------------------------------------------------
   The hairlines replace boxed separation between bands. */

/* .bridge-misc.css — adoption bridge for assinaturas / carreiras / obrigado / privacidade / termos (#1214) */

/* Loaded LAST, after lp-editorial.css. Every rule here re-asserts an editorial
   value at a specificity that matches the host page's own selector, or supplies
   a primitive the editorial layer has no host equivalent for. No colour is
   invented: every value is a token or is copied verbatim from lp-editorial.css.
   No importance overrides are used anywhere in this file. */

/* ==========================================================================
   assinaturas.html — planos hero + pricing
   ========================================================================== */

/* lp-planos.css `.planos-hero h1` (0,1,1) and `.planos-hero h1 .hl` (0,2,1)
   out-specify the flat `.ed-display` / `.ed-display__accent`. */
.planos-hero h1.ed-display {
  font-weight: 600;
  font-size: var(--fs-display);
  line-height: 0.95;
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
  text-wrap: balance;
}
.planos-hero h1 .ed-display__accent { color: var(--accent-text, var(--accent-bright)); }

.planos-hero .planos-hero-sub.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin-inline: auto;
}

/* `.planos-hero .hero-actions .btn-cta` (0,3,0) and `.planos-hero a.btn-hero-ghost`
   (0,2,1) beat `.ed-pill*`. Matched here at (0,3,0) / (0,3,1). */
.planos-hero .hero-actions .ed-pill {
  padding: 15px 26px;
  border-radius: 999px;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  border: 1px solid transparent;
  box-shadow: none;
  justify-content: center;
}
.planos-hero .hero-actions .ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: var(--accent);
}
.planos-hero .hero-actions .ed-pill--primary:hover {
  background: var(--accent-deep);
  opacity: 1;
}
.planos-hero .hero-actions a.ed-pill--ghost {
  background: transparent;
  color: var(--text);
  border-color: var(--border2);
}
.planos-hero .hero-actions a.ed-pill--ghost:hover {
  border-color: var(--accent-bright);
  color: var(--text);
}


/* ==========================================================================
   carreiras.html — the hero/final live in the page's own inline <style>,
   which loads BEFORE this sheet; only the two-selector rules need matching.
   ========================================================================== */

.careers-hero h1.ed-display--sm,
.careers-final h2.ed-display--sm {
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
  text-wrap: balance;
}
.careers-hero h1 .ed-display__accent,
.careers-final h2 .ed-display__accent { color: var(--accent-text, var(--accent-bright)); }

.careers-hero p.ed-lede,
.careers-final p.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin-inline: auto;
}

/* `.careers-hero .btn-cta` / `.careers-final .btn-cta` force display:inline-block
   at (0,2,0); the pill's own inline-flex is restored at matching specificity so
   the mono label centres against the padding. */
.careers-hero .ed-pill,
.careers-final .ed-pill,
.job-body .ed-pill {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: auto;
  padding: 15px 26px;
  border-radius: 999px;
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  border: 1px solid transparent;
  box-shadow: none;
}
.careers-hero .ed-pill--primary,
.careers-final .ed-pill--primary,
.job-body .ed-pill--primary {
  background: var(--accent);
  color: var(--btn-text);
  border-color: var(--accent);
}
.careers-hero .ed-pill--primary:hover,
.careers-final .ed-pill--primary:hover,
.job-body .ed-pill--primary:hover {
  background: var(--accent-deep);
  opacity: 1;
}

/* The careers eyebrow sits in a bare header/section-head, so it needs the same
   "strip the legacy pill chrome" treatment the index adoption gives it. */
.careers-hero .ed-eyebrow,
.careers-sec .ed-eyebrow,
.ty-hero .ed-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  font-family: 'Geist Mono', monospace;
  font-size: 12px;
  font-weight: 500;
  letter-spacing:var(--ls-eyebrow);
  text-transform: uppercase;
  color: var(--dim);
}
.careers-hero .ed-eyebrow::before,
.careers-sec .ed-eyebrow::before,
.ty-hero .ed-eyebrow::before {
  content: '';
  inline-size: 10px;
  block-size: 10px;
  border-radius: 0;
  background: var(--accent-bright);
  flex: none;
}

/* ==========================================================================
   obrigado.html — thank-you hero + share row
   ========================================================================== */

.ty-hero h1.ed-display--sm,
.ty-share h2.ed-display--sm {
  font-weight: 600;
  font-size: var(--fs-h2);
  line-height: 1.08;
  letter-spacing: var(--ls-display-sm);
  color: var(--text-strong);
  text-wrap: balance;
}
.ty-hero h1 .ed-display__accent { color: var(--accent-text, var(--accent-bright)); }
.ty-hero p.ed-lede,
.ty-share p.ed-lede {
  font-size: var(--fs-lead);
  line-height: 1.6;
  color: var(--dim);
  max-width: 58ch;
  margin-inline: auto;
}
/* The share buttons carry an icon, so they keep their gap and stay ghost pills. */
.ty-share .ed-pill--ghost {
  border-radius: 999px;
  padding: 13px 20px;
  font-family: 'Geist Mono', monospace;
  font-size: 11.5px;
  letter-spacing:var(--ls-caps);
  text-transform: uppercase;
  background: transparent;
  color: var(--text);
  border: 1px solid var(--border2);
}
.ty-share .ed-pill--ghost:hover { border-color: var(--accent-bright); color: var(--text); }

/* ==========================================================================
   privacidade.html / termos.html — self-contained legal pages
   ==========================================================================
   These two carry their own inline <style> (tokens + full page design) that
   loads AFTER every link, so it wins every same-specificity tie. styles.css was
   added only to supply the tokens the editorial layer needs and the inline
   block does not declare (--text-strong, --accent-deep, --ease-out, --border2).
   The two rules below undo the only places where a styles.css *tag* selector
   reaches markup the inline block does not fully restate. */

/* styles.css `nav { position:fixed; height:60px; left/right:0 }` would seize the
   legal pages' sticky bar; `.nav-top` restates position/top but not the rest. */
nav.nav-top {
  position: sticky;
  height: auto;
  left: auto;
  right: auto;
}
/* styles.css `footer { background: var(--surface) }` — the legal footer is a
   hairline over the page canvas, which is what the inline rule describes.
   Scoped through `nav.nav-top ~` — the sibling selector is the only thing that
   is true on the legal pages and false on the other three, which share the
   site footer and must keep its surface fill. */
nav.nav-top ~ footer {
  background: transparent;
  padding: 32px;
}

/* The inline `.eyebrow` (0,1,0) pill chrome loads after lp-editorial.css, so the
   editorial eyebrow is re-asserted one level deeper. */
.wrap .ed-eyebrow {
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  font-size: 12px;
  letter-spacing: var(--ls-eyebrow);
  color: var(--dim);
}
.wrap .ed-eyebrow::before {
  inline-size: 10px;
  block-size: 10px;
  border-radius: 0;
  background: var(--accent-bright);
}
/* `.wrap h1` is a bare tag rule inline, so `.ed-display--sm` already wins; the
   colour token is pinned here because the legal pages declare no --text-strong
   of their own and inherit styles.css's, which is correct for both themes. */
.wrap h1.ed-display--sm { color: var(--text-strong); }

/* ==========================================================================
   shared
   ========================================================================== */


/* ==========================================================================
   Flatten the legacy gloss CTAs (#1214)

   Two CTA treatments predate the editorial layer and read as "gloss" next to
   it: `.btn-cta` (a white diagonal sweep on ::after) and `.btn-glow` (an
   animated 5-stop linear gradient plus a mouse-tracking radial spotlight).
   The editorial direction is a flat pill, so both are restated here as one.

   Specificity notes: `.pl-cta.btn-glow` (0,2,0) is repeated because
   lp-pricing.css itself repeats it to outrank `.pl-cta.primary`; this sheet
   loads last, so an equal-weight selector wins. The `--glow` / `--mx` / `--my`
   custom properties that lp-pricing.js writes are left alone — nothing reads
   them any more, so the script stays harmless rather than needing an edit.
   The animation is dropped outright, which also makes the
   prefers-reduced-motion carve-out in lp-pricing.css moot.
   ========================================================================== */
.btn-glow,
.pl-cta.btn-glow,
.btn-cta {
  background-image: none;
  background-color: var(--accent);
  color: var(--btn-text);
  border: 1px solid var(--accent);
  border-radius: 999px;
  font-weight: 600;
  letter-spacing: var(--ls-tight);
  animation: none;
  box-shadow: none;
  transition:
    background-color var(--dur-fast) var(--ease-out),
    border-color var(--dur-fast) var(--ease-out),
    transform var(--dur-fast) var(--ease-out);
}

.btn-glow:hover,
.pl-cta.btn-glow:hover,
.btn-cta:hover {
  background-image: none;
  background-color: var(--accent-bright);
  border-color: var(--accent-bright);
  color: var(--btn-text);
  opacity: 1;
  transform: translateY(-1px);
  box-shadow: none;
}

/* The diagonal sheen sweep on .btn-cta. */
.btn-cta::after,
.btn-cta:hover::after {
  content: none;
}

/* ==========================================================================
   Contrast repair (#1214 constraint 5)

   The browser audit turned up two systematic AA failures, both from one root
   cause: `--accent-bright` is amber in BOTH themes, but `--btn-text` flips
   (cream in light, navy in dark) because it was tuned against `--accent`,
   which is navy in light and amber in dark. So every amber-BACKGROUND chip
   inherited cream text in light mode — 3.06:1. And amber used as TEXT on the
   bone/cream surfaces reads 2.24–2.91:1 whichever theme you are in, because
   the light surfaces are warm.

   Two tokens fix the whole class rather than patching selectors one by one:

   - `--on-accent-bright` — the foreground for an amber FILL. Navy in both
     themes (5.93:1 on #c9851e, 9.98:1 on #ebb858), because amber is amber in
     both. Never cream, never white.
   - `--accent-text` — amber used as TEXT. Light mode takes the deep stop
     (#7a4f0d: 5.22:1 on bone, 6.75:1 on paper), following DESIGN.md's ramp
     inversion rule; dark mode keeps `--accent-bright`, which already passes
     on the navy grounds.
   ========================================================================== */
:root {
  --on-accent-bright: #0a1626;
  --accent-text: var(--accent-bright);
}

:root[data-theme='light'] {
  --accent-text: #7a4f0d;
}

/* Amber fills — the foreground must be navy, never the flipped --btn-text. */
.pl-badge-top,
.app-nav-btn.primary,
.app-nav-btn.primary:hover:not(:disabled) {
  color: var(--on-accent-bright);
}

/* .wa-step-n's colour is driven by a keyframe, so the keyframe is restated. */
@keyframes waStepNum {
  0%,
  24% {
    background: var(--accent-bright);
    color: var(--on-accent-bright);
  }
  25%,
  100% {
    background: var(--card2);
    color: var(--dim);
  }
}

/* Amber as text on warm surfaces. */
.foot-badge,
.nav-links a.hl-link,
.consent a,
.consent-text a,
.segx-item.alt .segx-n,
.wa-avatar,
.pl-badge-top.alt,
.hl,
.hero h1 .hl,
.demo-headline .hl {
  color: var(--accent-text);
}

/* ==========================================================================
   The WhatsApp step cycle dimmed the inactive rows to opacity .45, which drags
   their body copy to 2.06:1 — an animation should never be the reason text is
   unreadable, and axe samples it mid-cycle exactly as a reader would. Raised to
   .8 (4.19:1 for the paragraph, 6.95:1 for the heading); the active step still
   reads as active through its border, background and lit number pill, which is
   where the emphasis belonged anyway.
   ========================================================================== */
.wa-step {
  opacity: 0.8;
}

.wa-step p {
  color: var(--dim);
}

@keyframes waStepCycle {
  0%,
  24% {
    opacity: 1;
    border-color: var(--accent-border);
    background: var(--card2);
  }
  25%,
  100% {
    opacity: 0.8;
    border-color: var(--border);
    background: var(--surface);
  }
}

/* ==========================================================================
   Contrast repair, second pass (#1214 constraint 5)

   The first pass fixed amber FILLS. What the re-audit still flagged is amber
   used as TEXT on the two light grounds — #c9851e reads 2.9:1 on the page bg
   and 2.24:1 on the bone card, whatever the font size. These are the rules the
   browser actually reported as the winning declaration, re-asserted at matching
   specificity so `--accent-text` (deep amber in light, unchanged in dark) wins
   without escalating to !important.

   The two legal pages carry their own inline <style> after this sheet, so they
   are fixed in privacidade.html / termos.html directly, with the same token.
   ========================================================================== */
.ed-display__accent,
.final-in h2 .ed-display__accent,
.planos-hero h1 .ed-display__accent,
.careers-hero h1 .ed-display__accent,
.careers-final h2 .ed-display__accent,
.ty-hero h1 .ed-display__accent,
.px-copy .px-kicker,
.intg-head-link,
.pricing-foot a,
.sec-chip strong,
.gov-badge strong,
.app-qualified-msg strong,
.pll-head .pll-hot,
.wa-vs-col.on .wa-vs-h,
.pt-badge,
.pricing-trial,
.pl-save,
.plan-calc-rec b {
  color: var(--accent-text);
}

/* lp-pricing.css:183 carries !important, so this one must match it. */
.pll-head .pll-hot { color: var(--accent-text) !important; }

/* lp-whatsapp.css:306 is a reduced-motion STATIC fallback, outside the keyframes
   this sheet restates: cream on amber, 2.72:1, permanent for anyone with reduced
   motion on. Same token as the animated branch. And lp-pricing.css:110 hardcodes
   #fff on an amber fill. */
@media (prefers-reduced-motion: reduce) {
  .wa-step-n { color: var(--on-accent-bright); }
  .wa-step { opacity: 1; }
}
.pl-cta.primary,
.pl-cta.primary:hover { color: var(--on-accent-bright); }

/* ------------------------------------------------- chrome CTAs on-system ---
   The two CTAs that live in persistent chrome — the mobile drawer footer and
   the sticky bottom bar — were the last buttons still rendering in sentence
   case with Geist and tight tracking, while every in-page primary CTA is an
   uppercase mono `.ed-pill--primary`. They are the most-seen buttons on the
   site and they sit next to uppercase tracked eyebrows, so they carry the
   pill idiom too. Colour is untouched (`--accent` / `--btn-text` already). */
.nm-foot .btn-cta,
.sticky-cta button,
#nav .btn-nav {
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
}

/* The nav bar is a denser strip than the drawer or the sticky bar, so the pill
   keeps its compact size there — uppercase mono runs wider than sentence-case
   Geist and 12.5px would push the bar out at 425. */
#nav .btn-nav { font-size: 11.5px; }

/* -------------------------------------------- dialog CTAs on-system ---
   Two dialog surfaces still rendered their buttons in Geist sentence case
   while every other `.btn-cta` on the site is an uppercase mono pill: the
   modal acknowledgement (`.modal-cta`, 19 pages) and the cookie banner's
   Recusar/Aceitar pair. The banner's PROSE stays Geist — it is body copy
   and should read as a plain notice — but its buttons are filled pills
   sitting a few pixels below `SOLICITAR ACESSO →`, an identical amber pill
   in the other idiom, so the two shapes have to speak the same language.
   Colour is untouched, so the AA ratios carry over unchanged. */
.btn-cta.modal-cta,
.consent-banner .consent-btn {
  font-family: 'Geist Mono', monospace;
  font-size: 12.5px;
  font-weight: 500;
  letter-spacing: var(--ls-caps);
  text-transform: uppercase;
}

/* ------------------------------------------------- hero scroll cue ---
   `.hero-arrow` is the same component on calc.html and demo.html — same
   markup, same chevron, same caps-mono eyebrow under a hero — but it was
   declared twice, once per page stylesheet, and the two copies agreed on
   nothing: 22px vs 18px icon, 11px vs 10px label, `--warn` vs `--muted`,
   .8px vs .6px tracking, an 8px vs 6px bounce, plus two `@keyframes
   bounce` of the same name. One definition here, in the file all 24 pages
   load, so it cannot drift again.

   The surviving values are demo.html's: a muted label with an amber
   chevron. calc.html painted BOTH halves in `--warn`, a status colour
   spent on a scroll cue, which reads as a warning the page never issues.
   The global `prefers-reduced-motion` block in styles.css:289 already
   stops the bounce, so no local carve-out is needed. */
/* O mesmo componente rendia dois espacos diferentes: em demo.html o irmao
   anterior termina com margin-bottom 0 e a distancia e os 42px da regra; em
   calc.html ele segue a lede (margin-bottom 36px) e virava 78px. O ancestral
   zera a margem de quem antecede a seta, para o cue ter sempre o mesmo gap.
   `.hero-calc .hero-sub` (0,2,0) em lp-calc.css, carregado depois, vence um
   seletor simples, entao o :has vem repetido para chegar a (0,4,0). */
*:has(+ .hero-arrow):has(+ .hero-arrow):has(+ .hero-arrow):has(+ .hero-arrow) { margin-bottom: 0; }
.hero-arrow {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  margin-top: 42px;
  font-family: 'Geist Mono', monospace;
  font-size: 10px;
  color: var(--muted);
  letter-spacing: var(--ls-caps, .6px);
}
.hero-arrow svg {
  width: 18px;
  height: 18px;
  color: var(--accent-text, var(--accent-bright));
  animation: heroArrowBounce 1.8s ease-in-out infinite;
}
@keyframes heroArrowBounce {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(6px); }
}

/* --------------------------------------------- forced colors (HCM) --- */
/* No modo de alto contraste do sistema o navegador descarta background-color,
   entao o pill primario e o fantasma ficam identicos: dois contornos. Pior,
   em /assinaturas o fantasma herdava a cor de link e aparecia MAIS forte que
   o primario, invertendo a hierarquia. As cores do sistema restauram a
   distincao sem inventar paleta: primario = preenchido (ButtonText sobre
   ButtonFace), fantasma = contorno. As classes vem repetidas porque `.planos-hero .hero-actions .btn-cta` (0,3,0) em
   lp-planos.css — carregado DEPOIS — venceria um seletor de classe unica. */
@media (forced-colors: active) {
  .ed-pill--primary.ed-pill--primary.ed-pill--primary.ed-pill--primary,
  .ed-pill--solid.ed-pill--solid.ed-pill--solid.ed-pill--solid {
    background: ButtonText;
    color: ButtonFace;
    border: 1px solid ButtonText;
  }
  .ed-pill--ghost.ed-pill--ghost.ed-pill--ghost.ed-pill--ghost {
    background: ButtonFace;
    color: ButtonText;
    border: 1px solid ButtonText;
  }
}

/* ==========================================================================
   Mobile display step-down — LAST in the file on purpose: several per-page
   sections restate the display tier at the same specificity further down
   (carreiras, obrigado, whatsapp), so an earlier block would lose the tie.
   ========================================================================== */
@media (max-width: 560px) {
  .section-head h2.ed-display,
  .hero h1.ed-display,
  h2.demo-headline.ed-display { font-size: var(--fs-display-mob); }
  h1.ed-display--sm,
  h2.ed-display--sm,
  h1.ed-display.ed-display--sm,
  h2.ed-display.ed-display--sm { font-size: var(--fs-h2-mob); }
}

/* ==========================================================================
   Degrau mobile da sobrancelha -> display nos dois heros que ainda faltavam:
   o `.invite-tag` do vip e a marca do `.planos-hero` (o gap de 24 ali vem do
   margin-top do h1, que colapsa com o margin-bottom:4px do wrapper).
   Tambem por ultimo no arquivo, porque a regra base do `.invite-tag` mora em
   1032 na mesma especificidade e ganharia o empate por ordem.
   ========================================================================== */
@media (max-width: 560px) {
  .hero-left .invite-tag.ed-eyebrow { margin-bottom: 18px; }
  .planos-hero h1.ed-display { margin-top: 18px; }
}

/* ==========================================================================
   Degrau mobile do padding lateral do CTA de formulario. A 425px o botao tem
   339px fixos e 26px de padding de cada lado, o que deixa 287px de texto: as
   labels dos segmentos com 34-35 caracteres ("Quero ver com as minhas
   conversas ->") passam por 6px e jogam SO a seta para uma segunda linha,
   dobrando a altura do pill de 48 para 64. Devolver 8px de cada lado cabe as
   quatro labels longas sem mexer na copy (que e gerada por
   build-segmentos.py) nem no tamanho da fonte.
   Por ultimo no arquivo para vencer o empate de especificidade por ordem.
   ========================================================================== */
@media (max-width: 440px) {
  .hero-form-w button.btn-cta,
  .form-stack button.btn-cta,
  .micro-conv-form button.btn-cta,
  .calc-gate-form button.btn-cta {
    padding-left: 18px;
    padding-right: 18px;
  }
}
