← Biblioteca componentes/prova/numero-gigante/ficha.md CódigoTela cheia
prova/numero-gigante

Número gigante com fonte do dado

🟢 estavel complexidade baixa prefixo ngig- big-number numeros prova-social tipografia dado-unico compliance sem-js sem javascript

Incluir · as linhas que se colam num site novo, depois do core (CLAUDE.md §10)

<link rel="stylesheet" href="componentes/prova/numero-gigante/estilo.css">

markup.html · 88 linhas · 4,9 KB

<!-- ==========================================================================
     NÚMERO GIGANTE — um dado só, ocupando a dobra
     Prefixo: ngig-
     Requer: core (tokens, base, motion.css, motion.js) + estilo.css
     SEM JavaScript. Sem lib.

     A IDEIA. Três ou quatro números diluem o mais forte; um número em corpo
     gigante é uma afirmação. Esta dobra existe para o caso em que UM dado
     carrega o argumento inteiro — "19 anos", "R$ 2,3 bi sob assessoria",
     "340 famílias". A cifra é a peça gráfica (a primitiva .display-xl do
     core), o rótulo diz o que ela mede, e ao lado ficam a frase de contexto
     e a linha de fonte e data. O irmão prova/stats-contador-regua resolve o
     caso oposto: três a quatro números de peso EQUIVALENTE, em régua, com
     contagem. Sempre que os números empatam em peso, ele ganha — a ficha diz
     em que casos.

     NÃO HÁ CONTAGEM, E É DECISÃO MEDIDA. A régua conta porque três números
     subindo juntos leem como medição. Aqui a contagem falha por dois motivos,
     e o primeiro é aritmético: a largura de "0" e a de "2,3" não são a mesma,
     então o afixo "bi" e todo o resto da linha ANDARIAM na horizontal durante
     a contagem. Medido no corpo desta dobra (283,9px em 1440): "0" ocupa
     170,3px e "2,3" ocupa 421,1px — 250,8px de deslocamento. Na célula da
     régua, em corpo 92px, a mesma troca desloca 81,3px, que passa. Aqui não
     passa. O segundo motivo é de compliance: num número de ESTOQUE, contar de
     zero anima a acumulação, e acumulação animada é insinuação de retorno.
     O movimento da peça é o reveal do core — blur indo a zero sobre um glifo
     de 280px, que é bastante.

     A FONTE DO DADO NÃO É OPCIONAL. O .ngig-fonte é slot exigido: número sem
     fonte e sem data é alegação, não fato. Não existe variação desta peça sem
     ele — se não há fonte nomeada, o número não vai para corpo gigante, vira
     uma linha de prosa. O filete que fecha a coluna mora nessa linha de
     propósito: apagá-la deixa a composição visivelmente inacabada.

     --ngig-glifos NA SEÇÃO, e é o parafuso que ninguém adivinha. O corpo da
     cifra é DIVIDIDO pela contagem de glifos, e é isso que mantém a largura
     da figura constante quando o número troca — medido, ela fica entre 66% e
     90% da coluna em todo caso testado, de "4" a "R$ 1.240 mi", de 320px a
     1920px de tela. A conta:

         cada dígito ................ 1
         vírgula ou ponto ........... 0,5
         cada afixo (o bloco todo) .. 0,5

     "R$ 2,3 bi" = 2 dígitos + vírgula + dois afixos = 3,5, que é o valor
     abaixo. Mínimo prático 2: um número de um dígito declarado como 1 leva o
     corpo a 993px em 1440, o que não é mais tipografia, é acidente.

     CONTEÚDO ILUSTRATIVO. O número abaixo é exemplo redondo para dimensionar
     a dobra — não é dado apurado de nenhuma casa, e a fonte citada é
     plausível mas fictícia. Ao usar, troque pelo número real, pela fonte real
     e pela data real, e leia a seção Compliance da ficha: número de ESTOQUE e
     de TRAJETÓRIA entram aqui; número de RESULTADO não entra.
     ========================================================================== -->

