Pixel Trail
fancy/pixel-trailFreeComponent
A ui component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/pixel-trail.jsonSource
1"use client"23import React, { useCallback, useMemo, useRef } from "react"4import { motion, useAnimationControls } from "motion/react"5import { v4 as uuidv4 } from "uuid"67import { cn } from "@/lib/utils"8import { useDimensions } from "@/hooks/use-dimensions"910interface PixelTrailProps {11 pixelSize: number // px12 fadeDuration?: number // ms13 delay?: number // ms14 className?: string15 pixelClassName?: string16}1718const PixelTrail: React.FC<PixelTrailProps> = ({19 pixelSize = 20,20 fadeDuration = 500,21 delay = 0,22 className,23 pixelClassName,24}) => {25 const containerRef = useRef<HTMLDivElement>(null)26 const dimensions = useDimensions(containerRef)27 const trailId = useRef(uuidv4())2829 const handleMouseMove = useCallback(30 (e: React.MouseEvent<HTMLDivElement>) => {31 if (!containerRef.current) return3233 const rect = containerRef.current.getBoundingClientRect()34 const x = Math.floor((e.clientX - rect.left) / pixelSize)35 const y = Math.floor((e.clientY - rect.top) / pixelSize)3637 const pixelElement = document.getElementById(38 `${trailId.current}-pixel-${x}-${y}`39 )40 if (pixelElement) {41 const animatePixel = (pixelElement as any).__animatePixel42 if (animatePixel) animatePixel()43 }44 },45 [pixelSize]46 )4748 const columns = useMemo(49 () => Math.ceil(dimensions.width / pixelSize),50 [dimensions.width, pixelSize]51 )52 const rows = useMemo(53 () => Math.ceil(dimensions.height / pixelSize),54 [dimensions.height, pixelSize]55 )5657 return (58 <div59 ref={containerRef}60 className={cn(61 "absolute inset-0 w-full h-full pointer-events-auto",62 className63 )}64 onMouseMove={handleMouseMove}65 >66 {Array.from({ length: rows }).map((_, rowIndex) => (67 <div key={rowIndex} className="flex">68 {Array.from({ length: columns }).map((_, colIndex) => (69 <PixelDot70 key={`${colIndex}-${rowIndex}`}71 id={`${trailId.current}-pixel-${colIndex}-${rowIndex}`}72 size={pixelSize}73 fadeDuration={fadeDuration}74 delay={delay}75 className={pixelClassName}76 />77 ))}78 </div>79 ))}80 </div>81 )82}8384export default PixelTrail8586interface PixelDotProps {87 id: string88 size: number89 fadeDuration: number90 delay: number91 className?: string92}9394const PixelDot: React.FC<PixelDotProps> = React.memo(95 ({ id, size, fadeDuration, delay, className }) => {96// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from fancy
All 158 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Animated Gradient With Svganimated-gradient-with-svg | fancy | Components | Free | no deps | |
| Basic Number Tickerbasic-number-ticker | fancy | Components | Free | 1 dep | |
| Box Carouselbox-carousel | fancy | Components | Free | 1 dep | |
| Breathing Textbreathing-text | fancy | Components | Free | 1 dep | |
| Circling Elementscircling-elements | fancy | Components | Free | 1 dep | |
| Css Boxcss-box | fancy | Components | Free | 1 dep | |
| Cursor Attractor And Gravitycursor-attractor-and-gravity | fancy | Components | Free | 5 deps | |
| Drag Elementsdrag-elements | fancy | Components | Free | 1 dep |
