diff --git a/package-lock.json b/package-lock.json index 9d2ab87..7f17c1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,22 +18,27 @@ "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.5.0", "@react-three/postprocessing": "^2.16.0", + "@splinetool/react-spline": "^4.1.0", + "@splinetool/runtime": "^1.12.94", "@stripe/react-stripe-js": "^6.1.0", "@stripe/stripe-js": "^9.1.0", "@types/three": "^0.183.1", "bcryptjs": "^3.0.3", + "clsx": "^2.1.1", "draco3dgltf": "^1.5.7", "framer-motion": "^12.38.0", "gsap": "^3.14.2", "i18next": "^26.0.3", "i18next-browser-languagedetector": "^8.2.1", "jose": "^6.2.2", + "lucide-react": "^1.16.0", "next": "16.2.2", "react": "19.0.0", "react-country-phone-input": "^1.0.2", "react-dom": "19.0.0", "react-i18next": "^17.0.2", "stripe": "^22.0.1", + "tailwind-merge": "^3.6.0", "three": "^0.170.0", "tsx": "^4.19.2", "zustand": "^5.0.12" @@ -2713,6 +2718,37 @@ "text-hex": "1.0.x" } }, + "node_modules/@splinetool/react-spline": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@splinetool/react-spline/-/react-spline-4.1.0.tgz", + "integrity": "sha512-Y379gm17gw+1nxT/YXTCJnVIWuu7tsUH1tp/YxsYb0pZnc9Gljk7Om4Kpq7WPq0bZ4zidVCxf6xn6jgDcbHifQ==", + "dependencies": { + "blurhash": "2.0.5", + "lodash.debounce": "4.0.8", + "react-merge-refs": "2.1.1", + "thumbhash": "0.1.1" + }, + "peerDependencies": { + "@splinetool/runtime": "*", + "next": ">=14.2.0", + "react": "*", + "react-dom": "*" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + } + } + }, + "node_modules/@splinetool/runtime": { + "version": "1.12.94", + "resolved": "https://registry.npmjs.org/@splinetool/runtime/-/runtime-1.12.94.tgz", + "integrity": "sha512-Y49qppQkzVHhbeePpmdXBOeVOtgAcn8qObBujB8ePYnGYBxSAA2NCHo91pY1Sv1DCMXrowuTSAJexVeXf+t4Pw==", + "dependencies": { + "on-change": "4.0.0", + "semver-compare": "1.0.0" + } + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -3714,6 +3750,12 @@ "require-from-string": "^2.0.2" } }, + "node_modules/blurhash": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/blurhash/-/blurhash-2.0.5.tgz", + "integrity": "sha512-cRygWd7kGBQO3VEhPiTgq4Wc43ctsM+o46urrmPOiuAe+07fzlSB9OJVdpgDL0jPqXUVQ9ht7aq7kxOeJHRK+w==", + "license": "MIT" + }, "node_modules/brace-expansion": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", @@ -4022,6 +4064,15 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", @@ -6043,6 +6094,15 @@ "url": "https://github.com/sponsors/wellwelwel" } }, + "node_modules/lucide-react": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.16.0.tgz", + "integrity": "sha512-dYwyPzb4MEKpGUmNYk3WKWPnMrHs3FKM+q94kAnJrcDIqqn1hq2xY8scaS2ovsOCM5D51ey2gaRG3PBb1vgoYQ==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -6515,6 +6575,18 @@ "devOptional": true, "license": "MIT" }, + "node_modules/on-change": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/on-change/-/on-change-4.0.0.tgz", + "integrity": "sha512-PTu7C9Jsz4b+sNMDpH0eZFTr7uxdOtoDWRnhaVNK50bgrrnW5nvbWI0jm5DG9qOoTnIhBzE9xoKVFPD9xgtbdg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/on-change?sponsor=1" + } + }, "node_modules/one-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", @@ -6947,6 +7019,16 @@ "license": "MIT", "peer": true }, + "node_modules/react-merge-refs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-merge-refs/-/react-merge-refs-2.1.1.tgz", + "integrity": "sha512-jLQXJ/URln51zskhgppGJ2ub7b2WFKGq3cl3NYKtlHoTG+dN2q7EzWrn3hN3EgPsTMvpR9tpq5ijdp7YwFZkag==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, "node_modules/react-use-measure": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.7.tgz", @@ -7170,6 +7252,12 @@ "node": ">=10" } }, + "node_modules/semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", + "license": "MIT" + }, "node_modules/seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", @@ -7713,6 +7801,16 @@ "node": ">=6" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", @@ -7779,6 +7877,12 @@ "integrity": "sha512-IQrh3lEPM93wVCEczc9SaAOvkmcoQn/G8Bo1e8ZPlY3X3bnAxWaBdvTdvM1hP62iZp0BXWDy4vTAy4fF0+Dlpg==", "license": "MIT" }, + "node_modules/thumbhash": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/thumbhash/-/thumbhash-0.1.1.tgz", + "integrity": "sha512-kH5pKeIIBPQXAOni2AiY/Cu/NKdkFREdpH+TLdM0g6WA7RriCv0kPLgP731ady67MhTAqrVG/4mnEeibVuCJcg==", + "license": "MIT" + }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", diff --git a/package.json b/package.json index 51c2e01..29a4660 100644 --- a/package.json +++ b/package.json @@ -21,22 +21,27 @@ "@react-three/drei": "^10.7.7", "@react-three/fiber": "^9.5.0", "@react-three/postprocessing": "^2.16.0", + "@splinetool/react-spline": "^4.1.0", + "@splinetool/runtime": "^1.12.94", "@stripe/react-stripe-js": "^6.1.0", "@stripe/stripe-js": "^9.1.0", "@types/three": "^0.183.1", "bcryptjs": "^3.0.3", + "clsx": "^2.1.1", "draco3dgltf": "^1.5.7", "framer-motion": "^12.38.0", "gsap": "^3.14.2", "i18next": "^26.0.3", "i18next-browser-languagedetector": "^8.2.1", "jose": "^6.2.2", + "lucide-react": "^1.16.0", "next": "16.2.2", "react": "19.0.0", "react-country-phone-input": "^1.0.2", "react-dom": "19.0.0", "react-i18next": "^17.0.2", "stripe": "^22.0.1", + "tailwind-merge": "^3.6.0", "three": "^0.170.0", "tsx": "^4.19.2", "zustand": "^5.0.12" diff --git a/public/images/brands/ys-lootah-robotics-logo.png b/public/images/brands/ys-lootah-robotics-logo.png new file mode 100644 index 0000000..f21914e Binary files /dev/null and b/public/images/brands/ys-lootah-robotics-logo.png differ diff --git a/public/images/robots/pudu-bellabot.svg b/public/images/robots/pudu-bellabot.svg index 5bc36fd..9bc0eb2 100644 --- a/public/images/robots/pudu-bellabot.svg +++ b/public/images/robots/pudu-bellabot.svg @@ -1,20 +1,20 @@ - - + + - - + + - - + + - - + + @@ -22,18 +22,18 @@ - + - - - - - - - + + + + + + + - PUDU BELLABOT + PUDU BELLABOT diff --git a/public/images/robots/pudu-cc1.svg b/public/images/robots/pudu-cc1.svg index c8142d1..ed4c0de 100644 --- a/public/images/robots/pudu-cc1.svg +++ b/public/images/robots/pudu-cc1.svg @@ -1,31 +1,31 @@ - - + + - - + + - - + + - - + + - - - + + + - - - + + + - PUDU CC1 CLEANING ROBOT + PUDU CC1 CLEANING ROBOT diff --git a/public/images/robots/pudu-kettybot.svg b/public/images/robots/pudu-kettybot.svg index 7e2b7b8..821b476 100644 --- a/public/images/robots/pudu-kettybot.svg +++ b/public/images/robots/pudu-kettybot.svg @@ -1,35 +1,35 @@ - - + + - - + + - - + + - - + + - + - - - - + + + + - PUDU KETTYBOT + PUDU KETTYBOT diff --git a/public/images/robots/pudu-pudubot.svg b/public/images/robots/pudu-pudubot.svg index 287e02f..3e363f0 100644 --- a/public/images/robots/pudu-pudubot.svg +++ b/public/images/robots/pudu-pudubot.svg @@ -1,29 +1,29 @@ - - + + - - + + - - + + - - - - + + + + - - - + + + - PUDU D-SERIES + PUDU D-SERIES diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx index 14d0714..294a3ce 100644 --- a/src/app/about/page.tsx +++ b/src/app/about/page.tsx @@ -5,11 +5,14 @@ import { MotionSection } from '@/components/ui/MotionSection'; import { DemoCTA } from '@/components/robotics/DemoCTA'; import { WhyUs } from '@/components/robotics/WhyUs'; import { FloatingTechPanel } from '@/components/robotics/FloatingTechPanel'; +import { CompanyStory } from '@/components/robotics/CompanyStory'; +import { FounderSection } from '@/components/robotics/FounderSection'; +import { ServicesGrid } from '@/components/robotics/ServicesGrid'; export const metadata: Metadata = { title: 'About YS Lootah Robotics — Exclusive UAE Access to Unitree & Pudu', description: - 'YS Lootah Robotics holds exclusive UAE sales rights for selected Unitree and Pudu Robotics solutions — with a Dubai-based team managing sales, demo, configuration, and deployment.', + 'YS Lootah Robotics is part of the Yousuf Saeed Lootah Investment Group — a trusted UAE robotics partner delivering AI, automation, and intelligent robotics across Dubai and the UAE.', }; export default function AboutPage() { @@ -20,26 +23,43 @@ export default function AboutPage() {
- About · Exclusive UAE Access + About · YS Lootah Robotics

