site enhancements and add missing parts

This commit is contained in:
Mohammed Al-yaseen
2025-08-02 02:01:29 +03:00
parent 01ed3a2b7f
commit e627594be9
18 changed files with 4540 additions and 621 deletions

View File

@@ -0,0 +1,598 @@
/* About Page Styles */
.main {
padding-top: 80px;
background-color: #f9fafb;
}
/* Hero Section */
.heroSection {
position: relative;
padding: 128px 0;
background: linear-gradient(135deg, #0F0525 0%, #1a0b3a 50%, #2A0B45 100%);
color: white;
overflow: hidden;
}
.backgroundPattern {
position: absolute;
inset: 0;
opacity: 0.1;
}
.floatingOrb1 {
position: absolute;
top: 0;
left: 0;
width: 288px;
height: 288px;
background-color: #8b5cf6;
border-radius: 50%;
mix-blend-mode: multiply;
filter: blur(24px);
animation: pulse 2s infinite;
}
.floatingOrb2 {
position: absolute;
top: 0;
right: 0;
width: 288px;
height: 288px;
background-color: #eab308;
border-radius: 50%;
mix-blend-mode: multiply;
filter: blur(24px);
animation: pulse 2s infinite;
animation-delay: 2s;
}
.floatingOrb3 {
position: absolute;
bottom: -32px;
left: 80px;
width: 288px;
height: 288px;
background-color: #ec4899;
border-radius: 50%;
mix-blend-mode: multiply;
filter: blur(24px);
animation: pulse 2s infinite;
animation-delay: 4s;
}
@keyframes pulse {
0%, 100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
.heroContent {
position: relative;
max-width: 1152px;
margin: 0 auto;
padding: 0 16px;
}
.heroTitle {
font-size: 60px;
font-weight: 700;
margin-bottom: 32px;
line-height: 1.2;
color: white;
}
.gradientText {
background: linear-gradient(135deg, #a855f7 0%, #ec4899 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.heroSubtitle {
font-size: 20px;
color: #d1d5db;
max-width: 1024px;
margin: 0 auto;
line-height: 1.6;
}
.heroIcon {
width: 80px;
height: 80px;
margin: 0 auto 24px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.trustBadge {
display: inline-flex;
align-items: center;
gap: 8px;
background-color: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(8px);
border-radius: 9999px;
padding: 12px 24px;
margin-top: 32px;
}
.trustBadgeIcon {
color: #f87171;
}
.trustBadgeText {
color: #e5e7eb;
}
/* Stats Section */
.statsSection {
padding: 96px 0;
background-color: white;
position: relative;
}
.statsBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, #faf5ff 0%, #fdf2f8 100%);
}
.statsContainer {
position: relative;
max-width: 1152px;
margin: 0 auto;
padding: 0 16px;
}
.statsHeader {
text-align: center;
margin-bottom: 64px;
}
.statsTitle {
font-size: 36px;
font-weight: 700;
margin-bottom: 16px;
color: #1f2937;
}
.statsSubtitle {
font-size: 18px;
color: #6b7280;
max-width: 512px;
margin: 0 auto;
}
.statCard {
text-align: center;
transition: all 0.3s ease;
}
.statCard:hover {
transform: translateY(-4px);
}
.statIcon {
width: 80px;
height: 80px;
margin: 0 auto 24px;
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.statCard:hover .statIcon {
transform: scale(1.1);
}
.statIconYellow {
background: linear-gradient(135deg, #fbbf24 0%, #f97316 100%);
}
.statIconBlue {
background: linear-gradient(135deg, #60a5fa 0%, #8b5cf6 100%);
}
.statIconGreen {
background: linear-gradient(135deg, #4ade80 0%, #14b8a6 100%);
}
.statIconPink {
background: linear-gradient(135deg, #f472b6 0%, #ef4444 100%);
}
.statNumber {
font-size: 36px;
font-weight: 700;
margin-bottom: 8px;
color: #1f2937;
transition: color 0.3s ease;
}
.statCard:hover .statNumber {
color: #8b5cf6;
}
.statLabel {
color: #6b7280;
font-weight: 500;
}
/* Story Section */
.storySection {
padding: 96px 0;
background: linear-gradient(135deg, #f9fafb 0%, #ffffff 100%);
position: relative;
overflow: hidden;
}
.storyBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(236, 72, 153, 0.1) 100%);
}
.storyContainer {
position: relative;
max-width: 1152px;
margin: 0 auto;
padding: 0 16px;
}
.journeyBadge {
display: inline-flex;
align-items: center;
gap: 8px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
color: white;
padding: 8px 16px;
border-radius: 9999px;
font-size: 14px;
font-weight: 500;
margin-bottom: 24px;
}
.storyTitle {
font-size: 48px;
font-weight: 700;
margin-bottom: 32px;
line-height: 1.2;
color: #1f2937;
}
.storyText {
font-size: 18px;
color: #374151;
margin-bottom: 32px;
line-height: 1.6;
}
.timelineGrid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 24px;
margin-top: 32px;
}
.timelineCard {
text-align: center;
padding: 16px;
background-color: white;
border-radius: 12px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
border: 1px solid #f3f4f6;
}
.timelineYear {
font-size: 24px;
font-weight: 700;
margin-bottom: 4px;
color: #8b5cf6;
}
.timelineLabel {
font-size: 14px;
color: #6b7280;
}
.storyVisual {
text-align: center;
position: relative;
}
.mainCircle {
width: 320px;
height: 320px;
margin: 0 auto;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 50%, #f97316 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 25px 50px rgba(0, 0, 0, 0.25);
}
.mainIcon {
font-size: 96px;
color: white;
}
.floatingBadge1 {
position: absolute;
top: -16px;
right: -16px;
width: 96px;
height: 96px;
background: linear-gradient(135deg, #eab308 0%, #f97316 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.floatingBadge2 {
position: absolute;
bottom: -16px;
left: -16px;
width: 80px;
height: 80px;
background: linear-gradient(135deg, #4ade80 0%, #14b8a6 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
}
.badgeIcon {
color: white;
}
/* Values Section */
.valuesSection {
padding: 96px 0;
background-color: white;
position: relative;
}
.valuesBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, #f9fafb 0%, #ffffff 100%);
}
.valuesContainer {
position: relative;
max-width: 1152px;
margin: 0 auto;
padding: 0 16px;
}
.valuesHeader {
text-align: center;
margin-bottom: 64px;
}
.valuesTitle {
font-size: 36px;
font-weight: 700;
margin-bottom: 16px;
color: #1f2937;
}
.valuesSubtitle {
font-size: 18px;
color: #6b7280;
max-width: 512px;
margin: 0 auto;
}
.valueCard {
height: 100%;
text-align: center;
transition: all 0.3s ease;
border: none;
background-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(8px);
}
.valueCard:hover {
background-color: white;
box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1);
}
.valueCardBody {
padding: 32px;
}
.valueIcon {
width: 64px;
height: 64px;
margin: 0 auto 24px;
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.valueCard:hover .valueIcon {
transform: scale(1.1);
}
.valueIconBlue {
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
}
.valueIconYellow {
background: linear-gradient(135deg, #eab308 0%, #f97316 100%);
}
.valueIconGreen {
background: linear-gradient(135deg, #22c55e 0%, #14b8a6 100%);
}
.valueIconIndigo {
background: linear-gradient(135deg, #6366f1 0%, #3b82f6 100%);
}
.valueTitle {
margin-bottom: 16px;
color: #1f2937;
transition: color 0.3s ease;
}
.valueCard:hover .valueTitle {
color: #8b5cf6;
}
.valueDescription {
color: #6b7280;
line-height: 1.6;
}
/* Team Section */
.teamSection {
padding: 96px 0;
background: linear-gradient(135deg, #f9fafb 0%, #ffffff 100%);
position: relative;
}
.teamBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(139, 92, 246, 0.1) 0%, rgba(236, 72, 153, 0.1) 100%);
}
.teamContainer {
position: relative;
max-width: 1152px;
margin: 0 auto;
padding: 0 16px;
}
.teamHeader {
text-align: center;
margin-bottom: 64px;
}
.teamTitle {
font-size: 36px;
font-weight: 700;
margin-bottom: 16px;
color: #1f2937;
}
.teamSubtitle {
font-size: 18px;
color: #6b7280;
max-width: 512px;
margin: 0 auto;
}
.teamCard {
height: 100%;
text-align: center;
transition: all 0.3s ease;
border: none;
background-color: rgba(255, 255, 255, 0.8);
backdrop-filter: blur(8px);
}
.teamCard:hover {
background-color: white;
box-shadow: 0 20px 25px rgba(0, 0, 0, 0.1);
}
.avatarContainer {
position: relative;
margin-bottom: 24px;
}
.teamAvatar {
margin: 0 auto;
border: 4px solid white;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.15);
transition: transform 0.3s ease;
}
.teamCard:hover .teamAvatar {
transform: scale(1.05);
}
.verificationBadge {
position: absolute;
bottom: -8px;
right: -8px;
width: 32px;
height: 32px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.verificationIcon {
font-size: 14px;
color: white;
}
.teamMemberName {
margin-bottom: 8px;
color: #1f2937;
transition: color 0.3s ease;
}
.teamCard:hover .teamMemberName {
color: #8b5cf6;
}
.teamMemberRole {
color: #6b7280;
margin-bottom: 12px;
font-weight: 500;
}
.teamMemberDescription {
font-size: 14px;
color: #6b7280;
line-height: 1.6;
}
/* Responsive Design */
@media (max-width: 768px) {
.heroTitle {
font-size: 48px;
}
.mainCircle {
width: 240px;
height: 240px;
}
.mainIcon {
font-size: 72px;
}
.timelineGrid {
grid-template-columns: 1fr;
}
.floatingOrb1,
.floatingOrb2,
.floatingOrb3 {
width: 200px;
height: 200px;
}
}

View File

@@ -1,74 +1,177 @@
"use client"; "use client";
import { import {
CheckCircleOutlined, BulbOutlined,
GlobalOutlined, CheckCircleOutlined,
RocketOutlined, GlobalOutlined,
StarOutlined, HeartOutlined,
TeamOutlined, RocketOutlined,
TrophyOutlined StarOutlined,
TeamOutlined,
TrophyOutlined,
} from "@ant-design/icons"; } from "@ant-design/icons";
import { Avatar, Card, Col, Row, Typography } from "antd"; import { Avatar, Card, Col, Row } from "antd";
import Paragraph from "antd/es/typography/Paragraph";
import Title from "antd/es/typography/Title";
import { motion } from "framer-motion"; import { motion } from "framer-motion";
import styles from "./page.module.css";
const { Title, Paragraph } = Typography;
export default function AboutPage() { export default function AboutPage() {
const stats = [ const stats = [
{ icon: <TrophyOutlined />, number: "50+", label: "Projects Completed" }, {
{ icon: <GlobalOutlined />, number: "25+", label: "Happy Clients" }, icon: <TrophyOutlined />,
{ icon: <TeamOutlined />, number: "15+", label: "Expert Developers" }, number: "50+",
{ icon: <RocketOutlined />, number: "3+", label: "Years Experience" }, label: "Projects Completed",
color: "from-yellow-400 to-orange-500",
},
{
icon: <GlobalOutlined />,
number: "25+",
label: "Happy Clients",
color: "from-blue-400 to-purple-500",
},
{
icon: <TeamOutlined />,
number: "15+",
label: "Expert Developers",
color: "from-green-400 to-teal-500",
},
{
icon: <RocketOutlined />,
number: "3+",
label: "Years Experience",
color: "from-pink-400 to-red-500",
},
]; ];
const values = [ const values = [
{ {
title: "Innovation First", title: "Innovation First",
description: "We stay ahead of technology trends to deliver cutting-edge solutions that give our clients a competitive advantage.", description:
icon: <RocketOutlined /> "We stay ahead of technology trends to deliver cutting-edge solutions that give our clients a competitive advantage.",
icon: <RocketOutlined />,
color: "from-blue-500 to-purple-600",
}, },
{ {
title: "Quality Excellence", title: "Quality Excellence",
description: "Every project is crafted with attention to detail, ensuring the highest standards of quality and performance.", description:
icon: <StarOutlined /> "Every project is crafted with attention to detail, ensuring the highest standards of quality and performance.",
icon: <StarOutlined />,
color: "from-yellow-500 to-orange-600",
}, },
{ {
title: "Client Success", title: "Client Success",
description: "Your success is our success. We work closely with clients to understand their needs and deliver solutions that exceed expectations.", description:
icon: <CheckCircleOutlined /> "Your success is our success. We work closely with clients to understand their needs and deliver solutions that exceed expectations.",
icon: <CheckCircleOutlined />,
color: "from-green-500 to-teal-600",
}, },
{ {
title: "Transparency", title: "Transparency",
description: "We believe in open communication and transparent processes, keeping you informed at every step of your project.", description:
icon: <GlobalOutlined /> "We believe in open communication and transparent processes, keeping you informed at every step of your project.",
} icon: <GlobalOutlined />,
color: "from-indigo-500 to-blue-600",
},
];
const teamMembers = [
{
name: "Ahmed Hassan",
role: "CEO & Founder",
description: "Visionary leader with 10+ years in digital transformation",
avatar: "https://randomuser.me/api/portraits/men/32.jpg",
delay: 0,
},
{
name: "Sarah Johnson",
role: "CTO",
description: "Technical expert specializing in AI and cloud solutions",
avatar: "https://randomuser.me/api/portraits/women/44.jpg",
delay: 0.1,
},
{
name: "Raj Patel",
role: "Lead Developer",
description: "Full-stack developer with expertise in modern frameworks",
avatar: "https://randomuser.me/api/portraits/men/67.jpg",
delay: 0.2,
},
]; ];
return ( return (
<main className="pt-20"> <main className={styles.main}>
{/* Hero Section */} {/* Hero Section */}
<section className="py-20 bg-gradient-to-br from-[#0F0525] to-[#2A0B45] text-white"> <section className={styles.heroSection}>
<div className="max-w-6xl mx-auto px-4"> {/* Background Pattern */}
<div className={styles.backgroundPattern}>
<div className={styles.floatingOrb1}></div>
<div className={styles.floatingOrb2}></div>
<div className={styles.floatingOrb3}></div>
</div>
<div className={styles.heroContent}>
<motion.div <motion.div
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }} animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }} transition={{ duration: 0.8 }}
className="text-center" className="text-center"
> >
<Title level={1} className="text-5xl font-bold mb-6 text-white"> <motion.div
About Tech Master initial={{ scale: 0.8 }}
animate={{ scale: 1 }}
transition={{ duration: 0.6, delay: 0.2 }}
className="inline-block mb-6"
>
<div className={styles.heroIcon}>
<BulbOutlined style={{ fontSize: "32px", color: "white" }} />
</div>
</motion.div>
<Title level={1} className={styles.heroTitle}>
About <span className={styles.gradientText}>Tech Master</span>
</Title> </Title>
<Paragraph className="text-xl text-gray-300 max-w-3xl mx-auto"> <Paragraph className={styles.heroSubtitle}>
From Dubai to the stars, we&apos;re an award-winning technology agency From Dubai to the stars, we&apos;re an award-winning technology
dedicated to transforming businesses through innovative digital solutions. agency dedicated to transforming businesses through innovative
digital solutions that drive growth and success.
</Paragraph> </Paragraph>
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.4 }}
className="mt-8"
>
<div className={styles.trustBadge}>
<HeartOutlined className={styles.trustBadgeIcon} />
<span className={styles.trustBadgeText}>
Trusted by 25+ companies worldwide
</span>
</div>
</motion.div>
</motion.div> </motion.div>
</div> </div>
</section> </section>
{/* Stats Section */} {/* Stats Section */}
<section className="py-16 bg-white"> <section className={styles.statsSection}>
<div className="max-w-6xl mx-auto px-4"> <div className={styles.statsBackground}></div>
<div className={styles.statsContainer}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
className={styles.statsHeader}
>
<Title level={2} className={styles.statsTitle}>
Our <span className={styles.gradientText}>Achievements</span>
</Title>
<Paragraph className={styles.statsSubtitle}>
Numbers that speak for our commitment to excellence and innovation
</Paragraph>
</motion.div>
<Row gutter={[32, 32]} justify="center"> <Row gutter={[32, 32]} justify="center">
{stats.map((stat, index) => ( {stats.map((stat, index) => (
<Col xs={24} sm={12} md={6} key={index}> <Col xs={24} sm={12} md={6} key={index}>
@@ -76,15 +179,25 @@ export default function AboutPage() {
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: index * 0.1 }} transition={{ duration: 0.6, delay: index * 0.1 }}
className="text-center" className={styles.statCard}
> >
<div className="text-4xl text-[#6e48aa] mb-2"> <div
{stat.icon} className={`${styles.statIcon} ${
stat.color.includes("yellow")
? styles.statIconYellow
: stat.color.includes("blue")
? styles.statIconBlue
: stat.color.includes("green")
? styles.statIconGreen
: styles.statIconPink
}`}
>
<div style={{ fontSize: "24px", color: "white" }}>
{stat.icon}
</div>
</div> </div>
<div className="text-3xl font-bold text-gray-800 mb-1"> <div className={styles.statNumber}>{stat.number}</div>
{stat.number} <div className={styles.statLabel}>{stat.label}</div>
</div>
<div className="text-gray-600">{stat.label}</div>
</motion.div> </motion.div>
</Col> </Col>
))} ))}
@@ -93,31 +206,48 @@ export default function AboutPage() {
</section> </section>
{/* Story Section */} {/* Story Section */}
<section className="py-16 bg-gray-50"> <section className={styles.storySection}>
<div className="max-w-6xl mx-auto px-4"> <div className={styles.storyBackground}></div>
<Row gutter={[48, 48]} align="middle"> <div className={styles.storyContainer}>
<Row gutter={[64, 64]} align="middle">
<Col xs={24} lg={12}> <Col xs={24} lg={12}>
<motion.div <motion.div
initial={{ opacity: 0, x: -30 }} initial={{ opacity: 0, x: -30 }}
whileInView={{ opacity: 1, x: 0 }} whileInView={{ opacity: 1, x: 0 }}
transition={{ duration: 0.8 }} transition={{ duration: 0.8 }}
> >
<Title level={2} className="text-4xl font-bold mb-6"> <div className={styles.journeyBadge}>
Our Story <RocketOutlined />
<span>Our Journey</span>
</div>
<Title level={2} className={styles.storyTitle}>
Our <span className={styles.gradientText}>Story</span>
</Title> </Title>
<Paragraph className="text-lg text-gray-700 mb-6"> <Paragraph className={styles.storyText}>
Founded in 2020, Tech Master emerged from a vision to bridge the gap Founded in 2020, Tech Master emerged from a vision to bridge
between traditional business practices and cutting-edge technology. the gap between traditional business practices and
Based in Dubai, we&apos;ve grown from a small startup to an award-winning cutting-edge technology. Based in Dubai, we&apos;ve grown from
technology agency serving clients across the UAE and beyond. a small startup to an award-winning technology agency serving
clients across the UAE and beyond.
</Paragraph> </Paragraph>
<Paragraph className="text-lg text-gray-700"> <Paragraph className={styles.storyText}>
Our journey has been marked by continuous innovation, unwavering Our journey has been marked by continuous innovation,
commitment to quality, and a deep understanding of our clients&apos; needs. unwavering commitment to quality, and a deep understanding of
We believe that technology should be an enabler, not a barrier, our clients&apos; needs. We believe that technology should be
and we work tirelessly to make digital transformation accessible an enabler, not a barrier, and we work tirelessly to make
to businesses of all sizes. digital transformation accessible to businesses of all sizes.
</Paragraph> </Paragraph>
<div className={styles.timelineGrid}>
<div className={styles.timelineCard}>
<div className={styles.timelineYear}>2020</div>
<div className={styles.timelineLabel}>Founded</div>
</div>
<div className={styles.timelineCard}>
<div className={styles.timelineYear}>2024</div>
<div className={styles.timelineLabel}>Award Winner</div>
</div>
</div>
</motion.div> </motion.div>
</Col> </Col>
<Col xs={24} lg={12}> <Col xs={24} lg={12}>
@@ -125,10 +255,18 @@ export default function AboutPage() {
initial={{ opacity: 0, x: 30 }} initial={{ opacity: 0, x: 30 }}
whileInView={{ opacity: 1, x: 0 }} whileInView={{ opacity: 1, x: 0 }}
transition={{ duration: 0.8 }} transition={{ duration: 0.8 }}
className="text-center" className={styles.storyVisual}
> >
<div className="w-64 h-64 mx-auto bg-gradient-to-br from-[#6e48aa] to-[#9d50bb] rounded-full flex items-center justify-center"> <div className="relative">
<GlobalOutlined className="text-6xl text-white" /> <div className={styles.mainCircle}>
<GlobalOutlined className={styles.mainIcon} />
</div>
<div className={styles.floatingBadge1}>
<TrophyOutlined className={styles.badgeIcon} />
</div>
<div className={styles.floatingBadge2}>
<StarOutlined className={styles.badgeIcon} />
</div>
</div> </div>
</motion.div> </motion.div>
</Col> </Col>
@@ -137,19 +275,20 @@ export default function AboutPage() {
</section> </section>
{/* Values Section */} {/* Values Section */}
<section className="py-16 bg-white"> <section className={styles.valuesSection}>
<div className="max-w-6xl mx-auto px-4"> <div className={styles.valuesBackground}></div>
<div className={styles.valuesContainer}>
<motion.div <motion.div
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }} transition={{ duration: 0.8 }}
className="text-center mb-12" className={styles.valuesHeader}
> >
<Title level={2} className="text-4xl font-bold mb-4"> <Title level={2} className={styles.valuesTitle}>
Our Values Our <span className={styles.gradientText}>Values</span>
</Title> </Title>
<Paragraph className="text-lg text-gray-600 max-w-2xl mx-auto"> <Paragraph className={styles.valuesSubtitle}>
These core values guide everything we do and shape the way we These core values guide everything we do and shape the way we
approach every project and client relationship. approach every project and client relationship.
</Paragraph> </Paragraph>
</motion.div> </motion.div>
@@ -161,15 +300,31 @@ export default function AboutPage() {
initial={{ opacity: 0, y: 20 }} initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: index * 0.1 }} transition={{ duration: 0.6, delay: index * 0.1 }}
className="h-full"
> >
<Card className="h-full text-center hover:shadow-lg transition-shadow"> <Card
<div className="text-4xl text-[#6e48aa] mb-4"> className={styles.valueCard}
{value.icon} bodyStyle={{ padding: "2rem" }}
>
<div
className={`${styles.valueIcon} ${
value.color.includes("blue")
? styles.valueIconBlue
: value.color.includes("yellow")
? styles.valueIconYellow
: value.color.includes("green")
? styles.valueIconGreen
: styles.valueIconIndigo
}`}
>
<div style={{ fontSize: "24px", color: "white" }}>
{value.icon}
</div>
</div> </div>
<Title level={4} className="mb-3"> <Title level={4} className={styles.valueTitle}>
{value.title} {value.title}
</Title> </Title>
<Paragraph className="text-gray-600"> <Paragraph className={styles.valueDescription}>
{value.description} {value.description}
</Paragraph> </Paragraph>
</Card> </Card>
@@ -181,73 +336,61 @@ export default function AboutPage() {
</section> </section>
{/* Team Section */} {/* Team Section */}
<section className="py-16 bg-gray-50"> <section className={styles.teamSection}>
<div className="max-w-6xl mx-auto px-4"> <div className={styles.teamBackground}></div>
<div className={styles.teamContainer}>
<motion.div <motion.div
initial={{ opacity: 0, y: 30 }} initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }} whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }} transition={{ duration: 0.8 }}
className="text-center mb-12" className={styles.teamHeader}
> >
<Title level={2} className="text-4xl font-bold mb-4"> <Title level={2} className={styles.teamTitle}>
Our Team Meet Our <span className={styles.gradientText}>Team</span>
</Title> </Title>
<Paragraph className="text-lg text-gray-600 max-w-2xl mx-auto"> <Paragraph className={styles.teamSubtitle}>
Meet the passionate professionals behind Tech Master&apos;s success. Meet the passionate professionals behind Tech Master&apos;s
Our diverse team brings together expertise from various domains success. Our diverse team brings together expertise from various
to deliver exceptional results. domains to deliver exceptional results.
</Paragraph> </Paragraph>
</motion.div> </motion.div>
<Row gutter={[32, 32]} justify="center"> <Row gutter={[32, 32]} justify="center">
<Col xs={24} sm={12} md={8}> {teamMembers.map((member, index) => (
<motion.div <Col xs={24} sm={12} md={8} key={index}>
initial={{ opacity: 0, y: 20 }} <motion.div
whileInView={{ opacity: 1, y: 0 }} initial={{ opacity: 0, y: 20 }}
transition={{ duration: 0.6 }} whileInView={{ opacity: 1, y: 0 }}
className="text-center" transition={{ duration: 0.6, delay: member.delay }}
> className="text-center group"
<Avatar size={120} src="https://randomuser.me/api/portraits/men/32.jpg" className="mb-4" /> >
<Title level={4} className="mb-2">Ahmed Hassan</Title> <Card className={styles.teamCard}>
<Paragraph className="text-gray-600 mb-2">CEO & Founder</Paragraph> <div className={styles.avatarContainer}>
<Paragraph className="text-sm text-gray-500"> <Avatar
Visionary leader with 10+ years in digital transformation size={140}
</Paragraph> src={member.avatar}
</motion.div> className={styles.teamAvatar}
</Col> />
<Col xs={24} sm={12} md={8}> <div className={styles.verificationBadge}>
<motion.div <StarOutlined className={styles.verificationIcon} />
initial={{ opacity: 0, y: 20 }} </div>
whileInView={{ opacity: 1, y: 0 }} </div>
transition={{ duration: 0.6, delay: 0.1 }} <Title level={4} className={styles.teamMemberName}>
className="text-center" {member.name}
> </Title>
<Avatar size={120} src="https://randomuser.me/api/portraits/women/44.jpg" className="mb-4" /> <Paragraph className={styles.teamMemberRole}>
<Title level={4} className="mb-2">Sarah Johnson</Title> {member.role}
<Paragraph className="text-gray-600 mb-2">CTO</Paragraph> </Paragraph>
<Paragraph className="text-sm text-gray-500"> <Paragraph className={styles.teamMemberDescription}>
Technical expert specializing in AI and cloud solutions {member.description}
</Paragraph> </Paragraph>
</motion.div> </Card>
</Col> </motion.div>
<Col xs={24} sm={12} md={8}> </Col>
<motion.div ))}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
className="text-center"
>
<Avatar size={120} src="https://randomuser.me/api/portraits/men/67.jpg" className="mb-4" />
<Title level={4} className="mb-2">Raj Patel</Title>
<Paragraph className="text-gray-600 mb-2">Lead Developer</Paragraph>
<Paragraph className="text-sm text-gray-500">
Full-stack developer with expertise in modern frameworks
</Paragraph>
</motion.div>
</Col>
</Row> </Row>
</div> </div>
</section> </section>
</main> </main>
); );
} }

