diff --git a/app/[locale]/[slug]/page.tsx b/app/[locale]/[slug]/page.tsx index efff6de57..f44092753 100644 --- a/app/[locale]/[slug]/page.tsx +++ b/app/[locale]/[slug]/page.tsx @@ -131,7 +131,7 @@ export default async function Page(props: { params: Promise<{ locale: string; sl {t('badge')} - + {pageData.frontmatter.title} @@ -139,7 +139,7 @@ export default async function Page(props: { params: Promise<{ locale: string; sl {/* Main Content Area */} - + {/* Excerpt/Lead paragraph if available */} {pageData.frontmatter.excerpt && ( @@ -180,7 +180,7 @@ export default async function Page(props: { params: Promise<{ locale: string; sl - + ); } diff --git a/app/[locale]/layout.tsx b/app/[locale]/layout.tsx index 37afb3258..2efb37174 100644 --- a/app/[locale]/layout.tsx +++ b/app/[locale]/layout.tsx @@ -18,6 +18,7 @@ import { cookies } from 'next/headers'; import { TransitionProvider } from '@/components/providers/TransitionProvider'; import { PageTransitionShutter } from '@/components/providers/PageTransitionShutter'; import { InitialLoader } from '@/components/providers/InitialLoader'; +import { CorporateBackground } from '@/components/decorations/CorporateBackground'; const inter = Inter({ subsets: ['latin'], @@ -175,9 +176,10 @@ export default async function Layout(props: { {/* Preload critical hero video */} - + + diff --git a/app/globals.css b/app/globals.css index e25c773ef..dcec4495a 100644 --- a/app/globals.css +++ b/app/globals.css @@ -15,6 +15,17 @@ .hide-scrollbar::-webkit-scrollbar { display: none; /* Chrome, Safari and Opera */ } + + @keyframes bg-pulse-15 { + 0%, 90%, 100% { opacity: 0.04; } + 95% { opacity: 0.10; filter: brightness(1.2); } + } + @keyframes bg-pulse-20 { + 0%, 90%, 100% { opacity: 0.07; } + 95% { opacity: 0.14; filter: brightness(1.2); } + } + .animate-bg-pulse-15 { animation: bg-pulse-15 12s infinite ease-in-out; } + .animate-bg-pulse-20 { animation: bg-pulse-20 12s infinite ease-in-out; } } /* Base Styles */ diff --git a/components/blocks/CompetenceBentoGrid.tsx b/components/blocks/CompetenceBentoGrid.tsx index 1c9a5105a..340711adf 100644 --- a/components/blocks/CompetenceBentoGrid.tsx +++ b/components/blocks/CompetenceBentoGrid.tsx @@ -7,6 +7,8 @@ import { useState, useEffect } from 'react'; import { Button } from '@/components/ui/Button'; import { HoverShineOverlay } from '@/components/ui/HoverShineOverlay'; +import { Container } from '@/components/ui/Container'; + interface CompetenceBentoGridProps { badge?: string; title?: string; @@ -58,7 +60,7 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) { if (!isMounted) { return ( - + {badge} @@ -68,20 +70,20 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) { {/* Simplified static grid */} - + ); } return ( - - + + {badge} {title} - + {ctaLabel} @@ -166,7 +168,7 @@ export function CompetenceBentoGrid(props: CompetenceBentoGridProps) { ); })} - + ); } diff --git a/components/blocks/HeroVideo.tsx b/components/blocks/HeroVideo.tsx index 62cbb814e..5574f9128 100644 --- a/components/blocks/HeroVideo.tsx +++ b/components/blocks/HeroVideo.tsx @@ -55,6 +55,7 @@ export function HeroVideo(props: HeroVideoProps) { {videoUrl && ( ( + + {/* Outer ring */} + + {/* Middle thicker ring */} + + {/* Inner ring */} + + +); + +function MagneticRing({ + children, + className, + pullStrength = 30, // How strong the pull is (higher = moves closer to mouse) + pullRadius = 600 // Distance from center at which it starts pulling +}: { + children: React.ReactNode, + className?: string, + pullStrength?: number, + pullRadius?: number +}) { + const ref = useRef(null); + + // Spring physics for extremely smooth, organic movement + const x = useSpring(0, { stiffness: 40, damping: 25, mass: 1 }); + const y = useSpring(0, { stiffness: 40, damping: 25, mass: 1 }); + + useEffect(() => { + // Only run on client with mouse + if (window.matchMedia("(pointer: coarse)").matches) return; + + const handleMouseMove = (e: MouseEvent) => { + if (!ref.current) return; + const rect = ref.current.getBoundingClientRect(); + const centerX = rect.left + rect.width / 2; + const centerY = rect.top + rect.height / 2; + + const distX = e.clientX - centerX; + const distY = e.clientY - centerY; + const distance = Math.sqrt(distX * Math.pow(distX, 2) + Math.pow(distY, 2)); // Fix: correct pythagoras + + // Calculate actual distance correctly + const actualDistance = Math.sqrt(distX * distX + distY * distY); + + if (actualDistance < pullRadius) { + // Exponential falloff for natural magnetic feel + const pullFactor = Math.pow(1 - (actualDistance / pullRadius), 2); + + // Target offset (fraction of the distance based on strength) + x.set(distX * pullFactor * (pullStrength / 100)); + y.set(distY * pullFactor * (pullStrength / 100)); + } else { + // Return to origin smoothly + x.set(0); + y.set(0); + } + }; + + window.addEventListener('mousemove', handleMouseMove); + return () => window.removeEventListener('mousemove', handleMouseMove); + }, [x, y, pullRadius, pullStrength]); + + return ( + + {children} + + ); +} + +export function CorporateBackground() { + const { scrollYProgress } = useScroll(); + + // Stronger parallax offsets for visible movement + const y1 = useTransform(scrollYProgress, [0, 1], [0, -400]); + const y2 = useTransform(scrollYProgress, [0, 1], [0, 500]); + const y3 = useTransform(scrollYProgress, [0, 1], [0, -600]); + const y4 = useTransform(scrollYProgress, [0, 1], [0, 350]); + const y5 = useTransform(scrollYProgress, [0, 1], [0, -500]); + + return ( + + {/* 1. Top Right - Medium, rotating moderately */} + + + + + + + + + {/* 2. Quarter way down left - Smaller, rotating fast reverse */} + + + + + + + + + {/* 3. Halfway down right - Medium, rotating slow */} + + + + + + + + + {/* 4. Bottom left - Larger, rotating moderately */} + + + + + + + + + {/* 5. Deep bottom right - Smallest, very fast */} + + + + + + + + + ); +} diff --git a/components/layout/Header.tsx b/components/layout/Header.tsx index f64d90eea..45c42c321 100644 --- a/components/layout/Header.tsx +++ b/components/layout/Header.tsx @@ -71,7 +71,7 @@ export function Header({ navLinks }: HeaderProps) { }`} >