- The UAE's dedicated destination for Unitree and Pudu Robotics. + In Tech We Innovate. In Trust We Lead.

-

- YS Lootah Robotics is the robotics arm of the YS Lootah group — a UAE-based technology partner that holds exclusive sales rights in the UAE for selected Unitree and Pudu Robotics solutions. Our Dubai team manages sales, live demos, configuration, deployment, and ongoing service across the UAE. -

-

- Brand names and product trademarks are property of their respective owners. Available exclusively in the UAE through YS Lootah Robotics. +

+ YS Lootah Robotics is part of the Yousuf Saeed Lootah Investment Group — a trusted UAE technology and robotics partner helping businesses innovate, automate, and deploy intelligent robotic solutions. The UAE's dedicated destination for selected Unitree and Pudu Robotics solutions.

+ + + + + + + +

- Why work with us + Our solutions +

+

+ Eleven robotics services covering autonomous deployment, integration, motion programming, cloud, analytics, and live diagnostics. +

+ +
+
+ + +
+

+ Why businesses choose us

diff --git a/src/app/admin/login/page.tsx b/src/app/admin/login/page.tsx index d30f307..213fea1 100644 --- a/src/app/admin/login/page.tsx +++ b/src/app/admin/login/page.tsx @@ -52,10 +52,10 @@ export default function AdminLoginPage() { }}> 🔐
-

+

Admin Login

-

+

Lootah Robotics — G1 Configurator

