@charset "UTF-8";
/* ==========================================================================
   base — reset, tipografia, foco, movimento
   Primeiro arquivo do agregador. Nada aqui usa classe: sao os defaults que
   todo o resto assume.
   ========================================================================== */

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

/* `[hidden]` precisa vencer o `display` dos componentes.

   A folha do navegador define `[hidden] { display: none }`, e qualquer
   regra de autor com `display` — `.c-panel { display: flex }`, por
   exemplo — ganha dela. O resultado e um elemento marcado como oculto que
   continua visivel, e o sintoma aparece so na tela em que o JS esconde
   alguma coisa: o QR do PIX e o formulario de gerar o QR aparecendo os
   dois ao mesmo tempo. `!important` aqui e o uso legitimo do modificador:
   `hidden` e uma afirmacao sobre o documento, nao sobre o estilo. */
[hidden] { display: none !important; }

/* Zerar margem so em quem realmente estorva. `* { margin: 0 }` obriga a
   remontar espacamento de texto a mao em toda view. */
body, h1, h2, h3, h4, h5, h6, p, figure, blockquote, dl, dd, ul, ol, pre {
  margin: 0;
}
ul[class], ol[class] { padding: 0; list-style: none; }

html {
  /* 100% e nao 16px: px aqui ignora o tamanho de fonte que o usuario
     configurou no navegador, o que e falha de WCAG 1.4.4. */
  font-size: 100%;
  -webkit-text-size-adjust: 100%;
  scroll-behavior: smooth;
}

body {
  margin: 0;
  min-height: 100vh;
  font-family: var(--font-sans);
  font-size: var(--text-md);
  line-height: var(--lh-normal);
  color: var(--color-text-primary);
  background-color: var(--color-bg-canvas);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;

  /* O piso e 360px. Sem isto, uma tabela larga alarga o <body> e a pagina
     inteira ganha scroll horizontal — que e reprovacao direta no contrato. */
  overflow-wrap: break-word;
}

/* Titulos: peso e tracking da identidade atual (800 / -0.01em no painel). */
h1, h2, h3, h4, h5, h6 {
  font-weight: var(--fw-black);
  line-height: var(--lh-tight);
  letter-spacing: var(--tracking-snug);
  color: var(--color-text-primary);
}
h1 { font-size: var(--text-h1); }
h2 { font-size: var(--text-h2); }
h3 { font-size: var(--text-h3); }
h4 { font-size: var(--text-lg); font-weight: var(--fw-bold); }

a {
  color: inherit;
  text-decoration: none;
}
/* Link dentro de texto corrido sublinha. Link de navegacao nao — e por isso
   que a regra e escopada em <p>, <li> e .c-prose, e nao em `a`. */
p a, li a, .c-prose a {
  color: var(--color-text-link);
  text-decoration: underline;
  text-underline-offset: 2px;
}
p a:hover, li a:hover, .c-prose a:hover { color: var(--color-text-link-hover); }

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

button, input, select, textarea {
  font: inherit;
  color: inherit;
}
button { background: none; border: 0; padding: 0; cursor: pointer; }

/* Numero monetario e quantidade usam figura tabular sempre que aparecem em
   coluna. A largura fixa do digito e o que faz a virgula alinhar. */
table { border-collapse: collapse; width: 100%; }
th { text-align: left; font-weight: var(--fw-semibold); }

code, kbd, samp, pre {
  font-family: var(--font-mono);
  font-size: 0.925em;
}

hr {
  border: 0;
  border-top: 1px solid var(--color-border);
  margin: var(--sp-5) 0;
}

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

::selection {
  background-color: var(--color-selection-bg);
  color: var(--color-selection-fg);
}

/* --------------------------------------------------------------------------
   FOCO
   `:focus-visible` e nao `:focus`: o anel precisa aparecer para quem navega
   por teclado e nao precisa piscar a cada clique de mouse. Foco invisivel
   bloqueia merge.
   outline (e nao box-shadow) porque acompanha border-radius e sobrevive a
   overflow:hidden do cartao pai.
   -------------------------------------------------------------------------- */
:where(a, button, input, select, textarea, summary, [tabindex]):focus-visible {
  outline: 2px solid var(--color-focus-ring);
  outline-offset: 2px;
  border-radius: var(--radius-xs);
}

/* Quando o elemento ja tem raio proprio, o outline herda dele — a regra
   acima so cobre o caso sem raio. */
.c-btn:focus-visible,
.c-pill:focus-visible,
.c-nav__item:focus-visible { border-radius: inherit; }

/* Alvo clicavel de 44px no toque. Por media query de ponteiro e nao por
   largura: tablet grande tambem e dedo.

   `:where()` tem especificidade zero de proposito — esta regra e a rede de
   seguranca para <a> e <button> SEM classe de componente. Componente que
   define altura propria (.c-btn, .c-tabs__item, .c-message__close ...) tem
   especificidade maior e precisa repetir o piso no proprio arquivo. Cada um
   deles tem o seu bloco @media (pointer: coarse); se algum faltar, o teste
   de alvo de toque acusa. */
@media (pointer: coarse) {
  :where(a[href], button, [role="button"], summary, label.c-check) {
    min-height: var(--tap-min);
  }
}

/* --------------------------------------------------------------------------
   MOVIMENTO REDUZIDO
   Desligar tudo, inclusive o smooth scroll. Quem liga essa preferencia
   costuma faze-lo por enjoo de movimento, nao por gosto.
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation-duration: 1ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 1ms !important;
    scroll-behavior: auto !important;
  }
}

/* --------------------------------------------------------------------------
   Utilitarios — sao cinco e param aqui. Utilitario demais vira framework e o
   contrato pede componente.
   -------------------------------------------------------------------------- */

/* Texto so para leitor de tela. E o que permite <button> com icone passar no
   lint de "botao sem texto nem aria-label" sem poluir a tela. */
.u-sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip-path: inset(50%);
  white-space: nowrap;
  border: 0;
}

/* Figura tabular + variante sem ligadura: digito de largura fixa. */
.u-tabular { font-variant-numeric: tabular-nums; font-feature-settings: "tnum" 1; }

.u-truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  min-width: 0;
}

.u-mono { font-family: var(--font-mono); }

/* Ancora de pular para o conteudo. Fica escondida ate receber foco. */
.u-skip {
  position: absolute;
  left: var(--sp-3);
  top: -100px;
  z-index: var(--z-toast);
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-surface);
  color: var(--color-text-primary);
  box-shadow: var(--shadow-2);
  font-weight: var(--fw-bold);
  transition: top var(--dur-fast) var(--ease-out);
}
.u-skip:focus { top: var(--sp-3); }

/* Texto corrido (post do blog, termos, FAQ longa). */
.c-prose {
  max-width: var(--prose-max);
  font-size: var(--text-xl);
  line-height: var(--lh-relaxed);
  color: var(--color-text-secondary);
}
.c-prose > * + * { margin-top: var(--sp-4); }
.c-prose h2 { margin-top: var(--sp-7); }
.c-prose h3 { margin-top: var(--sp-6); }

/* Sair (A7): botão com cara de item de navegação, no pé da sidebar. */
.c-shell__logout { margin-top: auto; padding-top: var(--sp-4); border-top: 1px solid var(--color-border); }
.c-nav__item--button { width: 100%; background: none; border: 0; font: inherit; text-align: left; cursor: pointer; }

/* Captura de tela da operação (servida por rota autenticada). */
.c-trade-shot { display: block; margin: var(--sp-3) 0; }
.c-trade-shot img { display: block; max-width: 100%; height: auto; border: 1px solid var(--color-border); border-radius: var(--radius-sm); }

/* ==========================================================================
   shell — o esqueleto do painel
   Sidebar + area de trabalho. Mobile-first: o default e a gaveta; a partir
   de 720px a sidebar vira trilho fixo.

   O corte em 720px e o mesmo do sistema atual (e o mesmo do <table> virando
   cartao). Um breakpoint so para as duas mudancas evita o estado intermediario
   em que a tabela ja e tabela mas a navegacao ainda e gaveta.
   ========================================================================== */

.c-shell {
  display: grid;
  grid-template-columns: 1fr;
  min-height: 100vh;
  min-height: 100dvh;   /* dvh tira a barra do navegador movel da conta */
}

/* --------------------------------------------------------------------------
   Sidebar / gaveta
   -------------------------------------------------------------------------- */
.c-shell__side {
  position: fixed;
  inset: 0 auto 0 0;
  z-index: var(--z-drawer);
  width: var(--drawer-w);
  max-width: 88vw;
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
  padding: var(--sp-4) var(--sp-3);
  overflow-y: auto;
  overscroll-behavior: contain;
  background-color: var(--color-nav-bg);
  color: var(--color-nav-fg);
  box-shadow: var(--shadow-3);

  /* Fechada por padrao no mobile. translate e nao display:none para que a
     gaveta deslize e para que o foco dentro dela continue programavel. */
  transform: translateX(-100%);
  visibility: hidden;
  transition: transform var(--dur-base) var(--ease-out), visibility var(--dur-base);
}
.c-shell__side[data-open="true"] {
  transform: translateX(0);
  visibility: visible;
}

/* Vidraca que escurece o conteudo com a gaveta aberta. Clicar nela fecha. */
.c-shell__scrim {
  position: fixed;
  inset: 0;
  z-index: var(--z-backdrop);
  background-color: var(--color-bg-backdrop);
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--dur-base) var(--ease-out), visibility var(--dur-base);
}
.c-shell__scrim[data-open="true"] { opacity: 1; visibility: visible; }

.c-shell__brand {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  padding: var(--sp-2) var(--sp-3) var(--sp-3);
  font-size: var(--text-xl);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-snug);
  color: var(--color-nav-fg-strong);
}
.c-shell__mark {
  flex: none;
  width: 28px;
  height: 28px;
  display: grid;
  place-items: center;
  border-radius: var(--radius-xs);
  background-image: var(--color-brand-gradient);
  color: var(--c0); /* símbolo branco no gradiente, como nos outros SaaS */
  font-size: var(--text-sm);
}

.c-shell__close {
  position: absolute;
  top: var(--sp-3);
  right: var(--sp-3);
  width: var(--tap-min);
  height: var(--tap-min);
  display: grid;
  place-items: center;
  border-radius: var(--radius-sm);
  background-color: var(--color-nav-hover-bg);
  color: var(--color-nav-fg-strong);
}

/* Bloco do usuario: foto, nome, selo de plano. */
.c-shell__user {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-3);
  margin: var(--sp-2) 0 var(--sp-3);
  border-top: 1px solid var(--color-nav-border);
  border-bottom: 1px solid var(--color-nav-border);
}
.c-shell__avatar {
  flex: none;
  width: 36px;
  height: 36px;
  border-radius: var(--radius-pill);
  object-fit: cover;
  background-color: var(--color-nav-hover-bg);
}
.c-shell__username {
  flex: 1;
  min-width: 0;
  font-size: var(--text-md);
  font-weight: var(--fw-semibold);
  color: var(--color-nav-fg-strong);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* --------------------------------------------------------------------------
   Navegacao
   -------------------------------------------------------------------------- */
.c-nav {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
}
.c-nav__section {
  padding: var(--sp-4) var(--sp-3) var(--sp-2);
  font-size: var(--text-2xs);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  color: var(--color-nav-fg);
  opacity: 0.7;
}
.c-nav__item {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-height: var(--tap-min);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--radius-sm);
  font-size: var(--text-md);
  font-weight: var(--fw-medium);
  color: var(--color-nav-fg);
  transition: background-color var(--dur-fast) var(--ease-out),
              color var(--dur-fast) var(--ease-out);
}
.c-nav__icon { flex: none; width: 18px; height: 18px; opacity: 0.85; }
.c-nav__item[aria-current="page"] .c-nav__icon { opacity: 1; }

/* Mouse: menu inteiro sem rolar no notebook (S249). */
@media (pointer: fine) {
  .c-nav__item { min-height: 36px; padding-block: var(--sp-1); }
  .c-nav__section { padding-top: var(--sp-3); padding-bottom: var(--sp-1); }
}

.u-sprite { position: absolute; width: 0; height: 0; overflow: hidden; }
.c-nav__item:hover { background-color: var(--color-nav-hover-bg); color: var(--color-nav-fg-strong); }

/* Item atual. `aria-current="page"` e o seletor, e nao uma classe: assim o
   estado visual e o estado anunciado pelo leitor de tela nao podem divergir. */
.c-nav__item[aria-current="page"] {
  background-color: var(--color-nav-active-bg);
  color: var(--color-nav-active-fg);
  font-weight: var(--fw-bold);
}

/* Contador a direita do item (posicoes abertas, pendencias). */
.c-nav__count {
  margin-left: auto;
  padding: 1px var(--sp-2);
  border-radius: var(--radius-pill);
  background-color: var(--color-nav-hover-bg);
  color: var(--color-nav-fg-strong);
  font-size: var(--text-2xs);
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
}

/* --------------------------------------------------------------------------
   Area de trabalho
   -------------------------------------------------------------------------- */
.c-shell__main {
  min-width: 0;   /* sem isto um <table> largo estica o grid e cria scroll horizontal */
  display: flex;
  flex-direction: column;
}

.c-workspace {
  width: 100%;
  max-width: var(--workspace-max);
  margin: 0 auto;
  padding: var(--sp-4) var(--sp-4) var(--sp-8);
  min-width: 0;
}

/* --------------------------------------------------------------------------
   Barra de topo
   Sticky: o filtro de conta e o titulo da tela precisam continuar visiveis
   depois de 200 linhas de historico.
   -------------------------------------------------------------------------- */
.c-topbar {
  position: sticky;
  top: 0;
  z-index: var(--z-sticky);
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
  padding: var(--sp-3) var(--sp-4);
  margin: calc(var(--sp-4) * -1) calc(var(--sp-4) * -1) var(--sp-4);
  background-color: var(--color-bg-canvas);
  border-bottom: 1px solid var(--color-border-subtle);
}
.c-topbar__title {
  font-size: var(--text-h1);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-snug);
  min-width: 0;
}
.c-topbar__sub {
  width: 100%;
  order: 3;
  font-size: var(--text-sm);
  color: var(--color-text-muted);
}
.c-topbar__actions { margin-left: auto; display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); max-width: 100%; }

.c-burger {
  flex: none;
  width: var(--tap-min);
  height: var(--tap-min);
  display: grid;
  place-items: center;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-surface);
  color: var(--color-text-secondary);
  font-size: var(--text-xl);
}

/* --------------------------------------------------------------------------
   Filtro de conta
   Nao e enfeite de cabecalho: metrica de conta simulada nunca soma com a
   real, entao a conta selecionada muda o significado de TODO numero da tela.
   Por isso ele fica no topo, sempre visivel, e ganha estado proprio quando a
   conta e simulada.
   -------------------------------------------------------------------------- */
.c-account {
  position: relative;
  display: inline-flex;
  min-width: 0;
}
.c-account__toggle {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: var(--tap-min);
  max-width: 100%;
  padding: var(--sp-2) var(--sp-4);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-pill);
  background-color: var(--color-bg-surface);
  color: var(--color-text-secondary);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
  transition: border-color var(--dur-fast) var(--ease-out);
}
.c-account__toggle:hover { border-color: var(--color-brand); }
.c-account__name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.c-account__caret { margin-left: auto; font-size: var(--text-2xs); color: var(--color-text-muted); }
.c-account[data-open="true"] .c-account__caret { transform: rotate(180deg); }

/* Conta simulada selecionada: a pilula inteira ganha a cor reservada e a
   listra. Impossivel confundir a leitura da tela com a conta real. */
.c-account[data-kind="simulated"] .c-account__toggle {
  border-color: var(--color-sim-border);
  background-color: var(--color-sim-subtle);
  color: var(--color-sim-text);
}

.c-account__menu {
  position: absolute;
  top: calc(100% + var(--sp-2));
  right: 0;
  z-index: var(--z-dropdown);
  min-width: 240px;
  max-height: 340px;
  overflow-y: auto;
  padding: var(--sp-2);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-raised);
  box-shadow: var(--shadow-2);
}
.c-account__menu[hidden] { display: none; }
.c-account__option {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  width: 100%;
  min-height: var(--tap-min);
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--radius-sm);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
  color: var(--color-text-secondary);
  text-align: left;
}
.c-account__option:hover { background-color: var(--color-bg-subtle); color: var(--color-text-primary); }
.c-account__option[aria-selected="true"] {
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
}

/* --------------------------------------------------------------------------
   Faixa global de conta simulada
   Quando a conta ativa e simulada, o painel inteiro recebe esta faixa no
   topo. Custa 4px de altura e elimina a pior classe de erro do produto:
   olhar um resultado de treino achando que e dinheiro.
   -------------------------------------------------------------------------- */
.c-shell__simbar {
  height: 4px;
  background-image: repeating-linear-gradient(
    135deg,
    var(--color-sim) 0 8px,
    var(--color-sim-stripe) 8px 16px
  );
}

.c-workspace__footer {
  margin-top: var(--sp-7);
  font-size: var(--text-xs);
  color: var(--color-text-muted);
  text-align: center;
}

/* --------------------------------------------------------------------------
   >= 720px — a gaveta vira trilho
   -------------------------------------------------------------------------- */
@media (min-width: 720px) {
  .c-shell { grid-template-columns: var(--sidebar-w) 1fr; }

  .c-shell__side {
    position: sticky;
    top: 0;
    inset-inline-start: auto;
    width: auto;
    max-width: none;
    height: 100vh;
    height: 100dvh;
    transform: none;
    visibility: visible;
    box-shadow: none;
    transition: none;
  }
  .c-shell__close,
  .c-shell__scrim,
  .c-burger { display: none; }

  .c-workspace { padding: var(--sp-5) var(--sp-6) var(--sp-8); }
  .c-topbar {
    padding: var(--sp-4) var(--sp-6);
    margin: calc(var(--sp-5) * -1) calc(var(--sp-6) * -1) var(--sp-5);
  }
  .c-topbar__sub { width: auto; order: 0; }
}

/* --------------------------------------------------------------------------
   Grade de conteudo do painel
   -------------------------------------------------------------------------- */
.c-grid {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--row-gap);
}
.c-grid + .c-grid { margin-top: var(--row-gap); }

@media (min-width: 1024px) {
  /* Principal + lateral. 1.6/1 e a proporcao do painel atual. */
  .c-grid--main-aside { grid-template-columns: 1.6fr 1fr; align-items: start; }
  .c-grid--halves     { grid-template-columns: 1fr 1fr; }
  .c-grid--thirds     { grid-template-columns: repeat(3, 1fr); }
}



/* ==========================================================================
   c-btn
   Quatro intencoes (primario, secundario, ghost, perigo) x tres tamanhos.
   Nada alem disso: um sistema com nove botoes e um sistema em que ninguem
   sabe qual usar.
   ========================================================================== */

.c-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  min-height: var(--control-h);
  padding: 0 var(--sp-5);
  border: 1px solid transparent;
  border-radius: var(--radius-pill);
  font-size: var(--text-md);
  font-weight: var(--fw-bold);
  line-height: 1.2;
  white-space: nowrap;
  text-align: center;
  cursor: pointer;
  user-select: none;
  transition: background-color var(--dur-fast) var(--ease-out),
              border-color var(--dur-fast) var(--ease-out),
              color var(--dur-fast) var(--ease-out),
              transform var(--dur-fast) var(--ease-out);
}

/* Micro-interacao: 1px para BAIXO no clique, nada no hover.
   O sistema atual levanta o botao 2px no hover. Numa landing isso funciona;
   num painel onde o cursor cruza dez botoes por minuto, vira ruido. O
   feedback de clique, ao contrario, e informacao. */
.c-btn:active:not([disabled]):not([aria-busy="true"]) { transform: translateY(1px); }

.c-btn[disabled],
.c-btn[aria-disabled="true"] {
  cursor: not-allowed;
  opacity: 0.55;
  transform: none;
}

.c-btn__icon { flex: none; width: 1em; height: 1em; }

