← Biblioteca componentes/dados/fluxo-conectado/ficha.md CódigoTela cheia
dados/fluxo-conectado

Fluxo conectado de caixas

🟢 estavel complexidade baixa prefixo flx- diagrama fluxo cadeia custodia css-puro estrutura dados sem javascript

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

<link rel="stylesheet" href="componentes/dados/fluxo-conectado/estilo.css">

markup.html · 125 linhas · 7,2 KB

<!-- ==========================================================================
     FLUXO CONECTADO — caixas em sequência, ligadas por traço e ponta
     Prefixo: flx-      (vizinho de `flux-`, do midia/esteira-dupla-imagens;
                         são peças diferentes e as classes não colidem)
     Requer: core (tokens, base, motion.css, motion.js) + estilo.css
     NÃO tem script.js — ver ZERO JAVASCRIPT abaixo.
     Primitivas do core usadas, não recopiadas: .wrap .sec-pad .sec-head
     .eyebrow h2.sec-title .sec-lead .visually-hidden. Sem lib.

     A IDEIA. O diagrama mais útil de todos: de onde vem, por onde passa,
     onde chega. Três a cinco caixas numa fileira, cada uma ligada à seguinte
     por um traço de 1px que termina em ponta. A caixa é um CONTORNO, não um
     cartão — mesma espessura do traço que a liga — para que caixas e linhas
     leiam como um só desenho, e não como cards com tracinhos entre eles.

     NÃO É A LINHA DO TEMPO DEITADA, e a distinção decide se a peça deve
     existir. O listas/linha-do-tempo-etapas conta um processo NO TEMPO: cada
     etapa tem prazo, e a ordem é cronologia. Aqui não há prazo em lugar
     nenhum e as quatro caixas COEXISTEM — a custódia continua guardando
     enquanto o relatório é emitido. O que se desenha é uma estrutura no
     espaço: quem tem o quê, em que ponto. Ver a ficha, "Quando não usar".

     ZERO JAVASCRIPT, e isso é o principal ganho da peça. O irmão
     dados/diagrama-hub calcula o "d" de cada path SVG a partir da posição
     real dos elementos, porque a topologia dele é um hub: duas frentes
     convergindo para um centro em órbita, com o traço saindo na diagonal. Uma
     CADEIA não pede isso. O traço mora no VÃO da grade, e o vão é uma
     variável — o CSS já sabe onde ele começa e onde termina, em qualquer
     largura, sem medir nada. Não há resize para escutar, não há fonte cujo
     carregamento desalinhe o desenho, não há quadro para agendar.

     ACESSIBILIDADE — é aqui que um diagrama costuma falhar feio, porque ele
     é uma imagem para quem enxerga e NADA para quem não. Três decisões:
       1. a estrutura é um <ol> de verdade, com role="list" (ver o comentário
          no <ol>). O desenho é a apresentação da lista, não a lista;
       2. traço e ponta são PSEUDO-ELEMENTOS — não existe nó para o leitor de
          tela encontrar, o que é melhor que um nó com aria-hidden;
       3. a relação em si vive em TEXTO, no .flx-rel de cada caixa: "Segue
          para a custódia." A seta é a versão visual desse texto, não a única
          existência dele. Tirar o .flx-rel deixa a direção só no desenho —
          é o erro que esta peça existe para não cometer.

     COMPLIANCE. A afirmação da dobra — o recurso não passa pela assessoria —
     é estrutural, não de desempenho: nenhuma caixa fala de retorno,
     rentabilidade ou resultado, e não há número nenhum na peça. Antes de
     publicar, conferir que a cadeia descreve a estrutura REAL do cliente
     (quem custodia, em nome de quem, quem executa). Ver ficha.md, Compliance.
     ========================================================================== -->

