← Biblioteca componentes/conteudo/abertura-tipografica/ficha.md CódigoTela cheia
conteudo/abertura-tipografica

Abertura tipográfica de dobra

🟢 estavel complexidade baixa prefixo abt- abertura tipografia titulo-gigante frase-de-abertura ritmo-assimetrico quebra-na-mao palavra-a-palavra respiro sem-js sem-imagem sem javascript

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

<link rel="stylesheet" href="componentes/conteudo/abertura-tipografica/estilo.css">

markup.html · 76 linhas · 4,4 KB

<!-- ==========================================================================
     ABERTURA TIPOGRÁFICA — a dobra que anuncia um capítulo e não carrega nada
     Prefixo: abt-
     Requer: core (tokens, base, motion.css, motion.js) + estilo.css
     SEM JavaScript.

     A IDEIA. Olho, uma frase em corpo de display e um apoio curto. Nada
     abaixo: nem card, nem lista, nem foto, nem botão. A frase não é o RÓTULO
     de um conteúdo que vem em seguida dentro da mesma seção — ela é a peça
     inteira, e o conteúdo que ela anuncia mora na dobra seguinte. É por isso
     que a peça usa .display-xl (a primitiva gráfica que enche a coluna) e
     não h2.sec-title (o rótulo de 26–40px em 22ch).

     O QUE A SEPARA DE UM CABEÇALHO DE SEÇÃO, e a pergunta é honesta porque
     .sec-head + h2.sec-title + .sec-lead do core desenham quase isto:

       1. Ela não tem embaixo. O .sec-head é o topo de uma dobra cujo miolo
          vem logo depois, dentro do mesmo .wrap; aqui não há miolo.
       2. O ritmo é ASSIMÉTRICO. Uma abertura pertence ao que ela abre: mais
          respiro em cima, para se soltar da dobra densa anterior, e menos
          embaixo, para grudar no capítulo que anuncia. .sec-pad é simétrico
          por definição (padding:var(--sec-gap) 0) e não sabe dizer isso.
       3. A frase enche a coluna e alinha à ESQUERDA. O .sec-head centra em
          760px — e centrado, com foto atrás, isto já existe na casa: é o
          bloco de texto do midia/colunas-cascata.
       4. O <em> em corpo de display. O core só pinta o itálico de marca em
          h2.sec-title em; .display-xl não tem essa regra, e a frase de uma
          abertura precisa dela.

     ALINHAMENTO À ESQUERDA, e é decisão. Centrada, a abertura vira monumento
     e se desprende do que vem depois; alinhada à coluna, ela lê como a
     primeira linha do capítulo. Para o monumento existe .abt-centro (ficha,
     Variações), e existe o irmão conteudo/manifesto-com-imagens, que é
     centrado de propósito porque é pontuação e não porta de entrada.

     O TOM É DO CAPÍTULO, NÃO DA ABERTURA. A seção declara o mesmo escopo de
     tom da dobra que ela abre — aqui .sec-deep, com .sec-dark antes e o
     capítulo em .sec-deep depois (ver preview-antes / preview-extra). Trocar
     o escopo é a variação nº 1 da ficha; num escopo CLARO o realce do <em>
     precisa ir junto (--abt-em), porque a cor de marca some ali — a conta
     medida está no estilo.css.

     A QUEBRA É CONTEÚDO. A linha termina onde o <br class="abt-quebra">
     manda, e a primitiva .display-xl já traz text-wrap:initial para que
     balance não desfaça a escolha. Abaixo de 720px o <br> se apaga e a
     quebra volta a ser automática: a linha escrita para 1096px de coluna é
     quebrada por dentro pelo navegador, e aí o <br> produz um TOCO de uma
     palavra (medido: 92px a 601px de viewport). O corte de 720 é função
     DESTA copy e DESTA fonte — trocar a frase obriga a remedir.

     O ESPAÇO ANTES DO <br> é obrigatório e não é formatação: com o <br> em
     display:none no mobile, sem ele "escrita" e "antes" colam numa palavra
     só. O split do core preserva o nó de espaço, então ele sobrevive.

     ENTRADA. Três ganchos do core, IRMÃOS e nunca aninhados: data-rv no
     olho, data-split na frase (palavra a palavra, no escalonamento de 48ms
     do próprio core) e data-rv data-d="2" no apoio. Aninhar o data-split
     dentro de um [data-rv] somaria dois desfoques sobre o mesmo texto.

     COMPLIANCE. A frase é afirmação de método, não de resultado: nenhuma
     cifra, nenhum prazo, nenhum retorno insinuado. É o registro certo para
     uma abertura institucional — se a dobra precisar de número, o número
     pede premissa e ressalva ao lado, e a peça deixa de ser abertura.
     ========================================================================== -->