/* --------------------------------------------------------------------------
   Primario — o gradiente da marca, com tinta ESCURA
   Branco sobre a parada clara do gradiente da 2,05:1 e reprova AA. O
   gradiente continua sendo o de producao; o que mudou foi a tinta, que agora
   e --color-text-on-brand (tinta escura, 6,14:1 no pior ponto do gradiente).
   A conta esta em themes/light.css, unico lugar onde os valores podem morar.
   -------------------------------------------------------------------------- */
.c-btn--primary {
  background-image: var(--color-brand-gradient);
  color: var(--color-text-on-brand);
  box-shadow: var(--shadow-1);
}
.c-btn--primary:hover:not([disabled]) { filter: saturate(1.08) brightness(1.04); }

/* --------------------------------------------------------------------------
   Secundario — a acao que nao e a principal, mas e comum
   -------------------------------------------------------------------------- */
.c-btn--secondary {
  background-color: var(--color-bg-surface);
  border-color: var(--color-border-strong);
  color: var(--color-text-secondary);
}
.c-btn--secondary:hover:not([disabled]) {
  border-color: var(--color-brand);
  color: var(--color-brand-text);
}

/* --------------------------------------------------------------------------
   Ghost — acao terciaria e barra de ferramentas
   -------------------------------------------------------------------------- */
.c-btn--ghost {
  background-color: transparent;
  color: var(--color-text-muted);
}
.c-btn--ghost:hover:not([disabled]) {
  background-color: var(--color-bg-subtle);
  color: var(--color-text-primary);
}

/* --------------------------------------------------------------------------
   Perigo — apagar conta, excluir evento, cancelar assinatura
   Contorno por padrao. O preenchimento solido fica so para a confirmacao
   dentro do modal, onde ja nao ha como clicar por engano.
   -------------------------------------------------------------------------- */
.c-btn--danger {
  background-color: transparent;
  border-color: var(--color-danger-border);
  color: var(--color-danger-text);
}
.c-btn--danger:hover:not([disabled]) { background-color: var(--color-danger-subtle); }

.c-btn--danger-solid {
  background-color: var(--color-danger-solid);
  color: var(--color-text-on-solid);
}
.c-btn--danger-solid:hover:not([disabled]) { filter: brightness(1.06); }

/* --------------------------------------------------------------------------
   Tamanhos
   O `sm` cai abaixo de 44px e por isso so vale em ponteiro fino — a regra
   de (pointer: coarse) no base.css devolve os 44px no toque.
   -------------------------------------------------------------------------- */
.c-btn--sm { min-height: var(--control-h-sm); padding: 0 var(--sp-3); font-size: var(--text-sm); }
.c-btn--lg { min-height: var(--control-h-lg); padding: 0 var(--sp-6); font-size: var(--text-xl); }

/* Botao so de icone: quadrado, e obrigatoriamente com .u-sr-only dentro ou
   aria-label — botao sem nome acessivel bloqueia merge. */
.c-btn--icon { padding: 0; width: var(--control-h); }
.c-btn--icon.c-btn--sm { width: var(--control-h-sm); }
.c-btn--icon.c-btn--lg { width: var(--control-h-lg); }

/* Largura total — no mobile a acao principal de formulario ocupa a linha. */
.c-btn--block { width: 100%; }

/* Piso de toque. Repetido aqui porque .c-btn (0,1,0) vence a rede de
   seguranca de base.css, que e `:where()` e vale zero. */
@media (pointer: coarse) {
  .c-btn,
  .c-btn--sm,
  .c-btn--lg { min-height: var(--tap-min); }
  .c-btn--icon,
  .c-btn--icon.c-btn--sm,
  .c-btn--icon.c-btn--lg { width: var(--tap-min); }
}

/* --------------------------------------------------------------------------
   Carregando
   O estado e `aria-busy="true"` e nao uma classe: o leitor de tela precisa
   saber que a acao esta em curso. O rotulo continua visivel (nao sumir com o
   texto evita o "pulo" de largura do botao) e um disco gira ao lado.
   -------------------------------------------------------------------------- */
.c-btn[aria-busy="true"] {
  cursor: progress;
  pointer-events: none;
}
.c-btn[aria-busy="true"]::before {
  content: "";
  flex: none;
  width: 1em;
  height: 1em;
  border: 2px solid currentColor;
  border-top-color: transparent;
  border-radius: var(--radius-pill);
  opacity: 0.9;
  animation: c-btn-spin 600ms linear infinite;
}
@keyframes c-btn-spin { to { transform: rotate(360deg); } }

/* Sem animacao: um disco parado e meio-vazio ainda comunica "em curso". */
@media (prefers-reduced-motion: reduce) {
  .c-btn[aria-busy="true"]::before { animation: none; }
}

/* --------------------------------------------------------------------------
   Grupo
   -------------------------------------------------------------------------- */
.c-btn-group {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  align-items: center;
}
.c-btn-group--end { justify-content: flex-end; }

/* No mobile a barra de acoes empilha e a principal vem primeiro na tela,
   mesmo vindo depois no HTML (a ordem do DOM segue o foco natural). */
@media (max-width: 479px) {
  .c-btn-group--stack { flex-direction: column-reverse; align-items: stretch; }
  .c-btn-group--stack .c-btn { width: 100%; }
}

/* ==========================================================================
   c-field — rotulo, controle, dica, erro
   Um campo e sempre: <label> + controle + (dica | erro). Nunca placeholder
   fazendo as vezes de rotulo — o rotulo some quando o usuario digita e some
   para o leitor de tela.
   ========================================================================== */

.c-field {
  display: flex;
  flex-direction: column;
  gap: var(--sp-2);
  min-width: 0;
}

.c-field__label {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 2px var(--sp-2);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
  color: var(--color-text-secondary);
}
/* Obrigatorio marcado por palavra e nao so por asterisco: asterisco sozinho
   nao e lido como "obrigatorio" por leitor de tela nenhum. */
.c-field__required {
  font-size: var(--text-2xs);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  color: var(--color-text-muted);
}

.c-field__control,
.c-field > input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
.c-field > select,
.c-field__select > select,
.c-field > textarea {
  width: 100%;
  min-height: var(--control-h);
  padding: var(--sp-2) var(--sp-3);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-surface);
  color: var(--color-text-primary);

  /* 16px abaixo de 720px nao e escolha estetica: o Safari do iPhone DA ZOOM
     em qualquer input com fonte menor que 16px ao receber foco, e o usuario
     sai da tela sem entender por que. Acima de 720px volta para 14px. */
  font-size: 16px;
  line-height: var(--lh-snug);
  transition: border-color var(--dur-fast) var(--ease-out);
}

@media (min-width: 720px) {
  .c-field__control,
  .c-field > input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
  .c-field > select,
  .c-field__select > select,
  .c-field > textarea { font-size: var(--text-md); }
}

.c-field > textarea { min-height: 96px; resize: vertical; }

.c-field > select,
.c-field__select > select {
  appearance: none;
  padding-right: var(--sp-7);
  /* A seta e desenhada com borda e nao com imagem: sem requisicao, sem SVG
     inline em data-uri (que carregaria cor literal) e herda currentColor. */
  background-image: none;
}
.c-field__select {
  position: relative;
  display: flex;
  align-items: center;
}
.c-field__select::after {
  content: "";
  position: absolute;
  right: var(--sp-4);
  width: 7px;
  height: 7px;
  border-right: 2px solid var(--color-text-muted);
  border-bottom: 2px solid var(--color-text-muted);
  transform: translateY(-2px) rotate(45deg);
  pointer-events: none;
}

.c-field > :is(input, select, textarea):hover:not([disabled]),
.c-field__select > select:hover:not([disabled]) { border-color: var(--color-text-muted); }
.c-field > :is(input, select, textarea):focus-visible,
.c-field__select > select:focus-visible {
  border-color: var(--color-focus-ring);
  outline: 2px solid var(--color-focus-ring);
  outline-offset: 0;
  box-shadow: 0 0 0 3px var(--color-focus-halo);
}
.c-field :is(input, select, textarea)[disabled],
.c-field :is(input, select, textarea)[readonly],
.c-field__control[disabled],
.c-field__control[readonly] {
  background-color: var(--color-bg-inset);
  color: var(--color-text-disabled);
  cursor: not-allowed;
}

.c-field__hint {
  font-size: var(--text-xs);
  font-weight: var(--fw-regular);   /* nao herda o negrito do <legend> pai */
  line-height: var(--lh-snug);
  color: var(--color-text-muted);
}

/* Erro. O seletor de estado e `aria-invalid` no controle, nao uma classe no
   wrapper: assim a moldura vermelha e a mensagem anunciada nascem do mesmo
   atributo e nao podem ficar fora de sincronia. */
.c-field__error {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-2);
  font-size: var(--text-xs);
  font-weight: var(--fw-semibold);
  line-height: var(--lh-snug);
  color: var(--color-danger-text);
}
.c-field__error::before {
  /* Triangulo desenhado em clip-path. Nao depende de fonte de icone: se a
     Font Awesome falhar, a mensagem de erro continua tendo forma de erro. */
  content: "";
  flex: none;
  width: 14px;
  height: 14px;
  margin-top: 1px;
  background-color: var(--color-danger);
  clip-path: polygon(50% 0%, 100% 100%, 0% 100%);
}
.c-field :is(input, select, textarea)[aria-invalid="true"] {
  border-color: var(--color-danger);
  background-color: var(--color-danger-subtle);
}

/* --------------------------------------------------------------------------
   Linha de campos
   Mobile-first: uma coluna. A partir de 720px, duas — e `--cols` permite
   tres ou quatro sem classe nova.
   -------------------------------------------------------------------------- */
.c-field-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-4);
}
.c-field-row + .c-field-row,
.c-field + .c-field,
.c-field-row + .c-field,
.c-field + .c-field-row { margin-top: var(--sp-4); }
/* Na mesma linha o espaço é o `gap` da grade: a margem acima desalinhava
   do primeiro campo todos os outros da linha (S249). */
.c-field-row > .c-field + .c-field { margin-top: 0; }

@media (min-width: 720px) {
  .c-field-row { grid-template-columns: repeat(var(--cols, 2), minmax(0, 1fr)); }
  /* Campo que precisa da linha inteira mesmo dentro de uma linha de tres. */
  .c-field-row > .c-field--full { grid-column: 1 / -1; }
}

/* --------------------------------------------------------------------------
   Campo monetario
   Prefixo "R$" colado no controle, dentro da moldura. Separar o simbolo do
   numero e o que permite alinhar o valor a direita com figura tabular sem
   que o "R$" ande junto.
   -------------------------------------------------------------------------- */
.c-field--money .c-field__group,
.c-field--qty .c-field__group {
  display: flex;
  align-items: stretch;
  min-height: var(--control-h);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-surface);
  overflow: hidden;
}

/* O input dentro do grupo nao e filho direto de .c-field, entao nao herda a
   regra base — precisa da propria altura e do proprio respiro, senao o grupo
   inteiro colapsa para a altura da linha de texto. */
.c-field__group input {
  flex: 1;
  min-width: 0;
  min-height: var(--control-h);
  padding: var(--sp-2) var(--sp-3);
  background-color: transparent;
  color: var(--color-text-primary);
  font-size: 16px;                 /* mesmo motivo do zoom do iOS */
  line-height: var(--lh-snug);
}
@media (min-width: 720px) {
  .c-field__group input { font-size: var(--text-md); }
}
.c-field--money .c-field__group:focus-within,
.c-field--qty .c-field__group:focus-within {
  border-color: var(--color-focus-ring);
  box-shadow: 0 0 0 3px var(--color-focus-halo);
}
.c-field__prefix,
.c-field__suffix {
  display: flex;
  align-items: center;
  padding: 0 var(--sp-3);
  background-color: var(--color-bg-inset);
  color: var(--color-text-muted);
  font-size: var(--text-sm);
  font-weight: var(--fw-bold);
  white-space: nowrap;
}
.c-field__prefix { border-right: 1px solid var(--color-border); }
.c-field__suffix { border-left: 1px solid var(--color-border); }

.c-field--money .c-field__group input {
  border: 0;
  border-radius: 0;
  text-align: right;
  font-variant-numeric: tabular-nums;
  font-weight: var(--fw-semibold);
}
.c-field--money .c-field__group:focus-within input,
.c-field--qty .c-field__group:focus-within input { box-shadow: none; outline: none; }

/* Valor negativo digitado (custo, prejuizo lancado a mao) fica vermelho ao
   vivo — o usuario ve o sinal antes de salvar. */
.c-field--money .c-field__group input[data-sign="negative"] { color: var(--color-loss-text); }

/* --------------------------------------------------------------------------
   Campo de quantidade
   Passo com dois botoes. Quantidade e inteiro escalado no dominio, entao o
   passo vem do atributo `step` do input e nao de constante no CSS.
   -------------------------------------------------------------------------- */
.c-field--qty .c-field__group input {
  border: 0;
  border-radius: 0;
  text-align: center;
  font-variant-numeric: tabular-nums;
  font-weight: var(--fw-bold);
  /* Some com a setinha nativa: ela e minuscula e inalcancavel no toque. */
  appearance: textfield;
}
.c-field--qty .c-field__group input::-webkit-outer-spin-button,
.c-field--qty .c-field__group input::-webkit-inner-spin-button { appearance: none; margin: 0; }

.c-field__step {
  flex: none;
  width: var(--tap-min);
  display: grid;
  place-items: center;
  background-color: var(--color-bg-inset);
  color: var(--color-text-secondary);
  font-size: var(--text-xl);
  font-weight: var(--fw-bold);
  line-height: 1;
}
.c-field__step:first-child { border-right: 1px solid var(--color-border); }
.c-field__step:last-child  { border-left: 1px solid var(--color-border); }
.c-field__step:hover { background-color: var(--color-bg-subtle); color: var(--color-text-primary); }

/* --------------------------------------------------------------------------
   Caixa de selecao e radio
   -------------------------------------------------------------------------- */
.c-check {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-3);
  cursor: pointer;
  font-size: var(--text-sm);
  line-height: var(--lh-snug);
  color: var(--color-text-secondary);
}
.c-check input {
  flex: none;
  width: 18px;
  height: 18px;
  margin: 1px 0 0;
  accent-color: var(--color-brand);
  cursor: pointer;
}
.c-check__text { min-width: 0; }
.c-check__hint {
  display: block;
  margin-top: 2px;
  font-size: var(--text-xs);
  color: var(--color-text-muted);
}

/* Escolha em pilula (tipo de evento, real/simulada, comprado/vendido). */
.c-choice { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.c-choice__item {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  min-height: var(--tap-min);
  padding: 0 var(--sp-4);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-pill);
  background-color: var(--color-bg-surface);
  color: var(--color-text-secondary);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
  cursor: pointer;
}
.c-choice__item input { position: absolute; opacity: 0; pointer-events: none; }
.c-choice__item:has(input:checked) {
  border-color: var(--color-brand);
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
}
/* `:has()` nao chega a navegador antigo. A classe abaixo e o mesmo estado
   escrito pelo PHP na renderizacao, entao o estado inicial funciona sem JS
   e sem `:has()`. */
.c-choice__item.is-checked {
  border-color: var(--color-brand);
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
}
.c-choice__item:has(input:focus-visible) {
  outline: 2px solid var(--color-focus-ring);
  outline-offset: 2px;
}

/* Conjunto de campos com titulo (setup, emocional, custos). */
.c-fieldset { border: 0; padding: 0; margin: 0; min-width: 0; }
.c-fieldset > legend {
  padding: 0;
  margin-bottom: var(--sp-3);
  font-size: var(--text-lg);
  font-weight: var(--fw-bold);
  color: var(--color-text-primary);
}
.c-fieldset + .c-fieldset {
  margin-top: var(--sp-6);
  padding-top: var(--sp-6);
  border-top: 1px solid var(--color-border-subtle);
}

/* No toque, campo tambem e alvo: 44px de altura minima em input, select e
   grupo. A regra de base.css cobre so <a>, <button> e <summary>. */
/* Repete a MESMA forma de seletor da regra de tamanho la de cima. Se aqui
   fosse so `.c-field__control`, a regra base (que casa tambem por
   `.c-field > input:not(...)`, especificidade maior) venceria e o campo
   ficaria com 40px no celular. */
@media (pointer: coarse) {
  .c-field__control,
  .c-field > input:not([type="checkbox"]):not([type="radio"]):not([type="file"]),
  .c-field > select,
  .c-field__group,
  .c-field__group input { min-height: var(--tap-min); }
  .c-field__step { width: var(--tap-min); }
}

.c-form__actions {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: flex-end;
  gap: var(--sp-3);
  margin-top: var(--sp-6);
}

/* ==========================================================================
   c-pill — estado em uma palavra
   Status de posicao, tipo de operacao, plano, selo de conta.
   Nao e botao: se clica, e .c-btn. Se filtra, e .c-choice.
   ========================================================================== */

.c-pill {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  padding: 3px var(--sp-3);
  border: 1px solid transparent;
  border-radius: var(--radius-pill);
  font-size: var(--text-2xs);
  font-weight: var(--fw-bold);
  line-height: 1.5;
  white-space: nowrap;
  vertical-align: middle;
}

/* Ponto colorido antes do texto. Aparece so quando a view pede
   `.c-pill--dot`: em coluna de status com dez linhas ele ajuda; dentro de
   frase ele atrapalha. */
.c-pill--dot::before {
  content: "";
  flex: none;
  width: 7px;
  height: 7px;
  border-radius: var(--radius-pill);
  background-color: currentColor;
}

/* --------------------------------------------------------------------------
   Tons
   Fundo tenue + texto no degrau escuro da mesma rampa. Todos medidos acima
   de 4,5:1 sobre o proprio fundo (ver themes/light.css).
   -------------------------------------------------------------------------- */
.c-pill--ok      { background-color: var(--color-gain-subtle);    color: var(--color-gain-text); }
.c-pill--warn    { background-color: var(--color-warn-subtle);    color: var(--color-warn-text); }
.c-pill--danger  { background-color: var(--color-danger-subtle);  color: var(--color-danger-text); }
.c-pill--info    { background-color: var(--color-info-subtle);    color: var(--color-info-text); }
.c-pill--neutral { background-color: var(--color-neutral-subtle); color: var(--color-neutral-text); }
.c-pill--brand   { background-color: var(--color-brand-subtle);   color: var(--color-brand-text); }

/* Contorno — quando a pilula fica sobre fundo ja colorido (dentro de um KPI
   de destaque, sobre a sidebar). */
.c-pill--outline {
  background-color: transparent;
  border-color: currentColor;
}

/* --------------------------------------------------------------------------
   SELO DE CONTA SIMULADA
   --------------------------------------------------------------------------
   Este e o componente mais importante deste arquivo e o unico com tres
   canais de informacao simultaneos:

     1. COR      violeta, hue que nao e usado por mais nada no produto
     2. TEXTURA  listra diagonal, que sobrevive a daltonismo, a impressao em
                 preto e branco e a visao periferica
     3. FORMA    borda tracejada, diferente de toda outra pilula do sistema

   Motivo: "metrica de conta simulada nunca soma com a real" e regra de
   dominio. A unica forma de o usuario violar essa regra e confundindo as
   duas na tela. O selo existe para tornar essa confusao impossivel, nao
   improvavel.

   O TEXTO ("Simulada") vem do HTML, nunca de `content:`, porque precisa
   passar pelo lang/ e ser lido por leitor de tela.
   -------------------------------------------------------------------------- */
.c-pill--sim {
  padding-inline: var(--sp-3);
  border: 1px dashed var(--color-sim-border);
  background-color: var(--color-sim-subtle);
  background-image: repeating-linear-gradient(
    135deg,
    transparent 0 5px,
    var(--color-sim-stripe) 5px 10px
  );
  color: var(--color-sim-text);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
}

/* Selo de conta real. Existe pelo mesmo motivo do de cima: quando as duas
   pilulas aparecem juntas numa lista de contas, a ausencia de selo seria
   ambigua. Solido, sem textura, sem tracejado. */
.c-pill--real {
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
}

/* --------------------------------------------------------------------------
   Pilula em fundo escuro (sidebar, hero, KPI de destaque)
   -------------------------------------------------------------------------- */
