From 1e5b9c8884f32a68f2cc67f68afe5e6a5e8c8a08 Mon Sep 17 00:00:00 2001 From: neru <152752583+neeeruuu@users.noreply.github.com> Date: Fri, 2 Jan 2026 04:52:30 -0300 Subject: [PATCH] feat: add loading effect --- src/app/page.css | 19 ++++++++ src/app/page.tsx | 121 ++++++++++++++++++++++++++++------------------- 2 files changed, 92 insertions(+), 48 deletions(-) diff --git a/src/app/page.css b/src/app/page.css index 6fb47a5..7fd0ff1 100644 --- a/src/app/page.css +++ b/src/app/page.css @@ -2,3 +2,22 @@ width: 100vw !important; height: 100vh !important; } + +.loader { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: black; + z-index: 4444; + transition: opacity 1.0s ease-in-out; + pointer-events: none; + + opacity: 1; + display: block; +} + +.loader.hidden { + opacity: 0; +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 37a7ed4..e670806 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,8 @@ import { Environment, OrbitControls, - PerspectiveCamera + PerspectiveCamera, + useProgress } from '@react-three/drei'; import { Canvas, useLoader, useFrame } from '@react-three/fiber'; import { @@ -24,7 +25,8 @@ import { DoubleSide, TextureLoader, Color, - MeshStandardMaterial + MeshStandardMaterial, + FogExp2 } from 'three'; import './page.css'; @@ -613,57 +615,80 @@ const SealCube = forwardRef((props, ref) => { }); SealCube.displayName = 'SealCube'; +function Loader() { + const { progress, active } = useProgress(); + const [visible, setVisible] = useState(true); + + useLayoutEffect(() => { + if (!active && progress === 100) { + const timeout = setTimeout(() => setVisible(false), 500); + return () => clearTimeout(timeout); + } + }, [progress, active]); + + return ( +
+ ); +} + export default function Home() { const [sealMesh, setSealMesh] = useState(null); return ( - - - - - - + + + + + + + + + + + + + + + + { + if (mesh && !sealMesh) setSealMesh(mesh); + }} /> - - - - - - { - if (mesh && !sealMesh) setSealMesh(mesh); - }} - /> - - - + + + ); }