@@ -35,6 +35,25 @@ const {
3535 <div class =" hero-orb hero-orb-center" ></div >
3636 </div >
3737
38+ <!-- Ripple effect - multiple centers -->
39+ <div class =" absolute inset-0 overflow-hidden pointer-events-none" aria-hidden =" true" >
40+ <!-- Ripple center 1 - top left area -->
41+ <div class =" ripple-origin ripple-origin-1" >
42+ <div class =" hero-ripple hero-ripple-a" ></div >
43+ <div class =" hero-ripple hero-ripple-b" ></div >
44+ </div >
45+ <!-- Ripple center 2 - bottom right area -->
46+ <div class =" ripple-origin ripple-origin-2" >
47+ <div class =" hero-ripple hero-ripple-a" ></div >
48+ <div class =" hero-ripple hero-ripple-b" ></div >
49+ </div >
50+ <!-- Ripple center 3 - center area -->
51+ <div class =" ripple-origin ripple-origin-3" >
52+ <div class =" hero-ripple hero-ripple-a" ></div >
53+ <div class =" hero-ripple hero-ripple-b" ></div >
54+ </div >
55+ </div >
56+
3857 <!-- Decorative grid pattern -->
3958 <div class =" absolute inset-0 pointer-events-none hero-grid" aria-hidden =" true" ></div >
4059
@@ -205,6 +224,95 @@ const {
205224 opacity: 0.05;
206225 }
207226
227+ /* Ripple effect - multiple origins */
228+ .ripple-origin {
229+ position: absolute;
230+ width: 0;
231+ height: 0;
232+ }
233+
234+ .ripple-origin-1 {
235+ top: 25%;
236+ left: 20%;
237+ animation: origin-fade 12s ease-in-out infinite;
238+ }
239+
240+ .ripple-origin-2 {
241+ top: 65%;
242+ right: 15%;
243+ left: auto;
244+ animation: origin-fade 12s ease-in-out infinite;
245+ animation-delay: -4s;
246+ }
247+
248+ .ripple-origin-3 {
249+ top: 45%;
250+ left: 55%;
251+ animation: origin-fade 12s ease-in-out infinite;
252+ animation-delay: -8s;
253+ }
254+
255+ .hero-ripple {
256+ position: absolute;
257+ top: 0;
258+ left: 0;
259+ transform: translate(-50%, -50%) scale(0);
260+ width: min(600px, 70vw);
261+ height: min(600px, 70vw);
262+ border-radius: 50%;
263+ border: 2px solid rgba(43, 116, 255, 0.4);
264+ box-shadow: 0 0 20px rgba(43, 116, 255, 0.2), inset 0 0 20px rgba(43, 116, 255, 0.1);
265+ animation: ripple-expand 6s ease-out infinite;
266+ }
267+
268+ .hero-ripple-a {
269+ animation-delay: 0s;
270+ }
271+
272+ .hero-ripple-b {
273+ animation-delay: 3s;
274+ border-color: rgba(0, 200, 150, 0.35);
275+ box-shadow: 0 0 20px rgba(0, 200, 150, 0.2), inset 0 0 20px rgba(0, 200, 150, 0.1);
276+ }
277+
278+ /* Stagger each origin's ripples differently */
279+ .ripple-origin-1 .hero-ripple-a { animation-delay: 0s; }
280+ .ripple-origin-1 .hero-ripple-b { animation-delay: 3s; }
281+ .ripple-origin-2 .hero-ripple-a { animation-delay: 2s; }
282+ .ripple-origin-2 .hero-ripple-b { animation-delay: 5s; }
283+ .ripple-origin-3 .hero-ripple-a { animation-delay: 4s; }
284+ .ripple-origin-3 .hero-ripple-b { animation-delay: 1s; }
285+
286+ :global(.dark) .hero-ripple {
287+ border-color: rgba(77, 142, 255, 0.5);
288+ box-shadow: 0 0 25px rgba(77, 142, 255, 0.3), inset 0 0 25px rgba(77, 142, 255, 0.15);
289+ }
290+
291+ :global(.dark) .hero-ripple-b {
292+ border-color: rgba(0, 220, 170, 0.45);
293+ box-shadow: 0 0 25px rgba(0, 220, 170, 0.3), inset 0 0 25px rgba(0, 220, 170, 0.15);
294+ }
295+
296+ @keyframes ripple-expand {
297+ 0% {
298+ transform: translate(-50%, -50%) scale(0);
299+ opacity: 1;
300+ }
301+ 100% {
302+ transform: translate(-50%, -50%) scale(2);
303+ opacity: 0;
304+ }
305+ }
306+
307+ @keyframes origin-fade {
308+ 0%, 100% {
309+ opacity: 1;
310+ }
311+ 50% {
312+ opacity: 0.3;
313+ }
314+ }
315+
208316 /* Tagline badge */
209317 .hero-tagline {
210318 display: inline-block;
0 commit comments