|
|
@@ -2,9 +2,11 @@
|
|
|
<div id="section1" class="section hero-section">
|
|
|
<div class="hero-bg" aria-hidden="true">
|
|
|
<div class="hero-bg-gradient" />
|
|
|
+ <div class="hero-bg-shimmer" />
|
|
|
<div class="hero-bg-orb hero-bg-orb--1" />
|
|
|
<div class="hero-bg-orb hero-bg-orb--2" />
|
|
|
<div class="hero-bg-orb hero-bg-orb--3" />
|
|
|
+ <div class="hero-bg-orb hero-bg-orb--4" />
|
|
|
</div>
|
|
|
<Header color="#1b3022" />
|
|
|
<div class="hero-inner">
|
|
|
@@ -31,6 +33,7 @@
|
|
|
<div id="section2" class="section features-wrap">
|
|
|
<div class="features-bg" aria-hidden="true">
|
|
|
<div class="features-bg-gradient" />
|
|
|
+ <div class="features-bg-orb" />
|
|
|
</div>
|
|
|
<Section2 />
|
|
|
</div>
|
|
|
@@ -67,8 +70,9 @@ const scrollToSection = (sectionId) => {
|
|
|
|
|
|
.hero-section {
|
|
|
display: flex;
|
|
|
+ user-select: none;
|
|
|
flex-direction: column;
|
|
|
- background: linear-gradient(165deg, #e6f8ec 0%, #d8f3e2 45%, #c5ecd5 100%);
|
|
|
+ background: @home-gradient-pale;
|
|
|
overflow: hidden;
|
|
|
}
|
|
|
|
|
|
@@ -84,48 +88,82 @@ const scrollToSection = (sectionId) => {
|
|
|
position: absolute;
|
|
|
inset: 0;
|
|
|
background: linear-gradient(
|
|
|
- 145deg,
|
|
|
- fade(@home-gradient-pale, 85%) 0%,
|
|
|
- fade(@home-gradient-mint, 75%) 40%,
|
|
|
- fade(@home-gradient-sage, 68%) 100%
|
|
|
+ 125deg,
|
|
|
+ @home-gradient-pale 0%,
|
|
|
+ fade(@home-gradient-mint, 92%) 16%,
|
|
|
+ fade(@home-gradient-teal, 78%) 34%,
|
|
|
+ fade(@home-gradient-green, 82%) 52%,
|
|
|
+ fade(@home-gradient-lime, 55%) 68%,
|
|
|
+ fade(@home-gradient-mint, 88%) 84%,
|
|
|
+ fade(@home-gradient-emerald, 72%) 100%
|
|
|
);
|
|
|
- background-size: 180% 180%;
|
|
|
- animation: heroGradientFlow 14s ease-in-out infinite alternate;
|
|
|
+ background-size: 320% 320%;
|
|
|
+ animation: heroGradientFlow 12s ease-in-out infinite;
|
|
|
+}
|
|
|
+
|
|
|
+.hero-bg-shimmer {
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ left: 50%;
|
|
|
+ width: 140%;
|
|
|
+ height: 140%;
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
+ background: conic-gradient(
|
|
|
+ from 0deg at 50% 50%,
|
|
|
+ fade(@home-gradient-teal, 0%) 0deg,
|
|
|
+ fade(@home-gradient-aqua, 28%) 72deg,
|
|
|
+ fade(@home-gradient-lime, 18%) 144deg,
|
|
|
+ fade(@home-gradient-emerald, 24%) 216deg,
|
|
|
+ fade(@home-gradient-mint, 14%) 288deg,
|
|
|
+ fade(@home-gradient-teal, 0%) 360deg
|
|
|
+ );
|
|
|
+ opacity: 0.55;
|
|
|
+ filter: blur(48px);
|
|
|
+ animation: shimmerRotate 18s linear infinite;
|
|
|
}
|
|
|
|
|
|
.hero-bg-orb {
|
|
|
position: absolute;
|
|
|
border-radius: 50%;
|
|
|
- filter: blur(56px);
|
|
|
- opacity: 0.42;
|
|
|
+ filter: blur(64px);
|
|
|
+ opacity: 0.55;
|
|
|
will-change: transform, opacity;
|
|
|
}
|
|
|
|
|
|
.hero-bg-orb--1 {
|
|
|
- width: clamp(220px, 34vw, 460px);
|
|
|
- height: clamp(220px, 34vw, 460px);
|
|
|
- top: -12%;
|
|
|
- right: -4%;
|
|
|
- background: radial-gradient(circle, fade(@home-gradient-deep, 58%) 0%, fade(@home-gradient-green, 24%) 46%, transparent 76%);
|
|
|
- animation: orbFloatOne 12s ease-in-out infinite;
|
|
|
+ width: clamp(260px, 38vw, 520px);
|
|
|
+ height: clamp(260px, 38vw, 520px);
|
|
|
+ top: -14%;
|
|
|
+ right: -8%;
|
|
|
+ background: radial-gradient(circle, fade(@home-gradient-emerald, 72%) 0%, fade(@home-gradient-green, 38%) 42%, transparent 72%);
|
|
|
+ animation: orbFloatOne 10s ease-in-out infinite;
|
|
|
}
|
|
|
|
|
|
.hero-bg-orb--2 {
|
|
|
- width: clamp(220px, 30vw, 380px);
|
|
|
- height: clamp(220px, 30vw, 380px);
|
|
|
- bottom: 5%;
|
|
|
- left: -10%;
|
|
|
- background: radial-gradient(circle, fade(@home-gradient-teal, 54%) 0%, fade(@home-gradient-sage, 22%) 52%, transparent 76%);
|
|
|
- animation: orbFloatTwo 15s ease-in-out infinite;
|
|
|
+ width: clamp(240px, 34vw, 420px);
|
|
|
+ height: clamp(240px, 34vw, 420px);
|
|
|
+ bottom: 0%;
|
|
|
+ left: -12%;
|
|
|
+ background: radial-gradient(circle, fade(@home-gradient-aqua, 68%) 0%, fade(@home-gradient-teal, 32%) 48%, transparent 74%);
|
|
|
+ animation: orbFloatTwo 13s ease-in-out infinite;
|
|
|
}
|
|
|
|
|
|
.hero-bg-orb--3 {
|
|
|
- width: clamp(180px, 22vw, 300px);
|
|
|
- height: clamp(180px, 22vw, 300px);
|
|
|
- top: 34%;
|
|
|
- left: 30%;
|
|
|
- background: radial-gradient(circle, fade(#fff, 80%) 0%, fade(@home-gradient-mint, 22%) 45%, transparent 76%);
|
|
|
- animation: orbFloatThree 11s ease-in-out infinite;
|
|
|
+ width: clamp(200px, 26vw, 340px);
|
|
|
+ height: clamp(200px, 26vw, 340px);
|
|
|
+ top: 28%;
|
|
|
+ left: 26%;
|
|
|
+ background: radial-gradient(circle, fade(#fff, 92%) 0%, fade(@home-gradient-lime, 36%) 38%, transparent 72%);
|
|
|
+ animation: orbFloatThree 9s ease-in-out infinite;
|
|
|
+}
|
|
|
+
|
|
|
+.hero-bg-orb--4 {
|
|
|
+ width: clamp(180px, 24vw, 320px);
|
|
|
+ height: clamp(180px, 24vw, 320px);
|
|
|
+ bottom: 18%;
|
|
|
+ right: 12%;
|
|
|
+ background: radial-gradient(circle, fade(@home-gradient-lime, 58%) 0%, fade(@home-gradient-deep, 28%) 50%, transparent 76%);
|
|
|
+ animation: orbFloatFour 11s ease-in-out infinite;
|
|
|
}
|
|
|
|
|
|
.hero-inner {
|
|
|
@@ -145,6 +183,7 @@ const scrollToSection = (sectionId) => {
|
|
|
|
|
|
.hero-visual {
|
|
|
flex: 0 0 auto;
|
|
|
+ user-select: none;
|
|
|
max-width: min(44vw, 460px);
|
|
|
}
|
|
|
|
|
|
@@ -193,11 +232,27 @@ const scrollToSection = (sectionId) => {
|
|
|
position: absolute;
|
|
|
inset: 0;
|
|
|
background: linear-gradient(
|
|
|
- 160deg,
|
|
|
- fade(@home-bg-page, 98%) 0%,
|
|
|
- fade(@home-gradient-mint, 32%) 48%,
|
|
|
- fade(@home-gradient-teal, 22%) 100%
|
|
|
+ 145deg,
|
|
|
+ fade(@home-bg-page, 96%) 0%,
|
|
|
+ fade(@home-gradient-mint, 48%) 35%,
|
|
|
+ fade(@home-gradient-teal, 38%) 65%,
|
|
|
+ fade(@home-gradient-aqua, 28%) 100%
|
|
|
);
|
|
|
+ background-size: 240% 240%;
|
|
|
+ animation: featuresGradientFlow 16s ease-in-out infinite alternate;
|
|
|
+}
|
|
|
+
|
|
|
+.features-bg-orb {
|
|
|
+ position: absolute;
|
|
|
+ width: clamp(280px, 42vw, 560px);
|
|
|
+ height: clamp(280px, 42vw, 560px);
|
|
|
+ top: -20%;
|
|
|
+ right: -15%;
|
|
|
+ border-radius: 50%;
|
|
|
+ background: radial-gradient(circle, fade(@home-gradient-teal, 42%) 0%, fade(@home-gradient-mint, 18%) 50%, transparent 72%);
|
|
|
+ filter: blur(72px);
|
|
|
+ opacity: 0.5;
|
|
|
+ animation: featuresOrbFloat 14s ease-in-out infinite;
|
|
|
}
|
|
|
|
|
|
.features-wrap > :not(.features-bg) {
|
|
|
@@ -238,40 +293,74 @@ const scrollToSection = (sectionId) => {
|
|
|
|
|
|
@keyframes heroGradientFlow {
|
|
|
0% {
|
|
|
- background-position: 0% 50%;
|
|
|
- filter: saturate(1);
|
|
|
+ background-position: 0% 0%;
|
|
|
+ filter: saturate(1) hue-rotate(0deg);
|
|
|
}
|
|
|
- 50% {
|
|
|
- background-position: 50% 45%;
|
|
|
- filter: saturate(1.08);
|
|
|
+ 33% {
|
|
|
+ background-position: 100% 0%;
|
|
|
+ filter: saturate(1.12) hue-rotate(6deg);
|
|
|
+ }
|
|
|
+ 66% {
|
|
|
+ background-position: 100% 100%;
|
|
|
+ filter: saturate(1.18) hue-rotate(-4deg);
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ background-position: 0% 100%;
|
|
|
+ filter: saturate(1.08) hue-rotate(0deg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes shimmerRotate {
|
|
|
+ from {
|
|
|
+ transform: translate(-50%, -50%) rotate(0deg);
|
|
|
+ }
|
|
|
+ to {
|
|
|
+ transform: translate(-50%, -50%) rotate(360deg);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes featuresGradientFlow {
|
|
|
+ 0% {
|
|
|
+ background-position: 0% 50%;
|
|
|
}
|
|
|
100% {
|
|
|
background-position: 100% 50%;
|
|
|
- filter: saturate(1.16);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-@keyframes orbFloatOne {
|
|
|
+@keyframes featuresOrbFloat {
|
|
|
0%,
|
|
|
100% {
|
|
|
transform: translate3d(0, 0, 0) scale(1);
|
|
|
- opacity: 0.46;
|
|
|
+ opacity: 0.42;
|
|
|
}
|
|
|
50% {
|
|
|
- transform: translate3d(-18px, 22px, 0) scale(1.08);
|
|
|
+ transform: translate3d(-28px, 24px, 0) scale(1.12);
|
|
|
opacity: 0.62;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+@keyframes orbFloatOne {
|
|
|
+ 0%,
|
|
|
+ 100% {
|
|
|
+ transform: translate3d(0, 0, 0) scale(1);
|
|
|
+ opacity: 0.52;
|
|
|
+ }
|
|
|
+ 50% {
|
|
|
+ transform: translate3d(-36px, 32px, 0) scale(1.14);
|
|
|
+ opacity: 0.78;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
@keyframes orbFloatTwo {
|
|
|
0%,
|
|
|
100% {
|
|
|
transform: translate3d(0, 0, 0) scale(1);
|
|
|
- opacity: 0.4;
|
|
|
+ opacity: 0.48;
|
|
|
}
|
|
|
50% {
|
|
|
- transform: translate3d(22px, -16px, 0) scale(1.1);
|
|
|
- opacity: 0.56;
|
|
|
+ transform: translate3d(40px, -28px, 0) scale(1.16);
|
|
|
+ opacity: 0.72;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -279,11 +368,37 @@ const scrollToSection = (sectionId) => {
|
|
|
0%,
|
|
|
100% {
|
|
|
transform: translate3d(0, 0, 0) scale(1);
|
|
|
- opacity: 0.36;
|
|
|
+ opacity: 0.44;
|
|
|
+ }
|
|
|
+ 50% {
|
|
|
+ transform: translate3d(-24px, -22px, 0) scale(1.18);
|
|
|
+ opacity: 0.68;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@keyframes orbFloatFour {
|
|
|
+ 0%,
|
|
|
+ 100% {
|
|
|
+ transform: translate3d(0, 0, 0) scale(1);
|
|
|
+ opacity: 0.4;
|
|
|
}
|
|
|
50% {
|
|
|
- transform: translate3d(-12px, -14px, 0) scale(1.14);
|
|
|
- opacity: 0.5;
|
|
|
+ transform: translate3d(20px, 18px, 0) scale(1.1);
|
|
|
+ opacity: 0.64;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@media (prefers-reduced-motion: reduce) {
|
|
|
+ .hero-bg-gradient,
|
|
|
+ .hero-bg-shimmer,
|
|
|
+ .hero-bg-orb,
|
|
|
+ .features-bg-gradient,
|
|
|
+ .features-bg-orb {
|
|
|
+ animation: none;
|
|
|
+ }
|
|
|
+
|
|
|
+ .hero-bg-shimmer {
|
|
|
+ opacity: 0.35;
|
|
|
}
|
|
|
}
|
|
|
</style>
|