animated-grid-pattern
eldoraui/animated-grid-patternFreeComponent
An animated grid pattern component.
Live preview
live · rendered by the registry
Rendered by eldoraui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://eldoraui.site/r/animated-grid-pattern.jsonSource
1"use client"23import React, { useEffect, useMemo, useRef, useState } from "react"4import { Canvas, useFrame, useThree } from "@react-three/fiber"5import { useTheme } from "next-themes"6import { ExtrudeGeometry, Shape } from "three"7import * as THREE from "three"89interface GridProps {10 position: [number, number, number]11 width?: number12 length?: number13 cornerRadius?: number14 gridPosition: [number, number]15 hoveredGrid: [number, number] | null16 rippleScale?: number17 rippleRadius?: number18}1920const Grid = ({21 position,22 width = 4,23 length = 4,24 cornerRadius = 2,25 gridPosition,26 hoveredGrid,27 rippleScale = 0.3,28 rippleRadius = 3,29}: GridProps) => {30 const meshRef = useRef<THREE.Mesh>(null)31 const [currentScale, setCurrentScale] = useState(1)32 const { theme } = useTheme()3334 const gridColor = theme === "dark" ? "#232323" : "#e5e7eb"3536 const geometry = useMemo(() => {37 const shape = new Shape()38 const angleStep = Math.PI * 0.539 const radius = cornerRadius4041 const halfWidth = width / 242 const halfLength = length / 24344 shape.absarc(45 halfWidth - radius,46 halfLength - radius,47 radius,48 angleStep * 0,49 angleStep * 150 )51 shape.absarc(52 -halfWidth + radius,53 halfLength - radius,54 radius,55 angleStep * 1,56 angleStep * 257 )58 shape.absarc(59 -halfWidth + radius,60 -halfLength + radius,61 radius,62 angleStep * 2,63 angleStep * 364 )65 shape.absarc(66 halfWidth - radius,67 -halfLength + radius,68 radius,69 angleStep * 3,70 angleStep * 471 )7273 const extrudeSettings = {74 depth: 0.3,75 bevelEnabled: true,76 bevelThickness: 0.05,77 bevelSize: 0.05,78 bevelSegments: 20,79 curveSegments: 20,80 }8182 const geometry = new ExtrudeGeometry(shape, extrudeSettings)83 geometry.center()8485 return geometry86 }, [width, length, cornerRadius])8788 useEffect(() => {89 return () => {90 geometry.dispose()91 }92 }, [geometry])9394 useFrame(() => {95 if (meshRef.current) {96 let targetScale = 19798 const isThisGridHovered =99 hoveredGrid &&100 gridPosition[0] === hoveredGrid[0] &&101 gridPosition[1] === hoveredGrid[1]102103 if (isThisGridHovered) {104 targetScale = 5105 } else if (hoveredGrid) {106 const dx = gridPosition[0] - hoveredGrid[0]107 const dz = gridPosition[1] - hoveredGrid[1]108 const distance = Math.sqrt(dx * dx + dz * dz)109110// … truncated
What it pulls in
npm packages
Files it writes
More from eldoraui
All 115 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| animated-badgeanimated-badge | eldoraui | Components | Free | 2 deps | |
| animated-frameworksanimated-frameworks | eldoraui | Components | Free | 2 deps | |
| animated-listanimated-list | eldoraui | Components | Free | 1 dep | |
| animated-shiny-buttonanimated-shiny-button | eldoraui | Components | Free | 1 dep | |
| blur-in-textblur-in-text | eldoraui | Components | Free | 3 deps | |
| browserbrowser | eldoraui | Components | Free | 2 deps | |
| card-flip-hovercard-flip-hover | eldoraui | Components | Free | 1 dep | |
| clerk-otpclerk-otp | eldoraui | Components | Free | 2 deps |