<section class="sec-deep abt">
  <div class="wrap abt-bloco">

    <p class="eyebrow abt-olho" data-rv>Como trabalhamos</p>

    <h2 class="display-xl abt-frase" data-split>Cada patrimônio pede uma política escrita <br class="abt-quebra"><em>antes</em> da primeira aplicação.</h2>

    <p class="sec-lead abt-apoio" data-rv data-d="2">A política define faixas de alocação, liquidez e horizonte. A carteira vem depois — e presta contas a ela.</p>

  </div>
</section>

estilo.css · 195 linhas · 10,4 KB

/* ==========================================================================
   ABERTURA TIPOGRÁFICA — prefixo abt-
   Olho, frase em corpo de display alinhada à coluna, apoio curto. Nada mais.

   Tokens LIDOS:
     --accent      itálico de marca do <em>, via o parafuso --abt-em
     --sec-gap     ritmo vertical — é dele que sai o respiro dos dois lados
     --pad --max   via .wrap, que este arquivo não toca (contrato §4)

   Tokens ESCRITOS (parafusos de primitiva do core, ver core/base.css):
     --display-xl      corpo da frase, alimentado aqui por --abt-corpo
     --display-xl-lh   entrelinha dela

   A cor do texto não aparece neste arquivo além do <em>: vem do escopo de
   tom da seção, pelas classes .display-xl, .eyebrow e .sec-lead do core.

   O ARQUIVO É CURTO DE PROPÓSITO, e isso é o resultado, não a preguiça. A
   frase é a primitiva .display-xl, o olho é .eyebrow, o apoio é .sec-lead e
   a coluna é .wrap. Sobram QUATRO decisões, e são elas que fazem a peça:

     1. O RITMO ASSIMÉTRICO (.abt). É a única razão estrutural de a peça não
        ser .sec-pad. Ver o comentário do padding-block.
     2. O CORPO DA LETRA (--abt-corpo). Uma abertura tem de ser maior que um
        h2.sec-title (40px no teto) e menor que um manifesto de uma palavra
        (104px, o padrão da .display-xl).
     3. O <em> EM CORPO DE DISPLAY. O core pinta o itálico de marca só em
        h2.sec-title em; .display-xl não tem regra para <em>.
     4. A DEVOLUÇÃO DA QUEBRA no mobile.

   Se algum dia o core ganhar uma primitiva de abertura, o que sobe é 1 e 3;
   2 e 4 são calibração de copy e continuam aqui.
   ========================================================================== */

