diff --git a/src/app/globals.css b/src/app/globals.css index 8f0a7dd..0fd8761 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -15,7 +15,7 @@ --color-blue-deep: #1a2e6e; --color-blue-bright: #3a55c4; --color-silver: #DEE0F0; - --color-silver-soft: #BFC3E2; + --color-silver-soft: #D7DBEA; --color-steel: #8891C7; --color-graphite: #221F20; --color-white: #FBFBFD; @@ -23,7 +23,7 @@ /* Accent aliases (kept for legacy class names) */ --color-gold: #DEE0F0; --color-accent: #273F94; - --color-accent-2: #BFC3E2; + --color-accent-2: #D7DBEA; --color-accent-3: #8891C7; --color-accent-hover: #3a55c4; @@ -34,14 +34,14 @@ --color-text-dim: #6a73a5; /* Borders */ - --color-border: rgba(191, 195, 226, 0.18); - --color-border-strong: rgba(191, 195, 226, 0.36); - --color-border-light: rgba(191, 195, 226, 0.08); + --color-border: rgba(199, 207, 230, 0.18); + --color-border-strong: rgba(199, 207, 230, 0.36); + --color-border-light: rgba(199, 207, 230, 0.08); --color-border-neutral: rgba(255, 255, 255, 0.08); /* Glass */ --color-glass-bg: rgba(28, 27, 33, 0.6); - --color-glass-border: rgba(191, 195, 226, 0.22); + --color-glass-border: rgba(199, 207, 230, 0.22); --color-glass-highlight: rgba(222, 224, 240, 0.06); /* Spacing */ @@ -129,7 +129,7 @@ html { /* === Typography gradients (metallic silver-blue) === */ .text-gradient { - background: linear-gradient(135deg, #FBFBFD 0%, #DEE0F0 45%, #8891C7 100%); + background: linear-gradient(135deg, #FFFFFF 0%, #DEE0F0 50%, #8891C7 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; @@ -137,7 +137,7 @@ html { } .text-gradient-accent { - background: linear-gradient(135deg, #FBFBFD 0%, #DEE0F0 35%, #BFC3E2 65%, #273F94 100%); + background: linear-gradient(135deg, #FFFFFF 0%, #DEE0F0 50%, #8891C7 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; @@ -186,8 +186,8 @@ html { position: absolute; inset: 0; background-image: - linear-gradient(rgba(191, 195, 226, 0.05) 1px, transparent 1px), - linear-gradient(90deg, rgba(191, 195, 226, 0.05) 1px, transparent 1px); + linear-gradient(rgba(199, 207, 230, 0.05) 1px, transparent 1px), + linear-gradient(90deg, rgba(199, 207, 230, 0.05) 1px, transparent 1px); background-size: 48px 48px; mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, #000 30%, transparent 80%); -webkit-mask-image: radial-gradient(ellipse 60% 50% at 50% 40%, #000 30%, transparent 80%); @@ -213,7 +213,7 @@ html { position: absolute; inset: 0; pointer-events: none; - background: linear-gradient(110deg, transparent 30%, rgba(191, 195, 226, 0.07) 50%, transparent 70%); + background: linear-gradient(110deg, transparent 30%, rgba(199, 207, 230, 0.07) 50%, transparent 70%); background-size: 250% 100%; animation: lightSweep 9s ease-in-out infinite; mix-blend-mode: screen; @@ -297,7 +297,7 @@ html { .btn-ghost { background: rgba(222, 224, 240, 0.04); color: #FBFBFD; - border-color: rgba(191, 195, 226, 0.28); + border-color: rgba(199, 207, 230, 0.28); backdrop-filter: blur(12px); } .btn-ghost:hover { diff --git a/src/app/page.tsx b/src/app/page.tsx index 266be04..f4ea789 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -3,7 +3,7 @@ import { Navbar } from '@/components/Navbar'; import { FooterAndContact } from '@/components/FooterAndContact'; import { Hero3DRobotics } from '@/components/robotics/Hero3DRobotics'; import { BrandShowcase } from '@/components/robotics/BrandShowcase'; -import { RobotCategoryGrid } from '@/components/robotics/RobotCategoryGrid'; +import { CategoryShowcaseScroll } from '@/components/robotics/CategoryShowcaseScroll'; import { RobotProductCard } from '@/components/robotics/RobotProductCard'; import { IndustryUseCases } from '@/components/robotics/IndustryUseCases'; import { DemoCTA } from '@/components/robotics/DemoCTA'; @@ -88,9 +88,9 @@ export default function HomePage() { - + diff --git a/src/components/robotics/BrandShowcase.tsx b/src/components/robotics/BrandShowcase.tsx index 597e110..1415141 100644 --- a/src/components/robotics/BrandShowcase.tsx +++ b/src/components/robotics/BrandShowcase.tsx @@ -107,7 +107,7 @@ function BrandCard({ position: 'absolute', inset: 0, backgroundImage: - 'linear-gradient(rgba(191,195,226,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(191,195,226,0.04) 1px, transparent 1px)', + 'linear-gradient(rgba(199, 207, 230,0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(199, 207, 230,0.04) 1px, transparent 1px)', backgroundSize: '32px 32px', maskImage: 'radial-gradient(ellipse 60% 80% at 50% 40%, #000 30%, transparent 80%)', WebkitMaskImage: 'radial-gradient(ellipse 60% 80% at 50% 40%, #000 30%, transparent 80%)', @@ -198,7 +198,7 @@ function BrandCard({

