← Biblioteca componentes/efeitos/quebra-papel-rasgado/ficha.md CódigoTela cheia
efeitos/quebra-papel-rasgado

Quebra em papel rasgado

🟢 estavel complexidade baixa prefixo torn- quebra transicao-de-secao clip-path papel borda-irregular css-puro sem-js decoracao sem javascript

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

<link rel="stylesheet" href="componentes/efeitos/quebra-papel-rasgado/estilo.css">

markup.html · 29 linhas · 1,6 KB

<!-- ==========================================================================
     QUEBRA EM PAPEL RASGADO — a dobra clara arranca um pedaço do escuro
     Prefixo: torn-
     Requer: core/tokens.css, core/base.css, core/motion.css, core/motion.js
             + este estilo.css. Sem script.

     O componente é a junção, não a seção: sem uma vizinha escura em cima e
     outra embaixo não há o que rasgar — o efeito só existe no contraste entre
     a folha clara e o preto que aparece por dentro do corte. No site real
     essas vizinhas são as dobras que você já tem; no preview elas vivem em
     preview-antes.html e preview-extra.html, para que este arquivo seja só o
     que se cola.
     ========================================================================== -->

<!-- ===================== COMPONENTE — INÍCIO ===================== -->

<!-- O invólucro pinta a cor que aparece DENTRO do rasgo. O padrão é --dark.
     Vizinhas em .sec-deep? Acrescente style="--torn-behind:var(--dark-2)". -->
<div class="torn-band">
  <section class="sec-paper sec-pad torn" id="quebra">
    <div class="wrap">
      <span class="eyebrow" data-rv>Respiro</span>
      <h2 class="sec-title ttl">A folha clara que <em>separa</em> dois blocos escuros</h2>
      <p class="sec-lead" data-rv data-d="1">O conteúdo desta seção é livre — o componente é só a borda. Aqui cabe o bloco que precisa de leitura longa, o depoimento, a lista de serviços: o que ganha respirando em fundo claro no meio de uma página preta.</p>
    </div>
  </section>
</div>

<!-- ====================== COMPONENTE — FIM ====================== -->

estilo.css · 92 linhas · 5,2 KB

/* ==========================================================================
   QUEBRA EM PAPEL RASGADO — a seção clara arranca um pedaço do escuro
   Prefixo: torn-
   Tokens usados: --dark (só no invólucro; a seção continua lendo o próprio
   escopo de tom, este componente nunca toca em --fg nem em --bg)

   Duas peças, e a ordem importa:
     .torn-band   invólucro que pinta a cor que aparece DENTRO do rasgo
     .torn        a seção recortada

   clip-path não desenha: ele apaga. O que aparece no lugar do pedaço
   arrancado é o que estiver pintado ATRÁS da seção — nunca a seção vizinha,
   que fica ao lado e não embaixo. Por isso o invólucro existe, e por isso
   ele é a única parte do componente que lê uma cor.

   O polígono tem 58 vértices — 29 em cima, 29 embaixo — espaçados a cada
   3,571% da largura. Ele é FIXO, não sorteado: a mesma marca de rasgo em
   toda a página, como uma folha de verdade. Ruído diferente por seção lê
   como bug, não como papel.

   A profundidade de cada vértice é uma medida em px multiplicada por um
   knob. São três, e nenhum deles precisa que o polígono seja reescrito:
     --torn-depth  escala geral do rasgo (1 = padrão, mordida máxima 22px)
     --torn-top    profundidade da borda de cima  (0 = borda reta)
     --torn-bot    profundidade da borda de baixo (0 = borda reta)
     --torn-behind cor que aparece dentro do rasgo (no .torn-band)
   ========================================================================== */

/* O invólucro é um <div>, não uma <section>: ele é decoração e não pode
   virar landmark falso para leitor de tela. Só existe para garantir a cor
   do vão — se o fundo da página já for exatamente a cor que você quer ver
   dentro do rasgo, ele pode ser dispensado. */
.torn-band{
  --torn-behind:var(--dark);
  background:var(--torn-behind);
}