<section class="sec-paper sec-pad ngig" style="--ngig-glifos:3.5">
  <div class="wrap ngig-grid">

    <div class="ngig-corpo">
      <p class="eyebrow" data-rv>Patrimônio</p>

      <!-- O afixo é o que NÃO é dígito: moeda na frente, multiplicador atrás.
           Fica em corpo reduzido de propósito — "R$ 2,3 bi" todo no mesmo
           corpo é uma manchete, não um número gigante. São de 1 a 3
           caracteres: palavra de unidade ("anos", "famílias") é trabalho do
           rótulo, não do afixo, e posta aqui ela desmancha a conta de glifos.

           Os espaços entre os três <span> são intencionais: o .ngig-figura é
           flex, então eles não desenham nada na tela (o vão é o `gap`), mas
           continuam no textContent — e é por isso que o leitor de tela ouve
           "R$ 2,3 bi" e não "R$2,3bi". Não ponha aria-hidden aqui: o número é
           para ser lido como número. -->
      <p class="ngig-figura" data-rv>
        <span class="ngig-afixo ngig-afixo-antes">R$</span>
        <span class="ngig-valor display-xl">2,3</span>
        <span class="ngig-afixo ngig-afixo-depois">bi</span>
      </p>

      <p class="ngig-rotulo" data-rv data-d="1">sob assessoria da Liberta, em dezembro de 2025.</p>
    </div>

    <div class="ngig-lado">
      <p class="sec-lead ngig-contexto" data-rv data-d="2">Soma do patrimônio das famílias e empresas que acompanhamos, custodiado nas instituições escolhidas por cada cliente. É patrimônio sob assessoria — não é receita da Liberta nem resultado de carteira.</p>
      <p class="ngig-fonte" data-rv data-d="3">Fonte: relatório consolidado de custódia, posição de 31/12/2025.</p>
    </div>

  </div>
</section>

estilo.css · 234 linhas · 11,8 KB

/* ==========================================================================
   NÚMERO GIGANTE — prefixo ngig-
   Uma cifra em corpo de dobra, com rótulo embaixo e, ao lado, a frase de
   contexto e a linha de fonte e data. Sem JavaScript, sem @keyframes: a
   entrada é o [data-rv] do core e não há mais movimento nenhum na peça.

   Tokens usados:
     --display          a face da cifra e dos afixos
     --fg --fg-2        tinta da cifra / dos afixos, da prosa e da linha de fonte
     --accent           na variação .ngig--accent
     --rule             o filete acima da linha de fonte
     --sec-gap          o respiro da dobra, via .sec-pad do core

   Primitivas do core (usadas, NÃO recopiadas):
     .wrap  .sec-pad  .sec-paper  .eyebrow  .sec-lead  .display-xl

   A CONTA QUE É O COMPONENTE, e a medição que a sustenta. Nesta face, com
   algarismos tabulares e o tracking de -.02em da primitiva, cada dígito ocupa
   0,60em e a vírgula 0,28em — medido: "0000" dá 240px em corpo 100px, "2,3"
   dá 148,36px, e "1111" e "8888" dão exatamente o mesmo. Logo a largura da
   cifra é glifos x 0,60em. Dividir o CORPO pela contagem de glifos faz os
   dois fatores se cancelarem: a largura da figura fica praticamente
   constante, seja o valor "19", "2,3" ou "1.240".

   A contagem que o markup declara em --ngig-glifos:
       cada dígito ................ 1
       vírgula ou ponto ........... 0,5
       cada afixo (o bloco todo) .. 0,5
   Os dois últimos pesos foram calibrados contra a medição, não estimados: a
   contagem declarada e a contagem real (tinta / corpo / 0,60) ficam a menos
   de 5% uma da outra em todos os casos de 1 a 4 dígitos com afixos de até 3
   caracteres. Resultado medido: a figura ocupa entre 66% e 90% da coluna, em
   oito formatos de número por seis larguras de tela (320 a 1920), sem
   estourar em nenhuma.

   O QUE QUEBRA SE ALGUÉM "CONSERTAR":
   - tirar `font-variant-numeric:tabular-nums` do .ngig-valor. Aqui ele não
     está segurando contagem nenhuma (não há contagem): é o que torna a conta
     acima EXATA. Sem ele, "1111" mede 0,42em por dígito e "8888" mede 0,59em
     — 42% de diferença —, e o mesmo --ngig-glifos passa a produzir figuras de
     larguras muito diferentes conforme os algarismos sorteados.
   - pôr uma palavra de unidade no afixo ("anos", "famílias"). Um afixo de 8
     caracteres vale ~1,8 glifo e não 0,5, e a figura salta para 98% da coluna
     — medido. Palavra de unidade é trabalho do .ngig-rotulo.
   - trocar o --display-xl-lh de .8 por um valor >=1. Entrelinha frouxa em
     corpo de 280px abre um vão morto entre a cifra e o rótulo que nenhuma
     margem negativa conserta sem virar número mágico.
   ========================================================================== */