@@ -112,8 +112,8 @@ export default function AdminLoginPage() { padding: '0.7rem', borderRadius: '0.5rem', border: '1px solid rgba(59, 130, 246, 0.3)', - background: loading ? 'rgba(196, 162, 101, 0.1)' : 'rgba(59, 130, 246, 0.08)', - color: loading ? '#94908a' : '#2563eb', + background: loading ? 'rgba(39, 63, 148, 0.1)' : 'rgba(59, 130, 246, 0.08)', + color: loading ? '#8891C7' : '#2563eb', fontSize: '0.875rem', fontWeight: 600, cursor: loading ? 'not-allowed' : 'pointer', @@ -164,7 +164,7 @@ const inputStyle: React.CSSProperties = { borderRadius: '0.5rem', border: '1px solid rgba(0, 0, 0, 0.1)', background: '#ffffff', - color: '#0a0907', + color: '#0a0a0c', fontSize: '0.875rem', outline: 'none', transition: 'border-color 0.2s ease', diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 8097426..8b7469a 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -488,7 +488,7 @@ export default function AdminPage() { new Date(ts * 1000).toLocaleDateString('en-AE', { day: 'numeric', month: 'short', year: 'numeric' }); if (!isPricingHydrated) { - return

Loading…

; + return

Loading…

; } return ( @@ -497,10 +497,10 @@ export default function AdminPage() { {/* HEADER */}
-

+

Admin Dashboard

-

Lootah Robotics G1 Configurator

+

Lootah Robotics G1 Configurator

@@ -527,7 +527,7 @@ export default function AdminPage() { borderRadius: '0.375rem', border: 'none', background: activeTab === t ? 'rgba(59,130,246,0.08)' : 'transparent', - color: activeTab === t ? '#2563eb' : '#6b6862', + color: activeTab === t ? '#2563eb' : '#6a73a5', fontSize: '0.8rem', fontWeight: activeTab === t ? 600 : 400, cursor: 'pointer', @@ -558,9 +558,9 @@ export default function AdminPage() { aria-label={`Label for ${item.label}`} />
-
{item.id}
+
{item.id}
- AED + AED { const f = e.target.files?.[0] ?? null; @@ -642,7 +642,7 @@ export default function AdminPage() { background: addItemGlb ? 'rgba(59,130,246,0.04)' : '#fff', cursor: 'pointer', fontSize: '0.8rem', - color: addItemGlb ? '#2563eb' : '#94908a', + color: addItemGlb ? '#2563eb' : '#8891C7', transition: 'all 0.2s', }}> { e.preventDefault(); setAddItemGlb(null); }} - style={{ marginLeft: 'auto', background: 'none', border: 'none', cursor: 'pointer', color: '#94908a', fontSize: '0.75rem', padding: '0 2px' }} + style={{ marginLeft: 'auto', background: 'none', border: 'none', cursor: 'pointer', color: '#8891C7', fontSize: '0.75rem', padding: '0 2px' }} >✕ )} @@ -686,7 +686,7 @@ export default function AdminPage() { {activeTab === 'personas' && (
{!isPersonaHydrated ? ( -

Loading personas…

+

Loading personas…

) : ( @@ -694,15 +694,15 @@ export default function AdminPage() {
{p.label}
-
{p.description}
+
{p.description}
- {p.colors.torso} + {p.colors.torso}
- {p.colors.legs} + {p.colors.legs}
{p.id !== 'none' && ( @@ -762,7 +762,7 @@ export default function AdminPage() {
{ordersError &&

{ordersError}

} {!ordersLoading && orders.length === 0 && !ordersError && ( -

No orders found.

+

No orders found.

)} {orders.length > 0 && ( @@ -791,7 +791,7 @@ export default function AdminPage() {
{contactsError &&

{contactsError}

} {!contactsLoading && contacts.length === 0 && !contactsError && ( -

No contact inquiries yet.

+

No contact inquiries yet.

)} {contacts.length > 0 && ( @@ -799,10 +799,10 @@ export default function AdminPage() { {contacts.map((c, i) => (
{c.name}
- -
{c.phone ? {c.phone} : '-'}
+ +
{c.phone ? {c.phone} : '-'}
{c.message}
-
{new Date(c.createdAt).toLocaleDateString('en-AE')}
+
{new Date(c.createdAt).toLocaleDateString('en-AE')}
))}
@@ -813,15 +813,15 @@ export default function AdminPage() { {/* SETTINGS TAB */} {activeTab === 'settings' && (
-

App Settings

+

App Settings

{settingError &&

{settingError}

} {settingsLoading ? ( -

Loading…

+

Loading…

) : ( {settings.length === 0 && ( -

No settings yet.

+

No settings yet.

)} {settings.map((s, i) => ( -

Add Setting

+
+

Add Setting

@@ -869,7 +869,7 @@ export default function AdminPage() { {showPwModal && (
-

Change Password

+

Change Password

{(['current', 'next', 'confirm'] as const).map((field) => (
@@ -918,7 +918,7 @@ function SettingRow({ useEffect(() => { setEditVal(setting.value); }, [setting.value]); return ( -
0 ? '1px solid rgba(0,0,0,0.04)' : 'none' }}> +
0 ? '1px solid rgba(0,0,0,0.04)' : 'none' }}> {setting.key}
{name}
- {email &&
{email}
} -
{order.id}
+ {email &&
{email}
} +
{order.id}
{formatAmount(order.amount, order.currency)}
@@ -1008,17 +1008,17 @@ function OrderRow({ fontSize: '0.65rem', fontWeight: 600, textTransform: 'uppercase', - background: order.status === 'succeeded' ? 'rgba(34,197,94,0.1)' : order.status === 'canceled' ? 'rgba(239,68,68,0.08)' : 'rgba(196, 162, 101,0.15)', - color: order.status === 'succeeded' ? '#16a34a' : order.status === 'canceled' ? '#dc2626' : '#6b6862', + background: order.status === 'succeeded' ? 'rgba(34,197,94,0.1)' : order.status === 'canceled' ? 'rgba(239,68,68,0.08)' : 'rgba(39, 63, 148,0.15)', + color: order.status === 'succeeded' ? '#16a34a' : order.status === 'canceled' ? '#dc2626' : '#6a73a5', }}> {order.status}
-
{formatDate(order.created)}
+
{formatDate(order.created)}
@@ -1073,16 +1073,16 @@ function OrderRow({
))}
- Total - + Total + {formatAmount(order.amount, order.currency)}
) : (
- Total (legacy order) - + Total (legacy order) + {formatAmount(order.amount, order.currency)}
@@ -1090,16 +1090,16 @@ function OrderRow({ {/* Payment ID */} -
+
Payment ID: {order.id}
{/* Right: snapshot */}
-
Robot Snapshot
+
Robot Snapshot
{snapshot === 'loading' && ( -
Loading…
+
Loading…
)} {snapshot && snapshot !== 'loading' && snapshot !== 'none' && ( /* eslint-disable-next-line @next/next/no-img-element */ @@ -1110,7 +1110,7 @@ function OrderRow({ /> )} {snapshot === 'none' && ( -
No snapshot
+
No snapshot
)}
@@ -1122,7 +1122,7 @@ function OrderRow({ function SectionBox({ title, children }: { title: string; children: React.ReactNode }) { return (
-
{title}
+
{title}
{children}
); @@ -1138,7 +1138,7 @@ function InfoField({ label, value }: { label: string; value?: string | null }) { if (!value) return null; return (
-
{label}
+
{label}
{value}
); @@ -1147,8 +1147,8 @@ function InfoField({ label, value }: { label: string; value?: string | null }) { function StatCard({ label, value }: { label: string; value: string }) { return (
-
{label}
-
{value}
+
{label}
+
{value}
); } @@ -1165,7 +1165,7 @@ function TableHeader({ cols, labels }: { cols: string; labels: string[] }) { return (
{labels.map((l) => ( - {l} + {l} ))}
); @@ -1204,7 +1204,7 @@ const formInputStyle: React.CSSProperties = { borderRadius: '0.375rem', border: '1px solid rgba(0,0,0,0.1)', background: '#ffffff', - color: '#0a0907', + color: '#0a0a0c', fontSize: '0.8rem', outline: 'none', boxSizing: 'border-box', @@ -1216,7 +1216,7 @@ const tableInputStyle: React.CSSProperties = { borderRadius: '0.375rem', border: '1px solid rgba(0,0,0,0.1)', background: '#ffffff', - color: '#0a0907', + color: '#0a0a0c', fontSize: '0.8rem', fontFamily: 'monospace', textAlign: 'right' as const, diff --git a/src/app/book-demo/page.tsx b/src/app/book-demo/page.tsx index eec4658..1484851 100644 --- a/src/app/book-demo/page.tsx +++ b/src/app/book-demo/page.tsx @@ -21,7 +21,7 @@ export default function BookDemoPage() {

See the future in person.

-

+

Book a live robot demo at our Dubai showroom or schedule an on-site demo at your venue. Our team will tailor the demo to your use case before you arrive.

@@ -32,8 +32,8 @@ export default function BookDemoPage() { 'Walk through configuration and deployment options', 'Get UAE-specific pricing and availability', ].map((b) => ( -
  • - +
  • + {b}
  • ))} diff --git a/src/app/brands/page.tsx b/src/app/brands/page.tsx index 75509a2..28ff4b0 100644 --- a/src/app/brands/page.tsx +++ b/src/app/brands/page.tsx @@ -28,10 +28,10 @@ export default function BrandsPage() { Selected Unitree and Pudu solutions — exclusively in the UAE. -

    +

    YS Lootah Robotics holds exclusive UAE sales rights for selected Unitree and Pudu Robotics solutions — with on-the-ground sales, demo, and deployment support across Dubai and the UAE.

    -

    +

    Brand names and product trademarks are property of their respective owners. Available exclusively in the UAE through YS Lootah Robotics.

    @@ -57,7 +57,7 @@ export default function BrandsPage() { {robots.length} model{robots.length === 1 ? '' : 's'}
    -

    +

    {brand.description}

    diff --git a/src/app/configure/page.tsx b/src/app/configure/page.tsx index 40f4162..cc44321 100644 --- a/src/app/configure/page.tsx +++ b/src/app/configure/page.tsx @@ -17,8 +17,8 @@ export default function ConfigurePage() { paddingLeft: 'clamp(1rem, 4vw, 2rem)', paddingRight: 'clamp(1rem, 4vw, 2rem)', background: - 'radial-gradient(ellipse 60% 80% at 50% 0%, rgba(196, 162, 101,0.12), transparent 60%), linear-gradient(180deg, #050505 0%, #030303 100%)', - borderBottom: '1px solid rgba(196, 162, 101,0.12)', + 'radial-gradient(ellipse 60% 80% at 50% 0%, rgba(39, 63, 148,0.12), transparent 60%), linear-gradient(180deg, #050505 0%, #030303 100%)', + borderBottom: '1px solid rgba(39, 63, 148,0.12)', }} >
    @@ -34,7 +34,7 @@ export default function ConfigurePage() { > Configure your robot. -

    +

    Choose persona, attire, colors, and accessories — visualize your Unitree G1 humanoid before you request a quotation from YS Lootah Robotics.

    diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index c71b3ae..511b741 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -21,14 +21,14 @@ export default function ContactPage() {

    Talk to our Dubai robotics team.

    -

    +

    Tell us about your venue, timeline, and use case. We will recommend a robot, share availability, and book a live demo at our Dubai showroom.

    - +
    @@ -60,13 +60,13 @@ function ContactRow({ label, value, href, external = false }: { label: string; v alignItems: 'center', gap: '1rem', padding: '0.75rem 0', - borderBottom: '1px solid rgba(196, 162, 101,0.1)', + borderBottom: '1px solid rgba(39, 63, 148,0.1)', textDecoration: 'none', - color: '#f5f1e8', + color: '#FBFBFD', }} > - {label} - {value} + {label} + {value} ); } diff --git a/src/app/globals.css b/src/app/globals.css index e7898a7..cd2ef36 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,44 +1,48 @@ @import "tailwindcss"; @theme { - /* === Luxury robotics — Black + Gold === */ - --color-bg: #050505; - --color-bg-2: #0a0a0c; - --color-bg-3: #111114; - --color-bg-4: #18181c; - --color-surface: rgba(20, 18, 14, 0.7); - --color-primary: #050505; - --color-secondary: #0a0a0c; + /* === Luxury robotics — Graphite + Royal Blue + Silver === */ + --color-bg: #0a0a0c; + --color-bg-2: #16151a; + --color-bg-3: #1c1b21; + --color-bg-4: #221f20; + --color-surface: rgba(34, 31, 32, 0.7); + --color-primary: #0a0a0c; + --color-secondary: #16151a; - /* Gold spectrum (matches YS Lootah brand) */ - --color-gold: #c4a265; - --color-gold-light: #e0c896; - --color-gold-rich: #d4af6a; - --color-gold-bronze: #8b6f47; - --color-gold-deep: #6b5436; + /* Logo palette */ + --color-blue: #273F94; + --color-blue-deep: #1a2e6e; + --color-blue-bright: #3a55c4; + --color-silver: #DEE0F0; + --color-silver-soft: #BFC3E2; + --color-steel: #8891C7; + --color-graphite: #221F20; + --color-white: #FBFBFD; - /* Accent aliases */ - --color-accent: #c4a265; - --color-accent-2: #d4af6a; - --color-accent-3: #8b6f47; - --color-accent-hover: #d4af6a; + /* Accent aliases (kept for legacy class names) */ + --color-gold: #DEE0F0; + --color-accent: #273F94; + --color-accent-2: #BFC3E2; + --color-accent-3: #8891C7; + --color-accent-hover: #3a55c4; /* Text */ - --color-text-primary: #f5f1e8; - --color-text-secondary: #cbc4b3; - --color-text-muted: #94908a; - --color-text-dim: #6b6862; + --color-text-primary: #FBFBFD; + --color-text-secondary: #DEE0F0; + --color-text-muted: #8891C7; + --color-text-dim: #6a73a5; /* Borders */ - --color-border: rgba(196, 162, 101, 0.18); - --color-border-strong: rgba(196, 162, 101, 0.36); - --color-border-light: rgba(196, 162, 101, 0.08); - --color-border-neutral: rgba(245, 241, 232, 0.08); + --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-neutral: rgba(255, 255, 255, 0.08); /* Glass */ - --color-glass-bg: rgba(20, 18, 14, 0.55); - --color-glass-border: rgba(196, 162, 101, 0.22); - --color-glass-highlight: rgba(245, 241, 232, 0.05); + --color-glass-bg: rgba(28, 27, 33, 0.6); + --color-glass-border: rgba(191, 195, 226, 0.22); + --color-glass-highlight: rgba(222, 224, 240, 0.06); /* Spacing */ --spacing-xs: 0.25rem; @@ -56,9 +60,9 @@ --radius-2xl: 1.5rem; /* Shadows */ - --shadow-glow: 0 0 30px rgba(196, 162, 101, 0.22); - --shadow-glow-lg: 0 0 60px rgba(196, 162, 101, 0.28); - --shadow-card: 0 14px 50px rgba(0, 0, 0, 0.55); + --shadow-glow: 0 0 30px rgba(39, 63, 148, 0.32); + --shadow-glow-lg: 0 0 60px rgba(39, 63, 148, 0.4); + --shadow-card: 0 14px 50px rgba(0, 0, 0, 0.6); /* Transitions */ --transition-fast: 150ms ease; @@ -81,10 +85,10 @@ body { body { background: - radial-gradient(1200px 700px at 80% -10%, rgba(196, 162, 101, 0.10), transparent 60%), - radial-gradient(900px 500px at -10% 30%, rgba(196, 162, 101, 0.06), transparent 60%), - radial-gradient(800px 500px at 50% 110%, rgba(139, 111, 71, 0.10), transparent 60%), - linear-gradient(180deg, #030303 0%, #050505 50%, #030303 100%); + radial-gradient(1200px 700px at 80% -10%, rgba(39, 63, 148, 0.18), transparent 60%), + radial-gradient(900px 500px at -10% 30%, rgba(58, 85, 196, 0.10), transparent 60%), + radial-gradient(800px 500px at 50% 110%, rgba(136, 145, 199, 0.10), transparent 60%), + linear-gradient(180deg, #050507 0%, #0a0a0c 50%, #050507 100%); background-attachment: fixed; } @@ -93,12 +97,12 @@ html { } :focus-visible { - outline: 2px solid var(--color-gold); + outline: 2px solid var(--color-blue); outline-offset: 2px; } ::selection { - background-color: rgba(196, 162, 101, 0.4); + background-color: rgba(39, 63, 148, 0.55); color: #ffffff; } @@ -123,9 +127,9 @@ html { background: linear-gradient(135deg, var(--color-glass-highlight) 0%, transparent 60%); } -/* === Typography gradients === */ +/* === Typography gradients (metallic silver-blue) === */ .text-gradient { - background: linear-gradient(135deg, #ffffff 0%, #f5e9c8 40%, #d4af6a 100%); + background: linear-gradient(135deg, #FBFBFD 0%, #DEE0F0 45%, #8891C7 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; @@ -133,18 +137,17 @@ html { } .text-gradient-accent { - background: linear-gradient(135deg, #e0c896 0%, #c4a265 50%, #8b6f47 100%); + background: linear-gradient(135deg, #FBFBFD 0%, #DEE0F0 35%, #BFC3E2 65%, #273F94 100%); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent; } -.text-gold { - color: var(--color-gold); -} +.text-blue { color: var(--color-blue); } +.text-silver { color: var(--color-silver); } -/* Metallic gold border */ +/* Metallic silver-blue border */ .metallic-border { position: relative; } @@ -154,7 +157,7 @@ html { inset: 0; border-radius: inherit; padding: 1px; - background: linear-gradient(135deg, rgba(224, 200, 150, 0.6), rgba(196, 162, 101, 0.25) 45%, rgba(139, 111, 71, 0.0) 100%); + background: linear-gradient(135deg, rgba(222, 224, 240, 0.55), rgba(136, 145, 199, 0.3) 45%, rgba(39, 63, 148, 0.0) 100%); -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0); -webkit-mask-composite: xor; mask-composite: exclude; @@ -166,10 +169,10 @@ html { position: absolute; inset: 0; background: - radial-gradient(ellipse 70% 60% at 60% 40%, rgba(196, 162, 101, 0.20) 0%, transparent 60%), - radial-gradient(ellipse 60% 50% at 20% 70%, rgba(139, 111, 71, 0.18) 0%, transparent 55%), - radial-gradient(ellipse 80% 70% at 80% 100%, rgba(224, 200, 150, 0.14) 0%, transparent 60%), - linear-gradient(180deg, #050505 0%, #070605 50%, #030303 100%); + radial-gradient(ellipse 70% 60% at 60% 40%, rgba(39, 63, 148, 0.32) 0%, transparent 60%), + radial-gradient(ellipse 60% 50% at 20% 70%, rgba(58, 85, 196, 0.22) 0%, transparent 55%), + radial-gradient(ellipse 80% 70% at 80% 100%, rgba(136, 145, 199, 0.18) 0%, transparent 60%), + linear-gradient(180deg, #07080c 0%, #0a0a10 50%, #050507 100%); animation: heroShift 16s ease-in-out infinite alternate; } @@ -183,8 +186,8 @@ html { position: absolute; inset: 0; background-image: - linear-gradient(rgba(196, 162, 101, 0.04) 1px, transparent 1px), - linear-gradient(90deg, rgba(196, 162, 101, 0.04) 1px, transparent 1px); + linear-gradient(rgba(191, 195, 226, 0.05) 1px, transparent 1px), + linear-gradient(90deg, rgba(191, 195, 226, 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%); @@ -199,12 +202,29 @@ html { } .shimmer { - background: linear-gradient(110deg, transparent 35%, rgba(224, 200, 150, 0.12) 50%, transparent 65%); + background: linear-gradient(110deg, transparent 35%, rgba(222, 224, 240, 0.14) 50%, transparent 65%); background-size: 200% 100%; animation: shimmer 3.5s linear infinite; } @keyframes shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } } +/* Cinematic light sweep across hero */ +.light-sweep { + position: absolute; + inset: 0; + pointer-events: none; + background: linear-gradient(110deg, transparent 30%, rgba(191, 195, 226, 0.07) 50%, transparent 70%); + background-size: 250% 100%; + animation: lightSweep 9s ease-in-out infinite; + mix-blend-mode: screen; +} +@keyframes lightSweep { + 0% { background-position: 200% 0; opacity: 0; } + 25% { opacity: 1; } + 75% { opacity: 1; } + 100% { background-position: -200% 0; opacity: 0; } +} + .float-y { animation: floatY 6s ease-in-out infinite; } @keyframes floatY { 0%, 100% { transform: translateY(0); } @@ -214,8 +234,8 @@ html { @keyframes spin { to { transform: rotate(360deg); } } @keyframes pulseGlow { - 0%, 100% { box-shadow: 0 0 0 0 rgba(196, 162, 101, 0.55), 0 0 40px rgba(196, 162, 101, 0.25); } - 50% { box-shadow: 0 0 0 12px rgba(196, 162, 101, 0), 0 0 60px rgba(196, 162, 101, 0.45); } + 0%, 100% { box-shadow: 0 0 0 0 rgba(39, 63, 148, 0.55), 0 0 40px rgba(39, 63, 148, 0.32); } + 50% { box-shadow: 0 0 0 12px rgba(39, 63, 148, 0), 0 0 60px rgba(39, 63, 148, 0.55); } } /* Scroll indicator */ @@ -232,7 +252,7 @@ html { left: 0; width: 1px; height: 100%; - background: linear-gradient(180deg, var(--color-gold), transparent); + background: linear-gradient(180deg, var(--color-blue), transparent); animation: scrollPulse 2s ease-in-out infinite; } @keyframes scrollPulse { @@ -243,8 +263,8 @@ html { /* === Scrollbar === */ ::-webkit-scrollbar { width: 8px; height: 8px; } ::-webkit-scrollbar-track { background: var(--color-bg-2); } -::-webkit-scrollbar-thumb { background: rgba(196, 162, 101, 0.25); border-radius: var(--radius-sm); } -::-webkit-scrollbar-thumb:hover { background: rgba(196, 162, 101, 0.55); } +::-webkit-scrollbar-thumb { background: rgba(136, 145, 199, 0.28); border-radius: var(--radius-sm); } +::-webkit-scrollbar-thumb:hover { background: rgba(39, 63, 148, 0.7); } /* === Buttons === */ .btn { @@ -266,33 +286,33 @@ html { .btn:hover { transform: translateY(-1px); } .btn-primary { - background: linear-gradient(135deg, #e0c896 0%, #c4a265 55%, #8b6f47 100%); - color: #0b0905; - box-shadow: 0 8px 28px rgba(196, 162, 101, 0.35), inset 0 1px 0 rgba(255, 244, 220, 0.4); + background: linear-gradient(135deg, #3a55c4 0%, #273F94 55%, #1a2e6e 100%); + color: #FBFBFD; + box-shadow: 0 8px 28px rgba(39, 63, 148, 0.45), inset 0 1px 0 rgba(222, 224, 240, 0.25); } .btn-primary:hover { - box-shadow: 0 12px 38px rgba(224, 200, 150, 0.55), inset 0 1px 0 rgba(255, 244, 220, 0.5); + box-shadow: 0 12px 38px rgba(58, 85, 196, 0.6), inset 0 1px 0 rgba(222, 224, 240, 0.35); } .btn-ghost { - background: rgba(245, 241, 232, 0.04); - color: #f5f1e8; - border-color: rgba(196, 162, 101, 0.28); + background: rgba(222, 224, 240, 0.04); + color: #FBFBFD; + border-color: rgba(191, 195, 226, 0.28); backdrop-filter: blur(12px); } .btn-ghost:hover { - background: rgba(196, 162, 101, 0.10); - border-color: rgba(196, 162, 101, 0.55); - color: #e0c896; + background: rgba(39, 63, 148, 0.16); + border-color: rgba(136, 145, 199, 0.6); + color: #DEE0F0; } .btn-outline { background: transparent; - color: #e0c896; - border-color: rgba(196, 162, 101, 0.55); + color: #DEE0F0; + border-color: rgba(136, 145, 199, 0.55); } .btn-outline:hover { - background: rgba(196, 162, 101, 0.10); + background: rgba(39, 63, 148, 0.14); } /* === Layout helpers === */ @@ -312,13 +332,13 @@ html { content: ''; width: 28px; height: 1px; - background: linear-gradient(90deg, transparent, var(--color-gold)); + background: linear-gradient(90deg, transparent, var(--color-silver)); } /* === Cards === */ .card { position: relative; - background: rgba(10, 9, 7, 0.72); + background: rgba(22, 21, 26, 0.72); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid var(--color-border); @@ -328,8 +348,8 @@ html { } .card:hover { transform: translateY(-6px); - border-color: rgba(196, 162, 101, 0.55); - box-shadow: 0 20px 60px rgba(0,0,0,0.7), 0 0 40px rgba(196, 162, 101, 0.15); + border-color: rgba(136, 145, 199, 0.55); + box-shadow: 0 20px 60px rgba(0,0,0,0.7), 0 0 40px rgba(39, 63, 148, 0.22); } /* === Configurator (preserve previous theme rules) === */ @@ -461,6 +481,7 @@ html { scroll-behavior: auto !important; } .hero-gradient { animation: none !important; } + .light-sweep { animation: none !important; opacity: 0 !important; } } html, body { overflow-x: hidden; max-width: 100vw; } diff --git a/src/app/industries/page.tsx b/src/app/industries/page.tsx index e837d4b..8f9f010 100644 --- a/src/app/industries/page.tsx +++ b/src/app/industries/page.tsx @@ -25,7 +25,7 @@ export default function IndustriesPage() { Robotics solutions for UAE businesses. -

    +

    We deploy humanoid, quadruped, and service robots across industries that are reshaping how the UAE operates — every venue is matched to the right robot.

    diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 814846e..83acf4a 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -45,7 +45,7 @@ export const metadata: Metadata = { export const viewport: Viewport = { width: 'device-width', initialScale: 1, - themeColor: '#050505', + themeColor: '#0a0a0c', }; export default function RootLayout({ diff --git a/src/app/page.tsx b/src/app/page.tsx index d2253c3..2e4cd8f 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -12,6 +12,10 @@ import { ExclusiveAccessSection } from '@/components/robotics/ExclusiveAccessSec import { MarqueeStrip } from '@/components/robotics/MarqueeStrip'; import { BentoGrid } from '@/components/robotics/BentoGrid'; import { HowItWorks } from '@/components/robotics/HowItWorks'; +import { CompanyStory } from '@/components/robotics/CompanyStory'; +import { ServicesGrid } from '@/components/robotics/ServicesGrid'; +import { FounderSection } from '@/components/robotics/FounderSection'; +import { BuSunaidahSection } from '@/components/robotics/BuSunaidahSection'; import { MotionSection } from '@/components/ui/MotionSection'; import { FEATURED_ROBOTS } from '@/data/robots'; @@ -51,6 +55,12 @@ export default function HomePage() {
    + +
    + +
    +
    +
    + +
    + + +
    +
    + + +
    + +
    +
    + + +
    + +
    +
    +
    {title} {description && ( -

    +

    {description}

    )} diff --git a/src/app/privacy-policy/page.tsx b/src/app/privacy-policy/page.tsx index 4ba77b1..ccbd3cd 100644 --- a/src/app/privacy-policy/page.tsx +++ b/src/app/privacy-policy/page.tsx @@ -9,38 +9,38 @@ export default function PrivacyPolicyPage() {

    Privacy Policy

    -

    Effective Date: {new Date().toLocaleDateString('en-AE')}

    +

    Effective Date: {new Date().toLocaleDateString('en-AE')}

    1. Information We Collect

    -

    +

    At YS Lootah Robotics, we collect information you provide directly to us when you request information, use the G1 Customizer, or contact us. This includes your name, email address, phone number, and any other information you choose to provide in your message.

    2. How We Use Your Information

    -

    +

    We use the information we collect to respond to your inquiries, deliver our robotics enterprise solutions, maintain our dashboard, and communicate with you about your custom humanoid configurations.

    3. Data Security

    -

    +

    We implement robust security measures designed to protect your personal information. Your contact data is stored securely in our private databases strictly for administrative and operational purposes.

    4. Contact Us

    -

    +

    If you have questions or concerns about this Privacy Policy, please reach out to us at:

    YS Lootah Robotics
    Office 408, City Bay Business Center
    Dubai, United Arab Emirates
    - Email: info@yslootahtech.com + Email: info@yslootahrobotics.com

    diff --git a/src/app/robots/CatalogClient.tsx b/src/app/robots/CatalogClient.tsx index 229a31e..17ead7c 100644 --- a/src/app/robots/CatalogClient.tsx +++ b/src/app/robots/CatalogClient.tsx @@ -71,7 +71,7 @@ function CatalogInner() {
    - + {filtered.length} robot{filtered.length === 1 ? '' : 's'} found {(filter.brand !== 'all' || filter.category !== 'all') && ( @@ -81,7 +81,7 @@ function CatalogInner() { style={{ background: 'transparent', border: 'none', - color: '#e0c896', + color: '#DEE0F0', fontSize: '0.78rem', letterSpacing: '0.14em', textTransform: 'uppercase', @@ -95,9 +95,9 @@ function CatalogInner() {
    {filtered.length === 0 ? ( -
    +
    No robots match these filters yet. Try a different brand or category, or{' '} - contact us for tailored options. + contact us for tailored options.
    ) : (
    Loading catalog…
    }> + Loading catalog…
    }> ); diff --git a/src/app/robots/[slug]/page.tsx b/src/app/robots/[slug]/page.tsx index 172cd6a..8b7b9c0 100644 --- a/src/app/robots/[slug]/page.tsx +++ b/src/app/robots/[slug]/page.tsx @@ -43,12 +43,12 @@ export default async function RobotDetailPage({ params }: { params: Promise
    -
    diff --git a/src/app/robots/page.tsx b/src/app/robots/page.tsx index 75d2886..ff6e8ab 100644 --- a/src/app/robots/page.tsx +++ b/src/app/robots/page.tsx @@ -23,7 +23,7 @@ export default function RobotsPage() { Robots ready to deploy across the UAE. -

    +

    Browse {ROBOTS.length}+ models across our portfolio. Filter by brand or category, then request a price or book a live demo at our Dubai showroom.

    diff --git a/src/app/terms-of-service/page.tsx b/src/app/terms-of-service/page.tsx index 3809e06..03a986a 100644 --- a/src/app/terms-of-service/page.tsx +++ b/src/app/terms-of-service/page.tsx @@ -9,32 +9,32 @@ export default function TermsOfServicePage() {

    Terms of Service

    -

    Effective Date: {new Date().toLocaleDateString('en-AE')}

    +

    Effective Date: {new Date().toLocaleDateString('en-AE')}

    1. Acceptance of Terms

    -

    +

    By accessing and utilizing the YS Lootah Robotics web platform and the G1 Configurator, you accept and agree to be bound by the terms and provisions of this agreement.

    2. Use of the Site & Configurator

    -

    +

    The 3D G1 Configurator is provided for informational and demonstrative purposes to showcase the capabilities of YS Lootah technologies. You agree to use this site strictly for lawful purposes resulting in enterprise robotics inquiries and configurations.

    3. Intellectual Property Rights

    -

    +

    All original content on this website, including but not limited to text, graphics, 3D models (GLB files), logos, and software, is the exclusive property of YS Lootah Robotics and is protected by United Arab Emirates and international copyright laws.

    4. Disclaimer of Warranties

    -

    +

    The materials on our platform are provided "as is". We make no warranties, expressed or implied, and hereby disclaim to the fullest extent permitted by law all warranties regarding the immediate enterprise availability of the rendered concepts displayed in the Configurator.

    diff --git a/src/components/CheckoutOverlay.tsx b/src/components/CheckoutOverlay.tsx index ca7a157..c354616 100644 --- a/src/components/CheckoutOverlay.tsx +++ b/src/components/CheckoutOverlay.tsx @@ -103,7 +103,7 @@ export function CheckoutOverlay() { borderRadius: '0.375rem', border: '1px solid rgba(0, 0, 0, 0.08)', background: 'transparent', - color: '#94908a', + color: '#8891C7', cursor: 'pointer', fontSize: '0.75rem', transition: 'all 0.2s ease', @@ -111,7 +111,7 @@ export function CheckoutOverlay() { > Back -

    +

    Checkout

    ) : ( - Initializing secure payment... + Initializing secure payment... )}
    ) : null} diff --git a/src/components/ConfigPanel.tsx b/src/components/ConfigPanel.tsx index b0fff7b..0751769 100644 --- a/src/components/ConfigPanel.tsx +++ b/src/components/ConfigPanel.tsx @@ -141,14 +141,14 @@ export function ConfigPanel() {
    {persona.label}
    {persona.description} @@ -221,14 +221,14 @@ export function ConfigPanel() {
    {opt.label}
    {opt.description} @@ -282,7 +282,7 @@ function ColorInput({ label, value, onChange }: { label: string; value: string; />
    {label}
    -
    {value}
    +
    {value}
    ); @@ -291,7 +291,7 @@ function ColorInput({ label, value, onChange }: { label: string; value: string; const sectionTitleStyle: React.CSSProperties = { fontSize: '0.75rem', fontWeight: 500, - color: '#94908a', + color: '#8891C7', textTransform: 'uppercase', letterSpacing: '0.05em', margin: 0, diff --git a/src/components/ConfiguratorSection.tsx b/src/components/ConfiguratorSection.tsx index a59361a..fb1f8e8 100644 --- a/src/components/ConfiguratorSection.tsx +++ b/src/components/ConfiguratorSection.tsx @@ -94,7 +94,7 @@ export function ConfiguratorSection() { style={{ fontSize: '1rem', fontWeight: 600, - color: '#0a0907', + color: '#0a0a0c', margin: 0, }} > @@ -156,7 +156,7 @@ export function ConfiguratorSection() { animation: 'spin 1s linear infinite', }} /> -

    +

    {t('loading.configuration')}

    diff --git a/src/components/FooterAndContact.tsx b/src/components/FooterAndContact.tsx index 4870695..4f872e8 100644 --- a/src/components/FooterAndContact.tsx +++ b/src/components/FooterAndContact.tsx @@ -1,12 +1,13 @@ 'use client'; import Link from 'next/link'; +import Image from 'next/image'; import { BRANDS } from '@/data/robots'; const CONTACT = { phonePrimary: '+971 55 948 2728', phoneSecondary: '+971 4 349 9319', - email: 'info@yslootahtech.com', + email: 'info@yslootahrobotics.com', address: 'Office 408, City Bay Business Center, Dubai, UAE', whatsapp: 'https://wa.me/971559482728', maps: 'https://maps.google.com/?q=Office+408+City+Bay+Business+Center+Dubai', @@ -22,10 +23,10 @@ export function FooterAndContact() { position: 'relative', zIndex: 10, marginTop: 'clamp(4rem, 8vw, 6rem)', - borderTop: '1px solid rgba(196, 162, 101,0.12)', + borderTop: '1px solid rgba(39, 63, 148,0.12)', background: - 'radial-gradient(ellipse 80% 60% at 50% 0%, rgba(196, 162, 101,0.05), transparent 60%), linear-gradient(180deg, #030303, #02040a)', - color: '#cbc4b3', + 'radial-gradient(ellipse 80% 60% at 50% 0%, rgba(39, 63, 148,0.05), transparent 60%), linear-gradient(180deg, #030303, #02040a)', + color: '#DEE0F0', }} >
    @@ -38,37 +39,41 @@ export function FooterAndContact() { }} >
    -
    +
    - - - - + YS Lootah Robotics logo YS Lootah - + Robotics
    -

    - Premium humanoid, quadruped, and service robotics — available through YS Lootah Robotics for businesses and innovators across Dubai and the UAE. +

    + In Tech We Innovate · In Trust We Lead +

    +

    + Innovating today for a smarter tomorrow. YS Lootah Robotics — the UAE's dedicated destination for selected Unitree and Pudu Robotics solutions.

    @@ -110,7 +115,7 @@ export function FooterAndContact() { />
    -

    +

    Contact

    -
    -

    +

    +

    © {new Date().getFullYear()} YS Lootah Robotics. All rights reserved.

    -

    +

    Website designed & developed by{' '} - + YS Lootah Tech

    - Privacy - Terms + Privacy + Terms
    @@ -159,7 +164,7 @@ export function FooterAndContact() { const footerLink: React.CSSProperties = { fontSize: '0.9rem', - color: '#cbc4b3', + color: '#DEE0F0', textDecoration: 'none', transition: 'color 0.2s', }; @@ -167,7 +172,7 @@ const footerLink: React.CSSProperties = { function ColumnLinks({ title, items }: { title: string; items: { label: string; href: string }[] }) { return (
    -

    +

    {title}

      @@ -196,8 +201,8 @@ function SocialLink({ href, label, path }: { href: string; label: string; path: alignItems: 'center', justifyContent: 'center', background: 'rgba(15, 12, 8,0.6)', - border: '1px solid rgba(196, 162, 101,0.18)', - color: '#94908a', + border: '1px solid rgba(39, 63, 148,0.18)', + color: '#8891C7', transition: 'all 0.25s ease', }} > diff --git a/src/components/InteractiveHotspot.tsx b/src/components/InteractiveHotspot.tsx index 6b82da6..1d5596d 100644 --- a/src/components/InteractiveHotspot.tsx +++ b/src/components/InteractiveHotspot.tsx @@ -116,7 +116,7 @@ export function InteractiveHotspot({ whiteSpace: 'nowrap', fontFamily: 'system-ui, -apple-system, sans-serif', fontSize: '12px', - color: '#0a0907', + color: '#0a0a0c', boxShadow: '0 4px 12px rgba(0, 0, 0, 0.3)', animation: 'fadeIn 0.15s ease-out', }} @@ -125,7 +125,7 @@ export function InteractiveHotspot({
      @@ -66,31 +67,33 @@ export function Navbar() { transition: 'padding 0.3s ease', }} > - setMobileOpen(false)}> + setMobileOpen(false)} aria-label="YS Lootah Robotics — Home"> - - - - + YS Lootah Robotics logo YS Lootah - + Robotics @@ -103,7 +106,7 @@ export function Navbar() { href={l.href} style={{ position: 'relative', - color: isActive(l.href) ? '#e0c896' : '#cbc4b3', + color: isActive(l.href) ? '#DEE0F0' : '#DEE0F0', fontSize: '0.78rem', fontWeight: 600, textDecoration: 'none', @@ -111,7 +114,7 @@ export function Navbar() { textTransform: 'uppercase', transition: 'color 0.2s', paddingBottom: 4, - borderBottom: isActive(l.href) ? '1px solid #e0c896' : '1px solid transparent', + borderBottom: isActive(l.href) ? '1px solid #DEE0F0' : '1px solid transparent', }} > {l.label} @@ -137,9 +140,9 @@ export function Navbar() { width: 42, height: 42, borderRadius: 12, - border: '1px solid rgba(196, 162, 101,0.2)', + border: '1px solid rgba(39, 63, 148,0.2)', background: 'rgba(15, 12, 8,0.6)', - color: '#f5f1e8', + color: '#FBFBFD', cursor: 'pointer', display: 'none', alignItems: 'center', @@ -185,11 +188,11 @@ export function Navbar() { style={{ fontSize: '1.5rem', fontWeight: 500, - color: isActive(l.href) ? '#e0c896' : '#f5f1e8', + color: isActive(l.href) ? '#DEE0F0' : '#FBFBFD', textDecoration: 'none', letterSpacing: '-0.01em', padding: '0.75rem 0', - borderBottom: '1px solid rgba(196, 162, 101,0.12)', + borderBottom: '1px solid rgba(39, 63, 148,0.12)', display: 'flex', justifyContent: 'space-between', alignItems: 'center', diff --git a/src/components/PayloadMesh.tsx b/src/components/PayloadMesh.tsx index 9c42859..3c1b433 100644 --- a/src/components/PayloadMesh.tsx +++ b/src/components/PayloadMesh.tsx @@ -94,7 +94,7 @@ function PayloadLoader({ modelPath }: { modelPath: string }) { if (child instanceof THREE.Mesh) { if (child.material) { child.material = new THREE.MeshStandardMaterial({ - color: '#6b6862', + color: '#6a73a5', metalness: 0.6, roughness: 0.4, }); diff --git a/src/components/PricingEngine.tsx b/src/components/PricingEngine.tsx index 4a0ddf6..99f73e4 100644 --- a/src/components/PricingEngine.tsx +++ b/src/components/PricingEngine.tsx @@ -70,7 +70,7 @@ export function PricingEngine() {

      Total - + AED {formatAED(total)}

      @@ -136,7 +136,7 @@ function PriceLine({ label, price }: { label: string; price: number }) { justifyContent: 'space-between', alignItems: 'center', }}> - {label} + {label} AED {formatAED(price)} diff --git a/src/components/RobotCanvas.tsx b/src/components/RobotCanvas.tsx index a449d5c..8b4b662 100644 --- a/src/components/RobotCanvas.tsx +++ b/src/components/RobotCanvas.tsx @@ -29,7 +29,7 @@ function Loader() { borderRadius: '50%', animation: 'spin 1s linear infinite', }} /> -

      +

      {progress.toFixed(0)}% loaded

    @@ -53,7 +53,7 @@ function SceneContent({ onCapture }: { onCapture: (gl: WebGLRenderer, scene: Sce - + @@ -148,7 +148,7 @@ export function RobotCanvas() {