Cross
Small crosses at every intersection, a registration grid, with five of them lit and breathing.
Fine graph paper, the busiest grid of the series, with three lights under it at three rates.
“Copy the hero” is the styles and the SVG, carrying the colours and speed you set above. “Copy as a section” adds the wrapper a hero actually needs: the SVG absolute behind the copy, inert to the pointer, and a scrim so the heading holds. The Free licence asks for one visible credit per page: Animation by Pulsar, linked to Pulsar. Licence
Set any of these on the section, or on any ancestor, and the hero follows. Nothing else in the file needs editing.
<!-- Pulsar by Business Nebula · "hero-lattice-graph" · https://pulsaricons.com | Licence: https://pulsaricons.com/legal/licence | Free-licence credit: Animation by Pulsar, linked to https://pulsaricons.com | Business Nebula: https://businessnebula.com.au -->
<style>
.hero {
position: relative;
isolation: isolate;
overflow: hidden;
min-height: 70vh;
display: flex;
align-items: center;
padding: 5rem 5%;
color: #1d1b3a;
background: #f7f7fb;
}
.hero > .pulsar-hero {
position: absolute;
inset: 0;
z-index: 0;
pointer-events: none;
}
/* A scrim under the copy, heavier on the side the text sits on. */
.hero-scrim {
position: absolute;
inset: 0;
z-index: 1;
pointer-events: none;
background: linear-gradient(100deg, #f7f7fb 0%, color-mix(in oklab, #f7f7fb 78%, transparent) 40%, transparent 68%);
}
.hero-copy {
position: relative;
z-index: 2;
max-width: 40rem;
}
.hero-eyebrow {
font-size: 0.75rem;
letter-spacing: 0.18em;
text-transform: uppercase;
opacity: 0.8;
}
/* Generated by scripts/hero-lattice.mjs from heroes/hero-lattice-graph/params.json.
Consumers set four custom properties on any ancestor:
--pulsar-hero-bg the ground (default #f7f7fb)
--pulsar-hero-ink the grid (default #1d1b3a)
--pulsar-accent the glows and nodes (default #8a7df7)
--pulsar-hero-speed a rate; 2 is twice as fast, 0.5 half speed */
.pulsar-hero-lattice-graph {
display: block;
width: 100%;
height: 100%;
color: var(--pulsar-hero-ink, #1d1b3a);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-ground {
fill: var(--pulsar-hero-bg, #f7f7fb);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-accent-stop {
stop-color: var(--pulsar-accent, #8a7df7);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-ground-stop {
stop-color: var(--pulsar-hero-bg, #f7f7fb);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-band {
transform-box: view-box;
will-change: transform;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-1 {
transform-origin: 1100px 400px;
animation-name: hero-lattice-graph-glow-1;
animation-duration: calc(23s / var(--pulsar-hero-speed, 1));
}
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-2 {
transform-origin: 1550px 750px;
animation-name: hero-lattice-graph-glow-2;
animation-duration: calc(17s / var(--pulsar-hero-speed, 1));
}
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-3 {
transform-origin: 700px 850px;
animation-name: hero-lattice-graph-glow-3;
animation-duration: calc(29s / var(--pulsar-hero-speed, 1));
}
@keyframes hero-lattice-graph-glow-1 {
from {
transform: translate(-80px, -30px) scale(0.94);
}
to {
transform: translate(80px, 30px) scale(1.06);
}
}
@keyframes hero-lattice-graph-glow-2 {
from {
transform: translate(80px, 30px) scale(0.94);
}
to {
transform: translate(-80px, -30px) scale(1.06);
}
}
@keyframes hero-lattice-graph-glow-3 {
from {
transform: translate(-80px, -30px) scale(0.94);
}
to {
transform: translate(80px, 30px) scale(1.06);
}
}
@media (prefers-reduced-motion: reduce) {
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-1,
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-2,
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-3 {
animation: none;
}
}
</style>
<section class="hero">
<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" class="pulsar pulsar-hero pulsar-hero-lattice-graph" data-pulsar="hero-lattice-graph" preserveAspectRatio="xMidYMid slice" viewBox="0 0 1600 900"><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description><dc:title>hero-lattice-graph</dc:title><dc:creator>Pulsar by Business Nebula</dc:creator><dc:publisher>Business Nebula</dc:publisher><dc:source>https://pulsaricons.com/icons</dc:source><dc:relation>https://businessnebula.com.au</dc:relation><dc:rights>Pulsar licence, https://pulsaricons.com/legal/licence</dc:rights></rdf:Description></rdf:RDF></metadata><defs><radialGradient id="hero-lattice-graph-glow-1"><stop class="hero-lattice-graph-accent-stop" offset="0" stop-opacity=".35"></stop><stop class="hero-lattice-graph-accent-stop" offset=".5" stop-opacity=".15"></stop><stop class="hero-lattice-graph-accent-stop" offset="1" stop-opacity="0"></stop></radialGradient><radialGradient id="hero-lattice-graph-glow-2"><stop class="hero-lattice-graph-accent-stop" offset="0" stop-opacity=".35"></stop><stop class="hero-lattice-graph-accent-stop" offset=".5" stop-opacity=".15"></stop><stop class="hero-lattice-graph-accent-stop" offset="1" stop-opacity="0"></stop></radialGradient><radialGradient id="hero-lattice-graph-glow-3"><stop offset="0" stop-color="currentColor" stop-opacity=".12"></stop><stop offset=".5" stop-color="currentColor" stop-opacity=".05"></stop><stop offset="1" stop-color="currentColor" stop-opacity="0"></stop></radialGradient><linearGradient id="hero-lattice-graph-veil" x1="0" x2="1600" y1="0" y2="0" gradientUnits="userSpaceOnUse"><stop class="hero-lattice-graph-ground-stop" offset="0" stop-opacity=".92"></stop><stop class="hero-lattice-graph-ground-stop" offset=".3" stop-opacity=".6"></stop><stop class="hero-lattice-graph-ground-stop" offset=".62" stop-opacity=".15"></stop><stop class="hero-lattice-graph-ground-stop" offset="1" stop-opacity="0"></stop></linearGradient><pattern id="hero-lattice-graph-tile" width="32" height="32" patternUnits="userSpaceOnUse"><path fill="none" stroke="currentColor" stroke-width=".8" d="M0 0h32M0 0v32"></path></pattern></defs><rect width="1600" height="900" class="hero-lattice-graph-ground"></rect><g class="hero-lattice-graph-band hero-lattice-graph-glow hero-lattice-graph-glow-1"><ellipse cx="1100" cy="400" fill="url(#hero-lattice-graph-glow-1)" rx="600" ry="420"></ellipse></g><g class="hero-lattice-graph-band hero-lattice-graph-glow hero-lattice-graph-glow-2"><ellipse cx="1550" cy="750" fill="url(#hero-lattice-graph-glow-2)" rx="380" ry="300"></ellipse></g><g class="hero-lattice-graph-band hero-lattice-graph-glow hero-lattice-graph-glow-3"><ellipse cx="700" cy="850" fill="url(#hero-lattice-graph-glow-3)" rx="500" ry="200"></ellipse></g><rect width="1600" height="900" fill="url(#hero-lattice-graph-tile)" class="hero-lattice-graph-field" opacity=".25"></rect><rect width="1600" height="900" fill="url(#hero-lattice-graph-veil)" class="hero-lattice-graph-veil"></rect></svg>
<div class="hero-scrim" aria-hidden="true"></div>
<div class="hero-copy">
<h1>Your heading</h1>
<p>Your supporting sentence.</p>
<a href="#">Your call to action</a>
</div>
</section>
/* Generated by scripts/hero-lattice.mjs from heroes/hero-lattice-graph/params.json.
Consumers set four custom properties on any ancestor:
--pulsar-hero-bg the ground (default #f7f7fb)
--pulsar-hero-ink the grid (default #1d1b3a)
--pulsar-accent the glows and nodes (default #8a7df7)
--pulsar-hero-speed a rate; 2 is twice as fast, 0.5 half speed */
.pulsar-hero-lattice-graph {
display: block;
width: 100%;
height: 100%;
color: var(--pulsar-hero-ink, #1d1b3a);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-ground {
fill: var(--pulsar-hero-bg, #f7f7fb);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-accent-stop {
stop-color: var(--pulsar-accent, #8a7df7);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-ground-stop {
stop-color: var(--pulsar-hero-bg, #f7f7fb);
}
.pulsar-hero-lattice-graph .hero-lattice-graph-band {
transform-box: view-box;
will-change: transform;
animation-timing-function: linear;
animation-iteration-count: infinite;
animation-direction: alternate;
}
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-1 {
transform-origin: 1100px 400px;
animation-name: hero-lattice-graph-glow-1;
animation-duration: calc(23s / var(--pulsar-hero-speed, 1));
}
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-2 {
transform-origin: 1550px 750px;
animation-name: hero-lattice-graph-glow-2;
animation-duration: calc(17s / var(--pulsar-hero-speed, 1));
}
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-3 {
transform-origin: 700px 850px;
animation-name: hero-lattice-graph-glow-3;
animation-duration: calc(29s / var(--pulsar-hero-speed, 1));
}
@keyframes hero-lattice-graph-glow-1 {
from {
transform: translate(-80px, -30px) scale(0.94);
}
to {
transform: translate(80px, 30px) scale(1.06);
}
}
@keyframes hero-lattice-graph-glow-2 {
from {
transform: translate(80px, 30px) scale(0.94);
}
to {
transform: translate(-80px, -30px) scale(1.06);
}
}
@keyframes hero-lattice-graph-glow-3 {
from {
transform: translate(-80px, -30px) scale(0.94);
}
to {
transform: translate(80px, 30px) scale(1.06);
}
}
@media (prefers-reduced-motion: reduce) {
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-1,
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-2,
.pulsar-hero-lattice-graph .hero-lattice-graph-glow-3 {
animation: none;
}
}
Small crosses at every intersection, a registration grid, with five of them lit and breathing.
A fine grid turned through forty-five degrees, two accent lights under it.
A fine dot grid with one accent light moving slowly beneath it.
A perspective floor receding to a horizon, with the horizon itself glowing and breathing.
A dense dot field with one round accent light and six lit dots around it, pulsing.
A honeycomb of thin hexagons with an accent light and an ink shadow moving under it.
Wide ruled squares, a sheet of graph paper, with an accent light and a shadow of ink drifting under it.
An isometric lattice, the grid of a technical drawing, lit from one moving point.
The floor turned over: a ceiling of lines converging above the copy, sparse, with one light at the far end.