@@ -1785,7 +1808,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispGreen"
- scale="-180"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -1803,7 +1826,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispBlue"
- scale="-160"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -1883,7 +1906,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
@@ -1937,7 +1960,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispGreen"
- scale="-180"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -1955,7 +1978,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispBlue"
- scale="-160"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -2026,7 +2049,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
@@ -2080,7 +2103,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispGreen"
- scale="-180"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -2098,7 +2121,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispBlue"
- scale="-160"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -2174,7 +2197,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
@@ -2228,7 +2251,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispGreen"
- scale="-180"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
@@ -2246,7 +2269,7 @@ exports[`LandingPage should render correctly for guest user 1`] = `
in="SourceGraphic"
in2="map"
result="dispBlue"
- scale="-160"
+ scale="20"
xChannelSelector="R"
yChannelSelector="G"
/>
diff --git a/apps/web/src/screens/landingPage/components/FeaturesSection.tsx b/apps/web/src/screens/landingPage/components/FeaturesSection.tsx
index b786f99..29951b0 100644
--- a/apps/web/src/screens/landingPage/components/FeaturesSection.tsx
+++ b/apps/web/src/screens/landingPage/components/FeaturesSection.tsx
@@ -1,8 +1,8 @@
import * as React from 'react';
-import { Box, VStack, Heading, Text, SimpleGrid, Flex } from '@chakra-ui/react';
+import { Box, VStack, Heading, Text, SimpleGrid, Flex, useToken } from '@chakra-ui/react';
import { useTranslation } from 'react-i18next';
import { Icon, IconType } from '@assets';
-import { GlassBox } from '@components';
+import { GlassBox, LightPillar } from '@components';
const featureCards = [
{
@@ -33,16 +33,45 @@ const featureCards = [
export const FeaturesSection = () => {
const { t } = useTranslation();
+ const [topColor, bottomColor] = useToken('colors', ['pillar.top', 'pillar.bottom']);
return (
-
+ {/* Light Pillar background decoration */}
+
+
+
+
+
{
-
+
{featureCards.map(({ icon, titleKey, descKey, className }) => (
{
justifyContent="center"
width="100%"
minHeight="90vh"
- className={styles.techGrid}
py={{ base: 10, md: 14 }}
px={{ base: 6, md: 16 }}
position="relative"
@@ -38,6 +37,26 @@ export const HeroSection = ({ children }: HeroSectionProps) => {
'radial(circle at 50% -20%, rgba(139, 92, 246, 0.15), bg.default 80%)',
}}
>
+ {/* Dynamic Grid Animation Background */}
+
+
+
+
{/* Immersive moving glows */}
@@ -51,6 +70,7 @@ export const HeroSection = ({ children }: HeroSectionProps) => {
alignItems="center"
justifyContent="space-between"
zIndex={2}
+ pointerEvents="none"
>
{/* LEFT: Copy content */}
{
gap={6}
flex={1.1}
maxW={{ base: 'xl', lg: 'none' }}
+ pointerEvents="auto"
>
@@ -197,7 +218,9 @@ export const HeroSection = ({ children }: HeroSectionProps) => {
{/* RIGHT: Diagnostics Terminal */}
- {children}
+
+ {children}
+
{/* Scroll indicator */}
diff --git a/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx b/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx
index 7f7488f..6d89e7a 100644
--- a/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx
+++ b/apps/web/src/screens/landingPage/components/MeshVisualizer.tsx
@@ -374,7 +374,7 @@ export const MeshVisualizer = ({
>
- HOST
+ {t('LandingPage.host')}
diff --git a/shared/common/package.json b/shared/common/package.json
index dfd396f..d3ea1f0 100644
--- a/shared/common/package.json
+++ b/shared/common/package.json
@@ -16,13 +16,15 @@
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-helmet-async": "^2.0.5",
- "react-i18next": "^14.1.1"
+ "react-i18next": "^14.1.1",
+ "three": "^0.184.0"
},
"devDependencies": {
"@tanstack/react-query": "^5.51.23",
"@types/node": "^16.18.91",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
+ "@types/three": "^0.184.1",
"react-router-dom": "^7.15.0",
"typescript": "^6.0.3"
}
diff --git a/shared/common/src/components/GlassBox/GlassBox.tsx b/shared/common/src/components/GlassBox/GlassBox.tsx
index 07a9346..d68f36f 100644
--- a/shared/common/src/components/GlassBox/GlassBox.tsx
+++ b/shared/common/src/components/GlassBox/GlassBox.tsx
@@ -93,8 +93,44 @@ const GlassSurface: React.FC = ({
const greenChannelRef = useRef(null);
const blueChannelRef = useRef(null);
const gaussianBlurRef = useRef(null);
+ const globalIsDark = useDarkMode();
+ const [localIsDark, setLocalIsDark] = useState(false);
- const isDarkMode = useDarkMode();
+ useEffect(() => {
+ if (typeof window === 'undefined') return;
+
+ const checkDark = () => {
+ if (!containerRef.current) return;
+ const closestDark = containerRef.current.closest('.dark');
+ setLocalIsDark(!!closestDark);
+ };
+
+ checkDark();
+
+ const observer = new MutationObserver(() => {
+ checkDark();
+ });
+
+ observer.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ['class'],
+ });
+ observer.observe(document.body, {
+ attributes: true,
+ attributeFilter: ['class'],
+ });
+
+ if (containerRef.current?.parentElement) {
+ observer.observe(containerRef.current.parentElement, {
+ attributes: true,
+ attributeFilter: ['class'],
+ });
+ }
+
+ return () => observer.disconnect();
+ }, [globalIsDark]);
+
+ const isDarkMode = localIsDark || globalIsDark;
const generateDisplacementMap = () => {
const rect = containerRef.current?.getBoundingClientRect();
diff --git a/shared/common/src/components/GridAnimation/GridAnimation.tsx b/shared/common/src/components/GridAnimation/GridAnimation.tsx
new file mode 100644
index 0000000..e017257
--- /dev/null
+++ b/shared/common/src/components/GridAnimation/GridAnimation.tsx
@@ -0,0 +1,406 @@
+import React, { useRef, useEffect } from 'react';
+import { GridAnimationProps, GridOffset } from './types';
+import { useTheme } from 'next-themes';
+
+
+const GridAnimation = ({
+ direction = 'right',
+ speed = 1,
+ borderColor = '#999',
+ squareSize = 30,
+ hoverFillColor = '#222',
+ shape = 'square',
+ hoverTrailAmount = 2
+}: GridAnimationProps) => {
+ const { resolvedTheme } = useTheme();
+ const isDark = resolvedTheme === 'dark';
+ const canvasRef = useRef(null);
+ const requestRef = useRef(null);
+ const numSquaresX = useRef(0);
+ const numSquaresY = useRef(0);
+ const gridOffset = useRef({ x: 0, y: 0 });
+ const hoveredSquareRef = useRef(null);
+ const trailCells = useRef([]);
+ const cellOpacities = useRef