<section class="flx sec-deep sec-pad">
  <div class="wrap">

    <div class="sec-head flx-head">
      <span class="eyebrow" data-rv>Custódia e execução</span>
      <h2 class="sec-title ttl">Seu dinheiro não passa pela <em>assessoria</em></h2>
      <p class="sec-lead" data-rv data-d="2">O recurso sai de uma conta no seu nome e fica sob guarda de uma instituição autorizada. O assessor executa a alocação combinada — a titularidade não muda em nenhum ponto do caminho.</p>
    </div>

    <!-- role="list" num <ol>: redundante no papel, necessário na prática. O
         reset do core zera `list-style`, e o Safari/VoiceOver larga a
         semântica de lista quando o marcador é removido. Nesta peça a
         semântica de lista é METADE de como a ordem chega a quem não vê o
         desenho (a outra metade é o .flx-rel), então ela não pode depender
         de uma heurística de navegador.

         A QUANTIDADE DE CAIXAS NÃO ESTÁ DECLARADA EM LUGAR NENHUM: o
         grid-auto-flow:column do estilo.css cria uma coluna por <li>.
         Acrescentar ou tirar uma caixa é acrescentar ou tirar um <li> —
         nada de --flx-i, nada de repeat(4,1fr) para manter em sincronia.
         Cortar a cadeia é APAGAR o <li>, não esconder com [hidden]: ver o
         gotcha do estilo.css. -->
    <ol class="flx-lista" role="list">

      <!-- ------------------------------------------------------------ 01 -->
      <li class="flx-passo" data-rv>
        <div class="flx-caixa">
          <span class="flx-num" aria-hidden="true">01</span>
          <h3 class="flx-rotulo">Sua conta</h3>
          <p class="flx-apoio">O recurso sai de uma conta aberta no seu nome, na instituição que você escolher.</p>
        </div>
        <span class="visually-hidden flx-rel">Segue para a custódia.</span>
      </li>

      <!-- ------------------------------------------------------------ 02 -->
      <li class="flx-passo" data-rv data-d="1">
        <div class="flx-caixa">
          <span class="flx-num" aria-hidden="true">02</span>
          <h3 class="flx-rotulo">Custódia</h3>
          <p class="flx-apoio">Uma instituição autorizada guarda os ativos, registrados no seu CPF ou CNPJ.</p>
        </div>
        <span class="visually-hidden flx-rel">Segue para a carteira.</span>
      </li>

      <!-- ------------------------------------------------------------ 03 -->
      <li class="flx-passo" data-rv data-d="2">
        <div class="flx-caixa">
          <span class="flx-num" aria-hidden="true">03</span>
          <h3 class="flx-rotulo">Carteira</h3>
          <p class="flx-apoio">O assessor executa a alocação dentro das faixas que a sua política aprovou.</p>
        </div>
        <span class="visually-hidden flx-rel">Segue para o relatório.</span>
      </li>

      <!-- ------------------------------------------------------------ 04
           A ÚLTIMA CAIXA NÃO TEM .flx-rel, e não é esquecimento: não há
           caixa seguinte para nomear. Quem não desenha traço nem ponta é o
           :not(:last-child) do CSS — a mesma condição, escrita duas vezes em
           lugares diferentes porque uma é desenho e a outra é texto. -->
      <li class="flx-passo" data-rv data-d="3">
        <div class="flx-caixa">
          <span class="flx-num" aria-hidden="true">04</span>
          <h3 class="flx-rotulo">Relatório consolidado</h3>
          <p class="flx-apoio">As posições de todas as instituições voltam num documento único, todo mês.</p>
        </div>
      </li>

    </ol>

    <!-- A ressalva mora ONDE A PESSOA LÊ A AFIRMAÇÃO, não no rodapé da
         página. Ela é opcional no componente: uma cadeia que desenha a
         estrutura de uma holding não precisa desta frase, precisa de outra. -->
    <p class="nota flx-nota" data-rv>A assessoria não custodia recurso de cliente nem movimenta conta: as ordens são executadas na instituição que guarda os ativos, e a remuneração do assessor é a taxa previamente acordada.</p>

  </div>
</section>

estilo.css · 220 linhas · 10,4 KB