.c-pill--on-dark {
  background-color: var(--color-nav-hover-bg);
  color: var(--color-nav-fg-strong);
}

/* Grupo de pilulas com quebra controlada. */
.c-pill-group { display: flex; flex-wrap: wrap; gap: var(--sp-2); align-items: center; }

/* --------------------------------------------------------------------------
   Chip de metrica — rodape de lista ("42 operacoes", "win rate 61%")
   Densidade: substitui um bloco de KPI inteiro quando o numero e contexto e
   nao protagonista.
   -------------------------------------------------------------------------- */
.c-chip {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  padding: var(--sp-1) var(--sp-3);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-pill);
  background-color: var(--color-bg-subtle);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
  color: var(--color-text-muted);
  white-space: nowrap;
}
.c-chip b, .c-chip strong {
  color: var(--color-text-primary);
  font-variant-numeric: tabular-nums;
}
.c-chip--gain b, .c-chip--gain strong { color: var(--color-gain-text); }
.c-chip--loss b, .c-chip--loss strong { color: var(--color-loss-text); }

/* ==========================================================================
   c-money — o numero que e dinheiro
   --------------------------------------------------------------------------
   Regras de formatacao (o PHP formata; o CSS garante que nao quebre):

   1. SINAL ANTES DO SIMBOLO:  -R$ 1.234,56   e nunca  R$ -1.234,56
      O olho le da esquerda para a direita e precisa saber que e prejuizo
      antes de ler o valor.
   2. NUNCA PARENTESES para negativo. (1.234,56) e convencao contabil que o
      trader brasileiro nao usa; em coluna estreita vira ambiguidade com
      nota de rodape.
   3. FIGURA TABULAR sempre. E o que alinha a virgula na vertical e permite
      comparar ordem de grandeza sem ler digito por digito.
   4. `white-space: nowrap`. "R$ 1.234," numa linha e "56" na outra ja
      custou suporte no sistema atual.
   ========================================================================== */

.c-money {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
  font-weight: var(--fw-semibold);
  white-space: nowrap;
  color: var(--color-text-primary);
}

/* Ganho e perda. As cores saem de --color-gain-text / --color-loss-text, que
   sao os degraus escurecidos da rampa. O verde e o vermelho de MARCA
   (--color-gain, --color-loss) reprovam AA como texto — 2,62:1 e 3,76:1 sobre
   branco — e ficam so para mancha, marcador e serie de grafico. */
.c-money--gain { color: var(--color-gain-text); }
.c-money--loss { color: var(--color-loss-text); }

/* Zero nao e ganho nem perda. Pintar de verde um resultado zerado e mentira
   pequena que vira habito de leitura errado. */
.c-money--flat { color: var(--color-flat-text); }

/* O simbolo e um grau menor e mais fraco que o valor: em coluna de 200
   linhas, 200 "R$" identicos so fazem barulho. O numero e o dado. */
.c-money__symbol {
  font-size: 0.85em;
  font-weight: var(--fw-medium);
  opacity: 0.75;
  margin-right: 0.15em;
}
.c-money__sign { margin-right: 0.02em; }

/* Centavos menores — opcional, para KPI grande. Em tabela nao: reduzir
   centavo em corpo de 14px atrapalha a leitura. */
.c-money__cents { font-size: 0.72em; opacity: 0.85; }

/* Tamanhos */
/* Resultado em destaque no detalhe da operacao: preenchimento tenue, para
   ser a primeira coisa lida na tela. So aqui — em tabela, dinheiro e texto. */
.c-money--badge {
  display: inline-flex;
  align-items: baseline;
  gap: 0.15em;
  padding: var(--sp-1) var(--sp-3);
  border-radius: var(--radius-sm);
  background-color: var(--color-neutral-subtle);
}
.c-money--badge.c-money--gain { background-color: var(--color-gain-subtle); }
.c-money--badge.c-money--loss { background-color: var(--color-loss-subtle); }

.c-money--lg { font-size: var(--text-xl); font-weight: var(--fw-bold); }
.c-money--xl {
  font-size: var(--text-kpi);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-tight);
}

/* --------------------------------------------------------------------------
   Dinheiro de conta simulada
   Qualquer .c-money dentro de um container marcado como simulado ganha
   sublinhado tracejado e a cor reservada. Um numero de treino nunca pode ser
   lido como dinheiro real, nem de relance, nem impresso em preto e branco.
   O seletor e de ancestral de proposito: basta marcar a linha, o cartao ou o
   workspace uma vez.
   -------------------------------------------------------------------------- */
[data-account="simulated"] .c-money,
.c-money--sim {
  color: var(--color-sim-text);
  text-decoration: underline dashed var(--color-sim-border);
  text-underline-offset: 3px;
  text-decoration-thickness: 1px;
}
/* Dentro de conta simulada, ganho e perda continuam distinguiveis pelo
   simbolo e pelo peso, mas nao voltam a ser verde e vermelho: a cor fica
   reservada para dinheiro real. */
[data-account="simulated"] .c-money--gain,
[data-account="simulated"] .c-money--loss { color: var(--color-sim-text); }

/* --------------------------------------------------------------------------
   Variacao percentual e delta
   -------------------------------------------------------------------------- */
.c-delta {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: var(--text-xs);
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
  color: var(--color-text-muted);
}

/* A seta e desenhada em clip-path e nao vem de fonte de icone: e o segundo
   canal de informacao (forma) que faz o delta continuar legivel para quem
   nao distingue verde de vermelho. */
.c-delta::before {
  content: "";
  flex: none;
  width: 9px;
  height: 9px;
  background-color: currentColor;
}
.c-delta--up   { color: var(--color-gain-text); }
.c-delta--up::before   { clip-path: polygon(50% 0%, 100% 100%, 0% 100%); }
.c-delta--down { color: var(--color-loss-text); }
.c-delta--down::before { clip-path: polygon(0% 0%, 100% 0%, 50% 100%); }
.c-delta--flat { color: var(--color-flat-text); }
.c-delta--flat::before { clip-path: polygon(0% 38%, 100% 38%, 100% 62%, 0% 62%); }



/* ==========================================================================
   c-panel — o cartao de conteudo do painel
   Cabecalho (titulo + acoes ou abas), corpo, rodape opcional.
   ========================================================================== */

.c-panel {
  display: flex;
  flex-direction: column;
  min-width: 0;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  overflow: hidden;   /* faz a tabela interna respeitar o raio do cartao */
}
.c-panel + .c-panel { margin-top: var(--row-gap); }

/* Sombra so no que flutua. No modo escuro a sombra some e quem separa e a
   borda — por isso o cartao tem borda nos dois temas e nao so no claro. */
.c-panel--raised { box-shadow: var(--shadow-1); }

.c-panel__head {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
  padding: var(--pad-panel-y) var(--pad-panel-x);
  border-bottom: 1px solid var(--color-border-subtle);
}
.c-panel__title {
  font-size: var(--text-lg);
  font-weight: var(--fw-bold);
  letter-spacing: var(--tracking-snug);
  min-width: 0;
}
.c-panel__meta {
  font-size: var(--text-xs);
  color: var(--color-text-muted);
}
/* `margin-left:auto` no container de acoes, e nao no ultimo filho: assim
   titulo curto e titulo longo empurram as acoes do mesmo jeito. */
.c-panel__actions {
  margin-left: auto;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  flex-wrap: wrap;
}

.c-panel__body { padding: var(--pad-panel-y) var(--pad-panel-x); }

/* Corpo sem respiro — para tabela, que ja tem o proprio. */
.c-panel__body--flush { padding: 0; }

.c-panel__foot {
  display: flex;
  align-items: center;
  gap: var(--sp-4);
  flex-wrap: wrap;
  padding: var(--pad-panel-y) var(--pad-panel-x);
  border-top: 1px solid var(--color-border-subtle);
  font-size: var(--text-sm);
  color: var(--color-text-muted);
  margin-top: auto;   /* gruda no fim quando dois paineis dividem a linha */
}

/* --------------------------------------------------------------------------
   Abas inline no cabecalho
   `role="tablist"` com `aria-selected` — o estado visual sai do atributo,
   nao de uma classe paralela.
   -------------------------------------------------------------------------- */
.c-tabs {
  display: flex;
  gap: var(--sp-1);
  margin-left: auto;
  flex-wrap: wrap;
}
.c-tabs__item {
  display: inline-flex;
  align-items: center;
  min-height: var(--control-h-sm);
  padding: 0 var(--sp-3);
  border-radius: var(--radius-pill);
  font-size: var(--text-xs);
  font-weight: var(--fw-semibold);
  color: var(--color-text-muted);
  cursor: pointer;
  transition: background-color var(--dur-fast) var(--ease-out),
              color var(--dur-fast) var(--ease-out);
}
.c-tabs__item:hover { background-color: var(--color-bg-subtle); color: var(--color-text-primary); }
.c-tabs__item[aria-selected="true"],
.c-tabs__item[aria-current="page"] {
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
}

/* Portas de lançamento (S249): importar ou digitar, no topo das duas telas. */
.c-tabs--start { margin-left: 0; }
.c-entries { display: flex; align-items: center; gap: var(--sp-3); flex-wrap: wrap; margin-bottom: var(--sp-4); }
.c-entries__label { font-size: var(--text-sm); font-weight: var(--fw-semibold); color: var(--color-text-secondary); }
.c-entries .c-tabs__item { min-height: var(--control-h); padding-inline: var(--sp-4); font-size: var(--text-sm); border: 1px solid var(--color-border); }

/* Muita aba no mobile: rola na horizontal DENTRO do cabecalho. Isto e a
   unica rolagem horizontal permitida no sistema, e ela e local — a pagina
   continua sem scroll lateral em 360px. */
@media (max-width: 719px) {
  .c-tabs {
    width: 100%;
    margin-left: 0;
    flex-wrap: nowrap;
    overflow-x: auto;
    scrollbar-width: none;
    -webkit-overflow-scrolling: touch;
  }
  .c-tabs::-webkit-scrollbar { display: none; }
  .c-tabs__item { flex: none; min-height: var(--tap-min); }
}

/* --------------------------------------------------------------------------
   Lista de definicao — "Conta / Capital / Custo por ordem"
   Usada no detalhe da operacao e na tela de conta. Densa de proposito.
   -------------------------------------------------------------------------- */
.c-deflist { display: grid; gap: 0; }
.c-deflist__row {
  display: flex;
  gap: var(--sp-4);
  justify-content: space-between;
  align-items: baseline;
  padding: var(--pad-cell-y) 0;
  border-bottom: 1px solid var(--color-border-subtle);
  font-size: var(--text-sm);
}
.c-deflist__row:last-child { border-bottom: 0; }
.c-deflist__term { color: var(--color-text-muted); }
.c-deflist__value {
  font-weight: var(--fw-bold);
  color: var(--color-text-primary);
  text-align: right;
  font-variant-numeric: tabular-nums;
}

/* Seletor de periodo (dia / semana / mes / ano). Pilula com item ativo
   solido — o padrao que o painel atual ja usa. */
.c-segmented {
  display: inline-flex;
  padding: 3px;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-pill);
  background-color: var(--color-bg-surface);
}
.c-segmented__item {
  display: inline-flex;
  align-items: center;
  min-height: var(--control-h-sm);
  padding: 0 var(--sp-3);
  border-radius: var(--radius-pill);
  font-size: var(--text-xs);
  font-weight: var(--fw-semibold);
  color: var(--color-text-muted);
  white-space: nowrap;
}
.c-segmented__item[aria-pressed="true"],
.c-segmented__item[aria-selected="true"] {
  background-color: var(--color-text-primary);
  color: var(--color-bg-surface);
}

@media (pointer: coarse) {
  .c-tabs__item,
  .c-segmented__item { min-height: var(--tap-min); }
}

/* Início (S249): passos do primeiro uso e próximos passos. */
ol.c-start { padding: var(--pad-panel-y) var(--pad-panel-x); display: grid; gap: var(--sp-5); counter-reset: start; }
.c-start__item { counter-increment: start; position: relative; padding-left: var(--sp-8); }
.c-start__item::before {
  content: counter(start);
  position: absolute; left: 0; top: 0;
  width: 28px; height: 28px; display: grid; place-items: center;
  border-radius: var(--radius-pill);
  background-color: var(--color-brand-subtle); color: var(--color-brand-text);
  font-weight: var(--fw-bold); font-size: var(--text-sm);
}
.c-start__item p { margin-top: var(--sp-1); color: var(--color-text-muted); font-size: var(--text-sm); }
.c-start__actions .c-btn { text-decoration: none; }
.c-kpi-row + .c-panel { margin-top: var(--sp-4); }
.c-start__actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-3); }
ul.c-next { padding: var(--sp-2) var(--pad-panel-x) var(--pad-panel-y); display: grid; gap: var(--sp-1); }
.c-next__item {
  display: flex; align-items: center; gap: var(--sp-3);
  min-height: var(--tap-min); padding: var(--sp-2) var(--sp-3);
  border-radius: var(--radius-sm); color: var(--color-text-primary); font-weight: var(--fw-medium);
  text-decoration: none;
}
.c-next__item:hover { background-color: var(--color-bg-subtle); }
.c-next__item--primary { background-color: var(--color-brand-subtle); color: var(--color-brand-text); font-weight: var(--fw-bold); }
.c-next__icon { flex: none; width: 18px; height: 18px; }
.c-home-note { margin-bottom: var(--sp-4); font-size: var(--text-sm); color: var(--color-text-muted); }
.c-next-step { display: flex; align-items: center; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-5); }
.c-next-step__label { font-size: var(--text-sm); font-weight: var(--fw-semibold); color: var(--color-text-secondary); }
.c-next-step .c-btn { text-decoration: none; }

/* ==========================================================================
   c-table
   Duas apresentacoes do mesmo HTML:
     < 720px  cada <tr> vira um cartao e cada <td> mostra o rotulo da coluna,
              lido de `data-label` e pintado em ::before
     >= 720px tabela de verdade

   O padrao de `data-label` vem do sistema atual (la e `data-l`) e funciona
   bem: nao duplica markup, nao precisa de JS, e o leitor de tela continua
   recebendo uma tabela com cabecalho.
   ========================================================================== */

.c-table {
  width: 100%;
  border-collapse: collapse;
  font-size: var(--text-md);
}

.c-table thead { display: none; }   /* volta em >= 720px */

.c-table tbody tr {
  display: block;
  padding: var(--sp-3) 0;
  border-bottom: 1px solid var(--color-border);
}
.c-table tbody tr:last-child { border-bottom: 0; }

.c-table td {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  padding: 5px var(--pad-cell-x);
  text-align: right;
  border: 0;
}
.c-table td::before {
  content: attr(data-label);
  flex: none;
  font-size: var(--text-xs);
  font-weight: var(--fw-semibold);
  color: var(--color-text-muted);
  text-align: left;
}
/* Celula sem data-label (a de acoes, a do link de detalhe) nao deve abrir
   coluna vazia a esquerda. */
.c-table td:not([data-label]) { justify-content: flex-end; }

/* A primeira celula do cartao e o titulo dele: ativo, data, o que identifica
   a linha. Fica maior e sem rotulo repetido. */
.c-table td[data-primary] {
  font-size: var(--text-lg);
  font-weight: var(--fw-bold);
  color: var(--color-text-primary);
  padding-top: var(--sp-1);
  padding-bottom: var(--sp-2);
}
.c-table td[data-primary]::before { color: var(--color-text-muted); font-size: var(--text-xs); }

/* --------------------------------------------------------------------------
   >= 720px — tabela
   -------------------------------------------------------------------------- */
@media (min-width: 720px) {
  .c-table thead { display: table-header-group; }
  .c-table tbody tr { display: table-row; padding: 0; }
  .c-table td { display: table-cell; text-align: left; }
  .c-table td::before { content: none; }
  .c-table td[data-primary] { font-size: var(--text-md); padding: var(--pad-cell-y) var(--pad-cell-x); }

  .c-table th,
  .c-table td {
    padding: var(--pad-cell-y) var(--pad-cell-x);
    border-bottom: 1px solid var(--color-border-subtle);
    vertical-align: middle;
  }

  /* Cabecalho discreto: caixa alta pequena em cinza. Ele orienta, nao
     compete com os numeros. */
  .c-table th {
    font-size: var(--text-2xs);
    font-weight: var(--fw-semibold);
    text-transform: uppercase;
    letter-spacing: var(--tracking-wide);
    color: var(--color-text-muted);
    white-space: nowrap;
    background-color: var(--color-bg-surface);
  }

  .c-table tbody tr:last-child td { border-bottom: 0; }

  /* Hover de linha. So em ponteiro fino: no toque o hover "gruda" depois do
     tap e a linha fica destacada sem motivo. */
  @media (hover: hover) {
    .c-table--hover tbody tr:hover td { background-color: var(--color-bg-subtle); }
  }

  .c-table--zebra tbody tr:nth-child(even) td { background-color: var(--color-bg-subtle); }

  /* Cabecalho preso ao rolar. Historico de operacoes tem centenas de linhas;
     sem isto o usuario perde a referencia da coluna na terceira tela. */
  .c-table--sticky thead th {
    position: sticky;
    top: 0;
    z-index: var(--z-base);
    box-shadow: inset 0 -1px 0 var(--color-border);
  }
}

/* --------------------------------------------------------------------------
   Alinhamento e tipo de coluna
   -------------------------------------------------------------------------- */
.c-table__num,
.c-table td[data-type="num"],
.c-table th[data-type="num"] {
  font-variant-numeric: tabular-nums;
  font-feature-settings: "tnum" 1;
}
@media (min-width: 720px) {
  /* Numero alinhado a direita e o que deixa a virgula na mesma coluna
     vertical — e o que permite comparar ordens de grandeza de relance. */
  .c-table td[data-type="num"],
  .c-table th[data-type="num"] { text-align: right; }
  .c-table td[data-type="center"],
  .c-table th[data-type="center"] { text-align: center; }
  .c-table th[data-type="actions"],
  .c-table td[data-type="actions"] { text-align: right; width: 1%; white-space: nowrap; }
}

/* Ticker: monoespacado, caixa alta. PETR4 e PETRA4 precisam ter a mesma
   largura por caractere para nao parecerem o mesmo papel. */
.c-table__ticker {
  font-family: var(--font-mono);
  font-weight: var(--fw-bold);
  letter-spacing: 0;
  text-transform: uppercase;
}

/* Linha de total. Sempre a ultima, sempre com borda superior grossa. */
.c-table tfoot td {
  padding: var(--pad-cell-y) var(--pad-cell-x);
  border-top: 2px solid var(--color-border-strong);
  font-weight: var(--fw-bold);
  background-color: var(--color-bg-subtle);
}

/* Linha de operacao em conta simulada. A listra a esquerda nao depende de
   cor para ser percebida. */
.c-table tbody tr[data-account="simulated"] td:first-child {
  box-shadow: inset 3px 0 0 var(--color-sim);
}

/* Cabecalho ordenavel. A seta e desenhada com borda, sem fonte de icone. */
.c-table th[aria-sort] { cursor: pointer; user-select: none; }
.c-table th[aria-sort]:hover { color: var(--color-text-primary); }
.c-table th[aria-sort="ascending"]::after,
.c-table th[aria-sort="descending"]::after {
  content: "";
  display: inline-block;
  width: 6px;
  height: 6px;
  margin-left: var(--sp-2);
  border-right: 2px solid currentColor;
  border-bottom: 2px solid currentColor;
  vertical-align: 2px;
}
.c-table th[aria-sort="ascending"]::after  { transform: rotate(-135deg); vertical-align: -1px; }
.c-table th[aria-sort="descending"]::after { transform: rotate(45deg); }

/* --------------------------------------------------------------------------
   Rolagem horizontal de ultimo recurso
   Para tabela de importacao, que tem colunas demais para virar cartao. A
   caixa rola; a pagina nao.
   -------------------------------------------------------------------------- */
.c-table-scroll {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: thin;
}
.c-table-scroll > .c-table { min-width: 720px; }
.c-table-scroll > .c-table thead { display: table-header-group; }
.c-table-scroll > .c-table tbody tr { display: table-row; padding: 0; }
.c-table-scroll > .c-table td { display: table-cell; text-align: left; }
.c-table-scroll > .c-table td::before { content: none; }

