Choose it. Then copy both parts.
You can explore all three effects in your browser. To add one to your site, use an existing React project with TypeScript support for the downloaded .tsx file.
- Select Carousel, Glass, or Dither at the top of the playground, then choose a version and adjust its controls.
- Compare Before with After. Switch back to After to export the effect.
- Choose Download .tsx for the complete component. Save it next to your example file.
- Select Usage → Copy code for the short example that imports the component and applies your settings.
Unzip the download and copy its public/images contents into your project’s public/images folder. Carousel uses photo-1.png through photo-8.png; Dither uses dither.jpg.
Carousel: put your images in motion.
Turn a flat row of photos into a rotating ring. Drag the live example beside this section to explore it, then open Carousel in the playground to change its settings.
- Start with Portrait, or choose Square or Wide for a different image format.
- Adjust Spacing to spread the images out and Speed to set the pace.
- Try tilt and perspective to change the angle and depth. Use Before to compare it with flat images in a row.
- Image format
- Portrait uses 180 × 210 px, Square 200 × 200 px, and Wide 260 × 160 px. You can adjust width and height separately.
- Motion & depth
speedanddirectioncontrol the rotation.tiltandperspectivechange how you view the ring.- Interaction
dragenables pointer control.sensitivitychanges how strongly the carousel responds.
Download RoundCarousel.tsx and put this example beside it. Keep the outer container’s explicit height: the carousel fills its parent. Replace the image paths with your own when you’re ready.
"use client";
import RoundCarousel from './RoundCarousel';
export default function CarouselExample() {
return (
<div style={{ width: '100%', height: 520 }}>
<RoundCarousel
images={Array.from({ length: 8 }, (_, i) => ({
src: `/images/photo-${i + 1}.png`,
}))}
imageWidth={180}
imageHeight={210}
spacing={3}
speed={2}
direction="right"
tilt={-7}
perspective={3000}
cornerRadius={15}
innerDim={3.5}
background="#171717"
drag={true}
sensitivity={5}
/>
</div>
);
}The ring uses CSS 3D transforms on image elements. The small guide preview scales the ring to fit; the code uses the image dimensions you select.
Glass: start with a torus.
A glass shape bends the backdrop as it turns. Drag the live torus beside this section to see its surface from another angle.
- Open Glass and choose Torus, Sphere, or Cross.
- Adjust Frost for a cloudier surface and Chromatic for colored edges.
- Set the speed, then compare Before and After to see what the glass effect adds.
- Shape
- Use
"Torus","Sphere", or"X"in the code. The playground calls X “Cross.” - Glass finish
- Start with
frost: 6andchromatic: 40, then adjust by eye. Lower frost keeps the backdrop clearer. - Backdrop
- Change the
text,textColor, and font in the example. Put essential page text outside the graphic too.
Save GlassIcon.tsx beside this example. Keep an explicit width and height so the canvas has space to render.
"use client";
import GlassIcon from './GlassIcon';
export default function GlassExample() {
return (
<GlassIcon
shape="Torus"
speed={17}
size={72}
background="#e9eff6"
glass={{ frost: 6, chromatic: 40 }}
orient={{ angleX: 24, angleY: -22, angleZ: -12 }}
backdrop={{
type: 'Text', text: 'fluid.', textColor: '#334d7a',
font: { fontFamily: 'Georgia, serif', fontSize: 180, fontStyle: 'italic' },
}}
style={{ width: '100%', height: 520 }}
/>
);
}Dither: reveal the photo underneath.
Give a photo a patterned surface, then uncover the color with your pointer. Move across the live image beside this section to try the reveal.
- Open Dither and choose Ordered, Lines, or Noise.
- Increase Dot size for a coarser texture. Reduce it to keep more image detail.
- Adjust Reveal radius to change the area around the pointer. Before shows the original photo.
- Pattern
- Ordered maps to
"bayer8". The other values are"lines"and"noise". - Reveal edge
revealRadiussets the area uncovered around the pointer;revealSoftnessblends the edge.- Wave
- Add
wave={false}to remove the animated wave while keeping the pointer reveal.
Save DitherReveal.tsx beside this example. Put the sample dither.jpg in public/images, or change the image path and description to use your own photo.
"use client";
import DitherReveal from './DitherReveal';
export default function DitherExample() {
return (
<DitherReveal
image={{ src: '/images/dither.jpg', alt: 'Two hands in orange and purple light.' }}
ditherStyle="bayer8"
dotSize={5}
revealRadius={135}
revealSoftness={40}
waveSpeed={52}
waveDensity={25}
style={{ width: '100%', height: 520 }}
/>
);
}Bring your chosen effect into your page.
Render your example from the page where you want the effect. A usage snippet imports the renderer, so keep the full downloaded component and its images in the right locations. In a Next.js App Router project, keep the included "use client" boundary.
Add the attached Carousel, Glass, or Dither component and usage snippet to my existing React site at [where it should appear]. Preserve my chosen settings and the site's existing layout. Use the complete attached .tsx source and keep the usage import working. Put local image assets in public/images. Use a responsive width and an explicit height. For RoundCarousel, put the height on its outer container. Provide a static fallback and respect prefers-reduced-motion. Keep essential text outside the graphic. For hover effects, add a keyboard-accessible Show original control and verify touch behavior. Check for missing images, WebGL support where needed, and cleanup when navigating away. Here is the usage snippet: [Paste the code copied from the playground here]
Pause controls freeze these previews. Exported code keeps the animation settings; add a pause control or static fallback when integrating it into your page.
Choose your component