Compare commits
14 Commits
version_3_
...
version_10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36661602df | ||
| f1324c3acc | |||
|
|
307f8aae69 | ||
| 103f1ac138 | |||
|
|
1808eaeb59 | ||
| 0a555cebf0 | |||
|
|
1bd975b83a | ||
| 070498676d | |||
|
|
0adc67b76d | ||
| bc5393893b | |||
|
|
b0069a702f | ||
| 3c3c30edec | |||
|
|
a8915a2817 | ||
| 3aa9469b5d |
@@ -13,6 +13,12 @@ import TestimonialsSection from './HomePage/sections/Testimonials';
|
|||||||
import ContactSection from './HomePage/sections/Contact';
|
import ContactSection from './HomePage/sections/Contact';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{/* webild-stub @2026-06-03T15:01:45.386Z: Increase the spacing from the side of each element on the hero section like the rest of the site */}
|
||||||
|
|
||||||
|
{/* webild-stub @2026-06-03T14:38:48.425Z: Fix the spacing and buttons on the first section. */}
|
||||||
|
|
||||||
{/* webild-stub @2026-06-03T14:26:17.945Z: Make the hero section smoothly switch between 4 images, with a loading animation in between each image transition. */}
|
{/* webild-stub @2026-06-03T14:26:17.945Z: Make the hero section smoothly switch between 4 images, with a loading animation in between each image transition. */}
|
||||||
|
|
||||||
export default function HomePage(): React.JSX.Element {
|
export default function HomePage(): React.JSX.Element {
|
||||||
|
|||||||
@@ -4,19 +4,47 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
|
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
|
||||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||||
|
import Tag from "@/components/ui/Tag";
|
||||||
|
import Button from "@/components/ui/Button";
|
||||||
|
|
||||||
export default function AboutSection(): React.JSX.Element {
|
export default function AboutSection(): React.JSX.Element {
|
||||||
return (
|
return (
|
||||||
<div id="about" data-section="about">
|
<div id="about" data-webild-section="about" className="py-24 bg-background">
|
||||||
<SectionErrorBoundary name="about">
|
<SectionErrorBoundary name="about">
|
||||||
<AboutTestimonial
|
<div className="container mx-auto px-4 sm:px-6 lg:px-8">
|
||||||
tag="About Us"
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
|
||||||
quote="Our mission is to empower businesses with innovative marketing solutions that connect, engage, and convert. We believe in transparent partnerships and sustainable growth."
|
<div>
|
||||||
author="Jane Doe"
|
<Tag text="About Us" className="mb-6" />
|
||||||
role="Founder & CEO, Innovate Marketing"
|
<h2 className="text-4xl font-bold tracking-tight text-foreground sm:text-5xl mb-6">
|
||||||
imageSrc="http://img.b2bpic.net/free-photo/joyful-business-woman-with-coffee-cup_23-2148095746.jpg"
|
We are a team of passionate marketers.
|
||||||
/>
|
</h2>
|
||||||
</SectionErrorBoundary>
|
<p className="text-lg text-muted-foreground mb-8">
|
||||||
</div>
|
Our mission is to empower businesses with innovative marketing solutions that connect, engage, and convert. We believe in transparent partnerships and sustainable growth.
|
||||||
|
</p>
|
||||||
|
<div className="flex gap-4">
|
||||||
|
<Button text="Learn More" variant="primary" />
|
||||||
|
<Button text="Meet the Team" variant="secondary" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="relative h-[500px] rounded-2xl overflow-hidden">
|
||||||
|
<img
|
||||||
|
src="https://images.unsplash.com/photo-1522071820081-009f0129c71c?auto=format&fit=crop&q=80"
|
||||||
|
alt="Team working"
|
||||||
|
className="absolute inset-0 w-full h-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div className="hidden">
|
||||||
|
<AboutTestimonial
|
||||||
|
tag="About Us"
|
||||||
|
quote="Our mission is to empower businesses with innovative marketing solutions that connect, engage, and convert. We believe in transparent partnerships and sustainable growth."
|
||||||
|
author="Jane Doe"
|
||||||
|
role="Founder & CEO, Innovate Marketing"
|
||||||
|
imageSrc="http://img.b2bpic.net/free-photo/joyful-business-woman-with-coffee-cup_23-2148095746.jpg"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</SectionErrorBoundary>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import HeroBillboardBrand from '@/components/sections/hero/HeroBillboardBrand';
|
import HeroBillboardBrand from '@/components/sections/hero/HeroBillboardBrand';
|
||||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||||
|
import Button from "@/components/ui/Button";
|
||||||
|
|
||||||
const IMAGES = [
|
const IMAGES = [
|
||||||
"http://img.b2bpic.net/free-photo/group-friends-planning-trip-cafe_23-2148952344.jpg",
|
"http://img.b2bpic.net/free-photo/group-friends-planning-trip-cafe_23-2148952344.jpg",
|
||||||
@@ -16,53 +17,85 @@ const IMAGES = [
|
|||||||
|
|
||||||
export default function HeroSection(): React.JSX.Element {
|
export default function HeroSection(): React.JSX.Element {
|
||||||
const [currentImageIndex, setCurrentImageIndex] = useState(0);
|
const [currentImageIndex, setCurrentImageIndex] = useState(0);
|
||||||
const [isLoading, setIsLoading] = useState(true);
|
const [progress, setProgress] = useState(0);
|
||||||
const [currentImage, setCurrentImage] = useState(IMAGES[0]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const interval = setInterval(() => {
|
const duration = 5000; // 5 seconds per image
|
||||||
setIsLoading(true);
|
const interval = 50; // update progress every 50ms
|
||||||
setCurrentImageIndex((prevIndex) => (prevIndex + 1) % IMAGES.length);
|
const step = (interval / duration) * 100;
|
||||||
}, 5000); // Change image every 5 seconds
|
|
||||||
|
|
||||||
return () => clearInterval(interval);
|
const timer = setInterval(() => {
|
||||||
|
setProgress((prev) => {
|
||||||
|
if (prev >= 100) {
|
||||||
|
setCurrentImageIndex((prevIndex) => (prevIndex + 1) % IMAGES.length);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return prev + step;
|
||||||
|
});
|
||||||
|
}, interval);
|
||||||
|
|
||||||
|
return () => clearInterval(timer);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const image = new Image();
|
|
||||||
image.src = IMAGES[currentImageIndex];
|
|
||||||
image.onload = () => {
|
|
||||||
setCurrentImage(IMAGES[currentImageIndex]);
|
|
||||||
setIsLoading(false);
|
|
||||||
};
|
|
||||||
image.onerror = () => {
|
|
||||||
console.error("Failed to load image:", IMAGES[currentImageIndex]);
|
|
||||||
setIsLoading(false);
|
|
||||||
};
|
|
||||||
}, [currentImageIndex]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id="hero" data-section="hero" className="relative">
|
<div id="hero" data-webild-section="hero" className="relative w-full pt-24 pb-12 px-4 sm:px-6 lg:px-8">
|
||||||
{isLoading && (
|
<div className="container mx-auto mb-12">
|
||||||
<div className="absolute inset-0 flex items-center justify-center bg-background/80 z-10">
|
<h1 className="text-6xl md:text-8xl font-bold tracking-tight mb-8 text-center">
|
||||||
<div className="animate-spin rounded-full h-12 w-12 border-t-2 border-b-2 border-foreground"></div>
|
Innovate Marketing
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div className="flex flex-col md:flex-row justify-end items-end gap-6">
|
||||||
|
<div className="max-w-md text-right">
|
||||||
|
<p className="text-base md:text-lg text-muted-foreground mb-6">
|
||||||
|
Your Vision, Amplified. We craft data-driven strategies and compelling narratives to elevate your brand and drive measurable results. Let's grow together.
|
||||||
|
</p>
|
||||||
|
<div className="flex items-center justify-end gap-4">
|
||||||
|
<Button href="#services" text="Our Services" variant="primary" />
|
||||||
|
<Button href="#contact" text="Contact Us" variant="secondary" />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)}
|
</div>
|
||||||
<SectionErrorBoundary name="hero">
|
|
||||||
<HeroBillboardBrand
|
|
||||||
brand="Innovate Marketing"
|
|
||||||
description="Your Vision, Amplified. We craft data-driven strategies and compelling narratives to elevate your brand and drive measurable results. Let's grow together."
|
|
||||||
primaryButton={{
|
|
||||||
text: "Our Services",
|
|
||||||
href: "#services",
|
|
||||||
}}
|
|
||||||
secondaryButton={{
|
|
||||||
text: "Contact Us",
|
|
||||||
href: "#contact",
|
|
||||||
}}
|
|
||||||
imageSrc={currentImage}
|
|
||||||
/>
|
|
||||||
</SectionErrorBoundary>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div className="w-full container mx-auto relative rounded-3xl overflow-hidden aspect-[16/9] md:aspect-[21/9] shadow-2xl bg-muted">
|
||||||
|
{IMAGES.map((src, index) => (
|
||||||
|
<div
|
||||||
|
key={src}
|
||||||
|
className={`absolute inset-0 transition-opacity duration-1000 ease-in-out ${
|
||||||
|
index === currentImageIndex ? 'opacity-100 z-10' : 'opacity-0 z-0'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<img
|
||||||
|
src={src}
|
||||||
|
alt={`Slide ${index + 1}`}
|
||||||
|
className="w-full h-full object-cover"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
|
||||||
|
{/* Progress Bars Overlay */}
|
||||||
|
<div className="absolute bottom-6 left-0 right-0 z-20 flex justify-center gap-3 px-6">
|
||||||
|
{IMAGES.map((_, index) => (
|
||||||
|
<div
|
||||||
|
key={index}
|
||||||
|
className="h-1.5 w-16 sm:w-24 bg-white/30 rounded-full overflow-hidden backdrop-blur-sm cursor-pointer"
|
||||||
|
onClick={() => {
|
||||||
|
setCurrentImageIndex(index);
|
||||||
|
setProgress(0);
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
className="h-full bg-white transition-all duration-75 ease-linear"
|
||||||
|
style={{
|
||||||
|
width: index === currentImageIndex
|
||||||
|
? `${progress}%`
|
||||||
|
: index < currentImageIndex ? '100%' : '0%'
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user