AuraWall is a deterministic vector engine running entirely on the client-side.
Why This Stack?
React 19 fornece os hooks mais recentes e renderização concorrente para atualizações de UI suaves.
Tailwind CSS v4 usa um motor baseado em Rust para compilação instantânea sem overhead em runtime.
DOM SVG nativo garante escalabilidade infinita sem pixelização.
Canvas API permite rasterização em qualquer resolução.
i18next oferece detecção automática de idioma e interpolação segura.
Vite 6 oferece HMR instantâneo e builds otimizados.
Vitest & Playwright garantem a integridade visual e lógica de cada build.
GitHub Actions automatiza CI/CD, Pages hospeda o site estático, e Workflows gerencia releases.
lz-string com Array Notation V2 compacta configurações para compartilhamento via URL com redução de até 78%.
The promotional site uses Static Site Generation (SSG) for maximum performance: pre-rendered pages at build time, zero JavaScript for first paint, TTI under 1s, and centralized scripts for continuous monitoring.
npm run health - Complete project verificationnpm run performance:audit - Lighthouse metrics
Unidirectional state: all changes flow from global state to visual components.
This lightweight JSON object is all that's needed to reconstruct the image deterministically on any device.
interface WallpaperConfig {
// Dimensões do Canvas
width: number; // Largura em pixels
height: number; // Altura em pixels
// Aparência Global
baseColor: string | BackgroundConfig;
noise: number; // Intensidade do grão (0-100)
noiseScale: number; // Escala do ruído (1-20)
// Camadas de Composição
shapes: Shape[]; // Array de formas vetoriais
// Sistemas Opcionais
animation?: AnimationSettings;
vignette?: VignetteSettings;
}
interface Shape {
id: string;
type: 'circle' | 'blob';
// Posição Relativa (0-100%)
x: number;
y: number;
size: number; // % da largura do canvas
// Estilo
color: string; // Hex color
opacity: number; // 0.0 - 1.0
blur: number; // Gaussian blur (px)
blendMode: BlendMode;
complexity?: number; // Para blobs
}The image is composed in layers: Background → Shapes → Vignette → Noise overlay.
Solid color or linear/radial gradient
Circles and blobs with blur and blend modes
Radial mask with gradientTransform
feTurbulence with mix-blend-mode overlay
The visual effects are achieved by combining native SVG filter primitives.
<filter id="noiseFilter">
<!-- Gera ruído fractal -->
<feTurbulence
type="fractalNoise"
baseFrequency={noiseScale / 1000}
numOctaves="3"
stitchTiles="stitch"
/>
<!-- Remove saturação -->
<feColorMatrix
type="saturate"
values="0"
/>
<!-- Ajusta transparência -->
<feComponentTransfer>
<feFuncA
type="linear"
slope={noise / 100}
/>
</feComponentTransfer>
</filter><!-- Filtro por forma -->
<filter id="blur-{shape.id}">
<feGaussianBlur
stdDeviation={shape.blur}
result="coloredBlur"
/>
</filter>
<!-- Aplicação na forma -->
<circle
cx={shape.x + '%'}
cy={shape.y + '%'}
r={shape.size + '%'}
fill={shape.color}
filter="url(#blur-{shape.id})"
style={{
mixBlendMode: shape.blendMode
}}
/>An automatic validation system that ensures all shapes are visible, regardless of the color and blend mode combination chosen.
| Background Scenario | Problem Detected | Corrective Action |
|---|---|---|
| Pitch Black (L < 10%) | BlendMode: multiply, overlay, soft-light | FORCES screen or normal |
| Pitch Black | Shape color L < 50% | BOOSTS Lightness to 50-90% |
| Dark Mode (L < 40%) | BlendMode: multiply | CHANGES to overlay or screen |
| Light Mode (L > 60%) | BlendMode: screen, color-dodge | CHANGES to multiply or normal |
SVG is serialized, loaded into an Image, drawn to Canvas, then exported as DataURL.
// Fluxo de exportação simplificado
const svgString = new XMLSerializer().serializeToString(svgElement);
const blob = new Blob([svgString], { type: 'image/svg+xml' });
const url = URL.createObjectURL(blob);
const img = new Image();
img.onload = () => {
const canvas = document.createElement('canvas');
canvas.width = config.width;
canvas.height = config.height;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
const dataUrl = canvas.toDataURL('image/jpeg', quality);
// Trigger download...
};
img.src = url;AuraWall uses an advanced compression system to generate short shareable links. V2 reduces URLs by up to 65% using array notation and numeric codes.
s0, s1, s2...)#aabbcc → abc (sem # e shorthand)"screen" → 1// Formato V2: Array Notation
type ShapeArray = [
type, // 0=circle, 1=blob
x, y, // posição (0-100)
size, // tamanho
color, // "d8b4fe" (sem #)
opacity, // 0-100 (inteiro)
blur, // pixels
blend // 0-11 (numérico)
];
// Exemplo de Shape
// V1 (objeto): 68 bytes
{"i":"aa1","t":"c","x":20,"y":20,
"z":120,"c":"d8b4fe","o":0.6,
"u":100,"b":"m"}
// V2 (array): 28 bytes (-59%)
[0,20,20,120,"d8b4fe",60,100,3]Redução total: ~78% do tamanho original
https://mafhper.github.io/aurawall/app/#c=NoRg...DjR3dqBE (~400 chars)V2 links are 65% smaller than the previous format, making sharing easier on social networks and messengers.