/* ==========================================================================
   FLUXO CONECTADO — prefixo flx-
   Caixas em sequência, ligadas por traço de 1px que termina em ponta:
   de onde vem, por onde passa, onde chega.

   Tokens usados:
     --rule-2         traço, ponta e contorno da caixa (o desenho inteiro)
     --accent         cor da ponta — a direção é a informação da peça
     --fg             rótulo da caixa
     --fg-2           linha de apoio
     --fg-muted       número ordinal e a ressalva
     --display        face do número e do rótulo
     --sans           face da linha de apoio (herdada do body)
     --radius-media   canto da caixa; 0 no tema flat da Liberta
   Primitivas do core (usadas, não recopiadas): .wrap .sec-pad .sec-head
   .eyebrow h2.sec-title .sec-lead .visually-hidden.

   A CAIXA É UM CONTORNO, NÃO UM CARTÃO, e essa é a decisão que separa esta
   peça de uma grade de quatro cards. O contorno tem a MESMA espessura e a
   MESMA cor do traço que liga uma caixa à outra, então o olho lê um desenho
   só. Vestir a caixa com a primitiva .glass do core resolveria a aparência e
   destruiria a leitura: um card de vidro com um tracinho ao lado é uma grade
   com enfeite, não um diagrama. Por isso também não há hover em lugar nenhum
   — nada aqui é clicável, e realce ao passar o mouse numa caixa inerte é
   promessa falsa (a peça inteira tem zero paradas de Tab, de propósito).

   ONDE O TRAÇO MORA: no VÃO da grade. `left:100%` é a borda direita do <li>,
   e o <li> tem a largura exata da caixa; `width:var(--flx-gap)` é o próprio
   vão. Daí o traço ligar a borda de uma caixa à borda da seguinte em
   QUALQUER largura, sem uma linha de JavaScript e sem medir DOM — que é o
   que o irmão dados/diagrama-hub precisa fazer, porque a topologia dele é um
   hub com traço na diagonal. Cadeia não pede cálculo.

   NÃO EXISTE @media(prefers-reduced-motion) NESTE ARQUIVO, e a ausência é
   deliberada: não há transição, animação ou keyframe aqui. A única entrada
   da peça é o [data-rv] do core, que o core já desliga — e o traço, sendo
   pseudo-elemento do nó revelado, entra com ele (opacidade e blur valem para
   o elemento e todo o seu conteúdo gerado). Mesmo caso do
   prova/stats-contador-regua.
   ========================================================================== */

.flx{
  /* Vão horizontal entre caixas — é também o COMPRIMENTO do traço. Uma
     variável só para as duas coisas: separá-las é o jeito de o traço deixar
     de encostar nas caixas no dia em que alguém mexer no respiro. */
  --flx-gap:clamp(20px,2.6vw,44px);
  /* O mesmo, no empilhado. Não reaproveita --flx-gap porque 20px de vão
     vertical entre duas caixas largas lê como erro de layout. */
  --flx-stack-gap:34px;
  --flx-pad:clamp(18px,1.7vw,26px);
  /* A ponta, em dois parafusos: comprimento e MEIA-ALTURA. Os dois são
     inteiros de propósito, e isso foi medido. A ponta é o triângulo de
     bordas, e o navegador arredonda `border-width` a pixel inteiro: com a
     meia-altura escrita como calc(--flx-arrow * .6) = 4,2px, o layout usava
     4px e o vértice ficava 0,2px ACIMA do eixo do traço. Derivar uma da
     outra parece mais limpo e sai errado. */
  --flx-arrow:8px;
  --flx-arrow-half:3px;
  --flx-line:var(--rule-2);
  /* A ponta é a única coisa em cor de marca, porque a DIREÇÃO é a informação
     da peça — o resto do desenho é estrutura. Para um diagrama monocromático,
     --flx-arrow-color:var(--rule-2).

     Lê --accent-ink, e não --accent, mesmo sendo uma FORMA e não texto: em
     escopo escuro os dois são o mesmo valor, e em escopo claro o accent puro
     não fecha contraste (1.36:1 com o sage da Liberta sobre o creme). Uma
     seta de 8x6px que ninguém vê apaga a direção, que é justamente a
     informação da peça — o problema é o mesmo do realce de texto, e a
     solução do core serve nos dois. O fallback mantém de pé quem colar o
     bloco fora de um escopo de tom. Ver CLAUDE.md §3 e MANUAL §3. */
  --flx-arrow-color:var(--accent-ink,var(--accent));
  /* Teto da caixa no empilhado. Sem ele, em 768px a caixa vira uma lâmina de
     690px com um traço de 34px embaixo. */
  --flx-box-max:520px;
}

/* Só a largura: o resto — inclusive a centralização dos filhos vem do .sec-head do core (desde 2026-09-29) — vem da primitiva. */
.flx-head{--head-max:720px}