.torn{
  --torn-depth:1;
  --torn-top:var(--torn-depth);
  --torn-bot:var(--torn-depth);

  clip-path:polygon(
    /* ---- borda de cima, da esquerda para a direita ---- */
    0.0% calc(15px * var(--torn-top)),    3.6% calc(3px * var(--torn-top)),    7.1% calc(8px * var(--torn-top)),
    10.7% calc(7px * var(--torn-top)),   14.3% calc(17px * var(--torn-top)),  17.9% calc(16px * var(--torn-top)),
    21.4% calc(20px * var(--torn-top)),  25.0% calc(4px * var(--torn-top)),   28.6% calc(10px * var(--torn-top)),
    32.1% calc(3px * var(--torn-top)),   35.7% calc(6px * var(--torn-top)),   39.3% calc(12px * var(--torn-top)),
    42.9% calc(3px * var(--torn-top)),   46.4% calc(6px * var(--torn-top)),   50.0% calc(15px * var(--torn-top)),
    53.6% calc(13px * var(--torn-top)),  57.1% calc(6px * var(--torn-top)),   60.7% calc(14px * var(--torn-top)),
    64.3% calc(18px * var(--torn-top)),  67.9% calc(2px * var(--torn-top)),   71.4% calc(18px * var(--torn-top)),
    75.0% calc(16px * var(--torn-top)),  78.6% calc(9px * var(--torn-top)),   82.1% calc(5px * var(--torn-top)),
    85.7% calc(21px * var(--torn-top)),  89.3% calc(9px * var(--torn-top)),   92.9% calc(4px * var(--torn-top)),
    96.4% calc(4px * var(--torn-top)),  100.0% calc(19px * var(--torn-top)),

    /* ---- borda de baixo, da direita para a esquerda ---- */
    100.0% calc(100% - 17px * var(--torn-bot)),  96.4% calc(100% - 5px * var(--torn-bot)),
     92.9% calc(100% - 14px * var(--torn-bot)),  89.3% calc(100% - 15px * var(--torn-bot)),
     85.7% calc(100% - 21px * var(--torn-bot)),  82.1% calc(100% - 7px * var(--torn-bot)),
     78.6% calc(100% - 6px * var(--torn-bot)),   75.0% calc(100% - 9px * var(--torn-bot)),
     71.4% calc(100% - 9px * var(--torn-bot)),   67.9% calc(100% - 15px * var(--torn-bot)),
     64.3% calc(100% - 8px * var(--torn-bot)),   60.7% calc(100% - 4px * var(--torn-bot)),
     57.1% calc(100% - 7px * var(--torn-bot)),   53.6% calc(100% - 4px * var(--torn-bot)),
     50.0% calc(100% - 8px * var(--torn-bot)),   46.4% calc(100% - 7px * var(--torn-bot)),
     42.9% calc(100% - 3px * var(--torn-bot)),   39.3% calc(100% - 16px * var(--torn-bot)),
     35.7% calc(100% - 14px * var(--torn-bot)),  32.1% calc(100% - 19px * var(--torn-bot)),
     28.6% calc(100% - 14px * var(--torn-bot)),  25.0% calc(100% - 19px * var(--torn-bot)),
     21.4% calc(100% - 13px * var(--torn-bot)),  17.9% calc(100% - 10px * var(--torn-bot)),
     14.3% calc(100% - 22px * var(--torn-bot)),  10.7% calc(100% - 13px * var(--torn-bot)),
      7.1% calc(100% - 17px * var(--torn-bot)),   3.6% calc(100% - 18px * var(--torn-bot)),
      0.0% calc(100% - 14px * var(--torn-bot))
  );
}

/* Rasga só uma das bordas. Zerar o knob do outro lado é o que mantém o
   polígono único: não existe um segundo clip-path escrito à mão para cada
   variação, e por isso os breakpoints abaixo não ressuscitam a borda reta —
   eles mexem em --torn-depth, que já foi consumido aqui. */
.torn--top{--torn-bot:0}
.torn--bottom{--torn-top:0}

/* ---- mobile ----
   A profundidade é px e o espaçamento é %, então a inclinação do rasgo muda
   com a largura da tela. Em 1240px cada dente tem 44px de base para 22px de
   altura e lê como papel; em 375px a base cai para 13px e a mesma altura
   vira serra. Encolher a mordida é o que preserva a leitura. */
@media(max-width:900px){
  .torn{--torn-depth:.72}
}
@media(max-width:560px){
  .torn{--torn-depth:.5}
}

Uma dobra clara no meio de uma página escura, com as bordas de cima e de baixo arrancadas em vez de cortadas. O olho não lê "o fundo mudou de cor": lê "tem uma folha colada aqui". A diferença é toda da borda — dois filetes irregulares de no máximo 22px.

O problema é conhecido: .sec-paper entre duas .sec-dark produz duas linhas retas perfeitas atravessando a tela, e retas perfeitas entre tons opostos leem como slide, não como página. O rasgo transforma a exceção de tom em objeto. É a primeira peça da categoria efeitos, e a única da biblioteca que não tem conteúdo próprio: ela é só a borda de uma seção que já existe.


Quando usar

Quando não usar


Padrão editorial

O componente não tem slot de texto. O que ele pede é uma decisão sobre qual conteúdo merece a folha — e essa decisão é editorial:

Slot Regra
A seção rasgada O bloco que precisa de leitura longa ou de respiro visual. Se o conteúdo dela caberia numa .sec-dark sem perda, ele não justifica a inversão de tom nem o rasgo.
Olho, título e apoio Primitivas do core (.eyebrow, h2.sec-title, .sec-lead), lidas do escopo .sec-paper. Nada muda por causa do rasgo.
Vizinha de cima Tom escuro chapado, sem mídia sangrando. É o que aparece dentro do corte.
Vizinha de baixo O mesmo tom. A folha é exceção de uma dobra; a seguinte volta direto ao escuro.

