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
- Numa página escura que tem uma parada clara — o respiro previsto no contrato (§3, regra do tom vizinho). O rasgo justifica editorialmente essa quebra de tom.
- Quando o bloco claro é o mais lido da página: manifesto, lista de serviços, depoimento longo. Fundo claro carrega texto melhor, e a borda rasgada compra a licença de inverter.
- Em marca com pegada editorial, artesanal ou de arquivo. O rasgo é um gesto de papel, e ele fala.
Quando não usar
- Mais de duas vezes na mesma página. O polígono é fixo: a terceira aparição do rasgo idêntico denuncia que é CSS, e o efeito vira padrão de fundo.
- Quando a seção vizinha tem foto ou vídeo sangrando até a borda. O vão do rasgo é pintado com uma cor chapada; contra uma imagem, o recorte aparece como um filete de cor errada.
- Em seção que hospeda componente com elemento vazando da caixa — dropdown de
conversao/select-custom, sombra que estoura, badge pendurado no canto. Oclip-pathcorta descendente, sem aviso. - Em página inteira clara. Sem contraste de tom entre a seção e o que está atrás, não há rasgo — há uma borda serrilhada sem motivo.
- Quando a marca é técnica, financeira dura ou institucional sóbria. Papel rasgado tem temperatura; nem toda marca quer.
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
-
clip-pathapaga, não desenha. O que aparece no lugar do pedaço arrancado é o que estiver pintado atrás da seção — nunca a seção vizinha, que está ao lado e não embaixo. Sem o.torn-band, quem aparece no vão é o fundo dobody. Numa página de fundo claro o rasgo some sem erro nenhum no console. -
A cor do vão tem de bater com a vizinha, não com o tema. O padrão é
--dark(#0a0a0a). Se as vizinhas forem.sec-deep(--dark-2), o vão sai num escuro diferente do que está ao lado — o contrato chama isso de "quase imperceptível", mas em faixa de 20px colada na vizinha, aparece. Ajuste--torn-behind. -
A mordida come o
padding, não o conteúdo — enquanto houver.sec-pad. Com--sec-gapno piso (110px), 22px de rasgo deixam 88px de respiro. Numa seção sem.sec-pad, ou com padding curto, o rasgo entra no texto. -
Tudo que ultrapassa a caixa da seção é cortado. Descendente absoluto, dropdown aberto, tooltip, sombra larga, badge pendurado na borda: o recorte não pergunta. Uma seção rasgada não hospeda componente que estoura a própria caixa.
-
A profundidade é px e o espaçamento é %, então a inclinação muda com a 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. Daí
--torn-depthcair para.72abaixo de 900px e.5abaixo de 560px. Não é enfeite de mobile — é o que mantém o efeito legível. -
O polígono é fixo de propósito. É tentador sortear os vértices por seção para "ficar mais natural". Não fica: folha de papel tem uma marca de rasgo só, e ruído diferente a cada dobra lê como bug de renderização. Se repetir tanto a ponto de incomodar, o problema é a quantidade de quebras, não o polígono.
-
clip-pathcria contexto de empilhamento. Nenhumz-indexde dentro da seção escapa para fora dela — e mesmo que escapasse, o recorte já teria cortado. -
Não anime o
clip-path. São 58 vértices interpolando por frame, e o resultado nem é bom: o rasgo "respirando" lê como glitch. Este componente é geometria parada; o movimento da seção continua sendodata-rve.ttl, do core. -
É decoração pura. Não tem papel semântico, não anuncia nada e não precisa de
aria. Por isso o invólucro é<div>e não<section>: uma segunda<section>em volta criaria um landmark falso para leitor de tela, e o componente passaria a atrapalhar exatamente quem não vê o rasgo. -
Na versão confirmada do projeto de origem, o efeito está desligado. Ver o histórico abaixo — é o gotcha que decide o status.
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 |
Status externo: o polígono existe e funciona, mas nunca rodou em produção. A única versão confirmada do site de origem o traz desligado, e a versão em que ele está ativo (site/) não tem publicação confirmada. Foi normalizado ao contrato e verificado no preview em 1200px, 700px e 420px — nas duas bordas, nas duas variações de borda única e com os três knobs — mas não tem quilometragem: espere calibrar --torn-depth no primeiro uso real. Rodando num site, vira estavel e esta tabela ganha a linha do projeto.