Horizon
A field of white dots rolling away to the horizon, in 3D.
preset="horizon"
Interactive dot grids for any website · v1.0
Dots that roll to the horizon in 3D, swirl into galaxies, rain like code or print like halftone. They push away from the cursor, ripple out from every click, wave when the page scrolls, and can spell your brand name or trace your logo. Paste it in with a script tag, or use it as a React or Framer component.
One-time payment · Instant download · Single-project license · Free v1.x updates
Each card is the real component, as a still frame. Hover (or focus) one to play it. Use any of them with preset="horizon", then change the colors to your own.
A field of white dots rolling away to the horizon, in 3D.
preset="horizon"
Sharp amber mountain ridges in perspective.
preset="peaks"
Slow blue ocean swells, glowing at the crests.
preset="tide"
Violet, pink and gold plasma lighting a dense grid.
preset="plasma"
Green trails winding and splitting through the dots.
preset="serpent"
Rings of electric blue breathing out from the center.
preset="pulse"
A violet-to-cyan spiral galaxy on a hex grid.
preset="vortex"
Drifting Voronoi cell walls, teal on a hex grid.
preset="cells"
Pink fringes where moving waves meet.
preset="interference"
Gold wells in orbit, pulling the grid toward them.
preset="gravity"
Falling columns of green code, in square dots.
preset="signal"
Black ink on paper at a 45° screen. Feed it a photo.
preset="halftone"
Quiet grey dots on white that darken under the cursor.
preset="minimal"
Hover a card to make it live, then move, click or tap. Cursor modes, shockwaves, scroll waves and masks are attributes on the same tag.
mask="text:HELLO" or an image URL. Logos give their shape, photos a halftone.
Every click or tap sends a ripple through the dots. Or call el.ripple().
Repel, attract, magnify, swirl, or a trail of ripples. Touch works too.
Single-project license (LICENSE.md in the download): one website or project per license.
Upload dot-grid-field.min.js from the download to your site.
Add the script once, and a <pf-dot-grid> tag wherever you want a dot grid.
Pick a preset, or set your own colors, cursor mode, mask and more as attributes.
<script src="/dot-grid-field.min.js" defer></script>
<pf-dot-grid preset="horizon" style="height: 600px"></pf-dot-grid>Paste script/webflow/footer-code.html from the download into Site settings → Custom code → Footer code (or host the .js file and add its script tag there).
Add a Code Embed element with a <pf-dot-grid> tag where you want the grid.
Give it a height, and publish. Custom code runs on the published site.
<pf-dot-grid preset="plasma" cursor="magnify" scroll="wave" style="height: 600px"></pf-dot-grid>Custom code needs a paid Webflow site plan.
Upload dot-grid-field.min.js to your Media library or your theme, and copy its URL.
Add a Custom HTML block with the script tag and a <pf-dot-grid> tag.
<script src="https://your-site.com/wp-content/uploads/dot-grid-field.min.js" defer></script>
<pf-dot-grid preset="tide" style="height: 500px"></pf-dot-grid>On WordPress.com, you need a plan that allows custom code.
Online Store → Themes → Edit code → Assets: upload dot-grid-field.min.js.
In the theme editor, add a Custom Liquid section with the script and the tag.
<script src="{{ 'dot-grid-field.min.js' | asset_url }}" defer></script>
<pf-dot-grid preset="minimal" mask="text:NEW IN" style="height: 600px"></pf-dot-grid>Copy react/DotGridField.tsx into your project. It needs only React 18+.
Render it with a preset or your own props. Children sit on top of the grid.
import DotGridField from "./DotGridField"
<DotGridField preset="horizon" cursor="ripple" style={{ height: 600 }}>
<h1>Your headline</h1>
</DotGridField>Next.js: the server renders a CSS dot pattern in the same colors, then the WebGL grid takes over.
In your Framer project, go to Assets → Code → + → New component file, and name it DotGridField.
Replace the file's contents with framer/DotGridField.tsx from the download, and save.
Drag DotGridField onto the canvas, pick a preset (or Custom), set Mask to Text or Image if you like, and press Preview.
On the Framer canvas you see a still frame, which keeps the editor fast. Set On Canvas to Live to see it move there.
Squarespace and Wix: add the script and the tag in a Code or Embed block (your plan must allow custom code). The download's README has a quick start for every platform and the full settings reference.
$9 one-time
Secure checkout by Polar. Instant download after payment.
Anywhere you can add a script tag: Webflow, WordPress, Shopify, Squarespace, Wix, plain HTML. Also React/Next.js and Framer. Site builders need a plan that allows custom code.
No. You paste one snippet and pick a preset. Colors, cursor mode, masks and the rest are HTML attributes, or Framer's panel.
Yes. mask="text:YOUR NAME" draws the word in your site's own font. An image URL works too: a logo with a transparent background gives its shape, a photo becomes a halftone. Host the image on your own site (other sites need CORS headers).
The script is 13.8 KB gzipped. The whole grid is a single GPU draw call, it skips frames while nothing moves, lowers its resolution on slow devices, and pauses offscreen and in background tabs.
Yes. A tap sends a ripple and a dragging finger moves the cursor effect, without blocking page scrolling. Where WebGL is off, it draws the same dot grid with Canvas 2D.
Yes. Put your content inside the tag (or the React component), and it renders over the dots; the cursor and clicks still reach the grid. The grid is decorative and hidden from screen readers.
Visitors with Reduce Motion turned on see a still frame. You can also set a static frame for everyone.
Single project: one website or project per purchase. The details are in LICENSE.md in the download.
Yes, free updates for v1.x.
Email hi@gunnargray.com.
The launch, new presets, v1.x releases and the occasional new tool. No more than that.