/* =============================================================================
   DRIVER-PLUS.CSS — Complementos específicos da landing do Driver+
   -----------------------------------------------------------------------------
   Carregado DEPOIS de todo o design system Aurora. Contém apenas o que os
   componentes .ds-* não cobrem: as cores semânticas de sinal (🟢🟡🔴), os
   cartões de sinal, o card de análise de lucro, os chips das marcas parceiras
   e alguns ajustes finos de ordem/coluna. Tudo lê tokens do DS quando possível.
   ========================================================================== */

:root {
  /* Página forçada em tom escuro (o DS já é dark, reforçamos o contexto). */
  color-scheme: dark;

  /* Fundo das seções mais escuro que o padrão do DS (#0a1120) — um azul
     quase preto, para dar mais contraste com os cartões/imersivos por cima
     e destacar ainda mais a foto full-bleed da hero. Sobrescreve só o token
     semântico --surface-page (não o --color-paper-050 bruto), então outros
     tokens que leem a cor base diretamente (ex: --text-on-accent) não mudam. */
  --surface-page: #05070d;

  /* -------------------------------------------------------------------------
     Cores de sinal — única adição de paleta. Tons de joia para conviver com o
     fundo azul-meia-noite; cada cor tem uma variante -glow (alpha) p/ a "luz".
     ------------------------------------------------------------------------- */
  --dp-signal-good:      #34d399;   /* verde esmeralda — Ótima */
  --dp-signal-good-glow: rgb(52 211 153 / 0.35);
  --dp-signal-mid:       #e0c25c;   /* âmbar dourado — Regular (harmoniza c/ o acento) */
  --dp-signal-mid-glow:  rgb(224 194 92 / 0.35);
  --dp-signal-low:       #f87171;   /* vermelho coral — Baixa */
  --dp-signal-low-glow:  rgb(248 113 113 / 0.35);
}

/* Pílulas/eyebrows que não devem esticar dentro de flex-columns. */
.dp-inline-start { align-self: flex-start; }

/* =========================================================================
   LUZ AMBIENTE GLOBAL
   -------------------------------------------------------------------------
   Camada fixa atrás de tudo (z-index:-1, abaixo do conteúdo mas acima do
   background do body). É ela que dá ao vidro dos cards algo para refratar —
   sem isso, translucidez sobre fundo chapado vira só "cinza transparente".
   Fixed + radial puro: não há repaint por scroll nem filter:blur().
   ========================================================================= */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  background-image:
    radial-gradient(46rem 46rem at 88% 6%,  rgb(212 175 55 / 0.10), transparent 70%),
    radial-gradient(52rem 52rem at 2% 44%,  rgb(36 64 110 / 0.35), transparent 72%),
    radial-gradient(40rem 40rem at 72% 88%, rgb(212 175 55 / 0.07), transparent 70%);
}

/* Auras por seção — o helper .ds-aura vem do DS; aqui só a cor e a posição,
   que são decisões editoriais desta página. */
.dp-aura--signal  { --aura-x: 50%; --aura-y: 8%;  --aura-size: 56rem; --aura-opacity: 0.7; }
.dp-aura--privacy { --aura-x: 18%; --aura-y: 44%; --aura-size: 44rem;
                    --aura-color: radial-gradient(closest-side, rgb(52 211 153 / 0.13), transparent); }
.dp-aura--cta     { --aura-x: 50%; --aura-y: 52%; --aura-size: 50rem; }

/* O DS obriga quem hospeda uma aura a recortá-la (.ds-section:has(> .ds-aura)
   → overflow: clip). Isso só é invisível se o corte cair na CAUDA do radial,
   onde ele já é transparente. No Sinalizador não caía: com --aura-y: 8% e o
   diâmetro travado em max-width:130vw (~507px num aparelho de 390px), quase
   metade do orbe ficava acima do topo da seção e era cortada com o dourado
   ainda aceso — uma faixa horizontal reta marcando a divisão com a §Assistente.
   Descer o centro mantém o brilho no alto da seção (a intenção editorial) e
   joga a borda do círculo para dentro da seção, onde o alpha já é zero.
   As auras de Privacidade (y 44%) e CTA (y 52%) já ficam contidas. */
@media only screen and (max-width: 767px) {
  .dp-aura--signal { --aura-y: 26%; --aura-size: 34rem; }
}

/* =========================================================================
   MARCADOR DE SEÇÃO — filete dourado antes do eyebrow.
   Um detalhe pequeno e consistente que amarra as 11 seções sem depender de
   ilustração; aplica-se só aos eyebrows de cabeçalho, não a toda .ds-mono.
   ========================================================================= */
.ds-section-header .ds-mono,
.dp-split-2 .ds-mono {
  display: inline-flex;
  align-items: center;
  gap: var(--space-3);
  color: var(--color-ink-500);
}
.ds-section-header .ds-mono::before,
.dp-split-2 .ds-mono::before {
  content: "";
  width: 1.5rem;
  height: 1px;
  flex: 0 0 auto;
  background: linear-gradient(90deg, transparent, var(--brand-accent-vivid));
}

/* =========================================================================
   NAVBAR — três cápsulas de vidro independentes (logo · links · ações)
   -------------------------------------------------------------------------
   Em vez de uma única pílula contínua, o nav vira três blocos flutuantes
   com respiro entre eles: a marca (círculo), os links (pílula) e as ações
   (botão dourado + toggle mobile). Ao rolar, as cápsulas de vidro ganham
   mais opacidade e sombra — o CTA dourado já se destaca por si.
   ========================================================================= */
/* O sticky vive no <header> (filho direto do body, altura = página inteira),
   não no <nav>: um <header> do tamanho do próprio nav não dá "espaço de
   percurso" para o sticky funcionar — ele descolaria junto no primeiro scroll. */
.dp-nav-header {
  position: sticky;
  top: var(--space-3);
  z-index: var(--z-nav);
}

.dp-nav {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
}

.dp-nav-capsule {
  display: flex;
  align-items: center;
  background: var(--glass-tint);
  border: 1px solid var(--glass-border);
  backdrop-filter: blur(var(--blur-lg));
  -webkit-backdrop-filter: blur(var(--blur-lg));
  transition: background var(--dur-slow), box-shadow var(--dur-slow), border-color var(--dur-slow);
}
.dp-nav.is-scrolled .dp-nav-capsule {
  background: var(--glass-fill);
  box-shadow: var(--shadow-card);
}