/* Legenda da tabela. `caption` e o titulo que o leitor de tela anuncia antes
   de entrar na grade — vale mais que o <h2> acima dela. */
.c-table caption {
  padding: var(--pad-cell-y) var(--pad-cell-x);
  text-align: left;
  font-size: var(--text-xs);
  color: var(--color-text-muted);
  caption-side: top;
}

/* ==========================================================================
   c-kpi — rotulo, valor grande, delta
   Quatro por linha no dashboard: saldo, resultado do mes, win rate, profit
   factor. Sao as metricas que justificam a assinatura, entao ganham a
   primeira dobra.
   ========================================================================== */

.c-kpi-row {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-3);
}
/* 360px: uma coluna. 480px: duas — abaixo disso o valor de 30px quebra. */
@media (min-width: 480px)  { .c-kpi-row { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .c-kpi-row { grid-template-columns: repeat(var(--kpi-cols, 4), minmax(0, 1fr)); } }

.c-kpi {
  display: flex;
  flex-direction: column;
  gap: var(--sp-1);
  min-width: 0;
  padding: var(--pad-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
}

.c-kpi__label {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--text-2xs);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  color: var(--color-text-muted);
}

/* Ajuda do rotulo. "Profit factor" nao e obvio; a explicacao mora na dica e
   o ponto de interrogacao so indica que ela existe.

   A CAIXA tem 24px porque e o minimo de alvo apontavel (WCAG 2.5.8); o
   CIRCULO tem 14px porque e uma marca, nao um botao. Separar os dois evita
   a escolha entre um desenho gordo e um alvo pequeno. */
.c-kpi__help {
  position: relative;
  flex: none;
  width: 24px;
  height: 24px;
  display: grid;
  place-items: center;
  font-size: 9px;
  font-weight: var(--fw-bold);
  line-height: 1;
  opacity: 0.7;
  cursor: help;
}
.c-kpi__help::before {
  content: "";
  position: absolute;
  width: 14px;
  height: 14px;
  border: 1px solid currentColor;
  border-radius: var(--radius-pill);
}

.c-kpi__value {
  font-size: var(--text-kpi);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-tight);
  line-height: var(--lh-tight);
  font-variant-numeric: tabular-nums;
  color: var(--color-text-primary);
  overflow-wrap: anywhere;   /* nada de scroll horizontal em 360px */
}

.c-kpi__delta { margin-top: 2px; }

/* Linha de contexto: "vs. mes anterior", "em 42 operacoes". Um KPI sem
   referencia e um numero sem significado. */
.c-kpi__foot {
  font-size: var(--text-xs);
  color: var(--color-text-muted);
}

/* --------------------------------------------------------------------------
   Variantes de resultado
   Pintam o VALOR, nao o cartao. Quatro cartoes coloridos lado a lado viram
   um semaforo sem sentido; o dado colorido e o numero.
   -------------------------------------------------------------------------- */
.c-kpi--gain    .c-kpi__value { color: var(--color-gain-text); }
.c-kpi--loss    .c-kpi__value { color: var(--color-loss-text); }
.c-kpi--neutral .c-kpi__value { color: var(--color-text-primary); }

/* Barra fina no topo, como reforco nao cromatico da variante. */
.c-kpi--gain,
.c-kpi--loss { position: relative; overflow: hidden; }
.c-kpi--gain::before,
.c-kpi--loss::before {
  content: "";
  position: absolute;
  inset: 0 0 auto 0;
  height: 3px;
}
.c-kpi--gain::before { background-color: var(--color-gain); }
.c-kpi--loss::before { background-color: var(--color-loss); }

/* --------------------------------------------------------------------------
   Destaque
   UM cartao por tela, no maximo: o saldo da conta. Gradiente da marca com
   tinta escura (branco sobre o gradiente da 2,05:1).
   -------------------------------------------------------------------------- */
.c-kpi--accent {
  border-color: transparent;
  background-image: var(--color-brand-gradient);
  color: var(--color-text-on-brand);
  box-shadow: var(--shadow-1);
}
.c-kpi--accent .c-kpi__label,
.c-kpi--accent .c-kpi__foot,
.c-kpi--accent .c-kpi__value,
.c-kpi--accent .c-delta { color: var(--color-text-on-brand); }
.c-kpi--accent .c-kpi__label,
.c-kpi--accent .c-kpi__foot { opacity: 0.78; }

/* --------------------------------------------------------------------------
   Dica flutuante do rotulo
   Aparece no hover E no foco — dica que so responde a mouse nao existe para
   quem navega por teclado. O texto vem de um <span> no HTML (traduzivel),
   nao de `content: attr(...)`, que leitor de tela nao le de forma confiavel.
   -------------------------------------------------------------------------- */
.c-tooltip {
  position: absolute;
  bottom: calc(100% + var(--sp-2));
  left: 50%;
  transform: translateX(-50%);
  z-index: var(--z-dropdown);
  width: max-content;
  max-width: 240px;
  padding: var(--sp-2) var(--sp-3);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-inverse);
  color: var(--color-text-inverse);
  font-size: var(--text-xs);
  font-weight: var(--fw-regular);
  line-height: var(--lh-snug);
  text-transform: none;
  letter-spacing: 0;
  text-align: left;
  box-shadow: var(--shadow-2);
  opacity: 0;
  visibility: hidden;
  transition: opacity var(--dur-fast) var(--ease-out), visibility var(--dur-fast);
}
.c-kpi__help:hover .c-tooltip,
.c-kpi__help:focus-visible .c-tooltip,
.c-kpi__help:focus-within .c-tooltip { opacity: 1; visibility: visible; }

/* Miniatura de serie no rodape do cartao. O contorno vem de um SVG inline
   na view; aqui so a caixa. */
.c-kpi__spark {
  margin-top: var(--sp-2);
  height: 34px;
  width: 100%;
}
.c-kpi__spark svg { width: 100%; height: 100%; display: block; overflow: visible; }

/* ==========================================================================
   c-signal — semaforo de risco
   --------------------------------------------------------------------------
   Este componente decide se a pessoa continua operando no dia. Por isso ele
   e o unico do sistema com TRES canais redundantes obrigatorios:

     COR    verde / ambar / vermelho
     FORMA  circulo / triangulo / octogono  (clip-path, sem fonte de icone)
     TEXTO  "Dentro do limite" / "Atencao" / "Pare"

   Cor sozinha nao comunica: ~8% dos homens tem alguma deficiencia de
   percepcao de vermelho e verde, e essa e exatamente a faixa de cor que o
   semaforo usa. As formas sao as do transito por razao de familiaridade —
   octogono ja significa "pare" antes de qualquer leitura.

   O rotulo textual NAO e opcional e vem do HTML (lang/), nunca de `content:`.
   ========================================================================== */

.c-signal {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-3);
  padding: var(--pad-card);
  border: 1px solid var(--color-border);
  border-left-width: 4px;
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
}

.c-signal__mark {
  flex: none;
  width: 28px;
  height: 28px;
  margin-top: 1px;
  background-color: currentColor;
}

.c-signal__body { min-width: 0; }

.c-signal__label {
  display: block;
  font-size: var(--text-lg);
  font-weight: var(--fw-black);
  line-height: var(--lh-tight);
  letter-spacing: var(--tracking-snug);
}
.c-signal__detail {
  margin-top: var(--sp-1);
  font-size: var(--text-sm);
  line-height: var(--lh-snug);
  color: var(--color-text-muted);
}
.c-signal__detail .c-money { color: inherit; }

/* --------------------------------------------------------------------------
   Estados
   O seletor e `data-state` e nao classe modificadora: o estado vem do
   servidor como dado, e um atributo de dado evita a classe orfa quando o
   valor muda.
   -------------------------------------------------------------------------- */
.c-signal[data-state="go"] {
  border-color: var(--color-gain-border);
  border-left-color: var(--color-signal-go);
  background-color: var(--color-signal-go-subtle);
  color: var(--color-signal-go-text);
}
.c-signal[data-state="go"] .c-signal__mark { clip-path: circle(50% at 50% 50%); }

.c-signal[data-state="caution"] {
  border-color: var(--color-warn-border);
  border-left-color: var(--color-signal-caution);
  background-color: var(--color-signal-caution-subtle);
  color: var(--color-signal-caution-text);
}
.c-signal[data-state="caution"] .c-signal__mark {
  clip-path: polygon(50% 2%, 100% 98%, 0% 98%);
}

.c-signal[data-state="stop"] {
  border-color: var(--color-loss-border);
  border-left-color: var(--color-signal-stop);
  background-color: var(--color-signal-stop-subtle);
  color: var(--color-signal-stop-text);
}
/* Octogono. Vertices em 29,3% (1 - 1/sqrt(2) / ... ) — o valor exato do
   octogono regular; arredondar para 30% deforma visivelmente no tamanho 28px. */
.c-signal[data-state="stop"] .c-signal__mark {
  clip-path: polygon(
    29.3% 0%, 70.7% 0%, 100% 29.3%, 100% 70.7%,
    70.7% 100%, 29.3% 100%, 0% 70.7%, 0% 29.3%
  );
}

/* No estado "pare" o bloco inteiro ganha hachura. E o quarto canal: se a
   tela estiver em preto e branco e as formas passarem despercebidas, a
   textura ainda diz que aquele bloco nao e como os outros. */
.c-signal[data-state="stop"] {
  background-image: repeating-linear-gradient(
    135deg,
    transparent 0 9px,
    var(--color-signal-stop-subtle) 9px 18px
  );
}

/* --------------------------------------------------------------------------
   Barra de consumo do limite
   "Voce usou 72% do limite de perda do dia." O numero e o texto; a barra e o
   relance.
   -------------------------------------------------------------------------- */
.c-signal__gauge {
  position: relative;
  margin-top: var(--sp-3);
  height: 8px;
  border-radius: var(--radius-pill);
  background-color: var(--color-neutral-subtle);
  overflow: hidden;
}
.c-signal__fill {
  height: 100%;
  border-radius: inherit;
  background-color: currentColor;
  /* A largura vem do style inline com o percentual calculado no PHP.
     Transicao curta para quando a tela atualiza sem recarregar. */
  transition: width var(--dur-slow) var(--ease-in-out);
}

/* Marca do limite dentro da barra, para quando a regra tem dois patamares
   (alerta em 70%, corte em 100%). */
.c-signal__threshold {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 2px;
  background-color: var(--color-text-primary);
  opacity: 0.45;
}

/* --------------------------------------------------------------------------
   Versao compacta — cabe na barra de topo e na sidebar
   -------------------------------------------------------------------------- */
.c-signal--inline {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  padding: var(--sp-1) var(--sp-3);
  border-width: 1px;
  border-left-width: 3px;
  border-radius: var(--radius-pill);
  background-image: none;
}
.c-signal--inline .c-signal__mark { width: 14px; height: 14px; margin: 0; }
.c-signal--inline .c-signal__label { font-size: var(--text-xs); font-weight: var(--fw-bold); }
.c-signal--inline .c-signal__detail { display: none; }

/* Lista de regras avaliadas — a tela de regras de risco mostra cada regra
   com o proprio estado. */
.c-signal-list { display: grid; gap: var(--sp-2); }
.c-signal-list .c-signal { padding: var(--sp-3) var(--pad-card); }

/* ==========================================================================
   c-message — mensagem flash
   Barra colorida de 4px a esquerda, icone, texto. E o formato do sistema
   atual e ele funciona: a barra identifica o tipo na visao periferica sem
   colorir o card inteiro.
   ========================================================================== */

.c-message {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-4);
  border: 1px solid var(--color-border);
  border-left: 4px solid var(--color-neutral-border);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-surface);
  box-shadow: var(--shadow-1);
  font-size: var(--text-md);
  line-height: var(--lh-snug);
  color: var(--color-text-secondary);
}
.c-message + .c-message { margin-top: var(--sp-3); }

.c-message__icon {
  flex: none;
  width: 18px;
  height: 18px;
  margin-top: 1px;
  color: var(--color-neutral-text);
}
.c-message__body { min-width: 0; flex: 1; }
.c-message__title {
  display: block;
  font-weight: var(--fw-bold);
  color: var(--color-text-primary);
  margin-bottom: 2px;
}
.c-message__body a { color: var(--color-text-link); text-decoration: underline; }

.c-message__close {
  flex: none;
  width: var(--control-h-sm);
  height: var(--control-h-sm);
  margin: -4px -6px -4px 0;
  display: grid;
  place-items: center;
  border-radius: var(--radius-sm);
  color: var(--color-text-muted);
}
.c-message__close:hover { background-color: var(--color-bg-subtle); color: var(--color-text-primary); }

/* --------------------------------------------------------------------------
   Tons
   O fundo continua sendo a superficie, nao a cor do tom: mensagem com fundo
   colorido inteiro disputa atencao com os numeros da tela, e a tela e sobre
   os numeros.
   -------------------------------------------------------------------------- */
.c-message--success { border-left-color: var(--color-gain); }
.c-message--success .c-message__icon { color: var(--color-gain-text); }

.c-message--info { border-left-color: var(--color-info); }
.c-message--info .c-message__icon { color: var(--color-info-text); }

.c-message--warning { border-left-color: var(--color-warn); }
.c-message--warning .c-message__icon { color: var(--color-warn-text); }

/* Erro e o unico com fundo tenue: e a unica mensagem que NAO pode passar
   despercebida. Ver a nota de perda x erro em themes/light.css — aqui o
   vermelho e o vivo (--color-danger), nao o de prejuizo. */
.c-message--error {
  border-left-color: var(--color-danger);
  background-color: var(--color-danger-subtle);
  border-color: var(--color-danger-border);
}
.c-message--error .c-message__icon { color: var(--color-danger-text); }

/* Container onde o JS injeta a resposta do formulario. Sem `:not(:empty)` a
   margem aparece mesmo com a caixa vazia. */
.c-message-slot:not(:empty) { margin-bottom: var(--sp-4); }

/* --------------------------------------------------------------------------
   Faixa de aviso de plano / trial
   Largura total, acima do conteudo. Mais discreta que uma mensagem porque
   fica na tela o tempo todo.
   -------------------------------------------------------------------------- */
.c-banner {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  flex-wrap: wrap;
  padding: var(--sp-2) var(--sp-4);
  border-radius: var(--radius-sm);
  background-color: var(--color-warn-subtle);
  color: var(--color-warn-text);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
}
.c-banner__actions { margin-left: auto; display: flex; gap: var(--sp-2); }

@media (pointer: coarse) {
  .c-message__close { width: var(--tap-min); height: var(--tap-min); }
}
.c-banner--info {
  background-color: var(--color-info-subtle);
  color: var(--color-info-text);
  box-shadow: inset 0 0 0 1px var(--color-info-border);
}
.c-banner--brand { background-color: var(--color-brand-subtle); color: var(--color-brand-text); }

/* ==========================================================================
   c-modal
   O CSS cobre backdrop, caixa, rolagem e o estado aberto/fechado.
   Esc, trap de foco e devolucao do foco ao elemento que abriu sao do JS
   (assets/js/), como manda o contrato. O que o CSS garante e que o modal
   NUNCA fique com conteudo inacessivel: a caixa rola, a pagina nao.
   --------------------------------------------------------------------------
   Duas formas de marcar aberto, porque as duas aparecem no produto:
     <dialog open>          quando a view usa o elemento nativo
     [data-open="true"]     quando e <div role="dialog"> movido por JS
   ========================================================================== */

.c-modal {
  position: fixed;
  inset: 0;
  z-index: var(--z-modal);
  display: none;
  align-items: flex-start;
  justify-content: center;
  padding: var(--sp-4);
  overflow-y: auto;
  overscroll-behavior: contain;
  background-color: var(--color-bg-backdrop);
}
.c-modal[data-open="true"],
.c-modal[open] { display: flex; }

/* Quando o modal esta aberto o body para de rolar. A classe e posta pelo JS;
   `scrollbar-gutter` evita o "pulo" de 15px da pagina quando a barra some. */
body.has-modal { overflow: hidden; }
html { scrollbar-gutter: stable; }

.c-modal__box {
  position: relative;
  width: 100%;
  max-width: var(--modal-w, 640px);
  margin: auto 0;
  display: flex;
  flex-direction: column;
  max-height: calc(100dvh - var(--sp-8));
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-raised);
  box-shadow: var(--shadow-3);
}
.c-modal--sm  { --modal-w: 440px; }
.c-modal--lg  { --modal-w: 880px; }

/* Entrada curta. A caixa sobe 8px em vez de escalar: escala em modal de
   formulario deixa o texto borrado no meio da transicao. */
@media (prefers-reduced-motion: no-preference) {
  .c-modal[data-open="true"] .c-modal__box,
  .c-modal[open] .c-modal__box {
    animation: c-modal-in var(--dur-base) var(--ease-out);
  }
  @keyframes c-modal-in {
    from { opacity: 0; transform: translateY(8px); }
    to   { opacity: 1; transform: none; }
  }
}

.c-modal__head {
  display: flex;
  align-items: flex-start;
  gap: var(--sp-3);
  padding: var(--pad-panel-y) var(--pad-panel-x);
  border-bottom: 1px solid var(--color-border-subtle);
}
.c-modal__title {
  font-size: var(--text-xl);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-snug);
  min-width: 0;
}
.c-modal__sub {
  margin-top: 2px;
  font-size: var(--text-sm);
  color: var(--color-text-muted);
}

/* O X fica 44x44 sempre, inclusive no desktop: e o alvo que a pessoa procura
   com pressa. */
.c-modal__close {
  flex: none;
  margin-left: auto;
  width: var(--tap-min);
  height: var(--tap-min);
  margin-top: calc(var(--sp-2) * -1);
  margin-right: calc(var(--sp-2) * -1);
  display: grid;
  place-items: center;
  border-radius: var(--radius-sm);
  color: var(--color-text-muted);
}
.c-modal__close:hover { background-color: var(--color-bg-subtle); color: var(--color-text-primary); }

/* O corpo e quem rola. Assim o cabecalho e as acoes ficam sempre visiveis —
   num modal de confirmacao de exclusao, o botao nao pode estar fora da tela. */
.c-modal__body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  padding: var(--pad-panel-y) var(--pad-panel-x);
}

.c-modal__foot {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: var(--sp-3);
  flex-wrap: wrap;
  padding: var(--pad-panel-y) var(--pad-panel-x);
  border-top: 1px solid var(--color-border-subtle);
}

/* Modal destrutivo: a faixa no topo diz o que vai acontecer antes de o
   usuario ler o texto. */
.c-modal--danger .c-modal__box { border-top: 3px solid var(--color-danger); }

/* --------------------------------------------------------------------------
   Mobile: folha que sobe pela base
   Em 360px um modal centralizado com margem de 16px sobra pouco espaco. A
   folha usa a largura toda e prende o rodape na base — polegar alcanca.
   -------------------------------------------------------------------------- */
@media (max-width: 719px) {
  .c-modal { padding: 0; align-items: flex-end; }
  .c-modal__box {
    max-width: none;
    max-height: 92dvh;
    margin: 0;
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
    border-bottom: 0;
  }
  .c-modal__foot { position: sticky; bottom: 0; background-color: var(--color-bg-raised); }
  .c-modal__foot .c-btn { flex: 1; }
  @media (prefers-reduced-motion: no-preference) {
    .c-modal[data-open="true"] .c-modal__box,
    .c-modal[open] .c-modal__box { animation-name: c-modal-sheet-in; }
    @keyframes c-modal-sheet-in {
      from { transform: translateY(16px); opacity: 0; }
      to   { transform: none; opacity: 1; }
    }
  }
}

/* <dialog> nativo: o backdrop dele e um pseudo-elemento proprio. */
.c-modal::backdrop { background-color: var(--color-bg-backdrop); }

/* ==========================================================================
   c-chart — contentor, legenda, tooltip e tokens de serie
   --------------------------------------------------------------------------
   O grafico em si e desenhado por SVG inline (dashboard leve, sparkline,
   donut) ou por biblioteca. Este arquivo cuida da caixa e, principalmente,
   PUBLICA AS CORES DE SERIE como custom properties no proprio elemento:

     getComputedStyle(el).getPropertyValue('--chart-gain')

   E assim que o JS pega a cor sem ter cor literal em arquivo de JS — e o que
   faz o grafico seguir o tema claro/escuro sem uma linha de codigo de tema.
   ========================================================================== */