/* ---------------------------------------------------------------- a cadeia */
/* grid-auto-flow:column com grid-auto-columns:minmax(0,1fr) dá UMA COLUNA
   POR <li>, sem ninguém declarar quantas. É o que faz 3, 4 ou 5 caixas
   funcionarem no mesmo arquivo: um repeat(4,1fr) obrigaria a manter a
   contagem em sincronia com o markup, e a quinta caixa sairia por baixo.
   O `0` do minmax não é enfeite: sem ele a coluna nunca encolhe abaixo do
   min-content do texto e a fileira estoura a página. */
.flx-lista{
  display:grid;
  grid-auto-flow:column;
  grid-auto-columns:minmax(0,1fr);
  gap:var(--flx-gap);
  margin-top:clamp(40px,6vh,72px);
}

.flx-passo{position:relative;display:grid;min-width:0}
/* §6.5 do contrato, preventivo: nada nesta peça alterna estado, mas
   `display:grid` numa regra de autor vence o [hidden] do navegador, e cortar
   a cadeia de cinco para três caixas é o caso em que alguém tenta esconder
   em vez de apagar. Com esta linha, o <li> escondido some E a grade fecha a
   coluna sozinha. Ainda assim, o certo é APAGAR o <li>. */
.flx-passo[hidden]{display:none}

.flx-caixa{
  border:1px solid var(--flx-line);
  border-radius:var(--radius-media);
  padding:var(--flx-pad);
}

.flx-num{
  display:block;
  font-family:var(--display);font-weight:700;font-size:11.5px;
  letter-spacing:.16em;color:var(--fg-muted);
}
.flx-rotulo{
  font-family:var(--display);font-weight:700;
  font-size:clamp(15px,1.25vw,18px);line-height:1.25;letter-spacing:-.012em;
  color:var(--fg);margin-top:14px;
}
.flx-apoio{
  font-size:clamp(12.5px,1vw,14px);line-height:1.55;
  color:var(--fg-2);margin-top:9px;
}

/* ------------------------------------------------------------- o traço */
/* Pseudo-elemento, e não um nó: assim o desenho não existe na árvore de
   acessibilidade, o que é melhor que um <span> com aria-hidden. Quem carrega
   a relação em texto é o .flx-rel do markup.

   :not(:last-child) — a última caixa não liga a nada. A mesma condição vale
   para o .flx-rel, que a última caixa simplesmente não tem.

   O :has() é cinto e suspensório para quem cortar a cadeia com [hidden] em
   vez de apagar o <li>: sem ele, esconder a última caixa deixaria a ponta da
   penúltima apontando para o vazio. Onde :has() não existe, o pior caso é a
   seta órfã — nunca um layout quebrado. */
.flx-passo:not(:last-child)::before,
.flx-passo:not(:last-child)::after{content:"";position:absolute}
.flx-passo:has(+ .flx-passo[hidden])::before,
.flx-passo:has(+ .flx-passo[hidden])::after{content:none}

/* O traço: uma borda de 1px num elemento de altura zero. `top` desconta meio
   pixel para que o traço fique CENTRADO no eixo da caixa, e não meio pixel
   abaixo dele — é essa meia-linha que o teste de "liga os centros" mede. */
.flx-passo:not(:last-child)::before{
  left:100%;width:var(--flx-gap);
  top:calc(50% - .5px);height:0;
  border-top:1px solid var(--flx-line);
}

/* A ponta: o triângulo de bordas. Vértice EXATAMENTE na borda esquerda da
   caixa seguinte — a caixa tem `left` recuado de --flx-arrow e o vértice do
   border-left cai na borda direita do próprio elemento, que é 100% + o vão.
   Nada de rotate(45deg): girar um quadrado põe o vértice a meia diagonal do
   centro, e o alinhamento passaria a depender de um √2 escrito à mão. */
.flx-passo:not(:last-child)::after{
  left:calc(100% + var(--flx-gap) - var(--flx-arrow));
  top:calc(50% - var(--flx-arrow-half));
  width:0;height:0;
  border:var(--flx-arrow-half) solid transparent;
  border-right:0;
  border-left:var(--flx-arrow) solid var(--flx-arrow-color);
}