/* cápsula 1 — marca: círculo compacto, só o ícone */
.dp-nav-capsule--brand {
  flex: 0 0 auto;
  padding: 0.5rem;
  border-radius: 50%;
  line-height: 0;
}
.dp-nav-logo {
  width: clamp(2rem, 2.6vw, 2.4rem);
  height: clamp(2rem, 2.6vw, 2.4rem);
  object-fit: contain;
  display: block;
}

/* cápsula 2 — links: pílula central, escondida no mobile (via .ds-nav-links herdado) */
.dp-nav-capsule--links {
  gap: var(--space-5);
  padding: 0.7rem var(--space-6);
  border-radius: var(--radius-pill);
}

/* cápsula 3 — ações: CTA dourado + toggle mobile, com respiro próprio */
.dp-nav-capsule--actions {
  flex: 0 0 auto;
  gap: var(--space-2);
  padding: 0.4rem;
  border-radius: var(--radius-pill);
}
.dp-nav-capsule--actions .ds-btn { margin: 0; }

@media only screen and (max-width: 767px) {
  .dp-nav-capsule--links { display: none; }
}

/* =========================================================================
   HERÓI CINEMATOGRÁFICA (§1)
   -------------------------------------------------------------------------
   A foto "Hero1" ocupa toda a viewport (full-bleed), o nav de vidro flutua
   por cima e o conteúdo respira, centralizado. Camadas de baixo p/ cima:
     1. .dp-cine-bg    → imagem de fundo (cover) + leve zoom parallax
     2. .dp-cine-scrim → gradientes navy p/ contraste do texto + vinheta
     3. .dp-cine-grain → grão sutil p/ acabamento cinematográfico
     4. .dp-cine-inner → conteúdo (badge, título, lede, CTAs, stats)
   ========================================================================= */
:root {
  --dp-nav-h: 5.5rem;   /* altura reservada p/ o nav sticky flutuante */
  /* Onde uma coluna .ds-sticky deve parar: abaixo do nav, não atrás dele.
     Com o padrão do DS (--space-8 = 4rem) ela pinava a 64px e o nav vai até
     ~71px, deixando o título encostado na cápsula de vidro. */
  --sticky-top: calc(var(--dp-nav-h) + var(--space-4));
}

.dp-cine {
  position: relative;
  isolation: isolate;
  width: 100%;
  /* lvh, não svh: lvh é a altura da viewport com a UI do navegador RECOLHIDA —
     um valor fixo por aparelho, não o estado atual da barra. Com svh o Hero
     nascia do tamanho da tela COM a barra de endereço; no primeiro scroll do
     celular a barra se recolhe, a viewport cresce e sobrava uma faixa embaixo
     por onde a próxima seção aparecia. Com lvh ele já nasce cobrindo o caso
     maior: com a barra visível o excedente fica abaixo da dobra (o conteúdo é
     centrado, então não incomoda) e, quando ela some, encaixa exato.
     Ver também coverViewport() no driver-plus-hero.js, a rede de segurança. */
  min-height: 100vh;    /* fallback: se lvh não existir, a regra abaixo é descartada */
  min-height: 100lvh;
  /* tuck: sobe a seção p/ que a imagem apareça atrás do nav de vidro */
  margin-top: calc(-1 * var(--dp-nav-h));
  padding-top: calc(var(--dp-nav-h) + clamp(1.5rem, 6vh, 4.5rem));
  padding-bottom: clamp(4rem, 10vh, 7rem);
  padding-inline: var(--gutter-outer);
  display: grid;
  place-items: center;
  overflow: clip;
  text-align: center;
  color: var(--text-strong);
}

/* 1 — imagem de fundo. */
.dp-cine-bg {
  position: absolute;
  inset: -4% -4% -4% -4%;          /* margem extra p/ o zoom parallax não vazar */
  z-index: -3;
  background-color: #0a1120;
  background-image: url("assets/hero-1.png");
  background-size: cover;
  background-position: 50% 62%;
  background-repeat: no-repeat;
  transform: scale(1.06);
  will-change: transform;
}

/* 2 — scrim: navy no topo (legibilidade do nav) e na base (CTAs/scroll),
   respiro no centro, mais uma vinheta radial p/ focar o olhar no título.

   A PRIMEIRA camada é o "fecho": sem ela a última linha de pixels do Hero era
   rgb(8 13 26 / 0.92) POR CIMA do frame, enquanto o <main> logo abaixo é
   transparente sobre --surface-page (#05070d). Dois azuis-quase-pretos
   diferentes encostados = uma linha de divisão nítida exatamente no
   </section>, bem visível no mobile. Terminando o gradiente na cor exata da
   página, o Hero se dissolve no fundo e a costura some.
   O stop transparente é escrito como rgb(5 7 13 / 0), não `transparent`: a
   palavra-chave é rgba(0,0,0,0) e acinzentaria o miolo da interpolação. */
.dp-cine-scrim {
  position: absolute;
  inset: 0;
  z-index: -2;
  pointer-events: none;
  background:
    linear-gradient(to top, var(--surface-page) 0%, rgb(5 7 13 / 0) 14%),
    radial-gradient(120% 80% at 50% 42%, transparent 38%, rgb(6 10 20 / 0.55) 100%),
    linear-gradient(
      to bottom,
      rgb(8 13 26 / 0.72) 0%,
      rgb(8 13 26 / 0.28) 26%,
      rgb(8 13 26 / 0.18) 52%,
      rgb(8 13 26 / 0.62) 82%,
      rgb(8 13 26 / 0.92) 100%
    );
}
/* 2b — COSTURA com o conteúdo abaixo do Hero.
   O fecho do scrim resolve metade do problema (o Hero termina em
   --surface-page), mas não a outra metade: o Hero é OPACO de ponta a ponta e
   por isso esconde a luz ambiente fixa do body::before, que reaparece de
   supetão assim que o <main> começa. Duas cores diferentes encostadas =
   linha de divisão. Esta faixa faz o caminho inverso do scrim — começa na cor
   exata em que o Hero termina e se abre até transparente, revelando a luz
   ambiente aos poucos.

   Vive fora do <main> (precisa da largura da página, não a do container) e é
   puxada de volta por margin-bottom negativa, então não empurra nada para
   baixo; z-index negativo mantém o texto da §Assistente por cima dela. */
.dp-seam {
  --dp-seam-h: clamp(7rem, 20vh, 12rem);
  position: relative;
  z-index: -1;
  height: var(--dp-seam-h);
  margin-bottom: calc(-1 * var(--dp-seam-h));
  pointer-events: none;
  background: linear-gradient(to bottom, var(--surface-page), rgb(5 7 13 / 0));
}