View File

@@ -1,242 +0,0 @@
// File: src/components/home/ContactSection.tsx
import {
EnvironmentOutlined,
MailOutlined,
PhoneOutlined,
SendOutlined,
} from "@ant-design/icons";
import { Button, Col, Form, Input, message, Row, Typography } from "antd";
import { motion } from "framer-motion";
import Image from "next/image";
import React, { useState } from "react";
import styles from "./ContactSection.module.css";
const { Title, Paragraph, Text } = Typography;
const { TextArea } = Input;
const ContactSection: React.FC = () => {
const [form] = Form.useForm();
const [submitting, setSubmitting] = useState(false);
const handleSubmit = async () => {
setSubmitting(true);
// Simulate API call
setTimeout(() => {
message.success("Your message has been sent successfully!");
form.resetFields();
setSubmitting(false);
}, 1500);
};
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.2,
},
},
};
const itemVariants = {
hidden: { y: 20, opacity: 0 },
visible: {
y: 0,
opacity: 1,
transition: { duration: 0.5 },
},
};
return (
<section className={styles.contactSection}>
<div className={styles.backgroundElements}>
<div className={styles.glowOrbTop}></div>
<div className={styles.glowOrbBottom}></div>
</div>
<div className={styles.container}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6 }}
viewport={{ once: true }}
className={styles.sectionHeader}
>
<Title level={2} className={styles.sectionTitle}>
Get In Touch
</Title>
<Paragraph className={styles.sectionSubtitle}>
Ready to transform your ideas into reality? Contact us today.
</Paragraph>
</motion.div>
<Row gutter={[48, 48]} className={styles.contactContent}>
<Col xs={24} lg={10}>
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className={styles.contactInfo}
>
<motion.div
variants={itemVariants}
className={styles.contactInfoItem}
>
<div className={styles.iconWrapper}>
<MailOutlined className={styles.contactIcon} />
</div>
<div>
<Text strong className={styles.contactLabel}>
Email
</Text>
<Text className={styles.contactValue}>
info@techmaster.com
</Text>
</div>
</motion.div>
<motion.div
variants={itemVariants}
className={styles.contactInfoItem}
>
<div className={styles.iconWrapper}>
<PhoneOutlined className={styles.contactIcon} />
</div>
<div>
<Text strong className={styles.contactLabel}>
Phone
</Text>
<Text className={styles.contactValue}>+1 (555) 123-4567</Text>
</div>
</motion.div>
<motion.div
variants={itemVariants}
className={styles.contactInfoItem}
>
<div className={styles.iconWrapper}>
<EnvironmentOutlined className={styles.contactIcon} />
</div>
<div>
<Text strong className={styles.contactLabel}>
Address
</Text>
<Text className={styles.contactValue}>
1234 Tech Boulevard, Innovation District
<br />
San Francisco, CA 94105
</Text>
</div>
</motion.div>
<motion.div
variants={itemVariants}
className={styles.mapContainer}
>
<Image
src="/api/placeholder/400/200"
alt="Office Location Map"
className={styles.mapImage}
width={400}
height={400}
/>
</motion.div>
</motion.div>
</Col>
<Col xs={24} lg={14}>
<motion.div
initial={{ opacity: 0, x: 30 }}
whileInView={{ opacity: 1, x: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
viewport={{ once: true }}
className={styles.contactForm}
>
<Title level={4} className={styles.formTitle}>
Send Us a Message
</Title>
<Form
form={form}
layout="vertical"
onFinish={handleSubmit}
className={styles.form}
>
<Row gutter={16}>
<Col xs={24} sm={12}>
<Form.Item
name="name"
label="Name"
rules={[
{ required: true, message: "Please enter your name" },
]}
>
<Input size="large" placeholder="Your name" />
</Form.Item>
</Col>
<Col xs={24} sm={12}>
<Form.Item
name="email"
label="Email"
rules={[
{ required: true, message: "Please enter your email" },
{
type: "email",
message: "Please enter a valid email",
},
]}
>
<Input size="large" placeholder="Your email" />
</Form.Item>
</Col>
</Row>
<Form.Item
name="subject"
label="Subject"
rules={[
{ required: true, message: "Please enter a subject" },
]}
>
<Input size="large" placeholder="How can we help you?" />
</Form.Item>
<Form.Item
name="message"
label="Message"
rules={[
{ required: true, message: "Please enter your message" },
]}
>
<TextArea
rows={5}
placeholder="Tell us about your project..."
className={styles.messageInput}
/>
</Form.Item>
<Form.Item>
<Button
type="primary"
htmlType="submit"
size="large"
icon={<SendOutlined />}
loading={submitting}
className={styles.submitButton}
>
Send Message
</Button>
</Form.Item>
</Form>
</motion.div>
</Col>
</Row>
</div>
</section>
);
};
export default ContactSection;

