This commit is contained in:
parent
4ca1a4d497
commit
6bdb2204b3
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -24,8 +24,6 @@
|
||||||
|
|
||||||
# misc
|
# misc
|
||||||
.DS_Store
|
.DS_Store
|
||||||
.deploy-log.txt
|
|
||||||
.cursor-git-deploy.sh
|
|
||||||
*.pem
|
*.pem
|
||||||
.env*.local
|
.env*.local
|
||||||
.env
|
.env
|
||||||
|
|
|
||||||
|
|
@ -206,43 +206,6 @@
|
||||||
.marquee-winners {
|
.marquee-winners {
|
||||||
animation: marquee 55s linear infinite;
|
animation: marquee 55s linear infinite;
|
||||||
}
|
}
|
||||||
.marquee-winners:hover {
|
|
||||||
animation-play-state: paused;
|
|
||||||
}
|
|
||||||
.marquee-winners-paused {
|
|
||||||
animation-play-state: paused !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes winner-impact-pulse {
|
|
||||||
0%,
|
|
||||||
100% {
|
|
||||||
transform: scale(1);
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
transform: scale(1.06);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes winner-impact-glow {
|
|
||||||
0%,
|
|
||||||
100% {
|
|
||||||
color: #0d3d26;
|
|
||||||
text-shadow: 0 0 0 transparent;
|
|
||||||
}
|
|
||||||
50% {
|
|
||||||
color: #1a5c38;
|
|
||||||
text-shadow: 0 0 14px rgba(74, 173, 110, 0.45);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.winner-impact-value {
|
|
||||||
display: block;
|
|
||||||
max-width: 50%;
|
|
||||||
margin-inline: auto;
|
|
||||||
animation:
|
|
||||||
winner-impact-pulse 2.4s ease-in-out infinite,
|
|
||||||
winner-impact-glow 2.4s ease-in-out infinite;
|
|
||||||
}
|
|
||||||
@keyframes marquee {
|
@keyframes marquee {
|
||||||
from {
|
from {
|
||||||
transform: translateX(0);
|
transform: translateX(0);
|
||||||
|
|
@ -256,9 +219,6 @@
|
||||||
.marquee-winners {
|
.marquee-winners {
|
||||||
animation: none;
|
animation: none;
|
||||||
}
|
}
|
||||||
.winner-impact-value {
|
|
||||||
animation: none;
|
|
||||||
}
|
|
||||||
.backdrop-bloom-a,
|
.backdrop-bloom-a,
|
||||||
.backdrop-bloom-b,
|
.backdrop-bloom-b,
|
||||||
.valley-pan-slow,
|
.valley-pan-slow,
|
||||||
|
|
@ -482,23 +442,23 @@
|
||||||
/* ─── mainwhite.svg: hero (green tint) · footer (white on green) ─── */
|
/* ─── mainwhite.svg: hero (green tint) · footer (white on green) ─── */
|
||||||
.topo-tone-light .topo-pattern-asset {
|
.topo-tone-light .topo-pattern-asset {
|
||||||
mix-blend-mode: multiply;
|
mix-blend-mode: multiply;
|
||||||
filter: sepia(0.35) saturate(2.6) hue-rotate(92deg) brightness(0.92) contrast(1.2);
|
filter: sepia(0.35) saturate(2.2) hue-rotate(92deg) brightness(0.96) contrast(0.92);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Hero — gentle fill in/out on contour lines (no pan, shake, or slide) */
|
/* Hero — soft topography lines, gentle opacity breathe only */
|
||||||
.rift-hero-topo .topo-hero-pattern-img {
|
.rift-hero-topo .topo-hero-pattern-img {
|
||||||
opacity: 0.42;
|
opacity: 0.26;
|
||||||
mix-blend-mode: multiply;
|
mix-blend-mode: multiply;
|
||||||
filter: sepia(0.35) saturate(2.6) hue-rotate(92deg) brightness(0.92) contrast(1.2);
|
filter: sepia(0.3) saturate(1.9) hue-rotate(92deg) brightness(0.98) contrast(0.88);
|
||||||
transform: scale(1.06);
|
transform: scale(1.06);
|
||||||
object-position: 50% 50%;
|
object-position: 50% 50%;
|
||||||
animation: topo-hero-fill-breathe 9s ease-in-out infinite;
|
animation: topo-hero-fill-breathe 9s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo .topo-hero-water-flow-img {
|
.rift-hero-topo .topo-hero-water-flow-img {
|
||||||
opacity: 0.2;
|
opacity: 0.12;
|
||||||
mix-blend-mode: multiply;
|
mix-blend-mode: multiply;
|
||||||
filter: sepia(0.35) saturate(2.8) hue-rotate(92deg) brightness(1.05) contrast(1.15);
|
filter: sepia(0.3) saturate(1.8) hue-rotate(92deg) brightness(1.02) contrast(0.85);
|
||||||
transform: scale(1.06);
|
transform: scale(1.06);
|
||||||
object-position: 50% 50%;
|
object-position: 50% 50%;
|
||||||
animation: topo-hero-fill-pulse 9s ease-in-out infinite;
|
animation: topo-hero-fill-pulse 9s ease-in-out infinite;
|
||||||
|
|
@ -520,12 +480,12 @@
|
||||||
.topo-hero-channel-glow {
|
.topo-hero-channel-glow {
|
||||||
background: radial-gradient(
|
background: radial-gradient(
|
||||||
ellipse 70% 50% at 50% 58%,
|
ellipse 70% 50% at 50% 58%,
|
||||||
rgba(120, 200, 160, 0.2) 0%,
|
rgba(120, 200, 160, 0.1) 0%,
|
||||||
rgba(45, 122, 82, 0.08) 50%,
|
rgba(45, 122, 82, 0.04) 50%,
|
||||||
transparent 75%
|
transparent 75%
|
||||||
);
|
);
|
||||||
mix-blend-mode: soft-light;
|
mix-blend-mode: soft-light;
|
||||||
opacity: 0.55;
|
opacity: 0.34;
|
||||||
animation: topo-hero-glow-breathe 13s ease-in-out infinite;
|
animation: topo-hero-glow-breathe 13s ease-in-out infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -542,62 +502,66 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo--hover .topo-hero-water-flow-img {
|
.rift-hero-topo--hover .topo-hero-water-flow-img {
|
||||||
opacity: 0.3;
|
opacity: 0.18;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo--hover .topo-hero-water-shimmer {
|
.rift-hero-topo--hover .topo-hero-water-shimmer {
|
||||||
opacity: 0.62;
|
opacity: 0.42;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo--hover .topo-hero-channel-glow {
|
.rift-hero-topo--hover .topo-hero-channel-glow {
|
||||||
opacity: 0.68;
|
opacity: 0.44;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo--hover .topo-hero-water-spotlight {
|
.rift-hero-topo--hover .topo-hero-water-spotlight {
|
||||||
opacity: 0.85;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo--hover .topo-hero-pattern-img {
|
.rift-hero-topo--hover .topo-hero-pattern-img {
|
||||||
opacity: 0.5;
|
opacity: 0.32;
|
||||||
|
}
|
||||||
|
|
||||||
|
[data-section-hero] .topo-curvy-extend path {
|
||||||
|
stroke-opacity: 0.18 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes topo-hero-fill-breathe {
|
@keyframes topo-hero-fill-breathe {
|
||||||
0%,
|
0%,
|
||||||
100% {
|
100% {
|
||||||
opacity: 0.36;
|
opacity: 0.22;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
opacity: 0.5;
|
opacity: 0.3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes topo-hero-fill-pulse {
|
@keyframes topo-hero-fill-pulse {
|
||||||
0%,
|
0%,
|
||||||
100% {
|
100% {
|
||||||
opacity: 0.14;
|
opacity: 0.08;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
opacity: 0.28;
|
opacity: 0.16;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes topo-hero-shimmer-breathe {
|
@keyframes topo-hero-shimmer-breathe {
|
||||||
0%,
|
0%,
|
||||||
100% {
|
100% {
|
||||||
opacity: 0.38;
|
opacity: 0.26;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
opacity: 0.58;
|
opacity: 0.38;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes topo-hero-glow-breathe {
|
@keyframes topo-hero-glow-breathe {
|
||||||
0%,
|
0%,
|
||||||
100% {
|
100% {
|
||||||
opacity: 0.42;
|
opacity: 0.28;
|
||||||
}
|
}
|
||||||
50% {
|
50% {
|
||||||
opacity: 0.62;
|
opacity: 0.4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1163,7 +1127,7 @@
|
||||||
.rift-pulse-animate,
|
.rift-pulse-animate,
|
||||||
.rift-hero-topo .topo-hero-pattern-img {
|
.rift-hero-topo .topo-hero-pattern-img {
|
||||||
animation: none !important;
|
animation: none !important;
|
||||||
opacity: 0.44 !important;
|
opacity: 0.28 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rift-hero-topo .topo-hero-water-flow-img,
|
.rift-hero-topo .topo-hero-water-flow-img,
|
||||||
|
|
|
||||||
|
|
@ -31,13 +31,13 @@ export function FooterTopoPattern({ className }: Props) {
|
||||||
key={i}
|
key={i}
|
||||||
d={cell.d}
|
d={cell.d}
|
||||||
fill={cell.fill}
|
fill={cell.fill}
|
||||||
stroke="rgba(255,255,255,0.09)"
|
stroke="rgba(255,255,255,0.05)"
|
||||||
strokeWidth={0.14}
|
strokeWidth={0.12}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</svg>
|
</svg>
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 bg-gradient-to-t from-[#0d3d26]/35 via-transparent to-transparent"
|
className="absolute inset-0 bg-gradient-to-t from-[#0d3d26]/18 via-transparent to-transparent"
|
||||||
aria-hidden
|
aria-hidden
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,9 @@ import { cn } from "@/lib/utils";
|
||||||
const MESH_W = 140;
|
const MESH_W = 140;
|
||||||
const MESH_H = 100;
|
const MESH_H = 100;
|
||||||
|
|
||||||
const ROCK_TONES = ["#0d3d26", "#1a5c38", "#246b45", "#2f7a52", "#3d9a66", "#52b87a"] as const;
|
/** Narrow green range — low contrast between “stones” on section backgrounds */
|
||||||
const GROUT = "rgba(8, 38, 22, 0.42)";
|
const ROCK_TONES = ["#1a5c38", "#1d5f3c", "#216342", "#246845", "#286a48", "#2b6e4b"] as const;
|
||||||
|
const GROUT = "rgba(8, 38, 22, 0.2)";
|
||||||
|
|
||||||
const ROCK_MESH = buildVoronoiMesh(42, MESH_W, MESH_H, 0x475256, {
|
const ROCK_MESH = buildVoronoiMesh(42, MESH_W, MESH_H, 0x475256, {
|
||||||
siteGenerator: "poisson",
|
siteGenerator: "poisson",
|
||||||
|
|
@ -29,9 +30,9 @@ function rockFill(cell: VoronoiCell, index: number) {
|
||||||
const cx = cell.points.reduce((s, p) => s + p[0], 0) / cell.points.length;
|
const cx = cell.points.reduce((s, p) => s + p[0], 0) / cell.points.length;
|
||||||
const cy = cell.points.reduce((s, p) => s + p[1], 0) / cell.points.length;
|
const cy = cell.points.reduce((s, p) => s + p[1], 0) / cell.points.length;
|
||||||
const yNorm = cy / MESH_H;
|
const yNorm = cy / MESH_H;
|
||||||
const gradient = mixHex("#4aad6e", "#0d3d26", Math.min(1, yNorm * 0.85 + 0.08));
|
const gradient = mixHex("#2a6f4a", "#1a5c38", Math.min(1, yNorm * 0.45 + 0.25));
|
||||||
const tone = ROCK_TONES[(index * 11 + Math.floor(cx * 0.55)) % ROCK_TONES.length];
|
const tone = ROCK_TONES[(index * 11 + Math.floor(cx * 0.55)) % ROCK_TONES.length];
|
||||||
return mixHex(gradient, tone, 0.54);
|
return mixHex(gradient, tone, 0.38);
|
||||||
}
|
}
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
|
|
@ -82,12 +83,12 @@ export function RoundedRockVoronoiBackground({
|
||||||
<div className="absolute inset-0 opacity-[0.18] grain" aria-hidden />
|
<div className="absolute inset-0 opacity-[0.18] grain" aria-hidden />
|
||||||
{gradient && (
|
{gradient && (
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 bg-gradient-to-b from-[#4aad6e]/14 via-transparent to-[#0d3d26]/18"
|
className="absolute inset-0 bg-gradient-to-b from-[#2a6f4a]/8 via-transparent to-[#0d3d26]/10"
|
||||||
aria-hidden
|
aria-hidden
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<div
|
<div
|
||||||
className="absolute inset-0 bg-[radial-gradient(ellipse_85%_60%_at_20%_15%,rgba(13,61,38,0.2),transparent_65%)]"
|
className="absolute inset-0 bg-[radial-gradient(ellipse_85%_60%_at_20%_15%,rgba(13,61,38,0.1),transparent_65%)]"
|
||||||
aria-hidden
|
aria-hidden
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,11 @@
|
||||||
/** GRV greens for wavy interlocking footer tessellation. */
|
/** GRV greens for wavy interlocking footer tessellation. */
|
||||||
export const WAVY_TESS_PALETTE = [
|
export const WAVY_TESS_PALETTE = [
|
||||||
"#0d3d26",
|
|
||||||
"#1a5c38",
|
"#1a5c38",
|
||||||
"#256b45",
|
"#1d5f3c",
|
||||||
"#2d7a52",
|
"#216342",
|
||||||
"#3d9a66",
|
"#246845",
|
||||||
"#5cb87a",
|
"#286a48",
|
||||||
|
"#2b6e4b",
|
||||||
] as const;
|
] as const;
|
||||||
|
|
||||||
export type WavyTessCell = { d: string; fill: string };
|
export type WavyTessCell = { d: string; fill: string };
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user