/* 3 — grão fino (SVG inline) p/ tirar o "banding" e dar textura de filme. */
.dp-cine-grain {
  position: absolute;
  inset: 0;
  z-index: -1;
  pointer-events: none;
  opacity: 0.06;
  mix-blend-mode: overlay;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
}

/* --- conteúdo --- */
.dp-cine-inner {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(1rem, 2.4vh, 1.6rem);
  width: 100%;
  max-width: 60rem;
  margin-inline: auto;
}

.ds-heading.dp-cine-title {
  /* especificidade p/ vencer .ds-heading[data-variant="heading-1"] (fluid-88).
     Fórmula p/ caber em UMA linha em qualquer viewport: cresce a 4.6vw até
     ~1100px, onde trava em 3.15rem (a cápsula de conteúdo tem max-width:60rem
     — acima disso o texto já não ganha mais espaço horizontal).

     RECALIBRADA para a Sora: os valores anteriores (5.2vw / 3.25rem) vinham da
     métrica da stack de sistema e estouravam ~8% com a fonte nova. Os atuais
     saem de medição direta — largura real da frase renderizada a 100px,
     dividida pelo espaço disponível, no pior caso (320px de viewport, onde a
     razão é mais apertada) — com margem p/ variação de fonte entre sistemas.
     Sem nowrap: se algum dispositivo renderizar mais largo, quebra
     graciosamente em vez de cortar o texto. */
  font-size: clamp(1rem, 4.6vw, 3.15rem);
  max-width: 100%;
  color: var(--color-ink-900);
}

.dp-cine-actions {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--space-3);
  margin-top: var(--space-2);
}
/* CTA secundário vira "vidro" p/ funcionar sobre a foto */
.dp-cine-actions .ds-btn[data-variant="secondary"] {
  --_fg: var(--color-ink-900);
  background: rgb(246 242 233 / 0.06);
  box-shadow: inset 0 0 0 1.5px rgb(246 242 233 / 0.28);
  backdrop-filter: blur(var(--blur-md));
  -webkit-backdrop-filter: blur(var(--blur-md));
}
.dp-cine-actions .ds-btn[data-variant="secondary"]:hover {
  background: rgb(246 242 233 / 0.14);
  box-shadow: inset 0 0 0 1.5px rgb(246 242 233 / 0.45);
}

/* faixa de destaques (prova de valor) sob os CTAs */
.dp-cine-stats {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: clamp(0.75rem, 3vw, 2rem);
  margin-top: clamp(1rem, 3vh, 2.25rem);
  padding: 0;
  list-style: none;
}
.dp-cine-stats li {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 0.15rem;
}
.dp-cine-stats b {
  font-size: var(--fluid-24);
  font-weight: var(--weight-medium);
  letter-spacing: var(--ls-display);
  color: var(--color-ink-900);
}
.dp-cine-stats span:not(.dp-cine-stat-sep) {
  font-family: var(--font-mono);
  font-size: var(--fluid-12);
  letter-spacing: var(--ls-mono);
  text-transform: uppercase;
  color: var(--color-ink-500);
}
.dp-cine-stat-sep {
  width: 1px;
  height: 2rem;
  background: linear-gradient(to bottom, transparent, rgb(246 242 233 / 0.25), transparent);
}

/* indicador "Rolar" ancorado na base */
.dp-cine-scroll {
  position: absolute;
  left: 50%;
  bottom: clamp(1rem, 3vh, 2rem);
  transform: translateX(-50%);
  z-index: 1;
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-2);
  font-family: var(--font-mono);
  font-size: var(--fluid-12);
  letter-spacing: var(--ls-mono);
  text-transform: uppercase;
  color: var(--color-ink-500);
  text-decoration: none;
  transition: color var(--dur-base) var(--ease-out);
}
.dp-cine-scroll:hover { color: var(--color-ink-900); }
.dp-cine-mouse {
  display: grid;
  justify-items: center;
  width: 1.55rem;
  height: 2.6rem;
  padding-top: 0.42rem;
  border-radius: var(--radius-pill);
  border: 1.5px solid rgb(246 242 233 / 0.4);
}
.dp-cine-mouse i {
  width: 3px;
  height: 7px;
  border-radius: var(--radius-pill);
  background: currentColor;
}

@media (prefers-reduced-motion: no-preference) {
  .dp-cine-mouse i { animation: dp-scroll-hint 1.8s var(--ease-in-out) infinite; }
}
@keyframes dp-scroll-hint {
  0%   { transform: translateY(0);    opacity: 0; }
  30%  { opacity: 1; }
  60%  { transform: translateY(8px);  opacity: 0; }
  100% { transform: translateY(8px);  opacity: 0; }
}

/* --- responsivo da hero --- */
/* Tablet e mobile: botões compactos, ajustados ao próprio conteúdo — antes
   ocupavam 100% da largura (flex:1 1 auto + width:100%), ficando enormes e
   esticados de ponta a ponta na horizontal. Agora ficam sempre lado a lado:
   font-size calibrado empiricamente (binary search no navegador, largura
   real dos dois botões juntos) p/ nunca quebrar linha, do iPhone SE (320px)
   até o fim do breakpoint tablet — o padding é em `em`, então acompanha a
   fonte e encolhe junto. */
@media only screen and (max-width: 1023px) {
  .dp-cine-actions {
    gap: 0.4rem;
    flex-wrap: nowrap;
  }
  .dp-cine-actions .ds-btn {
    flex: 0 1 auto;
    width: auto;
    padding: 0.75em 1.4em;
    font-size: clamp(0.65rem, 4.1vw - 0.176rem, 1rem);
    white-space: nowrap;
  }
}

@media only screen and (max-width: 767px) {
  .dp-cine {
    min-height: 100vh;    /* fallback */
    min-height: 100lvh;   /* mesma razão do bloco base */
    text-align: center;
    justify-content: center;
  }

  /* no toque o indicador de scroll é dispensável e evita colisão */
  .dp-cine-scroll { display: none; }
}

/* Telas bem estreitas (até ~430px): os destaques (3s/100%/sinal) já cabem
   numa linha só a partir de ~430px com o tamanho padrão — abaixo disso,
   encolhe (fórmula calibrada por binary search, mesmo método dos botões)
   p/ manter os três grupos e os dois separadores sempre lado a lado, como
   na versão web, em vez de empilhar. */