/* .flx-rel não tem regra própria, e é intencional: ele veste a
   .visually-hidden do core e existe para NOMEAR o slot — é onde a skill de
   layout escreve a relação ("Segue para a custódia"). Ver bin/editorial.json. */

/* ------------------------------------------------------------- a ressalva */
/* Tipografia pela primitiva .nota do core; aqui só posição e medida — 64ch
   para a ressalva centrada não virar uma linha longa sob a cadeia. */
.flx-nota{
  --nota-max:64ch;
  margin:clamp(30px,4vh,48px) auto 0;
  text-align:center;
}

/* ==========================================================================
   EMPILHADO — a cadeia vira vertical e o traço acompanha
   UM breakpoint só, no 900px da casa (o mesmo do dados/diagrama-hub). Não há
   estado intermediário de duas colunas, e a ausência é decisão: cadeia que
   quebra em duas fileiras precisa de traço em COTOVELO, ligando o fim de uma
   fileira ao começo da seguinte — e é exatamente aí que CSS puro morre e o
   SVG calculado do dados/diagrama-hub passa a ser a resposta certa. Melhor
   empilhar do que desenhar um cotovelo errado.

   Medido a 901px, que é o pior caso da fileira: quatro caixas de 185px, sem
   estouro. Com CINCO caixas a mesma largura dá 143px, e aí a linha de apoio
   quebra em cinco linhas de doze caracteres — daí a variação "cinco caixas,
   só rótulo" da ficha. É regra editorial, não de CSS: nenhuma media query
   sabe quantos <li> existem.

   O TRAÇO VAI AO CENTRO, não à esquerda. À esquerda, com o número em cima
   dele, a peça vira o filete do listas/linha-do-tempo-etapas — que é outro
   componente, para outro conteúdo (ver a ficha).
   ========================================================================== */
@media(max-width:900px){
  .flx-lista{
    grid-auto-flow:row;
    grid-template-columns:minmax(0,1fr);
    gap:var(--flx-stack-gap);
  }
  .flx-passo{max-width:var(--flx-box-max);margin-inline:auto;width:100%}

  .flx-passo:not(:last-child)::before{
    left:calc(50% - .5px);width:0;
    top:100%;height:var(--flx-stack-gap);
    border-top:0;
    border-left:1px solid var(--flx-line);
  }
  .flx-passo:not(:last-child)::after{
    left:calc(50% - var(--flx-arrow-half));
    top:calc(100% + var(--flx-stack-gap) - var(--flx-arrow));
    border:var(--flx-arrow-half) solid transparent;
    border-bottom:0;
    border-top:var(--flx-arrow) solid var(--flx-arrow-color);
  }

  .flx-rotulo{font-size:17px}
  .flx-apoio{font-size:14px}
}

Três a cinco caixas numa fileira, cada uma ligada à seguinte por um traço de 1px que termina em ponta. Cada caixa é um contorno — não um cartão — com o mesmo peso e a mesma cor do traço que a liga: caixas e linhas leem como um só desenho, e não como cards com tracinhos entre eles. Dentro de cada uma, um número ordinal, o nome de quem tem ou faz a coisa e uma linha dizendo o que acontece ali. No celular a fileira vira coluna e o traço gira com ela, do pé de uma caixa ao topo da seguinte.

Resolve o diagrama mais pedido e menos catalogado de todos: de onde vem, por onde passa, onde chega. A categoria dados tinha duas peças de diagrama e nenhuma cadeia — o dados/diagrama-hub desenha convergência (duas frentes para um centro) e o dados/globo-canvas é uma esfera de pontos. O caminho do dinheiro numa assessoria, a estrutura de uma holding e o fluxo de sucessão são todos a mesma forma, e sem ela cada site improvisava a cadeia como uma grade de quatro cards — que perde exatamente a informação que importa, porque numa grade a caixa 1 e a caixa 4 são vizinhas de tabela.

Não é uma linha do tempo deitada, e a distinção decide se a peça deve existir. O listas/linha-do-tempo-etapas conta um processo no tempo: cada etapa reserva um lugar fixo para o prazo, e a ordem é cronologia. Aqui não há prazo em lugar nenhum, e as caixas coexistem — a custódia continua guardando enquanto o relatório é emitido. O que se desenha é uma estrutura no espaço: quem tem o quê, em que ponto. Por isso o editorial.forma desta peça é só diagrama, e não sequencia-ordenada (ver a nota do bloco no componente.json): copy de "como funciona" com prazo por etapa pertence à linha do tempo, e devolver esta peça para essa busca reabriria a confusão.


