Survey grid
The brand's ground texture — the cadastral drafting sheet that sits behind a page header, inside card media, or under the landing hero.
The three faces
Code
<GdSurveyGrid /> <!-- lines, the default -->
<!-- leave `strength` unset: lines take 5%, dots take 11% -->
<GdSurveyGrid variant="dots" />
<GdSurveyGrid variant="both" /> <!-- dots + a pointer-tracked reveal -->The hero reveal
Find out what you can build.
Move the pointer across the band.
Code
<div class="hero">
<GdSurveyGrid variant="both" />
<div class="hero__words">…</div>
</div>
<style>
.hero { position: relative; overflow: hidden; }
/* the words must not eat the pointer the reveal is tracking */
.hero__words { position: relative; pointer-events: none; }
</style>API
Props
variant"lines" | "dots" | "both""lines"What the sheet shows. `lines` is the drafting sheet; `dots` is marks without lines; `both` is dots at rest with the lines revealed around the pointer.
strengthnumber5Ink strength, in percent. The three that exist in the system: 4 behind a page header, 5 inside card media, 12 for the hero's revealed lines.
revealRadiusnumber150The reveal pool's radius, in pixels. `both` only — the other two faces ignore it.
The element is aria-hidden and takes no slots and emits no events. The pitch — 22px — is not a prop.
Usage Guidelines
- Use
linesbehind a static band — a page header at 4%, card media at 5%, a feature card over a wash at the same 5%. - Use
dotson a surface that has to carry a headline. - Use
bothonly where the visitor is meant to reach into the surface — today that is the landing hero and nowhere else. - Set
strength, never the pitch. A texture behind a page header and one inside a small card tile need different weights to read the same. - Give it a positioned host with
overflow: hidden. It fills its container and sizes nothing. - Never put it behind text that has to be read twice. It belongs under a headline, a plaque or an empty band.
- Never put it on the map.
Behavior & Anatomy
One pitch, and it is not a prop
The pitch is 22px and is not a prop. A grid whose spacing changes per surface is not a grid, it is a pattern somebody chose — the whole point of a cadastral ground is that it reads as the same sheet everywhere. What does vary is strength, the ink percentage, because a texture behind a page header and one inside a small card tile need different weights to read the same.
The reveal
A pool of the lot grid follows the pointer — a torchlight over the drawing, never the whole sheet at once.
- The marks are always there; the LINES appear when someone reaches for them. That asymmetry is the whole idea — it is what a person surveying a site actually does.
- A ~150px pool, not the full sheet. Lighting the entire grid on hover was the first attempt and it read as a state change rather than as an instrument.
- The revealed lines run stronger (12%) than a static grid, because only a handful are ever visible at once — a 5% line inside a small pool is invisible.
- CSS cannot read a cursor, so the component tracks the pointer itself and writes two custom properties. No reactive state: moving across the surface never triggers a re-render.
- The fade is a
transition, so the global reduced-motion rule already collapses it. There is deliberately no second reduced-motion block here — a duplicate rule is one that can drift.
Where it appears
Four surfaces, one texture. Left to each surface to re-type at whatever opacity looked right, a brand texture becomes three slightly different brand textures.
- Page headers — 4% lines behind the full-bleed band (Page header).
- Card media — 5% lines under a plaque or a glyph (Cards).
- Feature cards — the same 5%, over a wash (Marketing sections).
- The landing hero — dots plus the pointer reveal (Hero).
The rules
- Never behind text read twice. A grid under a paragraph someone must re-read is noise; it belongs under a headline, a plaque or an empty band.
- Never on the map. The map already has a cadastre, and a decorative grid over a real one is a lie about which lines mean something.
- It is texture, so it is
aria-hidden. A screen reader has nothing to gain from it. - The ink is
color-mixover--gd-ink, never a literal — that is what keys it to the theme, and why one declaration gives pale lines on a light ground and pale lines on a dark one.