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) => (
+ {
+ const el = containerRef.current;
+ if (!el) return;
+ const rect = el.getBoundingClientRect();
+ const targetY = window.scrollY + rect.top + (rect.height * (i + 0.5)) / CATEGORIES.length;
+ window.scrollTo({ top: targetY - window.innerHeight / 2, behavior: 'smooth' });
+ }}
+ style={{
+ display: 'flex',
+ alignItems: 'center',
+ gap: '0.55rem',
+ padding: '0.4rem 0',
+ background: 'transparent',
+ border: 'none',
+ cursor: 'pointer',
+ textAlign: 'left',
+ color: i === activeIdx ? '#FBFBFD' : '#6a73a5',
+ fontSize: i === activeIdx ? '1rem' : '0.85rem',
+ fontWeight: i === activeIdx ? 600 : 500,
+ letterSpacing: '-0.005em',
+ transition: 'color 0.3s, font-size 0.3s',
+ }}
+ >
+
+
+ {String(i + 1).padStart(2, '0')}
+
+ {c.name}
+
+ ))}
+
+
+ {/* 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) => (
+
+
+
+
+
+ ))}
+
+
+ {/* 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
+
+
+
+
+
+
+
+ ))}
+
+ );
+}
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}
-
@@ -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 */}