Uma folha por página. Duas ainda passam se estiverem longe uma da outra e o conteúdo justificar as duas. Três é decoração.

Assets

Nenhum. Sem SVG, sem PNG, sem máscara em imagem — o rasgo é um clip-path de 58 vértices escrito no CSS. Isso não é economia de bytes, é a razão de o componente funcionar: nenhuma requisição a mais, nada para servir em 2x, e a borda acompanha qualquer largura de tela sem esticar pixel.


Como usar

<link rel="stylesheet" href="componentes/efeitos/quebra-papel-rasgado/estilo.css">

Sem script. Duas peças, nesta ordem:

<div class="torn-band">
  <section class="sec-paper sec-pad torn">
    <div class="wrap"><!-- conteúdo livre --></div>
  </section>
</div>

O .torn-band pinta a cor que aparece dentro do rasgo. O .torn recorta a seção. O markup.html traz as duas vizinhas escuras junto porque o efeito só existe na junção — mas elas são contexto, não fazem parte do que se copia.

Ganchos

Gancho Papel
.torn a seção recortada — vai junto com o escopo de tom e o .sec-pad
.torn-band o invólucro que pinta o vão. <div>, nunca <section>
.torn--top rasga só a borda de cima
.torn--bottom rasga só a borda de baixo
--torn-depth escala geral do rasgo no .torn. 1 = mordida máxima de 22px
--torn-top / --torn-bot profundidade de cada borda. 0 deixa a borda reta
--torn-behind cor do vão, no .torn-band. Padrão var(--dark)

Variações

Variação Como
Só uma borda class="... torn torn--top" ou torn--bottom. Útil quando a folha abre a página ou encosta no rodapé
Rasgo mais forte --torn-depth:1.4 no .torn. Acima de 1.6 vira serra
Vizinhas em .sec-deep style="--torn-behind:var(--dark-2)" no .torn-band
Rasgo invertido Seção .sec-dark dentro de .torn-band com --torn-behind:var(--light): o preto é que arranca o claro
Sem invólucro Dispensável quando o fundo do body já é exatamente a cor do vão. Foi assim na origem — e é exatamente o que quebra quando a página muda de fundo

Gotchas


Histórico

Projeto Onde Data Situação
Liberta Wealth site/assets/css/style.css, classe .torn em #solucoes 2026-08 Origem do polígono. A composição site/ não tem ida a produção confirmada.
Liberta Wealth github-repo/assets/css/style.css linha 113 2026-08 Versão confirmada. A classe continua no HTML e a regra virou .torn{clip-path:none} — o efeito foi previsto e nunca ligado.

O desligamento não tem motivo registrado. Varrido o github-repo/ inteiro, não há comentário no CSS, nota em markdown nem mensagem de commit explicando a troca por clip-path:none — o site entrou no repositório já com a regra inerte (commit 409fc48, "Site Liberta Wealth"). O registro do projeto (projetos/liberta-wealth.md) documenta o fato, não a razão.

Sem motivo registrado, não invente um. Duas hipóteses plausíveis, e nenhuma delas verificada: ou o rasgo foi julgado artesanal demais para uma marca de consultoria patrimonial, ou a mordida de 22px em largura de desktop leu como serra e ninguém voltou para calibrar. A segunda tem remédio nesta versão (--torn-depth); a primeira é decisão de marca e nenhum CSS resolve.

O que mudou na normalização:

Na origem Aqui Por quê
.torn solta, sem prefixo .torn + .torn-band + .torn--top / .torn--bottom Um prefixo, sempre (contrato §6). torn já servia de prefixo; o resto passou a nascer dele
Profundidades cravadas em px, 58 vezes calc(15px * var(--torn-top)) e um --torn-depth global Calibrar o rasgo passou a ser um número, não uma reescrita do polígono
Rasgo sempre nas duas bordas --torn-top / --torn-bot, zeráveis Uma borda só sem duplicar o clip-path
Sem breakpoint --torn-depth cai a .72 e .5 Em tela estreita a mesma mordida vira serra
Dependia do fundo do body ser --dark .torn-band com --torn-behind A cor do vão virou decisão explícita, não coincidência da página
Efeito inerte (clip-path:none) na versão confirmada Ligado, com os knobs para calibrar É o componente que foi catalogado, não o desligamento

Calibragem no primeiro uso. Espere ajustar --torn-depth: a profundidade do rasgo depende da altura da dobra vizinha. Verificado no preview em 1200px, 700px e 420px — nas duas bordas, nas duas variações de borda única e com os três knobs.

Ressalva de proveniência: a única versão confirmada do site de origem traz o efeito desligado por .torn{clip-path:none}, sem comentário registrando o motivo; a versão em que ele está ativo (site/) não tem publicação confirmada.