A typewriter with fully customisable per-step sequencing: type N chars, pause, delete M chars, type more, then loop.
import TypeWriterCustom from '@crazygl/hero-type-writer-custom';
export default function Hero() {
return (
<TypeWriterCustom
phrases={"Hello, World!\nGoodbye, Yesterday.\nHi there, Future."}
typingSpeed={80}
deletingSpeed={40}
pauseDuration={1600}
/>
);
}phrases (one per line), subheading.typingSpeed (ms/char), deletingSpeed (ms/char), pauseDuration, loop.cursorChar (|, _, ▌, █), cursorColor.textColor, fontSize, headingFontFamily (default JetBrains Mono), headingFontWeight.transparentBackground, bgColor.npm install @crazygl/hero-type-writer-customThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import TypeWriterCustom from '@crazygl/hero-type-writer-custom';
export default function Landing() {
return (
<TypeWriterCustom />
);
}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 TypeWriterCustom from '@crazygl/hero-type-writer-custom';
export default function Page() {
return (
<section>
<TypeWriterCustom
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}