Spaces:
Sleeping
Sleeping
Upload 65 files
Browse files- app/globals.css +832 -0
- components/home/CTASection.tsx +196 -128
- components/home/HeroSection.tsx +274 -189
- components/home/ServicesOverview.tsx +125 -65
app/globals.css
CHANGED
|
@@ -1491,4 +1491,836 @@
|
|
| 1491 |
|
| 1492 |
.underline-animate:hover::after {
|
| 1493 |
width: 100%;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1494 |
}
|
|
|
|
| 1491 |
|
| 1492 |
.underline-animate:hover::after {
|
| 1493 |
width: 100%;
|
| 1494 |
+
}
|
| 1495 |
+
|
| 1496 |
+
/* ───────────────────────────────────────────────
|
| 1497 |
+
EXTREME ANIMATIONS - Next Level UI
|
| 1498 |
+
─────────────────────────────────────────────── */
|
| 1499 |
+
|
| 1500 |
+
/* Electric pulse effect */
|
| 1501 |
+
@keyframes electric-pulse {
|
| 1502 |
+
0%, 100% {
|
| 1503 |
+
filter: drop-shadow(0 0 2px hsl(var(--primary)));
|
| 1504 |
+
}
|
| 1505 |
+
25% {
|
| 1506 |
+
filter: drop-shadow(0 0 8px hsl(var(--primary))) drop-shadow(0 0 20px hsl(var(--primary)));
|
| 1507 |
+
}
|
| 1508 |
+
50% {
|
| 1509 |
+
filter: drop-shadow(0 0 15px hsl(var(--primary))) drop-shadow(0 0 40px hsl(var(--primary)));
|
| 1510 |
+
}
|
| 1511 |
+
75% {
|
| 1512 |
+
filter: drop-shadow(0 0 8px hsl(var(--primary))) drop-shadow(0 0 20px hsl(var(--primary)));
|
| 1513 |
+
}
|
| 1514 |
+
}
|
| 1515 |
+
|
| 1516 |
+
.electric-glow {
|
| 1517 |
+
animation: electric-pulse 2s ease-in-out infinite;
|
| 1518 |
+
}
|
| 1519 |
+
|
| 1520 |
+
/* Matrix rain effect */
|
| 1521 |
+
@keyframes matrix-fall {
|
| 1522 |
+
0% {
|
| 1523 |
+
transform: translateY(-100vh);
|
| 1524 |
+
opacity: 0;
|
| 1525 |
+
}
|
| 1526 |
+
10% {
|
| 1527 |
+
opacity: 1;
|
| 1528 |
+
}
|
| 1529 |
+
90% {
|
| 1530 |
+
opacity: 1;
|
| 1531 |
+
}
|
| 1532 |
+
100% {
|
| 1533 |
+
transform: translateY(100vh);
|
| 1534 |
+
opacity: 0;
|
| 1535 |
+
}
|
| 1536 |
+
}
|
| 1537 |
+
|
| 1538 |
+
.matrix-char {
|
| 1539 |
+
position: absolute;
|
| 1540 |
+
font-family: monospace;
|
| 1541 |
+
font-size: 14px;
|
| 1542 |
+
color: hsl(var(--primary));
|
| 1543 |
+
text-shadow: 0 0 10px hsl(var(--primary));
|
| 1544 |
+
animation: matrix-fall linear infinite;
|
| 1545 |
+
pointer-events: none;
|
| 1546 |
+
}
|
| 1547 |
+
|
| 1548 |
+
/* Holographic shimmer */
|
| 1549 |
+
@keyframes holo-shimmer {
|
| 1550 |
+
0% {
|
| 1551 |
+
background-position: 0% 50%;
|
| 1552 |
+
filter: hue-rotate(0deg);
|
| 1553 |
+
}
|
| 1554 |
+
50% {
|
| 1555 |
+
background-position: 100% 50%;
|
| 1556 |
+
filter: hue-rotate(180deg);
|
| 1557 |
+
}
|
| 1558 |
+
100% {
|
| 1559 |
+
background-position: 0% 50%;
|
| 1560 |
+
filter: hue-rotate(360deg);
|
| 1561 |
+
}
|
| 1562 |
+
}
|
| 1563 |
+
|
| 1564 |
+
.holographic {
|
| 1565 |
+
background: linear-gradient(
|
| 1566 |
+
90deg,
|
| 1567 |
+
hsl(280, 100%, 70%),
|
| 1568 |
+
hsl(320, 100%, 60%),
|
| 1569 |
+
hsl(360, 100%, 70%),
|
| 1570 |
+
hsl(40, 100%, 60%),
|
| 1571 |
+
hsl(80, 100%, 70%),
|
| 1572 |
+
hsl(120, 100%, 60%),
|
| 1573 |
+
hsl(160, 100%, 70%),
|
| 1574 |
+
hsl(200, 100%, 60%),
|
| 1575 |
+
hsl(240, 100%, 70%),
|
| 1576 |
+
hsl(280, 100%, 70%)
|
| 1577 |
+
);
|
| 1578 |
+
background-size: 400% 100%;
|
| 1579 |
+
-webkit-background-clip: text;
|
| 1580 |
+
background-clip: text;
|
| 1581 |
+
-webkit-text-fill-color: transparent;
|
| 1582 |
+
animation: holo-shimmer 4s linear infinite;
|
| 1583 |
+
}
|
| 1584 |
+
|
| 1585 |
+
/* Cyberpunk glitch border */
|
| 1586 |
+
@keyframes glitch-border {
|
| 1587 |
+
0%, 100% {
|
| 1588 |
+
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
|
| 1589 |
+
}
|
| 1590 |
+
5% {
|
| 1591 |
+
clip-path: polygon(0 10%, 100% 0, 100% 90%, 0 100%);
|
| 1592 |
+
}
|
| 1593 |
+
10% {
|
| 1594 |
+
clip-path: polygon(0 0, 90% 0, 100% 100%, 10% 100%);
|
| 1595 |
+
}
|
| 1596 |
+
15% {
|
| 1597 |
+
clip-path: polygon(0 0, 100% 5%, 100% 100%, 0 95%);
|
| 1598 |
+
}
|
| 1599 |
+
20% {
|
| 1600 |
+
clip-path: polygon(5% 0, 100% 0, 95% 100%, 0 100%);
|
| 1601 |
+
}
|
| 1602 |
+
25% {
|
| 1603 |
+
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
|
| 1604 |
+
}
|
| 1605 |
+
}
|
| 1606 |
+
|
| 1607 |
+
.glitch-border {
|
| 1608 |
+
animation: glitch-border 3s ease-in-out infinite;
|
| 1609 |
+
}
|
| 1610 |
+
|
| 1611 |
+
/* Extreme 3D flip card */
|
| 1612 |
+
.flip-card {
|
| 1613 |
+
perspective: 2000px;
|
| 1614 |
+
transform-style: preserve-3d;
|
| 1615 |
+
}
|
| 1616 |
+
|
| 1617 |
+
.flip-card-inner {
|
| 1618 |
+
position: relative;
|
| 1619 |
+
width: 100%;
|
| 1620 |
+
height: 100%;
|
| 1621 |
+
transition: transform 0.8s cubic-bezier(0.175, 0.885, 0.32, 1.275);
|
| 1622 |
+
transform-style: preserve-3d;
|
| 1623 |
+
}
|
| 1624 |
+
|
| 1625 |
+
.flip-card:hover .flip-card-inner {
|
| 1626 |
+
transform: rotateY(180deg);
|
| 1627 |
+
}
|
| 1628 |
+
|
| 1629 |
+
.flip-card-front,
|
| 1630 |
+
.flip-card-back {
|
| 1631 |
+
position: absolute;
|
| 1632 |
+
width: 100%;
|
| 1633 |
+
height: 100%;
|
| 1634 |
+
backface-visibility: hidden;
|
| 1635 |
+
border-radius: inherit;
|
| 1636 |
+
}
|
| 1637 |
+
|
| 1638 |
+
.flip-card-back {
|
| 1639 |
+
transform: rotateY(180deg);
|
| 1640 |
+
}
|
| 1641 |
+
|
| 1642 |
+
/* Liquid morphing animation */
|
| 1643 |
+
@keyframes liquid-morph {
|
| 1644 |
+
0%, 100% {
|
| 1645 |
+
border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
|
| 1646 |
+
transform: rotate(0deg) scale(1);
|
| 1647 |
+
}
|
| 1648 |
+
25% {
|
| 1649 |
+
border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%;
|
| 1650 |
+
transform: rotate(90deg) scale(1.1);
|
| 1651 |
+
}
|
| 1652 |
+
50% {
|
| 1653 |
+
border-radius: 50% 60% 30% 60% / 30% 60% 70% 40%;
|
| 1654 |
+
transform: rotate(180deg) scale(1);
|
| 1655 |
+
}
|
| 1656 |
+
75% {
|
| 1657 |
+
border-radius: 60% 40% 60% 30% / 70% 30% 50% 60%;
|
| 1658 |
+
transform: rotate(270deg) scale(1.1);
|
| 1659 |
+
}
|
| 1660 |
+
}
|
| 1661 |
+
|
| 1662 |
+
.liquid-blob {
|
| 1663 |
+
animation: liquid-morph 20s ease-in-out infinite;
|
| 1664 |
+
}
|
| 1665 |
+
|
| 1666 |
+
/* Plasma effect */
|
| 1667 |
+
@keyframes plasma {
|
| 1668 |
+
0%, 100% {
|
| 1669 |
+
filter: hue-rotate(0deg) saturate(1.5);
|
| 1670 |
+
transform: scale(1);
|
| 1671 |
+
}
|
| 1672 |
+
33% {
|
| 1673 |
+
filter: hue-rotate(120deg) saturate(2);
|
| 1674 |
+
transform: scale(1.05);
|
| 1675 |
+
}
|
| 1676 |
+
66% {
|
| 1677 |
+
filter: hue-rotate(240deg) saturate(1.8);
|
| 1678 |
+
transform: scale(0.95);
|
| 1679 |
+
}
|
| 1680 |
+
}
|
| 1681 |
+
|
| 1682 |
+
.plasma-effect {
|
| 1683 |
+
animation: plasma 10s ease-in-out infinite;
|
| 1684 |
+
}
|
| 1685 |
+
|
| 1686 |
+
/* Explosion particles */
|
| 1687 |
+
@keyframes explode {
|
| 1688 |
+
0% {
|
| 1689 |
+
transform: scale(0) rotate(0deg);
|
| 1690 |
+
opacity: 1;
|
| 1691 |
+
}
|
| 1692 |
+
100% {
|
| 1693 |
+
transform: scale(3) rotate(180deg);
|
| 1694 |
+
opacity: 0;
|
| 1695 |
+
}
|
| 1696 |
+
}
|
| 1697 |
+
|
| 1698 |
+
.explode-particle {
|
| 1699 |
+
animation: explode 1s cubic-bezier(0.36, 0, 0.66, -0.56) forwards;
|
| 1700 |
+
}
|
| 1701 |
+
|
| 1702 |
+
/* Vortex spin */
|
| 1703 |
+
@keyframes vortex {
|
| 1704 |
+
0% {
|
| 1705 |
+
transform: rotate(0deg) scale(1);
|
| 1706 |
+
opacity: 1;
|
| 1707 |
+
}
|
| 1708 |
+
50% {
|
| 1709 |
+
transform: rotate(180deg) scale(0.5);
|
| 1710 |
+
opacity: 0.5;
|
| 1711 |
+
}
|
| 1712 |
+
100% {
|
| 1713 |
+
transform: rotate(360deg) scale(0);
|
| 1714 |
+
opacity: 0;
|
| 1715 |
+
}
|
| 1716 |
+
}
|
| 1717 |
+
|
| 1718 |
+
.vortex-spin {
|
| 1719 |
+
animation: vortex 2s cubic-bezier(0.68, -0.55, 0.265, 1.55) infinite;
|
| 1720 |
+
}
|
| 1721 |
+
|
| 1722 |
+
/* Breathing glow */
|
| 1723 |
+
@keyframes breathe-glow {
|
| 1724 |
+
0%, 100% {
|
| 1725 |
+
box-shadow:
|
| 1726 |
+
0 0 5px hsl(var(--primary) / 0.3),
|
| 1727 |
+
0 0 10px hsl(var(--primary) / 0.2),
|
| 1728 |
+
0 0 20px hsl(var(--primary) / 0.1),
|
| 1729 |
+
inset 0 0 10px hsl(var(--primary) / 0.1);
|
| 1730 |
+
}
|
| 1731 |
+
50% {
|
| 1732 |
+
box-shadow:
|
| 1733 |
+
0 0 20px hsl(var(--primary) / 0.6),
|
| 1734 |
+
0 0 40px hsl(var(--primary) / 0.4),
|
| 1735 |
+
0 0 60px hsl(var(--primary) / 0.2),
|
| 1736 |
+
inset 0 0 20px hsl(var(--primary) / 0.2);
|
| 1737 |
+
}
|
| 1738 |
+
}
|
| 1739 |
+
|
| 1740 |
+
.breathing-glow {
|
| 1741 |
+
animation: breathe-glow 4s ease-in-out infinite;
|
| 1742 |
+
}
|
| 1743 |
+
|
| 1744 |
+
/* Cyber scan line */
|
| 1745 |
+
@keyframes scan-line {
|
| 1746 |
+
0% {
|
| 1747 |
+
top: 0%;
|
| 1748 |
+
}
|
| 1749 |
+
100% {
|
| 1750 |
+
top: 100%;
|
| 1751 |
+
}
|
| 1752 |
+
}
|
| 1753 |
+
|
| 1754 |
+
.scan-line::before {
|
| 1755 |
+
content: '';
|
| 1756 |
+
position: absolute;
|
| 1757 |
+
left: 0;
|
| 1758 |
+
width: 100%;
|
| 1759 |
+
height: 2px;
|
| 1760 |
+
background: linear-gradient(90deg, transparent, hsl(var(--primary)), transparent);
|
| 1761 |
+
box-shadow: 0 0 10px hsl(var(--primary));
|
| 1762 |
+
animation: scan-line 3s linear infinite;
|
| 1763 |
+
pointer-events: none;
|
| 1764 |
+
z-index: 100;
|
| 1765 |
+
}
|
| 1766 |
+
|
| 1767 |
+
/* Floating island effect */
|
| 1768 |
+
@keyframes floating-island {
|
| 1769 |
+
0%, 100% {
|
| 1770 |
+
transform: translateY(0) rotateX(0deg) rotateY(0deg);
|
| 1771 |
+
}
|
| 1772 |
+
25% {
|
| 1773 |
+
transform: translateY(-10px) rotateX(2deg) rotateY(-2deg);
|
| 1774 |
+
}
|
| 1775 |
+
50% {
|
| 1776 |
+
transform: translateY(-5px) rotateX(0deg) rotateY(2deg);
|
| 1777 |
+
}
|
| 1778 |
+
75% {
|
| 1779 |
+
transform: translateY(-15px) rotateX(-2deg) rotateY(0deg);
|
| 1780 |
+
}
|
| 1781 |
+
}
|
| 1782 |
+
|
| 1783 |
+
.floating-island {
|
| 1784 |
+
animation: floating-island 8s ease-in-out infinite;
|
| 1785 |
+
transform-style: preserve-3d;
|
| 1786 |
+
}
|
| 1787 |
+
|
| 1788 |
+
/* Extreme parallax depth */
|
| 1789 |
+
.parallax-extreme {
|
| 1790 |
+
transform-style: preserve-3d;
|
| 1791 |
+
perspective: 1000px;
|
| 1792 |
+
}
|
| 1793 |
+
|
| 1794 |
+
.parallax-layer-1 {
|
| 1795 |
+
transform: translateZ(-100px) scale(1.5);
|
| 1796 |
+
}
|
| 1797 |
+
|
| 1798 |
+
.parallax-layer-2 {
|
| 1799 |
+
transform: translateZ(-50px) scale(1.25);
|
| 1800 |
+
}
|
| 1801 |
+
|
| 1802 |
+
.parallax-layer-3 {
|
| 1803 |
+
transform: translateZ(0px) scale(1);
|
| 1804 |
+
}
|
| 1805 |
+
|
| 1806 |
+
/* Energy wave */
|
| 1807 |
+
@keyframes energy-wave {
|
| 1808 |
+
0% {
|
| 1809 |
+
transform: scale(0.5);
|
| 1810 |
+
opacity: 1;
|
| 1811 |
+
}
|
| 1812 |
+
100% {
|
| 1813 |
+
transform: scale(2);
|
| 1814 |
+
opacity: 0;
|
| 1815 |
+
}
|
| 1816 |
+
}
|
| 1817 |
+
|
| 1818 |
+
.energy-wave {
|
| 1819 |
+
position: absolute;
|
| 1820 |
+
border: 2px solid hsl(var(--primary));
|
| 1821 |
+
border-radius: 50%;
|
| 1822 |
+
animation: energy-wave 2s ease-out infinite;
|
| 1823 |
+
}
|
| 1824 |
+
|
| 1825 |
+
.energy-wave:nth-child(2) {
|
| 1826 |
+
animation-delay: 0.5s;
|
| 1827 |
+
}
|
| 1828 |
+
|
| 1829 |
+
.energy-wave:nth-child(3) {
|
| 1830 |
+
animation-delay: 1s;
|
| 1831 |
+
}
|
| 1832 |
+
|
| 1833 |
+
/* Text reveal mask */
|
| 1834 |
+
@keyframes text-reveal {
|
| 1835 |
+
0% {
|
| 1836 |
+
clip-path: polygon(0 0, 0 0, 0 100%, 0 100%);
|
| 1837 |
+
}
|
| 1838 |
+
100% {
|
| 1839 |
+
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
|
| 1840 |
+
}
|
| 1841 |
+
}
|
| 1842 |
+
|
| 1843 |
+
.text-reveal {
|
| 1844 |
+
animation: text-reveal 1s cubic-bezier(0.77, 0, 0.175, 1) forwards;
|
| 1845 |
+
}
|
| 1846 |
+
|
| 1847 |
+
/* Stagger shake */
|
| 1848 |
+
@keyframes stagger-shake {
|
| 1849 |
+
0%, 100% { transform: translateX(0); }
|
| 1850 |
+
10% { transform: translateX(-5px) rotate(-1deg); }
|
| 1851 |
+
20% { transform: translateX(5px) rotate(1deg); }
|
| 1852 |
+
30% { transform: translateX(-5px) rotate(0deg); }
|
| 1853 |
+
40% { transform: translateX(5px) rotate(1deg); }
|
| 1854 |
+
50% { transform: translateX(-3px) rotate(-1deg); }
|
| 1855 |
+
60% { transform: translateX(3px) rotate(0deg); }
|
| 1856 |
+
70% { transform: translateX(-2px) rotate(-1deg); }
|
| 1857 |
+
80% { transform: translateX(2px) rotate(1deg); }
|
| 1858 |
+
90% { transform: translateX(-1px) rotate(0deg); }
|
| 1859 |
+
}
|
| 1860 |
+
|
| 1861 |
+
.shake-hover:hover {
|
| 1862 |
+
animation: stagger-shake 0.5s ease-in-out;
|
| 1863 |
+
}
|
| 1864 |
+
|
| 1865 |
+
/* Rainbow border animation */
|
| 1866 |
+
@keyframes rainbow-border {
|
| 1867 |
+
0% { border-color: hsl(0, 100%, 60%); }
|
| 1868 |
+
17% { border-color: hsl(60, 100%, 60%); }
|
| 1869 |
+
33% { border-color: hsl(120, 100%, 60%); }
|
| 1870 |
+
50% { border-color: hsl(180, 100%, 60%); }
|
| 1871 |
+
67% { border-color: hsl(240, 100%, 60%); }
|
| 1872 |
+
83% { border-color: hsl(300, 100%, 60%); }
|
| 1873 |
+
100% { border-color: hsl(360, 100%, 60%); }
|
| 1874 |
+
}
|
| 1875 |
+
|
| 1876 |
+
.rainbow-border {
|
| 1877 |
+
border-width: 3px;
|
| 1878 |
+
border-style: solid;
|
| 1879 |
+
animation: rainbow-border 5s linear infinite;
|
| 1880 |
+
}
|
| 1881 |
+
|
| 1882 |
+
/* Morphing background */
|
| 1883 |
+
@keyframes morph-bg {
|
| 1884 |
+
0%, 100% {
|
| 1885 |
+
background-position: 0% 50%;
|
| 1886 |
+
background-size: 200% 200%;
|
| 1887 |
+
}
|
| 1888 |
+
50% {
|
| 1889 |
+
background-position: 100% 50%;
|
| 1890 |
+
background-size: 300% 300%;
|
| 1891 |
+
}
|
| 1892 |
+
}
|
| 1893 |
+
|
| 1894 |
+
.morphing-bg {
|
| 1895 |
+
background: linear-gradient(135deg,
|
| 1896 |
+
hsl(var(--primary)),
|
| 1897 |
+
hsl(280, 65%, 60%),
|
| 1898 |
+
hsl(320, 75%, 55%),
|
| 1899 |
+
hsl(199, 89%, 48%),
|
| 1900 |
+
hsl(var(--primary))
|
| 1901 |
+
);
|
| 1902 |
+
background-size: 400% 400%;
|
| 1903 |
+
animation: morph-bg 15s ease infinite;
|
| 1904 |
+
}
|
| 1905 |
+
|
| 1906 |
+
/* Typing cursor */
|
| 1907 |
+
@keyframes blink {
|
| 1908 |
+
0%, 50% { opacity: 1; }
|
| 1909 |
+
51%, 100% { opacity: 0; }
|
| 1910 |
+
}
|
| 1911 |
+
|
| 1912 |
+
.typing-cursor::after {
|
| 1913 |
+
content: '|';
|
| 1914 |
+
animation: blink 1s step-end infinite;
|
| 1915 |
+
color: hsl(var(--primary));
|
| 1916 |
+
}
|
| 1917 |
+
|
| 1918 |
+
/* Hyperdrive lines */
|
| 1919 |
+
@keyframes hyperdrive {
|
| 1920 |
+
0% {
|
| 1921 |
+
transform: scale(0) rotate(0deg);
|
| 1922 |
+
opacity: 1;
|
| 1923 |
+
}
|
| 1924 |
+
100% {
|
| 1925 |
+
transform: scale(50) rotate(180deg);
|
| 1926 |
+
opacity: 0;
|
| 1927 |
+
}
|
| 1928 |
+
}
|
| 1929 |
+
|
| 1930 |
+
.hyperdrive-line {
|
| 1931 |
+
position: absolute;
|
| 1932 |
+
width: 2px;
|
| 1933 |
+
height: 100px;
|
| 1934 |
+
background: linear-gradient(to bottom, transparent, hsl(var(--primary)), transparent);
|
| 1935 |
+
transform-origin: center bottom;
|
| 1936 |
+
animation: hyperdrive 1s linear infinite;
|
| 1937 |
+
}
|
| 1938 |
+
|
| 1939 |
+
/* Cosmic dust */
|
| 1940 |
+
@keyframes cosmic-dust {
|
| 1941 |
+
0% {
|
| 1942 |
+
transform: translateY(0) rotate(0deg) scale(0);
|
| 1943 |
+
opacity: 0;
|
| 1944 |
+
}
|
| 1945 |
+
10% {
|
| 1946 |
+
opacity: 1;
|
| 1947 |
+
transform: translateY(-10px) rotate(36deg) scale(1);
|
| 1948 |
+
}
|
| 1949 |
+
100% {
|
| 1950 |
+
transform: translateY(-200px) rotate(360deg) scale(0);
|
| 1951 |
+
opacity: 0;
|
| 1952 |
+
}
|
| 1953 |
+
}
|
| 1954 |
+
|
| 1955 |
+
.cosmic-dust {
|
| 1956 |
+
position: absolute;
|
| 1957 |
+
width: 4px;
|
| 1958 |
+
height: 4px;
|
| 1959 |
+
border-radius: 50%;
|
| 1960 |
+
background: hsl(var(--primary));
|
| 1961 |
+
box-shadow: 0 0 6px hsl(var(--primary));
|
| 1962 |
+
animation: cosmic-dust 3s ease-out infinite;
|
| 1963 |
+
}
|
| 1964 |
+
|
| 1965 |
+
/* Spotlight follow */
|
| 1966 |
+
.spotlight-follow {
|
| 1967 |
+
position: relative;
|
| 1968 |
+
overflow: hidden;
|
| 1969 |
+
}
|
| 1970 |
+
|
| 1971 |
+
.spotlight-follow::before {
|
| 1972 |
+
content: '';
|
| 1973 |
+
position: absolute;
|
| 1974 |
+
width: 300px;
|
| 1975 |
+
height: 300px;
|
| 1976 |
+
background: radial-gradient(circle, hsl(var(--primary) / 0.15) 0%, transparent 70%);
|
| 1977 |
+
border-radius: 50%;
|
| 1978 |
+
pointer-events: none;
|
| 1979 |
+
transform: translate(-50%, -50%);
|
| 1980 |
+
transition: opacity 0.3s ease;
|
| 1981 |
+
opacity: 0;
|
| 1982 |
+
}
|
| 1983 |
+
|
| 1984 |
+
.spotlight-follow:hover::before {
|
| 1985 |
+
opacity: 1;
|
| 1986 |
+
}
|
| 1987 |
+
|
| 1988 |
+
/* Elastic bounce */
|
| 1989 |
+
@keyframes elastic-bounce {
|
| 1990 |
+
0% { transform: scale(1); }
|
| 1991 |
+
30% { transform: scale(1.25); }
|
| 1992 |
+
40% { transform: scale(0.9); }
|
| 1993 |
+
50% { transform: scale(1.15); }
|
| 1994 |
+
65% { transform: scale(0.95); }
|
| 1995 |
+
75% { transform: scale(1.05); }
|
| 1996 |
+
100% { transform: scale(1); }
|
| 1997 |
+
}
|
| 1998 |
+
|
| 1999 |
+
.elastic-bounce {
|
| 2000 |
+
animation: elastic-bounce 1s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
| 2001 |
+
}
|
| 2002 |
+
|
| 2003 |
+
/* Tilt 3D effect */
|
| 2004 |
+
.tilt-3d {
|
| 2005 |
+
transform-style: preserve-3d;
|
| 2006 |
+
transition: transform 0.3s ease;
|
| 2007 |
+
}
|
| 2008 |
+
|
| 2009 |
+
.tilt-3d:hover {
|
| 2010 |
+
transform: perspective(1000px) rotateX(10deg) rotateY(-10deg) scale(1.05);
|
| 2011 |
+
}
|
| 2012 |
+
|
| 2013 |
+
/* Magnetic attraction */
|
| 2014 |
+
.magnetic {
|
| 2015 |
+
transition: transform 0.3s cubic-bezier(0.23, 1, 0.32, 1);
|
| 2016 |
+
}
|
| 2017 |
+
|
| 2018 |
+
/* Quantum particle */
|
| 2019 |
+
@keyframes quantum {
|
| 2020 |
+
0%, 100% {
|
| 2021 |
+
transform: translate(0, 0) scale(1);
|
| 2022 |
+
opacity: 0.8;
|
| 2023 |
+
}
|
| 2024 |
+
25% {
|
| 2025 |
+
transform: translate(20px, -20px) scale(0.8);
|
| 2026 |
+
opacity: 0.4;
|
| 2027 |
+
}
|
| 2028 |
+
50% {
|
| 2029 |
+
transform: translate(-10px, 10px) scale(1.2);
|
| 2030 |
+
opacity: 1;
|
| 2031 |
+
}
|
| 2032 |
+
75% {
|
| 2033 |
+
transform: translate(-20px, -10px) scale(0.9);
|
| 2034 |
+
opacity: 0.6;
|
| 2035 |
+
}
|
| 2036 |
+
}
|
| 2037 |
+
|
| 2038 |
+
.quantum-particle {
|
| 2039 |
+
animation: quantum 5s ease-in-out infinite;
|
| 2040 |
+
}
|
| 2041 |
+
|
| 2042 |
+
/* Inverted perspective */
|
| 2043 |
+
.inverted-perspective {
|
| 2044 |
+
transform: perspective(500px) rotateX(5deg);
|
| 2045 |
+
transition: transform 0.5s ease;
|
| 2046 |
+
}
|
| 2047 |
+
|
| 2048 |
+
.inverted-perspective:hover {
|
| 2049 |
+
transform: perspective(500px) rotateX(-5deg) translateY(-10px);
|
| 2050 |
+
}
|
| 2051 |
+
|
| 2052 |
+
/* Trail effect */
|
| 2053 |
+
.trail-effect {
|
| 2054 |
+
position: relative;
|
| 2055 |
+
}
|
| 2056 |
+
|
| 2057 |
+
.trail-effect::after {
|
| 2058 |
+
content: '';
|
| 2059 |
+
position: absolute;
|
| 2060 |
+
inset: 0;
|
| 2061 |
+
border-radius: inherit;
|
| 2062 |
+
background: inherit;
|
| 2063 |
+
opacity: 0;
|
| 2064 |
+
transform: scale(1.1);
|
| 2065 |
+
transition: all 0.3s ease;
|
| 2066 |
+
z-index: -1;
|
| 2067 |
+
}
|
| 2068 |
+
|
| 2069 |
+
.trail-effect:hover::after {
|
| 2070 |
+
opacity: 0.3;
|
| 2071 |
+
transform: scale(1.2) translateY(10px);
|
| 2072 |
+
}
|
| 2073 |
+
|
| 2074 |
+
/*霓虹 Noir */
|
| 2075 |
+
.neon-noir {
|
| 2076 |
+
color: hsl(var(--foreground));
|
| 2077 |
+
text-shadow:
|
| 2078 |
+
0 0 5px hsl(var(--primary)),
|
| 2079 |
+
0 0 10px hsl(var(--primary)),
|
| 2080 |
+
0 0 20px hsl(var(--primary)),
|
| 2081 |
+
0 0 40px hsl(var(--primary)),
|
| 2082 |
+
0 0 80px hsl(var(--primary));
|
| 2083 |
+
animation: neon-flicker 0.15s infinite;
|
| 2084 |
+
}
|
| 2085 |
+
|
| 2086 |
+
@keyframes neon-flicker {
|
| 2087 |
+
0%, 19%, 21%, 23%, 25%, 54%, 56%, 100% {
|
| 2088 |
+
text-shadow:
|
| 2089 |
+
0 0 5px hsl(var(--primary)),
|
| 2090 |
+
0 0 10px hsl(var(--primary)),
|
| 2091 |
+
0 0 20px hsl(var(--primary)),
|
| 2092 |
+
0 0 40px hsl(var(--primary)),
|
| 2093 |
+
0 0 80px hsl(var(--primary));
|
| 2094 |
+
}
|
| 2095 |
+
20%, 24%, 55% {
|
| 2096 |
+
text-shadow: none;
|
| 2097 |
+
}
|
| 2098 |
+
}
|
| 2099 |
+
|
| 2100 |
+
/* Glass morphism extreme */
|
| 2101 |
+
.glass-extreme {
|
| 2102 |
+
background: linear-gradient(
|
| 2103 |
+
135deg,
|
| 2104 |
+
hsl(var(--background) / 0.1) 0%,
|
| 2105 |
+
hsl(var(--background) / 0.05) 50%,
|
| 2106 |
+
hsl(var(--background) / 0.1) 100%
|
| 2107 |
+
);
|
| 2108 |
+
backdrop-filter: blur(20px) saturate(180%);
|
| 2109 |
+
-webkit-backdrop-filter: blur(20px) saturate(180%);
|
| 2110 |
+
border: 1px solid hsl(var(--border) / 0.2);
|
| 2111 |
+
box-shadow:
|
| 2112 |
+
0 8px 32px hsl(var(--background) / 0.3),
|
| 2113 |
+
inset 0 1px 0 hsl(var(--foreground) / 0.1),
|
| 2114 |
+
inset 0 -1px 0 hsl(var(--background) / 0.1);
|
| 2115 |
+
}
|
| 2116 |
+
|
| 2117 |
+
/* Cyber grid */
|
| 2118 |
+
.cyber-grid {
|
| 2119 |
+
background-image:
|
| 2120 |
+
linear-gradient(hsl(var(--primary) / 0.03) 1px, transparent 1px),
|
| 2121 |
+
linear-gradient(90deg, hsl(var(--primary) / 0.03) 1px, transparent 1px);
|
| 2122 |
+
background-size: 50px 50px;
|
| 2123 |
+
animation: grid-move 20s linear infinite;
|
| 2124 |
+
}
|
| 2125 |
+
|
| 2126 |
+
@keyframes grid-move {
|
| 2127 |
+
0% { background-position: 0 0; }
|
| 2128 |
+
100% { background-position: 50px 50px; }
|
| 2129 |
+
}
|
| 2130 |
+
|
| 2131 |
+
/* Morphing card */
|
| 2132 |
+
.morph-card {
|
| 2133 |
+
transition: all 0.5s cubic-bezier(0.23, 1, 0.32, 1);
|
| 2134 |
+
}
|
| 2135 |
+
|
| 2136 |
+
.morph-card:hover {
|
| 2137 |
+
border-radius: 30% 70% 70% 30% / 30% 30% 70% 70%;
|
| 2138 |
+
}
|
| 2139 |
+
|
| 2140 |
+
/* Glitch image */
|
| 2141 |
+
@keyframes glitch-image {
|
| 2142 |
+
0% {
|
| 2143 |
+
filter: hue-rotate(0deg);
|
| 2144 |
+
transform: translate(0);
|
| 2145 |
+
}
|
| 2146 |
+
10% {
|
| 2147 |
+
filter: hue-rotate(90deg);
|
| 2148 |
+
transform: translate(-5px, 5px);
|
| 2149 |
+
}
|
| 2150 |
+
20% {
|
| 2151 |
+
filter: hue-rotate(180deg);
|
| 2152 |
+
transform: translate(5px, -5px);
|
| 2153 |
+
}
|
| 2154 |
+
30% {
|
| 2155 |
+
filter: hue-rotate(270deg);
|
| 2156 |
+
transform: translate(-5px, -5px);
|
| 2157 |
+
}
|
| 2158 |
+
40% {
|
| 2159 |
+
filter: hue-rotate(360deg);
|
| 2160 |
+
transform: translate(5px, 5px);
|
| 2161 |
+
}
|
| 2162 |
+
50%, 100% {
|
| 2163 |
+
filter: hue-rotate(0deg);
|
| 2164 |
+
transform: translate(0);
|
| 2165 |
+
}
|
| 2166 |
+
}
|
| 2167 |
+
|
| 2168 |
+
.glitch-image:hover {
|
| 2169 |
+
animation: glitch-image 0.5s ease-in-out;
|
| 2170 |
+
}
|
| 2171 |
+
|
| 2172 |
+
/* Infinite rotate */
|
| 2173 |
+
@keyframes infinite-rotate {
|
| 2174 |
+
from { transform: rotate(0deg); }
|
| 2175 |
+
to { transform: rotate(360deg); }
|
| 2176 |
+
}
|
| 2177 |
+
|
| 2178 |
+
.infinite-rotate {
|
| 2179 |
+
animation: infinite-rotate 30s linear infinite;
|
| 2180 |
+
}
|
| 2181 |
+
|
| 2182 |
+
/* Scale pulse */
|
| 2183 |
+
@keyframes scale-pulse {
|
| 2184 |
+
0%, 100% { transform: scale(1); }
|
| 2185 |
+
50% { transform: scale(1.05); }
|
| 2186 |
+
}
|
| 2187 |
+
|
| 2188 |
+
.scale-pulse {
|
| 2189 |
+
animation: scale-pulse 2s ease-in-out infinite;
|
| 2190 |
+
}
|
| 2191 |
+
|
| 2192 |
+
/* Text scramble effect placeholder */
|
| 2193 |
+
.scramble-text {
|
| 2194 |
+
font-family: monospace;
|
| 2195 |
+
}
|
| 2196 |
+
|
| 2197 |
+
/* Bounce in */
|
| 2198 |
+
@keyframes bounce-in {
|
| 2199 |
+
0% {
|
| 2200 |
+
transform: scale(0);
|
| 2201 |
+
opacity: 0;
|
| 2202 |
+
}
|
| 2203 |
+
50% {
|
| 2204 |
+
transform: scale(1.2);
|
| 2205 |
+
}
|
| 2206 |
+
100% {
|
| 2207 |
+
transform: scale(1);
|
| 2208 |
+
opacity: 1;
|
| 2209 |
+
}
|
| 2210 |
+
}
|
| 2211 |
+
|
| 2212 |
+
.bounce-in {
|
| 2213 |
+
animation: bounce-in 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
| 2214 |
+
}
|
| 2215 |
+
|
| 2216 |
+
/* Slide up fade */
|
| 2217 |
+
@keyframes slide-up-fade {
|
| 2218 |
+
0% {
|
| 2219 |
+
transform: translateY(50px);
|
| 2220 |
+
opacity: 0;
|
| 2221 |
+
}
|
| 2222 |
+
100% {
|
| 2223 |
+
transform: translateY(0);
|
| 2224 |
+
opacity: 1;
|
| 2225 |
+
}
|
| 2226 |
+
}
|
| 2227 |
+
|
| 2228 |
+
.slide-up-fade {
|
| 2229 |
+
animation: slide-up-fade 0.8s cubic-bezier(0.16, 1, 0.3, 1) forwards;
|
| 2230 |
+
}
|
| 2231 |
+
|
| 2232 |
+
/* Glow text */
|
| 2233 |
+
.glow-text {
|
| 2234 |
+
text-shadow:
|
| 2235 |
+
0 0 10px hsl(var(--primary)),
|
| 2236 |
+
0 0 20px hsl(var(--primary)),
|
| 2237 |
+
0 0 30px hsl(var(--primary)),
|
| 2238 |
+
0 0 40px hsl(var(--primary));
|
| 2239 |
+
}
|
| 2240 |
+
|
| 2241 |
+
/* Extrude 3D */
|
| 2242 |
+
.extrude-3d {
|
| 2243 |
+
text-shadow:
|
| 2244 |
+
1px 1px 0 hsl(var(--primary) / 0.3),
|
| 2245 |
+
2px 2px 0 hsl(var(--primary) / 0.25),
|
| 2246 |
+
3px 3px 0 hsl(var(--primary) / 0.2),
|
| 2247 |
+
4px 4px 0 hsl(var(--primary) / 0.15),
|
| 2248 |
+
5px 5px 0 hsl(var(--primary) / 0.1);
|
| 2249 |
+
transition: all 0.3s ease;
|
| 2250 |
+
}
|
| 2251 |
+
|
| 2252 |
+
.extrude-3d:hover {
|
| 2253 |
+
text-shadow:
|
| 2254 |
+
1px 1px 0 hsl(var(--primary) / 0.3),
|
| 2255 |
+
2px 2px 0 hsl(var(--primary) / 0.25),
|
| 2256 |
+
3px 3px 0 hsl(var(--primary) / 0.2),
|
| 2257 |
+
4px 4px 0 hsl(var(--primary) / 0.15),
|
| 2258 |
+
5px 5px 0 hsl(var(--primary) / 0.1),
|
| 2259 |
+
6px 6px 10px hsl(var(--background));
|
| 2260 |
+
transform: translate(-3px, -3px);
|
| 2261 |
+
}
|
| 2262 |
+
|
| 2263 |
+
/* Suspended animation */
|
| 2264 |
+
@keyframes suspended {
|
| 2265 |
+
0%, 100% {
|
| 2266 |
+
transform: translateY(0) rotate(0deg);
|
| 2267 |
+
}
|
| 2268 |
+
25% {
|
| 2269 |
+
transform: translateY(-8px) rotate(1deg);
|
| 2270 |
+
}
|
| 2271 |
+
50% {
|
| 2272 |
+
transform: translateY(-4px) rotate(-1deg);
|
| 2273 |
+
}
|
| 2274 |
+
75% {
|
| 2275 |
+
transform: translateY(-12px) rotate(0.5deg);
|
| 2276 |
+
}
|
| 2277 |
+
}
|
| 2278 |
+
|
| 2279 |
+
.suspended {
|
| 2280 |
+
animation: suspended 6s ease-in-out infinite;
|
| 2281 |
+
}
|
| 2282 |
+
|
| 2283 |
+
/* Dynamic underline */
|
| 2284 |
+
.dynamic-underline {
|
| 2285 |
+
position: relative;
|
| 2286 |
+
display: inline-block;
|
| 2287 |
+
}
|
| 2288 |
+
|
| 2289 |
+
.dynamic-underline::after {
|
| 2290 |
+
content: '';
|
| 2291 |
+
position: absolute;
|
| 2292 |
+
bottom: -4px;
|
| 2293 |
+
left: 50%;
|
| 2294 |
+
width: 0;
|
| 2295 |
+
height: 3px;
|
| 2296 |
+
background: linear-gradient(90deg, hsl(var(--primary)), hsl(280, 65%, 60%));
|
| 2297 |
+
transition: all 0.4s cubic-bezier(0.68, -0.55, 0.265, 1.55);
|
| 2298 |
+
transform: translateX(-50%);
|
| 2299 |
+
border-radius: 2px;
|
| 2300 |
+
}
|
| 2301 |
+
|
| 2302 |
+
.dynamic-underline:hover::after {
|
| 2303 |
+
width: 120%;
|
| 2304 |
+
}
|
| 2305 |
+
|
| 2306 |
+
/* Particle burst on click */
|
| 2307 |
+
@keyframes particle-burst {
|
| 2308 |
+
0% {
|
| 2309 |
+
transform: translate(0, 0) scale(1);
|
| 2310 |
+
opacity: 1;
|
| 2311 |
+
}
|
| 2312 |
+
100% {
|
| 2313 |
+
transform: translate(var(--x, 0), var(--y, 0)) scale(0);
|
| 2314 |
+
opacity: 0;
|
| 2315 |
+
}
|
| 2316 |
+
}
|
| 2317 |
+
|
| 2318 |
+
.particle-burst {
|
| 2319 |
+
position: absolute;
|
| 2320 |
+
width: 10px;
|
| 2321 |
+
height: 10px;
|
| 2322 |
+
border-radius: 50%;
|
| 2323 |
+
background: hsl(var(--primary));
|
| 2324 |
+
pointer-events: none;
|
| 2325 |
+
animation: particle-burst 0.6s ease-out forwards;
|
| 2326 |
}
|
components/home/CTASection.tsx
CHANGED
|
@@ -2,46 +2,32 @@
|
|
| 2 |
|
| 3 |
import Link from "next/link"
|
| 4 |
import { Button } from "@/components/ui/button"
|
| 5 |
-
import { ArrowRight, Sparkles, Zap, Rocket, MessageCircle } from "lucide-react"
|
| 6 |
import { useRef, useState, useEffect } from "react"
|
| 7 |
|
| 8 |
-
// Pre-computed particle data
|
| 9 |
const CTA_PARTICLES = [
|
| 10 |
-
//
|
| 11 |
-
{ left:
|
| 12 |
-
{ left:
|
| 13 |
-
{ left:
|
| 14 |
-
{ left:
|
| 15 |
-
{ left:
|
| 16 |
-
|
| 17 |
-
//
|
| 18 |
-
{ left:
|
| 19 |
-
{ left:
|
| 20 |
-
{ left:
|
| 21 |
-
|
| 22 |
-
{ left:
|
| 23 |
-
|
| 24 |
-
|
| 25 |
-
{ left: 25.4, top: 5.8, delay: 6.2, duration: 18.4 },
|
| 26 |
-
{ left: 55.7, top: 3.2, delay: 1.5, duration: 22.8 },
|
| 27 |
-
{ left: 72.1, top: 8.4, delay: 9.8, duration: 17.9 },
|
| 28 |
-
|
| 29 |
-
// Bottom edge
|
| 30 |
-
{ left: 18.9, top: 92.6, delay: 4.3, duration: 20.7 },
|
| 31 |
-
{ left: 48.3, top: 95.1, delay: 11.7, duration: 19.2 },
|
| 32 |
-
{ left: 68.5, top: 89.3, delay: 7.1, duration: 21.5 },
|
| 33 |
-
|
| 34 |
-
// Corners
|
| 35 |
-
{ left: 2.1, top: 2.4, delay: 13.5, duration: 18.6 },
|
| 36 |
-
{ left: 97.8, top: 4.7, delay: 0.8, duration: 22.4 },
|
| 37 |
-
{ left: 1.5, top: 96.2, delay: 5.6, duration: 19.8 },
|
| 38 |
-
{ left: 98.4, top: 94.5, delay: 10.4, duration: 17.3 },
|
| 39 |
]
|
| 40 |
|
| 41 |
export function CTASection() {
|
| 42 |
const sectionRef = useRef<HTMLElement>(null)
|
| 43 |
const [isVisible, setIsVisible] = useState(false)
|
| 44 |
-
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 })
|
| 45 |
|
| 46 |
useEffect(() => {
|
| 47 |
const observer = new IntersectionObserver(
|
|
@@ -76,115 +62,193 @@ export function CTASection() {
|
|
| 76 |
}, [])
|
| 77 |
|
| 78 |
return (
|
| 79 |
-
<section ref={sectionRef} className="relative py-
|
| 80 |
-
{/*
|
| 81 |
-
<div className="absolute inset-0
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
| 102 |
-
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
</div>
|
| 118 |
|
| 119 |
-
{/*
|
| 120 |
-
<div className="absolute inset-0
|
| 121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
</div>
|
| 123 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
<div className="container relative z-10 flex flex-col items-center text-center">
|
| 125 |
<div
|
| 126 |
-
className={`max-w-
|
| 127 |
-
isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-20'
|
| 128 |
}`}
|
| 129 |
>
|
| 130 |
-
{/* Main CTA card with
|
| 131 |
-
<div className="relative">
|
| 132 |
-
{/*
|
| 133 |
-
<div className="absolute -inset-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 134 |
|
| 135 |
-
<div className="relative glass-
|
| 136 |
{/* Inner glow */}
|
| 137 |
-
<div className="absolute inset-0 bg-gradient-to-br from-primary/
|
| 138 |
|
| 139 |
-
{/*
|
| 140 |
-
<div className="absolute
|
| 141 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 142 |
</div>
|
| 143 |
-
<div className="absolute
|
| 144 |
-
<
|
|
|
|
|
|
|
| 145 |
</div>
|
| 146 |
-
<div className="absolute bottom-
|
| 147 |
-
<
|
|
|
|
|
|
|
| 148 |
</div>
|
| 149 |
|
| 150 |
<div className="relative z-10">
|
| 151 |
{/* Badge */}
|
| 152 |
-
<div className="
|
| 153 |
-
<
|
| 154 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
</div>
|
| 156 |
|
| 157 |
-
|
|
|
|
| 158 |
Ready to Start Your{" "}
|
| 159 |
-
<span className="
|
| 160 |
-
Project
|
| 161 |
-
<svg className="absolute -bottom-2 left-0 w-full" viewBox="0 0 200 12" fill="none">
|
| 162 |
-
<path d="M2 10C50 4 150 2 198 10" stroke="hsl(var(--primary))" strokeWidth="3" strokeLinecap="round" style={{
|
| 163 |
-
strokeDasharray: '200',
|
| 164 |
-
strokeDashoffset: isVisible ? '0' : '200',
|
| 165 |
-
transition: 'stroke-dashoffset 1s ease 0.5s'
|
| 166 |
-
}} />
|
| 167 |
-
</svg>
|
| 168 |
-
</span>
|
| 169 |
?
|
| 170 |
</h2>
|
| 171 |
|
| 172 |
-
<p className="text-
|
| 173 |
Let's build something{" "}
|
| 174 |
-
<span className="text-primary font-
|
| 175 |
-
|
| 176 |
</p>
|
| 177 |
|
| 178 |
-
|
|
|
|
| 179 |
<Button
|
| 180 |
asChild
|
| 181 |
size="xl"
|
| 182 |
-
className="group h-
|
| 183 |
>
|
| 184 |
<Link href="/quote">
|
| 185 |
-
<span className="relative z-10 flex items-center">
|
| 186 |
Get a Free Quote
|
| 187 |
-
<
|
| 188 |
</span>
|
| 189 |
</Link>
|
| 190 |
</Button>
|
|
@@ -192,40 +256,44 @@ export function CTASection() {
|
|
| 192 |
asChild
|
| 193 |
size="xl"
|
| 194 |
variant="outline"
|
| 195 |
-
className="group h-
|
| 196 |
>
|
| 197 |
<Link href="/contact">
|
| 198 |
-
<MessageCircle className="mr-
|
| 199 |
Contact Us
|
| 200 |
</Link>
|
| 201 |
</Button>
|
| 202 |
</div>
|
| 203 |
|
| 204 |
-
{/* Trust badges */}
|
| 205 |
-
<div className="flex items-center justify-center gap-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
<
|
| 219 |
-
|
| 220 |
</div>
|
| 221 |
</div>
|
| 222 |
|
| 223 |
{/* Shine effect */}
|
| 224 |
-
<div className="absolute inset-0 shine-effect pointer-events-none" />
|
| 225 |
</div>
|
| 226 |
</div>
|
| 227 |
</div>
|
| 228 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
</section>
|
| 230 |
)
|
| 231 |
}
|
|
|
|
| 2 |
|
| 3 |
import Link from "next/link"
|
| 4 |
import { Button } from "@/components/ui/button"
|
| 5 |
+
import { ArrowRight, Sparkles, Zap, Rocket, MessageCircle, Star } from "lucide-react"
|
| 6 |
import { useRef, useState, useEffect } from "react"
|
| 7 |
|
| 8 |
+
// Pre-computed extreme particle data
|
| 9 |
const CTA_PARTICLES = [
|
| 10 |
+
// Cosmic particles
|
| 11 |
+
{ left: 5, top: 10, delay: 0, duration: 20, size: 4, type: 'cosmic' },
|
| 12 |
+
{ left: 15, top: 25, delay: 3, duration: 25, size: 3, type: 'cosmic' },
|
| 13 |
+
{ left: 88, top: 15, delay: 5, duration: 22, size: 5, type: 'cosmic' },
|
| 14 |
+
{ left: 95, top: 40, delay: 8, duration: 28, size: 4, type: 'cosmic' },
|
| 15 |
+
{ left: 10, top: 70, delay: 12, duration: 24, size: 3, type: 'cosmic' },
|
| 16 |
+
{ left: 85, top: 85, delay: 15, duration: 26, size: 5, type: 'cosmic' },
|
| 17 |
+
// Energy rings
|
| 18 |
+
{ left: 50, top: 50, delay: 0, duration: 12, size: 150, type: 'ring' },
|
| 19 |
+
{ left: 50, top: 50, delay: 4, duration: 12, size: 150, type: 'ring' },
|
| 20 |
+
{ left: 50, top: 50, delay: 8, duration: 12, size: 150, type: 'ring' },
|
| 21 |
+
// Quantum particles
|
| 22 |
+
{ left: 25, top: 80, delay: 2, duration: 10, size: 8, type: 'quantum' },
|
| 23 |
+
{ left: 75, top: 20, delay: 6, duration: 12, size: 6, type: 'quantum' },
|
| 24 |
+
{ left: 40, top: 60, delay: 10, duration: 8, size: 10, type: 'quantum' },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
]
|
| 26 |
|
| 27 |
export function CTASection() {
|
| 28 |
const sectionRef = useRef<HTMLElement>(null)
|
| 29 |
const [isVisible, setIsVisible] = useState(false)
|
| 30 |
+
const [mousePosition, setMousePosition] = useState({ x: 0.5, y: 0.5 })
|
| 31 |
|
| 32 |
useEffect(() => {
|
| 33 |
const observer = new IntersectionObserver(
|
|
|
|
| 62 |
}, [])
|
| 63 |
|
| 64 |
return (
|
| 65 |
+
<section ref={sectionRef} className="relative py-32 overflow-hidden bg-background" aria-label="Call to action">
|
| 66 |
+
{/* Extreme background effects */}
|
| 67 |
+
<div className="absolute inset-0">
|
| 68 |
+
{/* Morphing gradient */}
|
| 69 |
+
<div className="absolute inset-0 morphing-bg opacity-25" />
|
| 70 |
+
|
| 71 |
+
{/* Cyber grid */}
|
| 72 |
+
<div className="absolute inset-0 cyber-grid opacity-15" />
|
| 73 |
+
|
| 74 |
+
{/* Plasma orbs with mouse tracking */}
|
| 75 |
+
<div
|
| 76 |
+
className="absolute w-[700px] h-[700px] rounded-full liquid-blob opacity-35 blur-3xl pointer-events-none"
|
| 77 |
+
style={{
|
| 78 |
+
background: 'radial-gradient(circle, hsl(var(--primary)) 0%, hsl(280, 65%, 60%) 50%, transparent 70%)',
|
| 79 |
+
top: '-30%',
|
| 80 |
+
right: '-15%',
|
| 81 |
+
transform: `translate(${mousePosition.x * 60}px, ${mousePosition.y * 60}px)`,
|
| 82 |
+
transition: 'transform 0.6s cubic-bezier(0.23, 1, 0.32, 1)',
|
| 83 |
+
}}
|
| 84 |
+
/>
|
| 85 |
+
<div
|
| 86 |
+
className="absolute w-[600px] h-[600px] rounded-full liquid-blob opacity-25 blur-3xl pointer-events-none"
|
| 87 |
+
style={{
|
| 88 |
+
background: 'radial-gradient(circle, hsl(280, 65%, 60%) 0%, hsl(320, 75%, 55%) 50%, transparent 70%)',
|
| 89 |
+
bottom: '-30%',
|
| 90 |
+
left: '-15%',
|
| 91 |
+
transform: `translate(${-mousePosition.x * 40}px, ${-mousePosition.y * 40}px)`,
|
| 92 |
+
transition: 'transform 0.6s cubic-bezier(0.23, 1, 0.32, 1)',
|
| 93 |
+
animationDelay: '-12s',
|
| 94 |
+
}}
|
| 95 |
+
/>
|
| 96 |
+
<div
|
| 97 |
+
className="absolute w-[400px] h-[400px] rounded-full liquid-blob opacity-20 blur-3xl pointer-events-none"
|
| 98 |
+
style={{
|
| 99 |
+
background: 'radial-gradient(circle, hsl(199, 89%, 48%) 0%, hsl(var(--primary)) 50%, transparent 70%)',
|
| 100 |
+
top: '50%',
|
| 101 |
+
left: '50%',
|
| 102 |
+
transform: `translate(-50%, -50%) translate(${mousePosition.x * 30}px, ${mousePosition.y * 30}px)`,
|
| 103 |
+
transition: 'transform 0.6s cubic-bezier(0.23, 1, 0.32, 1)',
|
| 104 |
+
animationDelay: '-6s',
|
| 105 |
+
}}
|
| 106 |
+
/>
|
| 107 |
</div>
|
| 108 |
|
| 109 |
+
{/* Extreme particles */}
|
| 110 |
+
<div className="absolute inset-0 pointer-events-none overflow-hidden">
|
| 111 |
+
{CTA_PARTICLES.map((particle, i) => {
|
| 112 |
+
if (particle.type === 'cosmic') {
|
| 113 |
+
return (
|
| 114 |
+
<div
|
| 115 |
+
key={i}
|
| 116 |
+
className="cosmic-dust"
|
| 117 |
+
style={{
|
| 118 |
+
left: `${particle.left}%`,
|
| 119 |
+
top: `${particle.top}%`,
|
| 120 |
+
width: `${particle.size}px`,
|
| 121 |
+
height: `${particle.size}px`,
|
| 122 |
+
animationDelay: `${particle.delay}s`,
|
| 123 |
+
animationDuration: `${particle.duration}s`,
|
| 124 |
+
}}
|
| 125 |
+
/>
|
| 126 |
+
)
|
| 127 |
+
} else if (particle.type === 'ring') {
|
| 128 |
+
return (
|
| 129 |
+
<div
|
| 130 |
+
key={i}
|
| 131 |
+
className="energy-wave"
|
| 132 |
+
style={{
|
| 133 |
+
left: `${particle.left}%`,
|
| 134 |
+
top: `${particle.top}%`,
|
| 135 |
+
width: `${particle.size}px`,
|
| 136 |
+
height: `${particle.size}px`,
|
| 137 |
+
marginLeft: `-${particle.size / 2}px`,
|
| 138 |
+
marginTop: `-${particle.size / 2}px`,
|
| 139 |
+
animationDelay: `${particle.delay}s`,
|
| 140 |
+
}}
|
| 141 |
+
/>
|
| 142 |
+
)
|
| 143 |
+
} else {
|
| 144 |
+
return (
|
| 145 |
+
<div
|
| 146 |
+
key={i}
|
| 147 |
+
className="absolute rounded-full quantum-particle"
|
| 148 |
+
style={{
|
| 149 |
+
left: `${particle.left}%`,
|
| 150 |
+
top: `${particle.top}%`,
|
| 151 |
+
width: `${particle.size}px`,
|
| 152 |
+
height: `${particle.size}px`,
|
| 153 |
+
background: `linear-gradient(135deg, hsl(var(--primary)), hsl(280, 65%, 60%))`,
|
| 154 |
+
boxShadow: `0 0 ${particle.size * 2}px hsl(var(--primary) / 0.5)`,
|
| 155 |
+
animationDelay: `${particle.delay}s`,
|
| 156 |
+
animationDuration: `${particle.duration}s`,
|
| 157 |
+
}}
|
| 158 |
+
/>
|
| 159 |
+
)
|
| 160 |
+
}
|
| 161 |
+
})}
|
| 162 |
</div>
|
| 163 |
|
| 164 |
+
{/* Scan line */}
|
| 165 |
+
<div className="absolute inset-0 scan-line pointer-events-none opacity-50" />
|
| 166 |
+
|
| 167 |
+
{/* Noise overlay */}
|
| 168 |
+
<div className="absolute inset-0 noise-overlay opacity-40" />
|
| 169 |
+
|
| 170 |
<div className="container relative z-10 flex flex-col items-center text-center">
|
| 171 |
<div
|
| 172 |
+
className={`max-w-5xl transition-all duration-1000 ${
|
| 173 |
+
isVisible ? 'opacity-100 translate-y-0 scale-100' : 'opacity-0 translate-y-20 scale-95'
|
| 174 |
}`}
|
| 175 |
>
|
| 176 |
+
{/* Main CTA card with extreme effects */}
|
| 177 |
+
<div className="relative bounce-in">
|
| 178 |
+
{/* Extreme animated border */}
|
| 179 |
+
<div className="absolute -inset-2 rounded-[2.5rem] animated-border opacity-60" />
|
| 180 |
+
|
| 181 |
+
{/* Glow ring */}
|
| 182 |
+
<div className="absolute -inset-4 rounded-[3rem] opacity-30 breathing-glow">
|
| 183 |
+
<div className="absolute inset-0 rounded-[3rem] bg-gradient-to-r from-primary via-purple-500 to-pink-500 opacity-20 blur-2xl" />
|
| 184 |
+
</div>
|
| 185 |
|
| 186 |
+
<div className="relative glass-extreme rounded-[2.5rem] p-14 md:p-20 overflow-hidden">
|
| 187 |
{/* Inner glow */}
|
| 188 |
+
<div className="absolute inset-0 bg-gradient-to-br from-primary/15 via-transparent to-purple-500/15 opacity-60" />
|
| 189 |
|
| 190 |
+
{/* Plasma effect overlay */}
|
| 191 |
+
<div className="absolute inset-0 plasma-effect opacity-10" />
|
| 192 |
+
|
| 193 |
+
{/* Floating extreme icons */}
|
| 194 |
+
<div className="absolute top-10 left-10 animate-float" style={{ animationDelay: '0s' }}>
|
| 195 |
+
<div className="glass-extreme p-4 rounded-2xl breathing-glow">
|
| 196 |
+
<Rocket className="w-8 h-8 text-primary" suppressHydrationWarning />
|
| 197 |
+
</div>
|
| 198 |
+
</div>
|
| 199 |
+
<div className="absolute top-16 right-16 animate-float" style={{ animationDelay: '1.5s' }}>
|
| 200 |
+
<div className="glass-extreme p-3 rounded-xl breathing-glow">
|
| 201 |
+
<Zap className="w-7 h-7 text-amber-500" suppressHydrationWarning />
|
| 202 |
+
</div>
|
| 203 |
</div>
|
| 204 |
+
<div className="absolute bottom-12 left-20 animate-float" style={{ animationDelay: '3s' }}>
|
| 205 |
+
<div className="glass-extreme p-3 rounded-xl breathing-glow">
|
| 206 |
+
<MessageCircle className="w-7 h-7 text-cyan-500" suppressHydrationWarning />
|
| 207 |
+
</div>
|
| 208 |
</div>
|
| 209 |
+
<div className="absolute bottom-20 right-24 animate-float" style={{ animationDelay: '4.5s' }}>
|
| 210 |
+
<div className="glass-extreme p-3 rounded-xl breathing-glow">
|
| 211 |
+
<Star className="w-6 h-6 text-pink-500" suppressHydrationWarning />
|
| 212 |
+
</div>
|
| 213 |
</div>
|
| 214 |
|
| 215 |
<div className="relative z-10">
|
| 216 |
{/* Badge */}
|
| 217 |
+
<div className="bounce-in mb-10">
|
| 218 |
+
<div className="relative inline-flex items-center gap-3 px-6 py-3 rounded-full glass-extreme shake-hover">
|
| 219 |
+
<div className="relative">
|
| 220 |
+
<span className="absolute inset-0 rounded-full bg-primary animate-ping opacity-75" />
|
| 221 |
+
<Sparkles className="relative h-5 w-5 text-primary" suppressHydrationWarning />
|
| 222 |
+
</div>
|
| 223 |
+
<span className="text-sm font-bold dynamic-underline">Let's Create Together</span>
|
| 224 |
+
<Sparkles className="h-5 w-5 text-primary electric-glow" suppressHydrationWarning />
|
| 225 |
+
</div>
|
| 226 |
</div>
|
| 227 |
|
| 228 |
+
{/* Heading */}
|
| 229 |
+
<h2 className="text-5xl md:text-6xl lg:text-7xl mb-10 text-foreground font-black tracking-tight leading-tight">
|
| 230 |
Ready to Start Your{" "}
|
| 231 |
+
<span className="holographic">Project</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 232 |
?
|
| 233 |
</h2>
|
| 234 |
|
| 235 |
+
<p className="text-xl md:text-2xl mb-14 max-w-3xl text-muted-foreground leading-relaxed mx-auto">
|
| 236 |
Let's build something{" "}
|
| 237 |
+
<span className="text-primary font-bold glow-text">extraordinary</span>{" "}
|
| 238 |
+
together. Get a free consultation and detailed project quote today.
|
| 239 |
</p>
|
| 240 |
|
| 241 |
+
{/* Extreme CTAs */}
|
| 242 |
+
<div className="flex flex-col sm:flex-row gap-6 justify-center">
|
| 243 |
<Button
|
| 244 |
asChild
|
| 245 |
size="xl"
|
| 246 |
+
className="group h-16 px-12 text-xl font-bold rounded-2xl morphing-bg text-primary-foreground breathing-glow ripple-button shake-hover relative overflow-hidden"
|
| 247 |
>
|
| 248 |
<Link href="/quote">
|
| 249 |
+
<span className="relative z-10 flex items-center gap-3">
|
| 250 |
Get a Free Quote
|
| 251 |
+
<Rocket className="w-6 h-6 transition-transform group-hover:translate-x-2 group-hover:-translate-y-1 group-hover:scale-125" suppressHydrationWarning />
|
| 252 |
</span>
|
| 253 |
</Link>
|
| 254 |
</Button>
|
|
|
|
| 256 |
asChild
|
| 257 |
size="xl"
|
| 258 |
variant="outline"
|
| 259 |
+
className="group h-16 px-12 text-xl font-bold rounded-2xl glass-extreme border-2 border-primary/30 hover:border-primary breathing-glow"
|
| 260 |
>
|
| 261 |
<Link href="/contact">
|
| 262 |
+
<MessageCircle className="mr-3 h-6 w-6 group-hover:rotate-12 transition-transform" suppressHydrationWarning />
|
| 263 |
Contact Us
|
| 264 |
</Link>
|
| 265 |
</Button>
|
| 266 |
</div>
|
| 267 |
|
| 268 |
+
{/* Trust badges with extreme styling */}
|
| 269 |
+
<div className="flex items-center justify-center gap-8 mt-14">
|
| 270 |
+
{[
|
| 271 |
+
{ icon: Zap, text: "Fast Response", color: "text-amber-500" },
|
| 272 |
+
{ icon: Rocket, text: "Free Consultation", color: "text-primary" },
|
| 273 |
+
{ icon: Sparkles, text: "Custom Solutions", color: "text-cyan-500" },
|
| 274 |
+
].map((badge, i) => (
|
| 275 |
+
<div
|
| 276 |
+
key={badge.text}
|
| 277 |
+
className="flex items-center gap-2 glass-extreme px-4 py-2 rounded-full slide-up-fade"
|
| 278 |
+
style={{ animationDelay: `${1 + i * 0.15}s` }}
|
| 279 |
+
>
|
| 280 |
+
<badge.icon className={`w-5 h-5 ${badge.color}`} suppressHydrationWarning />
|
| 281 |
+
<span className="text-sm font-semibold">{badge.text}</span>
|
| 282 |
+
</div>
|
| 283 |
+
))}
|
| 284 |
</div>
|
| 285 |
</div>
|
| 286 |
|
| 287 |
{/* Shine effect */}
|
| 288 |
+
<div className="absolute inset-0 shine-effect pointer-events-none rounded-[2.5rem]" />
|
| 289 |
</div>
|
| 290 |
</div>
|
| 291 |
</div>
|
| 292 |
</div>
|
| 293 |
+
|
| 294 |
+
{/* Gradient overlays */}
|
| 295 |
+
<div className="absolute top-0 left-0 right-0 h-20 bg-gradient-to-b from-background to-transparent pointer-events-none" />
|
| 296 |
+
<div className="absolute bottom-0 left-0 right-0 h-20 bg-gradient-to-t from-background to-transparent pointer-events-none" />
|
| 297 |
</section>
|
| 298 |
)
|
| 299 |
}
|
components/home/HeroSection.tsx
CHANGED
|
@@ -2,55 +2,40 @@
|
|
| 2 |
|
| 3 |
import Link from "next/link"
|
| 4 |
import { Button } from "@/components/ui/button"
|
| 5 |
-
import { ArrowRight, Sparkles, Code2, Rocket, Zap } from "lucide-react"
|
| 6 |
import { useEffect, useRef, useState } from "react"
|
| 7 |
|
| 8 |
-
// Pre-computed particle data
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
{ left:
|
| 13 |
-
{ left:
|
| 14 |
-
{ left:
|
| 15 |
-
{ left:
|
| 16 |
-
{ left:
|
| 17 |
-
{ left: 15
|
| 18 |
-
|
| 19 |
-
//
|
| 20 |
-
{ left:
|
| 21 |
-
{ left:
|
| 22 |
-
{ left:
|
| 23 |
-
{ left:
|
| 24 |
-
|
| 25 |
-
|
| 26 |
-
|
| 27 |
-
{ left:
|
| 28 |
-
|
| 29 |
-
{ left:
|
| 30 |
-
{ left:
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
{ left:
|
| 34 |
-
{ left: 92.8, top: 65.4, delay: 11.2, duration: 18.4, width: 5.2, height: 5.6, opacity: 0.29 },
|
| 35 |
-
{ left: 78.6, top: 88.9, delay: 7.8, duration: 20.7, width: 6.4, height: 4.5, opacity: 0.34 },
|
| 36 |
-
{ left: 96.1, top: 82.5, delay: 2.9, duration: 22.6, width: 5.8, height: 6.1, opacity: 0.27 },
|
| 37 |
-
|
| 38 |
-
// Center spread (top area only to avoid stat cards)
|
| 39 |
-
{ left: 35.4, top: 12.8, delay: 8.4, duration: 19.1, width: 5.5, height: 5.3, opacity: 0.30 },
|
| 40 |
-
{ left: 48.7, top: 8.2, delay: 3.6, duration: 21.4, width: 4.4, height: 6.6, opacity: 0.28 },
|
| 41 |
-
{ left: 62.3, top: 15.9, delay: 10.2, duration: 18.9, width: 6.3, height: 5.0, opacity: 0.32 },
|
| 42 |
-
{ left: 55.8, top: 5.4, delay: 6.1, duration: 22.2, width: 5.1, height: 5.8, opacity: 0.29 },
|
| 43 |
-
{ left: 41.2, top: 22.6, delay: 12.8, duration: 17.8, width: 5.7, height: 4.7, opacity: 0.31 },
|
| 44 |
-
{ left: 68.9, top: 10.3, delay: 5.4, duration: 20.5, width: 4.9, height: 6.0, opacity: 0.33 },
|
| 45 |
-
{ left: 29.6, top: 3.8, delay: 9.7, duration: 21.9, width: 6.0, height: 5.2, opacity: 0.27 },
|
| 46 |
-
{ left: 72.4, top: 18.5, delay: 2.2, duration: 19.3, width: 5.3, height: 5.5, opacity: 0.30 },
|
| 47 |
-
{ left: 45.1, top: 25.7, delay: 7.5, duration: 18.1, width: 4.6, height: 6.3, opacity: 0.28 },
|
| 48 |
-
{ left: 58.6, top: 2.9, delay: 11.8, duration: 22.7, width: 6.2, height: 4.8, opacity: 0.32 },
|
| 49 |
]
|
| 50 |
|
| 51 |
export function HeroSection() {
|
| 52 |
const heroRef = useRef<HTMLDivElement>(null)
|
| 53 |
-
const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 })
|
| 54 |
|
| 55 |
useEffect(() => {
|
| 56 |
const handleMouseMove = (e: MouseEvent) => {
|
|
@@ -68,196 +53,296 @@ export function HeroSection() {
|
|
| 68 |
}, [])
|
| 69 |
|
| 70 |
return (
|
| 71 |
-
<section ref={heroRef} className="relative overflow-hidden
|
| 72 |
-
{/*
|
| 73 |
-
<div className="absolute inset-0
|
| 74 |
-
|
| 75 |
-
|
| 76 |
-
<div className="absolute inset-0 noise-overlay" />
|
| 77 |
|
| 78 |
-
|
| 79 |
-
|
| 80 |
-
className="absolute w-[500px] h-[500px] morphing-blob opacity-30 blur-3xl pointer-events-none"
|
| 81 |
-
style={{
|
| 82 |
-
background: `linear-gradient(135deg, hsl(var(--primary)), hsl(280, 65%, 60%))`,
|
| 83 |
-
top: '10%',
|
| 84 |
-
right: '5%',
|
| 85 |
-
transform: `translate(${mousePosition.x * 30}px, ${mousePosition.y * 30}px)`,
|
| 86 |
-
transition: 'transform 0.3s ease-out',
|
| 87 |
-
}}
|
| 88 |
-
/>
|
| 89 |
|
| 90 |
-
|
| 91 |
-
|
| 92 |
-
|
| 93 |
-
|
| 94 |
-
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
|
| 103 |
-
{/*
|
| 104 |
-
<div className="absolute inset-0 pointer-events-none overflow-hidden
|
| 105 |
-
{
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
| 110 |
-
|
| 111 |
-
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
</div>
|
| 121 |
|
| 122 |
-
{/*
|
| 123 |
-
<div className="absolute inset-0
|
|
|
|
|
|
|
|
|
|
| 124 |
|
| 125 |
-
{/*
|
| 126 |
-
<div className="absolute inset-0 -
|
| 127 |
-
<div
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 128 |
</div>
|
| 129 |
|
| 130 |
-
<div className="container relative z-10 flex flex-col items-center text-center">
|
| 131 |
-
{/*
|
| 132 |
-
<div className="
|
| 133 |
-
<
|
| 134 |
-
|
| 135 |
-
<
|
| 136 |
-
|
| 137 |
-
|
| 138 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 139 |
</div>
|
| 140 |
|
| 141 |
-
{/* H1
|
| 142 |
-
<h1 className="
|
| 143 |
-
<span className="block"
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
strokeDasharray: '300',
|
| 149 |
-
strokeDashoffset: '300',
|
| 150 |
-
animation: 'dash 2s ease forwards 0.5s'
|
| 151 |
-
}} />
|
| 152 |
-
</svg>
|
| 153 |
</span>
|
| 154 |
-
<span className="block mt-2
|
| 155 |
-
<span>
|
| 156 |
-
<span className="mx-2"> </span>
|
| 157 |
-
<span className="text-primary neon-glow">GROW</span>
|
| 158 |
</span>
|
| 159 |
</h1>
|
| 160 |
|
| 161 |
{/* Subheadline */}
|
| 162 |
-
<p className="
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
|
|
|
| 166 |
</p>
|
| 167 |
|
| 168 |
-
{/*
|
| 169 |
-
<div className="
|
| 170 |
-
<Button
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
<Link href="/quote">
|
| 172 |
-
<span className="relative z-10 flex items-center">
|
| 173 |
-
|
| 174 |
-
<
|
| 175 |
</span>
|
| 176 |
</Link>
|
| 177 |
</Button>
|
| 178 |
-
<Button
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
<Link href="/portfolio">
|
| 180 |
-
<span className="flex items-center">
|
| 181 |
-
|
| 182 |
-
<
|
| 183 |
</span>
|
| 184 |
</Link>
|
| 185 |
</Button>
|
| 186 |
</div>
|
| 187 |
|
| 188 |
-
{/*
|
| 189 |
-
<div className="
|
| 190 |
-
<div className="glass-card p-3 rounded-xl">
|
| 191 |
-
<Code2 className="h-6 w-6 text-primary" suppressHydrationWarning />
|
| 192 |
-
</div>
|
| 193 |
-
</div>
|
| 194 |
-
<div className="absolute top-1/3 right-10 hidden xl:block animate-float" style={{ animationDelay: '1s' }}>
|
| 195 |
-
<div className="glass-card p-3 rounded-xl">
|
| 196 |
-
<Zap className="h-6 w-6 text-amber-500" suppressHydrationWarning />
|
| 197 |
-
</div>
|
| 198 |
-
</div>
|
| 199 |
-
<div className="absolute bottom-1/3 left-20 hidden xl:block animate-float" style={{ animationDelay: '2s' }}>
|
| 200 |
-
<div className="glass-card p-3 rounded-xl">
|
| 201 |
-
<Rocket className="h-6 w-6 text-cyan-500" suppressHydrationWarning />
|
| 202 |
-
</div>
|
| 203 |
-
</div>
|
| 204 |
-
|
| 205 |
-
{/* Key Statistics with enhanced styling */}
|
| 206 |
-
<div className="animate-fade-in-up animate-delay-5 mt-24 relative">
|
| 207 |
-
{/* Background overlay to hide particles behind cards */}
|
| 208 |
-
<div className="absolute inset-0 bg-gradient-to-t from-background via-background/95 to-background/80 -z-10 rounded-3xl" />
|
| 209 |
-
|
| 210 |
-
<div className="grid grid-cols-1 sm:grid-cols-3 gap-6 md:gap-8 w-full max-w-4xl">
|
| 211 |
{[
|
| 212 |
-
{ value: "50+", label: "Projects
|
| 213 |
-
{ value: "98%", label: "Client Satisfaction", icon: Sparkles },
|
| 214 |
-
{ value: "5+", label: "Years of
|
| 215 |
].map((stat, i) => (
|
| 216 |
<div
|
| 217 |
key={stat.label}
|
| 218 |
-
className="group
|
|
|
|
| 219 |
>
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
|
| 223 |
-
|
| 224 |
-
{/* Icon */}
|
| 225 |
-
<stat.icon className="h-6 w-6 text-primary mx-auto mb-3 opacity-60 group-hover:opacity-100 group-hover:scale-110 transition-all duration-300" suppressHydrationWarning />
|
| 226 |
-
|
| 227 |
-
{/* Value with counter animation */}
|
| 228 |
-
<div className="text-4xl md:text-5xl font-bold gradient-text mb-2 transition-all duration-300 group-hover:scale-110 counter-animate">
|
| 229 |
-
{stat.value}
|
| 230 |
</div>
|
| 231 |
|
| 232 |
-
|
| 233 |
-
|
| 234 |
-
{stat.
|
| 235 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 236 |
|
| 237 |
-
|
| 238 |
-
|
|
|
|
|
|
|
|
|
|
| 239 |
</div>
|
| 240 |
</div>
|
| 241 |
))}
|
| 242 |
-
</div>
|
| 243 |
</div>
|
| 244 |
|
| 245 |
{/* Scroll indicator */}
|
| 246 |
-
<div className="absolute bottom-
|
| 247 |
-
<div
|
| 248 |
-
|
| 249 |
-
|
|
|
|
|
|
|
|
|
|
| 250 |
</div>
|
| 251 |
</div>
|
| 252 |
|
| 253 |
-
{/*
|
| 254 |
-
<
|
| 255 |
-
|
| 256 |
-
to {
|
| 257 |
-
stroke-dashoffset: 0;
|
| 258 |
-
}
|
| 259 |
-
}
|
| 260 |
-
`}</style>
|
| 261 |
</section>
|
| 262 |
)
|
| 263 |
}
|
|
|
|
| 2 |
|
| 3 |
import Link from "next/link"
|
| 4 |
import { Button } from "@/components/ui/button"
|
| 5 |
+
import { ArrowRight, Sparkles, Code2, Rocket, Zap, Star, Layers, Globe } from "lucide-react"
|
| 6 |
import { useEffect, useRef, useState } from "react"
|
| 7 |
|
| 8 |
+
// Pre-computed extreme particle data
|
| 9 |
+
const EXTREME_PARTICLES = [
|
| 10 |
+
// Cosmic dust particles
|
| 11 |
+
{ left: 10, top: 15, delay: 0, duration: 25, size: 4, type: 'cosmic' },
|
| 12 |
+
{ left: 25, top: 8, delay: 3, duration: 22, size: 3, type: 'cosmic' },
|
| 13 |
+
{ left: 40, top: 22, delay: 6, duration: 28, size: 5, type: 'cosmic' },
|
| 14 |
+
{ left: 55, top: 5, delay: 9, duration: 24, size: 4, type: 'cosmic' },
|
| 15 |
+
{ left: 70, top: 18, delay: 12, duration: 26, size: 3, type: 'cosmic' },
|
| 16 |
+
{ left: 85, top: 10, delay: 15, duration: 23, size: 4, type: 'cosmic' },
|
| 17 |
+
{ left: 15, top: 45, delay: 2, duration: 27, size: 3, type: 'cosmic' },
|
| 18 |
+
{ left: 88, top: 35, delay: 8, duration: 25, size: 5, type: 'cosmic' },
|
| 19 |
+
// Floating orbs
|
| 20 |
+
{ left: 5, top: 25, delay: 4, duration: 30, size: 80, type: 'orb' },
|
| 21 |
+
{ left: 92, top: 55, delay: 10, duration: 35, size: 60, type: 'orb' },
|
| 22 |
+
{ left: 20, top: 70, delay: 7, duration: 28, size: 50, type: 'orb' },
|
| 23 |
+
{ left: 75, top: 80, delay: 14, duration: 32, size: 70, type: 'orb' },
|
| 24 |
+
// Energy rings
|
| 25 |
+
{ left: 50, top: 50, delay: 0, duration: 15, size: 200, type: 'ring' },
|
| 26 |
+
{ left: 50, top: 50, delay: 5, duration: 15, size: 200, type: 'ring' },
|
| 27 |
+
{ left: 50, top: 50, delay: 10, duration: 15, size: 200, type: 'ring' },
|
| 28 |
+
// Quantum particles
|
| 29 |
+
{ left: 30, top: 30, delay: 1, duration: 8, size: 6, type: 'quantum' },
|
| 30 |
+
{ left: 60, top: 20, delay: 3, duration: 10, size: 8, type: 'quantum' },
|
| 31 |
+
{ left: 80, top: 40, delay: 5, duration: 9, size: 5, type: 'quantum' },
|
| 32 |
+
{ left: 20, top: 60, delay: 7, duration: 11, size: 7, type: 'quantum' },
|
| 33 |
+
{ left: 70, top: 70, delay: 9, duration: 8, size: 6, type: 'quantum' },
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 34 |
]
|
| 35 |
|
| 36 |
export function HeroSection() {
|
| 37 |
const heroRef = useRef<HTMLDivElement>(null)
|
| 38 |
+
const [mousePosition, setMousePosition] = useState({ x: 0.5, y: 0.5 })
|
| 39 |
|
| 40 |
useEffect(() => {
|
| 41 |
const handleMouseMove = (e: MouseEvent) => {
|
|
|
|
| 53 |
}, [])
|
| 54 |
|
| 55 |
return (
|
| 56 |
+
<section ref={heroRef} className="relative overflow-hidden min-h-screen flex items-center bg-background">
|
| 57 |
+
{/* Extreme animated background layers */}
|
| 58 |
+
<div className="absolute inset-0">
|
| 59 |
+
{/* Morphing gradient mesh */}
|
| 60 |
+
<div className="absolute inset-0 morphing-bg opacity-30" />
|
|
|
|
| 61 |
|
| 62 |
+
{/* Cyber grid */}
|
| 63 |
+
<div className="absolute inset-0 cyber-grid opacity-20" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
|
| 65 |
+
{/* Plasma orbs */}
|
| 66 |
+
<div
|
| 67 |
+
className="absolute w-[600px] h-[600px] rounded-full liquid-blob opacity-40 blur-3xl pointer-events-none"
|
| 68 |
+
style={{
|
| 69 |
+
background: `radial-gradient(circle, hsl(var(--primary)) 0%, hsl(280, 65%, 60%) 50%, transparent 70%)`,
|
| 70 |
+
top: '10%',
|
| 71 |
+
right: '10%',
|
| 72 |
+
transform: `translate(${mousePosition.x * 50}px, ${mousePosition.y * 50}px)`,
|
| 73 |
+
transition: 'transform 0.5s cubic-bezier(0.23, 1, 0.32, 1)',
|
| 74 |
+
}}
|
| 75 |
+
/>
|
| 76 |
+
<div
|
| 77 |
+
className="absolute w-[500px] h-[500px] rounded-full liquid-blob opacity-30 blur-3xl pointer-events-none"
|
| 78 |
+
style={{
|
| 79 |
+
background: `radial-gradient(circle, hsl(280, 65%, 60%) 0%, hsl(320, 75%, 55%) 50%, transparent 70%)`,
|
| 80 |
+
bottom: '10%',
|
| 81 |
+
left: '5%',
|
| 82 |
+
transform: `translate(${-mousePosition.x * 40}px, ${-mousePosition.y * 40}px)`,
|
| 83 |
+
transition: 'transform 0.5s cubic-bezier(0.23, 1, 0.32, 1)',
|
| 84 |
+
animationDelay: '-10s',
|
| 85 |
+
}}
|
| 86 |
+
/>
|
| 87 |
+
<div
|
| 88 |
+
className="absolute w-[400px] h-[400px] rounded-full liquid-blob opacity-25 blur-3xl pointer-events-none"
|
| 89 |
+
style={{
|
| 90 |
+
background: `radial-gradient(circle, hsl(199, 89%, 48%) 0%, hsl(var(--primary)) 50%, transparent 70%)`,
|
| 91 |
+
top: '50%',
|
| 92 |
+
left: '50%',
|
| 93 |
+
transform: `translate(-50%, -50%) translate(${mousePosition.x * 30}px, ${mousePosition.y * 30}px)`,
|
| 94 |
+
transition: 'transform 0.5s cubic-bezier(0.23, 1, 0.32, 1)',
|
| 95 |
+
animationDelay: '-5s',
|
| 96 |
+
}}
|
| 97 |
+
/>
|
| 98 |
+
</div>
|
| 99 |
|
| 100 |
+
{/* Extreme particles */}
|
| 101 |
+
<div className="absolute inset-0 pointer-events-none overflow-hidden">
|
| 102 |
+
{EXTREME_PARTICLES.map((particle, i) => {
|
| 103 |
+
if (particle.type === 'cosmic') {
|
| 104 |
+
return (
|
| 105 |
+
<div
|
| 106 |
+
key={i}
|
| 107 |
+
className="cosmic-dust"
|
| 108 |
+
style={{
|
| 109 |
+
left: `${particle.left}%`,
|
| 110 |
+
top: `${particle.top}%`,
|
| 111 |
+
width: `${particle.size}px`,
|
| 112 |
+
height: `${particle.size}px`,
|
| 113 |
+
animationDelay: `${particle.delay}s`,
|
| 114 |
+
animationDuration: `${particle.duration}s`,
|
| 115 |
+
}}
|
| 116 |
+
/>
|
| 117 |
+
)
|
| 118 |
+
} else if (particle.type === 'orb') {
|
| 119 |
+
return (
|
| 120 |
+
<div
|
| 121 |
+
key={i}
|
| 122 |
+
className="absolute rounded-full quantum-particle"
|
| 123 |
+
style={{
|
| 124 |
+
left: `${particle.left}%`,
|
| 125 |
+
top: `${particle.top}%`,
|
| 126 |
+
width: `${particle.size}px`,
|
| 127 |
+
height: `${particle.size}px`,
|
| 128 |
+
background: `radial-gradient(circle, hsl(var(--primary) / 0.3), transparent)`,
|
| 129 |
+
filter: 'blur(1px)',
|
| 130 |
+
animationDelay: `${particle.delay}s`,
|
| 131 |
+
animationDuration: `${particle.duration}s`,
|
| 132 |
+
}}
|
| 133 |
+
/>
|
| 134 |
+
)
|
| 135 |
+
} else if (particle.type === 'ring') {
|
| 136 |
+
return (
|
| 137 |
+
<div
|
| 138 |
+
key={i}
|
| 139 |
+
className="energy-wave"
|
| 140 |
+
style={{
|
| 141 |
+
left: `${particle.left}%`,
|
| 142 |
+
top: `${particle.top}%`,
|
| 143 |
+
width: `${particle.size}px`,
|
| 144 |
+
height: `${particle.size}px`,
|
| 145 |
+
marginLeft: `-${particle.size / 2}px`,
|
| 146 |
+
marginTop: `-${particle.size / 2}px`,
|
| 147 |
+
animationDelay: `${particle.delay}s`,
|
| 148 |
+
}}
|
| 149 |
+
/>
|
| 150 |
+
)
|
| 151 |
+
} else {
|
| 152 |
+
return (
|
| 153 |
+
<div
|
| 154 |
+
key={i}
|
| 155 |
+
className="absolute rounded-full"
|
| 156 |
+
style={{
|
| 157 |
+
left: `${particle.left}%`,
|
| 158 |
+
top: `${particle.top}%`,
|
| 159 |
+
width: `${particle.size}px`,
|
| 160 |
+
height: `${particle.size}px`,
|
| 161 |
+
background: `linear-gradient(135deg, hsl(var(--primary)), hsl(280, 65%, 60%))`,
|
| 162 |
+
boxShadow: `0 0 ${particle.size * 2}px hsl(var(--primary) / 0.5)`,
|
| 163 |
+
animation: `quantum ${particle.duration}s ease-in-out infinite`,
|
| 164 |
+
animationDelay: `${particle.delay}s`,
|
| 165 |
+
}}
|
| 166 |
+
/>
|
| 167 |
+
)
|
| 168 |
+
}
|
| 169 |
+
})}
|
| 170 |
</div>
|
| 171 |
|
| 172 |
+
{/* Scan line effect */}
|
| 173 |
+
<div className="absolute inset-0 scan-line pointer-events-none" />
|
| 174 |
+
|
| 175 |
+
{/* Noise overlay */}
|
| 176 |
+
<div className="absolute inset-0 noise-overlay opacity-50" />
|
| 177 |
|
| 178 |
+
{/* Floating tech icons */}
|
| 179 |
+
<div className="absolute inset-0 pointer-events-none">
|
| 180 |
+
<div
|
| 181 |
+
className="absolute top-1/4 left-[5%] animate-float"
|
| 182 |
+
style={{ animationDelay: '0s' }}
|
| 183 |
+
>
|
| 184 |
+
<div className="glass-extreme p-4 rounded-2xl breathing-glow">
|
| 185 |
+
<Code2 className="h-8 w-8 text-primary" suppressHydrationWarning />
|
| 186 |
+
</div>
|
| 187 |
+
</div>
|
| 188 |
+
<div
|
| 189 |
+
className="absolute top-1/3 right-[5%] animate-float"
|
| 190 |
+
style={{ animationDelay: '1s' }}
|
| 191 |
+
>
|
| 192 |
+
<div className="glass-extreme p-4 rounded-2xl breathing-glow">
|
| 193 |
+
<Zap className="h-8 w-8 text-amber-500" suppressHydrationWarning />
|
| 194 |
+
</div>
|
| 195 |
+
</div>
|
| 196 |
+
<div
|
| 197 |
+
className="absolute bottom-1/3 left-[8%] animate-float"
|
| 198 |
+
style={{ animationDelay: '2s' }}
|
| 199 |
+
>
|
| 200 |
+
<div className="glass-extreme p-4 rounded-2xl breathing-glow">
|
| 201 |
+
<Rocket className="h-8 w-8 text-cyan-500" suppressHydrationWarning />
|
| 202 |
+
</div>
|
| 203 |
+
</div>
|
| 204 |
+
<div
|
| 205 |
+
className="absolute top-[60%] right-[8%] animate-float"
|
| 206 |
+
style={{ animationDelay: '3s' }}
|
| 207 |
+
>
|
| 208 |
+
<div className="glass-extreme p-4 rounded-2xl breathing-glow">
|
| 209 |
+
<Globe className="h-8 w-8 text-emerald-500" suppressHydrationWarning />
|
| 210 |
+
</div>
|
| 211 |
+
</div>
|
| 212 |
+
<div
|
| 213 |
+
className="absolute top-[20%] left-[45%] animate-float"
|
| 214 |
+
style={{ animationDelay: '4s' }}
|
| 215 |
+
>
|
| 216 |
+
<div className="glass-extreme p-3 rounded-xl breathing-glow">
|
| 217 |
+
<Layers className="h-6 w-6 text-purple-500" suppressHydrationWarning />
|
| 218 |
+
</div>
|
| 219 |
+
</div>
|
| 220 |
</div>
|
| 221 |
|
| 222 |
+
<div className="container relative z-10 flex flex-col items-center text-center pt-32 pb-20">
|
| 223 |
+
{/* Extreme badge */}
|
| 224 |
+
<div className="bounce-in mb-10">
|
| 225 |
+
<div className="relative group">
|
| 226 |
+
{/* Animated border */}
|
| 227 |
+
<div className="absolute -inset-1 rounded-full animated-border opacity-50 group-hover:opacity-100 transition-opacity" />
|
| 228 |
+
|
| 229 |
+
<div className="relative glass-extreme px-8 py-4 rounded-full flex items-center gap-3 cursor-default shake-hover">
|
| 230 |
+
<div className="relative">
|
| 231 |
+
<span className="absolute inset-0 rounded-full bg-primary animate-ping opacity-75" />
|
| 232 |
+
<span className="relative flex h-3 w-3">
|
| 233 |
+
<Star className="h-3 w-3 text-primary-foreground" suppressHydrationWarning />
|
| 234 |
+
</span>
|
| 235 |
+
</div>
|
| 236 |
+
<Sparkles className="h-5 w-5 text-primary electric-glow" suppressHydrationWarning />
|
| 237 |
+
<span className="font-semibold text-sm dynamic-underline">Your Vision, Our Craft</span>
|
| 238 |
+
<Sparkles className="h-5 w-5 text-primary electric-glow" suppressHydrationWarning />
|
| 239 |
+
</div>
|
| 240 |
+
</div>
|
| 241 |
</div>
|
| 242 |
|
| 243 |
+
{/* Extreme H1 */}
|
| 244 |
+
<h1 className="mb-10 text-5xl sm:text-6xl md:text-7xl lg:text-8xl xl:text-9xl font-black tracking-tighter leading-none">
|
| 245 |
+
<span className="block slide-up-fade" style={{ animationDelay: '0.1s' }}>
|
| 246 |
+
We Create
|
| 247 |
+
</span>
|
| 248 |
+
<span className="block mt-2 slide-up-fade" style={{ animationDelay: '0.2s' }}>
|
| 249 |
+
<span className="holographic">Digital</span>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 250 |
</span>
|
| 251 |
+
<span className="block mt-2 slide-up-fade" style={{ animationDelay: '0.3s' }}>
|
| 252 |
+
<span className="extrude-3d cursor-default">Masterpieces</span>
|
|
|
|
|
|
|
| 253 |
</span>
|
| 254 |
</h1>
|
| 255 |
|
| 256 |
{/* Subheadline */}
|
| 257 |
+
<p className="slide-up-fade mb-14 max-w-3xl text-lg sm:text-xl md:text-2xl text-muted-foreground leading-relaxed" style={{ animationDelay: '0.4s' }}>
|
| 258 |
+
Transforming bold ideas into{" "}
|
| 259 |
+
<span className="text-primary font-bold glow-text">extraordinary</span>{" "}
|
| 260 |
+
digital experiences that captivate, engage, and{" "}
|
| 261 |
+
<span className="holographic font-bold">inspire</span>.
|
| 262 |
</p>
|
| 263 |
|
| 264 |
+
{/* Extreme CTAs */}
|
| 265 |
+
<div className="flex flex-col gap-5 sm:flex-row slide-up-fade" style={{ animationDelay: '0.5s' }}>
|
| 266 |
+
<Button
|
| 267 |
+
asChild
|
| 268 |
+
size="xl"
|
| 269 |
+
className="group relative overflow-hidden morphing-bg text-primary-foreground font-bold text-lg px-10 py-7 rounded-2xl breathing-glow ripple-button shake-hover"
|
| 270 |
+
>
|
| 271 |
<Link href="/quote">
|
| 272 |
+
<span className="relative z-10 flex items-center gap-2">
|
| 273 |
+
Launch Your Project
|
| 274 |
+
<Rocket className="h-5 w-5 transition-transform group-hover:translate-x-1 group-hover:-translate-y-1 group-hover:scale-125" suppressHydrationWarning />
|
| 275 |
</span>
|
| 276 |
</Link>
|
| 277 |
</Button>
|
| 278 |
+
<Button
|
| 279 |
+
asChild
|
| 280 |
+
variant="outline"
|
| 281 |
+
size="xl"
|
| 282 |
+
className="group glass-extreme font-bold text-lg px-10 py-7 rounded-2xl border-2 border-primary/30 hover:border-primary breathing-glow"
|
| 283 |
+
>
|
| 284 |
<Link href="/portfolio">
|
| 285 |
+
<span className="flex items-center gap-2">
|
| 286 |
+
Explore Our Work
|
| 287 |
+
<ArrowRight className="h-5 w-5 transition-transform group-hover:translate-x-2" suppressHydrationWarning />
|
| 288 |
</span>
|
| 289 |
</Link>
|
| 290 |
</Button>
|
| 291 |
</div>
|
| 292 |
|
| 293 |
+
{/* Extreme Statistics */}
|
| 294 |
+
<div className="mt-28 grid grid-cols-1 sm:grid-cols-3 gap-8 w-full max-w-5xl">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 295 |
{[
|
| 296 |
+
{ value: "50+", label: "Projects Delivered", icon: Rocket, color: "from-blue-500 to-cyan-400" },
|
| 297 |
+
{ value: "98%", label: "Client Satisfaction", icon: Sparkles, color: "from-purple-500 to-pink-400" },
|
| 298 |
+
{ value: "5+", label: "Years of Excellence", icon: Zap, color: "from-amber-500 to-orange-400" },
|
| 299 |
].map((stat, i) => (
|
| 300 |
<div
|
| 301 |
key={stat.label}
|
| 302 |
+
className="group slide-up-fade"
|
| 303 |
+
style={{ animationDelay: `${0.6 + i * 0.1}s` }}
|
| 304 |
>
|
| 305 |
+
<div className="relative">
|
| 306 |
+
{/* Glow ring on hover */}
|
| 307 |
+
<div className="absolute -inset-2 rounded-[2rem] opacity-0 group-hover:opacity-100 transition-opacity duration-500">
|
| 308 |
+
<div className={`absolute inset-0 rounded-[2rem] bg-gradient-to-r ${stat.color} opacity-20 blur-xl`} />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
</div>
|
| 310 |
|
| 311 |
+
<div className="relative glass-extreme rounded-[2rem] p-10 transition-all duration-500 group-hover:scale-105 group-hover:-translate-y-2 floating-island spotlight-follow">
|
| 312 |
+
{/* Icon */}
|
| 313 |
+
<div className={`inline-flex p-4 rounded-2xl bg-gradient-to-br ${stat.color} mb-6 breathing-glow`}>
|
| 314 |
+
<stat.icon className="h-8 w-8 text-white" suppressHydrationWarning />
|
| 315 |
+
</div>
|
| 316 |
+
|
| 317 |
+
{/* Value */}
|
| 318 |
+
<div className="text-5xl md:text-6xl font-black mb-3">
|
| 319 |
+
<span className="holographic">{stat.value}</span>
|
| 320 |
+
</div>
|
| 321 |
|
| 322 |
+
{/* Label */}
|
| 323 |
+
<p className="text-base text-muted-foreground font-medium dynamic-underline">
|
| 324 |
+
{stat.label}
|
| 325 |
+
</p>
|
| 326 |
+
</div>
|
| 327 |
</div>
|
| 328 |
</div>
|
| 329 |
))}
|
|
|
|
| 330 |
</div>
|
| 331 |
|
| 332 |
{/* Scroll indicator */}
|
| 333 |
+
<div className="absolute bottom-10 left-1/2 -translate-x-1/2 bounce-in" style={{ animationDelay: '1s' }}>
|
| 334 |
+
<div
|
| 335 |
+
className="scroll-indicator cursor-pointer hover:scale-125 transition-transform breathing-glow"
|
| 336 |
+
onClick={() => {
|
| 337 |
+
window.scrollTo({ top: window.innerHeight, behavior: 'smooth' })
|
| 338 |
+
}}
|
| 339 |
+
/>
|
| 340 |
</div>
|
| 341 |
</div>
|
| 342 |
|
| 343 |
+
{/* Gradient overlays */}
|
| 344 |
+
<div className="absolute bottom-0 left-0 right-0 h-32 bg-gradient-to-t from-background to-transparent pointer-events-none" />
|
| 345 |
+
<div className="absolute top-0 left-0 right-0 h-20 bg-gradient-to-b from-background/80 to-transparent pointer-events-none" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 346 |
</section>
|
| 347 |
)
|
| 348 |
}
|
components/home/ServicesOverview.tsx
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
"use client"
|
| 2 |
|
| 3 |
import { Card, CardContent, CardHeader } from "@/components/ui/card"
|
| 4 |
-
import { Code, Palette, Smartphone, LineChart, ArrowUpRight, Sparkles } from "lucide-react"
|
| 5 |
import Link from "next/link"
|
| 6 |
import { useRef, useState, useEffect } from "react"
|
| 7 |
|
|
@@ -45,6 +45,7 @@ function ServiceCard({ service, index }: { service: typeof services[0]; index: n
|
|
| 45 |
const [rotateX, setRotateX] = useState(0)
|
| 46 |
const [rotateY, setRotateY] = useState(0)
|
| 47 |
const [isHovered, setIsHovered] = useState(false)
|
|
|
|
| 48 |
|
| 49 |
const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {
|
| 50 |
if (!cardRef.current) return
|
|
@@ -54,8 +55,12 @@ function ServiceCard({ service, index }: { service: typeof services[0]; index: n
|
|
| 54 |
const mouseX = e.clientX - centerX
|
| 55 |
const mouseY = e.clientY - centerY
|
| 56 |
|
| 57 |
-
setRotateX(-mouseY /
|
| 58 |
-
setRotateY(mouseX /
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
}
|
| 60 |
|
| 61 |
const handleMouseLeave = () => {
|
|
@@ -67,38 +72,54 @@ function ServiceCard({ service, index }: { service: typeof services[0]; index: n
|
|
| 67 |
return (
|
| 68 |
<div
|
| 69 |
ref={cardRef}
|
| 70 |
-
className="group relative h-full"
|
| 71 |
style={{
|
| 72 |
-
perspective: '
|
| 73 |
-
animationDelay: `${index * 0.
|
| 74 |
}}
|
| 75 |
>
|
| 76 |
<Link href="/services" aria-label={`Learn more about ${service.title}`} className="block h-full">
|
| 77 |
<div
|
| 78 |
-
className="relative h-full cursor-pointer transition-all duration-
|
| 79 |
style={{
|
| 80 |
-
transform: `rotateX(${rotateX}deg) rotateY(${rotateY}deg)`,
|
| 81 |
transformStyle: 'preserve-3d',
|
| 82 |
}}
|
| 83 |
onMouseMove={handleMouseMove}
|
| 84 |
onMouseEnter={() => setIsHovered(true)}
|
| 85 |
onMouseLeave={handleMouseLeave}
|
| 86 |
>
|
| 87 |
-
{/*
|
| 88 |
<div
|
| 89 |
-
className=
|
| 90 |
style={{
|
| 91 |
-
background: `linear-gradient(135deg, ${service.accentColor},
|
|
|
|
|
|
|
| 92 |
}}
|
| 93 |
/>
|
| 94 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
{/* Card */}
|
| 96 |
-
<Card className="relative h-full overflow-hidden glass-
|
| 97 |
-
{/* Animated gradient
|
| 98 |
<div
|
| 99 |
-
className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-
|
| 100 |
style={{
|
| 101 |
-
background: `linear-gradient(135deg, ${service.accentColor}
|
| 102 |
}}
|
| 103 |
/>
|
| 104 |
|
|
@@ -106,56 +127,82 @@ function ServiceCard({ service, index }: { service: typeof services[0]; index: n
|
|
| 106 |
<div
|
| 107 |
className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pointer-events-none"
|
| 108 |
style={{
|
| 109 |
-
background: `radial-gradient(
|
| 110 |
}}
|
| 111 |
/>
|
| 112 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 113 |
<CardHeader className="relative z-10 pb-4">
|
| 114 |
-
{/* Icon container */}
|
| 115 |
<div
|
| 116 |
-
className={`relative w-
|
| 117 |
style={{
|
| 118 |
-
background: `linear-gradient(135deg, ${service.accentColor}
|
| 119 |
-
boxShadow: isHovered ? `0
|
|
|
|
| 120 |
}}
|
| 121 |
>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
<service.icon
|
| 123 |
-
className="w-
|
| 124 |
-
style={{
|
|
|
|
|
|
|
|
|
|
| 125 |
suppressHydrationWarning
|
| 126 |
/>
|
| 127 |
|
| 128 |
{/* Sparkle effect on hover */}
|
| 129 |
<Sparkles
|
| 130 |
-
className="absolute -top-
|
| 131 |
suppressHydrationWarning
|
| 132 |
/>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 133 |
</div>
|
| 134 |
|
| 135 |
-
{/* Title with arrow */}
|
| 136 |
<h3 className="text-xl font-bold leading-tight flex items-center gap-2 group-hover:text-primary transition-colors duration-300">
|
| 137 |
-
{service.title}
|
| 138 |
<ArrowUpRight
|
| 139 |
-
className="h-
|
| 140 |
suppressHydrationWarning
|
| 141 |
/>
|
| 142 |
</h3>
|
| 143 |
</CardHeader>
|
| 144 |
|
| 145 |
<CardContent className="relative z-10">
|
| 146 |
-
<p className="text-base text-muted-foreground group-hover:text-foreground transition-colors duration-300 leading-relaxed mb-
|
| 147 |
{service.description}
|
| 148 |
</p>
|
| 149 |
|
| 150 |
-
{/* Feature tags */}
|
| 151 |
<div className="flex flex-wrap gap-2">
|
| 152 |
-
{service.features.map((feature) => (
|
| 153 |
<span
|
| 154 |
key={feature}
|
| 155 |
-
className="px-
|
| 156 |
style={{
|
| 157 |
-
background: `${service.accentColor}
|
| 158 |
color: service.accentColor,
|
|
|
|
|
|
|
| 159 |
}}
|
| 160 |
>
|
| 161 |
{feature}
|
|
@@ -166,7 +213,7 @@ function ServiceCard({ service, index }: { service: typeof services[0]; index: n
|
|
| 166 |
|
| 167 |
{/* Bottom gradient line */}
|
| 168 |
<div
|
| 169 |
-
className=
|
| 170 |
style={{
|
| 171 |
background: `linear-gradient(90deg, transparent, ${service.accentColor}, transparent)`,
|
| 172 |
}}
|
|
@@ -203,52 +250,65 @@ export function ServicesOverview() {
|
|
| 203 |
}, [])
|
| 204 |
|
| 205 |
return (
|
| 206 |
-
<section ref={sectionRef} className="py-
|
| 207 |
-
{/*
|
| 208 |
-
<div className="absolute inset-0
|
| 209 |
-
|
| 210 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
|
| 212 |
<div className="container relative z-10">
|
| 213 |
-
{/* Section header with
|
| 214 |
-
<div className={`text-center mb-
|
| 215 |
-
<div className="
|
| 216 |
-
<
|
| 217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
</div>
|
| 219 |
|
| 220 |
-
<h2 className="text-
|
| 221 |
-
Our <span className="
|
| 222 |
</h2>
|
| 223 |
|
| 224 |
-
<p className="text-
|
| 225 |
-
We offer a comprehensive range of
|
| 226 |
-
<span className="text-primary font-
|
| 227 |
-
|
|
|
|
|
|
|
| 228 |
</p>
|
| 229 |
</div>
|
| 230 |
|
| 231 |
-
{/* Services grid */}
|
| 232 |
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-
|
| 233 |
{services.map((service, i) => (
|
| 234 |
-
<
|
| 235 |
-
key={service.title}
|
| 236 |
-
className={`transition-all duration-700 ${isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-10'}`}
|
| 237 |
-
style={{ transitionDelay: `${i * 100}ms` }}
|
| 238 |
-
>
|
| 239 |
-
<ServiceCard service={service} index={i} />
|
| 240 |
-
</div>
|
| 241 |
))}
|
| 242 |
</div>
|
| 243 |
|
| 244 |
-
{/* Bottom CTA */}
|
| 245 |
-
<div className={`text-center mt-
|
| 246 |
-
<
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
|
|
|
|
|
|
| 252 |
</div>
|
| 253 |
</div>
|
| 254 |
</section>
|
|
|
|
| 1 |
"use client"
|
| 2 |
|
| 3 |
import { Card, CardContent, CardHeader } from "@/components/ui/card"
|
| 4 |
+
import { Code, Palette, Smartphone, LineChart, ArrowUpRight, Sparkles, Zap } from "lucide-react"
|
| 5 |
import Link from "next/link"
|
| 6 |
import { useRef, useState, useEffect } from "react"
|
| 7 |
|
|
|
|
| 45 |
const [rotateX, setRotateX] = useState(0)
|
| 46 |
const [rotateY, setRotateY] = useState(0)
|
| 47 |
const [isHovered, setIsHovered] = useState(false)
|
| 48 |
+
const [mousePos, setMousePos] = useState({ x: 50, y: 50 })
|
| 49 |
|
| 50 |
const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {
|
| 51 |
if (!cardRef.current) return
|
|
|
|
| 55 |
const mouseX = e.clientX - centerX
|
| 56 |
const mouseY = e.clientY - centerY
|
| 57 |
|
| 58 |
+
setRotateX(-mouseY / 8)
|
| 59 |
+
setRotateY(mouseX / 8)
|
| 60 |
+
setMousePos({
|
| 61 |
+
x: ((e.clientX - rect.left) / rect.width) * 100,
|
| 62 |
+
y: ((e.clientY - rect.top) / rect.height) * 100,
|
| 63 |
+
})
|
| 64 |
}
|
| 65 |
|
| 66 |
const handleMouseLeave = () => {
|
|
|
|
| 72 |
return (
|
| 73 |
<div
|
| 74 |
ref={cardRef}
|
| 75 |
+
className="group relative h-full slide-up-fade"
|
| 76 |
style={{
|
| 77 |
+
perspective: '1500px',
|
| 78 |
+
animationDelay: `${index * 0.15}s`,
|
| 79 |
}}
|
| 80 |
>
|
| 81 |
<Link href="/services" aria-label={`Learn more about ${service.title}`} className="block h-full">
|
| 82 |
<div
|
| 83 |
+
className="relative h-full cursor-pointer transition-all duration-500"
|
| 84 |
style={{
|
| 85 |
+
transform: `rotateX(${rotateX}deg) rotateY(${rotateY}deg) translateZ(10px)`,
|
| 86 |
transformStyle: 'preserve-3d',
|
| 87 |
}}
|
| 88 |
onMouseMove={handleMouseMove}
|
| 89 |
onMouseEnter={() => setIsHovered(true)}
|
| 90 |
onMouseLeave={handleMouseLeave}
|
| 91 |
>
|
| 92 |
+
{/* Extreme glow effect */}
|
| 93 |
<div
|
| 94 |
+
className={`absolute -inset-2 rounded-3xl transition-all duration-500 ${isHovered ? 'opacity-100' : 'opacity-0'}`}
|
| 95 |
style={{
|
| 96 |
+
background: `linear-gradient(135deg, ${service.accentColor}40, ${service.accentColor}20)`,
|
| 97 |
+
filter: 'blur(20px)',
|
| 98 |
+
transform: 'translateZ(-20px)',
|
| 99 |
}}
|
| 100 |
/>
|
| 101 |
|
| 102 |
+
{/* Energy rings */}
|
| 103 |
+
{isHovered && (
|
| 104 |
+
<>
|
| 105 |
+
<div
|
| 106 |
+
className="absolute -inset-4 rounded-3xl border-2 border-primary/20 energy-wave"
|
| 107 |
+
style={{ animationDelay: '0s' }}
|
| 108 |
+
/>
|
| 109 |
+
<div
|
| 110 |
+
className="absolute -inset-4 rounded-3xl border-2 border-primary/10 energy-wave"
|
| 111 |
+
style={{ animationDelay: '0.5s' }}
|
| 112 |
+
/>
|
| 113 |
+
</>
|
| 114 |
+
)}
|
| 115 |
+
|
| 116 |
{/* Card */}
|
| 117 |
+
<Card className="relative h-full overflow-hidden glass-extreme rounded-3xl border-0 transition-all duration-500">
|
| 118 |
+
{/* Animated gradient overlay */}
|
| 119 |
<div
|
| 120 |
+
className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-700"
|
| 121 |
style={{
|
| 122 |
+
background: `linear-gradient(135deg, ${service.accentColor}15 0%, transparent 50%, ${service.accentColor}10 100%)`,
|
| 123 |
}}
|
| 124 |
/>
|
| 125 |
|
|
|
|
| 127 |
<div
|
| 128 |
className="absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-300 pointer-events-none"
|
| 129 |
style={{
|
| 130 |
+
background: `radial-gradient(400px circle at ${mousePos.x}% ${mousePos.y}%, ${service.accentColor}25, transparent 50%)`,
|
| 131 |
}}
|
| 132 |
/>
|
| 133 |
|
| 134 |
+
{/* Scan line effect on hover */}
|
| 135 |
+
{isHovered && (
|
| 136 |
+
<div className="absolute inset-0 scan-line pointer-events-none opacity-50" />
|
| 137 |
+
)}
|
| 138 |
+
|
| 139 |
<CardHeader className="relative z-10 pb-4">
|
| 140 |
+
{/* Icon container with extreme effects */}
|
| 141 |
<div
|
| 142 |
+
className={`relative w-20 h-20 rounded-2xl flex items-center justify-center mb-6 transition-all duration-500 group-hover:scale-110 group-hover:rotate-6`}
|
| 143 |
style={{
|
| 144 |
+
background: `linear-gradient(135deg, ${service.accentColor}30, ${service.accentColor}10)`,
|
| 145 |
+
boxShadow: isHovered ? `0 15px 50px ${service.accentColor}40, inset 0 1px 0 ${service.accentColor}20` : 'none',
|
| 146 |
+
transform: `translateZ(30px)`,
|
| 147 |
}}
|
| 148 |
>
|
| 149 |
+
{/* Glow ring behind icon */}
|
| 150 |
+
<div
|
| 151 |
+
className={`absolute inset-0 rounded-2xl transition-all duration-500 ${isHovered ? 'scale-125 opacity-100' : 'scale-100 opacity-0'}`}
|
| 152 |
+
style={{
|
| 153 |
+
background: `radial-gradient(circle, ${service.accentColor}30, transparent 70%)`,
|
| 154 |
+
filter: 'blur(10px)',
|
| 155 |
+
}}
|
| 156 |
+
/>
|
| 157 |
+
|
| 158 |
<service.icon
|
| 159 |
+
className="w-10 h-10 transition-all duration-500"
|
| 160 |
+
style={{
|
| 161 |
+
color: service.accentColor,
|
| 162 |
+
filter: isHovered ? `drop-shadow(0 0 10px ${service.accentColor})` : 'none',
|
| 163 |
+
}}
|
| 164 |
suppressHydrationWarning
|
| 165 |
/>
|
| 166 |
|
| 167 |
{/* Sparkle effect on hover */}
|
| 168 |
<Sparkles
|
| 169 |
+
className="absolute -top-2 -right-2 w-5 h-5 text-primary opacity-0 group-hover:opacity-100 transition-all duration-500 group-hover:scale-125 electric-glow"
|
| 170 |
suppressHydrationWarning
|
| 171 |
/>
|
| 172 |
+
|
| 173 |
+
{/* Corner accents */}
|
| 174 |
+
<div
|
| 175 |
+
className={`absolute -top-1 -left-1 w-3 h-3 rounded-full transition-all duration-500 ${isHovered ? 'scale-100 opacity-100' : 'scale-0 opacity-0'}`}
|
| 176 |
+
style={{ background: service.accentColor, boxShadow: `0 0 10px ${service.accentColor}` }}
|
| 177 |
+
/>
|
| 178 |
</div>
|
| 179 |
|
| 180 |
+
{/* Title with animated arrow */}
|
| 181 |
<h3 className="text-xl font-bold leading-tight flex items-center gap-2 group-hover:text-primary transition-colors duration-300">
|
| 182 |
+
<span className="dynamic-underline">{service.title}</span>
|
| 183 |
<ArrowUpRight
|
| 184 |
+
className="h-5 w-5 opacity-0 -translate-x-3 -translate-y-3 group-hover:opacity-100 group-hover:translate-x-0 group-hover:translate-y-0 transition-all duration-500 text-primary"
|
| 185 |
suppressHydrationWarning
|
| 186 |
/>
|
| 187 |
</h3>
|
| 188 |
</CardHeader>
|
| 189 |
|
| 190 |
<CardContent className="relative z-10">
|
| 191 |
+
<p className="text-base text-muted-foreground group-hover:text-foreground/80 transition-colors duration-300 leading-relaxed mb-5">
|
| 192 |
{service.description}
|
| 193 |
</p>
|
| 194 |
|
| 195 |
+
{/* Feature tags with extreme hover effects */}
|
| 196 |
<div className="flex flex-wrap gap-2">
|
| 197 |
+
{service.features.map((feature, i) => (
|
| 198 |
<span
|
| 199 |
key={feature}
|
| 200 |
+
className="px-4 py-1.5 rounded-full text-xs font-semibold transition-all duration-500 group-hover:scale-105"
|
| 201 |
style={{
|
| 202 |
+
background: `${service.accentColor}20`,
|
| 203 |
color: service.accentColor,
|
| 204 |
+
animationDelay: `${i * 0.1}s`,
|
| 205 |
+
boxShadow: isHovered ? `0 4px 15px ${service.accentColor}20` : 'none',
|
| 206 |
}}
|
| 207 |
>
|
| 208 |
{feature}
|
|
|
|
| 213 |
|
| 214 |
{/* Bottom gradient line */}
|
| 215 |
<div
|
| 216 |
+
className={`absolute bottom-0 left-0 right-0 h-1 transition-all duration-500 ${isHovered ? 'opacity-100' : 'opacity-0'}`}
|
| 217 |
style={{
|
| 218 |
background: `linear-gradient(90deg, transparent, ${service.accentColor}, transparent)`,
|
| 219 |
}}
|
|
|
|
| 250 |
}, [])
|
| 251 |
|
| 252 |
return (
|
| 253 |
+
<section ref={sectionRef} className="py-32 bg-background relative overflow-hidden" id="services">
|
| 254 |
+
{/* Extreme background effects */}
|
| 255 |
+
<div className="absolute inset-0">
|
| 256 |
+
<div className="absolute inset-0 morphing-bg opacity-20" />
|
| 257 |
+
<div className="absolute inset-0 cyber-grid opacity-10" />
|
| 258 |
+
|
| 259 |
+
{/* Floating orbs */}
|
| 260 |
+
<div className="absolute top-20 left-20 w-72 h-72 bg-blue-500/10 rounded-full blur-3xl liquid-blob" />
|
| 261 |
+
<div className="absolute bottom-20 right-20 w-96 h-96 bg-purple-500/10 rounded-full blur-3xl liquid-blob" style={{ animationDelay: '-10s' }} />
|
| 262 |
+
<div className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[600px] h-[600px] bg-primary/5 rounded-full blur-3xl plasma-effect" />
|
| 263 |
+
</div>
|
| 264 |
+
|
| 265 |
+
{/* Noise overlay */}
|
| 266 |
+
<div className="absolute inset-0 noise-overlay opacity-30" />
|
| 267 |
|
| 268 |
<div className="container relative z-10">
|
| 269 |
+
{/* Section header with extreme animations */}
|
| 270 |
+
<div className={`text-center mb-20 transition-all duration-1000 ${isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-20'}`}>
|
| 271 |
+
<div className="bounce-in mb-8">
|
| 272 |
+
<div className="relative inline-flex items-center gap-3 px-6 py-3 rounded-full glass-extreme shake-hover">
|
| 273 |
+
<div className="relative">
|
| 274 |
+
<span className="absolute inset-0 rounded-full bg-primary animate-ping opacity-75" />
|
| 275 |
+
<Zap className="relative h-5 w-5 text-primary" suppressHydrationWarning />
|
| 276 |
+
</div>
|
| 277 |
+
<span className="text-sm font-bold dynamic-underline">What We Do</span>
|
| 278 |
+
<Sparkles className="h-5 w-5 text-primary electric-glow" suppressHydrationWarning />
|
| 279 |
+
</div>
|
| 280 |
</div>
|
| 281 |
|
| 282 |
+
<h2 className="text-5xl md:text-6xl lg:text-7xl font-black mb-8 tracking-tight">
|
| 283 |
+
Our <span className="holographic">Expertise</span>
|
| 284 |
</h2>
|
| 285 |
|
| 286 |
+
<p className="text-xl md:text-2xl text-muted-foreground max-w-3xl mx-auto leading-relaxed">
|
| 287 |
+
We offer a comprehensive range of{" "}
|
| 288 |
+
<span className="text-primary font-bold glow-text">digital services</span>{" "}
|
| 289 |
+
to help your business{" "}
|
| 290 |
+
<span className="holographic font-bold">grow</span> and{" "}
|
| 291 |
+
<span className="holographic font-bold">succeed</span>.
|
| 292 |
</p>
|
| 293 |
</div>
|
| 294 |
|
| 295 |
+
{/* Services grid with extreme cards */}
|
| 296 |
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
|
| 297 |
{services.map((service, i) => (
|
| 298 |
+
<ServiceCard key={service.title} service={service} index={i} />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 299 |
))}
|
| 300 |
</div>
|
| 301 |
|
| 302 |
+
{/* Bottom CTA with extreme effects */}
|
| 303 |
+
<div className={`text-center mt-20 transition-all duration-1000 delay-500 ${isVisible ? 'opacity-100 translate-y-0' : 'opacity-0 translate-y-20'}`}>
|
| 304 |
+
<div className="glass-extreme inline-block px-10 py-5 rounded-2xl breathing-glow">
|
| 305 |
+
<p className="text-lg text-muted-foreground">
|
| 306 |
+
Need something custom?{" "}
|
| 307 |
+
<Link href="/contact" className="text-primary font-bold dynamic-underline">
|
| 308 |
+
Let's discuss your project
|
| 309 |
+
</Link>
|
| 310 |
+
</p>
|
| 311 |
+
</div>
|
| 312 |
</div>
|
| 313 |
</div>
|
| 314 |
</section>
|