Merge version_2_1781620421949 into main #2
@@ -1,176 +1,38 @@
|
||||
import AboutTestimonial from '@/components/sections/about/AboutTestimonial';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import HeroBillboardTiltedCarousel from '@/components/sections/hero/HeroBillboardTiltedCarousel';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
|
||||
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 AboutSection from './HomePage/sections/About';
|
||||
import ServicesSection from './HomePage/sections/Services';
|
||||
import MetricsSection from './HomePage/sections/Metrics';
|
||||
import TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import FaqSection from './HomePage/sections/Faq';
|
||||
import SocialSection from './HomePage/sections/Social';
|
||||
import ContactSection from './HomePage/sections/Contact';
|
||||
|
||||
|
||||
import ServiceAreasSection from './HomePage/sections/ServiceAreas';export default function HomePage(): React.JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardTiltedCarousel
|
||||
tag="Available 24/7"
|
||||
title="Your Trusted First Aid for Plumbing Emergencies"
|
||||
description="Professional plumbing services in Houston, TX. Quality repair, installation, and maintenance with a focus on fast results."
|
||||
primaryButton={{
|
||||
text: "Call Now", href: "tel:+18322793065"}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions", href: "https://maps.google.com"}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/man-engaged-household-task_23-2151741241.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-white-bathrobe-filling-bath-with-water_259150-59743.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-man-working-as-plumber_23-2150746311.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pleased-young-male-builder-wearing-uniform-safety-helmet-holding-out-wrench-camera-white_141793-74993.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/profile-man-touching-socket-wall-with-screwdriver_259150-58245.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/dinosaurs-inside-panel-ai-generated_268835-18600.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutTestimonial
|
||||
tag="About Us"
|
||||
quote="First Aid Plumbing Specialist INC provides reliable, 24/7 emergency care for all your home and business plumbing needs throughout the Houston area."
|
||||
author="Management"
|
||||
role="Plumbing Specialists"
|
||||
imageSrc="http://img.b2bpic.net/free-photo/sanitary-technician-gesturing-thumb-up_23-2147772204.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="services" data-section="services">
|
||||
<SectionErrorBoundary name="services">
|
||||
<FeaturesImageBento
|
||||
tag="Our Services"
|
||||
title="Complete Plumbing Solutions"
|
||||
description="Covering all essential residential and commercial plumbing needs with precision."
|
||||
items={[
|
||||
{
|
||||
title: "Leak Detection", description: "Quick identification of pipe leaks.", imageSrc: "http://img.b2bpic.net/free-photo/plumber-repair-experienced-attentive-middleaged-man-examining-bottom-kitchen-sink_259150-58266.jpg"},
|
||||
{
|
||||
title: "Toilet Repair", description: "Complete service for all toilet issues.", imageSrc: "http://img.b2bpic.net/free-photo/male-plumber-working-fix-problems-client-s-house_23-2150990706.jpg"},
|
||||
{
|
||||
title: "Water Heaters", description: "Repair and installation for heaters.", imageSrc: "http://img.b2bpic.net/free-photo/worker-repairing-water-heater_23-2149334232.jpg"},
|
||||
{
|
||||
title: "Drain Cleaning", description: "High-pressure drain clearance.", imageSrc: "http://img.b2bpic.net/free-photo/woman-pouring-water-barbershop_23-2147737008.jpg"},
|
||||
{
|
||||
title: "Fixtures", description: "Installations of sinks and faucets.", imageSrc: "http://img.b2bpic.net/free-photo/woman-with-question-gesture-plumber-looking-broken-faucet_259150-58296.jpg"},
|
||||
{
|
||||
title: "Safety Inspection", description: "Detailed home plumbing inspection.", imageSrc: "http://img.b2bpic.net/free-photo/male-plumber-working-fix-problems-client-s-house_23-2150990703.jpg"},
|
||||
{
|
||||
title: "Emergency Help", description: "Always ready for urgent repairs.", imageSrc: "http://img.b2bpic.net/free-photo/seasoned-mechanic-using-soft-dusting-brush-sweep-away-built-up-layer-dirt-debris-from-hvac-system-coil-while-adept-repairman-refills-air-conditioner-cooling-system-refrigerant-tank_482257-63969.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ServicesSection />
|
||||
<ServiceAreasSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="Our Stats"
|
||||
title="Why Choose Us"
|
||||
description="Quality backed by proven experience."
|
||||
metrics={[
|
||||
{
|
||||
value: "53+", title: "Verified Reviews", features: [
|
||||
"Google rating 4.9/5", "Verified customers"],
|
||||
},
|
||||
{
|
||||
value: "24/7", title: "Availability", features: [
|
||||
"Round-the-clock service", "Fast response time"],
|
||||
},
|
||||
{
|
||||
value: "Local", title: "Houston Service", features: [
|
||||
"Local area experts", "Fully insured"],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialMarqueeOverlayCards
|
||||
tag="Customer Stories"
|
||||
title="What Our Clients Say"
|
||||
description="Trusted by hundreds in Houston."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah J.", role: "Homeowner", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/expressive-senior-female-posing-indoor_344912-358.jpg"},
|
||||
{
|
||||
name: "David R.", role: "Resident", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/horizontal-portrait-cheerful-woman-with-appealing-smile-having-pinkish-hair-bun-tattoo-wearing-casual-clothes_273609-307.jpg"},
|
||||
{
|
||||
name: "Emily B.", role: "Property Owner", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-confident-young-carpenter_329181-15638.jpg"},
|
||||
{
|
||||
name: "Marcus W.", role: "Customer", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/positive-confident-girl-choosing-you_1262-17150.jpg"},
|
||||
{
|
||||
name: "Jessica L.", role: "Homeowner", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-woman-looking-photographer_23-2148339179.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="Answers"
|
||||
title="Frequently Asked"
|
||||
description="Quick help for your common concerns."
|
||||
items={[
|
||||
{
|
||||
question: "Are you open on weekends?", answer: "Yes, we provide 24/7 plumbing services."},
|
||||
{
|
||||
question: "Where do you serve?", answer: "We serve the Houston and surrounding areas."},
|
||||
{
|
||||
question: "Do you offer emergency repairs?", answer: "Yes, emergency repairs are our specialty."},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/pleased-young-male-builder-wearing-uniform-safety-helmet-showing-two-pink_141793-74761.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="social" data-section="social">
|
||||
<SectionErrorBoundary name="social">
|
||||
<SocialProofMarquee
|
||||
tag="Credentials"
|
||||
title="Certified and Recognized"
|
||||
description="Quality and safety standards in every job."
|
||||
names={[
|
||||
"Licensed Professional", "Bonded & Insured", "Houston Plumbing Assoc.", "24/7 Certified", "Safety Inspected", "Environmentally Safe", "Verified Expert"]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<SocialSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Need Help?"
|
||||
text="Call First Aid Plumbing Specialist INC today for fast service."
|
||||
primaryButton={{
|
||||
text: "Call +1 832-279-3065", href: "tel:+18322793065"}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions", href: "https://maps.google.com"}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
22
src/pages/HomePage/sections/About.tsx
Normal file
22
src/pages/HomePage/sections/About.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
// 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 AboutTestimonial from '@/components/sections/about/AboutTestimonial';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutTestimonial
|
||||
tag="About Us"
|
||||
quote="First Aid Plumbing Specialist INC provides reliable, 24/7 emergency care for all your home and business plumbing needs throughout the Houston area."
|
||||
author="Management"
|
||||
role="Plumbing Specialists"
|
||||
imageSrc="http://img.b2bpic.net/free-photo/sanitary-technician-gesturing-thumb-up_23-2147772204.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
23
src/pages/HomePage/sections/Contact.tsx
Normal file
23
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,23 @@
|
||||
// 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="Need Help?"
|
||||
text="Call First Aid Plumbing Specialist INC today for fast service."
|
||||
primaryButton={{
|
||||
text: "Call +1 832-279-3065", href: "tel:+18322793065"}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions", href: "https://maps.google.com"}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
29
src/pages/HomePage/sections/Faq.tsx
Normal file
29
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,29 @@
|
||||
// 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 FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="Answers"
|
||||
title="Frequently Asked"
|
||||
description="Quick help for your common concerns."
|
||||
items={[
|
||||
{
|
||||
question: "Are you open on weekends?", answer: "Yes, we provide 24/7 plumbing services."},
|
||||
{
|
||||
question: "Where do you serve?", answer: "We serve the Houston and surrounding areas."},
|
||||
{
|
||||
question: "Do you offer emergency repairs?", answer: "Yes, emergency repairs are our specialty."},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/pleased-young-male-builder-wearing-uniform-safety-helmet-showing-two-pink_141793-74761.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
38
src/pages/HomePage/sections/Hero.tsx
Normal file
38
src/pages/HomePage/sections/Hero.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 "hero" section.
|
||||
|
||||
import React from 'react';
|
||||
import HeroBillboardTiltedCarousel from '@/components/sections/hero/HeroBillboardTiltedCarousel';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboardTiltedCarousel
|
||||
tag="Available 24/7"
|
||||
title="Your Trusted First Aid for Plumbing Emergencies"
|
||||
description="Professional plumbing services in Houston, TX. Quality repair, installation, and maintenance with a focus on fast results."
|
||||
primaryButton={{
|
||||
text: "Call Now", href: "tel:+18322793065"}}
|
||||
secondaryButton={{
|
||||
text: "Get Directions", href: "https://maps.google.com"}}
|
||||
items={[
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/man-engaged-household-task_23-2151741241.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/person-white-bathrobe-filling-bath-with-water_259150-59743.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-man-working-as-plumber_23-2150746311.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/pleased-young-male-builder-wearing-uniform-safety-helmet-holding-out-wrench-camera-white_141793-74993.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/profile-man-touching-socket-wall-with-screwdriver_259150-58245.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/dinosaurs-inside-panel-ai-generated_268835-18600.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
34
src/pages/HomePage/sections/Metrics.tsx
Normal file
34
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,34 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "metrics" section.
|
||||
|
||||
import React from 'react';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MetricsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="Our Stats"
|
||||
title="Why Choose Us"
|
||||
description="Quality backed by proven experience."
|
||||
metrics={[
|
||||
{
|
||||
value: "53+", title: "Verified Reviews", features: [
|
||||
"Google rating 4.9/5", "Verified customers"],
|
||||
},
|
||||
{
|
||||
value: "24/7", title: "Availability", features: [
|
||||
"Round-the-clock service", "Fast response time"],
|
||||
},
|
||||
{
|
||||
value: "Local", title: "Houston Service", features: [
|
||||
"Local area experts", "Fully insured"],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
75
src/pages/HomePage/sections/ServiceAreas.tsx
Normal file
75
src/pages/HomePage/sections/ServiceAreas.tsx
Normal file
@@ -0,0 +1,75 @@
|
||||
import { MapPin } from "lucide-react"
|
||||
import Tag from "@/components/ui/Tag"
|
||||
import TextAnimation from "@/components/ui/TextAnimation"
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal"
|
||||
|
||||
export default function ServiceAreas() {
|
||||
const areas = [
|
||||
{
|
||||
title: "Downtown Houston",
|
||||
description: "Fast and reliable commercial and residential plumbing for the heart of the city.",
|
||||
},
|
||||
{
|
||||
title: "The Heights",
|
||||
description: "Expert plumbing repairs and installations for historic and modern homes.",
|
||||
},
|
||||
{
|
||||
title: "Katy",
|
||||
description: "Comprehensive plumbing solutions for families and businesses in Katy.",
|
||||
},
|
||||
{
|
||||
title: "Sugar Land",
|
||||
description: "Trusted local plumbers serving the Sugar Land community 24/7.",
|
||||
},
|
||||
{
|
||||
title: "Pearland",
|
||||
description: "Emergency plumbing and routine maintenance for Pearland residents.",
|
||||
},
|
||||
{
|
||||
title: "Cypress",
|
||||
description: "Professional water heater repair, drain cleaning, and more in Cypress.",
|
||||
},
|
||||
{
|
||||
title: "Spring",
|
||||
description: "Dedicated plumbing specialists keeping Spring homes running smoothly.",
|
||||
},
|
||||
{
|
||||
title: "The Woodlands",
|
||||
description: "Premium plumbing services for properties throughout The Woodlands.",
|
||||
}
|
||||
];
|
||||
|
||||
return (
|
||||
<section data-webild-section="service-areas" id="service-areas" className="py-24 bg-background">
|
||||
<div className="w-content-width mx-auto">
|
||||
<div className="text-center max-w-3xl mx-auto mb-16">
|
||||
<Tag text="Service Areas" className="mb-4" />
|
||||
<TextAnimation
|
||||
text="Neighborhoods & Suburbs We Serve"
|
||||
variant="fade-blur"
|
||||
tag="h2"
|
||||
gradientText={false}
|
||||
className="text-4xl md:text-5xl font-bold text-foreground mb-6"
|
||||
/>
|
||||
<p className="text-lg text-muted-foreground">
|
||||
First Aid Plumbing Specialist INC proudly provides top-rated plumbing services across the Greater Houston area. If you don't see your neighborhood listed, give us a call!
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
{areas.map((area, index) => (
|
||||
<ScrollReveal variant="fade" key={index} delay={index * 0.1}>
|
||||
<div className="card p-6 h-full flex flex-col items-start">
|
||||
<div className="w-12 h-12 rounded-full bg-primary-cta/10 flex items-center justify-center mb-4 text-primary-cta">
|
||||
<MapPin className="w-6 h-6" />
|
||||
</div>
|
||||
<h3 className="text-xl font-semibold text-foreground mb-2">{area.title}</h3>
|
||||
<p className="text-muted-foreground">{area.description}</p>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
36
src/pages/HomePage/sections/Services.tsx
Normal file
36
src/pages/HomePage/sections/Services.tsx
Normal file
@@ -0,0 +1,36 @@
|
||||
// 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="Complete Plumbing Solutions"
|
||||
description="Covering all essential residential and commercial plumbing needs with precision."
|
||||
items={[
|
||||
{
|
||||
title: "Leak Detection", description: "Quick identification of pipe leaks.", imageSrc: "http://img.b2bpic.net/free-photo/plumber-repair-experienced-attentive-middleaged-man-examining-bottom-kitchen-sink_259150-58266.jpg"},
|
||||
{
|
||||
title: "Toilet Repair", description: "Complete service for all toilet issues.", imageSrc: "http://img.b2bpic.net/free-photo/male-plumber-working-fix-problems-client-s-house_23-2150990706.jpg"},
|
||||
{
|
||||
title: "Water Heaters", description: "Repair and installation for heaters.", imageSrc: "http://img.b2bpic.net/free-photo/worker-repairing-water-heater_23-2149334232.jpg"},
|
||||
{
|
||||
title: "Drain Cleaning", description: "High-pressure drain clearance.", imageSrc: "http://img.b2bpic.net/free-photo/woman-pouring-water-barbershop_23-2147737008.jpg"},
|
||||
{
|
||||
title: "Fixtures", description: "Installations of sinks and faucets.", imageSrc: "http://img.b2bpic.net/free-photo/woman-with-question-gesture-plumber-looking-broken-faucet_259150-58296.jpg"},
|
||||
{
|
||||
title: "Safety Inspection", description: "Detailed home plumbing inspection.", imageSrc: "http://img.b2bpic.net/free-photo/male-plumber-working-fix-problems-client-s-house_23-2150990703.jpg"},
|
||||
{
|
||||
title: "Emergency Help", description: "Always ready for urgent repairs.", imageSrc: "http://img.b2bpic.net/free-photo/seasoned-mechanic-using-soft-dusting-brush-sweep-away-built-up-layer-dirt-debris-from-hvac-system-coil-while-adept-repairman-refills-air-conditioner-cooling-system-refrigerant-tank_482257-63969.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
22
src/pages/HomePage/sections/Social.tsx
Normal file
22
src/pages/HomePage/sections/Social.tsx
Normal file
@@ -0,0 +1,22 @@
|
||||
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
|
||||
// file as the canonical source for the "social" section.
|
||||
|
||||
import React from 'react';
|
||||
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function SocialSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="social" data-section="social">
|
||||
<SectionErrorBoundary name="social">
|
||||
<SocialProofMarquee
|
||||
tag="Credentials"
|
||||
title="Certified and Recognized"
|
||||
description="Quality and safety standards in every job."
|
||||
names={[
|
||||
"Licensed Professional", "Bonded & Insured", "Houston Plumbing Assoc.", "24/7 Certified", "Safety Inspected", "Environmentally Safe", "Verified Expert"]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
37
src/pages/HomePage/sections/Testimonials.tsx
Normal file
37
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,37 @@
|
||||
// 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 Stories"
|
||||
title="What Our Clients Say"
|
||||
description="Trusted by hundreds in Houston."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah J.", role: "Homeowner", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/expressive-senior-female-posing-indoor_344912-358.jpg"},
|
||||
{
|
||||
name: "David R.", role: "Resident", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/horizontal-portrait-cheerful-woman-with-appealing-smile-having-pinkish-hair-bun-tattoo-wearing-casual-clothes_273609-307.jpg"},
|
||||
{
|
||||
name: "Emily B.", role: "Property Owner", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-confident-young-carpenter_329181-15638.jpg"},
|
||||
{
|
||||
name: "Marcus W.", role: "Customer", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/positive-confident-girl-choosing-you_1262-17150.jpg"},
|
||||
{
|
||||
name: "Jessica L.", role: "Homeowner", company: "Houston", rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/portrait-smiling-woman-looking-photographer_23-2148339179.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user