Add the FarrokhWin Next.js site for Meshkee hosting.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-31 09:18:26 +03:30
co-authored by Cursor
commit 4dec4eb92c
116 changed files with 13456 additions and 0 deletions
+65
View File
@@ -0,0 +1,65 @@
"use client";
import { type CSSProperties, type ReactNode, useEffect, useRef, useState } from "react";
type Props = {
children: ReactNode;
className?: string;
delay?: number;
stagger?: boolean;
variant?: "up" | "left" | "right";
};
export default function Reveal({
children,
className = "",
delay = 0,
stagger = false,
variant = "up",
}: Props) {
const ref = useRef<HTMLDivElement>(null);
const [shown, setShown] = useState(false);
useEffect(() => {
const el = ref.current;
if (!el) return undefined;
const reveal = () => setShown(true);
if (window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
reveal();
return undefined;
}
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
reveal();
observer.disconnect();
}
},
{ threshold: 0.16, rootMargin: "0px 0px -10% 0px" },
);
observer.observe(el);
return () => observer.disconnect();
}, []);
const classes = [
"reveal",
`reveal--${variant}`,
stagger ? "stagger" : "",
shown ? "is-in" : "",
className,
]
.filter(Boolean)
.join(" ");
return (
<div
ref={ref}
className={classes}
style={{ "--reveal-delay": `${delay}ms` } as CSSProperties}
>
{children}
</div>
);
}