.ngig{
  /* ---- os três parafusos ------------------------------------------------
     --ngig-glifos  a contagem de glifos da figura, pela regra do cabeçalho.
                    Declarado no MARKUP, na própria seção, porque é o único
                    número que muda junto com o conteúdo. Mínimo prático 2:
                    um número de um dígito declarado como 1 leva o corpo a
                    993px em 1440, o que não é mais tipografia, é acidente.
     --ngig-passo   quanto da tela a figura toma, calibrado para TRÊS glifos.
                    É o único valor a mexer para a cifra ficar maior ou menor.
     --ngig-afixo   corpo dos afixos, como fração do corpo da cifra. */
  --ngig-glifos:3;
  --ngig-passo:23vw;
  --ngig-afixo:.24;

  /* O piso e o teto são divididos pela mesma contagem que o valor ideal, e
     isso é de propósito: um clamp com piso fixo passaria a estourar a coluna
     justamente no caso que a conta existe para cobrir — número comprido em
     tela estreita, onde o piso venceria. */
  --ngig-corpo:calc(clamp(48px,var(--ngig-passo),332px) * 3 / var(--ngig-glifos));

  /* Alimenta os dois parafusos da primitiva .display-xl do core. Ficam AQUI,
     no ancestral, e não no .ngig-valor: a primitiva os lê como fallback
     dentro do var(), e declarados no mesmo elemento eles venceriam o valor
     que o componente quisesse pôr por fora. Mesma forma do --frase-corpo do
     conteudo/manifesto-com-imagens.

     A entrelinha é .8 — mais fechada que o .95 padrão da primitiva — e o
     motivo é que aqui a linha é só de algarismos: não há descendente de "q"
     nem ascendente de "l" para colidir, e o padrão .95 sobraria como vão
     morto abaixo da cifra. É o mesmo raciocínio que fez o .82 antigo da
     primitiva funcionar em caixa alta. */
  --display-xl:var(--ngig-corpo);
  --display-xl-lh:.8;
}

/* ---------------------------------------------------------------- a coluna */
/* A cifra fica na coluna larga; o contexto e a fonte, numa estreita ao lado,
   alinhados pelo PÉ. Alinhar pelo pé e não pelo topo é o que faz a prosa
   parecer legenda da cifra em vez de uma segunda coluna de texto.
   Nada aqui toca padding-inline, max-width ou margin lateral: a coluna
   continua sendo só a .wrap (contrato §4). */
.ngig-grid{
  display:grid;
  grid-template-columns:minmax(0,1fr) minmax(220px,28%);
  gap:clamp(30px,4vw,64px);
  align-items:end;
}

/* ---------------------------------------------------------------- a figura */
/* Flex com alinhamento por linha de base: os afixos são corpo reduzido e
   têm de sentar na mesma base da cifra, senão a figura deixa de ler como
   uma linha de tipografia e passa a ler como três peças empilhadas.

   `line-height:1` aqui é para os AFIXOS (a cifra tem a sua, da primitiva):
   sem isto eles herdariam o 1.6 do corpo do texto e inflariam a linha do
   flex, empurrando o rótulo para baixo.

   `flex-wrap` fica no padrão (nowrap) e o `white-space:nowrap` cobre o caso
   de alguém escrever um valor com espaço dentro. Se o número for comprido
   demais para a contagem declarada, o transbordo é para SER VISTO e
   corrigido — igual ao que a régua faz na célula dela. */
.ngig-figura{
  display:flex;
  align-items:baseline;
  gap:.07em;
  font-size:var(--ngig-corpo);
  line-height:1;
  white-space:nowrap;
  margin-top:clamp(10px,1.6vh,22px);
}

/* O desenho da cifra é a primitiva .display-xl do core. Sobra aqui só o que
   é desta peça. */
.ngig-valor{
  /* Ver o cabeçalho: é o que torna exata a conta de --ngig-glifos. */
  font-variant-numeric:tabular-nums;
}

/* Afixo: moeda na frente, multiplicador atrás — de 1 a 3 caracteres. Em
   --fg-2 e não em --fg de propósito: no mesmo tom da cifra ele disputa com
   ela, e o que tem de dominar a dobra é o algarismo. */
