testing meta tags

This commit is contained in:
priyanshuvish
2025-07-22 17:47:37 +05:30
parent 07c8fe0b72
commit 3a7908a857
6 changed files with 148 additions and 52 deletions

View File

@@ -97,7 +97,7 @@ const socialLinks = [
{ {
name: "LinkedIn", name: "LinkedIn",
icon: Linkedin, icon: Linkedin,
url: "https://linkedin.com/company/wdi", url: "https://www.linkedin.com/in/website-developers-india/",
}, },
{ {
name: "Twitter", name: "Twitter",

View File

@@ -6,12 +6,12 @@
<link rel="icon" type="image/svg+xml" href="/vite.svg" /> <link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>WDI - Web Development & AI Solutions</title> <title>WDI - Web Development & AI Solutions</title>
<meta name="description"
content="Leading web development and AI solutions provider. Custom software development, mobile apps, and digital transformation services." />
<!-- Preload Google Fonts --> <!-- Preload Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- <meta name="description"
content="Leading web development and AI solutions provider. Custom software development, mobile apps, and digital transformation services." /> -->
<!-- SEO Meta Tags --> <!-- SEO Meta Tags -->
<meta property="og:title" content="WDI - Web Development & AI Solutions" /> <meta property="og:title" content="WDI - Web Development & AI Solutions" />
@@ -21,8 +21,8 @@
<meta property="og:url" content="https://wdi.com" /> <meta property="og:url" content="https://wdi.com" />
<meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="WDI - Web Development & AI Solutions" /> <meta name="twitter:title" content="WDI - Web Development & AI Solutions" />
<meta name="twitter:description" <!-- <meta name="twitter:description"
content="Leading web development and AI solutions provider. Custom software development, mobile apps, and digital transformation services." /> content="Leading web development and AI solutions provider. Custom software development, mobile apps, and digital transformation services." /> -->
<!-- Google tag (gtag.js) --> <!-- Google tag (gtag.js) -->

View File

@@ -5,11 +5,14 @@ import './styles/globals.css'
import { Provider } from 'react-redux' import { Provider } from 'react-redux'
import store from './src/store/Store.tsx' import store from './src/store/Store.tsx'
import { BrowserRouter } from 'react-router-dom' import { BrowserRouter } from 'react-router-dom'
import { HelmetProvider } from 'react-helmet-async'
createRoot(document.getElementById('root')!).render( createRoot(document.getElementById('root')!).render(
<Provider store={store}> <Provider store={store}>
<BrowserRouter> <BrowserRouter>
<App /> <HelmetProvider>
<App />
</HelmetProvider>
</BrowserRouter> </BrowserRouter>
</Provider>, </Provider>,
) )

36
package-lock.json generated
View File

@@ -49,6 +49,7 @@
"react-dnd": "^16.0.1", "react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1", "react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-helmet-async": "^2.0.5",
"react-hook-form": "^7.55.0", "react-hook-form": "^7.55.0",
"react-redux": "^9.2.0", "react-redux": "^9.2.0",
"react-resizable-panels": "^2.1.9", "react-resizable-panels": "^2.1.9",
@@ -5105,6 +5106,15 @@
"node": ">=12" "node": ">=12"
} }
}, },
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"license": "MIT",
"dependencies": {
"loose-envify": "^1.0.0"
}
},
"node_modules/is-extglob": { "node_modules/is-extglob": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -6055,6 +6065,26 @@
"react": "^18.3.1" "react": "^18.3.1"
} }
}, },
"node_modules/react-fast-compare": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz",
"integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==",
"license": "MIT"
},
"node_modules/react-helmet-async": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz",
"integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==",
"license": "Apache-2.0",
"dependencies": {
"invariant": "^2.2.4",
"react-fast-compare": "^3.2.2",
"shallowequal": "^1.1.0"
},
"peerDependencies": {
"react": "^16.6.0 || ^17.0.0 || ^18.0.0"
}
},
"node_modules/react-hook-form": { "node_modules/react-hook-form": {
"version": "7.60.0", "version": "7.60.0",
"resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz", "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz",
@@ -6492,6 +6522,12 @@
"integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
"license": "MIT"
},
"node_modules/shebang-command": { "node_modules/shebang-command": {
"version": "2.0.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",

View File

@@ -51,6 +51,7 @@
"react-dnd": "^16.0.1", "react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1", "react-dnd-html5-backend": "^16.0.1",
"react-dom": "^18.3.1", "react-dom": "^18.3.1",
"react-helmet-async": "^2.0.5",
"react-hook-form": "^7.55.0", "react-hook-form": "^7.55.0",
"react-redux": "^9.2.0", "react-redux": "^9.2.0",
"react-resizable-panels": "^2.1.9", "react-resizable-panels": "^2.1.9",

View File

@@ -1,31 +1,84 @@
import React from "react";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import { Navigation } from "../components/Navigation"; import {
import { Footer } from "../components/Footer"; Bot,
import { ProcessSection } from "../components/ProcessSection"; Brain,
import { FAQSection } from "../components/FAQSection"; Calendar,
import { AnimatedGradientText } from "../components/AnimatedGradientText"; CheckCircle,
import { Button } from "../components/ui/button"; ChevronRight,
import { ShimmerButton } from "../components/ui/shimmer-button"; Code,
import { Badge } from "../components/ui/badge"; Eye,
import { Card, CardContent } from "../components/ui/card"; Globe,
import { GridPattern } from "../components/GridPattern"; Lightbulb,
import { navigateTo } from "../App"; Palette,
import { Rocket,
Smartphone, Globe, Code, Palette, Brain, Target, Users, Star, Server,
ArrowRight, ChevronRight, Clock, TrendingUp, Layers, Smartphone,
Layout, Rocket, Monitor, Lock, RefreshCcw, ShieldCheck, TrendingUp,
MessageSquare, Heart, CheckCircle, Lightbulb, Coffee, Users
Download, Calendar, Camera, Music, Gamepad2,
CreditCard, Bell, Mail, Search, Home, MapPin,
Github, Slack, Figma, Chrome, Zap as ZapIcon, Video, MessageCircle,
Cog, Settings, Sparkles, Handshake, Eye, Award, UserPlus, Bot, Server, Database
} from "lucide-react"; } from "lucide-react";
import { navigateTo } from "../App";
import { FAQSection } from "../components/FAQSection";
import { Footer } from "../components/Footer";
import { Navigation } from "../components/Navigation";
import { ProcessSection } from "../components/ProcessSection";
import { Button } from "../components/ui/button";
import { Card, CardContent } from "../components/ui/card";
import { ShimmerButton } from "../components/ui/shimmer-button";
import { Helmet } from "react-helmet-async";
// Enhanced Hero Section // Enhanced Hero Section
const HeroWithCTA = () => { const HeroWithCTA = () => {
return ( return (
<section className="relative py-20 overflow-hidden bg-black"> <section className="relative py-20 overflow-hidden bg-black">
<Helmet>
{/* Page Title and Meta Description */}
<title>Get Expert Digital Services Today | WDI Game-Changing Solutions</title>
<meta
name="description"
content="Get the powerful digital solutions your brand needs to thrive. WDIs proven services make growth faster and easier than ever before."
/>
{/* Canonical Link */}
<link rel="canonical" href="https://www.wdipl.com/services" />
{/* Open Graph Tags (for Facebook, LinkedIn) */}
<meta property="og:title" content="Get Expert Digital Services Today | WDI Game-Changing Solutions" />
<meta
property="og:description"
content="Get the powerful digital solutions your brand needs to thrive. WDIs proven services make growth faster and easier than ever before."
/>
<meta property="og:url" content="https://www.wdipl.com/services" />
<meta property="og:type" content="website" />
<meta property="og:image" content="https://www.wdipl.com/your-preview-image.jpg" />
{/* Twitter Card Tags */}
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Get Expert Digital Services Today | WDI Game-Changing Solutions" />
<meta
name="twitter:description"
content="Get the powerful digital solutions your brand needs to thrive. WDIs proven services make growth faster and easier than ever before."
/>
<meta name="twitter:image" content="https://www.wdipl.com/your-preview-image.jpg" />
{/* Social Profiles (using JSON-LD Schema) */}
<script type="application/ld+json">
{`
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "WDI",
"url": "https://www.wdipl.com",
"sameAs": [
"https://www.facebook.com/wdideas",
"https://www.linkedin.com/in/website-developers-india/",
"https://www.instagram.com/wdipl/"
]
}
`}
</script>
</Helmet>
<div className="container mx-auto px-6 lg:px-8"> <div className="container mx-auto px-6 lg:px-8">
<div className="grid lg:grid-cols-2 gap-16 items-center min-h-[90vh]"> <div className="grid lg:grid-cols-2 gap-16 items-center min-h-[90vh]">
<motion.div <motion.div
@@ -50,12 +103,12 @@ const HeroWithCTA = () => {
<span className="text-[#E5195E]">Digital Solutions</span> <span className="text-[#E5195E]">Digital Solutions</span>
<span className="text-white"> for Modern Business</span> <span className="text-white"> for Modern Business</span>
</h1> </h1>
<p className="text-lg text-gray-300 leading-relaxed max-w-lg"> <p className="text-lg text-gray-300 leading-relaxed max-w-lg">
From mobile apps to AI solutions, we deliver end-to-end digital services that transform ideas into powerful business solutions. From mobile apps to AI solutions, we deliver end-to-end digital services that transform ideas into powerful business solutions.
</p> </p>
</div> </div>
{/* CTAs */} {/* CTAs */}
<motion.div <motion.div
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
@@ -63,7 +116,10 @@ const HeroWithCTA = () => {
transition={{ duration: 0.8, delay: 0.3 }} transition={{ duration: 0.8, delay: 0.3 }}
className="flex flex-col sm:flex-row gap-4" className="flex flex-col sm:flex-row gap-4"
> >
<ShimmerButton className="text-lg px-8 py-4" onClick={() => navigateTo('/contact/schedule-a-discovery-call')}> <ShimmerButton className="text-lg px-8 py-4"
// onClick={() => navigateTo('/contact/schedule-a-discovery-call')}
onClick={() => navigateTo("/start-a-project")}
>
<div className="inline-flex items-center gap-2"> <div className="inline-flex items-center gap-2">
<Calendar className="w-4 h-4 flex-shrink-0" /> <Calendar className="w-4 h-4 flex-shrink-0" />
<span>Discuss Your Project</span> <span>Discuss Your Project</span>
@@ -72,7 +128,7 @@ const HeroWithCTA = () => {
<Button <Button
variant="secondary" variant="secondary"
size="lg" size="lg"
className="text-lg px-8 py-4" className="text-lg px-8 py-4 h-auto"
onClick={() => navigateTo('/case-studies')} onClick={() => navigateTo('/case-studies')}
> >
<Eye className="w-4 h-4 flex-shrink-0" /> <Eye className="w-4 h-4 flex-shrink-0" />
@@ -80,7 +136,7 @@ const HeroWithCTA = () => {
</Button> </Button>
</motion.div> </motion.div>
</motion.div> </motion.div>
{/* Right side with stats */} {/* Right side with stats */}
<motion.div <motion.div
initial={{ opacity: 0, x: 50 }} initial={{ opacity: 0, x: 50 }}
@@ -98,17 +154,17 @@ const HeroWithCTA = () => {
<div className="text-3xl lg:text-4xl font-bold text-white">500+</div> <div className="text-3xl lg:text-4xl font-bold text-white">500+</div>
<div className="text-sm text-gray-400 leading-tight">Projects Delivered</div> <div className="text-sm text-gray-400 leading-tight">Projects Delivered</div>
</div> </div>
<div className="space-y-2 flex flex-col items-center"> <div className="space-y-2 flex flex-col items-center">
<div className="text-3xl lg:text-4xl font-bold text-white">50+</div> <div className="text-3xl lg:text-4xl font-bold text-white">50+</div>
<div className="text-sm text-gray-400 leading-tight">Service Offerings</div> <div className="text-sm text-gray-400 leading-tight">Service Offerings</div>
</div> </div>
<div className="space-y-2 flex flex-col items-center"> <div className="space-y-2 flex flex-col items-center">
<div className="text-3xl lg:text-4xl font-bold text-white">98%</div> <div className="text-3xl lg:text-4xl font-bold text-white">98%</div>
<div className="text-sm text-gray-400 leading-tight">Client Satisfaction</div> <div className="text-sm text-gray-400 leading-tight">Client Satisfaction</div>
</div> </div>
<div className="space-y-2 flex flex-col items-center"> <div className="space-y-2 flex flex-col items-center">
<div className="text-3xl lg:text-4xl font-bold text-white">24/7</div> <div className="text-3xl lg:text-4xl font-bold text-white">24/7</div>
<div className="text-sm text-gray-400 leading-tight">Support Available</div> <div className="text-sm text-gray-400 leading-tight">Support Available</div>
@@ -150,7 +206,7 @@ const HorizontalTagScroller = () => {
Comprehensive digital services covering every aspect of modern technology solutions. Comprehensive digital services covering every aspect of modern technology solutions.
</p> </p>
</motion.div> </motion.div>
<motion.div <motion.div
initial={{ opacity: 0, y: 40 }} initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
@@ -160,7 +216,7 @@ const HorizontalTagScroller = () => {
> >
<div className="absolute left-0 top-0 bottom-0 w-20 bg-gradient-to-r from-card to-transparent z-10 pointer-events-none"></div> <div className="absolute left-0 top-0 bottom-0 w-20 bg-gradient-to-r from-card to-transparent z-10 pointer-events-none"></div>
<div className="absolute right-0 top-0 bottom-0 w-20 bg-gradient-to-l from-card to-transparent z-10 pointer-events-none"></div> <div className="absolute right-0 top-0 bottom-0 w-20 bg-gradient-to-l from-card to-transparent z-10 pointer-events-none"></div>
<div className="flex animate-marquee hover:animate-marquee-paused"> <div className="flex animate-marquee hover:animate-marquee-paused">
{/* First set */} {/* First set */}
{categories.map((category, index) => { {categories.map((category, index) => {
@@ -187,7 +243,7 @@ const HorizontalTagScroller = () => {
</motion.div> </motion.div>
); );
})} })}
{/* Second and third sets for seamless loop */} {/* Second and third sets for seamless loop */}
{[...categories, ...categories].map((category, index) => { {[...categories, ...categories].map((category, index) => {
const IconComponent = category.icon; const IconComponent = category.icon;
@@ -229,7 +285,7 @@ const SideBySideContentWithIcons = () => {
icon: Brain icon: Brain
}, },
{ {
id: "quality", id: "quality",
title: "Quality Assurance", title: "Quality Assurance",
icon: CheckCircle icon: CheckCircle
}, },
@@ -265,7 +321,7 @@ const SideBySideContentWithIcons = () => {
<span className="text-[#E5195E]">WDI</span> <span className="text-[#E5195E]">WDI</span>
<span className="text-white"> Services</span> <span className="text-white"> Services</span>
</h2> </h2>
<p className="text-xl text-gray-300 leading-relaxed"> <p className="text-xl text-gray-300 leading-relaxed">
Delivering excellence in every project with proven expertise and innovation. Delivering excellence in every project with proven expertise and innovation.
</p> </p>
@@ -296,7 +352,7 @@ const SideBySideContentWithIcons = () => {
<div className="mb-6"> <div className="mb-6">
<IconComponent className="w-10 h-10 text-accent mx-auto" /> <IconComponent className="w-10 h-10 text-accent mx-auto" />
</div> </div>
<h3 className="text-lg font-semibold text-white leading-tight"> <h3 className="text-lg font-semibold text-white leading-tight">
{advantage.title} {advantage.title}
</h3> </h3>
@@ -321,7 +377,7 @@ const TabbedServiceDisplay = () => {
link: "/services/mobile-app-development" link: "/services/mobile-app-development"
}, },
{ {
title: "Web & Cloud Solutions", title: "Web & Cloud Solutions",
icon: Globe, icon: Globe,
description: "Scalable web applications and cloud infrastructure solutions.", description: "Scalable web applications and cloud infrastructure solutions.",
link: "/web-cloud" link: "/web-cloud"
@@ -369,7 +425,7 @@ const TabbedServiceDisplay = () => {
End-to-end digital solutions designed to accelerate your business growth and digital transformation. End-to-end digital solutions designed to accelerate your business growth and digital transformation.
</p> </p>
</motion.div> </motion.div>
<motion.div <motion.div
initial={{ opacity: 0, y: 40 }} initial={{ opacity: 0, y: 40 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
@@ -395,7 +451,7 @@ const TabbedServiceDisplay = () => {
<div className="w-12 h-12 bg-accent/20 rounded-lg flex items-center justify-center"> <div className="w-12 h-12 bg-accent/20 rounded-lg flex items-center justify-center">
<IconComponent className="w-6 h-6 text-accent" /> <IconComponent className="w-6 h-6 text-accent" />
</div> </div>
<div> <div>
<h3 className="text-xl font-semibold text-white mb-4"> <h3 className="text-xl font-semibold text-white mb-4">
{service.title} {service.title}
@@ -404,7 +460,7 @@ const TabbedServiceDisplay = () => {
{service.description} {service.description}
</p> </p>
</div> </div>
<div className="flex items-center gap-2 text-accent font-medium"> <div className="flex items-center gap-2 text-accent font-medium">
<span>Explore Services</span> <span>Explore Services</span>
<ChevronRight className="w-4 h-4" /> <ChevronRight className="w-4 h-4" />
@@ -448,21 +504,21 @@ const InlineCTA = () => {
</div> </div>
</div> </div>
</div> </div>
{/* Main Heading */} {/* Main Heading */}
<h2 className="text-3xl lg:text-4xl font-semibold leading-tight"> <h2 className="text-3xl lg:text-4xl font-semibold leading-tight">
<span className="text-white">Transform Your Business with </span> <span className="text-white">Transform Your Business with </span>
<span className="text-[#E5195E]">Expert Digital Services</span> <span className="text-[#E5195E]">Expert Digital Services</span>
</h2> </h2>
{/* Subtitle */} {/* Subtitle */}
<p className="text-xl text-gray-300 leading-relaxed max-w-2xl"> <p className="text-xl text-gray-300 leading-relaxed max-w-2xl">
From concept to deployment, we deliver comprehensive digital solutions that drive growth and innovation. From concept to deployment, we deliver comprehensive digital solutions that drive growth and innovation.
</p> </p>
{/* CTA Button */} {/* CTA Button */}
<div className="flex flex-col items-start gap-4"> <div className="flex flex-col items-start gap-4">
<ShimmerButton <ShimmerButton
className="text-xl px-10 py-5 rounded-2xl shadow-lg hover:shadow-xl bg-[#E5195E] hover:bg-[#E5195E]/90" className="text-xl px-10 py-5 rounded-2xl shadow-lg hover:shadow-xl bg-[#E5195E] hover:bg-[#E5195E]/90"
onClick={() => navigateTo('/contact/schedule-a-discovery-call')} onClick={() => navigateTo('/contact/schedule-a-discovery-call')}
> >
@@ -471,7 +527,7 @@ const InlineCTA = () => {
<span>Start Your Project</span> <span>Start Your Project</span>
</div> </div>
</ShimmerButton> </ShimmerButton>
{/* Small benefit text */} {/* Small benefit text */}
<p className="text-sm text-gray-400"> <p className="text-sm text-gray-400">
Free consultation Project roadmap Technical guidance Free consultation Project roadmap Technical guidance
@@ -518,7 +574,7 @@ export function Services() {
<TabbedServiceDisplay /> <TabbedServiceDisplay />
<ProcessSection /> <ProcessSection />
<InlineCTA /> <InlineCTA />
<FAQSection <FAQSection
title="Services Questions" title="Services Questions"
subtitle="Get answers to common questions about our comprehensive service offerings." subtitle="Get answers to common questions about our comprehensive service offerings."
faqs={servicesFAQs} faqs={servicesFAQs}