@media only screen and (max-width: 429px) {
  .dp-cine-stats { flex-wrap: nowrap; gap: 0.5rem; }
  .dp-cine-stats b {
    font-size: clamp(0.95rem, 6.85vw - 0.312rem, 1.55rem);
  }
  .dp-cine-stats span:not(.dp-cine-stat-sep) {
    font-size: clamp(0.48rem, 3.425vw - 0.156rem, 0.775rem);
    white-space: nowrap;
  }
  .dp-cine-stat-sep { height: 1.5rem; }
}

/* =========================================================================
   HERO CINEMATOGRÁFICO — loading screen + canvas de frames + estados JS-hero
   -------------------------------------------------------------------------
   Bloco 100% ADITIVO: não altera nenhum estilo estático do Hero acima.
   Tudo é gated por `html.js-hero-active`, marcada ANTES do primeiro paint
   (script inline no <head>). Sem essa classe — reduced-motion ou JS desligado —
   a loading screen fica oculta e o Hero estático original aparece intacto:
   o fallback é automático, pela simples ausência do estado ativo.
   (driver-plus-hero.js orquestra preload, canvas e o storytelling com GSAP.)
   ========================================================================= */

/* --- canvas dos frames: camada de fundo do Hero, atrás do scrim --------- */
.dp-hero-canvas {
  position: absolute;
  inset: 0;
  z-index: -3;                 /* mesmo plano do .dp-cine-bg (que fica oculto) */
  display: block;
  width: 100%;
  height: 100%;
  opacity: 0;                  /* revelado só quando o JS-hero assume */
  background-color: #0a1120;   /* mesma base navy do .dp-cine-bg, sem flash */
}
html.js-hero-active .dp-hero-canvas { opacity: 1; }
/* com o canvas no comando, o fundo estático (e seu parallax) some */
html.js-hero-active .dp-cine-bg { display: none; }

/* trava o scroll enquanto os frames pré-carregam */
html.dp-hero-loading { overflow: hidden; }

/* --- loading screen ----------------------------------------------------- */
.dp-hero-loader {
  position: fixed;
  inset: 0;
  z-index: 9999;               /* acima do nav de vidro e de tudo o mais */
  display: none;               /* aparece apenas com o JS-hero ativo */
  place-items: center;
  padding: var(--gutter-outer);
  background: var(--surface-page);
  color: var(--text-strong);
  opacity: 1;
  transition: opacity var(--dur-slow) var(--ease-out);
}
html.js-hero-active .dp-hero-loader { display: grid; }
/* fade-out elegante ao concluir (a classe .is-done vem do JS aos 100%) */
.dp-hero-loader.is-done {
  opacity: 0;
  visibility: hidden;
  pointer-events: none;
}

/* FUNDO DO LOADER — o primeiro frame da sequência do Hero, em vez do preto
   chapado: a tela de carregamento já mostra a cena que vai começar, e a
   transição para o canvas não tem corte. É exatamente o arquivo que o <head>
   já pré-carrega, então não custa uma requisição a mais. Vai num ::before
   absoluto (não vira item do grid) com um scrim por cima, para que logo,
   barra e percentual mantenham contraste sobre qualquer parte da imagem. */
.dp-hero-loader::before {
  content: "";
  position: absolute;
  inset: 0;
  z-index: 0;
  background-image:
    linear-gradient(180deg, rgb(5 7 13 / 0.55), rgb(5 7 13 / 0.82)),
    url("assets/frames-sm/frame_000.webp");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}
/* Mesmo escopo por mídia do preload no <head>: cada aparelho pinta o frame
   inicial do SEU conjunto (640×640 no mobile, 1280×720 no desktop). */
@media only screen and (min-width: 768px) {
  .dp-hero-loader::before {
    background-image:
      linear-gradient(180deg, rgb(5 7 13 / 0.55), rgb(5 7 13 / 0.82)),
      url("assets/frames/frame_000.webp");
  }
}

.dp-hero-loader-inner {
  position: relative;                /* acima do frame de fundo */
  z-index: 1;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: clamp(1.25rem, 4vh, 2rem);
  width: min(80vw, 22rem);
}
.dp-hero-loader-logo {
  width: clamp(3.25rem, 12vw, 4.75rem);
  height: auto;
  animation: dp-loader-pulse 2.4s var(--ease-in-out) infinite;
}
.dp-hero-loader-bar {
  position: relative;
  width: 100%;
  height: 4px;
  border-radius: var(--radius-pill);
  background: rgb(246 242 233 / 0.12);
  overflow: hidden;
}
.dp-hero-loader-fill {
  --p: 0%;
  display: block;
  height: 100%;
  width: var(--p);
  border-radius: inherit;
  background: linear-gradient(90deg, var(--brand-primary), var(--brand-accent));
  transition: width var(--dur-base) var(--ease-out);
}
.dp-hero-loader-pct {
  font-family: var(--font-mono);
  font-size: 0.875rem;
  letter-spacing: var(--ls-mono);
  color: var(--color-ink-500);
  font-variant-numeric: tabular-nums;
}

@media (prefers-reduced-motion: no-preference) {
  @keyframes dp-loader-pulse {
    0%, 100% { opacity: 0.85; transform: scale(1); }
    50%      { opacity: 1;    transform: scale(1.04); }
  }
}

/* --- fallback defensivo: em reduced-motion, o cinema fica inerte mesmo se
   a classe ativa vazar por algum motivo (o Hero estático original prevalece). */
@media (prefers-reduced-motion: reduce) {
  html.js-hero-active .dp-hero-canvas { opacity: 0; }
  html.js-hero-active .dp-cine-bg { display: block; }
  .dp-hero-loader { display: none !important; }
}

/* =========================================================================
   §2 ASSISTENTE — card de mídia
   -------------------------------------------------------------------------
   O card É a foto: um POV de moto à noite com o celular rodando o Driver+ no
   centro do quadro. Ele carregava uma legenda por cima, e era ela que
   justificava os dois escurecimentos herdados — o scrim do .ds-immersive-card
   (preto a 54% subindo da base) e um halo radial atrás do texto. Os dois
   caíam justamente sobre o celular, ou seja, apagavam o assunto da imagem
   para dar contraste a uma frase que repetia o lede ao lado.

   Sem a legenda, o acabamento passa a ser feito por MOLDURA e VINHETA, não
   por escurecimento: aro de vidro hairline, vinheta que fecha as bordas e
   concentra o olhar no centro, e uma faixa curta no topo que serve só ao
   chip. O chip vira um HUD — vidro navy, ponto pulsando — e o único
   movimento é um zoom lento da foto no hover.
   ========================================================================= */