.ngig-afixo{
  font-family:var(--display);
  font-weight:700;
  font-size:calc(var(--ngig-afixo) * 1em);
  letter-spacing:-.01em;
  color:var(--fg-2);
}
/* Um respiro a mais na frente: "R$" encostado no primeiro algarismo lê como
   um glifo só, e o vão do `gap` sozinho não resolve porque ele é calculado no
   corpo da CIFRA, não no do afixo. O de trás é multiplicador ("bi", "mi",
   "%") e já se separa sozinho — a classe dele existe para a skill de layout
   saber onde escrever cada metade (ver o bloco editorial do componente.json). */
.ngig-afixo-antes{margin-right:.08em}

/* ---------------------------------------------------------------- rótulo */
/* O que o número mede. Segue em --sans (a cifra já é a display) e em corpo
   médio: é a legenda da cifra, não um título de seção — se ele precisar de
   corpo de título, o número não estava carregando o argumento sozinho e a
   peça é a errada.

   O tracking do corpo do texto (--ls-body, .05em) é calibrado para 17px; em
   30px ele abre a linha demais. Daqui em diante é tipografia desta peça. */
.ngig-rotulo{
  font-size:clamp(18px,2.1vw,30px);
  line-height:1.32;
  letter-spacing:.01em;
  color:var(--fg);
  max-width:24ch;
  /* O VÃO É PROPORCIONAL AO CORPO DA CIFRA, e não à janela, e a razão é a
     vírgula. Com `--display-xl-lh:.8` a caixa da cifra fecha nos algarismos,
     que não têm descendente — mas a vírgula tem, e a tinta dela passa 0,109em
     ABAIXO da caixa (medido: 35,4px num corpo de 283,9). Um vão em px ou vh
     acerta uma largura de tela e erra as outras: medido antes desta correção,
     o rabo da vírgula sobrepunha os ascendentes do rótulo em 4,8px em 1440 e
     1px em 1920, e sobrava folga só em 390. Em em da cifra, a folga é a mesma
     em toda tela. O piso de 16px existe para tela muito estreita, onde a
     cifra é pequena e o vão proporcional ficaria apertado para o olho. */
  margin-top:max(16px,calc(var(--ngig-corpo) * .14));
}

/* ---------------------------------------------------------------- o lado */
/* A frase de contexto veste a primitiva .sec-lead do core (corpo, entrelinha,
   tinta de apoio e teto de 60ch) — aqui a coluna é mais estreita que 60ch, e
   o teto não tem efeito. O que sobra é a ressalva: ela vive nesta frase, ao
   lado do número, e não num rodapé de página.

   O margin-top de 18px que a primitiva traz FICA: com a coluna alinhada pelo
   pé ele é invisível no desktop, e no mobile empilhado é justamente o respiro
   que separa o rótulo do contexto. */
.ngig-lado{align-self:end}

/* A linha de fonte e data. Slot EXIGIDO — ver o cabeçalho do markup.
   Em --fg-2 e não em --fg-muted, e a escolha é de compliance e não de gosto:
   a fonte do dado é o que transforma alegação em fato, e um cinza de rodapé
   diz o contrário do que a linha existe para dizer.

   O filete mora aqui, e não num invólucro, para que apagar a linha apague o
   fechamento da coluna junto: a composição fica visivelmente inacabada, que
   é a única defesa que CSS consegue dar a um slot obrigatório. */
.ngig-fonte{
  margin-top:clamp(16px,2.2vh,26px);
  padding-top:13px;
  border-top:1px solid var(--rule);
  font-size:12.5px;
  line-height:1.55;
  letter-spacing:.04em;
  color:var(--fg-2);
}

/* ---------------------------------------------------------------- variações */
/* Cifra na cor de marca. Use quando a dobra inteira é sobre o número; em
   página que já gasta accent em título e botão, deixe em --fg.

   Lê --accent-ink e NÃO --accent, seguindo o `h2.sec-title em` do core: o
   accent puro é cor de botão e de filete, não de texto sobre claro — com o
   sage da Liberta sobre o creme do .sec-paper ele dá 1,36:1 (MANUAL §3), e
   o padrão desta peça É o .sec-paper. Numa cifra de 280px isso não seria um
   realce discreto, seria a dobra inteira ilegível. O fallback mantém a
   variação de pé para quem colar o bloco fora de um escopo de tom. */
.ngig--accent .ngig-valor{color:var(--accent-ink,var(--accent))}

/* Composição centrada: uma coluna só, tudo no meio. Vira pôster — e aí o
   número tem de ser curto (2 ou 3 glifos), senão a figura toma a linha
   inteira e o rótulo perde o apoio da margem esquerda. */
