Merge version_2_1781382460459 into main #1
@@ -1,232 +1,33 @@
|
||||
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
|
||||
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import HeroTiltedCards from '@/components/sections/hero/HeroTiltedCards';
|
||||
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
// AUTO-GENERATED shell by per-section-migrate.
|
||||
// Section bodies live in ./<PageBase>/sections/<X>.tsx. Edit the section
|
||||
// files directly. Non-block content (wrappers, non-inlinable sections) is
|
||||
// preserved inline; extracted section blocks become <XSection/> refs.
|
||||
|
||||
export default function HomePage() {
|
||||
import React from 'react';
|
||||
import HeroSection from './HomePage/sections/Hero';
|
||||
import FeaturesStepsSection from './HomePage/sections/FeaturesSteps';
|
||||
import ServicesSection from './HomePage/sections/Services';
|
||||
import AboutSection from './HomePage/sections/About';
|
||||
import TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroTiltedCards
|
||||
tag="Trusted Cleaning Experts"
|
||||
title="Professional Deep Cleaning You Can Trust"
|
||||
description="Flores Deep Cleaning delivers reliable residential and commercial cleaning services with exceptional attention to detail."
|
||||
primaryButton={{
|
||||
text: "Get a Free Quote",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Book a Cleaning",
|
||||
href: "#contact",
|
||||
}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-female-janitor_23-2148453430.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/big-purple-eggplant-vegetable-wooden-board-high-quality-photo_114579-78499.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-taking-care-office-cleaning_23-2149374434.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/decoration-livingroom-interior_74190-5760.jpg",
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/boxes-flowerpot-new-apartment_1098-21590.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="features-steps" data-section="features-steps">
|
||||
<SectionErrorBoundary name="features-steps">
|
||||
<FeaturesDetailedSteps
|
||||
tag="Why Choose Us"
|
||||
title="A Standard of Excellence"
|
||||
description="We go beyond the surface to ensure your space is truly clean and healthy."
|
||||
steps={[
|
||||
{
|
||||
tag: "01",
|
||||
title: "Expert Team",
|
||||
subtitle: "Trained Professionals",
|
||||
description: "Our cleaners are experienced, vetted, and dedicated to delivering impeccable results.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-adult-male-getting-ready-clean_23-2148563557.jpg",
|
||||
},
|
||||
{
|
||||
tag: "02",
|
||||
title: "Deep Clean",
|
||||
subtitle: "Attention to Detail",
|
||||
description: "We clean overlooked areas like baseboards, light switches, and inside appliances.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cleaning-objects-flat-lay_23-2148118447.jpg",
|
||||
},
|
||||
{
|
||||
tag: "03",
|
||||
title: "Flexible",
|
||||
subtitle: "Designed for You",
|
||||
description: "We offer scheduling that fits your busy life, ensuring a clean home on your terms.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-talking-phone_23-2148883487.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FeaturesStepsSection />
|
||||
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<FeaturesImageBento
|
||||
tag="Our Services"
|
||||
title="Comprehensive Cleaning Solutions"
|
||||
description="From daily upkeep to post-construction cleanup, we have the expertise you need."
|
||||
items={[
|
||||
{
|
||||
title: "Deep Cleaning",
|
||||
description: "A thorough sanitization of your home.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-upon-robot-vacuum-cleaner-indoors_23-2150829986.jpg",
|
||||
},
|
||||
{
|
||||
title: "Recurring Cleaning",
|
||||
description: "Consistent upkeep for your lifestyle.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/soft-pastel-hues-room-kids_23-2151690321.jpg",
|
||||
},
|
||||
{
|
||||
title: "Move-In/Out",
|
||||
description: "Perfect for real estate transitions.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/modern-kitchen-island-with-fluted-glass-cabinets-stylish-interior-with-builtin-appliances_169016-72717.jpg",
|
||||
},
|
||||
{
|
||||
title: "Apartment Clean",
|
||||
description: "Optimized for smaller living spaces.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/seamless-blue-glass-tiles-texture-background-window-kitchen-bathroom-concept_1339-666.jpg",
|
||||
},
|
||||
{
|
||||
title: "Office & Commercial",
|
||||
description: "Professional environment sanitization.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/empty-hairdresser-shop-with-chairs_23-2149220584.jpg",
|
||||
},
|
||||
{
|
||||
title: "Kitchen Detail",
|
||||
description: "Spotless hygiene for culinary spaces.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/still-life-cleaning-tools_23-2150552216.jpg",
|
||||
},
|
||||
{
|
||||
title: "Bathroom Sanitization",
|
||||
description: "Deep cleaning for high-traffic zones.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-eco-cleaning-products-with-lemon-baking-soda_23-2148818423.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ServicesSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutMediaOverlay
|
||||
tag="About Flores Deep Cleaning"
|
||||
title="Creating Healthier Spaces"
|
||||
description="At Flores Deep Cleaning, we take pride in creating cleaner, healthier spaces for our clients. Our team is dedicated to delivering outstanding results and exceptional customer service on every visit."
|
||||
imageSrc="http://img.b2bpic.net/free-photo/smiling-portrait-young-maid-holding-stack-towels-hotel-room_23-2148033256.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialMarqueeOverlayCards
|
||||
tag="Customer Reviews"
|
||||
title="What Our Clients Say"
|
||||
description="Don't just take our word for it—read what our satisfied clients have to say."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Wael Ahmad",
|
||||
role: "Local Guide",
|
||||
company: "Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-young-housewife-with-dirty-clothes-face-holding-mop-washing-spray-holding-hand-head-looking-tired-happy-finish-work-tired-cute-woman-doing-house-cleaning_273609-7852.jpg",
|
||||
},
|
||||
{
|
||||
name: "Julie",
|
||||
role: "Homeowner",
|
||||
company: "Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-handsome-man_23-2148238926.jpg",
|
||||
},
|
||||
{
|
||||
name: "Fielden Swimm",
|
||||
role: "Homeowner",
|
||||
company: "Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiley-woman-kitchen-holding-ablution-cloth_23-2148587316.jpg",
|
||||
},
|
||||
{
|
||||
name: "Sarah Miller",
|
||||
role: "Business Owner",
|
||||
company: "Office Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/fashionable-hipster-guy-dressed-stylish-black-hat-denim-shirt_273609-6809.jpg",
|
||||
},
|
||||
{
|
||||
name: "Michael Reed",
|
||||
role: "Resident",
|
||||
company: "Apartment Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-business-woman-working_23-2150384845.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTwoColumn
|
||||
tag="Common Questions"
|
||||
title="Frequently Asked Questions"
|
||||
description="Answers to the most common questions about our services."
|
||||
items={[
|
||||
{
|
||||
question: "What areas do you serve?",
|
||||
answer: "We serve Lexington, KY and surrounding neighborhoods.",
|
||||
},
|
||||
{
|
||||
question: "Are you insured?",
|
||||
answer: "Yes, we are fully licensed and insured for your peace of mind.",
|
||||
},
|
||||
{
|
||||
question: "Do you provide supplies?",
|
||||
answer: "Yes, our team brings all professional-grade cleaning supplies and equipment.",
|
||||
},
|
||||
{
|
||||
question: "Can I request specific tasks?",
|
||||
answer: "Absolutely! We customize every cleaning to meet your specific needs.",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get Started"
|
||||
text="Ready for a spotless space? Get a free quote today."
|
||||
primaryButton={{
|
||||
text: "Call (859) 684-2847",
|
||||
href: "tel:8596842847",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Book a Cleaning",
|
||||
href: "#contact",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
21
src/pages/HomePage/sections/About.tsx
Normal file
21
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,21 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "about" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutMediaOverlay from '@/components/sections/about/AboutMediaOverlay';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutMediaOverlay
|
||||
tag="About Flores Deep Cleaning"
|
||||
title="Creating Healthier Spaces"
|
||||
description="At Flores Deep Cleaning, we take pride in creating cleaner, healthier spaces for our clients. Our team is dedicated to delivering outstanding results and exceptional customer service on every visit."
|
||||
imageSrc="http://img.b2bpic.net/free-photo/smiling-portrait-young-maid-holding-stack-towels-hotel-room_23-2148033256.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
27
src/pages/HomePage/sections/Contact.tsx
Normal file
27
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,27 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "contact" section.
|
||||
|
||||
import React from 'react';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ContactSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get Started"
|
||||
text="Ready for a spotless space? Get a free quote today."
|
||||
primaryButton={{
|
||||
text: "Call (859) 684-2847",
|
||||
href: "tel:8596842847",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Book a Cleaning",
|
||||
href: "#contact",
|
||||
}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
38
src/pages/HomePage/sections/Faq.tsx
Normal file
38
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,38 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "faq" section.
|
||||
|
||||
import React from 'react';
|
||||
import FaqTwoColumn from '@/components/sections/faq/FaqTwoColumn';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTwoColumn
|
||||
tag="Common Questions"
|
||||
title="Frequently Asked Questions"
|
||||
description="Answers to the most common questions about our services."
|
||||
items={[
|
||||
{
|
||||
question: "What areas do you serve?",
|
||||
answer: "We serve Lexington, KY and surrounding neighborhoods.",
|
||||
},
|
||||
{
|
||||
question: "Are you insured?",
|
||||
answer: "Yes, we are fully licensed and insured for your peace of mind.",
|
||||
},
|
||||
{
|
||||
question: "Do you provide supplies?",
|
||||
answer: "Yes, our team brings all professional-grade cleaning supplies and equipment.",
|
||||
},
|
||||
{
|
||||
question: "Can I request specific tasks?",
|
||||
answer: "Absolutely! We customize every cleaning to meet your specific needs.",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
43
src/pages/HomePage/sections/FeaturesSteps.tsx
Normal file
43
src/pages/HomePage/sections/FeaturesSteps.tsx
Normal file
@@ -0,0 +1,43 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "features-steps" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FeaturesStepsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="features-steps" data-section="features-steps">
|
||||
<SectionErrorBoundary name="features-steps">
|
||||
<FeaturesDetailedSteps
|
||||
tag="Why Choose Us"
|
||||
title="A Standard of Excellence"
|
||||
description="We go beyond the surface to ensure your space is truly clean and healthy."
|
||||
steps={[
|
||||
{
|
||||
tag: "01",
|
||||
title: "Expert Team",
|
||||
subtitle: "Trained Professionals",
|
||||
description: "Our cleaners are experienced, vetted, and dedicated to delivering impeccable results.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-up-adult-male-getting-ready-clean_23-2148563557.jpg",
|
||||
},
|
||||
{
|
||||
tag: "02",
|
||||
title: "Deep Clean",
|
||||
subtitle: "Attention to Detail",
|
||||
description: "We clean overlooked areas like baseboards, light switches, and inside appliances.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/cleaning-objects-flat-lay_23-2148118447.jpg",
|
||||
},
|
||||
{
|
||||
tag: "03",
|
||||
title: "Flexible",
|
||||
subtitle: "Designed for You",
|
||||
description: "We offer scheduling that fits your busy life, ensuring a clean home on your terms.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-talking-phone_23-2148883487.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
131
src/pages/HomePage/sections/Hero.tsx
Normal file
131
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,131 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import Button from "@/components/ui/Button";
|
||||
import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import ImageOrVideo from "@/components/ui/ImageOrVideo";
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import { cls } from "@/lib/utils";
|
||||
|
||||
const primaryButton = {
|
||||
text: "Get a Free Quote",
|
||||
href: "#contact"
|
||||
};
|
||||
const secondaryButton = {
|
||||
text: "Book a Cleaning",
|
||||
href: "#contact"
|
||||
};
|
||||
const items = [
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-female-janitor_23-2148453430.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/big-purple-eggplant-vegetable-wooden-board-high-quality-photo_114579-78499.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-taking-care-office-cleaning_23-2149374434.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/decoration-livingroom-interior_74190-5760.jpg"
|
||||
},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/boxes-flowerpot-new-apartment_1098-21590.jpg"
|
||||
}
|
||||
];
|
||||
|
||||
type MediaItem = { imageSrc: string; videoSrc?: never } | { videoSrc: string; imageSrc?: never };
|
||||
|
||||
interface HeroTiltedCardsProps {
|
||||
tag: string;
|
||||
title: string;
|
||||
description: string;
|
||||
primaryButton: { text: string; href: string };
|
||||
secondaryButton: { text: string; href: string };
|
||||
items: [MediaItem, MediaItem, MediaItem, MediaItem, MediaItem];
|
||||
}
|
||||
|
||||
const HeroInline = () => {
|
||||
const marqueeItems = [...items, ...items];
|
||||
const galleryStyles = [
|
||||
"-rotate-6 z-10 -translate-y-5",
|
||||
"rotate-6 z-20 translate-y-5 -ml-15",
|
||||
"-rotate-6 z-30 -translate-y-5 -ml-15",
|
||||
"rotate-6 z-40 translate-y-5 -ml-15",
|
||||
"-rotate-6 z-50 -translate-y-5 -ml-15",
|
||||
];
|
||||
|
||||
return (
|
||||
<section aria-label="Hero section" className="relative h-svh md:h-auto pt-25 pb-20 md:pt-30">
|
||||
<HeroBackgroundSlot />
|
||||
<div className="flex flex-col items-center gap-12 md:gap-15 w-full md:w-content-width mx-auto">
|
||||
<div className="flex flex-col items-center gap-3 w-content-width mx-auto text-center">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Trusted Cleaning Experts"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"Professional Deep Cleaning You Can Trust"}
|
||||
variant="slide-up"
|
||||
gradientText={true}
|
||||
tag="h1"
|
||||
className="md:max-w-8/10 text-7xl 2xl:text-8xl leading-[1.15] font-semibold text-center text-balance"
|
||||
/>
|
||||
|
||||
<TextAnimation
|
||||
text={"Flores Deep Cleaning delivers reliable residential and commercial cleaning services with exceptional attention to detail."}
|
||||
variant="slide-up"
|
||||
gradientText={false}
|
||||
tag="p"
|
||||
className="md:max-w-7/10 text-lg md:text-xl leading-snug text-balance"
|
||||
/>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-4 mt-4 md:mt-6">
|
||||
<a href={primaryButton.href} target="_blank" rel="noopener noreferrer" aria-label="Facebook" className="flex items-center justify-center w-14 h-14 rounded-full bg-primary-cta text-primary-cta-text hover:opacity-80 transition-opacity shadow-lg">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
|
||||
</a>
|
||||
<a href={secondaryButton.href} target="_blank" rel="noopener noreferrer" aria-label="Instagram" className="flex items-center justify-center w-14 h-14 rounded-full bg-primary-cta text-primary-cta-text hover:opacity-80 transition-opacity shadow-lg">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><rect width="20" height="20" x="2" y="2" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"/></svg>
|
||||
</a>
|
||||
<a href="#" target="_blank" rel="noopener noreferrer" aria-label="TikTok" className="flex items-center justify-center w-14 h-14 rounded-full bg-primary-cta text-primary-cta-text hover:opacity-80 transition-opacity shadow-lg">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M9 12a4 4 0 1 0 4 4V4a5 5 0 0 0 5 5"/></svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ScrollReveal variant="slide-up" delay={0.2} className="block md:hidden w-full overflow-hidden mask-padding-x">
|
||||
<div className="flex w-max animate-marquee-horizontal">
|
||||
{marqueeItems.map((item, index) => (
|
||||
<div key={index} className="shrink-0 w-[50vw] mr-5 aspect-4/5 p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden">
|
||||
<ImageOrVideo imageSrc={item.imageSrc} videoSrc={item.videoSrc} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
|
||||
<ScrollReveal variant="slide-up" delay={0.2} className="hidden md:flex justify-center items-center w-full">
|
||||
<div className="flex items-center justify-center">
|
||||
{items.map((item, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className={cls(
|
||||
"relative w-[23%] aspect-4/5 p-2 xl:p-3 2xl:p-4 card rounded overflow-hidden shadow-lg transition-transform duration-500 ease-out hover:scale-110",
|
||||
galleryStyles[index]
|
||||
)}
|
||||
>
|
||||
<ImageOrVideo imageSrc={item.imageSrc} videoSrc={item.videoSrc} />
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function HeroSection() {
|
||||
return (
|
||||
<div data-webild-section="hero" id="hero">
|
||||
<HeroInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
57
src/pages/HomePage/sections/Services.tsx
Normal file
57
src/pages/HomePage/sections/Services.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "services" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function ServicesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<FeaturesImageBento
|
||||
tag="Our Services"
|
||||
title="Comprehensive Cleaning Solutions"
|
||||
description="From daily upkeep to post-construction cleanup, we have the expertise you need."
|
||||
items={[
|
||||
{
|
||||
title: "Deep Cleaning",
|
||||
description: "A thorough sanitization of your home.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/close-upon-robot-vacuum-cleaner-indoors_23-2150829986.jpg",
|
||||
},
|
||||
{
|
||||
title: "Recurring Cleaning",
|
||||
description: "Consistent upkeep for your lifestyle.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/soft-pastel-hues-room-kids_23-2151690321.jpg",
|
||||
},
|
||||
{
|
||||
title: "Move-In/Out",
|
||||
description: "Perfect for real estate transitions.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/modern-kitchen-island-with-fluted-glass-cabinets-stylish-interior-with-builtin-appliances_169016-72717.jpg",
|
||||
},
|
||||
{
|
||||
title: "Apartment Clean",
|
||||
description: "Optimized for smaller living spaces.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/seamless-blue-glass-tiles-texture-background-window-kitchen-bathroom-concept_1339-666.jpg",
|
||||
},
|
||||
{
|
||||
title: "Office & Commercial",
|
||||
description: "Professional environment sanitization.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/empty-hairdresser-shop-with-chairs_23-2149220584.jpg",
|
||||
},
|
||||
{
|
||||
title: "Kitchen Detail",
|
||||
description: "Spotless hygiene for culinary spaces.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/still-life-cleaning-tools_23-2150552216.jpg",
|
||||
},
|
||||
{
|
||||
title: "Bathroom Sanitization",
|
||||
description: "Deep cleaning for high-traffic zones.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-eco-cleaning-products-with-lemon-baking-soda_23-2148818423.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
57
src/pages/HomePage/sections/Testimonials.tsx
Normal file
57
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,57 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "testimonials" section.
|
||||
|
||||
import React from 'react';
|
||||
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialMarqueeOverlayCards
|
||||
tag="Customer Reviews"
|
||||
title="What Our Clients Say"
|
||||
description="Don't just take our word for it—read what our satisfied clients have to say."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Wael Ahmad",
|
||||
role: "Local Guide",
|
||||
company: "Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-beautiful-young-housewife-with-dirty-clothes-face-holding-mop-washing-spray-holding-hand-head-looking-tired-happy-finish-work-tired-cute-woman-doing-house-cleaning_273609-7852.jpg",
|
||||
},
|
||||
{
|
||||
name: "Julie",
|
||||
role: "Homeowner",
|
||||
company: "Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-handsome-man_23-2148238926.jpg",
|
||||
},
|
||||
{
|
||||
name: "Fielden Swimm",
|
||||
role: "Homeowner",
|
||||
company: "Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/smiley-woman-kitchen-holding-ablution-cloth_23-2148587316.jpg",
|
||||
},
|
||||
{
|
||||
name: "Sarah Miller",
|
||||
role: "Business Owner",
|
||||
company: "Office Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/fashionable-hipster-guy-dressed-stylish-black-hat-denim-shirt_273609-6809.jpg",
|
||||
},
|
||||
{
|
||||
name: "Michael Reed",
|
||||
role: "Resident",
|
||||
company: "Apartment Client",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-business-woman-working_23-2150384845.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user