Merge version_11 into main
Merge version_11 into main
This commit was merged in pull request #10.
This commit is contained in:
@@ -162,4 +162,4 @@ export default function BlogPage() {
|
|||||||
</ReactLenis>
|
</ReactLenis>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,8 +7,7 @@ const manrope = Manrope({
|
|||||||
});
|
});
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: "FitPro Toronto - Personal Training", description: "Professional personal training in Toronto tailored to your unique goals."
|
title: "FitPro Toronto - Personal Training", description: "Professional personal training in Toronto tailored to your unique goals."};
|
||||||
};
|
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
children,
|
children,
|
||||||
@@ -1238,4 +1237,4 @@ export default function RootLayout({
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,11 +11,12 @@ import TestimonialCardFifteen from '@/components/sections/testimonial/Testimonia
|
|||||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||||
import ContactFaq from '@/components/sections/contact/ContactFaq';
|
import ContactFaq from '@/components/sections/contact/ContactFaq';
|
||||||
import FooterMedia from '@/components/sections/footer/FooterMedia';
|
import FooterMedia from '@/components/sections/footer/FooterMedia';
|
||||||
import { Award, Dumbbell, Phone, Trophy, Zap } from "lucide-react";
|
import { Award, Dumbbell, Phone, Trophy, Zap, Clock } from "lucide-react";
|
||||||
import { useEffect, useRef } from "react";
|
import { useEffect, useRef, useState } from "react";
|
||||||
|
|
||||||
export default function LandingPage() {
|
export default function LandingPage() {
|
||||||
const brandListRef = useRef<HTMLDivElement>(null);
|
const brandListRef = useRef<HTMLDivElement>(null);
|
||||||
|
const [timeLeft, setTimeLeft] = useState<string>("5:00");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!brandListRef.current) return;
|
if (!brandListRef.current) return;
|
||||||
@@ -44,6 +45,25 @@ export default function LandingPage() {
|
|||||||
animateScroll();
|
animateScroll();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const startTime = Date.now();
|
||||||
|
const durationMs = 5 * 60 * 1000; // 5 minutes
|
||||||
|
|
||||||
|
const updateTimer = () => {
|
||||||
|
const elapsed = Date.now() - startTime;
|
||||||
|
const remaining = Math.max(0, durationMs - elapsed);
|
||||||
|
const minutes = Math.floor(remaining / 60000);
|
||||||
|
const seconds = Math.floor((remaining % 60000) / 1000);
|
||||||
|
setTimeLeft(`${minutes}:${seconds.toString().padStart(2, '0')}`);
|
||||||
|
|
||||||
|
if (remaining > 0) {
|
||||||
|
requestAnimationFrame(updateTimer);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
updateTimer();
|
||||||
|
}, []);
|
||||||
|
|
||||||
const brands = [
|
const brands = [
|
||||||
"Gold's Gym Partners", "Fitness Canada Certified", "NASM Certified", "ACE Certified", "ISSA Certified", "IIFYM Certified", "PN Level 1 Certified", "TRX Certified", "CrossFit Level 1", "NCCPT Certified"
|
"Gold's Gym Partners", "Fitness Canada Certified", "NASM Certified", "ACE Certified", "ISSA Certified", "IIFYM Certified", "PN Level 1 Certified", "TRX Certified", "CrossFit Level 1", "NCCPT Certified"
|
||||||
];
|
];
|
||||||
@@ -226,6 +246,34 @@ export default function LandingPage() {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<style jsx>{`
|
||||||
|
@keyframes countdown-pulse {
|
||||||
|
0%, 100% { opacity: 1; }
|
||||||
|
50% { opacity: 0.7; }
|
||||||
|
}
|
||||||
|
.limited-offer-tag {
|
||||||
|
position: absolute;
|
||||||
|
top: 12px;
|
||||||
|
right: 12px;
|
||||||
|
background: linear-gradient(135deg, #ff3d4a 0%, #e63946 100%);
|
||||||
|
color: white;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border-radius: 6px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 600;
|
||||||
|
z-index: 10;
|
||||||
|
animation: countdown-pulse 1s ease-in-out infinite;
|
||||||
|
box-shadow: 0 4px 12px rgba(230, 57, 70, 0.4);
|
||||||
|
}
|
||||||
|
.timer-text {
|
||||||
|
font-family: 'Courier New', monospace;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
}
|
||||||
|
`}</style>
|
||||||
|
|
||||||
<div id="testimonials" data-section="testimonials">
|
<div id="testimonials" data-section="testimonials">
|
||||||
<TestimonialCardFifteen
|
<TestimonialCardFifteen
|
||||||
testimonial="Working with this trainer completely changed my life. I went from zero fitness experience to running a 5K and feeling stronger than ever. The personalized approach and constant encouragement made all the difference."
|
testimonial="Working with this trainer completely changed my life. I went from zero fitness experience to running a 5K and feeling stronger than ever. The personalized approach and constant encouragement made all the difference."
|
||||||
@@ -342,4 +390,4 @@ export default function LandingPage() {
|
|||||||
</div>
|
</div>
|
||||||
</ThemeProvider>
|
</ThemeProvider>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user