Merge version_2_1782192209606 into main #3

Merged
bender merged 1 commits from version_2_1782192209606 into main 2026-06-23 05:25:10 +00:00
10 changed files with 302 additions and 158 deletions

View File

@@ -1,170 +1,38 @@
import AboutText from '@/components/sections/about/AboutText';
import ContactCta from '@/components/sections/contact/ContactCta';
import FaqSimple from '@/components/sections/faq/FaqSimple';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import HeroCenteredLogos from '@/components/sections/hero/HeroCenteredLogos';
import PricingMediaCards from '@/components/sections/pricing/PricingMediaCards';
import TeamListCards from '@/components/sections/team/TeamListCards';
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 FloralSection from './HomePage/sections/Floral';
import PricingSection from './HomePage/sections/Pricing';
import TeamSection from './HomePage/sections/Team';
import TestimonialsSection from './HomePage/sections/Testimonials';
import FaqSection from './HomePage/sections/Faq';
import ContactSection from './HomePage/sections/Contact';
import TrustBannerSection from './HomePage/sections/TrustBanner';export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroCenteredLogos
avatarsSrc={[
"http://img.b2bpic.net/free-photo/young-woman-with-afro-haircut-receiving-bouquet-flowers_273609-21737.jpg", "http://img.b2bpic.net/free-photo/charming-florist-talking-smartphone_23-2147762195.jpg", "http://img.b2bpic.net/free-photo/woman-making-beautiful-floral-bouquet_23-2148846519.jpg", "http://img.b2bpic.net/free-photo/top-view-colorful-flowers-with-copy-space_23-2148823710.jpg"]}
avatarText="Loved by floral enthusiasts"
title="Bringing Nature's Elegance to Your Moments"
description="Handcrafted floral designs curated with passion, designed to make every occasion feel truly unforgettable."
primaryButton={{
text: "Explore Collection", href: "#floral"}}
secondaryButton={{
text: "Book Consultation", href: "#contact"}}
names={[
"Savi", "The Team", "Artisans", "Partners"]}
imageSrc="http://img.b2bpic.net/free-photo/front-view-woman-with-dried-plants_23-2149513666.jpg"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<TrustBannerSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutText
title="At Petals With Savi, we believe every flower tells a story. Our passion for botany and design meets artistic creativity to create arrangements that are as unique as the memories they celebrate."
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="floral" data-section="floral">
<SectionErrorBoundary name="floral">
<FeaturesRevealCardsBento
tag="Collection"
title="Handcrafted Floral Arrangements"
description="Explore our curated designs for every occasion, from intimate gifts to grand celebrations."
items={[
{
title: "Classic Roses", description: "Timeless elegance for every romantic gesture.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/furoshiki-packages-arrangement-still-life_23-2150642989.jpg"},
{
title: "Peony Dreams", description: "Soft and lush blooms that captivate hearts.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/beautiful-colorful-rose-flower-wicker-basket-blue_114579-82665.jpg"},
{
title: "Wedding Grace", description: "Bespoke arrangements for your special day.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/aesthetic-background-trippy-beige-buttercup-flower_53876-128682.jpg"},
{
title: "Seasonal Joy", description: "Fresh picks from the changing seasons.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/flower-composition-bucket-roses-chrysanthemum-side-view_141793-4420.jpg"},
{
title: "Lilies of Love", description: "Pure beauty that defines grace.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/woman-making-pretty-floral-arrangement_23-2148846540.jpg"},
{
title: "Wild Meadows", description: "Bohemian style for free spirits.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/elegant-couple-spend-time-restaurant_1157-20498.jpg"},
{
title: "Sunny Sunflowers", description: "Bright and cheerful to warm the space.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/close-up-dark-pink-dahlia-flower_84443-94362.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<FloralSection />
<div id="pricing" data-section="pricing">
<SectionErrorBoundary name="pricing">
<PricingMediaCards
tag="Pricing"
title="Transparent Floral Services"
description="Flexible plans to suit your needs, from weekly subscriptions to custom event designs."
plans={[
{
tag: "Essential", price: "$55", period: "/ delivery", features: [
"Hand-picked stems", "Local delivery", "Care instructions"],
primaryButton: {
text: "Select", href: "#contact"},
imageSrc: "http://img.b2bpic.net/free-photo/shy-toddler-holding-flower-copy-space_23-2148442474.jpg"},
{
tag: "Premium", price: "$120", period: "/ design", features: [
"Bespoke design", "Premium flowers", "Priority delivery", "Gift note included"],
primaryButton: {
text: "Select", href: "#contact"},
imageSrc: "http://img.b2bpic.net/free-photo/top-view-dark-blue-flowers-white-colored-water_23-2148256399.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<PricingSection />
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamListCards
tag="Meet the Artists"
title="The Hands Behind the Petals"
description="Meet our dedicated team of floral artisans committed to creating beauty."
groups={[
{
title: "Our Studio Team", members: [
{
name: "Savi", role: "Lead Florist", detail: "Creative director with 10+ years of botanical design.", imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-typing-something-tablet_23-2148377281.jpg"},
{
name: "Alex", role: "Floral Specialist", detail: "Expert in sustainable sourcing and care.", imageSrc: "http://img.b2bpic.net/free-photo/roses-bouquet_23-2148013609.jpg"},
],
},
]}
/>
</SectionErrorBoundary>
</div>
<TeamSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Reviews"
title="What Our Clients Say"
description="Stories from people who have experienced the magic of our arrangements."
testimonials={[
{
name: "Sarah J.", role: "Bride", company: "Happy Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/pleased-romantic-woman-gets-beautiful-bouquet-as-present-closes-eyes-smiles-gently-dressed-pink-jacket_273609-43435.jpg"},
{
name: "Michael D.", role: "Gift Giver", company: "Frequent Buyer", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-people-celebrating-mother-s-day_23-2151207241.jpg"},
{
name: "Elena R.", role: "Event Planner", company: "Industry Pro", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-holding-flowers_23-2149326532.jpg"},
{
name: "Tom B.", role: "Subscriber", company: "Home Decor", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-african-female-florist-smiling-cutting-stems-working-flower-shop-white-wall_176420-12231.jpg"},
{
name: "Lisa K.", role: "Wedding Client", company: "Happy Bride", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-couple-celebrating-engagement_23-2149401307.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="Support"
title="Frequently Asked Questions"
description="Everything you need to know about our services and delivery options."
items={[
{
question: "Do you deliver locally?", answer: "Yes, we offer same-day delivery within a 15-mile radius of our studio."},
{
question: "Can I request custom arrangements?", answer: "Absolutely! Contact us for bespoke requests and personalized designs."},
{
question: "How long do the flowers last?", answer: "With proper care, our arrangements typically last 57 days."},
]}
/>
</SectionErrorBoundary>
</div>
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Let's Connect"
text="Ready to bring beauty into your space? Reach out for orders or consultations."
primaryButton={{
text: "Contact Us", href: "mailto:savi@petalswithsavi.com"}}
secondaryButton={{
text: "Call Now", href: "tel:+1555555555"}}
/>
</SectionErrorBoundary>
</div>
<ContactSection />
</>
);
}

View File

@@ -0,0 +1,18 @@
// 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 AboutText from '@/components/sections/about/AboutText';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutText
title="At Petals With Savi, we believe every flower tells a story. Our passion for botany and design meets artistic creativity to create arrangements that are as unique as the memories they celebrate."
/>
</SectionErrorBoundary>
</div>
);
}

View 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="Let's Connect"
text="Ready to bring beauty into your space? Reach out for orders or consultations."
primaryButton={{
text: "Contact Us", href: "mailto:savi@petalswithsavi.com"}}
secondaryButton={{
text: "Call Now", href: "tel:+1555555555"}}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,28 @@
// 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 FaqSimple from '@/components/sections/faq/FaqSimple';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FaqSection(): React.JSX.Element {
return (
<div id="faq" data-section="faq">
<SectionErrorBoundary name="faq">
<FaqSimple
tag="Support"
title="Frequently Asked Questions"
description="Everything you need to know about our services and delivery options."
items={[
{
question: "Do you deliver locally?", answer: "Yes, we offer same-day delivery within a 15-mile radius of our studio."},
{
question: "Can I request custom arrangements?", answer: "Absolutely! Contact us for bespoke requests and personalized designs."},
{
question: "How long do the flowers last?", answer: "With proper care, our arrangements typically last 57 days."},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,36 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "floral" section.
import React from 'react';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function FloralSection(): React.JSX.Element {
return (
<div id="floral" data-section="floral">
<SectionErrorBoundary name="floral">
<FeaturesRevealCardsBento
tag="Collection"
title="Handcrafted Floral Arrangements"
description="Explore our curated designs for every occasion, from intimate gifts to grand celebrations."
items={[
{
title: "Classic Roses", description: "Timeless elegance for every romantic gesture.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/furoshiki-packages-arrangement-still-life_23-2150642989.jpg"},
{
title: "Peony Dreams", description: "Soft and lush blooms that captivate hearts.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/beautiful-colorful-rose-flower-wicker-basket-blue_114579-82665.jpg"},
{
title: "Wedding Grace", description: "Bespoke arrangements for your special day.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/aesthetic-background-trippy-beige-buttercup-flower_53876-128682.jpg"},
{
title: "Seasonal Joy", description: "Fresh picks from the changing seasons.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/flower-composition-bucket-roses-chrysanthemum-side-view_141793-4420.jpg"},
{
title: "Lilies of Love", description: "Pure beauty that defines grace.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/woman-making-pretty-floral-arrangement_23-2148846540.jpg"},
{
title: "Wild Meadows", description: "Bohemian style for free spirits.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/elegant-couple-spend-time-restaurant_1157-20498.jpg"},
{
title: "Sunny Sunflowers", description: "Bright and cheerful to warm the space.", href: "#", imageSrc: "http://img.b2bpic.net/free-photo/close-up-dark-pink-dahlia-flower_84443-94362.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,29 @@
// 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 HeroCenteredLogos from '@/components/sections/hero/HeroCenteredLogos';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroCenteredLogos
avatarsSrc={[
"http://img.b2bpic.net/free-photo/young-woman-with-afro-haircut-receiving-bouquet-flowers_273609-21737.jpg", "http://img.b2bpic.net/free-photo/charming-florist-talking-smartphone_23-2147762195.jpg", "http://img.b2bpic.net/free-photo/woman-making-beautiful-floral-bouquet_23-2148846519.jpg", "http://img.b2bpic.net/free-photo/top-view-colorful-flowers-with-copy-space_23-2148823710.jpg"]}
avatarText="Loved by floral enthusiasts"
title="Bringing Nature's Elegance to Your Moments"
description="Handcrafted floral designs curated with passion, designed to make every occasion feel truly unforgettable."
primaryButton={{
text: "Explore Collection", href: "#floral"}}
secondaryButton={{
text: "Book Consultation", href: "#contact"}}
names={[
"Savi", "The Team", "Artisans", "Partners"]}
imageSrc="http://img.b2bpic.net/free-photo/front-view-woman-with-dried-plants_23-2149513666.jpg"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,34 @@
// 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="Pricing"
title="Transparent Floral Services"
description="Flexible plans to suit your needs, from weekly subscriptions to custom event designs."
plans={[
{
tag: "Essential", price: "$55", period: "/ delivery", features: [
"Hand-picked stems", "Local delivery", "Care instructions"],
primaryButton: {
text: "Select", href: "#contact"},
imageSrc: "http://img.b2bpic.net/free-photo/shy-toddler-holding-flower-copy-space_23-2148442474.jpg"},
{
tag: "Premium", price: "$120", period: "/ design", features: [
"Bespoke design", "Premium flowers", "Priority delivery", "Gift note included"],
primaryButton: {
text: "Select", href: "#contact"},
imageSrc: "http://img.b2bpic.net/free-photo/top-view-dark-blue-flowers-white-colored-water_23-2148256399.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,30 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "team" section.
import React from 'react';
import TeamListCards from '@/components/sections/team/TeamListCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function TeamSection(): React.JSX.Element {
return (
<div id="team" data-section="team">
<SectionErrorBoundary name="team">
<TeamListCards
tag="Meet the Artists"
title="The Hands Behind the Petals"
description="Meet our dedicated team of floral artisans committed to creating beauty."
groups={[
{
title: "Our Studio Team", members: [
{
name: "Savi", role: "Lead Florist", detail: "Creative director with 10+ years of botanical design.", imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-typing-something-tablet_23-2148377281.jpg"},
{
name: "Alex", role: "Floral Specialist", detail: "Expert in sustainable sourcing and care.", imageSrc: "http://img.b2bpic.net/free-photo/roses-bouquet_23-2148013609.jpg"},
],
},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View 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="Reviews"
title="What Our Clients Say"
description="Stories from people who have experienced the magic of our arrangements."
testimonials={[
{
name: "Sarah J.", role: "Bride", company: "Happy Client", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/pleased-romantic-woman-gets-beautiful-bouquet-as-present-closes-eyes-smiles-gently-dressed-pink-jacket_273609-43435.jpg"},
{
name: "Michael D.", role: "Gift Giver", company: "Frequent Buyer", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-people-celebrating-mother-s-day_23-2151207241.jpg"},
{
name: "Elena R.", role: "Event Planner", company: "Industry Pro", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/medium-shot-woman-holding-flowers_23-2149326532.jpg"},
{
name: "Tom B.", role: "Subscriber", company: "Home Decor", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/beautiful-african-female-florist-smiling-cutting-stems-working-flower-shop-white-wall_176420-12231.jpg"},
{
name: "Lisa K.", role: "Wedding Client", company: "Happy Bride", rating: 5,
imageSrc: "http://img.b2bpic.net/free-photo/young-couple-celebrating-engagement_23-2149401307.jpg"},
]}
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,41 @@
import { Leaf, Globe, Truck } from "lucide-react";
import ScrollReveal from "@/components/ui/ScrollReveal";
import TextAnimation from "@/components/ui/TextAnimation";
export default function TrustBanner() {
const features = [
{
icon: Leaf,
title: "Freshness Guaranteed",
description: "Our flowers are hand-picked daily to ensure maximum freshness and longevity."
},
{
icon: Globe,
title: "Sustainably Sourced",
description: "We partner with eco-conscious farms that prioritize sustainable growing practices."
},
{
icon: Truck,
title: "Same-Day Delivery",
description: "Need it now? We offer reliable same-day delivery for those last-minute surprises."
}
];
return (
<section data-webild-section="trust-banner" id="trust-banner" className="relative w-full py-16 bg-background">
<div className="w-content-width mx-auto">
<div className="grid grid-cols-1 md:grid-cols-3 gap-8">
{features.map((feature, index) => (
<ScrollReveal variant="fade" key={index} delay={index * 0.1} className="flex flex-col items-center text-center p-6 card rounded-lg">
<div className="w-12 h-12 rounded-full bg-background-accent/10 flex items-center justify-center mb-4 text-accent">
<feature.icon className="w-6 h-6" />
</div>
<h3 className="text-xl font-semibold text-foreground mb-2">{feature.title}</h3>
<p className="text-accent">{feature.description}</p>
</ScrollReveal>
))}
</div>
</div>
</section>
);
}