4 Commits

Author SHA1 Message Date
kudinDmitriyUp
b4227ecc8b Bob AI: Add persistent mobile-friendly call-to-action bar 2026-07-03 14:30:24 +00:00
kudinDmitriyUp
500a55ab1d Bob AI: Add client logos strip below testimonials 2026-07-03 14:28:06 +00:00
kudinDmitriyUp
5ab8de0f02 Bob AI: Added a certifications logo strip below the hero section. 2026-07-03 14:23:16 +00:00
kudinDmitriyUp
ec4ed0681c Bob AI: Added FAQ section to address common customer inquiries. 2026-07-03 14:12:39 +00:00
13 changed files with 499 additions and 252 deletions

View File

@@ -1,264 +1,45 @@
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
import ContactCta from '@/components/sections/contact/ContactCta';
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import HeroBrand from '@/components/sections/hero/HeroBrand';
import MetricsSimpleCards from '@/components/sections/metrics/MetricsSimpleCards';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import TestimonialMarqueeOverlayCards from '@/components/sections/testimonial/TestimonialMarqueeOverlayCards';
import { Clock, Flame, Wheat } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
// AUTO-GENERATED shell by per-section-migrate.
// Section bodies live in the sibling sections/ folder (one file per section).
// Edit those section files directly. Non-block content (wrappers,
// non-inlinable sections) is preserved inline; extracted section blocks
// become component refs.
export default function HomePage() {
import React from 'react';
import HeroSection from './HomePage/sections/Hero';
import AboutSection from './HomePage/sections/About';
import ProcessSection from './HomePage/sections/Process';
import ProductsSection from './HomePage/sections/Products';
import MetricsSection from './HomePage/sections/Metrics';
import TestimonialsSection from './HomePage/sections/Testimonials';
import SocialProofSection from './HomePage/sections/SocialProof';
import ContactSection from './HomePage/sections/Contact';
import FaqSection from './HomePage/sections/Faq';
import CertificationsSection from './HomePage/sections/Certifications';
import ClientLogosSection from './HomePage/sections/ClientLogos';
import FloatingCtaSection from './HomePage/sections/FloatingCta';export default function HomePage(): React.JSX.Element {
return (
<>
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="True Artisanфывфывфывфывфывф Bread"
description="Hand-crafted, long-fermented sourdoughфывфвфывфывфы, baked fresh every morning in our small-batch kitchen."
primaryButton={{
text: "Explore Products",
href: "#products",
}}
secondaryButton={{
text: "Our Story",
href: "#about",
}}
imageSrc="https://pixabay.com/get/gc9cda3b557993f8f84f217018b313d79079b9cbda08468aba602468f6b2c48d5af66145b284eacfe5ddecce90c3d2e43d3ffd3cfd15eac296be8ef0a034f772a_1280.jpg?id=4155023"
textAnimation="fade"
/>
</SectionErrorBoundary>
</div>
<>
<HeroSection />
<CertificationsSection />
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutFeaturesSplit
tag="Our Craft"
title="Tradition iфывфывфывфывфывфn Every Loaf"
description="We believe in the power of patience. Our process respects time, resulting in bread that is easфывфывфывфывфывфывфывфывier to digest and far richer in flavor."
items={[
{
icon: Clock,
title: "48-Hour Fermentaфвфывфывфвфывфывфыtion",
description: "Extended proofing time for deep, complex sour notes.",
},
{
icon: Wheat,
title: "Heritage Grains",
description: "Sourced locally to support our farmers and flavor.",
},
{
icon: Flame,
title: "Stone Hearth Baked",
description: "Classic baking for the perfect, crackling crust.",
},
]}
imageSrc="https://images.pexels.com/photos/7965900/pexels-photo-7965900.jpeg?auto=compress&cs=tinysrgb&h=650&w=940"
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
<AboutSection />
<div id="process" data-section="process">
<SectionErrorBoundary name="process">
<FeaturesDetailedSteps
tag="The Process"
title="From Grain фывфывфывфывфывфвto Glory"
description="Witness the stages of transformation from simple flour to our signature golden crust."
steps={[
{
tag: "01",
title: "Mixing",
subtitle: "Natural Hydration",
description: "Combining pure spring water with our aged starter.",
imageSrc: "https://images.pexels.com/photos/10481791/pexels-photo-10481791.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
tag: "02",
title: "Fermentation",
subtitle: "Patience Matters",
description: "Resting for forty-eight hours to develop character.",
imageSrc: "https://images.pexels.com/photos/28907097/pexels-photo-28907097.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
tag: "03",
title: "Baking",
subtitle: "Heat & Steam",
description: "Finishing in our hand-built stone oven at peak temperature.",
imageSrc: "https://images.pexels.com/photos/6594899/pexels-photo-6594899.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
]}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
<ProcessSection />
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesRevealCardsBento
tag="Signature Loaves"
title="Our Daily Bakes"
description="Explore our rotation of sourdough and artisan creations."
items={[
{
title: "Classic Sourdough",
description: "Our signature country loaf.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/37888512/pexels-photo-37888512.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Heritage Rye",
description: "Earthy, robust, and full-bodied rye.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/11570705/pexels-photo-11570705.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Olive & Rosemary",
description: "Savory infusion with local herbs.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/30326084/pexels-photo-30326084.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Seeded Multigrain",
description: "Rich in texture and nutty flavor.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/30632198/pexels-photo-30632198.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Walnut & Cranberry",
description: "The perfect balance of tart and sweet.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/31922619/pexels-photo-31922619.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Rustic Baguette",
description: "Crispy thin crust with airy center.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/30826792/pexels-photo-30826792.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Focaccia",
description: "Soft, pillowy, and olive-oil rich.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/6937426/pexels-photo-6937426.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
]}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
<ProductsSection />
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsSimpleCards
tag="Our Impact"
title="Baking Stats"
description="Numbers behind our sourdough devotion."
metrics={[
{
value: "100%",
description: "Natural ingredients only",
},
{
value: "48hrs",
description: "Proofing duration per batch",
},
{
value: "500+",
description: "Loaves baked weekly",
},
]}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
<MetricsSection />
<div id="testimonials" data-section="testimonials">
<SectionErrorBoundary name="testimonials">
<TestimonialMarqueeOverlayCards
tag="Testimonials"
title="Loved by Locals"
description="See why our neighbors make us part of their daily routine."
testimonials={[
{
name: "Claire Miller",
role: "Food Blogger",
company: "EatLocal",
rating: 5,
imageSrc: "https://images.pexels.com/photos/16771767/pexels-photo-16771767.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "John Doe",
role: "Local Resident",
company: "Neighbor",
rating: 5,
imageSrc: "https://images.pexels.com/photos/34699447/pexels-photo-34699447.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "Sarah Smith",
role: "Chef",
company: "Bistro",
rating: 5,
imageSrc: "https://images.pexels.com/photos/8429811/pexels-photo-8429811.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "Mike Ross",
role: "Teacher",
company: "Public School",
rating: 5,
imageSrc: "https://images.pexels.com/photos/6563916/pexels-photo-6563916.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "Jane Wilson",
role: "Designer",
company: "Studio",
rating: 5,
imageSrc: "https://images.pexels.com/photos/24863757/pexels-photo-24863757.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
]}
textAnimation="fade"
/>
</SectionErrorBoundary>
</div>
<TestimonialsSection />
<ClientLogosSection />
<div id="social-proof" data-section="social-proof">
<SectionErrorBoundary name="social-proof">
<SocialProofMarquee
tag="As Featured In"
title="Press & Community"
description="Recognition for our dedication to artisan baking."
names={[
"City Food Weekly",
"Artisan Monthly",
"The Daily Crust",
"Bakery Excellence",
"Local Eats Guide",
"Sourdough Today",
"Grain & Hearth",
]}
textAnimation="fade"
/>
</SectionErrorBoundary>
</div>
<SocialProofSection />
<FaqSection />
<div id="contact" data-section="contact">
<SectionErrorBoundary name="contact">
<ContactCta
tag="Visit Us"
text="Ready to taste the difference? Stop by our bakery or pre-order online for the freshest loaves."
primaryButton={{
text: "Visit Our Shop",
href: "#",
}}
secondaryButton={{
text: "Call to Order",
href: "#",
}}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
<ContactSection />
<FloatingCtaSection />
</>
);
}

View File

@@ -0,0 +1,40 @@
// 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 AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
import { Clock, Flame, Wheat } from "lucide-react";
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function AboutSection(): React.JSX.Element {
return (
<div id="about" data-section="about">
<SectionErrorBoundary name="about">
<AboutFeaturesSplit
tag="Our Craft"
title="Tradition iфывфывфывфывфывфn Every Loaf"
description="We believe in the power of patience. Our process respects time, resulting in bread that is easфывфывфывфывфывфывфывфывier to digest and far richer in flavor."
items={[
{
icon: Clock,
title: "48-Hour Fermentaфвфывфывфвфывфывфыtion",
description: "Extended proofing time for deep, complex sour notes.",
},
{
icon: Wheat,
title: "Heritage Grains",
description: "Sourced locally to support our farmers and flavor.",
},
{
icon: Flame,
title: "Stone Hearth Baked",
description: "Classic baking for the perfect, crackling crust.",
},
]}
imageSrc="https://images.pexels.com/photos/7965900/pexels-photo-7965900.jpeg?auto=compress&cs=tinysrgb&h=650&w=940"
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,35 @@
import LoopCarousel from '@/components/ui/LoopCarousel';
import { ShieldCheck, Award, Leaf, CheckCircle, Star } from 'lucide-react';
export default function CertificationsSection() {
return (
<section data-webild-section="certifications" id="certifications" className="w-full py-8 bg-background border-b border-border/10">
<div className="w-content-width mx-auto">
<LoopCarousel>
<div className="flex items-center gap-12 py-4">
<div className="flex items-center gap-2 text-accent opacity-70 hover:opacity-100 transition-opacity">
<ShieldCheck className="w-6 h-6" />
<span className="font-medium text-sm uppercase tracking-wider">Food Safety Certified</span>
</div>
<div className="flex items-center gap-2 text-accent opacity-70 hover:opacity-100 transition-opacity">
<Leaf className="w-6 h-6" />
<span className="font-medium text-sm uppercase tracking-wider">100% Organic Grains</span>
</div>
<div className="flex items-center gap-2 text-accent opacity-70 hover:opacity-100 transition-opacity">
<Award className="w-6 h-6" />
<span className="font-medium text-sm uppercase tracking-wider">Artisan Bakers Guild</span>
</div>
<div className="flex items-center gap-2 text-accent opacity-70 hover:opacity-100 transition-opacity">
<CheckCircle className="w-6 h-6" />
<span className="font-medium text-sm uppercase tracking-wider">Non-GMO Verified</span>
</div>
<div className="flex items-center gap-2 text-accent opacity-70 hover:opacity-100 transition-opacity">
<Star className="w-6 h-6" />
<span className="font-medium text-sm uppercase tracking-wider">Top Rated Bakery 2024</span>
</div>
</div>
</LoopCarousel>
</div>
</section>
);
}

View File

@@ -0,0 +1,36 @@
import React from 'react';
import LoopCarousel from '@/components/ui/LoopCarousel';
export default function ClientLogosSection() {
return (
<div data-webild-section="client-logos" id="client-logos">
<section className="w-full py-16 bg-background border-t border-black/5 dark:border-white/5">
<div className="w-content-width mx-auto flex flex-col items-center">
<p className="text-sm font-medium text-accent mb-10 uppercase tracking-widest text-center">
Proudly serving top restaurants & cafes
</p>
<div className="w-full overflow-hidden" style={{ maskImage: 'linear-gradient(to right, transparent, black 10%, black 90%, transparent)', WebkitMaskImage: 'linear-gradient(to right, transparent, black 10%, black 90%, transparent)' }}>
<LoopCarousel>
<div className="flex items-center gap-16 md:gap-24 px-8">
{[
"The French Laundry",
"Balthazar",
"Tartine Bakery",
"Blue Hill",
"Le Bernardin",
"Eleven Madison Park",
"Alinea",
"Per Se"
].map((partner, i) => (
<span key={i} className="text-xl md:text-2xl font-bold text-foreground/30 whitespace-nowrap hover:text-foreground/80 transition-colors duration-300">
{partner}
</span>
))}
</div>
</LoopCarousel>
</div>
</div>
</section>
</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 "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="Visit Us"
text="Ready to taste the difference? Stop by our bakery or pre-order online for the freshest loaves."
primaryButton={{
text: "Visit Our Shop",
href: "#",
}}
secondaryButton={{
text: "Call to Order",
href: "#",
}}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,51 @@
import Accordion from '@/components/ui/Accordion';
import TextAnimation from '@/components/ui/TextAnimation';
import Tag from '@/components/ui/Tag';
import ScrollReveal from '@/components/ui/ScrollReveal';
export default function FaqSection() {
return (
<section data-webild-section="faq" id="faq" className="relative w-full py-24 bg-background">
<div className="w-content-width mx-auto">
<div className="flex flex-col items-center text-center mb-16">
<ScrollReveal variant="fade">
<Tag text="FAQ" className="mb-6" />
</ScrollReveal>
<TextAnimation
text="Frequently Asked Questions"
variant="fade-blur"
tag="h2"
className="text-4xl md:text-5xl font-bold text-foreground mb-6"
gradientText={false}
/>
<ScrollReveal variant="fade" delay={0.2}>
<p className="text-lg text-accent max-w-2xl mx-auto">
Everything you need to know about our artisan bread, from storage tips to pickup details.
</p>
</ScrollReveal>
</div>
<ScrollReveal variant="fade" delay={0.3} className="max-w-3xl mx-auto">
<Accordion items={[
{
title: "How long does your bread stay fresh?",
content: "Our sourdough loaves are best enjoyed within 3-4 days. To maximize freshness, store them at room temperature in a paper bag or bread box. For longer storage, you can slice and freeze the loaf for up to 3 months."
},
{
title: "Do you offer gluten-free or vegan options?",
content: "All of our traditional sourdough breads are naturally vegan. While we use heritage grains that some find easier to digest, our bakery processes wheat, so we cannot guarantee a 100% gluten-free environment for those with celiac disease."
},
{
title: "What are your pickup policies and windows?",
content: "Pre-orders can be picked up at our bakery window between 8 AM and 2 PM, Tuesday through Saturday. Please bring your order confirmation. If you're running late, just give us a call and we'll hold your order until closing."
},
{
title: "How far in advance do I need to pre-order?",
content: "Because our sourdough undergoes a 48-hour fermentation process, we require all pre-orders to be placed at least two days in advance. This ensures we have enough time to craft your bread to perfection."
}
]} />
</ScrollReveal>
</div>
</section>
);
}

View File

@@ -0,0 +1,15 @@
import Button from "@/components/ui/Button";
export default function FloatingCta() {
return (
<div data-webild-section="floating-cta" className="fixed bottom-4 left-1/2 -translate-x-1/2 w-[calc(100%-2rem)] max-w-md z-50 pointer-events-none">
<div className="card pointer-events-auto w-full p-4 flex items-center justify-between gap-4 shadow-2xl rounded-xl border border-black/5">
<div className="flex flex-col">
<span className="text-sm font-bold text-foreground">Ready to order?</span>
<span className="text-xs text-accent">Get in touch today</span>
</div>
<Button text="Contact Us" variant="primary" href="#contact" />
</div>
</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 HeroBrand from '@/components/sections/hero/HeroBrand';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function HeroSection(): React.JSX.Element {
return (
<div id="hero" data-section="hero">
<SectionErrorBoundary name="hero">
<HeroBrand
brand="True Artisanфывфывфывфывфывф Bread"
description="Hand-crafted, long-fermented sourdoughфывфвфывфывфы, baked fresh every morning in our small-batch kitchen."
primaryButton={{
text: "Explore Products",
href: "#products",
}}
secondaryButton={{
text: "Our Story",
href: "#about",
}}
imageSrc="https://pixabay.com/get/gc9cda3b557993f8f84f217018b313d79079b9cbda08468aba602468f6b2c48d5af66145b284eacfe5ddecce90c3d2e43d3ffd3cfd15eac296be8ef0a034f772a_1280.jpg?id=4155023"
textAnimation="fade"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,35 @@
// 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 MetricsSimpleCards from '@/components/sections/metrics/MetricsSimpleCards';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function MetricsSection(): React.JSX.Element {
return (
<div id="metrics" data-section="metrics">
<SectionErrorBoundary name="metrics">
<MetricsSimpleCards
tag="Our Impact"
title="Baking Stats"
description="Numbers behind our sourdough devotion."
metrics={[
{
value: "100%",
description: "Natural ingredients only",
},
{
value: "48hrs",
description: "Proofing duration per batch",
},
{
value: "500+",
description: "Loaves baked weekly",
},
]}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,44 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "process" section.
import React from 'react';
import FeaturesDetailedSteps from '@/components/sections/features/FeaturesDetailedSteps';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ProcessSection(): React.JSX.Element {
return (
<div id="process" data-section="process">
<SectionErrorBoundary name="process">
<FeaturesDetailedSteps
tag="The Process"
title="From Grain фывфывфывфывфывфвto Glory"
description="Witness the stages of transformation from simple flour to our signature golden crust."
steps={[
{
tag: "01",
title: "Mixing",
subtitle: "Natural Hydration",
description: "Combining pure spring water with our aged starter.",
imageSrc: "https://images.pexels.com/photos/10481791/pexels-photo-10481791.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
tag: "02",
title: "Fermentation",
subtitle: "Patience Matters",
description: "Resting for forty-eight hours to develop character.",
imageSrc: "https://images.pexels.com/photos/28907097/pexels-photo-28907097.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
tag: "03",
title: "Baking",
subtitle: "Heat & Steam",
description: "Finishing in our hand-built stone oven at peak temperature.",
imageSrc: "https://images.pexels.com/photos/6594899/pexels-photo-6594899.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
]}
textAnimation="slide-up"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,65 @@
// AUTO-GENERATED by per-section-migrate. Edit freely — Bob will treat this
// file as the canonical source for the "products" section.
import React from 'react';
import FeaturesRevealCardsBento from '@/components/sections/features/FeaturesRevealCardsBento';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function ProductsSection(): React.JSX.Element {
return (
<div id="products" data-section="products">
<SectionErrorBoundary name="products">
<FeaturesRevealCardsBento
tag="Signature Loaves"
title="Our Daily Bakes"
description="Explore our rotation of sourdough and artisan creations."
items={[
{
title: "Classic Sourdough",
description: "Our signature country loaf.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/37888512/pexels-photo-37888512.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Heritage Rye",
description: "Earthy, robust, and full-bodied rye.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/11570705/pexels-photo-11570705.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Olive & Rosemary",
description: "Savory infusion with local herbs.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/30326084/pexels-photo-30326084.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Seeded Multigrain",
description: "Rich in texture and nutty flavor.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/30632198/pexels-photo-30632198.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Walnut & Cranberry",
description: "The perfect balance of tart and sweet.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/31922619/pexels-photo-31922619.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Rustic Baguette",
description: "Crispy thin crust with airy center.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/30826792/pexels-photo-30826792.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
title: "Focaccia",
description: "Soft, pillowy, and olive-oil rich.",
href: "#contact",
imageSrc: "https://images.pexels.com/photos/6937426/pexels-photo-6937426.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
]}
textAnimation="slide-up"
/>
</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 "social-proof" section.
import React from 'react';
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
export default function SocialProofSection(): React.JSX.Element {
return (
<div id="social-proof" data-section="social-proof">
<SectionErrorBoundary name="social-proof">
<SocialProofMarquee
tag="As Featured In"
title="Press & Community"
description="Recognition for our dedication to artisan baking."
names={[
"City Food Weekly",
"Artisan Monthly",
"The Daily Crust",
"Bakery Excellence",
"Local Eats Guide",
"Sourdough Today",
"Grain & Hearth",
]}
textAnimation="fade"
/>
</SectionErrorBoundary>
</div>
);
}

View File

@@ -0,0 +1,58 @@
// 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="Testimonials"
title="Loved by Locals"
description="See why our neighbors make us part of their daily routine."
testimonials={[
{
name: "Claire Miller",
role: "Food Blogger",
company: "EatLocal",
rating: 5,
imageSrc: "https://images.pexels.com/photos/16771767/pexels-photo-16771767.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "John Doe",
role: "Local Resident",
company: "Neighbor",
rating: 5,
imageSrc: "https://images.pexels.com/photos/34699447/pexels-photo-34699447.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "Sarah Smith",
role: "Chef",
company: "Bistro",
rating: 5,
imageSrc: "https://images.pexels.com/photos/8429811/pexels-photo-8429811.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "Mike Ross",
role: "Teacher",
company: "Public School",
rating: 5,
imageSrc: "https://images.pexels.com/photos/6563916/pexels-photo-6563916.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
{
name: "Jane Wilson",
role: "Designer",
company: "Studio",
rating: 5,
imageSrc: "https://images.pexels.com/photos/24863757/pexels-photo-24863757.jpeg?auto=compress&cs=tinysrgb&h=650&w=940",
},
]}
textAnimation="fade"
/>
</SectionErrorBoundary>
</div>
);
}