{ + const check = () => setIsMobile(window.innerWidth < 900); + check(); + window.addEventListener('resize', check); + return () => window.removeEventListener('resize', check); + }, []); + + if (isMobile) return ; + return ; +} + +function CategorySticky() { + const containerRef = useRef(null); + const { scrollYProgress } = useScroll({ + target: containerRef, + offset: ['start start', 'end end'], + }); + const [activeIdx, setActiveIdx] = useState(0); + + useEffect(() => { + return scrollYProgress.on('change', (v) => { + const idx = Math.min( + CATEGORIES.length - 1, + Math.max(0, Math.floor(v * CATEGORIES.length)) + ); + setActiveIdx(idx); + }); + }, [scrollYProgress]); + + /* progress bar height */ + const progressHeight = useTransform(scrollYProgress, [0, 1], ['0%', '100%']); + + return ( +

+
+ {/* LEFT — sticky text column with progress + active category */} +
+ {/* progress rail */} +
+ +
+ + {/* category list */} +
+ Robot categories · 8 + {CATEGORIES.map((c, i) => ( + + ))} +
+ + {/* active category copy */} +
+ + + {CATEGORIES[activeIdx].name} + + + + {CATEGORIES[activeIdx].description} + + + + + Explore robots + + + + Book demo + + + +
+
+ + {/* RIGHT — visual stage */} +
+ {/* metallic edge */} +
+ {/* grid */} +
+ {/* spotlight */} +
+ + {/* top floating brand chip */} +
+ + {CATEGORIES[activeIdx].brand} +
+ + {/* top-right index */} +
+ {String(activeIdx + 1).padStart(2, '0')} + + / {String(CATEGORIES.length).padStart(2, '0')} + +
+ + {/* product stage — cross-fade per category */} +
+ {CATEGORIES.map((c, i) => ( + +
+ {c.imageAlt} +
+
+ ))} +
+ + {/* floor line */} +
+ + {/* floor reflection */} + {CATEGORIES.map((c, i) => ( + + + + ))} + + {/* bottom info bar: models + use cases */} + +
+ + Featured models + + + {CATEGORIES[activeIdx].models} + +
+
+ {CATEGORIES[activeIdx].useCases.map((u) => ( + + {u} + + ))} +
+
+
+
+
+ ); +} + +function CategoryStack() { + return ( +
+ {CATEGORIES.map((c, i) => ( + +
+ + {String(i + 1).padStart(2, '0')} · {c.brand} + +

+ {c.name} +

+

+ {c.description} +

+ + Explore + + +
+
+ {c.imageAlt} +
+ + ))} +
+ ); +} diff --git a/src/components/robotics/CompanyStory.tsx b/src/components/robotics/CompanyStory.tsx index 35a1285..cf7edcc 100644 --- a/src/components/robotics/CompanyStory.tsx +++ b/src/components/robotics/CompanyStory.tsx @@ -31,7 +31,7 @@ const PILLARS: Pillar[] = [ title: 'Digital Transformation', body: 'Automation systems and smart projects that modernize operations.', Icon: Workflow, - accent: '#BFC3E2', + accent: '#D7DBEA', }, { num: '04', @@ -63,7 +63,7 @@ export function CompanyStory() { position: 'absolute', inset: 0, backgroundImage: - 'linear-gradient(rgba(191,195,226,0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(191,195,226,0.06) 1px, transparent 1px)', + 'linear-gradient(rgba(199, 207, 230,0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(199, 207, 230,0.06) 1px, transparent 1px)', backgroundSize: '36px 36px', maskImage: 'radial-gradient(ellipse 70% 80% at 50% 40%, #000 25%, transparent 80%)', WebkitMaskImage: 'radial-gradient(ellipse 70% 80% at 50% 40%, #000 25%, transparent 80%)', @@ -348,7 +348,7 @@ function CapabilityTile({ pillar, offset }: { pillar: Pillar; offset: 'up' | 'do margin: 0, fontSize: '0.88rem', lineHeight: 1.55, - color: '#BFC3E2', + color: '#D7DBEA', position: 'relative', }} > diff --git a/src/components/robotics/ExclusiveAccessSection.tsx b/src/components/robotics/ExclusiveAccessSection.tsx index 243b350..64de9d6 100644 --- a/src/components/robotics/ExclusiveAccessSection.tsx +++ b/src/components/robotics/ExclusiveAccessSection.tsx @@ -189,7 +189,7 @@ function BrandShowcaseTile({ position: 'absolute', inset: 0, backgroundImage: - 'linear-gradient(rgba(191,195,226,0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(191,195,226,0.06) 1px, transparent 1px)', + 'linear-gradient(rgba(199, 207, 230,0.06) 1px, transparent 1px), linear-gradient(90deg, rgba(199, 207, 230,0.06) 1px, transparent 1px)', backgroundSize: '24px 24px', maskImage: 'radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 80%)', WebkitMaskImage: 'radial-gradient(ellipse 60% 60% at 50% 50%, #000 30%, transparent 80%)', @@ -334,7 +334,7 @@ function TerritoryTile() { - DXB + DXB
diff --git a/src/components/robotics/Hero3DRobotics.tsx b/src/components/robotics/Hero3DRobotics.tsx index 05b6fb7..a75b614 100644 --- a/src/components/robotics/Hero3DRobotics.tsx +++ b/src/components/robotics/Hero3DRobotics.tsx @@ -141,7 +141,7 @@ export function Hero3DRobotics() { display: 'block', fontWeight: 600, background: - 'linear-gradient(110deg, #FBFBFD 0%, #DEE0F0 28%, #BFC3E2 55%, #3a55c4 100%)', + 'linear-gradient(110deg, #FFFFFF 0%, #DEE0F0 50%, #8891C7 100%)', WebkitBackgroundClip: 'text', backgroundClip: 'text', WebkitTextFillColor: 'transparent', @@ -157,7 +157,7 @@ export function Hero3DRobotics() {

YS Lootah Robotics is the exclusive UAE sales destination for selected Unitree and Pudu Robotics solutions helping businesses explore, configure, book demos, and deploy advanced robots across Dubai and the UAE.

-

+

In Tech We Innovate · In Trust We Lead

diff --git a/src/components/sections/robotics-scroll-showcase.tsx b/src/components/sections/robotics-scroll-showcase.tsx index 8dc6ab5..4210149 100644 --- a/src/components/sections/robotics-scroll-showcase.tsx +++ b/src/components/sections/robotics-scroll-showcase.tsx @@ -18,7 +18,7 @@ const SHOWROOM_ROBOTS = [ slug: 'unitree-go2', image: '/images/robots/unitree-go2.png', category: 'Quadruped', - accent: '#BFC3E2', + accent: '#D7DBEA', }, { name: 'Pudu BellaBot', @@ -58,10 +58,10 @@ export function RoboticsScrollShowcase() {

Advanced robotics. - + Exclusive UAE access. - + Built for Dubai's next generation of automation.

@@ -92,14 +92,14 @@ function ConsoleInterior() { className={`flex items-center gap-2.5 rounded-lg border px-3 py-2 text-left text-xs font-semibold uppercase tracking-[0.12em] transition ${ t.active ? 'border-[#DEE0F0]/40 bg-[#273F94]/30 text-[#DEE0F0]' - : 'border-transparent text-[#BFC3E2]/80 hover:bg-white/[0.04]' + : 'border-transparent text-[#D7DBEA]/80 hover:bg-white/[0.04]' }`} > {t.label} ))} -
+
YS Lootah Robotics In Tech We Innovate
@@ -169,7 +169,7 @@ function ConsoleInterior() { Request UAE quotation diff --git a/src/components/sections/robotics-spline-showcase.tsx b/src/components/sections/robotics-spline-showcase.tsx index bcd8227..52c4e90 100644 --- a/src/components/sections/robotics-spline-showcase.tsx +++ b/src/components/sections/robotics-spline-showcase.tsx @@ -99,7 +99,7 @@ export function RoboticsSplineShowcase() { style={{ display: 'inline-block', background: - 'linear-gradient(110deg, #FBFBFD 0%, #DEE0F0 35%, #BFC3E2 60%, #3a55c4 100%)', + 'linear-gradient(110deg, #FFFFFF 0%, #DEE0F0 50%, #8891C7 100%)', WebkitBackgroundClip: 'text', backgroundClip: 'text', WebkitTextFillColor: 'transparent', @@ -190,7 +190,7 @@ export function RoboticsSplineShowcase() { borderRadius: 999, border: '1px solid rgba(136,145,199,0.5)', background: 'transparent', - color: '#BFC3E2', + color: '#D7DBEA', fontSize: '0.78rem', fontWeight: 700, letterSpacing: '0.14em', @@ -231,7 +231,7 @@ export function RoboticsSplineShowcase() { >
{item.label}
-
+
{item.value}
@@ -246,7 +246,7 @@ export function RoboticsSplineShowcase() { fontWeight: 600, letterSpacing: '0.32em', textTransform: 'uppercase', - color: '#BFC3E2', + color: '#D7DBEA', }} > In Tech We Innovate · In Trust We Lead @@ -308,7 +308,7 @@ export function RoboticsSplineShowcase() { backdropFilter: 'blur(12px)', }} > -
+
YS Lootah Robotics
diff --git a/src/components/ui/MotionSection.tsx b/src/components/ui/MotionSection.tsx index 75b2af5..f4aa753 100644 --- a/src/components/ui/MotionSection.tsx +++ b/src/components/ui/MotionSection.tsx @@ -32,7 +32,7 @@ export function MotionSection({ children, className = '', id, delay = 0, style } } } }, - { threshold: 0.12 } + { threshold: 0, rootMargin: '0px 0px -10% 0px' } ); obs.observe(el); return () => obs.disconnect(); @@ -45,7 +45,9 @@ export function MotionSection({ children, className = '', id, delay = 0, style } className={className} style={{ opacity: visible ? 1 : 0, - transform: visible ? 'translateY(0)' : 'translateY(28px)', + // when hidden, lift via translate. When visible, drop transform entirely so + // child position:sticky behaves correctly (transformed ancestor would break sticky). + ...(visible ? {} : { transform: 'translateY(28px)' }), transition: `opacity 0.9s cubic-bezier(0.16,1,0.3,1) ${delay}s, transform 0.9s cubic-bezier(0.16,1,0.3,1) ${delay}s`, scrollMarginTop: '6rem', ...style, diff --git a/src/components/ui/container-scroll-animation.tsx b/src/components/ui/container-scroll-animation.tsx index d01b3e1..5d0c0b3 100644 --- a/src/components/ui/container-scroll-animation.tsx +++ b/src/components/ui/container-scroll-animation.tsx @@ -113,7 +113,7 @@ function DisplayFrame({ />
{/* status bar */}