.abt{
  /* Corpo da frase. Calibrado pela FRAÇÃO DA COLUNA que a linha mais longa
     ocupa, não pelo número — é o princípio que a própria .display-xl do core
     documenta. Medido no tema liberta-wealth (que cai em Manrope, porque a
     Qanelas é licenciada e não está no repositório), com a frase de exemplo
     de 10 palavras:

        1920  corpo 50.0px   linha 981 / coluna 1096   89.5%
        1440  corpo 49.0px   linha 961 / coluna 1096   87.7%
        1200  corpo 40.8px   linha 801 / coluna 1065   75.2%
        1024  corpo 34.8px   linha 683 / coluna  907   75.3%
         900  corpo 30.6px   linha 601 / coluna  795   75.6%
         390  corpo 28.0px   linha 337 / coluna  350   96.3%  (quebra automática)

     A faixa útil é de 75% a 90%: abaixo de 75% a frase deixa de ser peça
     gráfica e volta a parecer um rótulo grande; acima de 90% ela encosta na
     borda e a segunda linha fica solta no meio do nada. O 96% do celular é
     outro regime — lá a quebra é automática e balanceada, e encher a coluna
     é o certo.

     O teto de 50px é alcançado a 1471px de viewport e não sobe depois, de
     propósito: a coluna PARA de crescer em --max (1240px), e um corpo que
     continuasse subindo por vw estouraria a linha em tela grande.

     Trocar a display do tema muda os números e não muda o alvo: uma face
     condensada precisa de corpo MAIOR para desenhar os mesmos 87%. Quem
     trocar a copy remede — a linha longa é a que manda, e é ela que decide
     também o ponto de corte do mobile, lá embaixo. */
  --abt-corpo:clamp(28px,3.4vw,50px);
  --display-xl:var(--abt-corpo);
  /* 1.06, e não o .95 padrão da primitiva: aquele serve a título de uma ou
     duas palavras, sem descendente para colidir. Aqui são duas linhas de
     frase inteira, com "p" e "ç" de uma encontrando o "C" e o "l" da outra,
     e o <em> em itálico ainda inclina o descendente para dentro da linha
     seguinte. */
  --display-xl-lh:1.06;

  /* Cor do realce. Existe como parafuso porque o valor CERTO depende do
     escopo de tom, e a conta está no comentário de .abt-frase em. */
  --abt-em:var(--accent);

  /* RITMO ASSIMÉTRICO, e é a razão de esta peça não usar .sec-pad.
     Uma abertura pertence ao capítulo que ela abre: solta-se da dobra densa
     que veio antes e gruda no que vem depois. .sec-pad é
     padding:var(--sec-gap) 0 — simétrico por definição, e sobrescrever só um
     lado dele empataria em especificidade e passaria a depender de qual
     folha carregou primeiro (§6.4). Então a peça escreve o próprio respiro,
     sempre DERIVADO de --sec-gap, que continua a fonte única do ritmo (§4).
     Nada de clamp solto aqui.

     A conta que importa é a SOMA com o vizinho, porque cada dobra traz o
     próprio --sec-gap: em cima 1 + 1 = 2 vãos, o ritmo normal da casa;
     embaixo .4 + 1 = 1.4 vãos, 30% mais perto. Medido a 1440x900, onde
     --sec-gap resolve em 126px: 252px acima contra 176px abaixo. É esse
     desequilíbrio que o olho lê como "começou um assunto novo aqui".

     QUEM PUSER ESTA PEÇA ENTRE DUAS DOBRAS SEM PADDING PRÓPRIO tem de subir
     os dois parafusos: sem vizinho para somar, .4 de vão fecha demais e a
     abertura encosta no que vem depois. */
  --abt-antes:var(--sec-gap);
  --abt-depois:calc(var(--sec-gap) * .4);
  padding-block:var(--abt-antes) var(--abt-depois);
}

/* ---------------------------------------------------------------- frase */
/* Só as margens. O desenho é a primitiva .display-xl do core.

   POR QUE OS DOIS VÃOS MORAM NA FRASE, e não um margin-top no olho e outro
   no apoio: o .sec-lead já nasce com margin-top:18px e o h2 do reset nasce
   com margin:0. Uma regra .abt-apoio{margin-top:…} empataria com .sec-lead
   em especificidade (0,1,0) e passaria a depender da ordem das folhas
   (§6.4). Pendurados na frase — que não tem margem para disputar — não há
   empate.

   E AQUI ESTÁ A ARMADILHA: o vão de baixo COLAPSA com o margin-top:18px do
   .sec-lead. Margens verticais de irmãos adjacentes colapsam no MAIOR dos
   dois, não somam. Medido a 1440: margin-bottom 27.4px, vão real 28px
   (a 390px: 15.7px de margem, vão real 18px — a primitiva mandando).
   Consequência prática — abaixo de 18px este parafuso não faz nada, e quem
   o baixar tentando fechar o bloco vai jurar que o CSS não está carregando.
   Para fechar de verdade abaixo de 18px é preciso mexer na primitiva, e não
   se mexe na primitiva (§10.5): use outro componente.

   Em em, e não em px: os dois vãos são função do corpo da frase, e o corpo
   é um clamp. Em px eles ficariam largos demais em celular e apertados em
   tela grande, e pedir um segundo clamp para acompanhar o primeiro é
   escrever a mesma curva duas vezes. */