View File

@@ -1,190 +0,0 @@
/* File: src/components/home/ContactSection.module.css */
.contactSection {
padding: 100px 0;
background-color: #f8f9fa;
position: relative;
overflow: hidden;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 16px;
position: relative;
z-index: 2;
}
.backgroundElements {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
z-index: 1;
}
.glowOrbTop {
position: absolute;
width: 400px;
height: 400px;
border-radius: 50%;
background: var(--primary-glow);
top: -200px;
left: -150px;
filter: blur(50px);
}
.glowOrbBottom {
position: absolute;
width: 500px;
height: 500px;
border-radius: 50%;
background: radial-gradient(
circle,
rgba(64, 169, 255, 0.15) 0%,
rgba(64, 169, 255, 0.05) 50%,
rgba(0, 0, 0, 0) 70%
);
bottom: -250px;
right: -200px;
filter: blur(60px);
}
.sectionHeader {
text-align: center;
margin-bottom: 60px;
}
.sectionTitle {
font-size: 2.5rem !important;
font-weight: 700 !important;
margin-bottom: 16px !important;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.sectionSubtitle {
font-size: 1.1rem;
color: #666;
max-width: 600px;
margin: 0 auto;
}
.contactContent {
background: rgba(255, 255, 255, 0.8);
border-radius: 16px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.05);
backdrop-filter: blur(8px);
padding: 40px;
}
.contactInfo {
display: flex;
flex-direction: column;
gap: 24px;
}
.contactInfoItem {
display: flex;
align-items: center;
gap: 16px;
}
.iconWrapper {
width: 48px;
height: 48px;
border-radius: 50%;
background: var(--primary);
display: flex;
justify-content: center;
align-items: center;
box-shadow: 0 4px 8px rgba(152, 71, 232, 0.2);
}
.contactIcon {
font-size: 20px;
color: #fff;
}
.contactLabel {
display: block;
margin-bottom: 4px;
font-size: 16px;
}
.contactValue {
color: #666;
font-size: 15px;
}
.mapContainer {
margin-top: 16px;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.mapImage {
width: 100%;
height: auto;
display: block;
}
.contactForm {
background: white;
border-radius: 12px;
padding: 32px;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.05);
}
.formTitle {
margin-bottom: 24px !important;
color: #1890ff;
}
.messageInput {
resize: none;
}
.submitButton {
height: 48px;
padding: 0 32px;
border-radius: 24px;
font-weight: 500;
border: none;
box-shadow: 0 4px 12px rgba(24, 144, 255, 0.15);
transition: all 0.3s ease;
}
.submitButton:hover {
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(24, 144, 255, 0.2);
}
@media (max-width: 992px) {
.contactContent {
padding: 24px;
}
.contactForm {
padding: 24px;
margin-top: 24px;
}
}
@media (max-width: 768px) {
.contactSection {
padding: 60px 0;
}
.sectionTitle {
font-size: 2rem !important;
}
.mapContainer {
margin-bottom: 0;
}
}

View File

@@ -0,0 +1,250 @@
/* Footer Component Styles */
.footer {
position: relative;
background: linear-gradient(135deg, #0F0525 0%, #1a0b3a 50%, #2A0B45 100%);
color: white;
overflow: hidden;
padding: 80px 0 40px;
}
.footerBackground {
position: absolute;
inset: 0;
opacity: 0.1;
}
.footerOrb1 {
position: absolute;
top: -100px;
left: -100px;
width: 300px;
height: 300px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-radius: 50%;
filter: blur(40px);
animation: float 8s ease-in-out infinite;
}
.footerOrb2 {
position: absolute;
bottom: -150px;
right: -100px;
width: 250px;
height: 250px;
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
border-radius: 50%;
filter: blur(35px);
animation: float 10s ease-in-out infinite reverse;
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-20px);
}
}
.footerContainer {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
position: relative;
z-index: 2;
}
.footerContent {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 40px;
margin-bottom: 50px;
}
.footerColumn {
text-align: left;
}
.footerColumnTitle {
font-size: 1.1rem;
font-weight: 600;
color: white;
margin-bottom: 20px;
display: flex;
align-items: center;
gap: 8px;
}
.footerColumnIcon {
color: #a855f7;
font-size: 1.2rem;
}
.footerLinks {
list-style: none;
padding: 0;
margin: 0;
}
.footerLink {
margin-bottom: 12px;
}
.footerLink a {
color: #cbd5e1;
text-decoration: none;
font-size: 0.9rem;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 8px;
padding: 4px 0;
}
.footerLink a:hover {
color: #a855f7;
transform: translateX(6px);
}
.footerLinkIcon {
font-size: 0.8rem;
transition: all 0.3s ease;
}
.footerBottom {
text-align: center;
padding-top: 40px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.footerBottomText {
color: #94a3b8;
font-size: 1rem;
margin-bottom: 30px;
max-width: 600px;
margin-left: auto;
margin-right: auto;
}
.socialLinks {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 30px;
}
.socialLink {
width: 45px;
height: 45px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
color: white;
text-decoration: none;
transition: all 0.3s ease;
backdrop-filter: blur(8px);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.socialLink:hover {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
transform: translateY(-3px);
color: white;
box-shadow: 0 8px 25px rgba(139, 92, 246, 0.3);
}
.copyright {
color: #64748b;
font-size: 0.85rem;
line-height: 1.6;
}
.copyright a {
color: #94a3b8;
text-decoration: none;
transition: color 0.3s ease;
}
.copyright a:hover {
color: #a855f7;
}
/* Responsive Design */
@media (max-width: 1024px) {
.footerContent {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 30px;
}
}
@media (max-width: 768px) {
.footer {
padding: 60px 0 30px;
}
.footerContent {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 30px;
margin-bottom: 40px;
}
.footerColumn {
text-align: center;
}
.footerColumnTitle {
justify-content: center;
}
.footerLink a {
justify-content: center;
}
.socialLinks {
gap: 15px;
}
.socialLink {
width: 40px;
height: 40px;
}
.footerBottomText {
font-size: 0.9rem;
margin-bottom: 25px;
}
}
@media (max-width: 480px) {
.footer {
padding: 50px 0 25px;
}
.footerContent {
grid-template-columns: 1fr;
gap: 25px;
}
.footerColumnTitle {
font-size: 1rem;
}
.footerLink a {
font-size: 0.85rem;
}
.socialLinks {
gap: 12px;
}
.socialLink {
width: 35px;
height: 35px;
}
.copyright {
font-size: 0.8rem;
}
}

View File

@@ -0,0 +1,226 @@
"use client";
import {
ArrowRightOutlined,
BulbOutlined,
EnvironmentOutlined,
FacebookOutlined,
InstagramOutlined,
LinkedinOutlined,
MailOutlined,
PhoneOutlined,
TeamOutlined,
TrophyOutlined,
TwitterOutlined
} from '@ant-design/icons';
import { Typography } from 'antd';
import { motion } from 'framer-motion';
import React from 'react';
import styles from './Footer.module.css';
const { Paragraph } = Typography;
const Footer: React.FC = () => {
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.1
}
}
};
const itemVariants = {
hidden: { y: 20, opacity: 0 },
visible: {
y: 0,
opacity: 1,
transition: { duration: 0.5 }
}
};
return (
<footer className={styles.footer}>
<div className={styles.footerBackground}>
<div className={styles.footerOrb1}></div>
<div className={styles.footerOrb2}></div>
</div>
<div className={styles.footerContainer}>
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className={styles.footerContent}
>
<motion.div variants={itemVariants} className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<TeamOutlined className={styles.footerColumnIcon} />
Company
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="/about">
<ArrowRightOutlined className={styles.footerLinkIcon} />
About Us
</a>
</li>
<li className={styles.footerLink}>
<a href="/services">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Our Services
</a>
</li>
<li className={styles.footerLink}>
<a href="/projects">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Portfolio
</a>
</li>
<li className={styles.footerLink}>
<a href="/contact">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Contact Us
</a>
</li>
</ul>
</motion.div>
<motion.div variants={itemVariants} className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<BulbOutlined className={styles.footerColumnIcon} />
Services
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="/services#webdev">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Web Development
</a>
</li>
<li className={styles.footerLink}>
<a href="/services#mobile">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Mobile Apps
</a>
</li>
<li className={styles.footerLink}>
<a href="/services#ai">
<ArrowRightOutlined className={styles.footerLinkIcon} />
AI Solutions
</a>
</li>
<li className={styles.footerLink}>
<a href="/services#cloud">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Cloud Services
</a>
</li>
</ul>
</motion.div>
<motion.div variants={itemVariants} className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<TrophyOutlined className={styles.footerColumnIcon} />
Resources
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="/blog">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Blog & Insights
</a>
</li>
<li className={styles.footerLink}>
<a href="/case-studies">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Case Studies
</a>
</li>
<li className={styles.footerLink}>
<a href="/whitepapers">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Whitepapers
</a>
</li>
<li className={styles.footerLink}>
<a href="/webinars">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Webinars
</a>
</li>
</ul>
</motion.div>
<motion.div variants={itemVariants} className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<MailOutlined className={styles.footerColumnIcon} />
Contact Info
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="mailto:info@techmaster.com">
<MailOutlined className={styles.footerLinkIcon} />
info@techmaster.com
</a>
</li>
<li className={styles.footerLink}>
<a href="tel:+15551234567">
<PhoneOutlined className={styles.footerLinkIcon} />
+1 (555) 123-4567
</a>
</li>
<li className={styles.footerLink}>
<a href="#">
<EnvironmentOutlined className={styles.footerLinkIcon} />
San Francisco, CA
</a>
</li>
<li className={styles.footerLink}>
<a href="/support">
<ArrowRightOutlined className={styles.footerLinkIcon} />
24/7 Support
</a>
</li>
</ul>
</motion.div>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.3 }}
viewport={{ once: true }}
className={styles.footerBottom}
>
<Paragraph className={styles.footerBottomText}>
Ready to transform your business? Let's discuss your next project.
</Paragraph>
<div className={styles.socialLinks}>
<a href="#" className={styles.socialLink}>
<FacebookOutlined />
</a>
<a href="#" className={styles.socialLink}>
<TwitterOutlined />
</a>
<a href="#" className={styles.socialLink}>
<LinkedinOutlined />
</a>
<a href="#" className={styles.socialLink}>
<InstagramOutlined />
</a>
</div>
<div className={styles.copyright}>
© 2024 Tech Master. All rights reserved. | Privacy Policy | Terms of Service
</div>
</motion.div>
</div>
</footer>
);
};
export default Footer;

View File