.c-chart {
  /* Contrato de serie. Componente nao inventa cor: repassa o token do tema. */
  --chart-gain:   var(--color-chart-gain);
  --chart-loss:   var(--color-chart-loss);
  --chart-equity: var(--color-chart-equity);
  --chart-axis:   var(--color-chart-axis);
  --chart-grid:   var(--color-chart-grid);
  --chart-band:   var(--color-chart-band);
  --chart-alt-1:  var(--color-chart-alt-1);
  --chart-alt-2:  var(--color-chart-alt-2);
  --chart-alt-3:  var(--color-chart-alt-3);

  position: relative;
  width: 100%;
  min-width: 0;
  height: var(--chart-h, 260px);
}
/* Alturas por contexto. Grafico de 6 meses no dashboard precisa de mais
   altura que o donut da lateral. */
.c-chart--sm { --chart-h: 160px; }
.c-chart--lg { --chart-h: 360px; }

.c-chart > svg,
.c-chart > canvas,
.c-chart > div { width: 100%; height: 100%; display: block; }

/* Eixos e grade quando o SVG e nosso. `stroke` herda de currentColor onde
   der; onde nao der, estas classes resolvem. */
.c-chart__grid   { stroke: var(--chart-grid); stroke-width: 1; }
.c-chart__axis   { stroke: var(--chart-axis); stroke-width: 1; }
.c-chart__label  { fill: var(--color-text-muted); font-size: var(--text-2xs); }
.c-chart__gain   { fill: var(--chart-gain); }
.c-chart__loss   { fill: var(--chart-loss); }
.c-chart__equity { fill: none; stroke: var(--chart-equity); stroke-width: 2; stroke-linejoin: round; }
.c-chart__band   { fill: var(--chart-band); stroke: none; }
/* Series extras — funil do admin, distribuicao por setup, donut de 3 fatias. */
.c-chart__alt-1  { fill: var(--chart-alt-1); }
.c-chart__alt-2  { fill: var(--chart-alt-2); }
.c-chart__alt-3  { fill: var(--chart-alt-3); }

/* --------------------------------------------------------------------------
   Legenda
   Marcador quadrado e nao circular: em 11px o quadrado mantem a cor
   reconhecivel, o circulo perde area para o antialiasing.
   -------------------------------------------------------------------------- */
.c-chart-legend {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3) var(--sp-4);
  margin-top: var(--sp-3);
}
.c-chart-legend__item {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--text-xs);
  color: var(--color-text-muted);
}
.c-chart-legend__swatch {
  flex: none;
  width: 11px;
  height: 11px;
  border-radius: 3px;
  background-color: var(--swatch, var(--color-text-muted));
}
.c-chart-legend__item[data-series="gain"]   { --swatch: var(--color-chart-gain); }
.c-chart-legend__item[data-series="loss"]   { --swatch: var(--color-chart-loss); }
.c-chart-legend__item[data-series="equity"] { --swatch: var(--color-chart-equity); }
.c-chart-legend__value {
  margin-left: auto;
  font-weight: var(--fw-bold);
  font-variant-numeric: tabular-nums;
  color: var(--color-text-primary);
}

/* Legenda em coluna, com o valor alinhado a direita — para o donut. */
.c-chart-legend--stack { flex-direction: column; gap: var(--sp-2); }
.c-chart-legend--stack .c-chart-legend__item { width: 100%; }

/* --------------------------------------------------------------------------
   Tooltip
   Escuro nos dois temas. No claro e o inverso da tela; no escuro e um degrau
   ACIMA da superficie, com borda — sobre fundo escuro, tooltip preto some.
   -------------------------------------------------------------------------- */
.c-chart-tooltip {
  position: absolute;
  z-index: var(--z-dropdown);
  min-width: 140px;
  max-width: 260px;
  padding: var(--sp-2) var(--sp-3);
  border: 1px solid var(--color-chart-tooltip-border);
  border-radius: var(--radius-sm);
  background-color: var(--color-chart-tooltip-bg);
  color: var(--color-chart-tooltip-fg);
  box-shadow: var(--shadow-2);
  font-size: var(--text-xs);
  line-height: var(--lh-snug);
  pointer-events: none;
  white-space: nowrap;
}
.c-chart-tooltip[hidden] { display: none; }
.c-chart-tooltip__title {
  display: block;
  margin-bottom: var(--sp-1);
  font-weight: var(--fw-bold);
  font-size: var(--text-2xs);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  opacity: 0.75;
}
.c-chart-tooltip__row {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-variant-numeric: tabular-nums;
}
.c-chart-tooltip__row b { margin-left: auto; font-weight: var(--fw-bold); }
.c-chart-tooltip__swatch {
  flex: none; width: 8px; height: 8px; border-radius: 2px;
  background-color: var(--swatch, currentColor);
}

/* --------------------------------------------------------------------------
   Sparkline — dentro de KPI e de celula de tabela
   -------------------------------------------------------------------------- */
.c-sparkline {
  display: block;
  width: 100%;
  height: var(--spark-h, 34px);
  overflow: visible;
}
.c-sparkline path { fill: none; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.c-sparkline--gain path { stroke: var(--color-chart-gain); }
.c-sparkline--loss path { stroke: var(--color-chart-loss); }
.c-sparkline--flat path { stroke: var(--color-chart-equity); }

/* --------------------------------------------------------------------------
   Donut de acerto — SVG puro, viewBox 0 0 42 42, r = 15.915
   (15.915 e o raio cuja circunferencia e 100: o stroke-dasharray passa a ser
   o percentual direto, sem conta no PHP.)
   -------------------------------------------------------------------------- */
.c-donut { display: flex; flex-direction: column; align-items: center; gap: var(--sp-4); }
.c-donut svg { width: 150px; height: 150px; }
.c-donut__track { fill: none; stroke: var(--color-neutral-subtle); stroke-width: 4; }
.c-donut__arc   { fill: none; stroke: var(--color-chart-gain); stroke-width: 4; stroke-linecap: round;
  transform: rotate(-90deg); transform-origin: center; }
/*
 * O texto do donut mede em unidades do viewBox, não em pixels.
 *
 * O viewBox é `0 0 42 42`. Um `font-size` de token — `--text-h2` resolve
 * para até 26px — vira 26 **unidades** aqui dentro, e o número ocupa mais
 * da metade da altura do círculo, transbordando por cima do anel e da
 * legenda. Foi o que o protótipo mostrou na primeira renderização.
 *
 * Os valores abaixo são fração do raio (15,915) e escalam junto com o
 * `width` do svg, que é o único lugar onde pixel faz sentido para esta
 * peça.
 */
.c-donut__center {
  font-size: 9px;
  font-weight: var(--fw-black);
  fill: var(--color-text-primary);
  text-anchor: middle;
  font-variant-numeric: tabular-nums;
}
.c-donut__caption { font-size: 3.6px; fill: var(--color-text-muted); text-anchor: middle; }

/* Barra horizontal simples — distribuicao por setup, por ativo, funil admin.
   Sem lib: a largura vem do style inline calculado no PHP. */
.c-bars { display: grid; gap: var(--sp-2); }
.c-bars__row { display: grid; grid-template-columns: minmax(80px, 28%) 1fr auto; gap: var(--sp-3); align-items: center; }
.c-bars__label { font-size: var(--text-sm); color: var(--color-text-muted); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.c-bars__track { height: 10px; border-radius: var(--radius-pill); background-color: var(--color-neutral-subtle); overflow: hidden; }
.c-bars__fill  { height: 100%; border-radius: inherit; background-image: var(--color-brand-gradient); }
.c-bars__fill--gain { background-image: none; background-color: var(--color-chart-gain); }
.c-bars__fill--loss { background-image: none; background-color: var(--color-chart-loss); }
.c-bars__value { font-size: var(--text-sm); font-weight: var(--fw-bold); font-variant-numeric: tabular-nums; }

/* ==========================================================================
   c-timeline — a linha do tempo dos eventos de uma operação
   --------------------------------------------------------------------------
   Esta familia existe por uma pergunta: "por que este numero e este?". A tela
   de detalhe responde mostrando os eventos que compuseram a operacao, na
   ordem em que o motor os leu — compra, desdobramento, venda, provento.

   Nao e uma tabela. Tabela e para comparar linhas entre si; aqui o que
   importa e a SEQUENCIA, e a sequencia se le melhor numa coluna com eixo.

   Tres decisoes deste arquivo:

     1. O eixo e uma borda, nao um pseudo-elemento posicionado. Borda
        acompanha a altura do conteudo sozinha, inclusive quando a nota do
        evento tem cinco linhas.
     2. O marcador tem FORMA por tipo, nao so cor: execucao e circulo cheio,
        societario e losango, custo e circulo vazado. Cor sozinha nao
        comunica, e aqui ela distinguiria compra de desdobramento.
     3. Abaixo de 720px a linha nao vira cartao — ela ja e vertical. O que
        muda e o recuo, que encolhe para devolver largura ao texto.
   ========================================================================== */

.c-timeline {
  display: grid;
  gap: var(--sp-4);
  margin: 0;
  padding: 0 0 0 var(--sp-5);
  border-left: 2px solid var(--color-border);
  list-style: none;
}

.c-timeline__item {
  position: relative;
  min-width: 0;
}

/* O marcador encosta no eixo. O deslocamento de 1px compensa a borda de 2px
   do contentor, para o centro do marcador cair em cima da linha. */
.c-timeline__mark {
  position: absolute;
  top: 4px;
  left: calc(var(--sp-5) * -1 - 7px);
  width: 12px;
  height: 12px;
  border: 2px solid var(--color-brand);
  border-radius: var(--radius-pill);
  background-color: var(--color-bg-surface);
}

/* Execucao: circulo cheio. E o evento que a pessoa mandou para o mercado. */
.c-timeline__item[data-kind="execution"] .c-timeline__mark {
  background-color: var(--color-brand);
}

/* Societario: losango. A empresa fez, o usuario nao operou — e a forma
   diferente e o que impede alguem de ler um desdobramento como uma compra. */
.c-timeline__item[data-kind="corporate"] .c-timeline__mark {
  border-color: var(--color-info);
  border-radius: 2px;
  transform: rotate(45deg);
}

/* Custo avulso: circulo vazado, borda neutra. Nao move quantidade. */
.c-timeline__item[data-kind="cost"] .c-timeline__mark {
  border-color: var(--color-neutral-border);
}

.c-timeline__head {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--sp-2) var(--sp-3);
}

.c-timeline__title {
  font-size: var(--text-md);
  font-weight: var(--fw-bold);
  line-height: var(--lh-snug);
  color: var(--color-text-primary);
}

.c-timeline__when {
  font-size: var(--text-xs);
  font-variant-numeric: tabular-nums;
  color: var(--color-text-muted);
}

/* Os numeros do evento: quantidade, preco, custo. Grade de rotulo e valor,
   que e o formato que sobrevive a quatro campos em 360px. */
.c-timeline__facts {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
  gap: var(--sp-2) var(--sp-4);
  margin-top: var(--sp-2);
}

.c-timeline__fact { min-width: 0; }

.c-timeline__term {
  display: block;
  font-size: var(--text-2xs);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  color: var(--color-text-muted);
}

.c-timeline__value {
  display: block;
  font-size: var(--text-sm);
  font-variant-numeric: tabular-nums;
  color: var(--color-text-primary);
}

.c-timeline__note {
  margin-top: var(--sp-2);
  font-size: var(--text-sm);
  line-height: var(--lh-normal);
  color: var(--color-text-secondary);
}

/* Estorno. O evento original fica no historico e o estorno aparece ao lado —
   e isso e o que permite explicar, meses depois, por que o numero mudou. */
.c-timeline__item[data-reversal="true"] .c-timeline__title,
.c-timeline__item[data-reversal="voided"] .c-timeline__title {
  color: var(--color-text-muted);
  text-decoration: line-through;
}

/* Estorno antigo sem vinculo (L-050): ainda conta no calculo, entao nao e
   riscado; so marcado, para ser achado e corrigido. */
.c-timeline__flag {
  font-size: var(--text-xs);
  font-style: italic;
  color: var(--color-text-secondary);
}

@media (min-width: 720px) {
  .c-timeline { padding-left: var(--sp-6); }
  .c-timeline__mark { left: calc(var(--sp-6) * -1 - 7px); }
}

/* --------------------------------------------------------------------------
   FAQ — acordeao em <details>, sem uma linha de JS
   (saiu da landing na S120: checkout e assinatura, no painel, tambem o usam)
   -------------------------------------------------------------------------- */
.c-faq { display: grid; gap: var(--sp-3); max-width: 800px; margin: var(--sp-7) auto 0; }
.c-faq__item {
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  overflow: hidden;
}
.c-faq__q {
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  min-height: var(--tap-min);
  padding: var(--sp-4) var(--sp-5);
  font-size: var(--text-xl);
  font-weight: var(--fw-bold);
  cursor: pointer;
  list-style: none;
}
.c-faq__q::-webkit-details-marker { display: none; }
.c-faq__q::after {
  content: "";
  flex: none;
  margin-left: auto;
  width: 8px; height: 8px;
  border-right: 2px solid var(--color-text-muted);
  border-bottom: 2px solid var(--color-text-muted);
  transform: rotate(45deg) translate(-2px, -2px);
  transition: transform var(--dur-fast) var(--ease-out);
}
.c-faq__item[open] .c-faq__q::after { transform: rotate(-135deg); }
.c-faq__a {
  padding: 0 var(--sp-5) var(--sp-5);
  font-size: var(--text-lg);
  line-height: var(--lh-relaxed);
  color: var(--color-text-muted);
}



/* ==========================================================================
   c-skeleton
   Ocupa o lugar do bloco que ainda nao chegou, com a MESMA altura do bloco
   final. Skeleton menor que o conteudo real causa salto de layout na troca,
   que e pior do que nao ter skeleton.

   O contrato exige que toda area de carregamento tenha descendente
   `c-skeleton*` — o lint procura exatamente esse prefixo.

   Acessibilidade: o container recebe `aria-busy="true"` e `aria-live="polite"`,
   e os blocos recebem `aria-hidden="true"`. Sem isso o leitor de tela anuncia
   uma sequencia de caixas vazias.
   ========================================================================== */

.c-skeleton {
  display: block;
  position: relative;
  overflow: hidden;
  border-radius: var(--radius-sm);
  background-color: var(--color-skeleton);
  /* Impede que texto real caia dentro por engano. */
  color: transparent;
  user-select: none;
}

/* O brilho e uma faixa que atravessa. `transparent` e palavra-chave, nao cor
   literal — o CI aceita. */
.c-skeleton::after {
  content: "";
  position: absolute;
  inset: 0;
  transform: translateX(-100%);
  background-image: linear-gradient(
    90deg,
    transparent 0%,
    var(--color-skeleton-shine) 50%,
    transparent 100%
  );
  animation: c-skeleton-sweep 1.4s ease-in-out infinite;
}

@keyframes c-skeleton-sweep {
  to { transform: translateX(100%); }
}

/* Sem movimento: a faixa para e vira um leve pulso de opacidade, que ainda
   diz "isto e temporario" sem varrer a tela. */
@media (prefers-reduced-motion: reduce) {
  .c-skeleton::after { animation: none; opacity: 0.4; transform: none; }
}

/* --------------------------------------------------------------------------
   Formas
   -------------------------------------------------------------------------- */

/* Linha de texto. A altura acompanha a linha real (14px x 1.5 = 21px). */
.c-skeleton-line {
  height: 1em;
  margin: 0.25em 0;
  border-radius: var(--radius-xs);
}
.c-skeleton-line--title { height: 1.4em; width: 45%; }
.c-skeleton-line--sm    { height: 0.85em; width: 70%; }
/* A ultima linha de um paragrafo nunca e cheia. Copiar isso faz o bloco
   parecer texto e nao uma barra. */
.c-skeleton-line:last-child { width: 62%; }

.c-skeleton-block { height: 120px; border-radius: var(--radius-md); }

/* Cartao com titulo e duas linhas. */
.c-skeleton-card {
  display: block;
  padding: var(--pad-card);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
}
.c-skeleton-card > .c-skeleton + .c-skeleton { margin-top: var(--sp-2); }

/* KPI: rotulo pequeno + numero grande. Mesmas alturas do .c-kpi real. */
.c-skeleton-kpi { padding: var(--pad-card); border: 1px solid var(--color-border);
  border-radius: var(--radius-md); background-color: var(--color-bg-surface); }
.c-skeleton-kpi .c-skeleton-line:first-child { height: 11px; width: 52%; }
.c-skeleton-kpi .c-skeleton-line:last-child  { height: 28px; width: 76%; margin-top: var(--sp-2); }

/* Tabela: N linhas de altura igual a da celula real. */
.c-skeleton-table { display: grid; gap: 0; }
.c-skeleton-table > * {
  display: grid;
  grid-template-columns: var(--skeleton-cols, 1.6fr 1fr 1fr 0.8fr);
  gap: var(--sp-4);
  padding: var(--pad-cell-y) var(--pad-cell-x);
  border-bottom: 1px solid var(--color-border-subtle);
}
.c-skeleton-table > *:last-child { border-bottom: 0; }
@media (max-width: 719px) {
  /* No mobile a tabela real vira cartao: o skeleton acompanha, senao o
     layout salta na troca. */
  .c-skeleton-table > * { grid-template-columns: 1fr 1fr; }
}

/* Grafico: caixa da mesma altura do .c-chart. */
.c-skeleton-chart { height: var(--chart-h, 260px); border-radius: var(--radius-md); }

/* Circulo — avatar, donut. */
.c-skeleton-circle { border-radius: var(--radius-pill); aspect-ratio: 1; width: 40px; }

/* ==========================================================================
   c-empty — estado vazio que ensina
   --------------------------------------------------------------------------
   "Sem dados" e a mensagem mais cara do produto: aparece exatamente quando o
   usuario acabou de chegar e ainda nao sabe o que a tela faz. Este
   componente troca o aviso por uma explicacao curta, um exemplo do que a
   tela vai mostrar e o botao que resolve.

   Estrutura:
     titulo       o que deveria estar aqui
     texto        por que esta vazio e o que muda quando nao estiver
     exemplo      uma linha ou cartao FANTASMA com dado ficticio (aria-hidden)
     acoes        a acao principal e, quando existe, o atalho de importacao
     dica         uma linha sobre o proximo passo
   ========================================================================== */

.c-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: var(--sp-3);
  padding: var(--sp-8) var(--sp-4);
  text-align: center;
}

/* Marca desenhada em CSS: tres barras e uma linha. Nao usa fonte de icone e
   nao usa imagem — e um estado vazio, nao vale uma requisicao. */
.c-empty__art {
  display: flex;
  align-items: flex-end;
  gap: 5px;
  height: 46px;
  margin-bottom: var(--sp-2);
  opacity: 0.55;
}
.c-empty__art span {
  display: block;
  width: 10px;
  border-radius: 2px 2px 0 0;
  background-color: var(--color-border-strong);
}
.c-empty__art span:nth-child(1) { height: 40%; }
.c-empty__art span:nth-child(2) { height: 72%; background-color: var(--color-brand); }
.c-empty__art span:nth-child(3) { height: 54%; }
.c-empty__art span:nth-child(4) { height: 92%; }

.c-empty__title {
  font-size: var(--text-h3);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-snug);
}
.c-empty__text {
  max-width: 46ch;
  font-size: var(--text-md);
  line-height: var(--lh-snug);
  color: var(--color-text-muted);
}

/* --------------------------------------------------------------------------
   Exemplo fantasma
   Mostra a forma do dado que vai aparecer. Fica translucido e com borda
   tracejada para nao ser confundido com dado real, e leva aria-hidden="true"
   no HTML para o leitor de tela nao ler numero inventado.
   -------------------------------------------------------------------------- */