.ngig--centro .ngig-grid{grid-template-columns:1fr;justify-items:center;text-align:center}
.ngig--centro .ngig-figura{justify-content:center}
.ngig--centro .ngig-rotulo{max-width:32ch}

/* Afixo da frente à meia-altura da cifra, em vez de na linha de base. É a
   convenção de cifra financeira; ficou fora do padrão porque, com o afixo de
   trás sendo palavra ("bi"), os dois em alturas diferentes desalinham a
   leitura da linha. Vale quando os dois afixos são símbolo. */
.ngig--afixo-alto .ngig-afixo-antes{align-self:center}

/* ---------------------------------------------------------------- mobile */
/* Empilha, e a cifra CRESCE em relação à tela: com uma coluna só ela tem a
   largura inteira para ocupar, e o --ngig-passo de desktop a deixaria pequena
   no meio de tanto espaço. É a mesma peça, recalibrada — e o recálculo é uma
   linha porque a conta do corpo está toda em --ngig-passo. */
@media(max-width:900px){
  .ngig{--ngig-passo:40vw}
  .ngig-grid{grid-template-columns:1fr;gap:clamp(24px,4vh,38px)}
  .ngig-rotulo{max-width:30ch}
}

Uma cifra só, em corpo de 280px, ocupando a dobra. Os afixos — a moeda na frente, o multiplicador atrás — ficam em corpo reduzido na mesma linha de base, para que o algarismo domine e a figura ainda se leia como uma linha de tipografia. Embaixo da cifra, o rótulo diz o que ela mede. Na coluna estreita ao lado, alinhada pelo pé, ficam a frase de contexto (que carrega a ressalva) e a linha de fonte e data. Nada se move depois de entrar: a peça é gráfica, e o movimento dela é o reveal do core — blur indo a zero sobre um glifo de 280px.

O problema editorial é o da diluição. Uma régua de três ou quatro números trata os números como equivalentes, e é isso que ela faz bem; o preço é que o mais forte perde peso ao lado dos outros. Quando existe um dado que carrega o argumento inteiro — "19 anos", "R$ 2,3 bi sob assessoria", "340 famílias" —, dividir a dobra com dois números de apoio é gastar o argumento. Um número em corpo gigante não é um número maior: é uma afirmação, e a dobra inteira existe para ela.

Substitui prova/stats-contador-regua no caso em que só um dos números importa. Em todo caso em que os números são equivalentes em peso, a régua ganha — e isso é a maioria dos casos.


Quando usar

Quando não usar


Padrão editorial

Slot Regra
Olho (.eyebrow) 1 a 2 palavras. Nomeia a medida, não o benefício: "Patrimônio", "Trajetória". Opcional. Não há título de seção nesta peça — o número é o título —, e o olho é o único rótulo de dobra que ela aceita.
Afixo da frente (.ngig-afixo-antes) 1 a 3 caracteres, só símbolo: R$, US$, +, ~. Palavra não entra. Opcional.
Valor (.ngig-valor) 1 a 5 caracteres, só o número: 2,3, 19, 97, 340, 1.240. Redondo — "2,347" em 280px lê como planilha, não como afirmação. Acima de 5 caracteres o corpo cai tanto que a dobra deixa de ser gigante, e aí a peça certa é a régua.
Afixo de trás (.ngig-afixo-depois) 1 a 3 caracteres: bi, mi, mil, %, x. Palavra de unidade ("anos", "famílias") vai no rótulo — medido, um afixo de 8 caracteres empurra a figura para 98% da coluna. Opcional.
Rótulo (.ngig-rotulo) 4 a 9 palavras. Diz o que o número mede e carrega a unidade que não caberia no afixo. Substantivo, sem verbo de ação e sem superlativo: "sob assessoria da Liberta, em dezembro de 2025", não "já ultrapassamos". Minúscula inicial: a frase continua a cifra. Quando o número é taxa (97%), a data de referência é obrigatória aqui, não só na linha de fonte.
Contexto (.ngig-contexto) 18 a 34 palavras, duas frases. A primeira diz como o número foi construído (o que entra na soma); a segunda é a ressalva — o que o número não é. Ela mora aqui, ao lado da cifra, nunca num rodapé de página.
Fonte e data (.ngig-fonte) 5 a 14 palavras. Exigido. Fonte nomeada mais data ou posição: "Fonte: relatório consolidado de custódia, posição de 31/12/2025".