@@ -50,7 +50,7 @@ const Header = () => {
<div className={styles.logoDot}></div> <div className={styles.logoDot}></div>
</div> </div>
<Title level={3} className={styles.logoText}> <Title level={3} className={styles.logoText}>
TechMaster Tech Masters
</Title> </Title>
</div> </div>
</Link> </Link>

View File

@@ -1,11 +1,8 @@
import { import Paragraph from "antd/es/typography/Paragraph";
Typography import Title from "antd/es/typography/Title";
} from "antd";
import ProjectsShowcaseClient from "./ProjectsShowcaseClient"; import ProjectsShowcaseClient from "./ProjectsShowcaseClient";
import styles from "./ProjectsShowcaseSelector.module.css"; import styles from "./ProjectsShowcaseSelector.module.css";
const { Title, Paragraph } = Typography;
interface Project { interface Project {
id: string; id: string;
title: string; title: string;

View File

@@ -47,11 +47,11 @@
} }
.projectCard { .projectCard {
height: 100%; height: fit-content;
border-radius: 12px; border-radius: 16px;
overflow: hidden; overflow: hidden;
transition: all 0.3s ease; transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05); box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
border: none; border: none;
cursor: pointer; cursor: pointer;
} }
@@ -64,7 +64,7 @@
.projectImageContainer { .projectImageContainer {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
height: 220px; height: 180px;
} }
.projectImage { .projectImage {
@@ -84,7 +84,6 @@
left: 0; left: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: rgba(116, 0, 184, 0.4);
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@@ -115,13 +114,18 @@
.technologiesList { .technologiesList {
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 8px; gap: 4px;
margin-top: 16px; margin-top: 12px;
} }
.techTag { .techTag {
margin: 0; margin: 0;
color: #7400b8; background: #f8fafc;
color: #475569;
border: 1px solid #e2e8f0;
font-size: 0.75rem;
padding: 2px 6px;
border-radius: 8px;
} }
.featuredBadge { .featuredBadge {
@@ -214,7 +218,7 @@
} }
.modalHeader::before { .modalHeader::before {
content: ''; content: "";
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
@@ -335,7 +339,7 @@
} }
.sectionTitle::after { .sectionTitle::after {
content: ''; content: "";
position: absolute; position: absolute;
bottom: -4px; bottom: -4px;
left: 0; left: 0;
@@ -379,7 +383,7 @@
} }
.featureItem::before { .featureItem::before {
content: '✓'; content: "✓";
position: absolute; position: absolute;
left: 0; left: 0;
top: 12px; top: 12px;
@@ -431,13 +435,13 @@
.projectsSection { .projectsSection {
padding: 60px 0; padding: 60px 0;
} }
.sectionTitle { .sectionTitle {
font-size: 2rem !important; font-size: 2rem !important;
} }
.projectImageContainer { .projectImageContainer {
height: 180px; height: 160px;
} }
.projectModal { .projectModal {
@@ -494,4 +498,4 @@
.carouselItem { .carouselItem {
height: 200px; height: 200px;
} }
} }

View File

@@ -0,0 +1,518 @@
/* Contact Page Enhanced Styles */
.main {
padding-top: 80px;
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
min-height: 100vh;
}
/* Hero Section */
.heroSection {
position: relative;
padding: 80px 0 60px;
background: linear-gradient(135deg, #0F0525 0%, #1a0b3a 50%, #2A0B45 100%);
color: white;
overflow: hidden;
}
.heroBackground {
position: absolute;
inset: 0;
opacity: 0.1;
}
.heroOrb1 {
position: absolute;
top: -100px;
left: -100px;
width: 300px;
height: 300px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-radius: 50%;
filter: blur(40px);
animation: float 6s ease-in-out infinite;
}
.heroOrb2 {
position: absolute;
top: 50px;
right: -150px;
width: 250px;
height: 250px;
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
border-radius: 50%;
filter: blur(35px);
animation: float 8s ease-in-out infinite reverse;
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-20px);
}
}
.heroContent {
position: relative;
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
text-align: center;
}
.heroTitle {
font-size: 3.5rem;
font-weight: 700;
margin-bottom: 20px;
line-height: 1.2;
color: white;
}
.gradientText {
background: linear-gradient(135deg, #a855f7 0%, #ec4899 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.heroSubtitle {
font-size: 1.25rem;
color: #cbd5e1;
max-width: 600px;
margin: 0 auto 30px;
line-height: 1.6;
}
.contactStats {
display: flex;
justify-content: center;
gap: 40px;
margin-top: 40px;
}
.statItem {
text-align: center;
}
.statNumber {
font-size: 2rem;
font-weight: 700;
color: #a855f7;
display: block;
}
.statLabel {
font-size: 0.9rem;
color: #94a3b8;
margin-top: 4px;
}
/* Contact Section */
.contactSection {
padding: 80px 0;
position: relative;
}
.contactBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(139, 92, 246, 0.05) 0%, rgba(236, 72, 153, 0.05) 100%);
}
.contactContainer {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
position: relative;
}
.contactGrid {
display: grid;
grid-template-columns: 1fr 1.5fr;
gap: 60px;
align-items: start;
}
/* Contact Info */
.contactInfo {
background: white;
border-radius: 20px;
padding: 40px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
position: relative;
overflow: hidden;
}
.contactInfo::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
}
.contactInfoHeader {
margin-bottom: 40px;
}
.contactInfoTitle {
font-size: 1.75rem;
font-weight: 700;
color: #1e293b;
margin-bottom: 12px;
}
.contactInfoSubtitle {
color: #64748b;
line-height: 1.6;
}
.contactInfoList {
display: flex;
flex-direction: column;
gap: 24px;
}
.contactInfoItem {
display: flex;
align-items: flex-start;
gap: 16px;
padding: 20px;
background: #f8fafc;
border-radius: 12px;
transition: all 0.3s ease;
}
.contactInfoItem:hover {
background: #f1f5f9;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}
.iconWrapper {
width: 50px;
height: 50px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
transition: all 0.3s ease;
}
.iconWrapperEmail {
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
}
.iconWrapperPhone {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
}
.iconWrapperLocation {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
}
.contactIcon {
font-size: 20px;
color: white;
}
.contactDetails {
flex: 1;
}
.contactLabel {
display: block;
font-weight: 600;
color: #1e293b;
margin-bottom: 4px;
font-size: 0.95rem;
}
.contactValue {
color: #64748b;
line-height: 1.5;
font-size: 0.9rem;
}
/* Map Section */
.mapSection {
margin-top: 30px;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
}
.mapContainer {
position: relative;
height: 200px;
background: linear-gradient(135deg, #e2e8f0 0%, #cbd5e1 100%);
display: flex;
align-items: center;
justify-content: center;
}
.mapPlaceholder {
text-align: center;
color: #64748b;
}
.mapIcon {
font-size: 3rem;
margin-bottom: 10px;
color: #8b5cf6;
}
/* Contact Form */
.contactForm {
background: white;
border-radius: 20px;
padding: 40px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
position: relative;
overflow: hidden;
}
.contactForm::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
}
.formHeader {
margin-bottom: 30px;
}
.formTitle {
font-size: 1.75rem;
font-weight: 700;
color: #1e293b;
margin-bottom: 12px;
}
.formSubtitle {
color: #64748b;
line-height: 1.6;
}
.form {
display: flex;
flex-direction: column;
gap: 20px;
}
.formRow {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 20px;
}
.formField {
margin-bottom: 0;
}
.formField :global(.ant-form-item-label) {
padding-bottom: 8px;
}
.formField :global(.ant-form-item-label > label) {
font-weight: 600;
color: #374151;
font-size: 0.9rem;
}
.formField :global(.ant-input),
.formField :global(.ant-input-affix-wrapper) {
border-radius: 12px;
border: 2px solid #e5e7eb;
padding: 12px 16px;
font-size: 0.95rem;
transition: all 0.3s ease;
}
.formField :global(.ant-input:focus),
.formField :global(.ant-input-affix-wrapper:focus),
.formField :global(.ant-input-affix-wrapper-focused) {
border-color: #8b5cf6;
box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.1);
}
.formField :global(.ant-input:hover),
.formField :global(.ant-input-affix-wrapper:hover) {
border-color: #a855f7;
}
.messageField {
margin-bottom: 0;
}
.messageField :global(.ant-input) {
resize: none;
min-height: 120px;
}
.submitButton {
height: 50px;
border-radius: 25px;
font-weight: 600;
font-size: 1rem;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border: none;
box-shadow: 0 8px 25px rgba(139, 92, 246, 0.3);
transition: all 0.3s ease;
margin-top: 10px;
}
.submitButton:hover {
transform: translateY(-2px);
box-shadow: 0 12px 35px rgba(139, 92, 246, 0.4);
background: linear-gradient(135deg, #7c3aed 0%, #db2777 100%);
}
.submitButton:active {
transform: translateY(0);
}
/* Additional Features */
.featuresSection {
padding: 60px 0;
background: white;
}
.featuresContainer {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.featuresGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 30px;
margin-top: 40px;
}
.featureCard {
text-align: center;
padding: 30px;
background: #f8fafc;
border-radius: 16px;
transition: all 0.3s ease;
}
.featureCard:hover {
background: white;
transform: translateY(-5px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
}
.featureIcon {
width: 60px;
height: 60px;
margin: 0 auto 20px;
border-radius: 16px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
.featureIconSupport {
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
}
.featureIconResponse {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
}
.featureIconSecurity {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
}
.featureTitle {
font-size: 1.25rem;
font-weight: 600;
color: #1e293b;
margin-bottom: 12px;
}
.featureDescription {
color: #64748b;
line-height: 1.6;
}
/* Responsive Design */
@media (max-width: 1024px) {
.contactGrid {
grid-template-columns: 1fr;
gap: 40px;
}
.heroTitle {
font-size: 3rem;
}
}
@media (max-width: 768px) {
.main {
padding-top: 60px;
}
.heroSection {
padding: 60px 0 40px;
}
.heroTitle {
font-size: 2.5rem;
}
.heroSubtitle {
font-size: 1.1rem;
}
.contactStats {
flex-direction: column;
gap: 20px;
}
.contactSection {
padding: 60px 0;
}
.contactInfo,
.contactForm {
padding: 30px 20px;
}
.formRow {
grid-template-columns: 1fr;
gap: 15px;
}
.featuresGrid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.heroTitle {
font-size: 2rem;
}
.contactInfo,
.contactForm {
padding: 25px 15px;
}
.contactInfoItem {
padding: 15px;
}
}

View File

@@ -1,11 +1,410 @@
"use client"; "use client";
import ContactSection from "../components/Contact/Contact"; import {
BulbOutlined,
ClockCircleOutlined,
EnvironmentOutlined,
IeOutlined,
MailOutlined,
PhoneOutlined,
SendOutlined,
UserOutlined,
} from "@ant-design/icons";
import { Button, Form, Input, message, Typography } from "antd";
import { motion } from "framer-motion";
import { useState } from "react";
import styles from "./page.module.css";
const { Title, Paragraph, Text } = Typography;
const { TextArea } = Input;
export default function ContactPage() { export default function ContactPage() {
const [form] = Form.useForm();
const [submitting, setSubmitting] = useState(false);
const handleSubmit = async () => {
setSubmitting(true);
// Simulate API call
setTimeout(() => {
message.success("Your message has been sent successfully!");
form.resetFields();
setSubmitting(false);
}, 1500);
};
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.2,
},
},
};
const itemVariants = {
hidden: { y: 20, opacity: 0 },
visible: {
y: 0,
opacity: 1,
transition: { duration: 0.5 },
},
};
return ( return (
<main className="pt-20"> <main className={styles.main}>
<ContactSection /> {/* Hero Section */}
<section className={styles.heroSection}>
<div className={styles.heroBackground}>
<div className={styles.heroOrb1}></div>
<div className={styles.heroOrb2}></div>
</div>
<div className={styles.heroContent}>
<motion.div
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
>
<Title level={1} className={styles.heroTitle}>
Get In <span className={styles.gradientText}>Touch</span>
</Title>
<Paragraph className={styles.heroSubtitle}>
Ready to transform your ideas into reality? Let&apos;s start a
conversation about your next project and how we can help bring
your vision to life.
</Paragraph>
<div className={styles.contactStats}>
<div className={styles.statItem}>
<span className={styles.statNumber}>24/7</span>
<span className={styles.statLabel}>Support</span>
</div>
<div className={styles.statItem}>
<span className={styles.statNumber}>2hr</span>
<span className={styles.statLabel}>Response Time</span>
</div>
<div className={styles.statItem}>
<span className={styles.statNumber}>100%</span>
<span className={styles.statLabel}>Secure</span>
</div>
</div>
</motion.div>
</div>
</section>
{/* Contact Section */}
<section className={styles.contactSection}>
<div className={styles.contactBackground}></div>
<div className={styles.contactContainer}>
<div className={styles.contactGrid}>
{/* Contact Info */}
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className={styles.contactInfo}
>
<div className={styles.contactInfoHeader}>
<Title level={3} className={styles.contactInfoTitle}>
Contact Information
</Title>
<Paragraph className={styles.contactInfoSubtitle}>
Reach out to us through any of these channels. We&apos;re here
to help you succeed with your next project.
</Paragraph>
</div>
<div className={styles.contactInfoList}>
<motion.div
variants={itemVariants}
className={styles.contactInfoItem}
>
<div
className={`${styles.iconWrapper} ${styles.iconWrapperEmail}`}
>
<MailOutlined className={styles.contactIcon} />
</div>
<div className={styles.contactDetails}>
<Text strong className={styles.contactLabel}>
Email
</Text>
<Text className={styles.contactValue}>
info@techmaster.com
</Text>
</div>
</motion.div>
<motion.div
variants={itemVariants}
className={styles.contactInfoItem}
>
<div
className={`${styles.iconWrapper} ${styles.iconWrapperPhone}`}
>
<PhoneOutlined className={styles.contactIcon} />
</div>
<div className={styles.contactDetails}>
<Text strong className={styles.contactLabel}>
Phone
</Text>
<Text className={styles.contactValue}>
+1 (555) 123-4567
</Text>
</div>
</motion.div>
<motion.div
variants={itemVariants}
className={styles.contactInfoItem}
>
<div
className={`${styles.iconWrapper} ${styles.iconWrapperLocation}`}
>
<EnvironmentOutlined className={styles.contactIcon} />
</div>
<div className={styles.contactDetails}>
<Text strong className={styles.contactLabel}>
Address
</Text>
<Text className={styles.contactValue}>
1234 Tech Boulevard, Innovation District
<br />
San Francisco, CA 94105
</Text>
</div>
</motion.div>
</div>
<motion.div variants={itemVariants} className={styles.mapSection}>
<div className={styles.mapContainer}>
<div className={styles.mapPlaceholder}>
<EnvironmentOutlined className={styles.mapIcon} />
<div>Interactive Map Coming Soon</div>
</div>
</div>
</motion.div>
</motion.div>
{/* Contact Form */}
<motion.div
initial={{ opacity: 0, x: 30 }}
whileInView={{ opacity: 1, x: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
viewport={{ once: true }}
className={styles.contactForm}
>
<div className={styles.formHeader}>
<Title level={3} className={styles.formTitle}>
Send Us a Message
</Title>
<Paragraph className={styles.formSubtitle}>
Tell us about your project and we&apos;ll get back to you
within 2 hours.
</Paragraph>
</div>
<Form
form={form}
layout="vertical"
onFinish={handleSubmit}
className={styles.form}
>
<div className={styles.formRow}>
<Form.Item
name="name"
label="Full Name"
rules={[
{ required: true, message: "Please enter your name" },
]}
className={styles.formField}
>
<Input
size="large"
placeholder="Your full name"
prefix={<UserOutlined />}
/>
</Form.Item>
<Form.Item
name="email"
label="Email Address"
rules={[
{ required: true, message: "Please enter your email" },
{
type: "email",
message: "Please enter a valid email",
},
]}
className={styles.formField}
>
<Input
size="large"
placeholder="your.email@example.com"
prefix={<MailOutlined />}
/>
</Form.Item>
</div>
<Form.Item
name="subject"
label="Subject"
rules={[
{ required: true, message: "Please enter a subject" },
]}
className={styles.formField}
>
<Input
size="large"
placeholder="How can we help you?"
prefix={<BulbOutlined />}
/>
</Form.Item>
<Form.Item
name="message"
label="Message"
rules={[
{ required: true, message: "Please enter your message" },
]}
className={`${styles.formField} ${styles.messageField}`}
>
<TextArea
rows={5}
placeholder="Tell us about your project, goals, and any specific requirements..."
/>
</Form.Item>
<Form.Item>
<Button
type="primary"
htmlType="submit"
size="large"
icon={<SendOutlined />}
loading={submitting}
className={styles.submitButton}
>
Send Message
</Button>
</Form.Item>
</Form>
</motion.div>
</div>
</div>
</section>
{/* Features Section */}
<section className={styles.featuresSection}>
<div className={styles.featuresContainer}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
viewport={{ once: true }}
style={{ textAlign: "center", marginBottom: "40px" }}
>
<Title
level={2}
style={{
fontSize: "2.5rem",
fontWeight: 700,
color: "#1e293b",
marginBottom: "16px",
}}
>
Why Choose{" "}
<span
style={{
background:
"linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%)",
WebkitBackgroundClip: "text",
WebkitTextFillColor: "transparent",
backgroundClip: "text",
}}
>
Us
</span>
</Title>
<Paragraph
style={{
fontSize: "1.1rem",
color: "#64748b",
maxWidth: "600px",
margin: "0 auto",
}}
>
We&apos;re committed to providing exceptional service and support
throughout your journey with us.
</Paragraph>
</motion.div>
<div className={styles.featuresGrid}>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.1 }}
viewport={{ once: true }}
className={styles.featureCard}
>
<div
className={`${styles.featureIcon} ${styles.featureIconSupport}`}
>
<UserOutlined />
</div>
<Title level={4} className={styles.featureTitle}>
24/7 Support
</Title>
<Paragraph className={styles.featureDescription}>
Our dedicated team is available around the clock to assist you
with any questions or concerns.
</Paragraph>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.2 }}
viewport={{ once: true }}
className={styles.featureCard}
>
<div
className={`${styles.featureIcon} ${styles.featureIconResponse}`}
>
<ClockCircleOutlined />
</div>
<Title level={4} className={styles.featureTitle}>
Fast Response
</Title>
<Paragraph className={styles.featureDescription}>
We guarantee a response within 2 hours during business hours,
ensuring your project moves forward quickly.
</Paragraph>
</motion.div>
<motion.div
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.6, delay: 0.3 }}
viewport={{ once: true }}
className={styles.featureCard}
>
<div
className={`${styles.featureIcon} ${styles.featureIconSecurity}`}
>
<IeOutlined />
</div>
<Title level={4} className={styles.featureTitle}>
Secure & Confidential
</Title>
<Paragraph className={styles.featureDescription}>
Your information is protected with enterprise-grade security and
strict confidentiality protocols.
</Paragraph>
</motion.div>
</div>
</div>
</section>
</main> </main>
); );
} }

