Merge version_3_1781986417013 into main #2
@@ -1,230 +1,36 @@
|
||||
import AboutTextSplit from '@/components/sections/about/AboutTextSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqSplitMedia from '@/components/sections/faq/FaqSplitMedia';
|
||||
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
|
||||
import HeroBillboard from '@/components/sections/hero/HeroBillboard';
|
||||
import MetricsFeatureCards from '@/components/sections/metrics/MetricsFeatureCards';
|
||||
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
|
||||
import TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
|
||||
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 FeaturesSection from './HomePage/sections/Features';
|
||||
import MetricsSection from './HomePage/sections/Metrics';
|
||||
import PricingSection from './HomePage/sections/Pricing';
|
||||
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">
|
||||
<HeroBillboard
|
||||
title="Transform Your Outdoor Space Into Something Extraordinary"
|
||||
description="Professional landscaping services built on quality craftsmanship, honest pricing, and proven customer satisfaction. Trusted by local homeowners and property managers throughout the region."
|
||||
primaryButton={{
|
||||
text: "Get Your Free Estimate",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Our Projects",
|
||||
href: "#features",
|
||||
}}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/view-tank-container-water-storage_23-2151748329.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutTextSplit
|
||||
title="Local Expertise, Proven Results"
|
||||
descriptions={[
|
||||
"Daniels Landscaping LLC is a locally-owned, family-operated business dedicated to elevating residential and commercial outdoor spaces within our 30-mile service radius.",
|
||||
"We take pride in our honest approach to communication, ensuring clear timelines, transparent pricing, and quality craftsmanship that increases property value and curb appeal.",
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesDetailedSteps
|
||||
tag="Our Process"
|
||||
title="Simple Transformation Steps"
|
||||
description="We take the guesswork out of outdoor improvements with our streamlined four-stage project management approach."
|
||||
steps={[
|
||||
{
|
||||
tag: "01",
|
||||
title: "Free Consultation",
|
||||
subtitle: "Assess Needs",
|
||||
description: "We discuss your vision, budget, and project requirements on-site for a transparent estimate.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/father-son-together-tree-nursery-picking-plant_23-2148814060.jpg",
|
||||
},
|
||||
{
|
||||
tag: "02",
|
||||
title: "Custom Design",
|
||||
subtitle: "Plan Project",
|
||||
description: "Our team drafts a functional and aesthetic design tailored specifically to your landscape property.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/wide-angle-shot-gray-concrete-walkway-cloudy-sky_181624-16507.jpg",
|
||||
},
|
||||
{
|
||||
tag: "03",
|
||||
title: "Execution",
|
||||
subtitle: "Build Dream",
|
||||
description: "Our professional crews bring the plan to life with expert craftsmanship and high-quality materials.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/aerial-view-from-hong-kong_181624-34551.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FeaturesSection />
|
||||
|
||||
<div id="metrics" data-section="metrics">
|
||||
<SectionErrorBoundary name="metrics">
|
||||
<MetricsFeatureCards
|
||||
tag="Our Impact"
|
||||
title="Quality You Can See"
|
||||
description="We don't just landscape; we build trust one project at a time across our local community."
|
||||
metrics={[
|
||||
{
|
||||
value: "150+",
|
||||
title: "Projects Completed",
|
||||
features: [
|
||||
"Residential properties",
|
||||
"Commercial maintenance",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "10 Years",
|
||||
title: "Local Authority",
|
||||
features: [
|
||||
"Dedicated craftsmanship",
|
||||
"Expert knowledge",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "98%",
|
||||
title: "Satisfied Clients",
|
||||
features: [
|
||||
"On-time delivery",
|
||||
"Professional communication",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MetricsSection />
|
||||
|
||||
<div id="pricing" data-section="pricing">
|
||||
<SectionErrorBoundary name="pricing">
|
||||
<PricingMediaCards
|
||||
tag="Transparent Pricing"
|
||||
title="Clear Investment Options"
|
||||
description="We believe in honest pricing for premium landscaping solutions to give you peace of mind."
|
||||
plans={[
|
||||
{
|
||||
tag: "Seasonal",
|
||||
price: "Custom",
|
||||
period: "/per service",
|
||||
features: [
|
||||
"Lawn care",
|
||||
"Weed control",
|
||||
"Garden bed maintenance",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Request Quote",
|
||||
href: "#contact",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/beach-sochi_181624-528.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<PricingSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialRatingCards
|
||||
tag="Proven Trust"
|
||||
title="Hear From Local Homeowners"
|
||||
description="Quality is the cornerstone of Daniels Landscaping LLC, as reflected by our satisfied customer base."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah Miller",
|
||||
role: "Homeowner",
|
||||
quote: "The team transformed our barren backyard into a luxury outdoor retreat on time and within budget.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/man-standing-garden-showing-ok-gesture-looking-camera_259150-59030.jpg",
|
||||
},
|
||||
{
|
||||
name: "David Thorne",
|
||||
role: "Property Manager",
|
||||
quote: "Reliable maintenance services every single time. Daniels is our go-to for commercial upkeep.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/women-taking-care-their-plants-greenhouse_23-2149037249.jpg",
|
||||
},
|
||||
{
|
||||
name: "Emily Chen",
|
||||
role: "Homeowner",
|
||||
quote: "Honest communication throughout the entire walkway project. Exceptional attention to detail.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/countryside-life-naature-close-up-outdoor-portrait-young-attractive-bearded-caucasian-man-blue-t-shirt-smiling_176420-19896.jpg",
|
||||
},
|
||||
{
|
||||
name: "Robert Voss",
|
||||
role: "Homeowner",
|
||||
quote: "Professional team, fair pricing, and stunning results. Highly recommend for any landscape needs.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-woman-holding-flowers_23-2149871129.jpg",
|
||||
},
|
||||
{
|
||||
name: "Lisa Garcia",
|
||||
role: "Property Owner",
|
||||
quote: "They made our landscape look better than ever! Worth every penny of our investment.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-lady-taking-care-plants-flowers-her-backyard-ready-start-online-business-consulting-greenhouse-care_197531-31039.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqSplitMedia
|
||||
tag="Learn More"
|
||||
title="Common Questions"
|
||||
description="Here is everything you need to know about starting your next landscaping project."
|
||||
items={[
|
||||
{
|
||||
question: "What is your service radius?",
|
||||
answer: "We provide premium landscaping services within a 30-mile radius of the regional city center.",
|
||||
},
|
||||
{
|
||||
question: "Are you licensed and insured?",
|
||||
answer: "Yes, Daniels Landscaping LLC is fully licensed, bonded, and insured for all services offered.",
|
||||
},
|
||||
{
|
||||
question: "How do I get an estimate?",
|
||||
answer: "Simply fill out our contact form or call us to schedule a site consultation for a free, no-obligation estimate.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/young-man-reading-book-park-summer-day_1253-1091.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get Started"
|
||||
text="Ready to transform your outdoor space? Request your free estimate today."
|
||||
primaryButton={{
|
||||
text: "Get Estimate",
|
||||
href: "#contact-form",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "Contact Us",
|
||||
href: "tel:5550123456",
|
||||
}}
|
||||
/>
|
||||
</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 AboutTextSplit from '@/components/sections/about/AboutTextSplit';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function AboutSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutTextSplit
|
||||
title="Local Expertise, Proven Results"
|
||||
descriptions={[
|
||||
"Daniels Landscaping LLC is a locally-owned, family-operated business dedicated to elevating residential and commercial outdoor spaces within our 30-mile service radius.",
|
||||
"We take pride in our honest approach to communication, ensuring clear timelines, transparent pricing, and quality craftsmanship that increases property value and curb appeal.",
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
53
src/pages/HomePage/sections/Contact.tsx
Normal file
53
src/pages/HomePage/sections/Contact.tsx
Normal file
@@ -0,0 +1,53 @@
|
||||
/* eslint-disable */
|
||||
// @ts-nocheck — generated by catalog-eject; runtime-correct but TS strict-mode false-positives on inlined catalog body
|
||||
import ScrollReveal from "@/components/ui/ScrollReveal";
|
||||
import TextAnimation from "@/components/ui/TextAnimation";
|
||||
import Button from "@/components/ui/Button";
|
||||
|
||||
const primaryButton = {
|
||||
text: "Get Estimate",
|
||||
href: "#contact-form"
|
||||
};
|
||||
const secondaryButton = {
|
||||
text: "(281) 839-0311",
|
||||
href: "tel:+12818390311"
|
||||
};
|
||||
|
||||
const ContactInline = () => {
|
||||
return (
|
||||
<section aria-label="Contact section" className="py-20">
|
||||
<div className="w-content-width mx-auto">
|
||||
<ScrollReveal variant="fade">
|
||||
<div className="flex flex-col items-center gap-8 md:gap-10 py-20 px-8 rounded card">
|
||||
<div className="flex flex-col items-center gap-2">
|
||||
<div className="px-3 py-1 mb-1 text-sm card rounded w-fit">
|
||||
<p>{"Get Started"}</p>
|
||||
</div>
|
||||
|
||||
<TextAnimation
|
||||
text={"Ready to transform your outdoor space? Request your free estimate today."}
|
||||
variant="slide-up"
|
||||
gradientText={true}
|
||||
tag="h2"
|
||||
className="md:max-w-8/10 text-5xl 2xl:text-6xl leading-[1.15] font-semibold text-center text-balance"
|
||||
/>
|
||||
|
||||
<div className="flex flex-wrap justify-center gap-3 mt-2 md:mt-3">
|
||||
<Button text={primaryButton.text} href={primaryButton.href} variant="primary" />
|
||||
<Button text={secondaryButton.text} href={secondaryButton.href} variant="secondary" animationDelay={0.1} />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ScrollReveal>
|
||||
</div>
|
||||
</section>
|
||||
);
|
||||
};
|
||||
|
||||
export default function ContactSection() {
|
||||
return (
|
||||
<div data-webild-section="contact" id="contact">
|
||||
<ContactInline />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
35
src/pages/HomePage/sections/Faq.tsx
Normal file
35
src/pages/HomePage/sections/Faq.tsx
Normal file
@@ -0,0 +1,35 @@
|
||||
// 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="Learn More"
|
||||
title="Common Questions"
|
||||
description="Here is everything you need to know about starting your next landscaping project."
|
||||
items={[
|
||||
{
|
||||
question: "What is your service radius?",
|
||||
answer: "We provide premium landscaping services within a 30-mile radius of the regional city center.",
|
||||
},
|
||||
{
|
||||
question: "Are you licensed and insured?",
|
||||
answer: "Yes, Daniels Landscaping LLC is fully licensed, bonded, and insured for all services offered.",
|
||||
},
|
||||
{
|
||||
question: "How do I get an estimate?",
|
||||
answer: "Simply fill out our contact form or call us to schedule a site consultation for a free, no-obligation estimate.",
|
||||
},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/young-man-reading-book-park-summer-day_1253-1091.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
43
src/pages/HomePage/sections/Features.tsx
Normal file
43
src/pages/HomePage/sections/Features.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" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FeaturesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesDetailedSteps
|
||||
tag="Our Process"
|
||||
title="Simple Transformation Steps"
|
||||
description="We take the guesswork out of outdoor improvements with our streamlined four-stage project management approach."
|
||||
steps={[
|
||||
{
|
||||
tag: "01",
|
||||
title: "Free Consultation",
|
||||
subtitle: "Assess Needs",
|
||||
description: "We discuss your vision, budget, and project requirements on-site for a transparent estimate.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/father-son-together-tree-nursery-picking-plant_23-2148814060.jpg",
|
||||
},
|
||||
{
|
||||
tag: "02",
|
||||
title: "Custom Design",
|
||||
subtitle: "Plan Project",
|
||||
description: "Our team drafts a functional and aesthetic design tailored specifically to your landscape property.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/wide-angle-shot-gray-concrete-walkway-cloudy-sky_181624-16507.jpg",
|
||||
},
|
||||
{
|
||||
tag: "03",
|
||||
title: "Execution",
|
||||
subtitle: "Build Dream",
|
||||
description: "Our professional crews bring the plan to life with expert craftsmanship and high-quality materials.",
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/aerial-view-from-hong-kong_181624-34551.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
28
src/pages/HomePage/sections/Hero.tsx
Normal file
28
src/pages/HomePage/sections/Hero.tsx
Normal file
@@ -0,0 +1,28 @@
|
||||
// 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 HeroBillboard from '@/components/sections/hero/HeroBillboard';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function HeroSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="hero" data-section="hero">
|
||||
<SectionErrorBoundary name="hero">
|
||||
<HeroBillboard
|
||||
title="Transform Your Outdoor Space Into Something Extraordinary"
|
||||
description="Professional landscaping services built on quality craftsmanship, honest pricing, and proven customer satisfaction. Trusted by local homeowners and property managers throughout the region."
|
||||
primaryButton={{
|
||||
text: "Get Your Free Estimate",
|
||||
href: "#contact",
|
||||
}}
|
||||
secondaryButton={{
|
||||
text: "View Our Projects",
|
||||
href: "#features",
|
||||
}}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/view-tank-container-water-storage_23-2151748329.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
46
src/pages/HomePage/sections/Metrics.tsx
Normal file
46
src/pages/HomePage/sections/Metrics.tsx
Normal file
@@ -0,0 +1,46 @@
|
||||
// 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 Impact"
|
||||
title="Quality You Can See"
|
||||
description="We don't just landscape; we build trust one project at a time across our local community."
|
||||
metrics={[
|
||||
{
|
||||
value: "150+",
|
||||
title: "Projects Completed",
|
||||
features: [
|
||||
"Residential properties",
|
||||
"Commercial maintenance",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "10 Years",
|
||||
title: "Local Authority",
|
||||
features: [
|
||||
"Dedicated craftsmanship",
|
||||
"Expert knowledge",
|
||||
],
|
||||
},
|
||||
{
|
||||
value: "98%",
|
||||
title: "Satisfied Clients",
|
||||
features: [
|
||||
"On-time delivery",
|
||||
"Professional communication",
|
||||
],
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
37
src/pages/HomePage/sections/Pricing.tsx
Normal file
37
src/pages/HomePage/sections/Pricing.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 "pricing" section.
|
||||
|
||||
import React from 'react';
|
||||
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function PricingSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="pricing" data-section="pricing">
|
||||
<SectionErrorBoundary name="pricing">
|
||||
<PricingMediaCards
|
||||
tag="Transparent Pricing"
|
||||
title="Clear Investment Options"
|
||||
description="We believe in honest pricing for premium landscaping solutions to give you peace of mind."
|
||||
plans={[
|
||||
{
|
||||
tag: "Seasonal",
|
||||
price: "Custom",
|
||||
period: "/per service",
|
||||
features: [
|
||||
"Lawn care",
|
||||
"Weed control",
|
||||
"Garden bed maintenance",
|
||||
],
|
||||
primaryButton: {
|
||||
text: "Request Quote",
|
||||
href: "#contact",
|
||||
},
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/beach-sochi_181624-528.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 TestimonialRatingCards from '@/components/sections/testimonial/TestimonialRatingCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialRatingCards
|
||||
tag="Proven Trust"
|
||||
title="Hear From Local Homeowners"
|
||||
description="Quality is the cornerstone of Daniels Landscaping LLC, as reflected by our satisfied customer base."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Sarah Miller",
|
||||
role: "Homeowner",
|
||||
quote: "The team transformed our barren backyard into a luxury outdoor retreat on time and within budget.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/man-standing-garden-showing-ok-gesture-looking-camera_259150-59030.jpg",
|
||||
},
|
||||
{
|
||||
name: "David Thorne",
|
||||
role: "Property Manager",
|
||||
quote: "Reliable maintenance services every single time. Daniels is our go-to for commercial upkeep.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/women-taking-care-their-plants-greenhouse_23-2149037249.jpg",
|
||||
},
|
||||
{
|
||||
name: "Emily Chen",
|
||||
role: "Homeowner",
|
||||
quote: "Honest communication throughout the entire walkway project. Exceptional attention to detail.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/countryside-life-naature-close-up-outdoor-portrait-young-attractive-bearded-caucasian-man-blue-t-shirt-smiling_176420-19896.jpg",
|
||||
},
|
||||
{
|
||||
name: "Robert Voss",
|
||||
role: "Homeowner",
|
||||
quote: "Professional team, fair pricing, and stunning results. Highly recommend for any landscape needs.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/side-view-woman-holding-flowers_23-2149871129.jpg",
|
||||
},
|
||||
{
|
||||
name: "Lisa Garcia",
|
||||
role: "Property Owner",
|
||||
quote: "They made our landscape look better than ever! Worth every penny of our investment.",
|
||||
rating: 5,
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/young-lady-taking-care-plants-flowers-her-backyard-ready-start-online-business-consulting-greenhouse-care_197531-31039.jpg",
|
||||
},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user