Some checks failed
Build & Deploy / 🔍 Prepare Environment (push) Successful in 31s
Build & Deploy / 🧪 QA (push) Failing after 37s
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🔔 Notifications (push) Has been cancelled
Build & Deploy / 🏗️ Build (push) Has been cancelled
53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
"use client";
|
|
|
|
import React, { useEffect, useState } from "react";
|
|
import { m } from "framer-motion";
|
|
|
|
export const TileGrid = () => {
|
|
const [mounted, setMounted] = useState(false);
|
|
|
|
useEffect(() => {
|
|
setMounted(true);
|
|
}, []);
|
|
|
|
if (!mounted) return null;
|
|
|
|
const rows = 7;
|
|
const cols = 8;
|
|
|
|
return (
|
|
<div className="absolute inset-0 pointer-events-none overflow-hidden z-[1]">
|
|
<div className="flex flex-col gap-8 md:gap-12 min-w-[120%] min-h-[120%] -left-[10%] -top-[10%] absolute">
|
|
{[...Array(rows)].map((_, rowIndex) => (
|
|
<div
|
|
key={rowIndex}
|
|
className="flex gap-8 md:gap-12 justify-center"
|
|
style={{
|
|
transform:
|
|
rowIndex % 2 === 0 ? "translateX(0)" : "translateX(100px)",
|
|
}}
|
|
>
|
|
{[...Array(cols)].map((_, colIndex) => (
|
|
<m.div
|
|
key={`${rowIndex}-${colIndex}`}
|
|
initial={{ opacity: 0.03 }}
|
|
animate={{
|
|
opacity: [0.03, Math.random() > 0.8 ? 0.15 : 0.03, 0.03],
|
|
scale: [1, Math.random() > 0.8 ? 1.02 : 1, 1],
|
|
}}
|
|
transition={{
|
|
duration: 8 + Math.random() * 8,
|
|
repeat: Infinity,
|
|
delay: Math.random() * 15,
|
|
ease: "easeInOut",
|
|
}}
|
|
className="w-32 h-32 md:w-56 md:h-56 bg-white/5 rounded-3xl md:rounded-[3rem] border border-white/10 shadow-[0_8px_32px_0_rgba(31,38,135,0.03)] shrink-0 will-change-transform"
|
|
/>
|
|
))}
|
|
</div>
|
|
))}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|