O que mantém a peça coesa é a cadeia número → rótulo → contexto → fonte, lida nessa ordem e cada elo mais miúdo que o anterior. Se o rótulo é mais interessante que o número, ou se o contexto precisa de três frases para o número fazer sentido, o dado não estava carregando a dobra sozinho — e a peça é a errada.

Uma cifra por peça, uma peça por página. As duas coisas são a mesma regra.

Especificação dos assets

Nenhum. A peça é inteiramente tipográfica: sem imagem, sem ícone, sem SVG. O que ela requer não é asset, é procedência:


Compliance

Esta seção não é sobre redação. É sobre a forma da peça. Um número em corpo de 280px é o lugar da página onde a promessa mora, e a mesma frase que passa em 17px de prosa vira insinuação em 280px de display.

1. Número de estoque e de trajetória, nunca de resultado

Entra Não entra
R$ 2,3 bi sob assessoria (estoque de custódia) +14,2% de rentabilidade média
19 anos de casa (trajetória) R$ 400 mi de ganho gerado para clientes
340 famílias e empresas (estoque de carteira de clientes) 2,3x o CDI
4 escritórios (estrutura) 97% das carteiras acima do benchmark

O critério é: o número descreve o que a casa tem e por quanto tempo, ou o que o dinheiro do cliente fez? O primeiro entra; o segundo não, e não é questão de reescrever a frase. Um número de resultado em corpo gigante é a forma mais eficiente de prometer retorno que existe — ele afirma sem verbo, sem ressalva legível e sem sujeito.

Um 97% de renovação de contrato é caso de fronteira: é estoque de relação (quantos clientes ficaram), não resultado de carteira. Passa com a data de referência no rótulo e com a base da conta no contexto ("dos clientes com mais de doze meses de casa").

2. A fonte do dado fica na peça, não no rodapé

O slot .ngig-fonte é exigido no markup, e isso é decisão de arquitetura e não de gosto: se ele fosse opcional, a primeira pessoa com pressa o apagaria, e o número passaria de fato a alegação sem que nada acusasse. Duas consequências no código:

A cor dela é --fg-2, a mesma tinta da prosa de apoio, e não --fg-muted. Cinza de rodapé diz o contrário do que a linha existe para dizer.

3. Data de referência

97% dos clientes renovam envelhece sem que ninguém note; 97% dos clientes renovaram em 2025 não. Quando o número é taxa ou proporção, a data entra no rótulo, onde o olho já está, e se repete na linha de fonte com a posição do documento. Quando o número é de trajetória (19 anos), a data implícita é hoje e a linha de fonte basta.

4. A ressalva onde a pessoa lê o número

A segunda frase de .ngig-contexto existe para dizer o que o número não é, e ela fica ao lado da cifra. No exemplo: "É patrimônio sob assessoria — não é receita da Liberta nem resultado de carteira." Uma ressalva no rodapé da página não protege ninguém: quem para nesta dobra lê a cifra, o rótulo e o contexto, e vai embora.

O que o consumidor troca antes de publicar

  1. O valor, os afixos e o --ngig-glifos da seção.
  2. O rótulo, com a unidade e a data de referência.
  3. As duas frases do contexto — a construção do número e a ressalva —, revisadas por quem responde por compliance.
  4. A linha de fonte, com o nome do documento e a posição.
  5. Conferir que o número escolhido está na coluna "Entra" da tabela acima.

Como usar

<link rel="stylesheet" href="core/tokens.css">
<link rel="stylesheet" href="core/temas/<projeto>.css">
<link rel="stylesheet" href="core/base.css">
<link rel="stylesheet" href="core/motion.css">
<link rel="stylesheet" href="componentes/prova/numero-gigante/estilo.css">
...
<script src="core/motion.js"></script>

Não há script.js. A entrada vem do core/motion.js, que a página já carrega; sem ele — bloqueador, JavaScript desligado — a @media (scripting: none) do core/motion.css devolve tudo visível. Medido nos dois modos, no Chrome com javaScriptEnabled:false: a dobra tem 643px de altura com script e 643px sem, a cifra fica em opacity:1 / filter:none no segundo caso, e a linha de fonte também. A página não fica em branco.

O parafuso que ninguém adivinha

<section class="sec-paper sec-pad ngig" style="--ngig-glifos:3.5">

O corpo da cifra é dividido pela contagem de glifos, e é isso que mantém a largura da figura constante quando o número troca. A contagem:

vale
cada dígito 1
vírgula ou ponto 0,5
cada afixo (o bloco todo, de 1 a 3 caracteres) 0,5

