102 lines
4.3 KiB
TypeScript
102 lines
4.3 KiB
TypeScript
import type { Metadata, Viewport } from "next";
|
||
import { ErrorBoundary } from "@/components/ErrorBoundary";
|
||
import { I18nProvider } from "@/components/I18nProvider";
|
||
import JsonLd from "@/components/JsonLd";
|
||
import { SITE_URL, OG_IMAGE, siteName, organizationJsonLd, websiteJsonLd } from "@/lib/seo";
|
||
import "./globals.css";
|
||
|
||
export const metadata: Metadata = {
|
||
metadataBase: new URL(SITE_URL),
|
||
title: {
|
||
default: 'YS Lootah Robotics UAE Destination for Unitree & Pudu Robotics',
|
||
template: '%s | YS Lootah Robotics',
|
||
},
|
||
description:
|
||
'YS Lootah Robotics is the UAE sales destination for selected Unitree and Pudu Robotics solutions. Explore, configure, book demos, and deploy advanced robots across Dubai and the UAE.',
|
||
keywords: [
|
||
'YS Lootah Robotics',
|
||
'robotics Dubai',
|
||
'robotics UAE',
|
||
'robotics UAE destination',
|
||
'Unitree robots UAE',
|
||
'Pudu Robotics UAE',
|
||
'humanoid robots Dubai',
|
||
'quadruped robots UAE',
|
||
'service robots UAE',
|
||
'robot sales Dubai',
|
||
'book robot demo UAE',
|
||
'robotics showroom Dubai',
|
||
'robotics configuration UAE',
|
||
],
|
||
openGraph: {
|
||
type: 'website',
|
||
url: '/',
|
||
title: 'YS Lootah Robotics UAE Destination for Unitree & Pudu Robotics',
|
||
description:
|
||
'Advanced robotics. UAE access. Selected Unitree and Pudu solutions available through YS Lootah Robotics in Dubai.',
|
||
locale: 'en_AE',
|
||
siteName: 'YS Lootah Robotics',
|
||
images: [{ url: OG_IMAGE, width: 1200, height: 630, alt: siteName }],
|
||
},
|
||
twitter: {
|
||
card: 'summary_large_image',
|
||
title: 'YS Lootah Robotics UAE Destination for Unitree & Pudu Robotics',
|
||
description:
|
||
'The UAE’s dedicated destination for Unitree and Pudu Robotics sales, demo inquiries, and business deployment.',
|
||
images: [OG_IMAGE],
|
||
},
|
||
manifest: '/site.webmanifest',
|
||
robots: {
|
||
index: true,
|
||
follow: true,
|
||
googleBot: {
|
||
index: true,
|
||
follow: true,
|
||
'max-image-preview': 'large',
|
||
'max-snippet': -1,
|
||
'max-video-preview': -1,
|
||
},
|
||
},
|
||
};
|
||
|
||
export const viewport: Viewport = {
|
||
width: 'device-width',
|
||
initialScale: 1,
|
||
themeColor: '#0b0b0b',
|
||
};
|
||
|
||
export default function RootLayout({
|
||
children,
|
||
}: {
|
||
children: React.ReactNode;
|
||
}) {
|
||
return (
|
||
<html lang="en" dir="ltr" data-scroll-behavior="smooth">
|
||
<head>
|
||
<link rel="icon" href="/favicon.ico" sizes="any" />
|
||
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@200;300;400;500;600;700&display=swap" rel="stylesheet" />
|
||
</head>
|
||
<body suppressHydrationWarning>
|
||
<JsonLd data={[organizationJsonLd, websiteJsonLd]} />
|
||
<ErrorBoundary>
|
||
<I18nProvider>
|
||
{children}
|
||
{/* WhatsApp Floating Button */}
|
||
<a href="https://wa.me/971559482728" target="_blank" rel="noopener noreferrer" aria-label="Contact us on WhatsApp" className="wa-fab fixed z-50 flex items-center justify-center h-14 w-14 rounded-full bg-gradient-to-r from-[#25D366] to-[#128C7E] text-white shadow-lg shadow-[#25D366]/30 transition-all duration-300 ease-out hover:scale-110 hover:shadow-[#25D366]/50 hover:shadow-xl active:scale-95 group" style={{ right: 'max(1rem, env(safe-area-inset-right, 0px))' }}>
|
||
<span className="absolute inset-0 -z-10 rounded-full bg-gradient-to-r from-[#25D366] to-[#128C7E] opacity-0 blur-xl transition-opacity duration-300 group-hover:opacity-100"></span>
|
||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="tabler-icon tabler-icon-brand-whatsapp relative z-10 h-8 w-8">
|
||
<path d="M3 21l1.65 -3.8a9 9 0 1 1 3.4 2.9l-5.05 .9"></path>
|
||
<path d="M9 10a.5 .5 0 0 0 1 0v-1a.5 .5 0 0 0 -1 0v1a5 5 0 0 0 5 5h1a.5 .5 0 0 0 0 -1h-1a.5 .5 0 0 0 0 1"></path>
|
||
</svg>
|
||
<span aria-hidden="true" className="absolute inset-0 rounded-full border border-[#25D366] bg-[#25D366]/50 animate-[ping_2.2s_cubic-bezier(0,0,0.2,1)_infinite]"></span>
|
||
</a>
|
||
</I18nProvider>
|
||
</ErrorBoundary>
|
||
</body>
|
||
</html>
|
||
);
|
||
}
|