Art Direction
The brand's signature graphic language: particle clouds. One material — brand-role points displaced and sized by a shared noise field — applied to a family of forms. The hero sphere is the headline; these are the rest of the set.
import from src/components/heros/HeroParticles.astro · src/components/sections/ParticleStream.astro
One material, many forms
Every particle graphic on the site is built the same way, so they read as one
family rather than a pile of effects. Points are coloured from the brand roles —
amber (--primary) at the top easing to
crimson (--accent) at the bottom — and a
single simplex-noise field both nudges each point off its lattice and sets its
size. Change the palette and every shape follows, because none of them names a
colour.
The hero sphere is this treatment on an icosahedron; the ember river is the same lattice unfolded flat and set flowing. The primitives below are the rest of the vocabulary — reach for one when a section needs a backdrop, not a new idea.
The primitives
How they differ
- Solids (the platonic set, cube, cylinder, cone, pyramid, torus, knot) hold a fixed silhouette and turn slowly. The noise there drives only point size — a live shimmer across a rigid form, never a wobble that melts it.
- Box samples points along the wireframe edges only, for a lighter, structural read.
- Wave is the lattice as a flat sheet, the noise travelling through it as a swell — the closest cousin to the ember river.
- Static Field is the exception that proves the rule: a frozen cloud, no time term, sizes fixed. Use it when you want the texture without the motion.
Rules
-
Particles are always backdrop, never content. They sit behind, are
aria-hidden, and take no pointer or scroll events. Nothing on the page depends on them rendering. - Colour comes from the roles, never a literal. A specimen that hard-codes amber has broken the one rule that lets the whole set re-skin at once.
- WebGL is the site's one heavy dependency, and it is opt-in per surface. A marketing section adds a particle backdrop deliberately, knowing the cost; the rest stay zero-JS.
-
Everything pauses off-screen and collapses to a single still frame under
prefers-reduced-motion. Ambient motion is never load-bearing.