new pages created
This commit is contained in:
65
app/(public)/ats/_components/Benefits.tsx
Normal file
65
app/(public)/ats/_components/Benefits.tsx
Normal file
@@ -0,0 +1,65 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import {
|
||||
CheckCircle,
|
||||
} from "lucide-react";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
|
||||
|
||||
// Benefits Section Component
|
||||
const BenefitsSection: React.FC = () => {
|
||||
return (
|
||||
<section className="py-20 bg-gradient-to-b from-gray-50 to-white">
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<motion.h2
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-12"
|
||||
>
|
||||
{atsPageData.benefits.title}
|
||||
</motion.h2>
|
||||
|
||||
<div className="grid md:grid-cols-2 gap-10">
|
||||
<div className="space-y-6">
|
||||
{atsPageData.benefits.leftColumn.map((benefit, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
initial={{ opacity: 0, x: -20 }}
|
||||
whileInView={{ opacity: 1, x: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ delay: index * 0.1, duration: 0.6 }}
|
||||
className="flex gap-4 items-start"
|
||||
>
|
||||
<CheckCircle className="w-6 h-6 text-blue-600 flex-shrink-0 mt-1" />
|
||||
<p className="text-gray-700 text-lg">{benefit.text}</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
|
||||
<div className="space-y-6">
|
||||
{atsPageData.benefits.rightColumn.map((benefit, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
initial={{ opacity: 0, x: 20 }}
|
||||
whileInView={{ opacity: 1, x: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ delay: index * 0.1, duration: 0.6 }}
|
||||
className="flex gap-4 items-start"
|
||||
>
|
||||
<CheckCircle className="w-6 h-6 text-blue-600 flex-shrink-0 mt-1" />
|
||||
<p className="text-gray-700 text-lg">{benefit.text}</p>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default BenefitsSection
|
||||
54
app/(public)/ats/_components/CTA.tsx
Normal file
54
app/(public)/ats/_components/CTA.tsx
Normal file
@@ -0,0 +1,54 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import {
|
||||
ArrowRight,
|
||||
Sparkles,
|
||||
} from "lucide-react";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
// CTA Section Component
|
||||
const CtaSection: React.FC = () => {
|
||||
return (
|
||||
<section className="py-20 bg-gradient-to-br from-blue-600 via-purple-600 to-pink-600">
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.6 }}
|
||||
>
|
||||
<h2 className="text-3xl md:text-4xl lg:text-5xl font-bold text-white mb-6">
|
||||
{atsPageData.cta.title}
|
||||
</h2>
|
||||
<p className="text-lg md:text-xl text-white/90 mb-10 max-w-2xl mx-auto">
|
||||
{atsPageData.cta.description}
|
||||
</p>
|
||||
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center">
|
||||
<Button
|
||||
size="lg"
|
||||
className="bg-white text-blue-700 hover:bg-gray-100 font-semibold px-8 py-6 text-lg shadow-xl"
|
||||
>
|
||||
{atsPageData.cta.primaryButton}
|
||||
<Sparkles className="ml-2 w-5 h-5" />
|
||||
</Button>
|
||||
<Button
|
||||
size="lg"
|
||||
variant="outline"
|
||||
className="border-2 border-white hover:bg-white/10 font-semibold px-8 py-6 text-lg"
|
||||
>
|
||||
{atsPageData.cta.secondaryButton}
|
||||
<ArrowRight className="ml-2 w-5 h-5" />
|
||||
</Button>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default CtaSection
|
||||
57
app/(public)/ats/_components/FAQ.tsx
Normal file
57
app/(public)/ats/_components/FAQ.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import {
|
||||
Accordion,
|
||||
AccordionContent,
|
||||
AccordionItem,
|
||||
AccordionTrigger,
|
||||
} from "@/components/ui/accordion";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
|
||||
// FAQ Section Component
|
||||
const FaqSection: React.FC = () => {
|
||||
return (
|
||||
<section className="py-20 bg-white">
|
||||
<div className="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<motion.h2
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-12"
|
||||
>
|
||||
{atsPageData.faqs.title}
|
||||
</motion.h2>
|
||||
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ delay: 0.2 }}
|
||||
>
|
||||
<Accordion type="single" collapsible className="space-y-4">
|
||||
{atsPageData.faqs.items.map((faq, index) => (
|
||||
<AccordionItem
|
||||
key={index}
|
||||
value={`item-${index}`}
|
||||
className="bg-white border border-gray-200 rounded-xl px-6 shadow-sm hover:shadow-md transition-shadow"
|
||||
>
|
||||
<AccordionTrigger className="text-lg font-semibold text-gray-900 hover:text-blue-600 py-6">
|
||||
{faq.question}
|
||||
</AccordionTrigger>
|
||||
<AccordionContent className="text-gray-600 pb-6">
|
||||
{faq.answer}
|
||||
</AccordionContent>
|
||||
</AccordionItem>
|
||||
))}
|
||||
</Accordion>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default FaqSection
|
||||
51
app/(public)/ats/_components/Features.tsx
Normal file
51
app/(public)/ats/_components/Features.tsx
Normal file
@@ -0,0 +1,51 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import { Card, CardContent } from "@/components/ui/card";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
|
||||
// Features Section Component
|
||||
const FeaturesSection: React.FC = () => {
|
||||
return (
|
||||
<section className="py-20 bg-white">
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<motion.h2
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-14"
|
||||
>
|
||||
{atsPageData.features.title}
|
||||
</motion.h2>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
|
||||
{atsPageData.features.items.map((feature, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ delay: index * 0.1, duration: 0.6 }}
|
||||
whileHover={{ y: -8, scale: 1.02 }}
|
||||
>
|
||||
<Card className="h-full hover:shadow-xl transition-all duration-300 border-0 shadow-lg">
|
||||
<CardContent className="p-8">
|
||||
<div className="text-5xl mb-4">{feature.icon}</div>
|
||||
<h3 className="text-xl font-semibold mb-3 text-gray-900">
|
||||
{feature.title}
|
||||
</h3>
|
||||
<p className="text-gray-600">{feature.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default FeaturesSection
|
||||
81
app/(public)/ats/_components/Hero.tsx
Normal file
81
app/(public)/ats/_components/Hero.tsx
Normal file
@@ -0,0 +1,81 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import {
|
||||
PlayCircle,
|
||||
ArrowRight,
|
||||
Sparkles,
|
||||
} from "lucide-react";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
|
||||
const HeroSection: React.FC = () => {
|
||||
return (
|
||||
<section className="relative py-24 md:py-32 bg-gradient-to-br from-purple-50 via-pink-50 to-blue-50 overflow-hidden">
|
||||
{/* Background Animation */}
|
||||
<div className="absolute inset-0 overflow-hidden">
|
||||
<motion.div
|
||||
animate={{
|
||||
scale: [1, 1.2, 1],
|
||||
rotate: [0, 90, 0],
|
||||
}}
|
||||
transition={{ duration: 20, repeat: Infinity, ease: "linear" }}
|
||||
className="absolute -top-1/2 -left-1/2 w-full h-full bg-blue-500/20 rounded-full blur-3xl"
|
||||
/>
|
||||
<motion.div
|
||||
animate={{
|
||||
scale: [1.2, 1, 1.2],
|
||||
rotate: [90, 0, 90],
|
||||
}}
|
||||
transition={{ duration: 25, repeat: Infinity, ease: "linear" }}
|
||||
className="absolute -bottom-1/2 -right-1/2 w-full h-full bg-purple-500/20 rounded-full blur-3xl"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
animate={{ opacity: 1, y: 0 }}
|
||||
transition={{ duration: 0.6 }}
|
||||
>
|
||||
<Badge className="mb-6 px-6 py-2 bg-purple-100 text-purple-700 border-white/30 backdrop-blur-sm text-sm font-semibold">
|
||||
<Sparkles className="w-4 h-4 mr-2 inline" />
|
||||
{atsPageData.hero.badge}
|
||||
</Badge>
|
||||
|
||||
<h1 className="text-4xl md:text-5xl lg:text-6xl font-extrabold leading-tight mb-6 bg-gradient-to-r from-purple-600 via-pink-600 to-blue-600 bg-clip-text text-transparent">
|
||||
{atsPageData.hero.title}
|
||||
</h1>
|
||||
|
||||
<p className="text-lg md:text-xl opacity-90 max-w-3xl mx-auto mb-10">
|
||||
{atsPageData.hero.subtitle}
|
||||
</p>
|
||||
|
||||
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center">
|
||||
<Button
|
||||
size="lg"
|
||||
className="bg-white text-blue-700 hover:bg-gray-100 font-semibold px-8 py-6 text-lg shadow-xl"
|
||||
>
|
||||
{atsPageData.hero.primaryCta}
|
||||
<ArrowRight className="ml-2 w-5 h-5" />
|
||||
</Button>
|
||||
<Button
|
||||
size="lg"
|
||||
variant="outline"
|
||||
className="border-2 border-white hover:bg-white/10 font-semibold px-8 py-6 text-lg"
|
||||
>
|
||||
<PlayCircle className="mr-2 w-5 h-5" />
|
||||
{atsPageData.hero.secondaryCta}
|
||||
</Button>
|
||||
</div>
|
||||
</motion.div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default HeroSection
|
||||
62
app/(public)/ats/_components/Overview.tsx
Normal file
62
app/(public)/ats/_components/Overview.tsx
Normal file
@@ -0,0 +1,62 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import { Card, CardContent } from "@/components/ui/card";
|
||||
import {
|
||||
Sparkles,
|
||||
} from "lucide-react";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
|
||||
|
||||
// Overview Section Component
|
||||
const OverviewSection: React.FC = () => {
|
||||
return (
|
||||
<section className="py-20 bg-white">
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<motion.div
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ duration: 0.6 }}
|
||||
className="text-center mb-12"
|
||||
>
|
||||
<h2 className="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
|
||||
{atsPageData.overview.title}
|
||||
</h2>
|
||||
<p className="text-lg text-gray-600 max-w-3xl mx-auto">
|
||||
{atsPageData.overview.description}
|
||||
</p>
|
||||
</motion.div>
|
||||
|
||||
<div className="grid md:grid-cols-3 gap-8">
|
||||
{atsPageData.overview.items.map((item, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ delay: index * 0.2, duration: 0.6 }}
|
||||
>
|
||||
<Card className="h-full hover:shadow-xl transition-shadow duration-300 border-0 shadow-lg">
|
||||
<CardContent className="p-8">
|
||||
<div className="w-16 h-16 bg-gradient-to-br from-blue-500 to-purple-500 rounded-2xl flex items-center justify-center mb-6">
|
||||
<Sparkles className="w-8 h-8 text-white" />
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold mb-3 text-gray-900">
|
||||
{item.title}
|
||||
</h3>
|
||||
<p className="text-gray-600">{item.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default OverviewSection
|
||||
49
app/(public)/ats/_components/WorkFlow.tsx
Normal file
49
app/(public)/ats/_components/WorkFlow.tsx
Normal file
@@ -0,0 +1,49 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { motion } from "framer-motion";
|
||||
import { Card, CardContent } from "@/components/ui/card";
|
||||
import { atsPageData } from "@/services/Constants";
|
||||
|
||||
|
||||
// Workflow Section Component
|
||||
const WorkflowSection: React.FC = () => {
|
||||
return (
|
||||
<section className="py-20 bg-gradient-to-b from-gray-50 to-white">
|
||||
<div className="max-w-6xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<motion.h2
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
className="text-3xl md:text-4xl font-bold text-gray-900 text-center mb-14"
|
||||
>
|
||||
{atsPageData.workflow.title}
|
||||
</motion.h2>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-8">
|
||||
{atsPageData.workflow.steps.map((step, index) => (
|
||||
<motion.div
|
||||
key={index}
|
||||
initial={{ opacity: 0, y: 20 }}
|
||||
whileInView={{ opacity: 1, y: 0 }}
|
||||
viewport={{ once: true }}
|
||||
transition={{ delay: index * 0.15, duration: 0.6 }}
|
||||
>
|
||||
<Card className="h-full hover:shadow-xl transition-shadow duration-300 border-0 shadow-lg text-center">
|
||||
<CardContent className="p-8">
|
||||
<div className="text-6xl mb-4">{step.emoji}</div>
|
||||
<h3 className="text-xl font-semibold mb-3 text-gray-900">
|
||||
{step.title}
|
||||
</h3>
|
||||
<p className="text-gray-600">{step.description}</p>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</motion.div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default WorkflowSection
|
||||
25
app/(public)/ats/page.tsx
Normal file
25
app/(public)/ats/page.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
import BenefitsSection from "./_components/Benefits";
|
||||
import CtaSection from "./_components/CTA";
|
||||
import FaqSection from "./_components/FAQ";
|
||||
import FeaturesSection from "./_components/Features";
|
||||
import HeroSection from "./_components/Hero";
|
||||
import OverviewSection from "./_components/Overview";
|
||||
import WorkflowSection from "./_components/WorkFlow";
|
||||
|
||||
|
||||
// Main ATS Page Component
|
||||
const ATSPage: React.FC = () => {
|
||||
return (
|
||||
<div className="min-h-screen bg-white">
|
||||
<HeroSection />
|
||||
<OverviewSection />
|
||||
<BenefitsSection />
|
||||
<FeaturesSection />
|
||||
<WorkflowSection />
|
||||
<FaqSection />
|
||||
<CtaSection />
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default ATSPage;
|
||||
Reference in New Issue
Block a user