View File

@@ -18,7 +18,8 @@ const inter = Inter({
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Tech Master | Dubai To Stars - Award-Winning IT Solutions", title: "Tech Master | Dubai To Stars - Award-Winning IT Solutions",
description: "Tech Master is an award-winning Dubai-based technology agency specializing in digital transformation, web development, mobile apps, AI solutions, and enterprise software. From zero to hero, we create cutting-edge digital experiences for ambitious businesses.", description:
"Tech Master is an award-winning Dubai-based technology agency specializing in digital transformation, web development, mobile apps, AI solutions, and enterprise software. From zero to hero, we create cutting-edge digital experiences for ambitious businesses.",
keywords: [ keywords: [
"Dubai IT solutions", "Dubai IT solutions",
"digital transformation", "digital transformation",
@@ -36,7 +37,7 @@ export const metadata: Metadata = {
"blockchain development", "blockchain development",
"IoT solutions", "IoT solutions",
"tech agency Dubai", "tech agency Dubai",
"software development UAE" "software development UAE",
], ],
authors: [{ name: "Tech Master" }], authors: [{ name: "Tech Master" }],
creator: "Tech Master", creator: "Tech Master",
@@ -52,7 +53,8 @@ export const metadata: Metadata = {
}, },
openGraph: { openGraph: {
title: "Tech Master | Dubai To Stars - Award-Winning IT Solutions", title: "Tech Master | Dubai To Stars - Award-Winning IT Solutions",
description: "Award-winning Dubai-based technology agency specializing in digital transformation, web development, mobile apps, AI solutions, and enterprise software.", description:
"Award-winning Dubai-based technology agency specializing in digital transformation, web development, mobile apps, AI solutions, and enterprise software.",
url: "https://tech-masters.guru", url: "https://tech-masters.guru",
siteName: "Tech Master", siteName: "Tech Master",
images: [ images: [
@@ -69,7 +71,8 @@ export const metadata: Metadata = {
twitter: { twitter: {
card: "summary_large_image", card: "summary_large_image",
title: "Tech Master | Dubai To Stars - Award-Winning IT Solutions", title: "Tech Master | Dubai To Stars - Award-Winning IT Solutions",
description: "Award-winning Dubai-based technology agency specializing in digital transformation and innovative IT solutions.", description:
"Award-winning Dubai-based technology agency specializing in digital transformation and innovative IT solutions.",
images: ["https://tech-masters.guru/twitter-image.jpg"], images: ["https://tech-masters.guru/twitter-image.jpg"],
creator: "@techmasterdubai", creator: "@techmasterdubai",
}, },
@@ -108,7 +111,7 @@ export default function RootLayout({
src="https://threejs.org/examples/js/libs/stats.min.js" src="https://threejs.org/examples/js/libs/stats.min.js"
async async
></script> ></script>
{/* Structured Data */} {/* Structured Data */}
<script <script
type="application/ld+json" type="application/ld+json"
@@ -116,26 +119,27 @@ export default function RootLayout({
__html: JSON.stringify({ __html: JSON.stringify({
"@context": "https://schema.org", "@context": "https://schema.org",
"@type": "Organization", "@type": "Organization",
"name": "Tech Master", name: "Tech Master",
"url": "https://tech-masters.guru", url: "https://tech-masters.guru",
"logo": "https://tech-masters.guru/logo.png", logo: "https://tech-masters.guru/logo.png",
"description": "Award-winning Dubai-based technology agency specializing in digital transformation and innovative IT solutions.", description:
"address": { "Award-winning Dubai-based technology agency specializing in digital transformation and innovative IT solutions.",
address: {
"@type": "PostalAddress", "@type": "PostalAddress",
"addressLocality": "Dubai", addressLocality: "Dubai",
"addressCountry": "UAE" addressCountry: "UAE",
}, },
"contactPoint": { contactPoint: {
"@type": "ContactPoint", "@type": "ContactPoint",
"telephone": "+971-XX-XXX-XXXX", telephone: "+971-XX-XXX-XXXX",
"contactType": "customer service" contactType: "customer service",
}, },
"sameAs": [ sameAs: [
"https://linkedin.com/company/tech-master", "https://linkedin.com/company/tech-master",
"https://twitter.com/techmasterdubai", "https://twitter.com/techmasterdubai",
"https://facebook.com/techmasterdubai" "https://facebook.com/techmasterdubai",
] ],
}) }),
}} }}
/> />
</head> </head>

View File

@@ -3,7 +3,7 @@
import { Spin, Typography } from "antd"; import { Spin, Typography } from "antd";
import { useEffect, useState } from "react"; import { useEffect, useState } from "react";
import ContactSection from "./components/Contact/Contact"; import Footer from "./components/Footer/Footer";
import HeroSection from "./components/Hero/HeroSection"; import HeroSection from "./components/Hero/HeroSection";
import PreferencesSelector from "./components/Preferences/Preferences"; import PreferencesSelector from "./components/Preferences/Preferences";
import ProjectsShowcase from "./components/ProjectsShowcase/ProjectsShowcase"; import ProjectsShowcase from "./components/ProjectsShowcase/ProjectsShowcase";
@@ -64,23 +64,21 @@ export default function Home() {
<section id="home"> <section id="home">
<HeroSection /> <HeroSection />
</section> </section>
<section id="services"> <section id="services">
<ServicesSection userPreferences={userPreferences} /> <ServicesSection userPreferences={userPreferences} />
</section> </section>
<section id="projects"> <section id="projects">
<ProjectsShowcase /> <ProjectsShowcase />
</section> </section>
<section id="testimonials"> <section id="testimonials">
<TestimonialsSection /> <TestimonialsSection />
</section> </section>
<section id="contact">
<ContactSection />
</section>
</main> </main>
<Footer />
</> </>
); );
} }

View File

@@ -0,0 +1,408 @@
/* Projects Page Styles */
.main {
padding-top: 80px;
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
min-height: 100vh;
}
/* Hero Section */
.heroSection {
position: relative;
padding: 80px 0 60px;
background: linear-gradient(135deg, #0F0525 0%, #1a0b3a 50%, #2A0B45 100%);
color: white;
overflow: hidden;
}
.heroBackground {
position: absolute;
inset: 0;
opacity: 0.1;
}
.heroOrb1 {
position: absolute;
top: -100px;
left: -100px;
width: 300px;
height: 300px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-radius: 50%;
filter: blur(40px);
animation: float 6s ease-in-out infinite;
}
.heroOrb2 {
position: absolute;
top: 50px;
right: -150px;
width: 250px;
height: 250px;
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
border-radius: 50%;
filter: blur(35px);
animation: float 8s ease-in-out infinite reverse;
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-20px);
}
}
.heroContent {
position: relative;
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
text-align: center;
}
.heroTitle {
font-size: 3.5rem;
font-weight: 700;
margin-bottom: 20px;
line-height: 1.2;
color: white;
}
.gradientText {
background: linear-gradient(135deg, #a855f7 0%, #ec4899 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.heroSubtitle {
font-size: 1.25rem;
color: #cbd5e1;
max-width: 600px;
margin: 0 auto 30px;
line-height: 1.6;
}
.projectStats {
display: flex;
justify-content: center;
gap: 40px;
margin-top: 40px;
}
.statItem {
text-align: center;
}
.statNumber {
font-size: 2rem;
font-weight: 700;
color: #a855f7;
display: block;
}
.statLabel {
font-size: 0.9rem;
color: #94a3b8;
margin-top: 4px;
}
/* Projects Section */
.projectsSection {
padding: 80px 0;
position: relative;
}
.projectsBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(139, 92, 246, 0.05) 0%, rgba(236, 72, 153, 0.05) 100%);
}
.projectsContainer {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
position: relative;
}
.projectsHeader {
text-align: center;
margin-bottom: 60px;
}
.projectsTitle {
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 16px;
color: #1e293b;
}
.projectsSubtitle {
font-size: 1.1rem;
color: #64748b;
max-width: 600px;
margin: 0 auto;
line-height: 1.6;
}
/* Filter Section */
.filterSection {
margin-bottom: 40px;
text-align: center;
}
.filterButtons {
display: flex;
justify-content: center;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 20px;
}
.filterButton {
padding: 8px 20px;
border-radius: 25px;
border: 2px solid #e5e7eb;
background: white;
color: #64748b;
font-weight: 500;
transition: all 0.3s ease;
cursor: pointer;
}
.filterButton:hover {
border-color: #8b5cf6;
color: #8b5cf6;
}
.filterButton.active {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-color: transparent;
color: white;
}
/* Projects Grid */
.projectsGrid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 24px;
margin-bottom: 60px;
}
.projectCard {
background: white;
border-radius: 16px;
overflow: hidden;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
transition: all 0.3s ease;
cursor: pointer;
border: none;
height: fit-content;
}
.projectCard:hover {
transform: translateY(-10px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.projectImageContainer {
position: relative;
height: 200px;
overflow: hidden;
}
.projectImage {
width: 100%;
height: 100%;
object-fit: cover;
transition: transform 0.3s ease;
}
.projectCard:hover .projectImage {
transform: scale(1.05);
}
.projectOverlay {
position: absolute;
inset: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transition: opacity 0.3s ease;
}
.projectCard:hover .projectOverlay {
opacity: 1;
}
.viewButton {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border: none;
width: 50px;
height: 50px;
font-size: 18px;
}
.featuredBadge {
position: absolute;
top: 16px;
right: 16px;
z-index: 2;
}
.projectContent {
padding: 20px;
}
.categoryTag {
margin-bottom: 12px;
}
.projectTitle {
font-size: 1.1rem;
font-weight: 600;
color: #1e293b;
margin-bottom: 8px;
line-height: 1.3;
}
.projectDescription {
color: #64748b;
line-height: 1.5;
margin-bottom: 12px;
font-size: 0.85rem;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
.technologiesList {
display: flex;
flex-wrap: wrap;
gap: 4px;
margin-bottom: 12px;
}
.techTag {
background: #f8fafc;
color: #475569;
border: 1px solid #e2e8f0;
font-size: 0.75rem;
padding: 2px 6px;
border-radius: 8px;
}
.projectMeta {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 12px;
border-top: 1px solid #f1f5f9;
font-size: 0.8rem;
}
.projectDuration {
font-size: 0.75rem;
color: #64748b;
}
.projectTeam {
font-size: 0.75rem;
color: #64748b;
}
/* Load More Section */
.loadMoreSection {
text-align: center;
margin-top: 40px;
}
.loadMoreButton {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border: none;
color: white;
padding: 12px 32px;
border-radius: 25px;
font-weight: 600;
font-size: 1rem;
transition: all 0.3s ease;
}
.loadMoreButton:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(139, 92, 246, 0.3);
background: linear-gradient(135deg, #7c3aed 0%, #db2777 100%);
color: white;
}
/* Responsive Design */
@media (max-width: 1024px) {
.projectsGrid {
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 20px;
}
.heroTitle {
font-size: 3rem;
}
}
@media (max-width: 768px) {
.main {
padding-top: 60px;
}
.heroSection {
padding: 60px 0 40px;
}
.heroTitle {
font-size: 2.5rem;
}
.heroSubtitle {
font-size: 1.1rem;
}
.projectStats {
flex-direction: column;
gap: 20px;
}
.projectsSection {
padding: 60px 0;
}
.projectsGrid {
grid-template-columns: 1fr;
gap: 16px;
}
.filterButtons {
gap: 8px;
}
.filterButton {
padding: 6px 16px;
font-size: 0.9rem;
}
}
@media (max-width: 480px) {
.heroTitle {
font-size: 2rem;
}
.projectCard {
margin: 0 10px;
}
.projectContent {
padding: 20px;
}
}

View File

@@ -1,9 +1,638 @@
import ProjectsShowcase from "../components/ProjectsShowcase/ProjectsShowcase"; "use client";
import {
CloseOutlined,
EyeOutlined,
GithubOutlined,
LinkOutlined,
RocketOutlined,
UserOutlined,
} from "@ant-design/icons";
import {
Badge,
Button,
Card,
Carousel,
Col,
Modal,
Row,
Tag,
Typography,
} from "antd";
import { AnimatePresence, motion } from "framer-motion";
import Image from "next/image";
import { useState } from "react";
import Footer from "../components/Footer/Footer";
import styles from "./page.module.css";
const { Title, Paragraph, Text } = Typography;
interface Project {
id: string;
title: string;
description: string;
imageUrl: string;
category: string;
technologies: string[];
featured: boolean;
detailedDescription: string;
images: string[];
liveUrl?: string;
githubUrl?: string;
features: string[];
duration: string;
teamSize: string;
}
// Sample project data (same as in ProjectsShowcase)
const projectsData: Project[] = [
{
id: "p1",
title: "BPro ERP System",
description:
"Comprehensive enterprise resource planning system with advanced business process management and real-time analytics.",
imageUrl: "https://tech-masters.guru/photos/projects/bpro-erp.jpg",
category: "Enterprise Software",
technologies: ["React", "Node.js", "PostgreSQL", "Redis"],
featured: true,
detailedDescription:
"A comprehensive ERP system designed for modern businesses, featuring advanced business process management, real-time analytics, and seamless integration with existing enterprise systems. The platform streamlines operations across all departments.",
images: [
"https://tech-masters.guru/photos/projects/bpro-erp.jpg",
"https://tech-masters.guru/photos/projects/bpro-erp.jpg",
"https://tech-masters.guru/photos/projects/bpro-erp.jpg",
],
liveUrl: "https://bpro-erp.com",
githubUrl: "https://github.com/company/bpro-erp",
features: [
"Advanced business process management",
"Real-time analytics and reporting",
"Multi-department integration",
"Custom workflow automation",
"Comprehensive audit trails",
],
duration: "8 months",
teamSize: "12 developers",
},
{
id: "p2",
title: "Law Office Management",
description:
"Complete legal practice management solution with case tracking, document management, and client portal.",
imageUrl: "https://tech-masters.guru/photos/projects/law-office-home.png",
category: "Legal Software",
technologies: ["Angular", ".NET Core", "SQL Server", "Azure"],
featured: true,
detailedDescription:
"A comprehensive legal practice management system designed to streamline law office operations, manage cases, track billable hours, and provide secure client communication portals.",
images: [
"https://tech-masters.guru/photos/projects/law-office-home.png",
"https://tech-masters.guru/photos/projects/law-office-login.png",
"https://tech-masters.guru/photos/projects/law-office-home.png",
],
liveUrl: "https://law-office-demo.com",
githubUrl: "https://github.com/company/law-office-system",
features: [
"Case management and tracking",
"Document management system",
"Client portal and communication",
"Time tracking and billing",
"Calendar and appointment management",
],
duration: "6 months",
teamSize: "8 developers",
},
{
id: "p3",
title: "MoneyOut Payment Platform",
description:
"Secure digital payment processing platform with multi-currency support and advanced fraud detection.",
imageUrl: "https://tech-masters.guru/photos/projects/moneyout.png",
category: "FinTech",
technologies: ["Next.js", "Stripe", "MongoDB", "GraphQL"],
featured: true,
detailedDescription:
"A modern payment processing platform that enables secure digital transactions with multi-currency support, advanced fraud detection, and comprehensive merchant tools.",
images: [
"https://tech-masters.guru/photos/projects/moneyout.png",
"https://tech-masters.guru/photos/projects/moneyout.png",
"https://tech-masters.guru/photos/projects/moneyout.png",
],
liveUrl: "https://moneyout-demo.com",
githubUrl: "https://github.com/company/moneyout-platform",
features: [
"Multi-currency payment processing",
"Advanced fraud detection",
"Merchant dashboard and analytics",
"Secure API integration",
"Real-time transaction monitoring",
],
duration: "7 months",
teamSize: "10 developers",
},
{
id: "p4",
title: "Cloths E-commerce Platform",
description:
"Modern fashion e-commerce platform with advanced product catalog, virtual try-on, and personalized recommendations.",
imageUrl: "https://tech-masters.guru/photos/projects/cloths-e-commerce.png",
category: "E-commerce",
technologies: ["React", "Node.js", "MongoDB", "AWS"],
featured: false,
detailedDescription:
"A cutting-edge fashion e-commerce platform featuring virtual try-on technology, personalized recommendations, and seamless mobile shopping experience.",
images: [
"https://tech-masters.guru/photos/projects/cloths-e-commerce.png",
"https://tech-masters.guru/photos/projects/cloths-e-commerce.png",
"https://tech-masters.guru/photos/projects/cloths-e-commerce.png",
],
liveUrl: "https://cloths-ecommerce.com",
githubUrl: "https://github.com/company/cloths-ecommerce",
features: [
"Virtual try-on technology",
"Personalized recommendations",
"Advanced product catalog",
"Mobile-first design",
"Social commerce integration",
],
duration: "5 months",
teamSize: "6 developers",
},
{
id: "p5",
title: "Nanas Dashboard",
description:
"Comprehensive business intelligence dashboard with real-time data visualization and predictive analytics.",
imageUrl:
"https://tech-masters.guru/photos/projects/nanas-main-dashboard.png",
category: "Business Intelligence",
technologies: ["Vue.js", "Python", "PostgreSQL", "Docker"],
featured: false,
detailedDescription:
"A powerful business intelligence dashboard that provides real-time data visualization, predictive analytics, and comprehensive reporting for data-driven decision making.",
images: [
"https://tech-masters.guru/photos/projects/nanas-main-dashboard.png",
"https://tech-masters.guru/photos/projects/nanas-main-dashboard.png",
"https://tech-masters.guru/photos/projects/nanas-main-dashboard.png",
],
liveUrl: "https://nanas-dashboard.com",
githubUrl: "https://github.com/company/nanas-dashboard",
features: [
"Real-time data visualization",
"Predictive analytics",
"Custom reporting tools",
"Interactive dashboards",
"Data export capabilities",
],
duration: "4 months",
teamSize: "5 developers",
},
{
id: "p6",
title: "Easy Pay Login System",
description:
"Secure authentication system with multi-factor authentication and advanced security features for financial applications.",
imageUrl: "https://tech-masters.guru/photos/projects/easy-pay-login.png",
category: "Security",
technologies: ["React", "Node.js", "JWT", "Redis"],
featured: false,
detailedDescription:
"A robust authentication system designed for financial applications, featuring multi-factor authentication, advanced security protocols, and seamless user experience.",
images: [
"https://tech-masters.guru/photos/projects/easy-pay-login.png",
"https://tech-masters.guru/photos/projects/easy-pay-login.png",
"https://tech-masters.guru/photos/projects/easy-pay-login.png",
],
liveUrl: "https://easy-pay-login.com",
githubUrl: "https://github.com/company/easy-pay-login",
features: [
"Multi-factor authentication",
"Advanced security protocols",
"Session management",
"Audit logging",
"Password recovery system",
],
duration: "3 months",
teamSize: "4 developers",
},
{
id: "p7",
title: "Majsin Dashboard",
description:
"Advanced analytics dashboard with machine learning insights and customizable reporting for enterprise clients.",
imageUrl: "https://tech-masters.guru/photos/projects/majsin-dashborad.png",
category: "Analytics",
technologies: ["Angular", "Python", "TensorFlow", "AWS"],
featured: false,
detailedDescription:
"An advanced analytics dashboard powered by machine learning, providing deep insights and customizable reporting for enterprise-level decision making.",
images: [
"https://tech-masters.guru/photos/projects/majsin-dashborad.png",
"https://tech-masters.guru/photos/projects/majsin-dashborad.png",
"https://tech-masters.guru/photos/projects/majsin-dashborad.png",
],
liveUrl: "https://majsin-dashboard.com",
githubUrl: "https://github.com/company/majsin-dashboard",
features: [
"Machine learning insights",
"Customizable reporting",
"Real-time data processing",
"Advanced visualizations",
"API integration capabilities",
],
duration: "6 months",
teamSize: "7 developers",
},
{
id: "p8",
title: "SVU Hardware Management",
description:
"Comprehensive hardware inventory and management system for educational institutions with asset tracking.",
imageUrl: "https://tech-masters.guru/photos/projects/svu-hw.png",
category: "Education",
technologies: ["React", "Node.js", "MySQL", "Docker"],
featured: false,
detailedDescription:
"A comprehensive hardware management system designed for educational institutions, featuring asset tracking, maintenance scheduling, and detailed reporting capabilities.",
images: [
"https://tech-masters.guru/photos/projects/svu-hw.png",
"https://tech-masters.guru/photos/projects/svu-hw.png",
"https://tech-masters.guru/photos/projects/svu-hw.png",
],
liveUrl: "https://svu-hardware.com",
githubUrl: "https://github.com/company/svu-hardware",
features: [
"Asset tracking and management",
"Maintenance scheduling",
"Inventory control",
"Detailed reporting",
"User access management",
],
duration: "5 months",
teamSize: "6 developers",
},
];
const categories = [
"All",
"Enterprise Software",
"Legal Software",
"FinTech",
"E-commerce",
"Business Intelligence",
"Security",
"Analytics",
"Education",
];
export default function ProjectsPage() { export default function ProjectsPage() {
const [selectedCategory, setSelectedCategory] = useState("All");
const [selectedProject, setSelectedProject] = useState<Project | null>(null);
const [isModalVisible, setIsModalVisible] = useState(false);
const [visibleProjects, setVisibleProjects] = useState(6);
const filteredProjects =
selectedCategory === "All"
? projectsData
: projectsData.filter((project) => project.category === selectedCategory);
const displayedProjects = filteredProjects.slice(0, visibleProjects);
const handleProjectClick = (project: Project) => {
setSelectedProject(project);
setIsModalVisible(true);
};
const handleModalClose = () => {
setIsModalVisible(false);
setTimeout(() => {
setSelectedProject(null);
}, 300);
};
const handleLoadMore = () => {
setVisibleProjects((prev) => Math.min(prev + 6, filteredProjects.length));
};
const handleCategoryClick = (category: string) => {
if (selectedCategory === category) {
// If clicking on the same category, remove the filter
setSelectedCategory("All");
} else {
// Otherwise, set the new category
setSelectedCategory(category);
}
setVisibleProjects(6);
};
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.1,
},
},
};
const itemVariants = {
hidden: { y: 20, opacity: 0 },
visible: {
y: 0,
opacity: 1,
transition: { duration: 0.5 },
},
};
return ( return (
<main className="pt-20"> <main className={styles.main}>
<ProjectsShowcase /> {/* Hero Section */}
<section className={styles.heroSection}>
<div className={styles.heroBackground}>
<div className={styles.heroOrb1}></div>
<div className={styles.heroOrb2}></div>
</div>
<div className={styles.heroContent}>
<motion.div
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
>
<Title level={1} className={styles.heroTitle}>
Our <span className={styles.gradientText}>Projects</span>
</Title>
<Paragraph className={styles.heroSubtitle}>
Explore our portfolio of innovative solutions that have
transformed businesses and delivered exceptional results across
various industries.
</Paragraph>
<div className={styles.projectStats}>
<div className={styles.statItem}>
<span className={styles.statNumber}>50+</span>
<span className={styles.statLabel}>Projects Completed</span>
</div>
<div className={styles.statItem}>
<span className={styles.statNumber}>8</span>
<span className={styles.statLabel}>Industries Served</span>
</div>
<div className={styles.statItem}>
<span className={styles.statNumber}>100%</span>
<span className={styles.statLabel}>Client Satisfaction</span>
</div>
</div>
</motion.div>
</div>
</section>
{/* Projects Section */}
<section className={styles.projectsSection}>
<div className={styles.projectsBackground}></div>
<div className={styles.projectsContainer}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
viewport={{ once: true }}
className={styles.projectsHeader}
>
<Title level={2} className={styles.projectsTitle}>
Featured <span className={styles.gradientText}>Work</span>
</Title>
<Paragraph className={styles.projectsSubtitle}>
Discover our latest projects and see how we&apos;ve helped businesses
achieve their digital transformation goals.
</Paragraph>
</motion.div>
{/* Filter Section */}
<div className={styles.filterSection}>
<div className={styles.filterButtons}>
{categories.map((category) => (
<button
key={category}
className={`${styles.filterButton} ${
selectedCategory === category ? styles.active : ""
}`}
onClick={() => handleCategoryClick(category)}
>
{category}
</button>
))}
</div>
</div>
{/* Projects Grid */}
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className={styles.projectsGrid}
>
{displayedProjects.map((project) => (
<motion.div key={project.id} variants={itemVariants}>
<Card
hoverable
onClick={() => handleProjectClick(project)}
className={styles.projectCard}
cover={
<div className={styles.projectImageContainer}>
<Image
alt={project.title}
src={project.imageUrl}
className={styles.projectImage}
width={400}
height={250}
/>
<div className={styles.projectOverlay}>
<Button
type="primary"
shape="circle"
icon={<EyeOutlined />}
className={styles.viewButton}
/>
</div>
{project.featured && (
<Badge.Ribbon
text="Featured"
className={styles.featuredBadge}
/>
)}
</div>
}
>
<div className={styles.projectContent}>
<div className={styles.categoryTag}>
<Tag color="blue">{project.category}</Tag>
</div>
<Title level={4} className={styles.projectTitle}>
{project.title}
</Title>
<Paragraph className={styles.projectDescription}>
{project.description}
</Paragraph>
<div className={styles.technologiesList}>
{project.technologies.slice(0, 4).map((tech) => (
<Tag key={tech} className={styles.techTag}>
{tech}
</Tag>
))}
{project.technologies.length > 4 && (
<Tag className={styles.techTag}>
+{project.technologies.length - 4} more
</Tag>
)}
</div>
<div className={styles.projectMeta}>
<div className={styles.projectDuration}>
<RocketOutlined /> {project.duration}
</div>
<div className={styles.projectTeam}>
<UserOutlined /> {project.teamSize}
</div>
</div>
</div>
</Card>
</motion.div>
))}
</motion.div>
{/* Load More Section */}
{visibleProjects < filteredProjects.length && (
<div className={styles.loadMoreSection}>
<Button
type="primary"
size="large"
onClick={handleLoadMore}
className={styles.loadMoreButton}
>
Load More Projects
</Button>
</div>
)}
</div>
</section>
{/* Project Details Modal */}
<AnimatePresence>
{isModalVisible && selectedProject && (
<Modal
open={isModalVisible}
onCancel={handleModalClose}
footer={null}
width={1000}
className={styles.projectModal}
closeIcon={<CloseOutlined />}
>
<motion.div
initial={{ opacity: 0, scale: 0.8 }}
animate={{ opacity: 1, scale: 1 }}
exit={{ opacity: 0, scale: 0.8 }}
transition={{ duration: 0.3 }}
>
<div style={{ padding: "20px 0" }}>
<div
style={{
display: "flex",
justifyContent: "space-between",
alignItems: "flex-start",
marginBottom: "24px",
}}
>
<div>
<Title level={2} style={{ marginBottom: "8px" }}>
{selectedProject.title}
</Title>
<Tag color="blue">{selectedProject.category}</Tag>
</div>
<div style={{ display: "flex", gap: "12px" }}>
{selectedProject.liveUrl && (
<Button
type="primary"
icon={<LinkOutlined />}
href={selectedProject.liveUrl}
target="_blank"
>
Live Demo
</Button>
)}
{selectedProject.githubUrl && (
<Button
icon={<GithubOutlined />}
href={selectedProject.githubUrl}
target="_blank"
>
View Code
</Button>
)}
</div>
</div>
<div style={{ marginBottom: "24px" }}>
<Carousel autoplay dots={{ className: "custom-dots" }}>
{selectedProject.images.map((image, index) => (
<div key={index}>
<Image
src={image}
alt={`${selectedProject.title} - Image ${index + 1}`}
width={800}
height={400}
style={{
width: "100%",
height: "auto",
borderRadius: "8px",
}}
/>
</div>
))}
</Carousel>
</div>
<Row gutter={[24, 24]}>
<Col xs={24} md={12}>
<Title level={4}>Project Overview</Title>
<Paragraph>{selectedProject.detailedDescription}</Paragraph>
<Title level={4} style={{ marginTop: "24px" }}>
Key Features
</Title>
<ul>
{selectedProject.features.map((feature, index) => (
<li key={index} style={{ marginBottom: "8px" }}>
{feature}
</li>
))}
</ul>
</Col>
<Col xs={24} md={12}>
<Title level={4}>Project Details</Title>
<div style={{ marginBottom: "16px" }}>
<Text strong>Duration:</Text> {selectedProject.duration}
</div>
<div style={{ marginBottom: "16px" }}>
<Text strong>Team Size:</Text> {selectedProject.teamSize}
</div>
<div style={{ marginBottom: "16px" }}>
<Text strong>Technologies:</Text>
<div style={{ marginTop: "8px" }}>
{selectedProject.technologies.map((tech) => (
<Tag key={tech} style={{ marginBottom: "4px" }}>
{tech}
</Tag>
))}
</div>
</div>
</Col>
</Row>
</div>
</motion.div>
</Modal>
)}
</AnimatePresence>
<Footer />
</main> </main>
); );
} }

View File

@@ -2,7 +2,8 @@ import type { Metadata } from "next";
export const metadata: Metadata = { export const metadata: Metadata = {
title: "Our Services | Tech Master - Digital Transformation & IT Solutions", title: "Our Services | Tech Master - Digital Transformation & IT Solutions",
description: "Explore our comprehensive IT services including web development, mobile apps, AI solutions, ERP systems, e-commerce platforms, and digital transformation services in Dubai.", description:
"Explore our comprehensive IT services including web development, mobile apps, AI solutions, ERP systems, e-commerce platforms, and digital transformation services in Dubai.",
keywords: [ keywords: [
"web development Dubai", "web development Dubai",
"mobile app development", "mobile app development",
@@ -12,11 +13,12 @@ export const metadata: Metadata = {
"digital transformation", "digital transformation",
"cloud migration", "cloud migration",
"cybersecurity services", "cybersecurity services",
"IT consulting Dubai" "IT consulting Dubai",
], ],
openGraph: { openGraph: {
title: "Our Services | Tech Master - Digital Transformation & IT Solutions", title: "Our Services | Tech Master - Digital Transformation & IT Solutions",
description: "Comprehensive IT services including web development, mobile apps, AI solutions, ERP systems, and digital transformation in Dubai.", description:
"Comprehensive IT services including web development, mobile apps, AI solutions, ERP systems, and digital transformation in Dubai.",
url: "https://tech-masters.guru/services", url: "https://tech-masters.guru/services",
}, },
alternates: { alternates: {
@@ -30,4 +32,4 @@ export default function ServicesLayout({
children: React.ReactNode; children: React.ReactNode;
}) { }) {
return children; return children;
} }

View File

@@ -0,0 +1,626 @@
/* Services Page Enhanced Styles */
.main {
padding-top: 80px;
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
min-height: 100vh;
}
/* Hero Section */
.heroSection {
position: relative;
padding: 80px 0 60px;
background: linear-gradient(135deg, #0F0525 0%, #1a0b3a 50%, #2A0B45 100%);
color: white;
overflow: hidden;
}
.heroBackground {
position: absolute;
inset: 0;
opacity: 0.1;
}
.heroOrb1 {
position: absolute;
top: -100px;
left: -100px;
width: 300px;
height: 300px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border-radius: 50%;
filter: blur(40px);
animation: float 6s ease-in-out infinite;
}
.heroOrb2 {
position: absolute;
top: 50px;
right: -150px;
width: 250px;
height: 250px;
background: linear-gradient(135deg, #3b82f6 0%, #8b5cf6 100%);
border-radius: 50%;
filter: blur(35px);
animation: float 8s ease-in-out infinite reverse;
}
@keyframes float {
0%, 100% {
transform: translateY(0px);
}
50% {
transform: translateY(-20px);
}
}
.heroContent {
position: relative;
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
text-align: center;
}
.heroTitle {
font-size: 3.5rem;
font-weight: 700;
margin-bottom: 20px;
line-height: 1.2;
color: white;
}
.gradientText {
background: linear-gradient(135deg, #a855f7 0%, #ec4899 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.heroSubtitle {
font-size: 1.25rem;
color: #cbd5e1;
max-width: 600px;
margin: 0 auto 30px;
line-height: 1.6;
}
.serviceStats {
display: flex;
justify-content: center;
gap: 40px;
margin-top: 40px;
}
.statItem {
text-align: center;
}
.statNumber {
font-size: 2rem;
font-weight: 700;
color: #a855f7;
display: block;
}
.statLabel {
font-size: 0.9rem;
color: #94a3b8;
margin-top: 4px;
}
/* Hero Footer */
.heroFooter {
margin-top: 60px;
padding-top: 40px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.heroFooterContent {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 40px;
margin-bottom: 30px;
}
.footerColumn {
text-align: left;
}
.footerColumnTitle {
font-size: 1.1rem;
font-weight: 600;
color: white;
margin-bottom: 16px;
display: flex;
align-items: center;
gap: 8px;
}
.footerColumnIcon {
color: #a855f7;
font-size: 1.2rem;
}
.footerLinks {
list-style: none;
padding: 0;
margin: 0;
}
.footerLink {
margin-bottom: 8px;
}
.footerLink a {
color: #cbd5e1;
text-decoration: none;
font-size: 0.9rem;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 6px;
}
.footerLink a:hover {
color: #a855f7;
transform: translateX(4px);
}
.footerLinkIcon {
font-size: 0.8rem;
transition: all 0.3s ease;
}
.footerBottom {
text-align: center;
padding-top: 30px;
border-top: 1px solid rgba(255, 255, 255, 0.1);
}
.footerBottomText {
color: #94a3b8;
font-size: 0.9rem;
margin-bottom: 20px;
}
.socialLinks {
display: flex;
justify-content: center;
gap: 20px;
margin-bottom: 20px;
}
.socialLink {
width: 40px;
height: 40px;
border-radius: 50%;
background: rgba(255, 255, 255, 0.1);
display: flex;
align-items: center;
justify-content: center;
color: white;
text-decoration: none;
transition: all 0.3s ease;
backdrop-filter: blur(8px);
}
.socialLink:hover {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
transform: translateY(-2px);
color: white;
}
.copyright {
color: #64748b;
font-size: 0.8rem;
}
/* Services Section */
.servicesSection {
padding: 80px 0;
position: relative;
}
.servicesBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, rgba(139, 92, 246, 0.05) 0%, rgba(236, 72, 153, 0.05) 100%);
}
.servicesContainer {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
position: relative;
}
.servicesHeader {
text-align: center;
margin-bottom: 60px;
}
.servicesTitle {
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 16px;
color: #1e293b;
}
.servicesSubtitle {
font-size: 1.1rem;
color: #64748b;
max-width: 600px;
margin: 0 auto;
line-height: 1.6;
}
.servicesGrid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
gap: 30px;
margin-bottom: 60px;
}
/* Service Cards */
.serviceCard {
background: white;
border-radius: 20px;
padding: 40px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
position: relative;
overflow: hidden;
border: none;
}
.serviceCard::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
}
.serviceCard:hover {
transform: translateY(-10px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.15);
}
.serviceIconWrapper {
width: 80px;
height: 80px;
border-radius: 20px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 24px;
transition: all 0.3s ease;
}
.serviceCard:hover .serviceIconWrapper {
transform: scale(1.1);
}
.serviceIcon {
font-size: 32px;
color: white;
}
/* Service Icon Colors */
.iconWebDev {
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
}
.iconBranding {
background: linear-gradient(135deg, #8b5cf6 0%, #7c3aed 100%);
}
.iconEcommerce {
background: linear-gradient(135deg, #10b981 0%, #059669 100%);
}
.iconSEO {
background: linear-gradient(135deg, #f59e0b 0%, #d97706 100%);
}
.iconMobile {
background: linear-gradient(135deg, #ec4899 0%, #db2777 100%);
}
.iconCloud {
background: linear-gradient(135deg, #06b6d4 0%, #0891b2 100%);
}
.iconAI {
background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);
}
.iconConsulting {
background: linear-gradient(135deg, #f97316 0%, #ea580c 100%);
}
.serviceTitle {
font-size: 1.5rem;
font-weight: 700;
color: #1e293b;
margin-bottom: 12px;
line-height: 1.3;
}
.serviceDescription {
color: #64748b;
line-height: 1.6;
margin-bottom: 20px;
font-size: 0.95rem;
}
.serviceFeatures {
list-style: none;
padding: 0;
margin: 0 0 24px 0;
}
.serviceFeature {
display: flex;
align-items: center;
gap: 8px;
color: #64748b;
font-size: 0.9rem;
margin-bottom: 8px;
}
.serviceFeature::before {
content: '✓';
color: #10b981;
font-weight: bold;
font-size: 0.8rem;
}
.learnMoreBtn {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border: none;
color: white;
padding: 12px 24px;
border-radius: 25px;
font-weight: 600;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 8px;
}
.learnMoreBtn:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(139, 92, 246, 0.3);
background: linear-gradient(135deg, #7c3aed 0%, #db2777 100%);
color: white;
}
/* Process Section */
.processSection {
padding: 80px 0;
background: white;
position: relative;
}
.processBackground {
position: absolute;
inset: 0;
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
}
.processContainer {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
position: relative;
}
.processHeader {
text-align: center;
margin-bottom: 60px;
}
.processTitle {
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 16px;
color: #1e293b;
}
.processSubtitle {
font-size: 1.1rem;
color: #64748b;
max-width: 600px;
margin: 0 auto;
line-height: 1.6;
}
.processSteps {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 30px;
margin-top: 40px;
}
.processStep {
text-align: center;
padding: 30px 20px;
background: white;
border-radius: 16px;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.1);
transition: all 0.3s ease;
position: relative;
}
.processStep:hover {
transform: translateY(-5px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.15);
}
.stepNumber {
width: 60px;
height: 60px;
border-radius: 50%;
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 20px;
font-size: 1.5rem;
font-weight: 700;
color: white;
}
.stepTitle {
font-size: 1.25rem;
font-weight: 600;
color: #1e293b;
margin-bottom: 12px;
}
.stepDescription {
color: #64748b;
line-height: 1.6;
font-size: 0.9rem;
}
/* CTA Section */
.ctaSection {
padding: 80px 0;
background: linear-gradient(135deg, #0F0525 0%, #1a0b3a 50%, #2A0B45 100%);
color: white;
text-align: center;
}
.ctaContainer {
max-width: 800px;
margin: 0 auto;
padding: 0 20px;
}
.ctaTitle {
font-size: 2.5rem;
font-weight: 700;
margin-bottom: 20px;
color: white;
}
.ctaSubtitle {
font-size: 1.1rem;
color: #cbd5e1;
margin-bottom: 40px;
line-height: 1.6;
}
.ctaButton {
background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
border: none;
color: white;
padding: 16px 32px;
border-radius: 30px;
font-weight: 600;
font-size: 1.1rem;
transition: all 0.3s ease;
display: inline-flex;
align-items: center;
gap: 8px;
}
.ctaButton:hover {
transform: translateY(-2px);
box-shadow: 0 12px 35px rgba(139, 92, 246, 0.4);
background: linear-gradient(135deg, #7c3aed 0%, #db2777 100%);
color: white;
}
/* Responsive Design */
@media (max-width: 1024px) {
.servicesGrid {
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 25px;
}
.heroTitle {
font-size: 3rem;
}
.processSteps {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
}
}
@media (max-width: 768px) {
.main {
padding-top: 60px;
}
.heroSection {
padding: 60px 0 40px;
}
.heroTitle {
font-size: 2.5rem;
}
.heroSubtitle {
font-size: 1.1rem;
}
.serviceStats {
flex-direction: column;
gap: 20px;
}
.heroFooterContent {
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 30px;
}
.footerColumn {
text-align: center;
}
.socialLinks {
gap: 15px;
}
.servicesSection {
padding: 60px 0;
}
.servicesGrid {
grid-template-columns: 1fr;
gap: 20px;
}
.serviceCard {
padding: 30px 20px;
}
.processSteps {
grid-template-columns: 1fr;
gap: 20px;
}
.ctaTitle {
font-size: 2rem;
}
}
@media (max-width: 480px) {
.heroTitle {
font-size: 2rem;
}
.serviceCard {
padding: 25px 15px;
}
.servicesTitle,
.processTitle {
font-size: 2rem;
}
}

View File

@@ -1,11 +1,560 @@
"use client"; "use client";
import ServicesSection from "../components/Services/Services"; import {
ArrowRightOutlined,
BulbOutlined,
CloudOutlined,
CodeOutlined,
EnvironmentOutlined,
FacebookOutlined,
GlobalOutlined,
InstagramOutlined,
LineChartOutlined,
LinkedinOutlined,
MailOutlined,
MobileOutlined,
PhoneOutlined,
RobotOutlined,
RocketOutlined,
ShoppingOutlined,
TeamOutlined,
TrophyOutlined,
TwitterOutlined,
} from "@ant-design/icons";
import { Button, Card, Typography } from "antd";
import { motion } from "framer-motion";
import React, { useEffect, useState } from "react";
import styles from "./page.module.css";
const { Title, Paragraph, Text } = Typography;
interface Service {
id: string;
title: string;
description: string;
icon: React.ReactNode;
iconClass: string;
features: string[];
preferenceMatches: string[];
}
const allServices: Service[] = [
{
id: "webdev",
title: "Web Development",
description:
"Custom web applications with cutting-edge technologies and responsive design.",
icon: <CodeOutlined />,
iconClass: styles.iconWebDev,
features: [
"React & Next.js",
"Node.js Backend",
"Responsive Design",
"Performance Optimization",
],
preferenceMatches: ["ecommerce", "cloud", "seo"],
},
{
id: "branding",
title: "Branding & Identity",
description:
"Complete brand identity packages including logos, guidelines, and visual systems.",
icon: <RocketOutlined />,
iconClass: styles.iconBranding,
features: [
"Logo Design",
"Brand Guidelines",
"Visual Identity",
"Marketing Materials",
],
preferenceMatches: ["branding", "seo"],
},
{
id: "ecom",
title: "E-commerce Solutions",
description:
"Full-stack e-commerce platforms with secure payment integration and inventory management.",
icon: <ShoppingOutlined />,
iconClass: styles.iconEcommerce,
features: [
"Payment Integration",
"Inventory Management",
"Order Processing",
"Analytics Dashboard",
],
preferenceMatches: ["ecommerce", "branding"],
},
{
id: "seo",
title: "SEO & Marketing",
description:
"Data-driven digital marketing strategies to improve visibility and drive conversions.",
icon: <LineChartOutlined />,
iconClass: styles.iconSEO,
features: [
"Keyword Research",
"Content Strategy",
"Technical SEO",
"Performance Tracking",
],
preferenceMatches: ["seo", "branding"],
},
{
id: "mobile",
title: "Mobile Development",
description:
"Native and cross-platform mobile applications for iOS and Android.",
icon: <MobileOutlined />,
iconClass: styles.iconMobile,
features: [
"iOS Development",
"Android Development",
"Cross-platform",
"App Store Optimization",
],
preferenceMatches: ["mobile", "ai"],
},
{
id: "cloud",
title: "Cloud Solutions",
description:
"Scalable cloud infrastructures, migrations, and DevOps automation.",
icon: <CloudOutlined />,
iconClass: styles.iconCloud,
features: [
"AWS/Azure/GCP",
"Infrastructure Setup",
"DevOps Automation",
"Scalability",
],
preferenceMatches: ["cloud", "ai"],
},
{
id: "ai",
title: "AI & Machine Learning",
description:
"Custom AI solutions for automation, prediction, and data analysis.",
icon: <RobotOutlined />,
iconClass: styles.iconAI,
features: [
"Custom AI Models",
"Data Analysis",
"Process Automation",
"Predictive Analytics",
],
preferenceMatches: ["ai", "cloud"],
},
{
id: "consulting",
title: "Global IT Consulting",
description:
"Strategic technology consulting to drive digital transformation and innovation.",
icon: <GlobalOutlined />,
iconClass: styles.iconConsulting,
features: [
"Technology Strategy",
"Digital Transformation",
"Project Management",
"Team Training",
],
preferenceMatches: ["cloud", "branding", "seo"],
},
];
const processSteps = [
{
number: "01",
title: "Discovery & Planning",
description:
"We analyze your requirements and create a comprehensive project plan tailored to your goals.",
},
{
number: "02",
title: "Design & Development",
description:
"Our expert team builds your solution using the latest technologies and best practices.",
},
{
number: "03",
title: "Testing & Quality",
description:
"Rigorous testing ensures your solution is robust, secure, and performs flawlessly.",
},
{
number: "04",
title: "Launch & Support",
description:
"We deploy your solution and provide ongoing support to ensure continued success.",
},
];
export default function ServicesPage() { export default function ServicesPage() {
const [services, setServices] = useState<Service[]>([]);
useEffect(() => {
// Sort services based on user preferences (empty for now)
setServices(allServices);
}, []);
const containerVariants = {
hidden: { opacity: 0 },
visible: {
opacity: 1,
transition: {
staggerChildren: 0.1,
},
},
};
const itemVariants = {
hidden: { y: 50, opacity: 0 },
visible: {
y: 0,
opacity: 1,
transition: { duration: 0.5 },
},
};
return ( return (
<main className="pt-20"> <main className={styles.main}>
<ServicesSection userPreferences={[]} /> {/* Hero Section */}
<section className={styles.heroSection}>
<div className={styles.heroBackground}>
<div className={styles.heroOrb1}></div>
<div className={styles.heroOrb2}></div>
</div>
<div className={styles.heroContent}>
<motion.div
initial={{ opacity: 0, y: 30 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
>
<Title level={1} className={styles.heroTitle}>
Our <span className={styles.gradientText}>Services</span>
</Title>
<Paragraph className={styles.heroSubtitle}>
Innovative technology solutions customized for your business
needs. From web development to AI solutions, we deliver excellence
in every project.
</Paragraph>
<div className={styles.serviceStats}>
<div className={styles.statItem}>
<span className={styles.statNumber}>50+</span>
<span className={styles.statLabel}>Projects Completed</span>
</div>
<div className={styles.statItem}>
<span className={styles.statNumber}>8</span>
<span className={styles.statLabel}>Service Categories</span>
</div>
<div className={styles.statItem}>
<span className={styles.statNumber}>100%</span>
<span className={styles.statLabel}>Client Satisfaction</span>
</div>
</div>
</motion.div>
</div>
{/* Hero Footer */}
<motion.div
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8, delay: 0.4 }}
className={styles.heroFooter}
>
<div className={styles.heroFooterContent}>
<div className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<TeamOutlined className={styles.footerColumnIcon} />
Company
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="/about">
<ArrowRightOutlined className={styles.footerLinkIcon} />
About Us
</a>
</li>
<li className={styles.footerLink}>
<a href="/services">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Our Services
</a>
</li>
<li className={styles.footerLink}>
<a href="/projects">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Portfolio
</a>
</li>
<li className={styles.footerLink}>
<a href="/contact">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Contact Us
</a>
</li>
</ul>
</div>
<div className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<BulbOutlined className={styles.footerColumnIcon} />
Services
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="/services#webdev">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Web Development
</a>
</li>
<li className={styles.footerLink}>
<a href="/services#mobile">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Mobile Apps
</a>
</li>
<li className={styles.footerLink}>
<a href="/services#ai">
<ArrowRightOutlined className={styles.footerLinkIcon} />
AI Solutions
</a>
</li>
<li className={styles.footerLink}>
<a href="/services#cloud">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Cloud Services
</a>
</li>
</ul>
</div>
<div className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<TrophyOutlined className={styles.footerColumnIcon} />
Resources
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="/blog">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Blog & Insights
</a>
</li>
<li className={styles.footerLink}>
<a href="/case-studies">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Case Studies
</a>
</li>
<li className={styles.footerLink}>
<a href="/whitepapers">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Whitepapers
</a>
</li>
<li className={styles.footerLink}>
<a href="/webinars">
<ArrowRightOutlined className={styles.footerLinkIcon} />
Webinars
</a>
</li>
</ul>
</div>
<div className={styles.footerColumn}>
<div className={styles.footerColumnTitle}>
<MailOutlined className={styles.footerColumnIcon} />
Contact Info
</div>
<ul className={styles.footerLinks}>
<li className={styles.footerLink}>
<a href="mailto:info@techmaster.com">
<MailOutlined className={styles.footerLinkIcon} />
info@techmaster.com
</a>
</li>
<li className={styles.footerLink}>
<a href="tel:+15551234567">
<PhoneOutlined className={styles.footerLinkIcon} />
+1 (555) 123-4567
</a>
</li>
<li className={styles.footerLink}>
<a href="#">
<EnvironmentOutlined className={styles.footerLinkIcon} />
San Francisco, CA
</a>
</li>
<li className={styles.footerLink}>
<a href="/support">
<ArrowRightOutlined className={styles.footerLinkIcon} />
24/7 Support
</a>
</li>
</ul>
</div>
</div>
<div className={styles.footerBottom}>
<Paragraph className={styles.footerBottomText}>
Ready to transform your business? Let's discuss your next project.
</Paragraph>
<div className={styles.socialLinks}>
<a href="#" className={styles.socialLink}>
<FacebookOutlined />
</a>
<a href="#" className={styles.socialLink}>
<TwitterOutlined />
</a>
<a href="#" className={styles.socialLink}>
<LinkedinOutlined />
</a>
<a href="#" className={styles.socialLink}>
<InstagramOutlined />
</a>
</div>
<div className={styles.copyright}>
© 2024 Tech Master. All rights reserved. | Privacy Policy | Terms
of Service
</div>
</div>
</motion.div>
</section>
{/* Services Section */}
<section className={styles.servicesSection}>
<div className={styles.servicesBackground}></div>
<div className={styles.servicesContainer}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
viewport={{ once: true }}
className={styles.servicesHeader}
>
<Title level={2} className={styles.servicesTitle}>
What We <span className={styles.gradientText}>Offer</span>
</Title>
<Paragraph className={styles.servicesSubtitle}>
Comprehensive technology solutions designed to drive your business
forward. Each service is crafted with precision and delivered with
excellence.
</Paragraph>
</motion.div>
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className={styles.servicesGrid}
>
{services.map((service) => (
<motion.div key={service.id} variants={itemVariants}>
<Card className={styles.serviceCard}>
<div
className={`${styles.serviceIconWrapper} ${service.iconClass}`}
>
{service.icon}
</div>
<Title level={3} className={styles.serviceTitle}>
{service.title}
</Title>
<Paragraph className={styles.serviceDescription}>
{service.description}
</Paragraph>
<ul className={styles.serviceFeatures}>
{service.features.map((feature, index) => (
<li key={index} className={styles.serviceFeature}>
{feature}
</li>
))}
</ul>
<Button type="link" className={styles.learnMoreBtn}>
Learn More <ArrowRightOutlined />
</Button>
</Card>
</motion.div>
))}
</motion.div>
</div>
</section>
{/* Process Section */}
<section className={styles.processSection}>
<div className={styles.processBackground}></div>
<div className={styles.processContainer}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
viewport={{ once: true }}
className={styles.processHeader}
>
<Title level={2} className={styles.processTitle}>
Our <span className={styles.gradientText}>Process</span>
</Title>
<Paragraph className={styles.processSubtitle}>
A proven methodology that ensures successful project delivery and
exceeds expectations.
</Paragraph>
</motion.div>
<motion.div
variants={containerVariants}
initial="hidden"
whileInView="visible"
viewport={{ once: true }}
className={styles.processSteps}
>
{processSteps.map((step, index) => (
<motion.div key={index} variants={itemVariants}>
<div className={styles.processStep}>
<div className={styles.stepNumber}>{step.number}</div>
<Title level={4} className={styles.stepTitle}>
{step.title}
</Title>
<Paragraph className={styles.stepDescription}>
{step.description}
</Paragraph>
</div>
</motion.div>
))}
</motion.div>
</div>
</section>
{/* CTA Section */}
<section className={styles.ctaSection}>
<div className={styles.ctaContainer}>
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ duration: 0.8 }}
viewport={{ once: true }}
>
<Title level={2} className={styles.ctaTitle}>
Ready to Start Your{" "}
<span className={styles.gradientText}>Project</span>?
</Title>
<Paragraph className={styles.ctaSubtitle}>
Let's discuss how we can help bring your vision to life. Our team
is ready to create something amazing together.
</Paragraph>
<Button size="large" className={styles.ctaButton}>
Get Started Today <ArrowRightOutlined />
</Button>
</motion.div>
</div>
</section>
</main> </main>
); );
} }