-
Some checks failed
Deploy to Cloudflare Workers (OpenNext) / deploy (push) Has been cancelled

This commit is contained in:
“kirukib” 2026-05-22 11:14:01 +03:00
parent 4ca1a4d497
commit 6bdb2204b3
5 changed files with 42 additions and 79 deletions

2
.gitignore vendored
View File

@ -24,8 +24,6 @@
# misc
.DS_Store
.deploy-log.txt
.cursor-git-deploy.sh
*.pem
.env*.local
.env

View File

@ -206,43 +206,6 @@
.marquee-winners {
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 {
from {
transform: translateX(0);
@ -256,9 +219,6 @@
.marquee-winners {
animation: none;
}
.winner-impact-value {
animation: none;
}
.backdrop-bloom-a,
.backdrop-bloom-b,
.valley-pan-slow,
@ -482,23 +442,23 @@
/* ─── mainwhite.svg: hero (green tint) · footer (white on green) ─── */
.topo-tone-light .topo-pattern-asset {
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 {
opacity: 0.42;
opacity: 0.26;
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);
object-position: 50% 50%;
animation: topo-hero-fill-breathe 9s ease-in-out infinite;
}
.rift-hero-topo .topo-hero-water-flow-img {
opacity: 0.2;
opacity: 0.12;
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);
object-position: 50% 50%;
animation: topo-hero-fill-pulse 9s ease-in-out infinite;
@ -520,12 +480,12 @@
.topo-hero-channel-glow {
background: radial-gradient(
ellipse 70% 50% at 50% 58%,
rgba(120, 200, 160, 0.2) 0%,
rgba(45, 122, 82, 0.08) 50%,
rgba(120, 200, 160, 0.1) 0%,
rgba(45, 122, 82, 0.04) 50%,
transparent 75%
);
mix-blend-mode: soft-light;
opacity: 0.55;
opacity: 0.34;
animation: topo-hero-glow-breathe 13s ease-in-out infinite;
}
@ -542,62 +502,66 @@
}
.rift-hero-topo--hover .topo-hero-water-flow-img {
opacity: 0.3;
opacity: 0.18;
}
.rift-hero-topo--hover .topo-hero-water-shimmer {
opacity: 0.62;
opacity: 0.42;
}
.rift-hero-topo--hover .topo-hero-channel-glow {
opacity: 0.68;
opacity: 0.44;
}
.rift-hero-topo--hover .topo-hero-water-spotlight {
opacity: 0.85;
opacity: 0.5;
}
.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 {
0%,
100% {
opacity: 0.36;
opacity: 0.22;
}
50% {
opacity: 0.5;
opacity: 0.3;
}
}
@keyframes topo-hero-fill-pulse {
0%,
100% {
opacity: 0.14;
opacity: 0.08;
}
50% {
opacity: 0.28;
opacity: 0.16;
}
}
@keyframes topo-hero-shimmer-breathe {
0%,
100% {
opacity: 0.38;
opacity: 0.26;
}
50% {
opacity: 0.58;
opacity: 0.38;
}
}
@keyframes topo-hero-glow-breathe {
0%,
100% {
opacity: 0.42;
opacity: 0.28;
}
50% {
opacity: 0.62;
opacity: 0.4;
}
}
@ -1163,7 +1127,7 @@
.rift-pulse-animate,
.rift-hero-topo .topo-hero-pattern-img {
animation: none !important;
opacity: 0.44 !important;
opacity: 0.28 !important;
}
.rift-hero-topo .topo-hero-water-flow-img,

View File

@ -31,13 +31,13 @@ export function FooterTopoPattern({ className }: Props) {
key={i}
d={cell.d}
fill={cell.fill}
stroke="rgba(255,255,255,0.09)"
strokeWidth={0.14}
stroke="rgba(255,255,255,0.05)"
strokeWidth={0.12}
/>
))}
</svg>
<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
/>
</div>

View File

@ -6,8 +6,9 @@ import { cn } from "@/lib/utils";
const MESH_W = 140;
const MESH_H = 100;
const ROCK_TONES = ["#0d3d26", "#1a5c38", "#246b45", "#2f7a52", "#3d9a66", "#52b87a"] as const;
const GROUT = "rgba(8, 38, 22, 0.42)";
/** Narrow green range — low contrast between “stones” on section backgrounds */
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, {
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 cy = cell.points.reduce((s, p) => s + p[1], 0) / cell.points.length;
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];
return mixHex(gradient, tone, 0.54);
return mixHex(gradient, tone, 0.38);
}
type Props = {
@ -82,12 +83,12 @@ export function RoundedRockVoronoiBackground({
<div className="absolute inset-0 opacity-[0.18] grain" aria-hidden />
{gradient && (
<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
/>
)}
<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
/>
</div>

View File

@ -1,11 +1,11 @@
/** GRV greens for wavy interlocking footer tessellation. */
export const WAVY_TESS_PALETTE = [
"#0d3d26",
"#1a5c38",
"#256b45",
"#2d7a52",
"#3d9a66",
"#5cb87a",
"#1d5f3c",
"#216342",
"#246845",
"#286a48",
"#2b6e4b",
] as const;
export type WavyTessCell = { d: string; fill: string };