Mínimo prático 2. A tabela pronta:

Figura --ngig-glifos
19 2
4 (dígito só) 2 — não 1; ver os gotchas
97 + % 2,5
340 + + 3,5
R$ + 2,3 + bi 3,5
R$ + 8,4 + mi 3,5
R$ + 1.240 + mi 5,5

Ganchos

Gancho Papel
.ngig A seção. Declara os parafusos e alimenta os da primitiva .display-xl.
--ngig-glifos A contagem acima. No style da seção, porque muda com o conteúdo. Padrão 3.
--ngig-passo Quanto da tela a figura toma, calibrado para três glifos. 23vw no desktop, 40vw abaixo de 900px, com teto de 332px. É o único valor a mexer para a cifra ficar maior ou menor.
--ngig-afixo Corpo dos afixos como fração do corpo da cifra. .24.
--display-xl / --display-xl-lh Parafusos da primitiva do core, alimentados pela .ngig: var(--ngig-corpo) e .8.
.ngig-grid O .wrap, que aqui também é a grade de duas colunas. Não toca em padding-inline, max-width nem margem lateral.
.ngig-figura O flex com alinhamento por linha de base. É onde o data-rv pega.
.ngig-valor A cifra. Veste .display-xl do core; o que é local é só o tabular-nums.
.ngig-afixo + -antes / -depois Os afixos. As duas classes de lado existem para a skill de layout saber onde escrever cada metade.
.ngig-rotulo A legenda da cifra.
.ngig-lado A coluna estreita, alinhada pelo pé.
.ngig-contexto Veste .sec-lead do core. Carrega a ressalva.
.ngig-fonte Fonte e data. Slot exigido; o filete de fechamento é dela.
[data-rv] + data-d="1|2|3" A entrada, do core. A peça não tem classe de estado própria.

Variações

Variação Como
Cifra na cor de marca .ngig--accent na seção. Lê --accent-ink, não --accent — ver o gotcha. Em página que já gasta a cor de marca em título e botão, deixe em --fg.
Pôster centrado .ngig--centro na seção: uma coluna, tudo no meio. Pede número de 2 ou 3 glifos.
Afixo da frente à meia-altura .ngig--afixo-alto. Convenção de cifra financeira; vale quando os dois afixos são símbolo.
Em dobra escura troque .sec-paper por .sec-deep ou .sec-dark. Cifra, afixos, filete e prosa leem os mesmos nomes e invertem sozinhos.
Sem afixo apague os dois <span> e desconte 0,5 de --ngig-glifos por cada. Caso de 19 ou 340, em que a unidade mora no rótulo.
Cifra maior ou menor só --ngig-passo. Não mexa em --display-xl direto: ele é alimentado pela conta.

Não há variação sem a linha de fonte. Ver ## Compliance.


A contagem que este componente recusou

O irmão prova/stats-contador-regua conta de zero até o alvo em 1,8s, e a ficha dele explica por quê: três números subindo juntos leem como medição. Aqui a contagem foi recusada, e a recusa foi medida antes de ser argumentada.

O motivo aritmético. A largura de 0 e a de 2,3 não são a mesma, então a cifra e tudo à direita dela andariam na horizontal durante a contagem:

corpo largura de 0 largura do alvo deslocamento
esta dobra (1440) 283,9px 170,3px 421,1px (2,3) 250,8px
célula da régua (1440) 92px 55,2px 136,5px (2,4) 81,3px

81px dentro de uma célula de 365px passa; a régua vive com isso. 251px numa figura de 612px é o afixo bi atravessando um terço da coluna, e reservar a largura com min-width não resolve — troca o deslize por um vão vazio de 251px durante 1,8s, ao lado de uma cifra que ainda não é a cifra.

O motivo de compliance, que é o que decide. Num número de estoque, contar de zero anima a acumulação. Uma cifra de patrimônio subindo é a imagem de uma curva de crescimento, e é exatamente a insinuação que a seção ## Compliance existe para não fazer. A régua sofre menos disso porque três números subindo juntos leem como "estamos medindo", não como "está subindo".

O que fica no lugar. O reveal do core: filter: blur(14px) indo a zero sobre um glifo de 280px, mais fade e subida, escalonado em quatro tempos (cifra, rótulo, contexto, fonte) pelo data-d. Nada entra seco, e nada continua se movendo depois. Sob prefers-reduced-motion o core desliga os quatro e o número final aparece de imediato — medido: opacity:1, filter:none, transform:none, transition-duration:0s.