.abt-frase{margin-block:.5em .56em}

/* O ITÁLICO DE MARCA, e a regra existe porque o core não a tem.
   h2.sec-title em pinta o realce; .display-xl não pinta nada — o <em>
   dentro dela sai em itálico da própria cor, e a palavra que carrega a
   ideia da abertura se perde. Os valores são os mesmos da regra do core, de
   propósito: numa página que use as duas, o realce tem de ser o MESMO
   realce. O tracking relaxa de -.02em para -.01em porque o itálico já
   inclina a letra para dentro da vizinha.

   Elemento como descendente do prefixo, em prosa: é o que o §6.3 permite, e
   é o que o precedente .ent-brand em do conteudo/grid-entidades faz.

   O CONTRASTE DEPENDE DO ESCOPO, e é por isso que a cor é parafuso.
   Medido no tema liberta-wealth (--accent sage #c6ceaa, --accent-2 tan
   #af9274), contra o fundo de cada escopo:

                     --accent   --accent-2   --fg
        .sec-dark      12.08        6.78     17.39
        .sec-deep      10.83        6.08     15.60
        .sec-paper      1.36        2.42     14.62
        .sec-light      1.36        2.42     15.23

     Nos dois escuros o realce é confortável e é o padrão. Nos dois claros a
     sage some (1.36:1) e o tan também não fecha os 3:1 de texto grande —
     então o escopo claro pede --abt-em:var(--fg), e o itálico sozinho passa
     a marcar a palavra. O itálico é o que carrega o realce em qualquer
     escopo; a cor é reforço, nunca a única pista. Ver ficha, Variações. */
.abt-frase em{
  font-style:italic;
  font-weight:700;
  letter-spacing:-.01em;
  color:var(--abt-em,var(--accent));
}

/* ---------------------------------------------------------------- variação centrada */
/* Monumento em vez de porta de entrada — ver ficha, Variações.
   O .sec-lead nasce com max-width e alinhado à esquerda da caixa; num bloco
   centrado ele precisa do margin-inline. Não há empate aqui (a primitiva
   não declara margin-inline), mas o seletor é composto pelo mesmo motivo do
   .fall-head .sec-lead do midia/colunas-cascata: a regra tem de vencer
   independentemente da ordem das folhas. */
.abt-centro{text-align:center}
.abt-centro .abt-apoio{margin-inline:auto}

/* ---------------------------------------------------------------- mobile */
/* A QUEBRA VOLTA A SER AUTOMÁTICA, e isto é o oposto de desistir.
   A linha do <br> foi escrita para a coluna larga; onde ela não cabe, o
   navegador a quebra por dentro e o <br> passa a produzir um TOCO. Medido a
   601px (corpo já no piso de 28px, coluna de 526): três linhas de 453, *92*
   e 364px — o 92 é a sobra da primeira linha, e ninguém escreveria isso.
   Apagando o <br>, a frase volta ao text-wrap:balance, que é a opinião do
   próprio core (declarada no reset de h1..h4 e desligada pela .display-xl
   justamente para o <br> valer). Aqui o <br> saiu; a opinião volta. Medido a
   390px: 3 linhas de 288/337/284 numa coluna de 350, contra 4 linhas de
   288/257/226/*133* sem a regra. Nem um caso nem o outro estoura a coluna —
   o defeito é a linha órfã, não o overflow.

   O CORTE EM 720px É FUNÇÃO DA COPY E DA FONTE, não um breakpoint de
   dispositivo. A linha mais longa mede 549px no piso de 28px; a coluna vale
   0.9 × viewport enquanto --pad está em 5vw, então ela só cabe acima de
   ~610px. 720 dá 18% de folga, que é o que absorve uma display mais larga
   no tema do cliente ou uma palavra a mais na frase. Medido: a 719px a frase sai balanceada em duas linhas de 453 e 461px; a 721px a
   linha ocupa 86.6% da coluna e não há toco; a 601px, com o corte em 600,
   havia. QUEM TROCAR A COPY REMEDE ESTE NÚMERO — é o único valor deste
   arquivo que não se deriva de token nem de token de primitiva.

   O seletor da primeira regra é duplo de propósito: .abt-frase e
   .display-xl empatam em especificidade (0,1,0), e sem o ancestral quem
   venceria seria a folha que carregou por último — o §6.4 proíbe depender
   disso. */
