Skip to content

Commit 7d7d27f

Browse files
Yushin-Lclaude
andcommitted
Add water ripple animation at bottom of page
- 3 layered SVG wave paths with different speeds - Fixed position at viewport bottom, blends with ocean gradient - CSS-only animation, pointer-events disabled - Subtle blue translucent fill for realistic water effect Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9767c2f commit 7d7d27f

2 files changed

Lines changed: 53 additions & 0 deletions

File tree

src/app/layout.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Geist, Geist_Mono } from "next/font/google";
33
import { AuthProvider } from "@/components/auth/AuthProvider";
44
import Header from "@/components/layout/Header";
55
import Footer from "@/components/layout/Footer";
6+
import WaterRipple from "@/components/layout/WaterRipple";
67
import { SITE_NAME, SITE_DESCRIPTION } from "@/lib/constants";
78
import "./globals.css";
89

@@ -51,6 +52,7 @@ export default function RootLayout({
5152
{children}
5253
</main>
5354
<Footer />
55+
<WaterRipple />
5456
</AuthProvider>
5557
</body>
5658
</html>
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
"use client";
2+
3+
export default function WaterRipple() {
4+
return (
5+
<div className="pointer-events-none fixed inset-x-0 bottom-0 z-0 h-40 overflow-hidden">
6+
<svg
7+
className="absolute bottom-0 w-full"
8+
viewBox="0 0 1440 120"
9+
preserveAspectRatio="none"
10+
style={{ height: "100%" }}
11+
>
12+
<path
13+
className="animate-wave"
14+
d="M0,60 C240,100 480,20 720,60 C960,100 1200,20 1440,60 L1440,120 L0,120 Z"
15+
fill="rgba(147,197,253,0.15)"
16+
/>
17+
<path
18+
className="animate-wave-slow"
19+
d="M0,70 C200,30 440,90 720,50 C1000,10 1240,80 1440,50 L1440,120 L0,120 Z"
20+
fill="rgba(147,197,253,0.1)"
21+
/>
22+
<path
23+
className="animate-wave-slower"
24+
d="M0,80 C300,50 600,95 900,65 C1100,45 1300,85 1440,70 L1440,120 L0,120 Z"
25+
fill="rgba(191,219,254,0.12)"
26+
/>
27+
</svg>
28+
<style>{`
29+
@keyframes wave {
30+
0% { transform: translateX(0); }
31+
50% { transform: translateX(-30px); }
32+
100% { transform: translateX(0); }
33+
}
34+
@keyframes wave-slow {
35+
0% { transform: translateX(0); }
36+
50% { transform: translateX(25px); }
37+
100% { transform: translateX(0); }
38+
}
39+
@keyframes wave-slower {
40+
0% { transform: translateX(0); }
41+
33% { transform: translateX(-15px); }
42+
66% { transform: translateX(15px); }
43+
100% { transform: translateX(0); }
44+
}
45+
.animate-wave { animation: wave 4s ease-in-out infinite; }
46+
.animate-wave-slow { animation: wave-slow 6s ease-in-out infinite; }
47+
.animate-wave-slower { animation: wave-slower 8s ease-in-out infinite; }
48+
`}</style>
49+
</div>
50+
);
51+
}

0 commit comments

Comments
 (0)