Uma consequência boa. Sem contagem, tabular-nums deixa de ser o que segura o número de tremer e passa a ser o que torna exata a conta de --ngig-glifos. Mesma declaração que a régua, razão diferente — e é por isso que o comentário dela no estilo.css não é o mesmo.


Gotchas

- paragraph: Patrimônio - paragraph: R$ 2,3 bi - paragraph: sob assessoria da Liberta, em dezembro de 2025. - paragraph: Soma do patrimônio das famílias e empresas que acompanhamos, … - paragraph: "Fonte: relatório consolidado de custódia, posição de 31/12/2025."

Um parágrafo, "R$ 2,3 bi", com os espaços no lugar — não três fragmentos nem "R$2,3bi". Se um projeto precisar da leitura por extenso ("dois bilhões e trezentos milhões"), o caminho é aria-hidden="true" na .ngig-figura mais uma frase .visually-hidden do core ao lado com o valor escrito em palavras. Não está implementado porque duplica o dado em dois lugares e um dos dois vai envelhecer sozinho.


Histórico

Projeto Onde Data Diferenças
autoral — 2026-09-06 Origem. Sem referência única e sem uma linha copiada.

A forma vem da página de abertura de relatório anual e da capa de balanço de gestora: a cifra como peça gráfica, com o apparatus — fonte, data, ressalva — impresso ao lado e não em nota de rodapé. Na tradução para o contrato mudaram três coisas, e as três são o componente:

No padrão de origem Aqui Por quê
Corpo da cifra escolhido a olho, por peça --ngig-glifos e o corpo dividido pela contagem Impresso, cada peça é diagramada uma vez. Aqui a mesma peça tem de aceitar 19 e R$ 1.240 mi em telas de 320 a 1920 sem estourar a coluna. A escala virou aritmética, calibrada por medição: figura entre 66% e 90% da coluna em oito formatos por seis larguras.
Fonte e data em corpo miúdo, no pé da página .ngig-fonte na peça, slot exigido, com o filete de fechamento Contrato de compliance da biblioteca: a ressalva vai onde a pessoa lê o número. Opcional, o slot seria apagado.
Número de resultado é comum em material de gestora Só estoque e trajetória Assessoria independente não promete retorno. A regra decide a forma e não só o texto — ver ## Compliance.

Normalizações aplicadas: prefixo ngig- em toda classe; cor, face e ritmo só por token; a cifra vestindo a primitiva .display-xl do core em vez de escala tipográfica própria; o contexto vestindo .sec-lead; entrada pelos ganchos data-rv / data-d do core, sem observer nem keyframe próprio; escopo de tom declarado no markup (.sec-paper), sem override de --fg.

Divergências conhecidas vs. produção: nenhuma — a peça nasceu aqui.

Em aberto — a linha de procedência é candidata a primitiva

.ngig-fonte é a segunda aparição da mesma ideia com forma diferente: a régua resolve procedência com .pill ("Apurado em 01/2026") no .stat-foot, e aqui é uma linha de texto com filete em cima. O dados/grade-indicadores traz o período por indicador, que é uma terceira forma da mesma coisa. Se uma quarta peça de número precisar declarar fonte e data, isto passa do gatilho de três do §6 e vale promover — provavelmente como .fonte-dado, linha de 12,5px em --fg-2 com filete, e não como pílula. Não promovi: mexer no core está fora do escopo desta leva, e a promoção teria de reescrever a régua junto. Fica registrado.

Em aberto — --ngig-passo em vw e não na largura da coluna

A conta calibra a figura por vw, e o que ela quer de fato é a fração da coluna. Os dois batem porque o .wrap ocupa entre 86% e 90% da janela em toda a faixa útil (medido: 1240 de 1440 e 350 de 390), mas deixam de bater num contêiner mais estreito que a janela — a peça dentro de uma coluna de 60% de um layout de dashboard, por exemplo. A resposta certa seria cqw com container-type:inline-size, que nenhum componente da biblioteca usa hoje; adotar a primeira unidade de container query da casa é decisão de arquitetura e não foi tomada. Enquanto não for, a peça é de dobra de página inteira, que é o uso para o qual foi calibrada.

Calibragem no primeiro uso. Espere ajustar --ngig-passo quando o tema trouxer uma display condensada — o que se persegue é a fração da coluna, não o número —, e --ngig-afixo se a face tiver símbolo de moeda muito estreito.