.c-empty__sample {
  width: 100%;
  max-width: 520px;
  margin-top: var(--sp-2);
  padding: var(--sp-3) var(--sp-4);
  border: 1px dashed var(--color-border-strong);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-subtle);
  opacity: 0.9;
  text-align: left;
  font-size: var(--text-sm);
  color: var(--color-text-muted);
  pointer-events: none;
}
.c-empty__sample-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
}
.c-empty__sample-row + .c-empty__sample-row {
  margin-top: var(--sp-2);
  padding-top: var(--sp-2);
  border-top: 1px dashed var(--color-border);
}
.c-empty__sample-label {
  font-size: var(--text-2xs);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
}

.c-empty__actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3);
  justify-content: center;
  margin-top: var(--sp-3);
}

/* Dica final. Uma linha, nunca duas. */
.c-empty__hint {
  font-size: var(--text-xs);
  color: var(--color-text-muted);
}
.c-empty__hint kbd {
  padding: 1px 5px;
  border: 1px solid var(--color-border-strong);
  border-bottom-width: 2px;
  border-radius: var(--radius-xs);
  background-color: var(--color-bg-surface);
  font-size: var(--text-2xs);
}

/* Variante enxuta — dentro de painel pequeno (lateral, aba secundaria). */
.c-empty--tight { padding: var(--sp-6) var(--sp-4); gap: var(--sp-2); }
.c-empty--tight .c-empty__art { height: 28px; }
.c-empty--tight .c-empty__title { font-size: var(--text-lg); }
.c-empty--tight .c-empty__sample { display: none; }

/* Variante de erro/filtro: quando o vazio e resultado de um filtro, o texto
   nao deve ensinar a cadastrar — deve oferecer limpar o filtro. */
.c-empty--filtered .c-empty__art span:nth-child(2) { background-color: var(--color-warn); }



/* ==========================================================================
   calculator — Calculadora de expectancia
   Portado do pacote de 03/08. TUDO escopado em `.calc`: o calculator.js monta
   HTML com estas classes (.calc-kpi, .regua-*, .calc-alavanca, .calc-faixa).
   Cores: so tokens semanticos. "Perda" usa --color-loss*, nunca --color-danger:
   prejuizo nao e erro (design-system.md).
   ========================================================================== */
.calc{background:var(--color-bg-subtle);padding-bottom:var(--sp-8)}
.calc .container{width:100%;max-width:var(--container-max);margin:0 auto;padding-inline:var(--sp-4)}
.calc [hidden]{display:none!important}
.calc .gate-consent{display:flex;gap:var(--sp-2);align-items:flex-start;margin:0 0 var(--sp-3);font-size:13px;line-height:1.5;color:var(--color-text-secondary);cursor:pointer}
.calc .gate-consent input{flex:none;width:18px;height:18px;margin-top:1px;accent-color:var(--color-brand)}
.calc .gate-consent a{color:var(--color-text-link);text-decoration:underline}
.calc .calc-disclaimer{max-width:760px;margin:0 auto;padding:0 var(--sp-4);text-align:center;font-size:var(--text-sm);line-height:var(--lh-relaxed);color:var(--color-text-muted)}
.calc .calc-hero{padding:56px 0 8px;text-align:center}
.calc .calc-hero h1{font-size:clamp(26px,5.4vw,40px);font-weight:800;
  letter-spacing:-.02em;color:var(--color-text-primary);line-height:1.12}
.calc .calc-hero .lead{margin:14px auto 0;max-width:720px}
.calc .calc-honesto{max-width:660px;margin:18px auto 0;font-size:14px;
  color:var(--color-text-muted);line-height:1.6}
.calc .eyebrow{font-size:11px;font-weight:800;letter-spacing:.08em;
  text-transform:uppercase;color:var(--color-brand-text)}
.calc .center{text-align:center}
.calc .card{background:var(--color-bg-surface);border:1px solid var(--color-border);
  border-radius:var(--radius-md);box-shadow:var(--shadow-1);
  padding:28px 32px;max-width:900px;margin:24px auto}
.calc .card h3{font-size:17px;color:var(--color-text-primary);margin-bottom:10px}
.calc .card p{font-size:15px;color:var(--color-text-muted);line-height:1.65;margin-bottom:8px}
.calc .card p b{color:var(--color-text-primary)}
.calc .lab{font-size:11px;font-weight:800;letter-spacing:.08em;
  text-transform:uppercase;color:var(--color-brand-text)}
.calc .hide{display:none}
.calc .calc-form-wrap{padding-top:8px}
.calc .calc-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px 22px}
.calc .calc-field{display:block}
.calc .calc-label{display:block;font-size:13.5px;font-weight:700;
  color:var(--color-text-primary);margin-bottom:6px}
.calc .calc-label em{font-weight:500;font-style:normal;color:var(--color-text-muted)}
.calc .calc-input{display:flex;align-items:center;border:1.5px solid var(--color-border-strong);
  border-radius:var(--radius-sm);background:var(--color-bg-surface);transition:border-color .15s,box-shadow .15s}
.calc .calc-input:focus-within{border-color:var(--color-brand);
  box-shadow:0 0 0 3px var(--color-brand-subtle)}
.calc .calc-input input{font:inherit;font-size:16px;padding:12px 14px;border:none;
  background:none;width:100%;color:var(--color-text-primary)}
.calc .calc-input input:focus{outline:none}
.calc .calc-input i{font-style:normal;font-size:15px;color:var(--color-text-muted);
  padding:0 14px 0 0}
.calc .calc-input i.pre{padding:0 0 0 14px}
.calc .calc-field small{display:block;font-size:12.5px;color:var(--color-text-muted);
  margin-top:6px;line-height:1.45}
.calc .calc-field small b{color:var(--color-text-secondary)}
.calc .calc-optional{grid-column:1 / -1}
.calc .calc-optional .calc-input{border-style:dashed}
.calc .calc-avancado{margin-top:20px;border-top:1px solid var(--color-neutral-subtle);padding-top:14px}
.calc .calc-avancado summary{font-size:13.5px;color:var(--color-text-muted);cursor:pointer;
  list-style:none;user-select:none}
.calc .calc-avancado summary::-webkit-details-marker{display:none}
.calc .calc-avancado summary:before{content:"+ ";color:var(--color-brand-text);font-weight:800}
.calc .calc-avancado[open] summary:before{content:"− "}
.calc .calc-avancado .calc-field{margin-top:14px;max-width:340px}
.calc .calc-aviso{display:none;margin-top:16px;font-size:14px;
  color:var(--color-loss-text);background:var(--color-loss-subtle);
  border-radius:var(--radius-sm);padding:11px 14px}
.calc .calc-aviso.ativo{display:block}
.calc .calc-actions{display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  margin-top:22px}
.calc .calc-actions button{font:inherit;font-weight:700;font-size:15.5px;
  padding:14px 32px;border-radius:99px;border:none;cursor:pointer;
  background:var(--color-brand);color:var(--color-text-on-brand);transition:background .15s}
.calc .calc-actions button:hover{background:var(--color-brand-hover)}
.calc .calc-priv{font-size:12.5px;color:var(--color-text-muted)}
.calc .calc-veredicto-wrap{padding-top:28px}
.calc .calc-veredicto h2{font-size:clamp(21px,4vw,29px);font-weight:800;
  letter-spacing:-.015em;line-height:1.2;margin:6px 0 12px;color:var(--color-text-primary)}
.calc .calc-veredicto{border-left:4px solid var(--color-border-strong)}
.calc .calc-veredicto.tem-vantagem{border-left-color:var(--color-gain)}
.calc .calc-veredicto.sem-vantagem{border-left-color:var(--color-loss)}
.calc .calc-veredicto.no-fio{border-left-color:var(--color-warn)}
.calc .calc-kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;
  margin-top:22px}
.calc .calc-kpi{background:var(--color-bg-subtle);border-radius:var(--radius-sm);
  padding:14px 16px}
.calc .calc-kpi .k-lab{display:block;font-size:11.5px;color:var(--color-text-muted);
  margin-bottom:4px}
.calc .calc-kpi .k-val{display:block;font-size:18px;font-weight:800;
  color:var(--color-text-primary);letter-spacing:-.01em}
.calc .calc-kpi.pos .k-val{color:var(--color-gain-text)}
.calc .calc-kpi.neg .k-val{color:var(--color-loss-text)}
.calc .calc-regua{margin:34px 0 46px;padding:0 4px}
.calc .regua-barra{position:relative;height:10px;border-radius:99px;
  background:var(--color-gain-subtle)}
.calc .regua-zona-perda{position:absolute;left:0;top:0;height:100%;
  background:var(--color-loss-subtle);border-radius:99px 0 0 99px}
.calc .regua-marca{position:absolute;top:0;transform:translateX(-50%)}
.calc .regua-marca i{display:block;width:3px;height:22px;margin:-6px auto 0;
  border-radius:2px;background:var(--color-border-strong)}
.calc .regua-marca span{display:block;margin-top:6px;font-size:11.5px;
  color:var(--color-text-muted);text-align:center;white-space:nowrap;line-height:1.35}
.calc .regua-marca span b{display:block;font-size:14px;color:var(--color-text-primary)}
.calc .regua-be i{background:var(--color-text-secondary)}
.calc .regua-wr.pos i{background:var(--color-gain);height:28px;margin-top:-9px;width:4px}
.calc .regua-wr.pos span b{color:var(--color-gain-text)}
.calc .regua-wr.neg i{background:var(--color-loss);height:28px;margin-top:-9px;width:4px}
.calc .regua-wr.neg span b{color:var(--color-loss-text)}
.calc .calc-ruina{margin-top:20px}
.calc .calc-ruina-tit{font-size:13.5px;color:var(--color-text-muted);margin-bottom:10px}
.calc .calc-ruina table{width:100%;border-collapse:collapse;font-size:14.5px}
.calc .calc-ruina th{text-align:left;font-size:11.5px;font-weight:700;
  text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);
  padding:0 0 8px;border-bottom:1px solid var(--color-border)}
.calc .calc-ruina th:last-child,
.calc .calc-ruina td:last-child{text-align:right}
.calc .calc-ruina td{padding:10px 0;border-bottom:1px solid var(--color-neutral-subtle);
  color:var(--color-text-secondary)}
.calc .calc-ruina tr.baixo td:last-child{color:var(--color-gain-text);font-weight:700}
.calc .calc-ruina tr.medio td:last-child{color:var(--color-warn-text);font-weight:700}
.calc .calc-ruina tr.alto td:last-child{color:var(--color-loss-text);font-weight:700}
.calc .calc-ruina tr.minha td{background:var(--color-brand-subtle)}
.calc .calc-ruina tr.minha em{font-style:normal;color:var(--color-brand-text);
  font-weight:700;font-size:12.5px}
.calc .gate-card{border:1px solid var(--color-brand);background:var(--color-brand-subtle)}
.calc .gate-h{font-size:19px;margin:6px 0 16px;color:var(--color-text-primary)}
.calc .calc-lock-item{display:flex;gap:10px;align-items:flex-start;
  font-size:14.5px;color:var(--color-text-muted);padding:9px 0}
.calc .calc-lock-item i{flex:0 0 16px;height:16px;margin-top:3px;
  border-radius:4px;background:var(--color-border-strong)}
.calc .gate-fields{display:grid;grid-template-columns:1fr 1fr;gap:10px;
  margin-top:20px}
.calc .gate-fields input{font:inherit;font-size:15px;padding:12px 14px;
  border:1.5px solid var(--color-border-strong);border-radius:var(--radius-sm);background:var(--color-bg-surface)}
.calc .gate-fields input:focus{outline:none;border-color:var(--color-brand)}
.calc .gate-row{display:flex;align-items:center;gap:16px;flex-wrap:wrap;
  margin-top:14px}
.calc .gate-row button{font:inherit;font-weight:700;font-size:15px;
  padding:13px 26px;border-radius:99px;border:none;cursor:pointer;
  background:var(--color-brand);color:var(--color-text-on-brand);transition:background .15s}
.calc .gate-row button:hover{background:var(--color-brand-hover)}
.calc .gate-row button:disabled{opacity:.6;cursor:default}
.calc .priv{font-size:12px;color:var(--color-text-muted);max-width:340px;line-height:1.45}
.calc .priv a{color:var(--color-brand-text)}
.calc #calc-gate-aviso{display:none;margin-top:10px;font-size:13.5px;
  color:var(--color-loss-text)}
.calc #calc-gate-aviso.ativo{display:block}
.calc .calc-alavanca{display:grid;grid-template-columns:1fr 2fr auto;
  gap:14px;align-items:center;padding:11px 0;border-bottom:1px solid var(--color-neutral-subtle)}
.calc .calc-alavanca .a-lab{font-size:14px;color:var(--color-text-secondary)}
.calc .calc-alavanca .a-barra{height:8px;border-radius:99px;background:var(--color-neutral-subtle)}
.calc .calc-alavanca .a-barra i{display:block;height:100%;border-radius:99px;
  background:var(--color-brand)}
.calc .calc-alavanca .a-val{font-size:14.5px;font-weight:700;color:var(--color-text-primary);
  white-space:nowrap}
.calc .calc-alavanca .a-val small{font-weight:500;color:var(--color-text-muted);font-size:12px}
.calc .calc-faixa{display:flex;justify-content:space-between;align-items:baseline;
  gap:16px;padding:10px 0;border-bottom:1px solid var(--color-neutral-subtle);font-size:14.5px}
.calc .calc-faixa span{color:var(--color-text-muted)}
.calc .calc-faixa b{color:var(--color-text-primary);white-space:nowrap}
.calc .calc-sem-amostra{font-size:14.5px;color:var(--color-text-muted);background:var(--color-bg-subtle);
  border-radius:var(--radius-sm);padding:16px 18px;line-height:1.6}
.calc .calc-nota{font-size:13px;color:var(--color-text-muted);margin-top:14px;line-height:1.55}
.calc .ponte{max-width:900px;margin:28px auto;text-align:center;padding:0 20px}
.calc .ponte p{font-size:15.5px;color:var(--color-text-secondary);line-height:1.65;
  max-width:660px;margin:0 auto 20px}
.calc .btn-go{display:inline-block;font-weight:700;font-size:15px;
  padding:14px 30px;border-radius:99px;border:none;cursor:pointer;
  background:var(--color-brand);color:var(--color-text-on-brand);text-decoration:none;transition:background .15s}
.calc .btn-go:hover{background:var(--color-brand-hover)}
.calc .btn-go[hidden]{display:none}
@media (max-width:720px){
  .calc .card{padding:22px 20px;margin:18px 14px;border-radius:var(--radius-sm)}
  .calc .calc-grid{grid-template-columns:1fr;gap:14px}
  .calc .calc-field small{margin-top:4px}
  .calc .calc-kpis{grid-template-columns:1fr 1fr}
  .calc .gate-fields{grid-template-columns:1fr}
  .calc .calc-alavanca{grid-template-columns:1fr auto;gap:8px}
  .calc .calc-alavanca .a-barra{grid-column:1 / -1;order:3}
  .calc .calc-regua{margin:30px 0 52px}
  .calc .regua-marca span{font-size:10.5px}
  .calc .calc-actions{gap:10px}
  .calc .calc-actions button{width:100%}
  .calc .calc-priv{text-align:center;width:100%}
}
.calc .calc-hero{text-align:center;padding:var(--sp-8) 0 var(--sp-4)}
.calc .calc-hero h1{font-size:clamp(26px,5.4vw,40px);font-weight:800;letter-spacing:-.02em;line-height:1.12;color:var(--color-text-primary)}
.calc .calc-hero .lead{font-size:var(--text-xl);line-height:var(--lh-relaxed);color:var(--color-text-muted)}




/* ==========================================================================
   landing — site publico (home, planos, blog, FAQ, quiz)
   Mesmos tokens do painel. O que muda e o ritmo: mais respiro, tipografia
   fluida, linha de leitura mais curta.
   ========================================================================== */

.c-container {
  width: 100%;
  max-width: var(--container-max);
  margin: 0 auto;
  padding-inline: var(--sp-4);
}
@media (min-width: 720px) { .c-container { padding-inline: var(--sp-6); } }

/* --------------------------------------------------------------------------
   Cabecalho publico
   Verde-petroleo da marca, igual ao do sistema atual. Sticky.
   -------------------------------------------------------------------------- */
.c-topnav {
  position: sticky;
  top: 0;
  z-index: var(--z-sticky);
  background-color: var(--color-nav-bg);
  color: var(--color-nav-fg-strong);
}
.c-topnav__bar { display: flex; align-items: center; gap: var(--sp-4); min-height: 62px; }
.c-topnav__brand {
  display: flex; align-items: center; gap: var(--sp-2);
  font-size: var(--text-xl); font-weight: var(--fw-black);
  color: var(--color-nav-fg-strong);
}
.c-topnav__mark {
  flex: none;
  width: 32px; height: 32px;
  display: grid; place-items: center;
  border-radius: var(--radius-sm);
  background-image: var(--color-brand-gradient);
  color: var(--c0); /* símbolo branco no gradiente, como nos outros SaaS */
}
.c-topnav__burger {
  margin-left: auto;
  width: var(--tap-min); height: var(--tap-min);
  display: grid; place-items: center;
  color: var(--color-nav-fg-strong);
  font-size: var(--text-h3);
}
.c-topnav__menu {
  display: none;
  position: absolute;
  inset: 100% 0 auto 0;
  flex-direction: column;
  gap: var(--sp-1);
  padding: var(--sp-2) var(--sp-4) var(--sp-4);
  background-color: var(--color-nav-bg);
  box-shadow: var(--shadow-2);
}
.c-topnav__menu[data-open="true"] { display: flex; }
.c-topnav__link {
  display: flex; align-items: center;
  min-height: var(--tap-min);
  padding: 0 var(--sp-4);
  border-radius: var(--radius-pill);
  font-size: var(--text-md); font-weight: var(--fw-semibold);
  color: var(--color-nav-fg);
}
.c-topnav__link:hover { color: var(--color-nav-fg-strong); background-color: var(--color-nav-hover-bg); }

/* Item da pagina atual. O sistema atual tinha branco 100% sobre branco 12% —
   praticamente indistinguivel de um link normal, que ja e branco 85%. Fundo
   solido e peso maior resolvem de relance. */
.c-topnav__link[aria-current="page"] {
  background-color: var(--color-nav-hover-bg);
  color: var(--color-nav-fg-strong);
  font-weight: var(--fw-bold);
  box-shadow: inset 0 0 0 1px var(--color-nav-border);
}
/* O cursor segue o href, nao a marcacao: na pagina exata o link nao tem href
   e o cursor precisa dizer isso. */
.c-topnav__link[aria-current="page"]:not([href]) { cursor: default; }

.c-topnav__cta {
  background-color: var(--color-brand);
  color: var(--color-text-on-brand);
  font-weight: var(--fw-bold);
}
.c-topnav__cta:hover { background-color: var(--color-brand-hover); color: var(--color-text-on-brand); }

@media (min-width: 720px) {
  .c-topnav__bar { min-height: 68px; }
  .c-topnav__burger { display: none; }
  .c-topnav__menu {
    display: flex;
    position: static;
    flex-direction: row;
    align-items: center;
    margin-left: auto;
    padding: 0;
    gap: var(--sp-1);
    background-color: transparent;
    box-shadow: none;
  }
}

/* --------------------------------------------------------------------------
   Hero
   O gradiente e o de producao. A TINTA e escura: branco sobre a parada clara
   do gradiente da 2,05:1 e reprova AA no h1 e no subtitulo — que sao o texto
   que mais gente le no produto inteiro. Tinta escura sobre o mesmo gradiente
   da 8,82:1 na parada clara e 6,14:1 na escura, e a identidade continua
   reconhecivel a distancia: o que se ve de longe e o verde-agua.
   -------------------------------------------------------------------------- */