Qual irmão ela substitui, e em que caso

Quando usar

Quando não usar


Padrão editorial

Slot Regra
Olho (.eyebrow) 1 a 3 palavras. Nomeia a frente de trabalho, não o benefício: "Custódia e execução". Opcional.
Título (h2.sec-title.ttl) 5 a 10 palavras, uma em <em>. É a afirmação que a cadeia prova — "Seu dinheiro não passa pela assessoria" —, não o nome da peça. Título que apenas rotula ("Como o dinheiro circula") desperdiça a dobra: o desenho já rotula.
Apoio (.sec-lead) 20 a 35 palavras. Diz em prosa o mesmo caminho que o desenho mostra. É o que garante a leitura da dobra a quem chega por leitor de tela antes de entrar na lista.
.flx-num Dois dígitos, com zero à esquerda, em sequência. É aria-hidden: quem numera para o leitor de tela é o <ol>.
.flx-rotulo 1 a 3 palavras, substantivo, na mesma forma em todas as caixas: "Sua conta", "Custódia", "Carteira". Verbo aqui ("Transferimos o recurso") converte a estrutura em processo, e a peça passa a dizer o que não é.
.flx-apoio 60 a 95 caracteres — uma frase, o que acontece ali.
.flx-rel 3 a 5 palavras: verbo de transferência + o rótulo da caixa seguinte, idêntico em forma nas três ("Segue para a custódia"). Só o leitor de tela recebe. A última caixa não tem: a contagem é sempre itens − 1.
.flx-nota 1 a 2 frases, no fim. A ressalva mora onde a pessoa lê a afirmação. Opcional.
Quantidade 3 a 5 <li>. Quatro é o calibre do markup.

Comprimento parecido entre os apoios é estrutural, não estético. A grade estica todas as caixas até a altura da mais alta: um apoio com o dobro do tamanho do vizinho deixa três caixas com um terço de vazio embaixo, e o traço — que corre no meio da altura — passa a cruzar espaço em branco. Fique numa faixa de mais ou menos 20% entre o menor e o maior apoio. Medido a 1440: os quatro apoios do markup têm 74 a 81 caracteres e as quatro caixas fecham em 201,58px, iguais ao centésimo.

A relação tem de estar no texto. É a regra editorial que sustenta a acessibilidade da peça, e ela não é opcional: a seta é aria-hidden por construção (é pseudo-elemento, não existe nó), então se o .flx-rel não nomear a caixa seguinte, a direção deixa de existir para quem não vê o desenho. Quem monta a página escreve os três .flx-rel junto com os quatro rótulos, não depois.

Nenhuma caixa fala de retorno. "Carteira" é onde a alocação é executada, não onde o dinheiro "começa a render" — ver Compliance.

Especificação dos assets

Nenhum. A peça não tem imagem, ícone, vídeo ou fonte própria, e isso é parte do que ela é: um diagrama desenhado com borda e pseudo-elemento. Não há arquivo para pedir ao cliente, não há peso para orçar e não há direito de imagem para conferir.


Como usar

<link rel="stylesheet" href="componentes/dados/fluxo-conectado/estilo.css">

Não há script.js. O core/motion.js continua sendo necessário — é ele que dá o .in aos [data-rv] —, mas a peça não acrescenta nenhum script.

Acrescentar ou tirar uma caixa é acrescentar ou tirar um <li class="flx-passo">: a quantidade não está declarada em lugar nenhum, porque grid-auto-flow:column cria uma coluna por item. Ao tirar, apague o <li> — não use [hidden] (ver Gotchas). Ao acrescentar, continue a numeração do .flx-num, escalone o data-d até 3 e escreva o .flx-rel da caixa que passou a ter vizinha.

Ganchos