@media(max-width:720px){
  .abt .abt-frase{text-wrap:balance}
  .abt-quebra{display:none}
}

Olho, uma frase em corpo de display alinhada à coluna e um apoio de duas linhas. Nada abaixo: nem card, nem lista, nem foto, nem botão. A frase entra palavra a palavra, quebra onde o <br> manda, e o olho lê a dobra inteira em dois segundos — porque é só isso que há nela.

O problema editorial é o da porta de entrada de capítulo. Uma página institucional longa tem três ou quatro assuntos, e a passagem de um para o outro não se anuncia sozinha: a pessoa rola de uma grade de serviços para uma lista de etapas e não percebe que trocou de assunto. O cabeçalho de seção não resolve, porque ele é o rótulo de um conteúdo que vem logo abaixo, dentro da mesma dobra — ele diz "isto aqui é X", não "começa aqui um assunto novo". Esta peça diz a segunda coisa, e diz com a única ferramenta que não compete com o capítulo que ela abre: escala de tipografia e respiro. É por isso que ela não tem embaixo, e é por isso que o respiro dela é assimétrico — cheio em cima, para se soltar da dobra densa anterior, e 40% embaixo, para grudar no capítulo que anuncia.


Quando usar

Quando não usar


Padrão editorial

Slot Regra
Olho (.abt-olho) 2 a 4 palavras, sem verbo. Nomeia o capítulo que começa: "Como trabalhamos", "Política de investimentos", "Sucessão e holding". É o slot que separa esta peça de um manifesto — sem ele, a frase deixa de anunciar.
Frase (.abt-frase) 5 a 12 palavras, em duas linhas, com a quebra escrita à mão no <br class="abt-quebra"> e um espaço antes dele. Afirmação de método, nunca de resultado. Exatamente uma palavra em <em>, e ela tem de ser a palavra que carrega a ideia. Abaixo de 5 palavras parece rótulo; acima de 12 vira parágrafo em corpo grande.
Apoio (.abt-apoio) 70 a 150 caracteres, opcional. Aterriza a frase em termos concretos, em vocabulário de assessoria. Não repete a frase com outras palavras e não chama para nada. Acima de 150 a abertura passa a competir com o capítulo que ela abre.
Nada abaixo Sem card, sem lista, sem foto, sem botão, sem número. Qualquer coisa a mais e o respiro assimétrico deixa de fazer sentido.
Por página 1 ou 2. A peça exige um capítulo colado depois dela, no mesmo escopo de tom.

O que mantém a peça coesa é a relação entre os três textos: o olho nomeia, a frase afirma e o apoio concretiza, nessa ordem e sem sobreposição. O erro mais comum é o apoio repetir a frase em prosa — e aí a abertura tem duas vozes dizendo a mesma coisa, o que num bloco de três linhas é imediato.

A quebra de linha é conteúdo, e é a única regra que muda quando a copy muda. A linha mais longa tem de ocupar entre 75% e 90% da coluna. Abaixo de 75% a frase deixa de ser peça gráfica e volta a parecer um rótulo grande; acima de 90% ela encosta na borda e a segunda linha fica solta. Medido no tema liberta-wealth com a frase de exemplo:

Viewport Corpo Linha mais longa Coluna Fração
1920 50.0px 981px 1096px 89.5%
1440 49.0px 961px 1096px 87.7%
1200 40.8px 801px 1065px 75.2%
900 30.6px 601px 795px 75.6%
390 28.0px 337px 350px 96.3% (quebra automática)