/* A imagem entra pela camada de mídia do card imersivo. O seletor precisa do
   ancestral: o DS define `.ds-immersive-card .ds-immersive-media` com o
   shorthand `background`, que é mais específico que uma classe sozinha e
   apagaria o background-image mesmo com este arquivo carregando depois. */
.ds-immersive-card .dp-media-assistente {
  background-image: url("assets/section1.png");
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
  transition: transform var(--dur-slower) var(--ease-out);
}

.dp-media-card {
  align-items: flex-start;      /* o chip ancora no topo, não na base */
  border: 1px solid var(--glass-border);
  box-shadow: var(--glass-shadow);
  transition: box-shadow var(--dur-slow) var(--ease-out);
}
/* Substitui o --gradient-scrim-bottom do DS. A faixa de cima é curta e existe
   só para o chip ter contraste sobre qualquer parte da foto; a vinheta fecha
   as bordas sem tocar no miolo, onde está o celular. */
.dp-media-card::after {
  background:
    linear-gradient(to bottom, rgb(3 6 12 / 0.55) 0%, rgb(3 6 12 / 0) 28%),
    radial-gradient(115% 95% at 50% 48%, rgb(3 6 12 / 0) 42%, rgb(3 6 12 / 0.5) 100%);
}
.dp-media-card:hover { box-shadow: var(--glass-shadow-lit); }
/* O overflow:clip do card é o que segura o zoom dentro da moldura. */
.dp-media-card:hover .ds-immersive-media { transform: scale(1.06); }

/* CHIP HUD — o .dp-tag padrão é translúcido demais (12% de alpha) para viver
   sobre uma foto noturna cheia de faróis. O vidro navy dá uma base estável
   sem tocar na cor de sinal, que continua vindo do [data-signal]. */
/* [data-signal] no seletor não é decoração: .dp-tag[data-signal="good"] tem a
   mesma especificidade de .dp-tag.dp-media-chip e vive DEPOIS neste arquivo,
   então venceria por ordem. O atributo a mais desempata sem depender de onde
   o bloco está. */
.dp-tag.dp-media-chip[data-signal] {
  background: var(--glass-fill);
  border-color: var(--glass-border);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  box-shadow: var(--glass-shadow);
}
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .dp-tag.dp-media-chip[data-signal] { background: rgb(8 13 26 / 0.9); }
}
/* "Tempo real" dito pelo próprio elemento: o ponto do chip pulsa. Os keyframes
   ficam DENTRO do @media (mesmo padrão de dp-loader-pulse): em reduced-motion
   eles não existem e a declaração de animation vira no-op. */
.dp-media-chip::before { animation: dp-pulse 2.4s var(--ease-in-out) infinite; }
@media (prefers-reduced-motion: no-preference) {
  @keyframes dp-pulse {
    0%, 100% { opacity: 1;    box-shadow: 0 0 8px currentColor; }
    50%      { opacity: 0.5;  box-shadow: 0 0 15px currentColor; }
  }
}
/* O zoom é enfeite: em reduced-motion a foto fica parada. */
@media (prefers-reduced-motion: reduce) {
  .ds-immersive-card .dp-media-assistente { transition: none; }
  .dp-media-card:hover .ds-immersive-media { transform: none; }
}

/* =========================================================================
   TAG DE SINAL (pílula 🟢🟡🔴) — reutilizável em qualquer lugar
   ========================================================================= */
.dp-tag {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.35em 0.8em;
  border-radius: var(--radius-pill);
  font-family: var(--font-mono);
  font-size: var(--fluid-12);
  letter-spacing: var(--ls-mono);
  text-transform: uppercase;
  font-weight: var(--weight-medium);
  border: 1px solid transparent;
}
.dp-tag::before {
  content: "";
  width: 8px; height: 8px;
  border-radius: 50%;
  background: currentColor;
  box-shadow: 0 0 8px currentColor;
}
.dp-tag[data-signal="good"] { color: var(--dp-signal-good); background: rgb(52 211 153 / 0.12); border-color: var(--dp-signal-good-glow); }
.dp-tag[data-signal="mid"]  { color: var(--dp-signal-mid);  background: rgb(224 194 92 / 0.12); border-color: var(--dp-signal-mid-glow); }
.dp-tag[data-signal="low"]  { color: var(--dp-signal-low);  background: rgb(248 113 113 / 0.12); border-color: var(--dp-signal-low-glow); }

/* =========================================================================
   CARTÕES DE SINAL (§4) — base .ds-feature-card + luz que pulsa
   ========================================================================= */
/* Herda o vidro de .ds-feature-card; aqui só a borda superior colorida e a
   "luz". NÃO redefine background — isso apagaria o vidro, já que este arquivo
   carrega depois do design system. */
.dp-signal {
  position: relative;
  align-items: flex-start;
  overflow: visible;
}
/* a "luz" no topo do cartão */
.dp-signal-light {
  display: block;
  align-self: center;
  width: 100%;
  max-width: 280px;
  border-radius: var(--radius-bubble-lg);
  background: rgb(5 7 13 / 0.45);
  padding: 14px;
  overflow: hidden;
}
.dp-signal-img {
  display: block;
  width: 100%;
  height: auto;
  border-radius: 8px;
}
.dp-signal[data-signal="good"] .dp-signal-light { box-shadow: 0 0 0 1px var(--dp-signal-good-glow), 0 0 24px var(--dp-signal-good-glow); }
.dp-signal[data-signal="mid"]  .dp-signal-light { box-shadow: 0 0 0 1px var(--dp-signal-mid-glow),  0 0 24px var(--dp-signal-mid-glow); }
.dp-signal[data-signal="low"]  .dp-signal-light { box-shadow: 0 0 0 1px var(--dp-signal-low-glow),  0 0 24px var(--dp-signal-low-glow); }

/* Faixa superior colorida. O :hover é repetido de propósito: .ds-glass zera
   border-color no hover para dar lugar ao aro dourado, e sem isto a faixa de
   sinal sumiria justamente quando o cartão é apontado. */