Gancho Papel
.flx-lista a grade. grid-auto-flow:column + grid-auto-columns:minmax(0,1fr) = uma coluna por <li>.
.flx-passo o elo. É dele que saem o traço (::before) e a ponta (::after), e é ele que leva o data-rv.
.flx-rel a relação em texto, vestindo a .visually-hidden do core. Sem regra própria no CSS, de propósito: existe para nomear o slot.
data-rv + data-d="1..3" entrada escalonada, uma caixa por vez, da esquerda para a direita.
.ttl no h2.sec-title, como em toda dobra.
role="list" no <ol> ver Gotchas.

Parafusos

Variável O quê
--flx-gap vão entre caixas na fileira — é também o comprimento do traço. Uma variável para as duas coisas, de propósito.
--flx-stack-gap o mesmo, no empilhado (34px). Não reaproveita --flx-gap porque 20px de vão vertical entre duas caixas largas lê como erro de layout.
--flx-pad respiro interno da caixa.
--flx-arrow / --flx-arrow-half comprimento e meia-altura da ponta. Os dois inteiros — ver Gotchas.
--flx-line cor do traço e do contorno da caixa. Uma variável para os dois: é o que mantém o desenho com um peso só.
--flx-arrow-color cor da ponta. Padrão var(--accent-ink,var(--accent)) — ver Gotchas; var(--rule-2) deixa a peça monocromática.
--flx-box-max teto de largura da caixa no empilhado (520px).

Variações


Gotchas


Compliance

A peça não devolve número nenhum, e é por isso que esta seção é curta e específica: o que ela afirma é estrutura, e estrutura é verificável. Antes de publicar, o consumidor tem de fazer três coisas.

  1. Conferir que a cadeia descreve a estrutura real do cliente. Quem custodia, em nome de quem, quem executa e de onde sai o relatório. O markup traz o arranjo padrão de uma assessoria de investimentos independente — conta do cliente, custódia em instituição autorizada, execução pelo assessor, relatório consolidado. Se o arranjo do cliente for outro, o desenho passa a afirmar algo falso, e um diagrama afirma com mais força que um parágrafo.
  2. Manter a fronteira estrutura × resultado. Nenhuma caixa pode falar de rentabilidade, retorno, ganho ou desempenho. A armadilha é sempre na caixa da carteira: "onde seu dinheiro começa a render" é a frase que não pode existir. Aqui a caixa 03 diz o que acontece (a alocação é executada dentro das faixas que a política aprovou) e para por aí.
  3. Passar a ressalva pelo compliance do cliente. O .flx-nota afirma que a assessoria não custodia recurso nem movimenta conta, e que a remuneração é a taxa previamente acordada. É a frase mais forte da dobra e a que mais depende do arranjo contratual real. Ela fica no fim da lista, onde a pessoa acabou de ler o desenho — não no rodapé da página.

Já resolvido no componente e que não deve regredir: nenhum nome de instituição real, nenhum nome de cliente, nenhum superlativo de mercado, nenhum número, nenhum dado pessoal coletado e nada gravado — a peça não tem campo, não tem clique, não tem script e não usa localStorage, cookie nem envio.


Histórico

Projeto Onde Data Diferenças
autoral padrão: cadeia de caixas ligadas — de onde vem, por onde passa, onde chega 2026-09-09 construído do zero para a biblioteca; nunca rodou em produção

Origem. Componente autoral (§11 do contrato). Não há referência única: a cadeia de caixas com seta é o diagrama mais comum de página institucional, e aparece igual em fluxograma de processo, em diagrama de arquitetura de software e em material de compliance de instituição financeira. As três famílias de exemplo que decidiram a forma foram o caminho do dinheiro numa assessoria, a estrutura de uma holding e o fluxo de uma sucessão — as três são a mesma cadeia, com rótulos diferentes.