.c-hero {
  background-image: var(--color-brand-gradient);
  color: var(--color-text-on-brand);
  overflow: hidden;
}
.c-hero__inner {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-8);
  padding-block: var(--sp-9);
}
.c-hero__title {
  font-size: var(--text-display);
  font-weight: var(--fw-black);
  line-height: 1.06;
  letter-spacing: var(--tracking-tight);
  color: inherit;
}
.c-hero__sub {
  max-width: 34ch;
  margin-top: var(--sp-4);
  font-size: var(--text-xl);
  line-height: var(--lh-snug);
  opacity: 0.86;
}
.c-hero__actions { display: flex; flex-wrap: wrap; gap: var(--sp-3); margin-top: var(--sp-6); }
.c-hero__note {
  margin-top: var(--sp-5);
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  opacity: 0.75;
}

/* CTA sobre o hero: pilula escura solida. Sobre o gradiente claro, ela e o
   maior contraste possivel (18:1) — o olho vai direto. */
.c-btn--on-hero {
  background-color: var(--color-text-on-brand);
  background-image: none;
  color: var(--color-text-on-brand-invert);
}
.c-btn--on-hero:hover { filter: brightness(1.25); }

/* Mockup do painel no hero — montado em CSS, sem imagem. */
.c-hero__preview {
  padding: var(--sp-3);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  box-shadow: var(--shadow-3);
}

@media (min-width: 900px) {
  .c-hero__inner { grid-template-columns: 1.05fr 1fr; align-items: center; padding-block: var(--sp-10); }
}

/* --------------------------------------------------------------------------
   Secoes
   -------------------------------------------------------------------------- */
.c-section { padding-block: var(--sp-9); }
.c-section--muted { background-color: var(--color-bg-subtle); }
.c-section--dark {
  background-color: var(--color-nav-bg);
  color: var(--color-nav-fg-strong);
}
.c-section__head { max-width: 62ch; }
.c-section__head--center { margin-inline: auto; text-align: center; }

.c-eyebrow {
  font-size: var(--text-sm);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  color: var(--color-brand-text);
}
.c-section--dark .c-eyebrow { color: var(--color-brand); }

.c-section__title {
  margin-top: var(--sp-2);
  font-size: var(--text-section);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-tight);
  line-height: var(--lh-tight);
}
.c-section__lead {
  margin-top: var(--sp-3);
  font-size: var(--text-xl);
  line-height: var(--lh-relaxed);
  color: var(--color-text-muted);
}
.c-section--dark .c-section__title { color: var(--color-nav-fg-strong); }
.c-section--dark .c-section__lead { color: var(--color-nav-fg); }

/* --------------------------------------------------------------------------
   Cartoes de beneficio
   -------------------------------------------------------------------------- */
.c-benefits {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-4);
  margin-top: var(--sp-7);
}
@media (min-width: 720px)  { .c-benefits { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .c-benefits { grid-template-columns: repeat(var(--benefit-cols, 3), minmax(0, 1fr)); } }

.c-benefit {
  padding: var(--sp-6);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  transition: box-shadow var(--dur-base) var(--ease-out),
              transform var(--dur-base) var(--ease-out);
}
/* Aqui o levantar de 3px continua: e uma pagina de leitura, nao uma
   ferramenta, e o movimento indica que o cartao e um alvo. */
@media (hover: hover) {
  .c-benefit:hover {
    box-shadow: var(--shadow-2);
    border-color: var(--color-brand-border);
    transform: translateY(-3px);
  }
}
.c-benefit__icon {
  width: 46px; height: 46px;
  display: grid; place-items: center;
  margin-bottom: var(--sp-4);
  border-radius: var(--radius-sm);
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
  font-size: var(--text-h3);
}
.c-benefit__title { font-size: var(--text-xl); margin-bottom: var(--sp-2); }
.c-benefit__text { font-size: var(--text-lg); line-height: var(--lh-relaxed); color: var(--color-text-muted); }

/* Passos numerados */
.c-steps { display: grid; grid-template-columns: 1fr; gap: var(--sp-7); margin-top: var(--sp-8); }
@media (min-width: 900px) { .c-steps { grid-template-columns: repeat(3, 1fr); } }
.c-step {
  position: relative;
  padding: var(--sp-6);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
}
.c-step__n {
  position: absolute;
  top: calc(var(--sp-4) * -1);
  left: var(--sp-6);
  width: 36px; height: 36px;
  display: grid; place-items: center;
  border-radius: var(--radius-sm);
  background-image: var(--color-brand-gradient);
  color: var(--color-text-on-brand);
  font-weight: var(--fw-black);
  box-shadow: var(--shadow-1);
}
.c-step__title { margin: var(--sp-3) 0 var(--sp-2); font-size: var(--text-xl); }
.c-step__text { font-size: var(--text-lg); color: var(--color-text-muted); line-height: var(--lh-relaxed); }

/* --------------------------------------------------------------------------
   Planos
   -------------------------------------------------------------------------- */
.c-plans {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-5);
  margin-top: var(--sp-8);
}
@media (min-width: 860px) { .c-plans { grid-template-columns: repeat(var(--plan-cols, 2), minmax(0, 1fr)); max-width: 880px; margin-inline: auto; } }

.c-plan {
  position: relative;
  display: flex;
  flex-direction: column;
  padding: var(--sp-7) var(--sp-6);
  border: 2px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  text-align: center;
}
.c-plan--featured { border-color: var(--color-brand); box-shadow: var(--shadow-2); }
.c-plan__tag {
  position: absolute;
  top: -13px; left: 50%;
  transform: translateX(-50%);
  padding: 4px var(--sp-4);
  border-radius: var(--radius-pill);
  background-color: var(--color-brand);
  color: var(--color-text-on-brand);
  font-size: var(--text-2xs);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  white-space: nowrap;
}
.c-plan__name {
  font-size: var(--text-lg);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  color: var(--color-text-muted);
}
.c-plan__price {
  margin: var(--sp-2) 0 0;
  font-size: var(--text-section);
  font-weight: var(--fw-black);
  letter-spacing: var(--tracking-tight);
  font-variant-numeric: tabular-nums;
}
.c-plan__price small { font-size: var(--text-xl); font-weight: var(--fw-semibold); color: var(--color-text-muted); }
.c-plan__note { font-size: var(--text-sm); color: var(--color-text-muted); }
.c-plan__features { display: grid; gap: var(--sp-2); margin: var(--sp-5) 0; text-align: left; }
.c-plan__features li {
  display: flex; gap: var(--sp-2); align-items: flex-start;
  font-size: var(--text-lg); color: var(--color-text-secondary);
}
/* O "check" e desenhado com borda: sem fonte de icone, e continua existindo
   se a Font Awesome falhar. */
.c-plan__features li::before {
  content: "";
  flex: none;
  width: 6px; height: 11px;
  margin: 5px 4px 0 2px;
  border-right: 2px solid var(--color-gain-text);
  border-bottom: 2px solid var(--color-gain-text);
  transform: rotate(45deg);
}
.c-plan__features li[data-absent]::before {
  width: 10px; height: 10px; margin-top: 6px;
  border: 0;
  background-color: var(--color-border-strong);
  clip-path: polygon(20% 0, 50% 30%, 80% 0, 100% 20%, 70% 50%, 100% 80%, 80% 100%, 50% 70%, 20% 100%, 0 80%, 30% 50%, 0 20%);
  transform: none;
}
.c-plan .c-btn { margin-top: auto; }

/* Tabela comparativa de planos — a leitura densa, para quem quer conferir
   item a item. Reusa .c-table. */
.c-plan-compare th:not(:first-child),
.c-plan-compare td:not(:first-child) { text-align: center; }

/* --------------------------------------------------------------------------
   CTA final
   -------------------------------------------------------------------------- */
.c-cta {
  margin-top: var(--sp-9);
  padding: var(--sp-9) var(--sp-5);
  border-radius: var(--radius-md);
  background-image: var(--color-brand-gradient);
  color: var(--color-text-on-brand);
  text-align: center;
}
.c-cta__title { font-size: var(--text-section); color: inherit; }
.c-cta__text { margin: var(--sp-3) auto var(--sp-5); max-width: 52ch; opacity: 0.86; font-size: var(--text-xl); }

/* --------------------------------------------------------------------------
   Rodape
   -------------------------------------------------------------------------- */
.c-footer {
  padding-block: var(--sp-8) var(--sp-6);
  background-color: var(--color-nav-bg);
  color: var(--color-nav-fg);
}
.c-footer__grid { display: grid; grid-template-columns: 1fr; gap: var(--sp-7); }
.c-footer h4 {
  margin-bottom: var(--sp-3);
  font-size: var(--text-md);
  text-transform: uppercase;
  letter-spacing: var(--tracking-wide);
  color: var(--color-nav-fg-strong);
}
.c-footer a { display: block; padding: 5px 0; font-size: var(--text-md); color: var(--color-nav-fg); }
.c-footer a:hover { color: var(--color-nav-fg-strong); }
.c-footer__about { max-width: 42ch; font-size: var(--text-md); line-height: var(--lh-relaxed); }
.c-footer__legal {
  grid-column: 1 / -1;
  display: flex; flex-wrap: wrap; gap: var(--sp-3);
  align-items: center; justify-content: space-between;
  margin-top: var(--sp-3);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--color-nav-border);
  font-size: var(--text-sm);
}
.c-footer__legal a { display: inline; padding: 0; }

@media (pointer: coarse) {
  .c-topnav__brand,
  .c-footer__grid > div > a { min-height: var(--tap-min); display: flex; align-items: center; }
}

/* Aviso de risco. Nao e letra miuda decorativa: produto de bolsa precisa
   dizer que resultado passado nao garante resultado futuro, e o texto tem
   de ser legivel. Fica em --color-nav-fg (10,6:1), nao em opacidade baixa. */
.c-footer__disclaimer {
  grid-column: 1 / -1;
  max-width: 90ch;
  font-size: var(--text-sm);
  line-height: var(--lh-relaxed);
}

@media (min-width: 720px) {
  .c-footer__grid { grid-template-columns: 2fr 1fr 1fr; }
}

/* --------------------------------------------------------------------------
   Quiz / diagnostico — escopo proprio
   -------------------------------------------------------------------------- */
.c-quiz { max-width: 720px; margin-inline: auto; }
.c-quiz__progress {
  height: 6px;
  border-radius: var(--radius-pill);
  background-color: var(--color-neutral-subtle);
  overflow: hidden;
}
.c-quiz__progress > span {
  display: block; height: 100%;
  background-image: var(--color-brand-gradient);
  transition: width var(--dur-slow) var(--ease-out);
}
.c-quiz__count {
  margin-top: var(--sp-2);
  font-size: var(--text-xs);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}
.c-quiz__question { margin: var(--sp-6) 0 var(--sp-5); font-size: var(--text-h2); }
.c-quiz__options { display: grid; gap: var(--sp-3); }
.c-quiz__option {
  display: flex; align-items: center; gap: var(--sp-3);
  min-height: var(--tap-min);
  padding: var(--sp-3) var(--sp-4);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  font-size: var(--text-lg);
  text-align: left;
  cursor: pointer;
  transition: border-color var(--dur-fast) var(--ease-out),
              background-color var(--dur-fast) var(--ease-out);
}
.c-quiz__option:hover { border-color: var(--color-brand); background-color: var(--color-brand-subtle); }
.c-quiz__option[aria-pressed="true"] {
  border-color: var(--color-brand);
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
  font-weight: var(--fw-semibold);
}

/* ==========================================================================
   site — o que o site publico usa e a landing.css nao tinha
   Icones, mockup do hero, selos, cards e pagina de artigo, busca, paginacao
   e prosa (artigo e paginas legais). Nenhuma cor literal: so tokens.
   ========================================================================== */

/* --------------------------------------------------------------------------
   Icones
   O sprite mora no documento (layouts/components/icons.php) e nao ocupa
   espaco. `.c-icon` herda o tamanho da fonte do contexto: 1em, e o `fill`
   global do base.css e anulado porque os simbolos sao de traco.
   -------------------------------------------------------------------------- */
.u-sprite { position: absolute; width: 0; height: 0; overflow: hidden; }

.c-icon {
  display: inline-block;
  flex: none;
  width: 1em;
  height: 1em;
  fill: none;
  vertical-align: -0.125em;
}

.c-topnav__burger .c-icon { width: 24px; height: 24px; }
.c-benefit__icon .c-icon { width: 24px; height: 24px; }

/* --------------------------------------------------------------------------
   Mockup do hero
   -------------------------------------------------------------------------- */
.c-hero__preview { margin: 0; color: var(--color-text-primary); }

.c-preview__grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: var(--sp-3);
}

.c-preview__kpi {
  display: grid;
  gap: var(--sp-1);
  padding: var(--sp-4);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background-color: var(--color-bg-subtle);
}

.c-preview__label {
  font-size: var(--text-xs);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  color: var(--color-text-muted);
}

.c-preview__value {
  font-size: var(--text-h3);
  font-weight: var(--fw-black);
  font-variant-numeric: tabular-nums;
  letter-spacing: var(--tracking-tight);
}

.c-preview__value--gain { color: var(--color-gain-text); }

.c-preview__chart {
  display: block;
  width: 100%;
  height: 96px;
  margin-top: var(--sp-3);
  fill: none;
  color: var(--color-chart-equity);
}

.c-preview__caption {
  margin-top: var(--sp-2);
  font-size: var(--text-2xs);
  text-align: right;
  color: var(--color-text-muted);
}

/* --------------------------------------------------------------------------
   Selos de confianca
   -------------------------------------------------------------------------- */
.c-trust {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: var(--sp-3) var(--sp-6);
  margin-top: var(--sp-7);
  padding: 0;
  list-style: none;
}

.c-trust__item {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--text-md);
  font-weight: var(--fw-semibold);
  color: var(--color-text-secondary);
}

.c-trust__item .c-icon { width: 20px; height: 20px; color: var(--color-brand-text); }

/* --------------------------------------------------------------------------
   Blog — listagem
   -------------------------------------------------------------------------- */
.c-posts {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-5);
  margin-top: var(--sp-7);
}
@media (min-width: 720px)  { .c-posts { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (min-width: 1024px) { .c-posts { grid-template-columns: repeat(3, minmax(0, 1fr)); } }

.c-post-card {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-surface);
  overflow: hidden;
  transition: box-shadow var(--dur-base) var(--ease-out), border-color var(--dur-base) var(--ease-out);
}
@media (hover: hover) {
  .c-post-card:hover { box-shadow: var(--shadow-2); border-color: var(--color-brand-border); }
}

.c-post-card__cover {
  display: block;
  width: 100%;
  aspect-ratio: 1200 / 628;
  object-fit: cover;
  background-color: var(--color-bg-inset);
}

.c-post-card__body { display: flex; flex-direction: column; gap: var(--sp-2); padding: var(--sp-5); flex: 1; }

.c-post-card__category {
  font-size: var(--text-xs);
  font-weight: var(--fw-bold);
  text-transform: uppercase;
  letter-spacing: var(--tracking-caps);
  color: var(--color-brand-text);
}

.c-post-card__title { font-size: var(--text-xl); line-height: var(--lh-snug); }
.c-post-card__title a { color: inherit; }
.c-post-card__title a:hover { color: var(--color-text-link-hover); }

.c-post-card__excerpt { font-size: var(--text-md); line-height: var(--lh-relaxed); color: var(--color-text-muted); }

.c-post-card__meta {
  margin-top: auto;
  padding-top: var(--sp-3);
  font-size: var(--text-xs);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

/* Cabecalho da listagem: titulo a esquerda, busca a direita. */
.c-blog-head {
  display: grid;
  gap: var(--sp-5);
  align-items: end;
}
@media (min-width: 900px) { .c-blog-head { grid-template-columns: 1fr minmax(280px, 380px); } }

.c-search { display: flex; gap: var(--sp-2); }
.c-search .c-field__control { flex: 1; min-width: 0; }

.c-chips { display: flex; flex-wrap: wrap; gap: var(--sp-2); margin-top: var(--sp-5); padding: 0; list-style: none; }

.c-chip {
  display: inline-flex;
  align-items: center;
  min-height: 36px;
  padding: 0 var(--sp-4);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-pill);
  font-size: var(--text-sm);
  font-weight: var(--fw-semibold);
  color: var(--color-text-secondary);
  background-color: var(--color-bg-surface);
}
.c-chip:hover { border-color: var(--color-brand); color: var(--color-brand-text); }
.c-chip[aria-current="page"] {
  border-color: var(--color-brand);
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
}
@media (pointer: coarse) { .c-chip { min-height: var(--tap-min); } }

/* --------------------------------------------------------------------------
   Paginacao
   -------------------------------------------------------------------------- */
.c-pager {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: var(--sp-2);
  margin-top: var(--sp-8);
  padding: 0;
  list-style: none;
  font-variant-numeric: tabular-nums;
}

.c-pager__link,
.c-pager__gap {
  display: grid;
  place-items: center;
  min-width: var(--tap-min);
  min-height: var(--tap-min);
  padding: 0 var(--sp-3);
  border-radius: var(--radius-sm);
  font-size: var(--text-md);
  font-weight: var(--fw-semibold);
  color: var(--color-text-secondary);
}

.c-pager__link { border: 1px solid var(--color-border); background-color: var(--color-bg-surface); }
.c-pager__link:hover { border-color: var(--color-brand); color: var(--color-brand-text); }
.c-pager__link[aria-current="page"] {
  border-color: var(--color-brand);
  background-color: var(--color-brand-subtle);
  color: var(--color-brand-text);
}

/* --------------------------------------------------------------------------
   Artigo
   -------------------------------------------------------------------------- */
.c-article { max-width: var(--prose-max); margin-inline: auto; }

.c-article__title {
  margin-top: var(--sp-2);
  font-size: var(--text-section);
  font-weight: var(--fw-black);
  line-height: var(--lh-tight);
  letter-spacing: var(--tracking-tight);
}

.c-article__lead {
  margin-top: var(--sp-4);
  font-size: var(--text-xl);
  line-height: var(--lh-relaxed);
  color: var(--color-text-muted);
}

.c-article__meta {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-4);
  margin-top: var(--sp-4);
  font-size: var(--text-sm);
  color: var(--color-text-muted);
  font-variant-numeric: tabular-nums;
}

.c-article__cover {
  display: block;
  width: 100%;
  margin-top: var(--sp-6);
  border-radius: var(--radius-md);
  aspect-ratio: 1200 / 628;
  object-fit: cover;
  background-color: var(--color-bg-inset);
}

.c-article__aside {
  margin-top: var(--sp-8);
  padding: var(--sp-6);
  border: 1px solid var(--color-brand-border);
  border-radius: var(--radius-md);
  background-color: var(--color-brand-subtle);
}
.c-article__aside h2 { font-size: var(--text-h3); margin-top: var(--sp-1); }
.c-article__aside p { margin: var(--sp-2) 0 var(--sp-4); color: var(--color-text-secondary); line-height: var(--lh-relaxed); }

.c-article__disclaimer {
  margin-top: var(--sp-7);
  padding-top: var(--sp-5);
  border-top: 1px solid var(--color-border);
  font-size: var(--text-sm);
  line-height: var(--lh-relaxed);
  color: var(--color-text-muted);
}

.c-share { display: flex; flex-wrap: wrap; align-items: center; gap: var(--sp-2); margin-top: var(--sp-6); }
.c-share__title { margin-right: var(--sp-2); font-size: var(--text-sm); font-weight: var(--fw-bold); color: var(--color-text-muted); }
/* O botao nativo so aparece quando o navegador tem navigator.share — quem
   liga e o share.js, tirando o `hidden`. */
.c-share [hidden] { display: none; }

/* --------------------------------------------------------------------------
   Prosa — corpo de artigo e paginas legais
   O HTML vem do editor, sem classe nenhuma: o estilo e por elemento, dentro
   do escopo `.c-prose`, para nao vazar para o resto do site.
   -------------------------------------------------------------------------- */
.c-prose {
  max-width: var(--prose-max);
  margin-top: var(--sp-7);
  font-size: var(--text-xl);
  line-height: var(--lh-relaxed);
  color: var(--color-text-secondary);
  overflow-wrap: break-word;
}

.c-prose > * + * { margin-top: var(--sp-5); }

.c-prose h2 { margin-top: var(--sp-8); font-size: var(--text-h2); line-height: var(--lh-snug); color: var(--color-text-primary); }
.c-prose h3 { margin-top: var(--sp-7); font-size: var(--text-h3); line-height: var(--lh-snug); color: var(--color-text-primary); }
.c-prose h4 { margin-top: var(--sp-6); font-size: var(--text-xl); color: var(--color-text-primary); }

