TEXTURA É O QUE SEPARA MATERIAL DE PIXEL.
Três camadas de textura. Cada uma com papel específico. Noise é permanente — sem exceção. Grain e vignette são contextuais. Saber diferenciar é saber usar.
SVG com fractalNoise aplicado como pseudo-elemento sobre todas as superfícies. Cria a sensação de material físico, imperfeição intencional, profundidade. Sem noise, a peça parece digital demais — limpa, sem textura, sem peso.
Grain fotográfico emula filmes de 35mm e fotografia analógica. Diferente do noise (geométrico, sintético), o grain é aplicado sobre imagens para integrá-las à estética da marca. Fotos sem grain parecem estrangeiras na composição.
Radial-gradient preto nas bordas da imagem. Escurece as extremidades e mantém o centro visível. Garante contraste para texto branco sobre qualquer foto sem precisar de um retângulo sólido. Sutil — invisível mas presente.
Essa hierarquia não tem exceção. Superfície limpa sem noise não existe na Dark n' Black. Grain em superfície sólida não faz sentido. Vignette sem foto é desperdício.
/* Em globals.css ou no root layout */
.noise-overlay::after {
content: '';
position: fixed;
inset: 0;
background-image: var(--noise);
background-size: 256px 256px;
pointer-events: none;
z-index: 9999;
opacity: 1;
}/* Wrapper da imagem */
.foto-wrapper {
position: relative;
overflow: hidden;
}
.foto-wrapper::after {
content: '';
position: absolute;
inset: 0;
background-image: url("data:image/svg+xml,
<svg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'>
<filter id='g'>
<feTurbulence type='turbulence'
baseFrequency='0.75'
numOctaves='4'
stitchTiles='stitch'/>
</filter>
<rect width='100%' height='100%'
filter='url(#g)' opacity='0.2'/>
</svg>");
background-size: 200px 200px;
mix-blend-mode: overlay;
opacity: 0.6;
pointer-events: none;
}/* Container com foto de fundo */
.foto-com-texto {
position: relative;
}
/* Camada de vignette — entre foto e texto */
.foto-com-texto::before {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(
ellipse at center,
transparent 30%,
rgba(0, 0, 0, 0.75) 100%
);
pointer-events: none;
z-index: 1;
}
/* Texto fica acima do vignette */
.foto-com-texto .texto {
position: relative;
z-index: 2;
}