diff --git a/app/globals.css b/app/globals.css index 13d40b8..b986fed 100644 --- a/app/globals.css +++ b/app/globals.css @@ -25,3 +25,48 @@ body { text-wrap: balance; } } + +/* ─── Budget River Animations ─────────────────────────── */ + +@keyframes waterFlow { + 0% { transform: translateY(-100%); } + 100% { transform: translateY(100%); } +} + +@keyframes riverCurrent { + 0% { stroke-dashoffset: 0; } + 100% { stroke-dashoffset: -24; } +} + +@keyframes droplet { + 0% { transform: translateY(0) scale(1); opacity: 0.8; } + 80% { opacity: 0.4; } + 100% { transform: translateY(50px) scale(0.2); opacity: 0; } +} + +@keyframes ripple { + 0% { r: 2; opacity: 0.6; } + 100% { r: 14; opacity: 0; } +} + +@keyframes waveFloat { + 0%, 100% { transform: translateY(0); } + 50% { transform: translateY(-3px); } +} + +@keyframes poolWave { + 0% { d: path("M0,8 Q15,4 30,8 T60,8 T90,8 V20 H0 Z"); } + 50% { d: path("M0,8 Q15,12 30,8 T60,8 T90,8 V20 H0 Z"); } + 100% { d: path("M0,8 Q15,4 30,8 T60,8 T90,8 V20 H0 Z"); } +} + +@keyframes shimmer { + 0% { opacity: 0.3; } + 50% { opacity: 0.7; } + 100% { opacity: 0.3; } +} + +@keyframes mergeSplash { + 0% { rx: 2; ry: 1; opacity: 0.5; } + 100% { rx: 20; ry: 4; opacity: 0; } +} diff --git a/app/layout.tsx b/app/layout.tsx index 04bcb72..757d1bd 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -31,6 +31,9 @@ export default function RootLayout({ }>) { return ( + +