A glowing torus portal opens onto an AI console screenshot stepping forward into the scene, surrounded by orbiting prompt and output cards and a stream of particles slipping past the ring toward the camera.
import AIConsolePortal from '@crazygl/hero-ai-console-portal';
export default function Page() {
return (
<AIConsolePortal
screenshot="https://example.com/console.png"
portalColor1="#6ab2ff"
portalColor2="#a070ff"
cardCount={6}
/>
);
}screenshot URL (PNG/JPG/AVIF/WebP, dark UIs read best), plus screenshotX/Y, screenshotScale, screenshotTilt, screenEmissive.portalRadius, portalTube, portalColor1/portalColor2 (gradient + halo), portalIntensity, portalPulseCount and portalPulseSpeed (the streaks racing around the ring).cardCount (0–6), cardOrbitRadius, cardOrbitSpeed; each card (card1*…card6*) toggles text vs image mode with its own Tag, Body, tag Color, or Image URL.particleCount (0–600), particleColor, particleSpeed for the inbound stream.scanlineStrength, bgVignette, bgEdge, transparentBackground, parallaxStrength.npm install @crazygl/hero-ai-console-portalThe component takes the same props you see in the live customizer on the right — every default ships poster-quality.
import AIConsolePortal from '@crazygl/hero-ai-console-portal';
export default function Landing() {
return (
<AIConsolePortal />
);
}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 AIConsolePortal from '@crazygl/hero-ai-console-portal';
export default function Page() {
return (
<section>
<AIConsolePortal
heading="Say hi."
subheading="Your new hero."
/>
<article>
<h2>Welcome</h2>
<p>Your content keeps its own voice below the hero.</p>
</article>
</section>
);
}