.c-prose a { color: var(--color-text-link); text-decoration: underline; text-underline-offset: 2px; }
.c-prose a:hover { color: var(--color-text-link-hover); }

.c-prose strong { font-weight: var(--fw-bold); color: var(--color-text-primary); }

.c-prose ul, .c-prose ol { padding-left: var(--sp-6); }
.c-prose ul { list-style: disc; }
.c-prose ol { list-style: decimal; }
.c-prose li + li { margin-top: var(--sp-2); }

.c-prose blockquote {
  padding: var(--sp-3) var(--sp-5);
  border-left: 4px solid var(--color-brand);
  background-color: var(--color-bg-subtle);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}

.c-prose img, .c-prose video, .c-prose iframe { max-width: 100%; height: auto; border-radius: var(--radius-sm); }

.c-prose code {
  padding: 2px 6px;
  border-radius: var(--radius-xs);
  background-color: var(--color-bg-inset);
  font-family: var(--font-mono);
  font-size: 0.9em;
}
.c-prose pre { padding: var(--sp-4); border-radius: var(--radius-sm); background-color: var(--color-bg-inset); overflow-x: auto; }
.c-prose pre code { padding: 0; background: none; }

/* Tabela de artigo rola sozinha no celular em vez de estourar a pagina. */
.c-prose table { display: block; width: 100%; overflow-x: auto; border-collapse: collapse; font-size: var(--text-md); font-variant-numeric: tabular-nums; }
.c-prose th, .c-prose td { padding: var(--sp-2) var(--sp-3); border: 1px solid var(--color-border); text-align: left; }
.c-prose th { background-color: var(--color-bg-subtle); color: var(--color-text-primary); }

.c-prose hr { border: 0; border-top: 1px solid var(--color-border); margin-block: var(--sp-7); }

.c-prose__updated { font-size: var(--text-sm); color: var(--color-text-muted); }

/* ==========================================================================
   diagnosis — Diagnostico do Operacional
   Portado do sistema em producao. TUDO escopado em `.diag`: as classes sao
   genericas (.card, .progress, .item) porque o diagnosis.js monta HTML com
   elas, e sem o escopo colidiriam com o resto do site.
   Cores: so tokens semanticos — acompanha tema claro e escuro.
   Botoes e campos usam .c-btn e .c-field__control; o que sobrou aqui e o que
   e proprio do quiz.
   ========================================================================== */
.diag{
  display:flex;
  flex-direction:column;
  min-height:calc(100vh - 62px);
  min-height:calc(100dvh - 62px);
  background:var(--color-bg-subtle);
}
.diag section{padding:var(--sp-5) 0}
.diag .diag-lead{max-width:760px;margin:14px auto 0;text-align:center;font-size:var(--text-xl);line-height:var(--lh-relaxed);color:var(--color-text-muted)}
.diag .diag-hero--result{padding-top:36px}
.diag .diag-destaque,.diag .gate-card .lab{color:var(--color-brand-text)}
.diag .quiz-voltar{font:inherit;font-size:13px;color:var(--color-text-muted);background:none;border:0;padding:var(--sp-2) 0;cursor:pointer}
.diag .quiz-voltar:hover{color:var(--color-text-primary)}
.diag .gate-consent{display:flex;gap:var(--sp-2);align-items:flex-start;margin:0 0 var(--sp-3);font-size:13px;line-height:1.5;color:var(--color-text-secondary);cursor:pointer}
.diag .gate-consent input{flex:none;width:18px;height:18px;margin-top:1px;accent-color:var(--color-brand)}
.diag .gate-consent a{color:var(--color-text-link);text-decoration:underline}
.diag .diag-disclaimer{max-width:760px;margin:0 auto var(--sp-8);text-align:center;font-size:var(--text-sm);line-height:var(--lh-relaxed);color:var(--color-text-muted)}
.diag .gate-card .leitura{margin:16px 0 4px}
.diag .diag-hero{padding:56px 0 8px;text-align:center}
.diag .diag-hero h1{font-size:clamp(26px,5.4vw,40px);font-weight:800;letter-spacing:-.02em;color:var(--color-text-primary);line-height:1.12}
.diag .diag-lead{margin:14px auto 0}
.diag .card{background:var(--color-bg-surface);border:1px solid var(--color-border);border-radius:var(--radius-md);box-shadow:var(--shadow-1);padding:32px 36px;max-width:900px;margin:28px auto}
.diag .etapas4{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:28px auto;max-width:1040px}
.diag .et4{background:var(--color-bg-surface);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:18px}
.diag .et4 b{display:block;font-size:14px;color:var(--color-text-primary);margin-bottom:4px}
.diag .et4 span{font-size:12.5px;color:var(--color-text-muted);line-height:1.45}
.diag .etapas-titulo{text-align:center;font-size:12px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--color-text-muted);max-width:1040px;margin:0 auto 4px}
.diag .intro-cta{text-align:center;margin:34px auto 8px}
.diag .quiz-top{display:flex;justify-content:space-between;align-items:center;font-size:13px;color:var(--color-text-muted);font-weight:700;margin-bottom:10px}
.diag .quiz-top .pilar{color:var(--color-brand-text);text-transform:uppercase;letter-spacing:.06em;font-size:11px}
.diag .progress{height:7px;border-radius:4px;background:var(--color-neutral-subtle);overflow:hidden;margin-bottom:26px}
.diag .progress i{display:block;height:100%;background:var(--color-brand-gradient);border-radius:4px;transition:width .25s}
.diag .pergunta{font-size:19px;font-weight:700;color:var(--color-text-primary);line-height:1.35;min-height:78px}
.diag .opcoes{display:grid;gap:10px;margin-top:22px}
.diag .opcao{text-align:left;font:inherit;font-size:15px;padding:15px 18px;border:1.5px solid var(--color-border-strong);border-radius:var(--radius-sm);background:var(--color-bg-surface);cursor:pointer;color:var(--color-text-secondary);transition:.12s}
.diag .opcao:hover{border-color:var(--color-brand);color:var(--color-text-primary)}
.diag .quiz-nav{margin-top:18px;font-size:13px}
.diag .quiz-nav a{color:var(--color-text-muted);cursor:pointer}
.diag .res-head{text-align:center;margin-bottom:6px}
.diag .res-head .score{font-size:52px;font-weight:800;color:var(--color-text-primary);line-height:1}
.diag .res-head .score small{font-size:18px;color:var(--color-text-muted);font-weight:600}
.diag .res-head p{font-size:14.5px;color:var(--color-text-muted);margin-top:8px}
.diag .res-pilares{display:grid;gap:14px;margin:26px 0}
.diag .rp{display:grid;grid-template-columns:110px 1fr 44px;gap:12px;align-items:center}
.diag .rp .nome{font-size:13.5px;font-weight:700;color:var(--color-text-secondary)}
.diag .rp .trilha{height:10px;border-radius:5px;background:var(--color-neutral-subtle);overflow:hidden}
.diag .rp .trilha i{display:block;height:100%;border-radius:5px;transition:width .6s}
.diag .rp .nota{font-size:13.5px;font-weight:800;color:var(--color-text-primary);text-align:right;font-variant-numeric:tabular-nums}
.diag .veredicto{background:var(--color-bg-subtle);border-left:3px solid var(--color-brand);border-radius:0 var(--radius-sm) var(--radius-sm) 0;padding:18px 20px;margin-top:8px}
.diag .veredicto h3{font-size:16px;color:var(--color-text-primary);margin-bottom:6px}
.diag .veredicto p{font-size:14.5px;color:var(--color-text-muted)}
.diag .veredicto .ajuste{margin-top:12px;font-size:14px;color:var(--color-text-secondary)}
.diag .veredicto .ajuste b{color:var(--color-text-primary)}
.diag .ponte{max-width:760px;margin:8px auto 56px;text-align:center}
.diag .ponte p{font-size:15px;color:var(--color-text-muted);margin-bottom:18px}
.diag .ancora-tag{color:var(--color-text-muted)!important}
.diag .perfil{background:var(--color-brand-subtle);border:1px solid var(--color-brand);border-radius:var(--radius-sm);padding:20px 22px;margin:26px 0 8px}
.diag .perfil .lab{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--color-brand-text)}
.diag .perfil h3{font-size:19px;color:var(--color-text-primary);margin:6px 0 8px;letter-spacing:-.01em}
.diag .perfil p{font-size:14.5px;color:var(--color-text-secondary);line-height:1.55}
.diag .leitura{display:grid;gap:12px;margin:22px 0}
.diag .leitura .item{border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:14px 16px;background:var(--color-bg-surface)}
.diag .leitura .item h4{font-size:13px;color:var(--color-text-primary);margin-bottom:4px;display:flex;justify-content:space-between;align-items:baseline}
.diag .leitura .item h4 .n{font-size:12px;font-weight:800;font-variant-numeric:tabular-nums}
.diag .leitura .item p{font-size:13.5px;color:var(--color-text-muted);line-height:1.5}
.diag .gate-card{margin-top:18px}
.diag .gate-card .lab{font-size:11px;font-weight:800;letter-spacing:.08em;text-transform:uppercase}
.diag .gate-h{font-size:19px;color:var(--color-text-primary);margin-top:8px;letter-spacing:-.01em}
.diag .gate-h span{color:var(--color-brand-text)}
.diag .locked{display:grid;gap:8px;margin:14px 0 0}
.diag .lk{display:flex;align-items:center;gap:12px;border:1px solid var(--color-border);border-radius:var(--radius-sm);
  padding:12px 15px;background:var(--color-bg-subtle)}
.diag .lk .ic{width:17px;height:17px;flex:none;color:var(--color-text-muted)}
.diag .lk .nm{font-size:13.5px;font-weight:700;color:var(--color-text-secondary)}
.diag .lk .bar{height:6px;border-radius:99px;background:var(--color-border);overflow:hidden;width:150px;margin-left:auto}
.diag .lk .bar i{display:block;height:100%;border-radius:99px}
.diag .lk .nt{font-size:12px;font-weight:800;color:var(--color-text-muted);font-variant-numeric:tabular-nums;width:38px;text-align:right}
.diag .gate-form{border-top:1px solid var(--color-border);margin-top:22px;padding-top:22px}
.diag .gate-tit{font-size:15px;font-weight:800;color:var(--color-text-primary);margin-bottom:4px}
.diag .gate-sub{font-size:13.5px;color:var(--color-text-muted);margin-bottom:16px}
.diag .gate-fields{display:grid;gap:10px;margin-bottom:12px}
.diag .gate-row{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.diag .priv{font-size:12px;color:var(--color-text-muted)}
.diag .priv a{color:var(--color-text-muted);text-decoration:underline}
@media(min-width:600px){.diag .gate-fields{grid-template-columns:1fr 1fr}}
.diag .hide{display:none!important}
@media(min-width:720px){.diag .etapas4{grid-template-columns:repeat(5,1fr)}}
.diag #tela-intro, .diag #tela-quiz, .diag #tela-resultado{flex:1 0 auto;display:flex;flex-direction:column}
.diag #tela-intro{justify-content:center;padding:48px 0 64px}
.diag #tela-intro .diag-hero{padding:0 0 8px}
.diag #tela-quiz{justify-content:center}
.diag #tela-quiz .card{max-width:720px}
.diag #tela-intro .diag-lead{max-width:760px}
.diag #tela-resultado .ferr-hero{max-width:900px;margin:0 auto}
.diag .gate-erro{font-size:13.5px;font-weight:600;color:var(--color-danger-text);margin-bottom:10px}

.diag .card{box-shadow:var(--shadow-2)}
.diag .quiz-head{text-align:center;max-width:720px;margin:0 auto 22px}
.diag .quiz-head h2{font-size:clamp(20px,3.4vw,26px);font-weight:800;letter-spacing:-.02em;
  color:var(--color-text-primary);line-height:1.2;margin:0 0 8px}
.diag .quiz-head p{font-size:14.5px;color:var(--color-text-muted);line-height:1.5;margin:0}
@media(max-width:720px){
  .diag .quiz-head{margin-bottom:16px}
  .diag .card{padding:24px 20px}
}
.diag .card{box-shadow:var(--shadow-3)}
.diag .et4{box-shadow:var(--shadow-2);transition:box-shadow .15s,transform .15s}
.diag .et4:hover{box-shadow:var(--shadow-3);transform:translateY(-3px)}
.diag [hidden]{display:none!important}

/* ==========================================================================
   auth — as telas do InfinityID com a cara do Infinity Trader
   O markup é do pacote (sharedcode/views/infinityid/): login, cadastro,
   escolha de conta, bloqueio, recusa. O Trader NÃO sobrescreve as views — a
   bancada do InfinityID reprova (SPEC_GROW §0). Estilo é CSS, e as classes
   abaixo são o contrato: auth-layout, auth-panel, auth-card, auth-header,
   auth-form, auth-field (has-error, --check), auth-field-error, auth-btn
   (--primary), auth-link, auth-alert (--error, --success), auth-accounts,
   auth-account, auth-countdown, auth-brand.
   Tudo escopado em `.auth-page` (o bodyClass que a casca do pacote passa).
   ========================================================================== */

.auth-page { background: var(--color-bg-subtle); }

.auth-page .auth-layout {
  display: grid;
  grid-template-columns: 1fr;
  min-height: 100vh;
  min-height: 100dvh;
}
@media (min-width: 960px) {
  .auth-page .auth-layout { grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); }
}

/* Painel da marca: o pacote o entrega `display:none`; o Trader liga no
   desktop, com o gradiente da identidade. Decorativo (aria-hidden). */
.auth-page .auth-brand { display: none; }
@media (min-width: 960px) {
  .auth-page .auth-brand {
    display: flex;
    align-items: center;
    padding: var(--sp-8);
    background: var(--color-brand-gradient);
    color: var(--color-text-on-brand);
    overflow: hidden;
  }
}
.auth-page .auth-brand-blobs { display: none; }
.auth-page .auth-logo { display: flex; align-items: center; gap: var(--sp-2); font-weight: var(--fw-black); font-size: var(--text-xl); }
.auth-page .auth-logo-mark { width: 28px; height: 28px; border-radius: var(--radius-sm); background: currentColor; opacity: .9; }
.auth-page .auth-brand-headline { margin-top: var(--sp-7); font-size: var(--text-section); line-height: var(--lh-tight); letter-spacing: var(--tracking-tight); }
.auth-page .auth-brand-sub { margin-top: var(--sp-4); font-size: var(--text-xl); line-height: var(--lh-relaxed); opacity: .9; max-width: 36ch; }

.auth-page .auth-panel {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--sp-6) var(--sp-4);
}
.auth-page .auth-card {
  width: 100%;
  max-width: 420px;
  padding: var(--sp-7) var(--sp-6);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background: var(--color-bg-surface);
  box-shadow: var(--shadow-2);
}

.auth-page .auth-header h1 { font-size: var(--text-h2); line-height: var(--lh-snug); color: var(--color-text-primary); }
.auth-page .auth-header p { margin-top: var(--sp-2); color: var(--color-text-muted); line-height: var(--lh-relaxed); }

.auth-page .auth-form { display: grid; gap: var(--sp-4); margin-top: var(--sp-6); }

.auth-page .auth-field { display: grid; gap: var(--sp-1); }
.auth-page .auth-field label { font-size: var(--text-sm); font-weight: var(--fw-semibold); color: var(--color-text-secondary); }
.auth-page .auth-field input[type="email"],
.auth-page .auth-field input[type="password"],
.auth-page .auth-field input[type="text"] {
  width: 100%;
  min-height: var(--control-h, 44px);
  padding: 0 var(--sp-3);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-sm);
  background: var(--color-bg-surface);
  color: var(--color-text-primary);
  font: inherit;
}
.auth-page .auth-field input:focus { outline: 2px solid var(--color-brand); outline-offset: 1px; border-color: var(--color-brand); }
.auth-page .auth-field.has-error input { border-color: var(--color-danger); }
.auth-page .auth-field-error { font-size: var(--text-sm); color: var(--color-danger-text); }

.auth-page .auth-field--check { grid-template-columns: auto 1fr; align-items: center; gap: var(--sp-2); }
.auth-page .auth-field--check input { width: 18px; height: 18px; accent-color: var(--color-brand); }
.auth-page .auth-field--check label { font-weight: var(--fw-regular, 400); }

.auth-page .auth-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: var(--tap-min, 44px);
  padding: 0 var(--sp-5);
  border: 1px solid var(--color-border-strong);
  border-radius: var(--radius-sm);
  background: var(--color-bg-surface);
  color: var(--color-text-primary);
  font: inherit;
  font-weight: var(--fw-bold);
  cursor: pointer;
}
.auth-page .auth-btn--primary {
  width: 100%;
  border-color: transparent;
  background: var(--color-brand-gradient);
  color: var(--color-text-on-brand);
}
.auth-page .auth-btn--primary:hover { filter: brightness(.97); }

.auth-page .auth-link { color: var(--color-text-link); text-decoration: underline; text-underline-offset: 2px; }
.auth-page .auth-link:hover { color: var(--color-text-link-hover); }

.auth-page .auth-alert {
  margin-top: var(--sp-4);
  padding: var(--sp-3) var(--sp-4);
  border-radius: var(--radius-sm);
  border: 1px solid var(--color-border);
  background: var(--color-bg-subtle);
  font-size: var(--text-sm);
  line-height: var(--lh-relaxed);
}
.auth-page .auth-alert--error { border-color: var(--color-danger); color: var(--color-danger-text); }
.auth-page .auth-alert--success { border-color: var(--color-gain); color: var(--color-gain-text); }

.auth-page .auth-accounts { display: grid; gap: var(--sp-2); margin-top: var(--sp-5); padding: 0; list-style: none; }
.auth-page .auth-account {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  width: 100%;
  padding: var(--sp-3) var(--sp-4);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-sm);
  background: var(--color-bg-surface);
  font: inherit;
  text-align: left;
  cursor: pointer;
}
.auth-page .auth-account:hover { border-color: var(--color-brand); }

.auth-page .auth-countdown { font-variant-numeric: tabular-nums; font-weight: var(--fw-bold); color: var(--color-text-primary); }

.auth-page .auth-panel--centered .auth-card { text-align: center; }

/* ==========================================================================
   c-consent — barra de consentimento (LGPD)
   Canto inferior, nao faixa de largura total: faixa cobre o CTA da landing
   no celular e derruba conversao. As duas opcoes tem o mesmo peso visual
   ("aceitar" nao pode ser o unico botao bonito) — recusar precisa ser tao
   facil quanto aceitar.
   ========================================================================== */

.c-consent {
  position: fixed;
  z-index: var(--z-consent);
  inset: auto var(--sp-3) var(--sp-3) var(--sp-3);
  padding: var(--sp-4) var(--sp-5);
  border: 1px solid var(--color-border);
  border-radius: var(--radius-md);
  background-color: var(--color-bg-raised);
  box-shadow: var(--shadow-3);
  color: var(--color-text-secondary);
}
.c-consent[hidden] { display: none; }

.c-consent__text {
  font-size: var(--text-sm);
  line-height: var(--lh-relaxed);
  margin-bottom: var(--sp-3);
}
.c-consent__text a { color: var(--color-text-link); text-decoration: underline; }

.c-consent__actions { display: flex; flex-wrap: wrap; gap: var(--sp-2); }
.c-consent__actions .c-btn { flex: 1 1 auto; }

@media (min-width: 720px) {
  .c-consent { inset: auto var(--sp-6) var(--sp-6) auto; max-width: 480px; }
  .c-consent__actions .c-btn { flex: 0 0 auto; }
}

/* Entrada discreta: sobe 12px uma vez. Sem isto a barra aparece de estalo no
   meio da leitura. */
@media (prefers-reduced-motion: no-preference) {
  .c-consent { animation: c-consent-in var(--dur-slow) var(--ease-out); }
  @keyframes c-consent-in {
    from { opacity: 0; transform: translateY(12px); }
    to   { opacity: 1; transform: none; }
  }
}

