14 Commits

Author SHA1 Message Date
kudinDmitriyUp
36661602df Bob AI: Update hero section spacing to match the rest of the site 2026-06-03 15:06:02 +00:00
f1324c3acc Merge version_9_1780498852595 into main
Merge version_9_1780498852595 into main
2026-06-03 15:01:49 +00:00
kudinDmitriyUp
307f8aae69 Bob AI (stub): Increase the spacing from the side of each element on the he 2026-06-03 15:01:46 +00:00
103f1ac138 Merge version_8_1780498632449 into main
Merge version_8_1780498632449 into main
2026-06-03 14:58:26 +00:00
kudinDmitriyUp
1808eaeb59 Bob AI: Fix button styling in hero section to use standard Button co 2026-06-03 14:57:44 +00:00
0a555cebf0 Merge version_7_1780497924503 into main
Merge version_7_1780497924503 into main
2026-06-03 14:47:12 +00:00
kudinDmitriyUp
1bd975b83a Bob AI: On the hero section, fix the broken spacing from the sides o 2026-06-03 14:46:36 +00:00
070498676d Merge version_6_1780497418695 into main
Merge version_6_1780497418695 into main
2026-06-03 14:38:52 +00:00
kudinDmitriyUp
0adc67b76d Bob AI (stub): Fix the spacing and buttons on the first section. 2026-06-03 14:38:49 +00:00
bc5393893b Merge version_5_1780497112957 into main
Merge version_5_1780497112957 into main
2026-06-03 14:33:37 +00:00
kudinDmitriyUp
b0069a702f Bob AI: Changed the second section to a split layout with text and i 2026-06-03 14:32:57 +00:00
3c3c30edec Merge version_4_1780496862537 into main
Merge version_4_1780496862537 into main
2026-06-03 14:30:32 +00:00
kudinDmitriyUp
a8915a2817 Bob AI: For the image on the hero section, have it switch in between 2026-06-03 14:29:56 +00:00
3aa9469b5d Merge version_3_1780496675582 into main
Merge version_3_1780496675582 into main
2026-06-03 14:26:25 +00:00
3 changed files with 118 additions and 51 deletions

View File

@@ -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 {

View File

@@ -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>
); );
} }

View File

@@ -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>
); );
} }