Decisões da tradução para o contrato:

  1. Zero JavaScript, decidido pela topologia e não pela elegância. As três receitas possíveis eram SVG com coordenadas calculadas em JS (como o diagrama-hub), pseudo-elemento no vão e linhas desenhadas por background na grade. A cadeia tem topologia regular e as duas pontas de cada traço são bordas de itens vizinhos de grade, com um gap conhecido entre elas: o pseudo-elemento resolve exato, e resolve em qualquer largura. A terceira receita (background na grade) perderia a ponta da seta, que é a informação. A primeira só seria necessária se houvesse ramificação — e aí a peça certa é outra.
  2. A caixa é um contorno de mesmo peso que o traço. É o que separa um diagrama de uma grade de cards. O --flx-line serve o contorno e o traço para que não seja possível divergirem por descuido.
  3. A ponta é o único lugar com cor de marca. A direção é a informação da peça; o resto do desenho é estrutura. Quatro números em --accent teriam posto a cor onde ela apenas conta.
  4. A relação vive em texto. Um diagrama é uma imagem para quem enxerga e nada para quem não. O .flx-rel é o gêmeo textual da seta — não uma legenda redundante: quem vê recebe a direção pelo desenho, quem ouve recebe pelo texto, e nenhum dos dois ouve a informação duas vezes.
  5. A quantidade de caixas não é declarada. grid-auto-flow:column conta os <li>. Um repeat(4,1fr) obrigaria a manter a contagem em sincronia com o markup, e a quinta caixa sairia por baixo sem nada acusar.

Normalizações aplicadas: prefixo flx- em toda classe; zero cor crua (só token, e transparent nas bordas transversais da seta, que é palavra-chave e não cor); .wrap, .sec-pad, .sec-head, .eyebrow, h2.sec-title, .sec-lead, .visually-hidden e .nota (a ressalva) vêm do core e não foram recopiadas; nenhum !important; a ponta lê --accent-ink e não --accent, como manda o §3 do contrato; media query de largura no fim do arquivo; entrada exclusivamente pelos ganchos [data-rv]/data-d/.ttl do core.

Divergências conhecidas vs. produção: nenhuma — não rodou em produção ainda.

O que foi medido (bin/medir.js, Chrome headless, tema liberta-wealth; geometria conferida com --reduce, que é o repouso verdadeiro):

Medida Resultado
traço × centro da caixa de onde ele sai, fileira desvio de 0,01px em todas as ligações, em 1920, 1440, 1240, 1024 e 901
ponta × o mesmo centro 0,01px nas mesmas larguras
traço × centro da caixa de destino 0,01px nas duas primeiras ligações e 0,04px na última, e a diferença é do rect da caixa (topo em 419,30 contra 419,27 das outras três — arredondamento de subpixel do item de grade), não do traço
início do traço × borda direita da caixa 0,00px — encosta exato
fim do traço e vértice da ponta × borda esquerda da caixa seguinte 0,00px nos dois
traço e ponta × centro horizontal das caixas, empilhado 0,00px em 900, 768, 390 e 360
altura das quatro caixas 201,58px, iguais ao centésimo (apoios de 74 a 81 caracteres)
caixa a 1920 / 1440 / 1240 / 1024 / 901 241×205 / 246×202 / 251×163 / 207×176 / 181×194
caixa empilhada a 900 / 768 / 390 / 360 520×144 / 520×144 / 350×144 / 305×166
altura da seção 848px a 1920, 845px a 1440, 816px a 901, 1299px a 900, 1369px a 390
3 e 5 caixas (<li> apagado / clonado) 340×180 e 189×246 a 1440; 250×156 e 140×253 a 901 — desvio de 0,01px e zero estouro em todos
5 caixas sem .flx-apoio 189×128 a 1440 e 140×108 a 901 — é a variação que o teto de largura pede
.sec-paper em vez de .sec-deep traço e contorno em rgba(28,24,17,.28), rótulo em rgb(28,24,17), fundo rgb(237,233,227) — nenhuma cor própria a corrigir
última caixa content:none nos dois pseudo-elementos: não desenha traço nem ponta
[hidden] na última caixa ela computa display:none; a terceira computa content:none nos dois pseudos (sem seta órfã). CSS.supports(selector(:has(+ *))) verdadeiro
--reduce transform:none nas quatro caixas, geometria idêntica ao repouso, desvio 0,00px
JavaScript desligado de verdade (javaScriptEnabled:false) as quatro caixas em opacity:1, filter:none, transform:none, e o h2.sec-title também; geometria idêntica (246×202, topo em 419); a copy inteira legível
teclado zero elementos focáveis na dobra — nada interativo a alcançar
semântica <ol role="list">, 4 itens, list-style-type: none, três .flx-rel com texto, .flx-num todos com aria-hidden="true"
overflow horizontal ok em 1920, 1440, 1240, 1024, 901, 900, 768, 390 e 360
console limpo em todas as execuções