DocsBackground Grid Beam
Background Grid Beam
Animated beam is perfect for hero section
Hero Section That Converts.
Beautiful beam which I btw reverse engineered from Aceternity
Installation
Install Dependencies
npm i clsx tailwind-merge framer-motion
Create @/utils/cn.ts file
import { ClassValue, clsx } from "clsx";
import { twMerge } from "tailwind-merge";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
Update tailwind.config.ts by adding bg-grid class
//@ts-ignore
import { default as flattenColorPalette } from 'tailwindcss/lib/util/flattenColorPalette'
import svgToDataUri from 'mini-svg-data-uri'
const config = {
//...
plugins: [
function ({ matchUtilities, theme }: any) {
matchUtilities(
{
'bg-grid': (value: any) => ({
backgroundImage: `url("${svgToDataUri(
`<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="none" stroke="${value}"><path d="M0 .5H31.5V32"/></svg>`
)}")`
})
},
{ values: flattenColorPalette(theme('backgroundColor')), type: 'color' }
)
}
]
}
export default config
Create GridBeam component
'use client'
import React from 'react'
import { motion } from 'framer-motion'
import { cn } from '@/utils/cn'
export const GridBeam: React.FC<{ children: React.ReactNode; className?: string }> = ({
children,
className
}) => (
<div className={cn('relative w-full h-full', className)}>
<Beam />
{children}
</div>
)
export const Beam = () => {
return (
<svg
width="156"
height="63"
viewBox="0 0 156 63"
fill="none"
xmlns="http://www.w3.org/2000/svg"
className="absolute top-0 left-0 ml-24 mt-8"
>
<path
d="M31 .5h32M0 .5h32m30 31h32m-1 0h32m-1 31h32M62.5 32V0m62 63V31"
stroke="url(#grad1)"
strokeWidth={1.5}
/>
<defs>
<motion.linearGradient
variants={{
initial: {
x1: '40%',
x2: '50%',
y1: '160%',
y2: '180%'
},
animate: {
x1: '0%',
x2: '10%',
y1: '-40%',
y2: '-20%'
}
}}
animate="animate"
initial="initial"
transition={{
duration: 1.8,
repeat: Infinity,
repeatType: 'loop',
ease: 'linear',
repeatDelay: 2
}}
id="grad1"
>
<stop stopColor="#18CCFC" stopOpacity="0" />
<stop stopColor="#18CCFC" />
<stop offset="0.325" stopColor="#6344F5" />
<stop offset="1" stopColor="#AE48FF" stopOpacity="0" />
</motion.linearGradient>
</defs>
</svg>
)
}