main: enhance scroll styles and add CTA section
This commit is contained in:
@@ -615,3 +615,77 @@
|
|||||||
height: 8px;
|
height: 8px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* CTA Section */
|
||||||
|
.ctaSection {
|
||||||
|
padding: 100px 0;
|
||||||
|
background: linear-gradient(135deg, #0F0525 0%, #2A0B45 100%);
|
||||||
|
text-align: center;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaSection::before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="dots-cta" width="20" height="20" patternUnits="userSpaceOnUse"><circle cx="10" cy="10" r="1.5" fill="rgba(116, 0, 184, 0.3)"/></pattern></defs><rect width="100" height="100" fill="url(%23dots-cta)"/></svg>');
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaContent {
|
||||||
|
position: relative;
|
||||||
|
z-index: 10;
|
||||||
|
max-width: 800px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaTitle {
|
||||||
|
font-size: 3rem !important;
|
||||||
|
font-weight: 700 !important;
|
||||||
|
color: white !important;
|
||||||
|
margin-bottom: 24px !important;
|
||||||
|
line-height: 1.2 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaDescription {
|
||||||
|
font-size: 1.25rem !important;
|
||||||
|
color: rgba(255, 255, 255, 0.9) !important;
|
||||||
|
margin-bottom: 40px !important;
|
||||||
|
line-height: 1.6 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaButton {
|
||||||
|
height: auto !important;
|
||||||
|
padding: 12px 40px !important;
|
||||||
|
font-size: 1.1rem !important;
|
||||||
|
font-weight: 600 !important;
|
||||||
|
border-radius: 50px !important;
|
||||||
|
background: white !important;
|
||||||
|
color: #7400b8 !important;
|
||||||
|
border: none !important;
|
||||||
|
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaButton:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.ctaSection {
|
||||||
|
padding: 80px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaTitle {
|
||||||
|
font-size: 2.2rem !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ctaDescription {
|
||||||
|
font-size: 1.1rem !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
354
src/app/page.tsx
354
src/app/page.tsx
@@ -2,6 +2,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
ArrowRightOutlined,
|
||||||
BulbOutlined,
|
BulbOutlined,
|
||||||
ClockCircleOutlined,
|
ClockCircleOutlined,
|
||||||
CodeOutlined,
|
CodeOutlined,
|
||||||
@@ -10,7 +11,8 @@ import {
|
|||||||
StarOutlined,
|
StarOutlined,
|
||||||
TeamOutlined,
|
TeamOutlined,
|
||||||
} from "@ant-design/icons";
|
} from "@ant-design/icons";
|
||||||
import { Card, Col, Row, Statistic, Typography } from "antd";
|
import { Button, Card, Col, Row, Statistic, Typography } from "antd";
|
||||||
|
import { motion, useScroll, useSpring } from "framer-motion";
|
||||||
import { useEffect, useState } from "react";
|
import { useEffect, useState } from "react";
|
||||||
import Footer from "./components/Footer/Footer";
|
import Footer from "./components/Footer/Footer";
|
||||||
import HeroSection from "./components/Hero/HeroSection";
|
import HeroSection from "./components/Hero/HeroSection";
|
||||||
@@ -28,6 +30,13 @@ export default function Home() {
|
|||||||
const [showPreferences, setShowPreferences] = useState(true);
|
const [showPreferences, setShowPreferences] = useState(true);
|
||||||
const [loading, setLoading] = useState(true);
|
const [loading, setLoading] = useState(true);
|
||||||
|
|
||||||
|
const { scrollYProgress } = useScroll();
|
||||||
|
const scaleX = useSpring(scrollYProgress, {
|
||||||
|
stiffness: 100,
|
||||||
|
damping: 30,
|
||||||
|
restDelta: 0.001,
|
||||||
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
// Reading localStorage can only happen on the client; do it after mount.
|
// Reading localStorage can only happen on the client; do it after mount.
|
||||||
try {
|
try {
|
||||||
@@ -58,6 +67,21 @@ export default function Home() {
|
|||||||
setShowPreferences(false);
|
setShowPreferences(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const fadeInUp = {
|
||||||
|
hidden: { opacity: 0, y: 60 },
|
||||||
|
visible: { opacity: 1, y: 0, transition: { duration: 0.6 } },
|
||||||
|
};
|
||||||
|
|
||||||
|
const staggerContainer = {
|
||||||
|
hidden: { opacity: 0 },
|
||||||
|
visible: {
|
||||||
|
opacity: 1,
|
||||||
|
transition: {
|
||||||
|
staggerChildren: 0.2,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
if (loading) {
|
if (loading) {
|
||||||
return (
|
return (
|
||||||
<div className={styles.loaderContainer}>
|
<div className={styles.loaderContainer}>
|
||||||
@@ -101,6 +125,21 @@ export default function Home() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
<motion.div
|
||||||
|
className="progress-bar"
|
||||||
|
style={{
|
||||||
|
scaleX,
|
||||||
|
position: "fixed",
|
||||||
|
top: 0,
|
||||||
|
left: 0,
|
||||||
|
right: 0,
|
||||||
|
height: "5px",
|
||||||
|
background: "linear-gradient(90deg, #7400b8, #56cfe1)",
|
||||||
|
transformOrigin: "0%",
|
||||||
|
zIndex: 1000,
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
|
||||||
{showPreferences && (
|
{showPreferences && (
|
||||||
<PreferencesSelector onComplete={handlePreferencesComplete} />
|
<PreferencesSelector onComplete={handlePreferencesComplete} />
|
||||||
)}
|
)}
|
||||||
@@ -113,7 +152,13 @@ export default function Home() {
|
|||||||
{/* Services Section */}
|
{/* Services Section */}
|
||||||
<section id="services" className={styles.servicesSection}>
|
<section id="services" className={styles.servicesSection}>
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<div className={styles.sectionHeader}>
|
<motion.div
|
||||||
|
initial="hidden"
|
||||||
|
whileInView="visible"
|
||||||
|
viewport={{ once: true }}
|
||||||
|
variants={fadeInUp}
|
||||||
|
className={styles.sectionHeader}
|
||||||
|
>
|
||||||
<Title level={2} className={styles.sectionTitle}>
|
<Title level={2} className={styles.sectionTitle}>
|
||||||
Our Services
|
Our Services
|
||||||
</Title>
|
</Title>
|
||||||
@@ -121,79 +166,99 @@ export default function Home() {
|
|||||||
We offer comprehensive solutions to transform your digital
|
We offer comprehensive solutions to transform your digital
|
||||||
presence and drive business growth
|
presence and drive business growth
|
||||||
</Paragraph>
|
</Paragraph>
|
||||||
</div>
|
</motion.div>
|
||||||
|
|
||||||
<Row gutter={[32, 32]} className={styles.servicesGrid}>
|
<motion.div
|
||||||
<Col xs={24} sm={12} lg={8}>
|
initial="hidden"
|
||||||
<Card className={styles.serviceCard} hoverable>
|
whileInView="visible"
|
||||||
<div className={styles.serviceIcon}>
|
viewport={{ once: true }}
|
||||||
<CodeOutlined />
|
variants={staggerContainer}
|
||||||
</div>
|
>
|
||||||
<Title level={4} className={styles.serviceTitle}>
|
<Row gutter={[32, 32]} className={styles.servicesGrid}>
|
||||||
Web Development
|
<Col xs={24} sm={12} lg={8}>
|
||||||
</Title>
|
<motion.div variants={fadeInUp} style={{ height: "100%" }}>
|
||||||
<Paragraph className={styles.serviceDescription}>
|
<Card className={styles.serviceCard} hoverable>
|
||||||
Custom web applications built with modern technologies and
|
<div className={styles.serviceIcon}>
|
||||||
best practices for optimal performance and user experience.
|
<CodeOutlined />
|
||||||
</Paragraph>
|
</div>
|
||||||
<ul className={styles.serviceFeatures}>
|
<Title level={4} className={styles.serviceTitle}>
|
||||||
<li>Responsive Design</li>
|
Web Development
|
||||||
<li>SEO Optimization</li>
|
</Title>
|
||||||
<li>Performance Tuning</li>
|
<Paragraph className={styles.serviceDescription}>
|
||||||
<li>Security Implementation</li>
|
Custom web applications built with modern technologies
|
||||||
</ul>
|
and best practices for optimal performance and user
|
||||||
</Card>
|
experience.
|
||||||
</Col>
|
</Paragraph>
|
||||||
|
<ul className={styles.serviceFeatures}>
|
||||||
|
<li>Responsive Design</li>
|
||||||
|
<li>SEO Optimization</li>
|
||||||
|
<li>Performance Tuning</li>
|
||||||
|
<li>Security Implementation</li>
|
||||||
|
</ul>
|
||||||
|
</Card>
|
||||||
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
|
||||||
<Col xs={24} sm={12} lg={8}>
|
<Col xs={24} sm={12} lg={8}>
|
||||||
<Card className={styles.serviceCard} hoverable>
|
<motion.div variants={fadeInUp} style={{ height: "100%" }}>
|
||||||
<div className={styles.serviceIcon}>
|
<Card className={styles.serviceCard} hoverable>
|
||||||
<RocketOutlined />
|
<div className={styles.serviceIcon}>
|
||||||
</div>
|
<RocketOutlined />
|
||||||
<Title level={4} className={styles.serviceTitle}>
|
</div>
|
||||||
Mobile Development
|
<Title level={4} className={styles.serviceTitle}>
|
||||||
</Title>
|
Mobile Development
|
||||||
<Paragraph className={styles.serviceDescription}>
|
</Title>
|
||||||
Native and cross-platform mobile applications that deliver
|
<Paragraph className={styles.serviceDescription}>
|
||||||
exceptional user experiences across all devices.
|
Native and cross-platform mobile applications that
|
||||||
</Paragraph>
|
deliver exceptional user experiences across all devices.
|
||||||
<ul className={styles.serviceFeatures}>
|
</Paragraph>
|
||||||
<li>iOS & Android Apps</li>
|
<ul className={styles.serviceFeatures}>
|
||||||
<li>Cross-platform Solutions</li>
|
<li>iOS & Android Apps</li>
|
||||||
<li>App Store Optimization</li>
|
<li>Cross-platform Solutions</li>
|
||||||
<li>Push Notifications</li>
|
<li>App Store Optimization</li>
|
||||||
</ul>
|
<li>Push Notifications</li>
|
||||||
</Card>
|
</ul>
|
||||||
</Col>
|
</Card>
|
||||||
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
|
||||||
<Col xs={24} sm={12} lg={8}>
|
<Col xs={24} sm={12} lg={8}>
|
||||||
<Card className={styles.serviceCard} hoverable>
|
<motion.div variants={fadeInUp} style={{ height: "100%" }}>
|
||||||
<div className={styles.serviceIcon}>
|
<Card className={styles.serviceCard} hoverable>
|
||||||
<BulbOutlined />
|
<div className={styles.serviceIcon}>
|
||||||
</div>
|
<BulbOutlined />
|
||||||
<Title level={4} className={styles.serviceTitle}>
|
</div>
|
||||||
UI/UX Design
|
<Title level={4} className={styles.serviceTitle}>
|
||||||
</Title>
|
UI/UX Design
|
||||||
<Paragraph className={styles.serviceDescription}>
|
</Title>
|
||||||
User-centered design solutions that create intuitive,
|
<Paragraph className={styles.serviceDescription}>
|
||||||
engaging, and conversion-focused digital experiences.
|
User-centered design solutions that create intuitive,
|
||||||
</Paragraph>
|
engaging, and conversion-focused digital experiences.
|
||||||
<ul className={styles.serviceFeatures}>
|
</Paragraph>
|
||||||
<li>User Research</li>
|
<ul className={styles.serviceFeatures}>
|
||||||
<li>Wireframing & Prototyping</li>
|
<li>User Research</li>
|
||||||
<li>Visual Design</li>
|
<li>Wireframing & Prototyping</li>
|
||||||
<li>Usability Testing</li>
|
<li>Visual Design</li>
|
||||||
</ul>
|
<li>Usability Testing</li>
|
||||||
</Card>
|
</ul>
|
||||||
</Col>
|
</Card>
|
||||||
</Row>
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
{/* Statistics Section */}
|
{/* Statistics Section */}
|
||||||
<section id="statistics" className={styles.statisticsSection}>
|
<section id="statistics" className={styles.statisticsSection}>
|
||||||
<div className={styles.container}>
|
<div className={styles.container}>
|
||||||
<div className={styles.sectionHeader}>
|
<motion.div
|
||||||
|
initial="hidden"
|
||||||
|
whileInView="visible"
|
||||||
|
viewport={{ once: true }}
|
||||||
|
variants={fadeInUp}
|
||||||
|
className={styles.sectionHeader}
|
||||||
|
>
|
||||||
<Title level={2} className={styles.sectionTitle}>
|
<Title level={2} className={styles.sectionTitle}>
|
||||||
Our Impact
|
Our Impact
|
||||||
</Title>
|
</Title>
|
||||||
@@ -201,66 +266,81 @@ export default function Home() {
|
|||||||
Numbers that speak for themselves - our commitment to excellence
|
Numbers that speak for themselves - our commitment to excellence
|
||||||
in every project
|
in every project
|
||||||
</Paragraph>
|
</Paragraph>
|
||||||
</div>
|
</motion.div>
|
||||||
|
|
||||||
<Row gutter={[48, 32]} className={styles.statsGrid}>
|
<motion.div
|
||||||
<Col xs={12} sm={6}>
|
initial="hidden"
|
||||||
<div className={styles.statCard}>
|
whileInView="visible"
|
||||||
<div className={styles.statIcon}>
|
viewport={{ once: true }}
|
||||||
<ProjectOutlined />
|
variants={staggerContainer}
|
||||||
</div>
|
>
|
||||||
<Statistic
|
<Row gutter={[48, 32]} className={styles.statsGrid}>
|
||||||
title="Projects Completed"
|
<Col xs={12} sm={6}>
|
||||||
value={150}
|
<motion.div variants={fadeInUp}>
|
||||||
suffix="+"
|
<div className={styles.statCard}>
|
||||||
className={styles.statistic}
|
<div className={styles.statIcon}>
|
||||||
/>
|
<ProjectOutlined />
|
||||||
</div>
|
</div>
|
||||||
</Col>
|
<Statistic
|
||||||
|
title="Projects Completed"
|
||||||
|
value={150}
|
||||||
|
suffix="+"
|
||||||
|
className={styles.statistic}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
|
||||||
<Col xs={12} sm={6}>
|
<Col xs={12} sm={6}>
|
||||||
<div className={styles.statCard}>
|
<motion.div variants={fadeInUp}>
|
||||||
<div className={styles.statIcon}>
|
<div className={styles.statCard}>
|
||||||
<TeamOutlined />
|
<div className={styles.statIcon}>
|
||||||
</div>
|
<TeamOutlined />
|
||||||
<Statistic
|
</div>
|
||||||
title="Happy Clients"
|
<Statistic
|
||||||
value={80}
|
title="Happy Clients"
|
||||||
suffix="+"
|
value={80}
|
||||||
className={styles.statistic}
|
suffix="+"
|
||||||
/>
|
className={styles.statistic}
|
||||||
</div>
|
/>
|
||||||
</Col>
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
|
||||||
<Col xs={12} sm={6}>
|
<Col xs={12} sm={6}>
|
||||||
<div className={styles.statCard}>
|
<motion.div variants={fadeInUp}>
|
||||||
<div className={styles.statIcon}>
|
<div className={styles.statCard}>
|
||||||
<StarOutlined />
|
<div className={styles.statIcon}>
|
||||||
</div>
|
<StarOutlined />
|
||||||
<Statistic
|
</div>
|
||||||
title="Average Rating"
|
<Statistic
|
||||||
value={4.9}
|
title="Average Rating"
|
||||||
suffix="/5"
|
value={4.9}
|
||||||
precision={1}
|
suffix="/5"
|
||||||
className={styles.statistic}
|
precision={1}
|
||||||
/>
|
className={styles.statistic}
|
||||||
</div>
|
/>
|
||||||
</Col>
|
</div>
|
||||||
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
|
||||||
<Col xs={12} sm={6}>
|
<Col xs={12} sm={6}>
|
||||||
<div className={styles.statCard}>
|
<motion.div variants={fadeInUp}>
|
||||||
<div className={styles.statIcon}>
|
<div className={styles.statCard}>
|
||||||
<ClockCircleOutlined />
|
<div className={styles.statIcon}>
|
||||||
</div>
|
<ClockCircleOutlined />
|
||||||
<Statistic
|
</div>
|
||||||
title="Years Experience"
|
<Statistic
|
||||||
value={8}
|
title="Years Experience"
|
||||||
suffix="+"
|
value={8}
|
||||||
className={styles.statistic}
|
suffix="+"
|
||||||
/>
|
className={styles.statistic}
|
||||||
</div>
|
/>
|
||||||
</Col>
|
</div>
|
||||||
</Row>
|
</motion.div>
|
||||||
|
</Col>
|
||||||
|
</Row>
|
||||||
|
</motion.div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
@@ -271,6 +351,36 @@ export default function Home() {
|
|||||||
<section id="testimonials">
|
<section id="testimonials">
|
||||||
<TestimonialsSection />
|
<TestimonialsSection />
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
{/* CTA Section */}
|
||||||
|
<section className={styles.ctaSection}>
|
||||||
|
<div className={styles.container}>
|
||||||
|
<motion.div
|
||||||
|
initial="hidden"
|
||||||
|
whileInView="visible"
|
||||||
|
viewport={{ once: true }}
|
||||||
|
variants={fadeInUp}
|
||||||
|
className={styles.ctaContent}
|
||||||
|
>
|
||||||
|
<Title className={styles.ctaTitle}>
|
||||||
|
Ready to Transform Your Digital Presence?
|
||||||
|
</Title>
|
||||||
|
<Paragraph className={styles.ctaDescription}>
|
||||||
|
Let's collaborate to build something amazing. Our team is
|
||||||
|
ready to turn your vision into reality.
|
||||||
|
</Paragraph>
|
||||||
|
<Button
|
||||||
|
type="primary"
|
||||||
|
size="large"
|
||||||
|
icon={<ArrowRightOutlined />}
|
||||||
|
className={styles.ctaButton}
|
||||||
|
href="#contact"
|
||||||
|
>
|
||||||
|
Start Your Journey
|
||||||
|
</Button>
|
||||||
|
</motion.div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
</main>
|
</main>
|
||||||
|
|
||||||
<Footer />
|
<Footer />
|
||||||
|
|||||||
Reference in New Issue
Block a user