.dp-signal[data-signal="good"], .dp-signal[data-signal="good"]:hover { border-top: 3px solid var(--dp-signal-good); }
.dp-signal[data-signal="mid"],  .dp-signal[data-signal="mid"]:hover  { border-top: 3px solid var(--dp-signal-mid); }
.dp-signal[data-signal="low"],  .dp-signal[data-signal="low"]:hover  { border-top: 3px solid var(--dp-signal-low); }

.dp-signal-title {
  font-size: var(--fluid-24);
  font-weight: var(--weight-medium);
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
}

/* Luz pulsante — respeita reduced-motion via regra global do styles.css */
@media (prefers-reduced-motion: no-preference) {
  .dp-signal .dp-signal-light { animation: dp-breathe 3s var(--ease-in-out) infinite; }
  .dp-signal[data-signal="mid"] .dp-signal-light { animation-delay: 0.4s; }
  .dp-signal[data-signal="low"] .dp-signal-light { animation-delay: 0.8s; }
}
@keyframes dp-breathe {
  0%, 100% { transform: translateY(0) scale(1); }
  50%      { transform: translateY(-3px) scale(1.04); }
}

/* =========================================================================
   CARD DE ANÁLISE DE LUCRO (§3) — base .ds-card
   ========================================================================= */
.dp-profit-card {
  gap: var(--space-5);
  border: 1px solid var(--border-hairline);
}
.dp-profit-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
}
.dp-profit-rows {
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
}
.dp-profit-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-block: var(--space-2);
  border-bottom: 1px solid var(--border-hairline);
  font-size: var(--fluid-16);
  color: var(--text-body);
}
.dp-profit-row:last-child { border-bottom: 0; }
.dp-profit-row b { color: var(--text-strong); font-weight: var(--weight-medium); }
.dp-profit-total {
  display: flex;
  flex-direction: column;
  gap: var(--space-1);
  padding-top: var(--space-4);
  border-top: 1px dashed var(--border-strong);
}
.dp-profit-total .ds-price-amount { color: var(--dp-signal-good); }
.dp-profit-label {
  font-family: var(--font-mono);
  font-size: var(--fluid-12);
  letter-spacing: var(--ls-mono);
  text-transform: uppercase;
  color: var(--text-muted);
}

/* =========================================================================
   MOCKUP DE CELULAR (§5) — a tela de configuração dentro de um device frame
   -------------------------------------------------------------------------
   Substitui o antigo card .dp-config: em vez de um formulário solto, a
   personalização aparece como uma tela real do app dentro de um aparelho.
   ========================================================================= */
.dp-phone-wrap {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--space-4);
}
.dp-phone-note { text-align: center; max-width: 34ch; }

