Initial commit: Craft2Prints with Stages 1-3

This commit is contained in:
Andymick
2026-07-15 18:09:59 +01:00
commit 41937ffc15
158 changed files with 16054 additions and 0 deletions
+47
View File
@@ -0,0 +1,47 @@
'use client';
import { useEffect, useRef, useState } from 'react';
// Fades + slides content in the first time it scrolls into view. Respects
// prefers-reduced-motion globally via the CSS transition itself (see globals.css).
export default function Reveal({
children,
className = '',
delayMs = 0,
}: {
children: React.ReactNode;
className?: string;
delayMs?: number;
}) {
const ref = useRef<HTMLDivElement>(null);
const [visible, setVisible] = useState(false);
useEffect(() => {
const el = ref.current;
if (!el) return;
const observer = new IntersectionObserver(
([entry]) => {
if (entry.isIntersecting) {
setVisible(true);
observer.disconnect();
}
},
{ threshold: 0.15 },
);
observer.observe(el);
return () => observer.disconnect();
}, []);
return (
<div
ref={ref}
className={`transition-all duration-700 ease-out ${
visible ? 'translate-y-0 opacity-100' : 'translate-y-6 opacity-0'
} ${className}`}
style={{ transitionDelay: visible ? `${delayMs}ms` : '0ms' }}
>
{children}
</div>
);
}