Compare commits
5 Commits
version_1_
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| ad15ea2d4a | |||
|
|
b6a6853fbd | ||
| 4fc97f34ce | |||
| b9b38668ec | |||
| 00e20ce60e |
@@ -42,7 +42,7 @@ export default function Layout() {
|
||||
<SiteBackgroundSlot />
|
||||
<SectionErrorBoundary name="navbar">
|
||||
<NavbarDropdown
|
||||
logo="Dirty Bean"
|
||||
logo={<span className="font-mono text-red-600 font-bold tracking-widest" style={{ textShadow: "0 0 5px red, 0 0 10px red" }}>Dirty Beans</span>}
|
||||
ctaButton={{
|
||||
text: "Order Now",
|
||||
href: "#contact",
|
||||
@@ -54,7 +54,7 @@ export default function Layout() {
|
||||
</main>
|
||||
<SectionErrorBoundary name="footer">
|
||||
<FooterSimple
|
||||
brand="Dirty Bean"
|
||||
brand={<span className="font-mono text-red-600 font-bold tracking-widest" style={{ textShadow: "0 0 5px red, 0 0 10px red" }}>Dirty Beans</span>}
|
||||
columns={[
|
||||
{
|
||||
title: "Company",
|
||||
|
||||
@@ -5,10 +5,10 @@
|
||||
|
||||
:root {
|
||||
/* @colorThemes/lightTheme/grayNavyBlue */
|
||||
--background: #f6f0e9;
|
||||
--card: #efe7dd;
|
||||
--foreground: #2b180a;
|
||||
--primary-cta: #2b180a;
|
||||
--background: #ffffff;
|
||||
--card: #f3e5f5;
|
||||
--foreground: #4a148c;
|
||||
--primary-cta: #d50000;
|
||||
--primary-cta-text: #f6f0e9;
|
||||
--secondary-cta: #efe7dd;
|
||||
--secondary-cta-text: #2b180a;
|
||||
|
||||
@@ -1,184 +1,36 @@
|
||||
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
import ContactCta from '@/components/sections/contact/ContactCta';
|
||||
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import FeaturesBento from '@/components/sections/features/FeaturesBento';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import HeroCenteredLogos from '@/components/sections/hero/HeroCenteredLogos';
|
||||
import SocialProofMarquee from '@/components/sections/social-proof/SocialProofMarquee';
|
||||
import TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
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 MenuSection from './HomePage/sections/Menu';
|
||||
import TestimonialsSection from './HomePage/sections/Testimonials';
|
||||
import SocialSection from './HomePage/sections/Social';
|
||||
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">
|
||||
<HeroCenteredLogos
|
||||
avatarsSrc={[
|
||||
"http://img.b2bpic.net/free-photo/portrait-happy-young-woman-starts-her-morning-with-mug-coffee-drinking-tea-from-cup-standing_1258-193497.jpg", "http://img.b2bpic.net/free-photo/stylish-smiling-young-woman-sitting-sofa-talking-mobile-phone-restaurant_23-2147974688.jpg", "http://img.b2bpic.net/free-photo/amazing-young-lady-talking-by-phone_171337-4148.jpg", "http://img.b2bpic.net/free-photo/person-paying-bill-restaurant-using-nfc-technology_23-2150039413.jpg"]}
|
||||
avatarText="Join our community of coffee lovers."
|
||||
title="Roasted for the bold."
|
||||
description="Artisanal beans, expertly sourced and roasted right here at Dirty Bean. Elevate your daily ritual."
|
||||
primaryButton={{
|
||||
text: "Shop Beans", href: "#menu"}}
|
||||
secondaryButton={{
|
||||
text: "Visit Shop", href: "#about"}}
|
||||
names={[
|
||||
"The Daily Grind", "Bean Enthusiasts", "Artisan Coffee Group", "Morning Rituals"]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/barista-work-coffee-shop_158595-2333.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<>
|
||||
<HeroSection />
|
||||
|
||||
<div id="about" data-section="about">
|
||||
<SectionErrorBoundary name="about">
|
||||
<AboutFeaturesSplit
|
||||
tag="Our Story"
|
||||
title="Freshness in every bean."
|
||||
description="Dirty Bean was founded on a simple premise: great coffee shouldn't be complicated, just excellent. We source our beans ethically, roast them in small batches, and pour our passion into every cup."
|
||||
items={[
|
||||
{
|
||||
icon: "Coffee", title: "Ethical Sourcing", description: "We partner with local farmers directly."},
|
||||
{
|
||||
icon: "Flame", title: "Small Batch Roast", description: "Roasted daily for maximum freshness."},
|
||||
{
|
||||
icon: "Award", title: "Expert Quality", description: "Crafted by award-winning baristas."},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/front-view-male-barista-using-professional-coffee-machine-cup_23-2148824392.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<AboutSection />
|
||||
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesBento
|
||||
tag="Why Us"
|
||||
title="Experience the difference."
|
||||
description="Our meticulous process ensures quality from the farm to your cup."
|
||||
features={[
|
||||
{
|
||||
title: "Precision Roasting", description: "Computers track heat curves for consistency.", bentoComponent: "media-stack", mediaItems: [
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/tattooed-barista-holds-blank-package-bags-with-freshly-baked-coffee-beans-ready-sale-delivery_346278-405.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/view-process-making-pressed-coffee_23-2149709945.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-sustainably-produced-alcoholic-beverage_23-2150162981.jpg"},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Community Focus", description: "A hub for locals and visitors alike.", bentoComponent: "orbiting-icons", centerIcon: "Coffee", orbitIcons: [
|
||||
"Users", "Heart", "Music", "Wifi"],
|
||||
},
|
||||
{
|
||||
title: "Freshness Guarantee", description: "If it isn't fresh, we don't serve it.", bentoComponent: "chat-marquee", aiIcon: "Coffee", userIcon: "User", exchanges: [
|
||||
{
|
||||
userMessage: "Is this fresh?", aiResponse: "Roasted just yesterday!"},
|
||||
],
|
||||
placeholder: "Ask our barista..."},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FeaturesSection />
|
||||
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesImageBento
|
||||
tag="Menu"
|
||||
title="Our Signature Blends"
|
||||
description="From single-origin pours to decadent lattes."
|
||||
items={[
|
||||
{
|
||||
title: "House Roast", description: "A classic smooth blend.", imageSrc: "http://img.b2bpic.net/free-photo/roasted-beans-tasteful-coffee-shopping-paper-bag_23-2148441159.jpg"},
|
||||
{
|
||||
title: "Ethiopian Yirg", description: "Bright, fruity, citrus notes.", imageSrc: "http://img.b2bpic.net/free-photo/hot-mocha-coffee_1339-2388.jpg"},
|
||||
{
|
||||
title: "Cold Brew", description: "12-hour steeped perfection.", imageSrc: "http://img.b2bpic.net/free-photo/cup-coffee-with-pile-coffee-beans_1112-438.jpg"},
|
||||
{
|
||||
title: "Dark Roast", description: "Deep and smoky profiles.", imageSrc: "http://img.b2bpic.net/free-photo/coffee-maker-machine_23-2148937219.jpg"},
|
||||
{
|
||||
title: "Signature Latte", description: "Perfectly balanced milk foam.", imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-chocolate-roll_23-2150645419.jpg"},
|
||||
{
|
||||
title: "Espresso Shot", description: "Rich crema extraction.", imageSrc: "http://img.b2bpic.net/free-photo/coffee-beans-grinder_23-2151965900.jpg"},
|
||||
{
|
||||
title: "Subscription", description: "Beans delivered to your door.", imageSrc: "http://img.b2bpic.net/free-photo/tea-time-two-women-drinking-tea_119269-3.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<MenuSection />
|
||||
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="Testimonials"
|
||||
title="Loved by locals."
|
||||
description="Hear what the community has to say about Dirty Bean."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Alex R.", role: "Designer", quote: "The best espresso I've had in years.", imageSrc: "http://img.b2bpic.net/free-photo/attractive-successful-young-female-entrepreneur-drinking-coffee-cafe-enjoying-nice-conversation-with-partner-holding-cup-smiling-camera-tilt-head-from-interest-reading-fashion-magazine_197531-30498.jpg"},
|
||||
{
|
||||
name: "Sarah K.", role: "Architect", quote: "Love the cozy atmosphere and roasts.", imageSrc: "http://img.b2bpic.net/free-photo/smiling-woman-with-white-headphones-smoothie-table_1157-2107.jpg"},
|
||||
{
|
||||
name: "Marcus L.", role: "Developer", quote: "My daily caffeine fix, consistently great.", imageSrc: "http://img.b2bpic.net/free-photo/pretty-teenager-talking-phone_23-2148804644.jpg"},
|
||||
{
|
||||
name: "Jenna M.", role: "Writer", quote: "Truly artisan quality in every cup.", imageSrc: "http://img.b2bpic.net/free-photo/side-view-happy-friends-near-bar_171337-18158.jpg"},
|
||||
{
|
||||
name: "Tom B.", role: "Artist", quote: "So glad I found this hidden gem.", imageSrc: "http://img.b2bpic.net/free-photo/women-drinking-coffee_23-2148006750.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<TestimonialsSection />
|
||||
|
||||
<div id="social" data-section="social">
|
||||
<SectionErrorBoundary name="social">
|
||||
<SocialProofMarquee
|
||||
tag="Our Partners"
|
||||
title="Supporting Local"
|
||||
description="We source from these incredible local producers."
|
||||
names={[
|
||||
"Green Hill Farm", "Valley Dairy", "Organic Harvest", "River Ridge", "Mountain Peak", "Forest Coffee", "Sunrise Roasters"]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<SocialSection />
|
||||
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Help"
|
||||
title="Questions?"
|
||||
description="Everything you need to know about our beans."
|
||||
categories={[
|
||||
{
|
||||
name: "Shipping", items: [
|
||||
{
|
||||
question: "Do you ship nationwide?", answer: "Yes, we ship everywhere in the US."},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Roasting", items: [
|
||||
{
|
||||
question: "How often do you roast?", answer: "We roast in small batches daily."},
|
||||
],
|
||||
},
|
||||
]}
|
||||
cta={{
|
||||
name: "Barista", role: "Expert", buttonText: "Chat", buttonHref: "#contact", imageSrc: "http://img.b2bpic.net/free-photo/enthusiastic-young-asian-woman-barista-apron-looking-amazed-clap-hands-smiling-standing-co_1258-148443.jpg"}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<FaqSection />
|
||||
|
||||
<div id="contact" data-section="contact">
|
||||
<SectionErrorBoundary name="contact">
|
||||
<ContactCta
|
||||
tag="Get in touch"
|
||||
text="Visit us or order online today."
|
||||
primaryButton={{
|
||||
text: "Order Online", href: "#menu"}}
|
||||
secondaryButton={{
|
||||
text: "Contact Us", href: "mailto:hello@dirtybean.com"}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
<ContactSection />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
29
src/pages/HomePage/sections/About.tsx
Normal file
29
src/pages/HomePage/sections/About.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 "about" section.
|
||||
|
||||
import React from 'react';
|
||||
import AboutFeaturesSplit from '@/components/sections/about/AboutFeaturesSplit';
|
||||
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 Story"
|
||||
title="Freshness in every bean."
|
||||
description="Dirty Bean was founded on a simple premise: great coffee shouldn't be complicated, just excellent. We source our beans ethically, roast them in small batches, and pour our passion into every cup."
|
||||
items={[
|
||||
{
|
||||
icon: "Coffee", title: "Ethical Sourcing", description: "We partner with local farmers directly."},
|
||||
{
|
||||
icon: "Flame", title: "Small Batch Roast", description: "Roasted daily for maximum freshness."},
|
||||
{
|
||||
icon: "Award", title: "Expert Quality", description: "Crafted by award-winning baristas."},
|
||||
]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/front-view-male-barista-using-professional-coffee-machine-cup_23-2148824392.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="Get in touch"
|
||||
text="Visit us or order online today."
|
||||
primaryButton={{
|
||||
text: "Order Online", href: "#menu"}}
|
||||
secondaryButton={{
|
||||
text: "Contact Us", href: "mailto:hello@dirtybean.com"}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
36
src/pages/HomePage/sections/Faq.tsx
Normal file
36
src/pages/HomePage/sections/Faq.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 "faq" section.
|
||||
|
||||
import React from 'react';
|
||||
import FaqTabbedAccordion from '@/components/sections/faq/FaqTabbedAccordion';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FaqSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="faq" data-section="faq">
|
||||
<SectionErrorBoundary name="faq">
|
||||
<FaqTabbedAccordion
|
||||
tag="Help"
|
||||
title="Questions?"
|
||||
description="Everything you need to know about our beans."
|
||||
categories={[
|
||||
{
|
||||
name: "Shipping", items: [
|
||||
{
|
||||
question: "Do you ship nationwide?", answer: "Yes, we ship everywhere in the US."},
|
||||
],
|
||||
},
|
||||
{
|
||||
name: "Roasting", items: [
|
||||
{
|
||||
question: "How often do you roast?", answer: "We roast in small batches daily."},
|
||||
],
|
||||
},
|
||||
]}
|
||||
cta={{
|
||||
name: "Barista", role: "Expert", buttonText: "Chat", buttonHref: "#contact", imageSrc: "http://img.b2bpic.net/free-photo/enthusiastic-young-asian-woman-barista-apron-looking-amazed-clap-hands-smiling-standing-co_1258-148443.jpg"}}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
42
src/pages/HomePage/sections/Features.tsx
Normal file
42
src/pages/HomePage/sections/Features.tsx
Normal file
@@ -0,0 +1,42 @@
|
||||
// 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 FeaturesBento from '@/components/sections/features/FeaturesBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function FeaturesSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="features" data-section="features">
|
||||
<SectionErrorBoundary name="features">
|
||||
<FeaturesBento
|
||||
tag="Why Us"
|
||||
title="Experience the difference."
|
||||
description="Our meticulous process ensures quality from the farm to your cup."
|
||||
features={[
|
||||
{
|
||||
title: "Precision Roasting", description: "Computers track heat curves for consistency.", bentoComponent: "media-stack", mediaItems: [
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/tattooed-barista-holds-blank-package-bags-with-freshly-baked-coffee-beans-ready-sale-delivery_346278-405.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/view-process-making-pressed-coffee_23-2149709945.jpg"},
|
||||
{
|
||||
imageSrc: "http://img.b2bpic.net/free-photo/top-view-sustainably-produced-alcoholic-beverage_23-2150162981.jpg"},
|
||||
],
|
||||
},
|
||||
{
|
||||
title: "Community Focus", description: "A hub for locals and visitors alike.", bentoComponent: "orbiting-icons", centerIcon: "Coffee", orbitIcons: [
|
||||
"Users", "Heart", "Music", "Wifi"],
|
||||
},
|
||||
{
|
||||
title: "Freshness Guarantee", description: "If it isn't fresh, we don't serve it.", bentoComponent: "chat-marquee", aiIcon: "Coffee", userIcon: "User", exchanges: [
|
||||
{
|
||||
userMessage: "Is this fresh?", aiResponse: "Roasted just yesterday!"},
|
||||
],
|
||||
placeholder: "Ask our barista..."},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
29
src/pages/HomePage/sections/Hero.tsx
Normal file
29
src/pages/HomePage/sections/Hero.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 "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/portrait-happy-young-woman-starts-her-morning-with-mug-coffee-drinking-tea-from-cup-standing_1258-193497.jpg", "http://img.b2bpic.net/free-photo/stylish-smiling-young-woman-sitting-sofa-talking-mobile-phone-restaurant_23-2147974688.jpg", "http://img.b2bpic.net/free-photo/amazing-young-lady-talking-by-phone_171337-4148.jpg", "http://img.b2bpic.net/free-photo/person-paying-bill-restaurant-using-nfc-technology_23-2150039413.jpg"]}
|
||||
avatarText="Join our community of coffee lovers."
|
||||
title="Roasted for the bold."
|
||||
description="Artisanal beans, expertly sourced and roasted right here at Dirty Bean. Elevate your daily ritual."
|
||||
primaryButton={{
|
||||
text: "Shop Beans", href: "#menu"}}
|
||||
secondaryButton={{
|
||||
text: "Visit Shop", href: "#about"}}
|
||||
names={[
|
||||
"The Daily Grind", "Bean Enthusiasts", "Artisan Coffee Group", "Morning Rituals"]}
|
||||
imageSrc="http://img.b2bpic.net/free-photo/barista-work-coffee-shop_158595-2333.jpg"
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
36
src/pages/HomePage/sections/Menu.tsx
Normal file
36
src/pages/HomePage/sections/Menu.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 "menu" section.
|
||||
|
||||
import React from 'react';
|
||||
import FeaturesImageBento from '@/components/sections/features/FeaturesImageBento';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function MenuSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="menu" data-section="menu">
|
||||
<SectionErrorBoundary name="menu">
|
||||
<FeaturesImageBento
|
||||
tag="Menu"
|
||||
title="Our Signature Blends"
|
||||
description="From single-origin pours to decadent lattes."
|
||||
items={[
|
||||
{
|
||||
title: "House Roast", description: "A classic smooth blend.", imageSrc: "http://img.b2bpic.net/free-photo/roasted-beans-tasteful-coffee-shopping-paper-bag_23-2148441159.jpg"},
|
||||
{
|
||||
title: "Ethiopian Yirg", description: "Bright, fruity, citrus notes.", imageSrc: "http://img.b2bpic.net/free-photo/hot-mocha-coffee_1339-2388.jpg"},
|
||||
{
|
||||
title: "Cold Brew", description: "12-hour steeped perfection.", imageSrc: "http://img.b2bpic.net/free-photo/cup-coffee-with-pile-coffee-beans_1112-438.jpg"},
|
||||
{
|
||||
title: "Dark Roast", description: "Deep and smoky profiles.", imageSrc: "http://img.b2bpic.net/free-photo/coffee-maker-machine_23-2148937219.jpg"},
|
||||
{
|
||||
title: "Signature Latte", description: "Perfectly balanced milk foam.", imageSrc: "http://img.b2bpic.net/free-photo/top-view-delicious-chocolate-roll_23-2150645419.jpg"},
|
||||
{
|
||||
title: "Espresso Shot", description: "Rich crema extraction.", imageSrc: "http://img.b2bpic.net/free-photo/coffee-beans-grinder_23-2151965900.jpg"},
|
||||
{
|
||||
title: "Subscription", description: "Beans delivered to your door.", imageSrc: "http://img.b2bpic.net/free-photo/tea-time-two-women-drinking-tea_119269-3.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="Our Partners"
|
||||
title="Supporting Local"
|
||||
description="We source from these incredible local producers."
|
||||
names={[
|
||||
"Green Hill Farm", "Valley Dairy", "Organic Harvest", "River Ridge", "Mountain Peak", "Forest Coffee", "Sunrise Roasters"]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
32
src/pages/HomePage/sections/Testimonials.tsx
Normal file
32
src/pages/HomePage/sections/Testimonials.tsx
Normal file
@@ -0,0 +1,32 @@
|
||||
// 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 TestimonialColumnMarqueeCards from '@/components/sections/testimonial/TestimonialColumnMarqueeCards';
|
||||
import SectionErrorBoundary from "@/components/ui/SectionErrorBoundary";
|
||||
|
||||
export default function TestimonialsSection(): React.JSX.Element {
|
||||
return (
|
||||
<div id="testimonials" data-section="testimonials">
|
||||
<SectionErrorBoundary name="testimonials">
|
||||
<TestimonialColumnMarqueeCards
|
||||
tag="Testimonials"
|
||||
title="Loved by locals."
|
||||
description="Hear what the community has to say about Dirty Bean."
|
||||
testimonials={[
|
||||
{
|
||||
name: "Alex R.", role: "Designer", quote: "The best espresso I've had in years.", imageSrc: "http://img.b2bpic.net/free-photo/attractive-successful-young-female-entrepreneur-drinking-coffee-cafe-enjoying-nice-conversation-with-partner-holding-cup-smiling-camera-tilt-head-from-interest-reading-fashion-magazine_197531-30498.jpg"},
|
||||
{
|
||||
name: "Sarah K.", role: "Architect", quote: "Love the cozy atmosphere and roasts.", imageSrc: "http://img.b2bpic.net/free-photo/smiling-woman-with-white-headphones-smoothie-table_1157-2107.jpg"},
|
||||
{
|
||||
name: "Marcus L.", role: "Developer", quote: "My daily caffeine fix, consistently great.", imageSrc: "http://img.b2bpic.net/free-photo/pretty-teenager-talking-phone_23-2148804644.jpg"},
|
||||
{
|
||||
name: "Jenna M.", role: "Writer", quote: "Truly artisan quality in every cup.", imageSrc: "http://img.b2bpic.net/free-photo/side-view-happy-friends-near-bar_171337-18158.jpg"},
|
||||
{
|
||||
name: "Tom B.", role: "Artist", quote: "So glad I found this hidden gem.", imageSrc: "http://img.b2bpic.net/free-photo/women-drinking-coffee_23-2148006750.jpg"},
|
||||
]}
|
||||
/>
|
||||
</SectionErrorBoundary>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user