A bold headline is rasterised into a heightmap and extruded into a 3D landscape — the letters rise out of the ground as carved plateaus and ridges, lit by a low sun with drifting cloud shadows and atmospheric haze. A fixed aerial-oblique camera keeps the word readable, and the pointer orbits the terrain for parallax.
import TypographyAsTerrain from '@crazygl/hero-typography-as-terrain';
export default function Hero() {
return (
<TypographyAsTerrain
heading="HORIZONS"
extrudeHeight={0.54}
cameraElevation={40}
/>
);
}The terrain is built entirely from the word you type — no separate texture or art to supply — and honours your selected heading font and weight.
heading (ALL-CAPS, 5–10 chars reads best), subheading, ctaLabel, onCTAClick (URL or function).extrudeHeight, heightmapBlur (edge softness), duneBaseSpread (dune skirt width), terrainSize, and base-hill baseTerrainAmplitude/Scale/Octaves.cameraElevation, cameraAzimuth, cameraDistance, parallaxStrength.lowColor, midColor, highColor (elevation bands).sunAngleX/Y, sunIntensity, fogColor, fogDensity, ambientMotion.headingFontFamily, headingFontWeight.npm install @crazygl/hero-typography-as-terrainThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import TypographyAsTerrain from '@crazygl/hero-typography-as-terrain';
export default function Landing() {
return (
<TypographyAsTerrain />
);
}The wrapper renders static HTML on the server and only initialises the canvas after hydration, so search engines see your copy.
// app/page.tsx — works in SSR-first frameworks (Next, Remix, Astro, etc.)
'use client';
import TypographyAsTerrain from '@crazygl/hero-typography-as-terrain';
export default function Page() {
return (
<section>
<TypographyAsTerrain
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}