/* Aparelho — bezel escuro com cantos generosos e sombra ambiente. */
.dp-phone {
  position: relative;
  width: min(320px, 82vw);
  aspect-ratio: 9 / 19;
  padding: 12px;
  background: linear-gradient(160deg, #1a1f2b, #05070d 70%);
  border: 1px solid rgb(255 255 255 / 0.08);
  border-radius: 52px;
  box-shadow:
    inset 0 0 0 2px rgb(0 0 0 / 0.6),
    var(--shadow-float),
    0 0 60px -10px var(--dp-signal-good-glow);
}
/* Ilha dinâmica / notch */
.dp-phone-island {
  position: absolute;
  top: 22px; left: 50%; transform: translateX(-50%);
  width: 34%; height: 26px;
  background: #000;
  border-radius: var(--radius-pill);
  z-index: 3;
}

/* Tela — moldura interna que recorta o vídeo demonstrativo. */
.dp-phone-screen {
  position: relative;
  height: 100%;
  overflow: hidden;
  border-radius: 42px;
  background: radial-gradient(120% 80% at 50% 0%, #0e1626, var(--surface-page));
}
/* Vídeo da personalização — preenche a tela (cover) sem distorcer. */
.dp-phone-video {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* =========================================================================
   PRIVACIDADE (§7) — painel escuro + lista de micro-pontos em vidro
   ========================================================================= */
/* O card imersivo aqui não é uma foto: é um painel de texto. Anula a altura
   mínima de mídia e usa respiro vertical próprio.
   Também opta pelo vidro (.ds-glass no HTML): o .ds-immersive-card traz fundo
   opaco (--surface-inverse) e scrim no ::after, ambos definidos depois do
   bloco de vidro no components.css — por isso precisam ser desfeitos aqui,
   que é o último arquivo da cascata. */
.dp-privacy-card {
  min-height: auto;
  padding-block: clamp(2.5rem, 6vw, 5rem);
  background: var(--glass-tint);
  border: 1px solid var(--glass-border);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  box-shadow: var(--glass-shadow);
}
.dp-privacy-card:hover {
  background: var(--glass-tint-strong);
  border-color: transparent;
  box-shadow: var(--glass-shadow-lit);
}
/* ::after do imersivo = scrim opaco; devolve o holofote que segue o ponteiro. */
.dp-privacy-card::after {
  background: var(--glass-spotlight);
  opacity: 0;
  z-index: 0;
}
.dp-privacy-card:hover::after { opacity: 1; }

@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .dp-privacy-card, .dp-privacy-card:hover { background: var(--surface-raised); }
}
.dp-privacy-body { width: 100%; }
.dp-privacy-card .ds-heading { color: var(--text-on-dark); }
.dp-privacy-lede {
  color: var(--text-on-dark);
  max-width: 52ch;
}
/* Eyebrow em verde-esmeralda: a cor semântica de "seguro" desta página. */
.dp-eyebrow--good { color: var(--dp-signal-good); }
.dp-eyebrow--good::before { background: linear-gradient(90deg, transparent, var(--dp-signal-good)); }

/* Links para os documentos legais completos (privacidade.html / termos.html),
   fechando a seção — as mesmas URLs declaradas na ficha do Google Play. */
.dp-privacy-legal {
  flex-wrap: wrap;
  margin-top: var(--space-6);
}
/* No mobile a seção inteira é centralizada (bloco no fim deste arquivo); como
   as duas pílulas quebram em duas linhas, elas precisam se centralizar também. */
@media only screen and (max-width: 767px) {
  .dp-privacy-legal { justify-content: center; }
}

.dp-privacy-points {
  display: grid;
  gap: var(--space-4);
  grid-template-columns: 1fr;
  margin-top: var(--space-6);
}
.dp-privacy-point {
  display: flex;
  gap: var(--space-3);
  align-items: flex-start;
  padding: var(--space-5);
  border-radius: var(--radius-block-medium);
  background: var(--glass-tint);
  border: 1px solid var(--glass-border);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
}
.dp-privacy-point b { color: var(--text-on-dark); }
.dp-privacy-point .ds-body { color: var(--text-on-dark); }
.dp-privacy-point .dp-check {
  flex: 0 0 auto;
  display: grid; place-items: center;
  width: 2rem; height: 2rem;
  border-radius: 50%;
  background: rgb(52 211 153 / 0.14);
  color: var(--dp-signal-good);
}

/* =========================================================================
   COMPATIBILIDADE (§8) — chips de marca no marquee
   ========================================================================= */
.dp-brand {
  display: inline-flex;
  align-items: center;
  gap: var(--space-2);
  padding: 0.7em 1.4em;
  border-radius: var(--radius-pill);
  font-weight: var(--weight-bold);
  font-size: var(--fluid-20);
  letter-spacing: -0.01em;
  white-space: nowrap;
  box-shadow: var(--shadow-card);
}
.dp-brand--99   { background: #ffd400; color: #101010; }
.dp-brand--puck { background: #0f0f0f; color: #ff6a00; border: 1px solid rgb(255 106 0 / 0.5); }
.dp-brand--zumpp{ background: #e11d2a; color: #ffffff; }
.dp-brand-soon {
  background: var(--glass-tint);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  color: var(--text-muted);
  border: 1px dashed var(--border-strong);
  font-weight: var(--weight-medium);
}
.dp-compat-note {
  text-align: center;
  margin-top: var(--space-5);
  color: var(--text-muted);
}

/* =========================================================================
   PLANOS — os cards reaproveitam o .ds-feature-card (mesmo vidro + raio
   speech-bubble + aro dourado da §Recursos). Aqui só o específico de preço:
   linha de valor, rodapé alinhado e leitura no card em destaque (opaco).
   ========================================================================= */
.dp-plan-price {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: var(--space-2);
}
/* "Equivale a R$ X por mês" — encosta na linha de preço, sem herdar o gap-4
   do card, para ler como legenda do valor e não como um item à parte. */
.dp-plan-equiv {
  margin-top: calc(var(--space-4) * -1 + var(--space-1));
  color: var(--brand-accent-vivid);
}
.dp-plan .ds-badge { align-self: flex-start; }
/* O gap-4 do próprio feature-card já dá o ritmo; evita a folga extra do
   margin-block padrão de .ds-price-features. */
.dp-plan .ds-price-features { margin-block: var(--space-2) 0; }
/* Empurra o CTA para a base do card, alinhando os três botões mesmo com
   listas de recursos de tamanhos diferentes. */
.dp-plan-cta { margin-top: auto; }
/* No card em destaque (fundo escuro via data-tone="inverse"), clareia o
   "/ período" para não sumir sobre o opaco. */
.dp-plan--featured .ds-price-period { color: rgb(255 255 255 / 0.62); }

/* =========================================================================
   COMO FUNCIONA (§9) — número grande no item de timeline
   ========================================================================= */
.dp-step-num {
  font-family: var(--font-mono);
  font-size: var(--fluid-14);
  letter-spacing: var(--ls-mono);
  text-transform: uppercase;
  color: var(--brand-accent-vivid);
}
/* A linha da timeline nasce dourada e some ao descer: sugere o percurso da
   oferta até a decisão, em vez de um filete uniforme. */
.ds-timeline-item {
  border-left-color: transparent;
  border-image: linear-gradient(to bottom, var(--brand-accent-vivid), rgb(212 175 55 / 0.08)) 1;
}

/* =========================================================================
   FAQ (§11)
   ========================================================================= */
.dp-faq {
  max-width: 52rem;
  margin-inline: auto;
}

/* =========================================================================
   CTA FINAL (§12) — painel de vidro com aro dourado, o clímax da página
   ========================================================================= */
.dp-cta {
  text-align: center;
  padding-block: clamp(3rem, 7vw, 5rem);
  background: var(--glass-tint-strong);
  border: 1px solid var(--border-strong);
  backdrop-filter: var(--glass-blur);
  -webkit-backdrop-filter: var(--glass-blur);
  box-shadow: var(--glass-shadow);
}
.dp-cta-title { max-width: 20ch; }
.dp-cta-copy  { max-width: 56ch; }
.dp-cta-btn   { margin-top: var(--space-2); }
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .dp-cta { background: var(--surface-raised); }
}
.dp-step-title {
  font-size: var(--fluid-24);
  font-weight: var(--weight-medium);
  letter-spacing: var(--ls-display);
  color: var(--text-strong);
  margin-block: var(--space-2) var(--space-1);
}

/* =========================================================================
   AJUSTES DE LAYOUT — split de duas colunas p/ seções alternadas
   ========================================================================= */
.dp-split-2 {
  display: grid;
  gap: var(--space-7);
  align-items: center;
  grid-template-columns: 1fr;
}
@media only screen and (min-width: 768px) {
  .dp-split-2 { grid-template-columns: 1fr 1fr; gap: var(--space-8); }
  /* inverte a ordem visual quando marcado (texto à direita) */
  .dp-split-2[data-flip="true"] > :first-child { order: 2; }
}
@media only screen and (max-width: 767px) {
  .dp-privacy-points { grid-template-columns: 1fr; }
}
@media only screen and (min-width: 768px) {
  .dp-privacy-points { grid-template-columns: repeat(3, 1fr); }
}

/* =========================================================================
   MARCAS DE SEÇÃO (privacidade §7 / CTA §12)
   -------------------------------------------------------------------------
   Substituem o antigo selo em emoji dentro de um balão dourado: são artes
   prontas, com forma e brilho próprios, então entram soltas — sem fundo,
   sem aro e sem raio. Só a sombra projetada, para que não flutuem sobre o
   vidro do painel. `align-self: flex-start` porque ambas vivem dentro de um
   .ds-flex-col alinhado à esquerda: sem isso a imagem esticaria na largura
   toda da coluna. No mobile o bloco de centralização (< 768px) reposiciona
   as duas para o centro junto com o resto do texto.
   ========================================================================= */
.dp-cta-mark,
.dp-privacy-mark {
  display: block;
  width: clamp(4rem, 10vw, 6.5rem);
  height: auto;
  object-fit: contain;
  align-self: flex-start;
  filter: drop-shadow(0 8px 24px rgb(0 0 0 / 0.35));
}
/* O CTA final é um bloco centralizado: a marca acompanha o eixo do título. */
.dp-cta-mark { align-self: center; }

/* Micro utilitário: lista com marcador dourado (reaproveita ideia do pricing) */
.dp-check-list { display: flex; flex-direction: column; gap: var(--space-3); margin-top: var(--space-2); }
.dp-check-list li { display: flex; gap: var(--space-3); font-size: var(--fluid-16); color: var(--text-body); }
.dp-check-list li::before { content: "→"; color: var(--brand-accent); font-weight: var(--weight-medium); }

/* =========================================================================
   RODAPÉ
   ========================================================================= */
/* A marca do rodapé virou imagem: o <a> deixa de ser uma linha de texto e
   passa a ser só o contêiner do logotipo. */
.dp-footer-brand {
  display: inline-block;
  line-height: 0;
}
.dp-footer-logo {
  display: block;
  width: clamp(6.5rem, 15vw, 9rem);
  height: auto;
  object-fit: contain;
}
.dp-footer-about { max-width: 32ch; }
/* Filete dourado separando o rodapé do corpo da página. Feito com box-shadow
   inset, e não com border-image: border-image anula o border-radius, e o
   rodapé tem os cantos superiores arredondados. */
.ds-footer {
  box-shadow: inset 0 1px 0 rgb(212 175 55 / 0.28);
}

/* Ícones de card em formato de selo (imagens da pasta assets) */
.dp-feature-icon--badge {
  width: 3.5rem; height: 3.5rem;
  background: transparent;
  border: none;
  border-radius: 0;
  padding: 0;
  overflow: visible;
}
.dp-feature-icon--badge img {
  width: 100%; height: 100%;
  object-fit: contain;
  filter: drop-shadow(0 4px 10px rgb(0 0 0 / 0.28));
  transition: transform var(--duration-medium, 240ms) var(--ease-out, ease);
}
.ds-feature-card:hover .dp-feature-icon--badge img { transform: scale(1.06) rotate(-2deg); }

@media (prefers-reduced-motion: reduce) {
  .dp-feature-icon--badge img { transition: none; }
  .ds-feature-card:hover .dp-feature-icon--badge img { transform: none; }
}

/* =========================================================================
   MOBILE — TÍTULOS E TEXTOS CENTRALIZADOS (< 768px)
   -------------------------------------------------------------------------
   No celular todo o layout colapsa numa coluna única e estreita: alinhado à
   esquerda, cada bloco fica com uma borda direita irregular e o olho perde o
   eixo entre seções. Da §Assistente para baixo o conteúdo passa a ler
   centralizado. Nada disso vale a partir de 768px — no desktop as colunas
   continuam alinhadas à esquerda exatamente como estão.

   O escopo é `main`: navbar, drawer, Hero e rodapé ficam de fora. O acordeão
   do FAQ também fica: a pergunta é um controle com ícone à direita
   (space-between) e a resposta é texto corrido longo — centralizar os dois
   atrapalharia a leitura em vez de ajudar.
   ========================================================================= */
@media only screen and (max-width: 767px) {
  main .ds-section-header,
  main .dp-split-2 > .ds-flex-col,
  main .ds-feature-card,
  main .dp-privacy-body {
    text-align: center;
    align-items: center;
  }

  /* O card de mídia é um flex row: o chip é o único filho, então quem o move
     para o eixo central é o justify-content, não o text-align. */
  main .dp-media-card { justify-content: center; }

  /* Itens que se dimensionam pelo conteúdo precisam voltar a ocupar a largura
     toda: com align-items:center o flex item encolhe para o próprio tamanho. */
  main .dp-privacy-points,
  main .ds-feature-card .ds-btn--block { align-self: stretch; width: 100%; }
  /* .ds-immersive-card é um flex row: sem largura cheia o bloco de texto
     encolhe para o conteúdo e o "centro" vira o centro do bloco, não do card. */
  main .ds-immersive-card > .ds-flex-col { width: 100%; }

  /* Pílulas, eyebrows e marcas que se ancoravam à esquerda vão para o centro. */
  main .dp-inline-start,
  main .dp-privacy-mark,
  main .dp-plan .ds-badge { align-self: center; }

  /* Linhas internas em flex: o text-align não as move, só o justify-content. */
  main .dp-plan-price,
  main .ds-price-features li,
  main .dp-check-list li { justify-content: center; }

  /* Cartões de privacidade: check em cima, texto embaixo, tudo centralizado. */
  main .dp-privacy-point {
    flex-direction: column;
    align-items: center;
    text-align: center;
  }

  /* Timeline: o filete dourado continua na borda esquerda como elemento
     gráfico, mas ganha um respiro simétrico à direita para que o texto fique
     opticamente centralizado dentro do item. */
  main .ds-timeline-item {
    padding-right: var(--space-6);
    text-align: center;
  }

}

/* =========================================================================
   MOBILE — LARGURA ÚTIL DOS PAINÉIS DE PRIVACIDADE (§7) E CTA (§12)
   -------------------------------------------------------------------------
   Os dois são painéis de borda a borda com padding pensado no desktop, e no
   celular esse padding comia a tela: a 390px sobravam 294px úteis no card de
   Privacidade (--space-6, herdado do .ds-immersive-card) e apenas 230px no CTA
   (.ds-p-8 = 64px de cada lado). Com heading-2 em ~40px e .ds-split
   transformando cada palavra num inline-block — que não hifeniza nem quebra —
   "privacidade" e "inteligência" passavam a ocupar uma linha inteira sozinhas,
   e o cartão esticava para baixo. Duas correções somadas: devolver largura
   (padding menor) e baixar um degrau do tipo DENTRO destes painéis, que são
   mais estreitos que a coluna para a qual o --fluid-40 foi calibrado.
   Nada disso vale a partir de 768px.
   ========================================================================= */
@media only screen and (max-width: 767px) {
  /* 24px em vez de 32/64px: ~310px úteis, sem encostar no raio de 48px. */
  main .dp-privacy-card,
  main .dp-cta { padding-inline: var(--space-5); }

  /* Precisa do ancestral nos dois: o alvo real é
     .ds-heading[data-variant="heading-2"] (0,2,0) do responsive.css, e uma
     classe sozinha perde para ele. */
  main .dp-privacy-card .ds-heading,
  main .dp-cta .ds-heading { font-size: var(--fluid-32); }

  /* Larguras de medida calibradas para a coluna do desktop; aqui a caixa já é
     mais estreita que qualquer uma delas e o cap só estrangula o texto. */
  main .dp-cta-title,
  main .dp-cta-copy,
  main .dp-privacy-lede { max-width: 100%; }
}