Trocando a copy, remeça e ajuste --abt-corpo — e remeça também o corte do mobile, que é função da linha mais longa e não do dispositivo (ver Gotchas).

Especificação dos assets

Nenhum. A peça é tipografia e não recebe imagem, ícone, logo, vídeo nem número. É a única coisa que ela pede do projeto:


Como usar

<link rel="stylesheet" href="componentes/conteudo/abertura-tipografica/estilo.css">

Não há script.js. A entrada vem do core/motion.js, que a página já carrega.

Cole um capítulo depois dela, no mesmo escopo de tom. Sem isso o respiro de baixo não tem no que grudar e a peça vira um cabeçalho órfão.

Ganchos

Gancho Papel
.abt a seção; carrega todos os parafusos e é o único lugar onde se mexe
.abt-bloco o .wrap que empilha os três nós; é onde entra .abt-centro
.abt-olho o .eyebrow do core
.abt-frase o h2.display-xl com data-split
.abt-quebra o <br> que decide a quebra; apaga-se abaixo de 720px
.abt-apoio o .sec-lead do core, opcional
--abt-corpo corpo da frase; clamp(28px,3.4vw,50px) no padrão
--abt-em cor do realce do <em>; var(--accent) no padrão, var(--fg) em escopo claro
--abt-antes / --abt-depois os dois respiros; var(--sec-gap) e calc(var(--sec-gap) * .4)
[data-rv] no olho e no apoio, [data-split] na frase entrada do core, ganchos irmãos e nunca aninhados

Variações


Gotchas

Caso Frase Olho e apoio Altura da peça
JavaScript desligado no navegador opacity:1, filter:none opacity:1, filter:none 414px
motion.js bloqueado, JS ligado opacity:1, filter:none opacity:0, blur(14px) 414px

O primeiro é o @media (scripting: none) do core/motion.css fazendo o que promete — a dobra inteira lê, com a mesma altura de sempre, e nenhum .w chega a ser criado. O segundo não é coberto por nada, e é condição de todo data-rv da biblioteca, não desta peça: [data-rv] tem estado de repouso invisível e quem o desfaz é o script. O que a peça ganha de graça é que a frase sobrevive aos dois — o motion.css não estiliza [data-split], só os .w que o script cria —, então o pior caso degrada para "olho e apoio invisíveis, frase legível", e a frase é a mensagem. Não se conserta aqui (§0/§10.5): é o core.

Escopo Fundo Frase <em> com --accent <em> com --accent-2 <em> com --fg Apoio Olho
.sec-dark #0a0a0a 17.39 12.08 6.78 17.39 11.85 6.05
.sec-deep #181818 15.60 10.83 6.08 15.60 10.63 5.43
.sec-paper #ede9e3 14.62 1.36 2.42 14.62 8.62 4.37
.sec-light #ede9e3 15.23 1.36 2.42 15.23 8.98 4.28

A frase, o apoio e o olho fecham em qualquer escopo. O realce em cor de marca não fecha nos dois claros — daí o parafuso --abt-em. Vale lembrar que o itálico é o que carrega o realce: a cor é reforço, e nunca a única pista.


Compliance

A peça não devolve número, não compara e não captura dado. O que ela pede antes de publicar:


Histórico

Projeto Onde Data Diferenças
autoral — 2026-09-09 Construído do zero na biblioteca. Sem referência única e sem uma linha copiada.

Normalizações aplicadas na extração: não houve extração. A forma foi reduzida ao que o core não faz: a frase é a primitiva .display-xl, o olho é .eyebrow, o apoio é .sec-lead, a coluna é .wrap e a entrada é data-split mais data-rv. Sobraram quatro decisões — ritmo assimétrico, corpo da letra, realce do <em> e devolução da quebra no mobile — e o estilo.css tem quatro regras.

Divergências conhecidas vs. produção: nenhuma; a peça não veio de site nosso.

Pendências que não são desta peça (registradas aqui porque foram medidas aqui):